Stock Frage/Problem Hilfesuchen bei Umsetzung

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
  • Guten Tag Community!


    Ich hab eine Frage zum Thema Stock und SendClientMessage.


    Mir ging dieses ständige format... etc auf die nerven.. Und ich hab überlegt wie ich das umgehen könnte!


    Habe diesen Stock geschrieben:


    Spoiler anzeigen
    stock SCM(playerid, color, text[], params[])
    {
    if(params >= 1)
    {
    new string[300];
    format(string,sizeof(string),text,params[]);
    SendClientMessage(playerid, color, string);
    return 1;
    }
    else
    {
    SendClientMessage(playerid, color, text);
    return 1;
    }
    }

    Spoiler anzeigen
    ocmd:hallo(playerid,params[])
    {
    SCM(playerid, COLOR_GREEN, "Hallo");
    return 1;
    }

    Spoiler anzeigen
    ocmd:Simon(playerid,params[])
    {
    new name[30];
    GetPlayerName(playerid,name,30);
    SCM(playerid, COLOR_GREEN,"Hallo %s",name);
    return 1;
    }



    Darunter stehen zwei einfache Befehle.. der eine eine normale Client Message mit SCM und der andere mit einem parameter der eigentlich formatiert gehört.


    Jetzt hab ich mir gedacht muss ich bei SCM nur die Sachen der ClientMessage und den Parameter übergeben..
    Jetzt hab ich ein paar Probleme..


    Ich habe im Stock eine Abfrage ob ein Parameter vorhanden ist, hierbei müsste es ja formatiert werden. -> Die Abfrage ist wahrscheinlich vollkommen falsch..
    Müsste params nicht ein Array sein ? also params[] ?
    Wie mache ich es, dass ich wenn ich keinen Parameter eingebe keinen Fehler bekomme, dass einer fehlt?
    Würde ich nur SCM(playerid,COLOR_GREEN,"Hallo"); schreiben, zeigt er mir, dass der 4 Parameter fehlt..



    Ich hoffe ihr könnt mir helfen, bzw hoffe ich, dass es geht!


    Mit freundlichen Grüßen, Simon.



    P.S: Nicht zu fies sein ^^ es war nur eine Idee

  • Also um dieses Problem zu lösen, gibt es mehrere Möglichkeiten.


    Zum einen, kannst du eine Funktion (es heißt Funktion, nicht stock) verwenden, allerdings müsstest du dann mit Argumenten arbeiten, wie du schon festgestellt hast ;)


    Wenn man das noch mit OP Code verbindet, kannst du z.B. eine gute Funktion dafür schreiben:


    Spoiler anzeigen
    stock SCM(playerid, color, fstring[], {Float, _}:...) {
    new n = numargs() * 4;
    if (n == 3 * 4) return SendClientMessage(playerid, color, fstring);
    new message[128],arg_start,arg_end,i = 0;

    Spoiler anzeigen
    #emit CONST.pri fstring
    #emit ADD.C 0x4
    #emit STOR.S.pri arg_start

    Spoiler anzeigen
    #emit LOAD.S.pri n
    #emit ADD.C 0x8
    #emit STOR.S.pri arg_end

    Spoiler anzeigen
    for (i = arg_end; i >= arg_start; i -= 4) {
    #emit LCTRL 5
    #emit LOAD.S.alt i
    #emit ADD
    #emit LOAD.I
    #emit PUSH.pri
    }

    Spoiler anzeigen
    #emit PUSH.S fstring
    #emit PUSH.C 128
    #emit PUSH.ADR message
    #emit PUSH.S n
    #emit SYSREQ.C format
    i = n / 4 + 1;
    while (--i >= 0) {
    #emit STACK 0x4
    }
    return SendClientMessage(playerid, color, message);
    }


    Allerdings kann man es wie oben schon genannt auch noch anders lösen, eine alternativ Funktion wäre:


    http://forum.sa-mp.com/showthr…ientMessageEx#post1189734


    oder du nutzt ein Makro:


    new buffer[144 + 1];
    #define SCM(%0,%1,%2,%3) format(buffer, sizeof(buffer),%2,%3) && SendClientMessage(%0, %1, buffer)


    Alternativ kannst du aber auch noch Plugins benutzen:


    [ PLUGIN ] Better Format


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S