Nützliche Codeschnipsel

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

  • #define scm(%1,%2,%3,%4); format(gstring[%1],128,%3,%4); SendClientMessage(%1,%2,gstring[%1]);
    new gstring[MAX_PLAYERS];

    mann kann dadurch die format zeile Sparen.
    Beispiel:



    scm(playerid,Weiß,"Mein Name ist %s.",PlayerName(playerid));


    könnte für neulinge nützlich werden

    4 Mal editiert, zuletzt von huGGy () aus folgendem Grund: Edit1: code erneuert Edit2: code optimiert Edit3: fehler behoben Edit4: rechtschreibung

  • #define scm(%1,%2,%3,%4); format(gstring[%1],128,%3,%4); SendClientMessage(%1,%2,gstring[%1]);

    das kommt von der variable gstring wo die playerid eingetragen wird vom spieler.
    siehe bsp.

    scm(playerid,Weiß,"Willkommen auf %s",ServerName);

    die playerid wird mit übergeben und sorgdafür das der spieler wo es erhalten soll nur das bekommt

  • hallo


    Zitat

    #define scm(%1,%2,%3,%4); format(gstring[%1],128,%3,%4); SendClientMessage(%1,%2,gstring[%1]);
    new gstring[MAX_PLAYERS];



    ich hab irgendwo das gefunden, was ist von deinem der unterschied zu dem ? oder was ist besser oder schlechter ?
    #define SendText(%0,%1,%2,%3) do{new _string[128]; format(_string,sizeof(_string),%2,%3); SendClientMessage(%0,%1,_string);} while(False)



    mfg

  • und was bringt das in meinem code, bei dir ist es ja auch nicht
    do{ } while(False)


    Fuer den fall, dass das Makro, wie ein Funktionsaufruf nach einem if() aufgerufen wird:
    #define scm(%1,%2,%3,%4); format(gstring[%1],128,%3,%4); SendClientMessage(%1,%2,gstring[%1]);
    new gstring[MAX_PLAYERS];
    if( .. ) scm(playerid, fmt, vars);
    else
    ...
    wird zu:
    if( .. )format(...); SendClientMessage(..);
    else
    ...
    Resultiert also in einem Fehler, da das format() nur aufgerufen wird, wenn das if wahr ist. Das SendClientMessage() immer aufgerufen wird und das else kein if() mehr vor sich hat.
    Im gegensatz dazu:
    #define SendText(%0,%1,%2,%3) do{new _string[128]; format(_string,sizeof(_string),%2,%3); SendClientMessage(%0,%1,_string);} while(False)
    if ( .. ) SendText(playerid, fmt, vars);
    else
    ...
    wird zu:
    if ( .. ) do{ new ...; format(..); SendClientMessage(..); }while(False);
    else
    ...
    Dort entsteht kein Fehler in einem solchen Fall.


    Das scm Makro, so wie es ist, kann maximal fuer MAX_PLAYERS - 128 verwendet werden:
    #define scm(%1,%2,%3,%4); format(gstring[%1],128,%3,%4); SendClientMessage(%1,%2,gstring[%1]);
    #define MAX_PLAYERS 500
    new gstring[MAX_PLAYERS];
    playerid = 499;
    scm( playerid, ... );

    format( gstring[499], 128, ... );
    Sofern der Compiler das zulaesst wuerde ein Puffer ueberlauf dort entstehen, da nur noch eine Zelle (4byte) zur Verfuegung steht und format dort 128 Zellen (512byte) reinschreiben darf.


    Folgendes Makro sollte, aber beide der genannten Fehler beheben:
    #define scm(%1,%2,%3,%4) {format(gstring,sizeof(gstring),%3,%4); SendClientMessage(%1,%2,gstring);}
    new gstring[128];

  • danke, habs jetzt verstanden
    aber weißt du noch was ressourcen schonender ist ?



    ich glaub ja das hier, bin mir nicht sicher
    #define scm(%1,%2,%3,%4) {format(gstring,sizeof(gstring),%3,%4); SendClientMessage(%1,%2,gstring);}
    new gstring[128];

  • Ist es nicht.
    Am besten ist immer noch die normale "Form"
    denn bei euch ist immer der string 128 Zeichen lang, egal ob sie genutzt werden oder nicht.


    PS: W0t?
    3800 Beiträge das sind ein paar zuviel :/

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Ganz oben:

    /* *****Gescriptet/Geschrieben von Digidiligitia und zum Laufengebracht von [GGR]Radio_Bot aka. dome
    http://forum.sa-mp.de/san-andreas-multiplayer/scripting-base/99103-finde-meinen-fehler-nicht ***** */
    //Kurzcodes
    #define ShowPlayerDialog SPD
    #define SendClientMessage SCM
    #define SetPlayerPos SPP


    //Dialoge
    #define DIALOG_TELEPORT 1


    //Farben
    #define Orange 0xFFAA00FF
    #define Blau 0x0000FFFF


    Unter OnPlayerCommandText:

    if (strcmp(cmdtext,"/teleportmenu",true)== 0)
    {
    SCM(playerid,Orange,"{FFFFFF}[{FFB200}Info{FFFFFF}] Willkommen im Teleportmenu!");
    SPD(playerid,DIALOG_TELEPORT,DIALOG_STYLE_LIST,"Teleportmenu","BurgerShotNorth [BSN]\nStadthalle\nLSPD","xx","xx");
    return 1;
    }


    Unter OnDialogResponse:

    if(dialogid == DIALOG_TELEPORT)
    {
    if(response)
    {
    if(listitem == 0)
    {
    SPP(playerid,1227.1797,-914.0590,42.6812);
    SCM(playerid,Orange,"{FFFFFF}[{FFB200}Info{FFFFFF}]: Du wurdest erfolgreich teleportiert!");
    }
    if(listitem == 1)
    {
    SPP(playerid,1479.8236,-1733.3818,13.3828,347.4181);
    SCM(playerid,Orange,"{FFFFFF}[{FFB200}Info{FFFFFF}]: Du wurdest erfolgreich teleportiert!");
    }
    if(listitem == 2)
    {
    SPP(playerid,1528.8275,-1675.9098,13.3828,342.0914);
    SCM(playerid,Orange,"{FFFFFF}[{FFB200}Info{FFFFFF}]: Du wurdest erfolgreich teleportiert!");
    }
    }
    else
    {
    SCM(playerid,Blau," ");
    SCM(playerid,Blau," ");
    SCM(playerid,Blau," ");
    SCM(playerid,Blau," ");
    SCM(playerid,Blau," ");
    SCM(playerid,Blau," ");
    SCM(playerid,Blau,"{FFFFFF}[{FFB200}Info{FFFFFF}]: Teleportmenu: Bis dann!");
    }

    }


    PS: Kann immer erweitert werden :thumbup:

  • Ich trag jetzt auch mal wieder was bei ^^
    Das ist eine Funktion, die alle 6 Leerzeichen ein "\n" einsetzt.
    Gut für z.B. ein Reportsystem im Dialog ;)
    stock TextCheck(text[])
    {
    new insert_when = 6; //Hier die Anzahl der Leerzeichen eingeben, wann er eine neue Zeile einsetzen soll


    new i, newtext[1024];
    format(newtext,1024,"%s",text);
    for(new y; y!=1024; y++)
    {
    if(newtext[y] == ' ')
    {
    i += 1;
    if(i == insert_when)
    {
    strdel(newtext,y,y);
    strins(newtext,"\n",y);
    i = 0;
    }
    }
    }
    format(newtext,1024,"%s",str_replace("\n ", "\n", newtext));
    return newtext;
    }

    Unkompetent. Das neue dynamisch.



    ihr seit schon lustig postet erros aber nicht die zeilen wo sie sind dann können wir euch auch nicht helfen^^


    Lernt Scripten, Leute, und macht eure Augen auf!


    _______________________________________
    50 Beiträge: [x] 300 Beiträge: [x]
    100 Beiträge: [x] 500 Beiträge: [x]
    150 Beiträge: [x] 1000 Beiträge: [x]
    200 Beiträge: [x]
    2000 Beiträge: []
    250 Beiträge: [X] Boardaktivitäten: Profil


    [size=36]_______________________________________

    /Edit: Schmerzt es dir eigentlich nicht so ein Müll zu schreiben 8|

  • Tipp: Ein Makro für "insert_when" verwenden. Als Parameter "size = sizeof text" verwenden und dies auch richtig in der Funktion ändern.
    ES wäre auch gut, wenn du str_replace zeigen würdest.

  • i += 1;


    Was erwartest du von diesem Code? Wenn ich fragen darf.
    Da haste net sehr viel erklärt :whistling:

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen