Variable Namen bei Nachrichten

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
  • Moin Brotfisher,
    in diesem Tut möchte ich euch die Funktion Spielernamen bei Nachrichten zu verwenden näherbringen.
    Vorteile:
    -kommt immer besser
    -es kommen nicht immer die selben Nachrichten
    -man weiß wer was getan hat


    Also fangen wir an.
    Als erstes brauchen wir eine Variable, in der wir den Namen "speichern". Diese erstellen wir ganz einfach im CMD mit
    new Name[MAX_PLAYER_NAME];
    Name
    ist hierbei der Name der Variable
    MAX_PLAYER_NAME
    ist eine Zahl die angibt wie lang der Name maximal in SA:MP sein kann.


    Dannach brauchen wir einen String. In diesem Speichern wir die Nachricht. Den erstellen wir mit
    new string[32];
    string
    ist hierbei der Name des Strings.
    [32]
    steht für die Länge des Strings. Dieser String kann insgesamt 32 zeichen fassen. Das Fassungsvermögen bezieht sich dabei auf die gesamte Nachricht und nicht nur den Namen. 128 Zeichen ist die Maximale Anzahl pro Nachricht im SA-MP Chatfenster.
    Mehr als 32 Zeichen für einen String würde funktionieren, jedoch wäre es ab 40 unklug.
    Warum? Nun ja es ist einfach Ressourcen schonender. Hier mehr dazu
    Warum 40? Diese zahl habe ich nur gewählt da es über 32 ist und somit über der Maximalen Anzahl(manchmal nötig) aber trotzdem nicht zu viel ist.
    Mehr zu den Strings hier.



    Nun müssen wir noch irgendwie herausfinden wie den nun der Spieler heißt. Das machen wir mit
    GetPlayerName(playerid,Name,sizeof(Name));
    playerid
    steht für den ausführenden Spieler.
    Name
    steht für die Variable des Namens. Wir haben sie, wie ihr hoffentlich noch wisst, "Name" gennant.
    sizeof(Name)
    wird als "Len" im englischen Wiki angegeben. Was genau das nun heißt und was das bringt versteh ich leider nicht(Bright weiß es bestimmt). Doch Fakt ist, beim normalen gebraucht wird es so verwendet: sizeof([Name der Namensvariable]).
    Mehr dazu hier


    So nun kommen wir zur Nachricht. Diese geht so
    format(string,sizeof(string),"Moin %s",Name);
    string
    bezeichnet den verwendeten String. Bei uns heißt er wie oben erklärt String, bei mehreren Strings kann man ihn auch str nennen, dann würde dort eben format(str...) stehn.
    sizeof(string)
    ist wieder mit "Len" angegeben. Wie gesagt kann ich euch dies nicht genau erklären aber es funktoniert genauso wie bei GetPlayerName(und hier weiß sicher auch Gold oder DMA weiter)
    "Moin %d"
    ist der Text der gesendet werden soll.
    "%s",Name
    %s ist die Variable für den Namen. Dieser ist bei uns "Name". Das heißt nach der Nachricht muss die erklärung für die Variable kommen. Bei mehreren Variablen muss dies in der richtigen Reihenfolge gemach werden. Beispiel: "%s %s %s",Name,Name2,Name3. In der Nachricht wird nun nicht "%s" stehn sondern der, von uns ausgelesene, Name.
    Hier zu mehr


    So nun haben wir bereits den Namen ausgelesen und die Nachricht in einem String gespeichert. Nun muss nur noch der String "gesendet" werden, so das die Spieler ihn lesen können. Das machen wir einfach mit
    SendClientMessageToAll(ROT,string);
    ROT
    steht hier für eine Farbe die als ROT definiert sein muss
    string
    gibt an, dass der im String gespeicherte Text genommen wird. String muss ohne " da stehn.


    So und nun haben wir einen Text mit einer Namensvariable.
    Wozu kann man das verwenden?
    Die Namen kann man z.B. für Join und Leave Messages verwenden, aber auch für Kick bzw Ban(Du wurdest von %s gebannt)
    Eigentlich für alles wo man einen Namen erfahren sollte.
    Hier ein Beispiel
    dcmd_kick(playerid,paramas[])
    {
    new
    pID,
    sGrund[128];
    if(sscanf(paramas, "uz",pID,sGrund))
    {
    return SendClientMessage(playerid,ROT,"BENUTZUNG: /kick [playerid] [Grund]");
    }
    if(!IsPlayerConnected(pID))
    {
    return SendClientMessage(playerid,ROT,"Kein Spieler mit angegebener ID online");
    }
    if(pInfo[playerid][Admin] >= 1)
    {
    new
    name[MAX_PLAYER_NAME],
    pname[MAX_PLAYER_NAME],
    string[128];
    GetPlayerName(pID,name,sizeof(name));
    GetPlayerName(playerid,pname,sizeof(pname));
    format(string,sizeof(string),"%s(ID: %d) wurde von %s gekickt.Grund %s",name,pID,pname,sGrund);
    SendClientMessageToAll(ROT,string);
    Kick(pID);
    LogOut(pID);
    }
    else
    {
    SendClientMessage(playerid,ROT,"Du bist kein Admin");
    }
    return 1;
    }
    Hier haben wir sogar 3 Variablen, der Name des zu kickenden Spielers und seine ID(die muss man nicht auslesen) und den Namen des Kickers.

    dcmd_allowsavespawn(playerid,paramas[])
    {
    if(pInfo[playerid][Admin] >= 1)
    {
    new pID;
    if(sscanf(paramas, "u",pID))
    {
    return SendClientMessage(playerid,ROT,"Benutzung:/allowsavespawn [playerid]");
    }
    if(!IsPlayerConnected(pID))
    {
    return SendClientMessage(playerid,ROT,"Kein Spieler mit angegebener ID online");
    }
    new
    name[MAX_PLAYER_NAME],
    pname[MAX_PLAYER_NAME],
    string[128],
    str[128];
    GetPlayerName(pID,name,sizeof(name));
    GetPlayerName(playerid,pname,sizeof(pname));
    format(string,sizeof(string),"Du hast %s(pID:%d) einen Savespawn erlaubt",name,pID);
    format(str,sizeof(str),"Dir wurde vom Admin %s einen Savespawn erlaubt bekommen, mache /savespawn ein der gewünschten Position",pname);
    SendClientMessage(playerid,GELB,string);
    SendClientMessage(pID,GELB,str);
    allowsavespawn[pID] = 1;
    }
    return 1;
    }
    Hier haben wir 2 Strings. Wie gesagt heißt der 2. String nur noch str. Das kann man endlos machen.


    Warum habe ich dieses Tut geschrieben?
    Ich möchte anderen helfen, da ich merke das viele Leute mit dieser "einfachen" Methode Probleme haben, ich hatte sie lange Zeit auch. Ich weiß, dieses Tut ist nicht perfekt. Ich weiß auch das Goldkiller,DMA und [NSG]Bright es hätten besser machen können und es schlecht finden werden und meckern werden, jedoch denke ich für den "Normal-Verbraucher"(=Leute wie ich) reicht es. Wir wissen nun WIE es geht, zwar nicht ganz genau warum aber ich denke zu wissen WIE reicht für den Normalverbraucher.


    MfG Weed

    Einma vorbei schaun lohnt sich
    www.prt-clan.com der GamerClan für GTA-SAMP.Wir haben einen leistungsstarken vServer und ein hoch entwickeltes RealLife Script der Marke eigenbau, zu 100% Selfmade.
    Bald geht der RL-Server on, seid alle dabei. Regestriert euch und fiebert mit!!!


    Einmal editiert, zuletzt von Weed ()

  • Zitat

    MAX_PLAYER_NAME gibt meines Wissensnach an das die Variable einen Namen Speichern soll


    Nein,MAX_PLAYER_NAME ist eine Zahl die angibt wie lang der Name maximal in SA:MP sein kann.
    new Name[24];
    Ist genau das Gleiche.


    Zitat

    Ich weiß, dieses Tut ist nicht perfekt. Ich weiß auch das Goldkiller,DMA und [NSG]Bright es hätten besser machen können und es schlecht finden werden und meckern werden


    Stimmt,was es an sizeof(blah) nicht zu verstehen gibt weiss ich nicht :P.

  • An sich schon richtig, ja, hier und da gibts was zu verbessern bzw. besser zu erklären, aber egal.


    Nur ist die Methode, naja, sagen wir mal umständlich. Es gibt eine einfachere Methode, bei der wir den Namen nur EINMAL abspeichern in einem String, und dann immer bei Bedarf laden können, ohne das ganze GetPlayerName Zeugs.


    Erstellt dazu erstmal einen Array, mit 2 "Dimensionen".
    new GlobalNameArray[MAX_PLAYERS] /* Alternativ: 200 */[MAX_PLAYER_NAME] /* Alternativ: 24 */;


    Danach laden wir einfach den Namen des Users, wenn er Online kommt, in diesen Array. Und zwar genau so:
    public OnPlayerConnect(playerid) // Callback das aufgerufen wird wenn jemand connectet
    {
    GetPlayerName(playerid, GlobalNameArray[playerid], MAX_PLAYER_NAME);
    /* Wir "schreiben" den Namen des Spielers in den Array. Bedenkt dass hier KEIN "sizeof(...)" vorhanden sein KANN. Ich habs ausprobiert :p */
    return true;
    }


    Damit haben wir uns das ganze Getue mit GetPlayerName in Commands, Messages usw. gespart.


    Als Anwendungsbeispiel in einem simplen Command könnten wir zum beispiel so etwas verwenden:
    public OnPlayerCommandText(playerid, cmdtext[])
    {
    if(!strcmp(cmdtext,"/myname")) {
    new string[32];
    format(string, sizeof(string), "Mein Name ist %s", GlobalNameArray[playerid]);
    SendClientMessage(playerid, 0xFF0000FF, string);
    return true;
    }
    return false;
    }


    // BTW: Ich würde nicht dauernd einen neuen String erstellen. Am besten du nimmst einfach einen String, formatierst ihn, sendest ihn und formatierst ihn erneut in der 2. Form um ihn dann nochmal, aber mit anderem Text zu senden. Ist aufjedenfall einfacher da man nicht soviele Variablen erstellen muss ;)


    // EDIT:


    Zitat

    [32]steht für die Länge des Strings. Dieser String kann insgesamt 32 zeichen fassen. Das Fassungsvermögen bezieht sich dabei auf die gesamte Nachricht und nicht nur den Namen. 32 Zeichen ist die Maximale Anzahl pro Nachricht im SA-MP Chatfenster.
    Mehr als 32 Zeichen für einen String würde funktionieren, jedoch wäre es ab 40 unklug.


    Epic Fail.
    Die SA:MP Chatbox unterstützt maximal 128 (- 3 bis 16 wenn es Input ist) Zeichen, nicht 32. Außerdem ist es nicht unklug auch mal einen 256er String drin zu haben, aber nur wenn man Daten aus Files lädt, bzw. hinein schreibt, die so lang werden können.


    // EDIT 2:


    Btw ist das Code Optimisation Tutorial auf das du verweist fehlerhaft bzw. nicht ganz korrekt.
    Das ist besser: Code Optimierungen

    Einmal editiert, zuletzt von [NSG]Bright ()

  • Joa ich finde diese Methode erlich gesagt am übersichtlichsten und einfachsten. Diese eine Zeile mehr zu schreiben wird kein Weltuntergang sein bright^^ außerdem bekommt das Script mehr Zeilen kommt besser :P
    Gold, naja warum sizeof(name/string) ??? Man hat doch vorher schon name drin GetPlayerName(playerid,name,sizeof(name));

  • Jo danke an euch. Ich hab doch gehofft für den Normalverbraucher reichts.
    Ich muss hier an der Stelle mal sagen, mein Vorbild bei den Tuts sind Goldkillers Tuts. So versuch ich meine auch aufzubaun. Den Code posten und dann erklären. nur meine sind halt nicht halb so gut^^. Gold, respekt du hasts echt drauf.

  • Äh, gehts noch? Ein Script das viele Zeilen hat soll "cooler" sein?!


    Wenn ich ein Script code gehts mir nicht drum wieviele tausend Zeilen es hat, sondern dass es 1. seinen Zweck erfüllt und 2. den Server nicht allzu sehr belastet.

  • Immer mit der Ruhe. Ich habe nie von COOLER gesprochen, dazu haben ich Smylies gemacht. Aber wenn man sagt mei nScript hat 90k und nicht 60k kommt das bei den meisten Nichtfachmännern besser an. Was dahinter steckt ist was anderes. Aber back to topic, ich will Meinungen hören

    Einma vorbei schaun lohnt sich
    www.prt-clan.com der GamerClan für GTA-SAMP.Wir haben einen leistungsstarken vServer und ein hoch entwickeltes RealLife Script der Marke eigenbau, zu 100% Selfmade.
    Bald geht der RL-Server on, seid alle dabei. Regestriert euch und fiebert mit!!!


    Einmal editiert, zuletzt von Weed ()

  • Zitat

    GetPlayerName(playerid,Name,sizeof(Name));
    playerid
    [font='Comic Sans MS, sans-serif']steht für den ausführenden Spieler.



    Das ist auch nicht ganz richtig, da bei dieser Funktion an / dieser Stelle niemand etwas ausführt bis auf der Code eben selbst. Aber das sind nur Details



    steht Len nicht für length? oO

  • len rall ich nicht, von daher ich weiß nur wie es geht^^ und das mit playerid, ja stimmt dann sagen wir ist für den anzusprechenden spieler