Waffenkauf im Dialog

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • 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.