Fraktionstutorial

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Fraktionstutorial

    [b]Fraktionstutorial[/b]

    Hallo,

    ich möchte euch heute auf Wunsch von @Lance_Butters: ein kleines Fraktionstutorial machen.



    Inhaltsver
    zeichnis:

    1. Die Planung: Was haben wir vor & was brauchen wir?
    2. Die Detailplanung: Wie soll's denn ausschau'n?

    3. Das Wichtigste: Der Scriptingteil
    4. Die Schmankerl: Wir werten das ganze auf
    5. Das Ende: Wir haben's geschafft
    Bei Fragen, schreibt mich an! :)
  • Fraktionstutorial - Teil 1

    Fraktionstutorial
    Teil 1

    Die Planung: Was haben wir vor & was brauchen wir?
    Wir möchten ein kleines System bauen, mit welchem es möglich ist Spieler in die Fraktion ein- und auszuladen, Ihnen Ränke zuzuteilen. Desweiteren möchten wir für jede Fraktion eine Fraktionskasse haben, Fraktionsautos selbstverständlich auch und Spawnwaffen sollen's auch noch sein. Das ganze mit OCMD & sscanf. Die Speicherung des ganzen überlasse ich euch, das müsst' ihr machen, da gibt's ja mittlerweile genug Tutorials zu, nicht wahr?

    Wir brauchen Geduld, Zeit & Ehrgeiz, nur wenn ihr diese Bedingungen erfüllt, lest bitte in Ruhe weiter - andernfalls, lasst's sein & kommt ein anderes Mal wieder.

    Die Detailplanung: Wie soll's denn ausschau'n?
    Wir möchten ein einheitliches Filterscript bauen, welches ein komplettes System darstellt und werden folgende Funktion bereits jetzt bauen:
    • error(playerid, error[])
    • successful(playerid, text[])
    Um auch auf den aktuellen Standarts aufzubauen, nutzen wir auch aktuelle Möglichkeiten. Ich nutze folgende Farbcodes:
    • Rot: 0xFF000FFF (HTML: FF000F)
    • Grün: 0x008900FF (HTML: 008900)
    • Blau: 0x0091FFFF (HTML: 0091FF)
    Welche ihr nutzt, ist euch überlassen!
    Um nochmal auf die oben genannten Funktionen zu kommen: Die erste Funktion, "error()" gibt dem Spieler eine Nachricht mit dem error[]-Text aus, demnach kann man schließen was successful() übernimmt, und los geht's, mal mit Theorie (ihr dürft' das dann in die Praxis umsetzen, das ist ja noch simpel): Wir erstellen einen stock den wir mit "error" betiteln und dem wir 2 Parameter abverlangen: playerid (Integer) und error (String). In diesem stock wird ein formatierter String ("[ Fehler ] Errorbeispiel"; Errorbeispiel ist zu ersetzen mit dem error-String) an den Spieler als SendClientMessage returned - ganz simpel, oder? - Das selbe macht ihr nun mit der successful-Funktion. Alles klar? - Also weiter!
    Desweiteren wollen wir nicht mit Enumeratoren sondern mit Arrays arbeiten - damit ihr einfach noch ein wenig die Umgang mit Arrays vertieft.

    Das Wichtigste: Der Scriptingteil
    Erstmal wollen wir das Fraktionssystem überhaupt erstellen können.
    Hier arbeiten wir mit einem Array, wie wir es auch mit dem Rest der Systeme machen werden.
    Dieses Array braucht von uns ein paar
    Vorgaben: wie viele Fraktionen wir brauchen & wie viele Ränke pro
    Fraktion erlaubt sind: Das machen wir mit #define's, die schauen wie
    folgt aus:
    [pwn]#define MAX_FACTIONS xx
    #define MAX_RANKS_PER_FACTION yy[/pwn]
    xx und yy sind mit gewünschten Zahlen zu ersetzen.

    Dieses Array braucht nur 1 Angabe und deshalb erstellen wir es wie folgt:
    [pwn]Factions[MAX_FACTIONS][50];[[/pwn]
    Heißt also, wir haben jetzt ein Array welches wir mit:
    [pwn]Factions[1];[/pwn]
    ansprechen können (Beispiel war FraktionsID 1).

    Nun ist es uns möglich die Fraktionen zu formatieren, dies machen wir mit:
    [pwn]format(Factions[1], 50, "Polizei");[/pwn]
    Und schon heißt die Fraktion mit der ID 1 "Polizei".

    Mit auf den Weg geb ich euch folgenden Codeschnipsel:
    [pwn]ocmd:createfaction(playerid, params[]) {
    new factionName[50],
    factionID;
    if(!IsPlayerAdmin(playerid))
    return error(playerid, "Du bist kein Admin!");
    if(sscanf(params, "ds[50]", factionID, factionName))
    return error(playerid, "/createfaction [FraktionsID] [Fraktionsname]");
    format(Factions[factionID], 50, "%s", factionName);
    return 1;
    }[/pwn]

    Ich schlag' vor wir machen mal weiter ...

    Weiter geht's mit dem Ranksystem - oder?
    Wie lösen wir das? - Ganz einfach mit einem groooßen Array.
    Nun definieren wir das Array, wie folgt:
    [pwn]new Ranks[MAX_FACTIONS][MAX_RANKS_PER_FACTION];[/pwn]
    Was macht das ganze?
    Wir sagen quasi folgendes, das lässt sich anhand einer Grafik ganz gut darstellen (Beispiel: 3 Fraktionen á jeweils 2 Ränke):


    Aber das reicht ja nicht so ganz, oder? Wir wollen ja auch so einen tollen "Ranknamen" haben. Da ein solcher Rankname ja ein String sein wird, behandeln wir den auch so und machen ganz einfach folgendes:
    [pwn]new Ranks[MAX_FACTIONS][MAX_RANKS_PER_FACTION][50];[/pwn]
    Schwup-di-wup haben wir ein kleines Ranksystem - nein, nicht ganz, aber fast - darauf kann man jetzt prima aufbauen. Es ist nun möglich einen Rank bzw. dessen Ranknamen mit folgendem Code anzusprechen (Beispiel: Fraktionsnummer 10, Rank 3):
    [pwn]Ranks[10][3];[/pwn]
    Wenn wir nun den Rank bereits formatiert haben, gibt er uns den String zurück, wenn nicht, dann nichts.
    Fangen wir nun an unseren ersten Befehl zu formen, dieser soll heißen: /setrankname. Dieser soll also Ränke umbenennen können (im Dialog). Als erstes Fragen wir ab, ob der Spieler überhaupt in einer Fraktion ist (dazu nutzen wir PVar's):
    [pwn]if(!GetPVarInt(playerid, "userFaction"))
    return error(playerid, "Du bist in keiner Fraktion!");[/pwn]
    Anschließend fragen wir ab, ob der Spieler den höchsten Rank in der Fraktion hat (dazu gebrauchen wir mal unseren #define "MAX_RANKS_PER_FACTION"):
    [pwn]if(GetPVarInt(playerid, "userFactionRank") < MAX_RANKS_PER_FACTION)
    return error(playerid, "Dein Rank ist zu niedrig!");[/pwn]
    So, sind nun all' diese Bedingungen erfüllt, lassen wir alle Ränke durchschleifen und zeigen anschließend in einem Dialog an, dies schaut jetzt bei mir wie folgt aus:
    [pwn]for(new r = 1; r <= MAX_RANKS_PER_FACTION; r++) { //Durchschleift alle Ränke
    format(str, 120, "Ranknummer: d | Rankname: %s\n", r, (strlen(Ranks[GetPVarInt(playerid, "userFaction")][r]) > 0) ? Ranks[GetPVarInt(playerid, "userFaction")][r] : "Kein Rankname"); //Formatiert zeilenweise die Ranknamen für den Dialog
    strcat(holeStr, str); //Fügt dem "Gesamtstring" für den Dialog den "str" hinzu, den wir eine Zeile weiter oben formatiert haben
    }
    ShowPlayerDialog(playerid, Dialog_SetRankName_Overview, DIALOG_STYLE_LIST, (strlen(Factions[GetPVarInt(playerid, "userFaction")]) > 0) ? Factions[GetPVarInt(playerid, "userFaction")] : "Namenslose Fraktion", holeStr, "Ändern", "Abbrechen"); //Zeigt schlussendlich den Dialog mit allen Ränken
    [/pwn]

    Nun hüpfen wir zu OnDialogResponse und fragen direkt erstmal die dialogid ab, ob diese unserem Dialog entspricht (schafft ihr sicherlich allein'). Anschließend, in der dialogid-Abfrage, holen wir uns die RankID, auf die vom User geklickt worden ist, durch "listitem" und addieren dies mit 1. Ich speicher das dem Spieler gleich als PVar ab, da ich ein wenig zu faul bin andere Methoden zu nutzen (nenne diese PVar "editFactionRankID"). Vorher sollten wir aber response abfragen, denn ansonsten kann das recht nervig werden für den User, heißt also konkret, ich habe aktuell diesen Code:
    [pwn]if(dialogid == Dialog_SetRankName_Overview) {
    if(response) {
    //hier dann SetPVarInt (lest euch meinen Text genau durch, dann wisst ihr, was hier hin kommt, ich gaukel euch nicht alles vor!)
    }
    }[/pwn]

    Nun wird es Zeit, falls die "response"-Bedingung erfüllt ist, einen Inputdialog anzuzeigen, um der RankID auch einen Ranknamen zu verpassen, dies macht ihr wieder mit Hilfe von ShowPlayerDialog (klick). Ihr gebt diesem Dialog die ID: Dialog_SetRankName_NameRank. Dann haben wir es mit diesem Dialog erstmal geschafft, weiter geht's nun zum Dialog mit der DialogID "Dialog_SetRankName_NameRank": Wir fragen wieder ab, ob "responsed" ist, desweiteren mit strlen (klick) ob überhaupt was eingegeben worden ist und formatieren anschließend wie folgt:
    [pwn]format(Ranks[GetPVarInt(playerid, "userFaction")][GetPVarInt(playerid, "editFactionRankID")], 50, "%s", inputtext);[/pwn]
    Anschließend löschen wir mit DeletePVar "editFactionRankID" und könn(t)en dann wieder die Rankübersicht anzeigen lassen per ShowPlayerDialog.
    Bilder
    • arrayErklärung.png

      29,51 kB, 572×314, 296 mal angesehen
  • GEILO ENDLICH MAL EINER WO GEILE`s/RICHTIGES TUT MACHT

    TutNichts schrieb:

    Fraktionstutorial
    Teil 1


    Also da muss ich sagen SPITZEN KLASSE! Sorry das ich gegen forum regeln verstoße aber endlich mall einer wo ein richtiges nich falsch erklärtes tut macht hast von mir ein dickes fettes
    thanks!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von TheS4Hacks™ ()