Voraussetzungen:
http://wiki.sa-mp.com/wiki/Scripting_Basics
http://wiki.sa-mp.com/wiki/ShowPlayerDialog
http://wiki.sa-mp.com/wiki/SendClientMessage
http://wiki.sa-mp.com/wiki/GivePlayerWeapon
http://wiki.sa-mp.com/wiki/GivePlayerMoney
http://wiki.sa-mp.com/wiki/GetPlayerMoney
http://wiki.sa-mp.com/wiki/OnPlayerCommandText
http://wiki.sa-mp.com/wiki/OnDialogResponse
http://wiki.sa-mp.com/wiki/Format
http://wiki.sa-mp.com/wiki/Strcat
http://wiki.sa-mp.com/wiki/Weapons
Zu aller erst müssen wir oben die DialogID definieren, welche später für den Dialog verwendet wird.
#define DIALOG_BUYWEAPON 3625
Nun brauchen wir ein Enum, wo wir das nötigste rein schreiben. In das Enum kommen folgende Einträge: die ID der Waffe, der Preis und der Name.
Das sieht dann beispielsweise so aus:
enum weapBuyInfo{
wbI_weapID,
wbI_weapPrice,
wbI_weapName[24]
}
Wofür diese komplizerten Namen?
Diese Namen dienen dazu, dass sich Variablen nicht überschreiben, ansonsten werden nämlich Warnings ausgegeben.
Nun brauchen wir ein Multi-dimensionales Array
new WeapBuy[/*Anzahl der Waffen*/2][/*Name des Enums*/weapBuyInfo] = {
//Hier kommen nun alle Waffen rein.
{24, 2000, "Desert Eagle"},//Hinter jeden Eintrag ein Komma, ausser dem letzten
{29, 2500, "MP5"} //Kein Komma beim Letzten!
};
Die WaffenIDs könnt ihr hier finden: http://wiki.sa-mp.com/wiki/Weapons
Im Beispiel 1 habe ich die Deagle genommen, sie hat die ID 24. Sie wird für 2000$ verkauft.
Das 2. Beispiel ist die MP5, sie hat die ID 29 und wird für 2500$ verkauft.
Statt der WaffenID 24 (Deagle) hätte man auch WEAPON_DEAGLE nehmen können, da diese in der SA-MP Include a_samp bereits definiert wurde.
Auf der oben verlinkten Wiki-Seite stehen die Definitionen bereits dabei.
Nun kommen wir zum Kaufen in einem Dialog.
Im Beispiel wird OnPlayerCommandText verwendet, es funktioniert allerdings auch mit allen anderen Command-Prozessoren.
public OnPlayerCommandText(playerid, cmdtext[]){
if(strcmp(cmdtext, "/buyweap") == 0){ //Das hier ist der Befehl ansich, der eingegeben werden muss, damit sich später der Dialog öffnet.
new outstr[(sizeof(WeapBuy)*24)+(sizeof(WeapBuy)*11)], addstr[34];/*Warum benutze ich in dem Beispiel keine fixe definition?
Ich benutze keine Fixe Definition, damit wir wirklich nur die String-Länge benutzen, die wir wirklich benötigen, teilweise auf 2-3 Leere Buchstaben.
*/
//Nun kommt eine Schleife, welche alle Einträge aus dem Array WeapBuy ausliest.
for(new i=0;i<sizeof(WeapBuy);i++){
format(addstr, sizeof(addstr), "%s (%i$)\n", WeapBuy[i][wbI_weapName], WeapBuy[i][wbI_weapPrice]); //Hier formatieren wir die einzelnen Zeilen des Dialoges.
strcat(outstr, addstr);//Hier wird der String aus addstr dem String outstr hinzugefügt.
}
ShowPlayerDialog(playerid, DIALOG_BUYWEAPON, DIALOG_STYLE_LIST, "Waffenkauf", outstr, "Kaufen", "Abbrechen");
/*
Hier zeigen wir dem Spieler einen Dialog im List-Style mit dem Titel "Waffenkauf" und den Waffen an.
*/
}
return 0;
}
Nun kommen wir zu OnDialogResponse. Dieses Callback wird ausgelöst, wenn ein Spieler auf einen Button im Dialog die Enter- oder die Escape(Esc)-Taste drückt.
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid){//Nun switchen wir alle DialogIDs durch, bis unsere gefunden wurde. Alternativ funktioniert auch "if(dialogid == DIALOG_BUYWEAPON){}"
case DIALOG_BUYWEAPON:{ //Nun ist er soweit durchgegangen, bis er unsere definierte DialogID erreicht hat.
new out[128]; //Diesen String brauchen wir später, um dem User die Nachricht auszugeben, welche Waffe er sich für wvl $ gekauft hat.
if(!response)return 1; //Wenn der rechte Button im Dialog geklickt wurde, soll abgebrochen werden.
if(GetPlayerMoney(playerid) < WeapBuy[listitem][wbI_weapPrice])return SendClientMessage(playerid, -1, "Du hast nicht genügend Geld"); //Hier geben wir dem User eine weiße Nachricht aus, falls er nicht genug Geld auf der Hand hat.
//listitem gibt aus, welcher der Einträge eines Dialogs angeklickt wurde, es fängt bei 0 an, genauso wie unser Array. Von daher brauchen wir hier keine Schleife etc
GivePlayerWeapon(playerid, WeapBuy[listitem][wbI_weapID], 50); //Hier geben wir dem User die angeklickte Waffe mit 50 Schuss.
GivePlayerMoney(playerid, -WeapBuy[listitem][wbI_weapPrice]); //Hier ziehen wir dem User das Geld ab
format(out, sizeof(out), "Du hast dir ein/e %s für %i$ gekauft.", WeapBuy[listitem][wbI_weapName], WeapBuy[listitem][wbI_weapPrice]);
SendClientMessage(playerid, -1, out); //Hier bekommt der User eine weiße Nachricht mit dem String, den wir mit einer Formatierung angegeben haben.
return 1; //Hier returnen wir wieder, damit OnDialogResponse hier aufhört, da der angefragte Dialog beendet ist.
}
}
return 1;
}
Ich hoffe, euch hat das kurze Tutorial gefallen.
Mit freundlichen Grüßen
Exod_Martinez | Nemesus Jr.