Hallo Breadfish!
Ich zeig euch heute wie ihr ein simples Premiumsystem hinbekommt das mit Sternen arbeitet.
Fangen wir an. Dieses Tutorial geht davon aus dass ihr ein Login/Register Script hab und einen SpielerLaden/Spielerspeichenr stock! ich arbeite mit DINI Benötigte Includes: DINI, SSCANF, OCMD!
Fangen wir an!
Schritt 1: Zuerst müssen wir es hinkriegen dass wir die Premiumsterne in der Spielerdatei speichern können.
Dafür gehen wir zu unserem SpielerSpeichern (Name kann bei euch anders sein) Stock und tragen dort diesen Satz ein:
dini_IntSet(Spielerdatei,"Premium",GetPVarInt(playerid,"Premium"));
Damit bewirken wir dass wenn wir die Funktion SpielerSpeichern(playerid) nutzen seine aktuellen Sterne in die Datei gespeichert werden.
Bei mir würde dann der komplette Stock so aussehen:
stock SpielerSpeichern(playerid)
{
if(GetPVarInt(playerid,"loggedin")==1)
{
new Spielerdatei[64];
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, sizeof(name));
format(Spielerdatei,sizeof(Spielerdatei),"/Accs/%s.txt",name);
dini_IntSet(Spielerdatei,"Level",GetPlayerScore(playerid));
dini_IntSet(Spielerdatei,"Geld",GetPlayerMoney(playerid));
dini_IntSet(Spielerdatei,"Bank",GetPVarInt(playerid,"Bank"));
dini_IntSet(Spielerdatei,"Adminlevel",GetPVarInt(playerid,"Adminlevel"));
dini_IntSet(Spielerdatei,"Fraktion",GetPVarInt(playerid,"Fraktion"));
dini_IntSet(Spielerdatei,"Banned",GetPVarInt(playerid,"Banned"));
dini_IntSet(Spielerdatei,"Newshacked",0);
dini_IntSet(Spielerdatei,"Premium",GetPVarInt(playerid,"Premium"));
}
return 1;
}
Schritt 2: Nun müssen wir im LadeSpieler Stock hinbekommen dass wenn der Spieler den Server betritt seine aktuelle Anzahl an Sternen aus seiner Datei rausgelesen wird.
Und dafür müssen folgendes im SpielerLaden (Name kann bei euch anders sein) folgendes Eintragen:
SetPVarInt(playerid,"Premium",dini_Int(Spielerdatei,"Premium"));
Das bewirkt wie angemerkt dass das System die Anzahl der Sterne des Spielers rausliest und dem Server klarmacht dass das die Anzahl der Sterne ist.
Bei mir sieht das ganze dann so aus:
stock LoadAccount(playerid)
{
new Spielerdatei[64];
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, sizeof(name));
format(Spielerdatei,sizeof(Spielerdatei),"/Accs/%s.txt",name);
SetPlayerScore(playerid,dini_Int(Spielerdatei,"Level"));
GivePlayerMoney(playerid,dini_Int(Spielerdatei,"Geld"));
SetPVarInt(playerid,"Bank",dini_Int(Spielerdatei,"Bank"));
SetPVarInt(playerid,"Gebannt",dini_Int(Spielerdatei,"Gebannt"));
SetPVarInt(playerid,"Adminlevel",dini_Int(Spielerdatei,"Adminlevel"));
SetPVarInt(playerid,"Fraktion",dini_Int(Spielerdatei,"Fraktion"));
SetPVarInt(playerid,"Banned",dini_Int(Spielerdatei,"Banned"));
SetPVarInt(playerid,"loggedin",1);
SetPVarInt(playerid,"Newshacked",0);
SetPVarInt(playerid,"Premium",dini_Int(Spielerdatei,"Premium"));
if(GetPVarInt(playerid,"Banned") == 1)
{
SendClientMessage(playerid,rot,"Du bist auf diesem Server gebannt!");
Kick(playerid);
}
return 1;
}
Schritt 3: Einen Befehl womit Admins Spielern Premiumpunkte geben können
Die Funktion ist bei mir so aufgebaut: /aprempoints [Spieler] [Anzahl der Sterne] [Grund]
Damit wir das hinbekommen müsst ihr schon sscanf und ocmd includet haben!
Und der Befehl an sich geht nun wie folgt, achtet auf die Kommentare (//) für Erklärungen!
ocmd:aprempoints(playerid,params[])
{
if(!IstSpielerEinAdmin(playerid,5))return SendClientMessage(playerid,rot,"Du bist kein Admin!"); // Ist der Spieler ein Admin mit Rang 5? Wenn nein Stoppt der Befehl. Ansonsten geht er weiter. IstSpielerEinAdmin müsst ihr ersetzen
new pID,PT,string[128],string2[256],reason; // Wir erstellen alle benötigten Strings
if(sscanf(params,"uds", pID, PT, reason))return SendClientMessage(playerid, orange, "Benutzung: /aprempoints [SPIELER] [Anzahl von Punkten] [Grund]"); // wir geben dem Befehl bedeutung, wurden nicht alle paramenter eingetragen stoppt das script
SetPVarInt(pID, "Premium", GetPVarInt(pID, "Premium") +PT); // Wir geben pID (Dem Spieler) die Premiumpunkte die wir im Befehl eingetragen habn
format(string, sizeof(string), "Du hast %s %i Premium Punkte gegeben!", Spielername(pID), PT); // Wir formatieren die Nachricht, dabei wird dann %s durch den Namen und %i durch die Anzahl an punkten ersetzt die wir ihm gaben
SendClientMessage(playerid, grün, string); // wir senden die nachricht
format(string2, sizeof(string2), "Du hast von einem Admin %i Premium Punkte bekommen. Grund: %s", PT, reason); // wir formatieren die nachricht in der wir dem spieler sagen dass er sterne bekommen hat und den grund dafür
SendClientMessage(pID, grün, string2); /7wir senden die nachricht
return 1;
}
Nun können wir dem Spieler Punkte geben, bzw abziehen. Doch wie kann er diese benutzen?
Schritt 4: Das Premium Shop System
Wir basteln nun das Shop System in dem sich die Spieler Sachen für ihre Sterne kaufen können.
Das geht wie folgt (Beachtet die kommentare):
Zuerst machen wir den Befehl /shop [Nummer des Artikels den man kaufen will]
die sscanf Parameter hab ich bereits erklärt daher folgt also keine Erklärung
new sID;
if(sscanf(params,"d",sID)) //wenn man nur /shop (ohne zahl) eingibt
{
new string[128];
format(string, sizeof(string), "Du besitzt derzeit %i Premium Sterne!", GetPVarInt(playerid, "Premium")); //wir zeigen dem Spieler seine sterne an
SendClientMessage(playerid,grau,"---------[Premium Shop]---------");
SendClientMessage(playerid,grau,"Benutzung: /shop [Zahl]");
SendClientMessage(playerid,grau,string);
SendClientMessage(playerid,grau,"1 = 5000$ bekommen (3 Sterne)");// wir zeigen dem Spieler was er kaufen kann
SendClientMessage(playerid,grau,"2 = 20000$ bekommen (10 Sterne)");// wir zeigen dem Spieler was er kaufen kann
SendClientMessage(playerid,grau,"3 = 100000$ bekommen (40 Sterne)");// wir zeigen dem Spieler was er kaufen kann
SendClientMessage(playerid,grau,"4 = AK-47 mit 100 Schuss bekommen (5 Sterne)");// wir zeigen dem Spieler was er kaufen kann
SendClientMessage(playerid,grau,"5 = Volles Leben bekommen (1 Stern)");// wir zeigen dem Spieler was er kaufen kann
SendClientMessage(playerid,grau,"---------[Premium Ende]---------");
return 1;
}
So nun möchten wir ja dass der Spieler das erhält was wir oben gezeigt haben (Geld, Waffe, Leben...) wenn er /shop [Zahl] macht.
Das geht so, ich zeig euch zuerst das erste. Bei /shop 1 soll der Spieler ja 5000$ bekommen wenn er mindestens 3 Sterne hat.
Und das geht so (wir haben dafür sID definiert, es muss direkt unter den oberen Code kommen:
else if(sID == 1) //wenn man nicht nur /shop eingegeben hat sondern /shop 1
{
if(GetPVarInt(playerid, "Premium") < 3)return SendClientMessage(playerid,rot, "Nicht genügend Premium Sterne vorhanden! (Benötigt: 3)"); //hat der Spieler mindestens 3 Sterne? Wenn nicht erscheint die Nachricht und der Befehl stoppt
SetPVarInt(playerid, "Premium", GetPVarInt(playerid, "Premium") -3); // hatte er mindestens 3 werden ihm diese nun abgezogen
GivePlayerMoney(playerid, 5000); // wir geben dem Spieler seine 5000$
SendClientMessage(playerid, grün, "Du hast 3 deiner Premium Sterne gegen 5000$ in Bar getauscht!"); // wir senden ihm noch eine Nachricht.
}
Es folgt Befehl zwei bei dem wir ihm nun nicht 5000$ sondern 20000$ geben, das kostet aber auch 10 anstatt 3 Sternen!
Der Befehl wieder direkt unter die letzte geschweifte Klammer:
else if(sID == 2) //hat der Spieler /shop 2 eingetippt?
{
if(GetPVarInt(playerid, "Premium") < 10)return SendClientMessage(playerid,rot, "Nicht genügend Premium Sterne vorhanden! (Benötigt: 10)"); // hat der spieler mindestens 10 sterne? wenn nein stoppt der befehl
SetPVarInt(playerid, "Premium", GetPVarInt(playerid, "Premium") -10); /7 hatte der spieler midnestens 10 sterne ziehen wir ihm diese nun ab
GivePlayerMoney(playerid, 20000); // wir geben ihm seine 20000%
SendClientMessage(playerid, grün, "Du hast 10 deiner Premium Sterne gegen 20000$ in Bar getauscht!"); //wir senden ihm die nachricht
}
Und imemr so weiter. Ich zeige euch nun den ganzen /shop Befehl, beachtet wenn ihr etwas neues in den Shop einfügen wollt sollte ihr zuerst dem Spieler das bei (if(sscanf... anzeigen mit einer Nachricht wie oben bereits getan.
Anschliessend schreiben wir unten:
if(sID == 6) //wenn der spieler /shop 6 getippt hat
{
}
und da kommt nun das rein was in allen bereits enthalten ist, ich erklär es euch genauer anhand Erklärungen, steht zb ER1 da schaut darunter was es bedeutet
if(GetPVarInt(playerid, "Premium") < ER1)return SendClientMessage(playerid,rot, "Nicht genügend Premium Sterne vorhanden! (Benötigt: ER2)");
ER1: Die Anzahl an Sternen die er mindestens benötigt
ER2: Müsst ihr nicht aber so sagt ihr dem Spieler wieviel er benötigt.
SetPVarInt(playerid, "Premium", GetPVarInt(playerid, "Premium") ER1);
ER1: Wir ziehen dem Spieler die Anzahl ab die er braucht, ersetzt dafür ER1 mit "- Anzahl" dabei ist das Minus ganz wichtig sonst gebt ihr ihm Sterne anstatt sie ihm abzuziehen!
Nun das was passiert zb ihr geht ihm einen Skin mit SetPlayerSkin und sendet ihm eine Nachricht.
Und nun wie versprochen der ganze /shop Befehl wie er derzeit bei mir ist.
ocmd:shop(playerid,params[])
{
new sID;
if(sscanf(params,"d",sID))
{
new string[128];
format(string, sizeof(string), "Du besitzt derzeit %i Premium Sterne!", GetPVarInt(playerid, "Premium"));
SendClientMessage(playerid,grau,"---------[Premium Shop]---------");
SendClientMessage(playerid,grau,"Benutzung: /shop [Zahl]");
SendClientMessage(playerid,grau,string);
SendClientMessage(playerid,grau,"1 = 5000$ bekommen (3 Sterne)");
SendClientMessage(playerid,grau,"2 = 20000$ bekommen (10 Sterne)");
SendClientMessage(playerid,grau,"3 = 100000$ bekommen (40 Sterne)");
SendClientMessage(playerid,grau,"4 = AK-47 mit 100 Schuss bekommen (5 Sterne)");
SendClientMessage(playerid,grau,"5 = Volles Leben bekommen (1 Stern)");
SendClientMessage(playerid,grau,"---------[Premium Ende]---------");
return 1;
}
else if(sID == 1)
{
if(GetPVarInt(playerid, "Premium") < 3)return SendClientMessage(playerid,rot, "Nicht genügend Premium Sterne vorhanden! (Benötigt: 3)");
SetPVarInt(playerid, "Premium", GetPVarInt(playerid, "Premium") -3);
GivePlayerMoney(playerid, 5000);
SendClientMessage(playerid, grün, "Du hast 3 deiner Premium Sterne gegen 5000$ in Bar getauscht!");
}
else if(sID == 2)
{
if(GetPVarInt(playerid, "Premium") < 10)return SendClientMessage(playerid,rot, "Nicht genügend Premium Sterne vorhanden! (Benötigt: 10)");
SetPVarInt(playerid, "Premium", GetPVarInt(playerid, "Premium") -10);
GivePlayerMoney(playerid, 20000);
SendClientMessage(playerid, grün, "Du hast 10 deiner Premium Sterne gegen 20000$ in Bar getauscht!");
}
else if(sID == 3)
{
if(GetPVarInt(playerid, "Premium") < 40)return SendClientMessage(playerid,rot, "Nicht genügend Premium Sterne vorhanden! (Benötigt: 40)");
SetPVarInt(playerid, "Premium", GetPVarInt(playerid, "Premium") -40);
GivePlayerMoney(playerid, 100000);
SendClientMessage(playerid, grün, "Du hast 40 deiner Premium Sterne gegen 100000$ in Bar getauscht!");
}
else if(sID == 4)
{
if(GetPVarInt(playerid, "Premium") < 5)return SendClientMessage(playerid,rot, "Nicht genügend Premium Sterne vorhanden! (Benötigt: 5)");
SetPVarInt(playerid, "Premium", GetPVarInt(playerid, "Premium") -5);
GivePlayerWeapon(playerid, akid, 100);
SendClientMessage(playerid, grün, "Du hast 5 deiner Premium Sterne gegen eine AK-47 mit 100 Schuss getauscht!");
}
else if(sID == 5)
{
if(GetPVarInt(playerid, "Premium") < 1)return SendClientMessage(playerid,rot, "Nicht genügend Premium Sterne vorhanden! (Benötigt: 1)");
SetPVarInt(playerid, "Premium", GetPVarInt(playerid, "Premium") -1);
SetPlayerHealth(playerid, 100);
SendClientMessage(playerid, grün, "Du hast 1 deiner Premium Sterne gegen Volle HP getauscht!");
}
return 1;
}
Anmerkung: ich werde die Befhle nciht umschreiben, dh ich lasse sie in OCMD, einfach weil ich damit am besten klarkomme
So ich hoffe euch hat das kleine Tutorial gefallen und falls ja hinterlasst doch einen netten Kommentar
Solltet ihr Fragen haben fragt ruhig ich versuche alles zu beantworten.
Ich entschuldige mich falls stellenweise Tippfehler sind
MfG
PoTTii
PS: Ich plane mehrere Tutorial zu releasen, falls ihr ein bestimmtes Thema wollt sendet mir doch eine PM!
Dieses Tutorial darf nichtohne meine Erlaubnis, verbreitet, kopiert, oder abgeändert werden. Wollt ihr es in einem anderen Forum zeigen, oder auf eurer Homepage, so tut dies bitte mit dem Link zu diesem Thread!