Game Text Script für Admins

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
  • Hallo und Guten Tag,


    Ich möchte ihnen nun mit Hilfe eines Tutorials alles erklären, was man für einen Game Text dessen Inhalt man selbst bestimmen kann, braucht und wie man es aufbaut.
    Ich habe mich entschlossen diesen Befehl nicht wie üblich mit cmdtext zu machen sondern mit ocmd.
    Ocmd ist ein Include bzw. man muss ein Include besitzen um ocmd nutzen zu können. Der download dieses Includes befindet sich hier: [Include] OCMD


    Was brauchen wir noch?


    Als nächstes brauchen wir den sscanf stock. Dieser befindet sicher hier drunter. Einfach unten im Script einfügen und fertig.



    Das letzte was wir brauchen wäre dann noch der stock SpielerName. Den auch unten ins Script einfügen:

    Code
    stock SpielerName(playerid)
    {
    	new name[MAX_PLAYER_NAME];
    	GetPlayerName(playerid,name,sizeof(name));
    	return name;
    }


    So das waren die Vorbereitungen, nun kommt der eigentliche Teil:


    Ähnlich wie ein cmdtext wird auch ein ocmd erstellt.
    Der reine ocmd sieht so aus:


    Code
    ocmd:NameDesBefehls(playerid,params[])
    {
    	return 1;
    }


    Anders als bei cmdtext muss man den Namen des Befehls nicht mit / angeben sondern man muss nur den Namen angeben:


    Statt:

    Code
    /name


    Code
    name


    Wir nennen den Befehl nun: gt für GameText.


    Code
    ocmd:gt(playerid,params[])
    {
    	return 1;
    }


    Das erste was wir machen müssen/sollten ist den Befehl nur einem Admin bzw. in diesem Fall einen Rcon Admin zu erlauben.
    Darum fügen wir in die Klammern über return 1; dies ein:


    Code
    if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid,ROT,"Du bist kein Admin.");


    Wenn das kein Script sondern eine normale Sprache wäre, hieße dies in deutsch:


    Ist der Spieler kein Admin, dann sende ihm die Nachricht"..."!
    Weiter gehts.
    Nun kommt eine Definition in Form eines new:


    Code
    new string[128],reason[128];


    Dies bedeutet einfach (meines wissens nach), dass string und reason maximal 128 Zeichen in Form von Buchstaben, Zahlen, ect. haben dürfen.


    Nun kommt unser eben eingeügtes sscanf zum Einsatz:


    Code
    if(sscanf(params,"s",reason)) return SendClientMessage(playerid,ROT,"Nutze /gt [TEXT]");


    Dies ist etwas komplexer.
    Das "s" was wir dort sehen steht für den Text, den der Spieler eingibt. Ich werde demnächst ein weiteres Tutorial dazu machen und den Link dann hier drunter stellen.


    Nun kommen wir doch zum nächsten Schritt.
    Nun legen wir fest, was letztendlich alles angezeigt werden soll.


    Code
    format(string,sizeof(string),"%s",reason);


    Der Text, der in den Klammern steht ist der Text der letztendlich angezeigt wird.
    Wir können ihn beliebig ändern. Das %s, dass im moment dort steht lässt den angegebenen Text des Spielers hinter /gt
    anzeigen.
    Nach den " sehen wir ein reason, diesed benutze ich dafür.
    Wahrscheinlich gibt es mehr Methoden. reason heißt jetzt einfach, dass in die erste %s Stelle der Text des Spielers kommt.
    Möchte ich angeben wer den Text geschriebn hat kann ich hinzufügen:


    Code
    format(string,sizeof(string),"%s schrieb: %s",SpielerName(playerid),reason);


    Zusammengefasst zeigt die erste Stelle hinter den " das erste %s an, das zweite die zweite usw.


    Kommen wir zum letzten Schritt.
    Bis jetzt weiß das Script alles nötige, aber es wird noch nichts angezeigt.
    Der einfache Mann denkt jetzt:
    "Ok ganz einfach! Ich mache einfach

    Code
    GameTextForAll(playerid,


    "
    Und schon steht ein Problem fest:
    Wir wissen nicht wie wir den eben verfassten Text in die Klammern bekommen.
    Das ist eigentlich ganz einfach.


    Code
    GameTextForAll(string,3000,6);


    Das string an der Stelle des Textes bedeutet, dass das Script den Text aus dem string nimmt.


    So das wars.
    Ich hoffe ich konnte euch ein paar Dinge näher bringen.
    :)


    //Edit Korrektur

    2 Mal editiert, zuletzt von Ketchup ()

  • Also für Fortgeschrittene ist das Tutorial nicht hilfreich , aber für Anfänger die nicht soviel Ahnung haben
    ist es sehr gut aufgebaut. Finde es gut wenn mal wieder vernünftige Tutorials kommen.


    Danke von mir.

  • Wenn man ein Tutorial macht, sollte man schon verstehen, was man macht.
    1) Nur nebenbei: OCMD ist kein Plugin.
    2) Du hast wohl weder verstanden, was "params" genau ist, noch wann man sscanf überhaupt anwenden muss.
    Wie komme ich darauf?


    Du benutzt if(sscanf(params,"s",reason)) return SendClientMessage(playerid,ROT,"Nutze /gt [TEXT]");
    Weisst du was du machst? Du scannst "params" nach einem String! Diesen String verwendest du danach weiter.
    Wo liegt der Fehler?
    "params" ist genau schon der String, den du willst! sscanf ist hier komplett überflüssig und macht das ganze nur ineffizienter.


    Dein Command:
    ocmd:gt (playerid, params [])
    {
    if (!IsPlayerAdmin (playerid))
    return SendClientMessage (playerid, 0xFF0000FF, "Du bist kein Admin.");


    new
    string [128],
    reason [128];


    if (sscanf (params, "s", reason))
    return SendClientMessage (playerid, 0xFF0000FF, "Nutze /gt [TEXT]");


    format (string, sizeof (string), "%s schrieb: %s", SpielerName (playerid), reason);
    GameTextForAll (string, 3000, 6);
    return 1;
    }


    Dein Command mit optimierter Speicherverwendung:
    Der String "reason" ist überflüssig.
    Du kannst einen String immer mit sich selbst formattieren.
    Du kannst also anstatt "reason" einfach "string" zweimal verwenden.

    ocmd:gt (playerid, params [])
    {
    if (!IsPlayerAdmin (playerid))
    return SendClientMessage (playerid, 0xFF0000FF, "Du bist kein Admin.");


    new
    string [128];


    if (sscanf (params, "s", string))
    return SendClientMessage (playerid, 0xFF0000FF, "Nutze /gt [TEXT]");


    format (string, sizeof (string), "%s schrieb: %s", SpielerName (playerid), string);
    GameTextForAll (string, 3000, 6);
    return 1;
    }


    Optimaler Command:
    sscanf überflüssig, da man einfach "params" verwenden kann, dies beinhaltet den kompletten Text, den man verwenden will.
    Möchte man Speicher optimal benutzen, speichert man den Spielernamen in "string", somit wird kein Extraspeicher gebraucht, der in der Funktion SpielerName alloziert wird.
    Zum Schluss formattiert man "string" mit "string" und "params".

    ocmd:gt (playerid, params [])
    {
    if (!IsPlayerAdmin (playerid))
    return SendClientMessage (playerid, 0xFF0000FF, "Du bist kein Admin.");


    if (!params [0]) // überprüfe ob Text leer ist.
    return SendClientMessage (playerid, 0xFF0000FF, "Nutze /gt [TEXT]");

    new
    string [128];


    GetPlayerName (playerid, string, sizeof string);
    format (string, sizeof string, "%s schrieb: %s", string, params);
    GameTextForAll (string, 3000, 6);
    return 1;
    }


    Allgemein: sscanf ist NICHT nötig, wenn man nur ein einziges Parameter haben will.
    Will man einen String haben, kann man ocmds Argument "params" benutzen, oder für Integers strval (params) oder für Floats floatstr (params).

  • Nice Tutorial. Irgendwie kapier ich es noch nicht, aber ich les es mir noch ma durch ;)


    7/10


    Gruß Andy