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
  • Nen größeren Schwachsinn hab ich hier in diesem Forum glaube ich noch nicht lesen dürfen. Mach dir mal bitte Gedanken darüber, wofür die Klammern eigentlich da sind und welchen Zweck sie erfüllen, bevor du andere belehren möchtest. Danke.


    Da hat er aber recht, es gibt da 2 Szenarien:


    if(bla == 1) return SendClientMessage(playerid,-1,"Wieso ist bla auf 1 ?"); //hier lässt man die Klammern weg !


    if(bla == 0) { SendClientMessage(playerid,-1,"Was los ?"); return 0; } //sobald man 2 oder mehr Sachen machen will und kein , setzen kann, muss man Klammern setzen !


    mfg. :thumbup:

    ast2ufdyxkb1.png


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

  • Nen größeren Schwachsinn hab ich hier in diesem Forum glaube ich noch nicht lesen dürfen. Mach dir mal bitte Gedanken darüber, wofür die Klammern eigentlich da sind und welchen Zweck sie erfüllen, bevor du andere belehren möchtest. Danke.


    Nun gut die formulierung ist anstößig gebe ich selbst zu.
    Hat ja Klaiber auch gepostet da hätte ein eigentlich rein können.
    Nun gut ein großen unterschied macht das nicht du kannst, wenn du kein return 0 schreiben willst
    auch #emit RETN schreiben gibt auch den wert 0 zurück solang man davor in ihrgend einer Form mit emit gearbeitet hat.
    Aber nun gut ich weiß sehr wohl das man mit den geschweiften Klammern ein Anweisungsblock erstellt.


    //edit


    was auch möglich zum theme return mehrere sachen hintereinander zu schreiben
    return SendClientMessage(playerid,-1,"Hallo"),SendClientMessage(playerid,-1,"Wie"),SendClientMessage(playerid,-1,"Gehts");


    der rückgabe wert bezieht sich auf die letzte hinzugefügte Anweisung

  • Hier ein wirklich kleiner Code-Schnipsel
    Es ist doch nervig wenn man jemanden wohin Portet und man schreiben muss SetPlayerPos und dann auch noch SetPlayerFacingAngle...


    Hier die Lösung xD, ich nenne es die SetPlayerPosF Funktion xD Hier der Schnipsel :



    stock SetPlayerPosF(playerid,Float:X,Float:Y,Float:Z,Float:F)
    {
    SetPlayerPos(playerid,X,Y,Z);
    SetPlayerFacingAngle(playerid,F);
    return 1;
    }

    MFG


  • was ist eigentlich so schwierig für solche kleinen Sachen den PreProcessor zu benutzen

    #define SetPlayerPosF(%0,%1,%2,%3,%4) SetPlayerPos(%0,%1,%2,%3),SetPlayerFacingAngle(%0,%4)

  • Aus Langeweile habe ich mal eine Funktion geschrieben, nämlich SendClientMessageEx, sieht so aus:


    stock SendClientMessageEx(playerid,color,msg[],{Float,_}:...) {
    new len=strlen(msg)+32,arg[10][32],args=3;
    for(new i=0; i<len; i++) {
    if(msg[i] == '\0') break;
    switch(msg[i]) {
    case '%': {
    switch(msg[i+1]) {
    case 's': {
    for(new y; y<32; y++) {
    if(getarg(args,y) == '\0') break;
    arg[args][y] = getarg(args,y);
    }
    strdel(msg,i,i+2),strins(msg,arg[args],i,len),args++;
    }
    case 'd','i': format(arg[args],32,"%d",getarg(args,0)),strdel(msg,i,i+2),strins(msg,arg[args],i,len),args++;
    case 'f': format(arg[args],32,"%.1f",getarg(args,0)),strdel(msg,i,i+2),strins(msg,arg[args],i,len),args++;
    default: continue;
    }
    }
    default: continue;
    }
    }
    return SendClientMessage(playerid,color,msg);
    }


    Verwendet man z.B. so:


    SendClientMessageEx(0,0xFF4800FF,"Hallo lieber %s. Test %d %d %d","Kaliber",1,2,3);
    //Output-> Hallo lieber Kaliber. Test 1 2 3


    Nun, in einem Test von mir ist diese Funktion, solange die Wiederholung unter 100 liegt schneller als dieses Makro:
    new str2[128];
    #define formatEx(%0,%1,%2,%3) format(str2,128,%2,%3) && SendClientMessage(%0,%1,str2)


    Wollte nur mal den Code zeigen :)


    mfg. :thumbup:

    ast2ufdyxkb1.png


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

  • Nette Funktion. Könntest du evtl noch die restlichen Formatierungen einbauen?


    Mhm, ganz ehrlich so wirklich die Nutzung davon würde ich nicht empfehlen :D


    Es funktioniert zwar, jedoch ist eine das simple Makro besser:


    new str2[128];
    #define formatEx(%0,%1,%2,%3) format(str2,128,%2,%3) && SendClientMessage(%0,%1,str2)
    Weil Pre-Prozessor und so ;)


    Ich habe auch gerade einen sscanf Code aus langeweile geschrieben:


    stock sscanf(msg[],alt[],{Float,_}:...) {
    new len=strlen(msg),i,count=1,len2 = (strlen(alt)+2);
    for(; i<len; i++) {
    if(msg[i] == '\0') return 0;
    if(msg[i] != ' ') continue;
    count++;
    if(count > len2) return 0;
    switch(alt[count-2]) {
    case 's': {
    new tmp[32],var;
    for(new l=(i+1); l<32; l++) {
    if(msg[l] == ' ' || msg[l] == '\0') break;
    tmp[var] = msg[l],setarg(count,var,tmp[var]),var++;
    }
    }
    case 'd','i': {
    new tmp[32],var;
    for(new l=(i+1); l<32; l++) {
    if(msg[l] == ' ' || msg[l] == '\0') { setarg(count,0,strval(tmp)); break; }
    tmp[var] = msg[l],var++;
    }
    }
    case 'f': {
    new tmp[32],var;
    for(new l=(i+1); l<32; l++) {
    if(msg[l] == ' ' || msg[l] == '\0') { setarg(count,0,_:floatstr(tmp)); break; }
    tmp[var] = msg[l],var++;
    }
    }
    }
    }
    return true;
    }


    Der Code ist auch um einiges kürzer als der sscanf Code jedoch langsamer, deshalb rate ich auch dazu das Plugin zu benutzen :D
    Das sind von mir hier nur Beispiele wie man es machen könnte, zur kleinen und übersichtlicheren Veranschaulichung der Codes!


    Kaliber hab dafür nen kürtzeren Code den findest du wenn du aufs Profil von "Double-O-Sven" gehst, der hatte das mal irgentwo gepostet.


    Kürzer als 1ne Zeile ist nicht wirklich möglich :wacko:


    mfg. :thumbup:

    ast2ufdyxkb1.png


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

  • Doch das: (Und die Verwendung ist z.b. so:)


    SendClientMessage(playerid, GELB, "Du hast %s in %s umbenannt (ID: %i)", oldname, newname, pID);


    Die Funktion
    new stock
    scm_buf[144];

    Die Funktion
    native __SendClientMessage(playerid, color, const message[]) = SendClientMessage;
    native __SendClientMessageToAll(color, const message[]) = SendClientMessageToAll;

    Die Funktion
    #define SendClientMessage(%0,%1,%2,%3) \
    (format(scm_buf, sizeof scm_buf, %2,%3), __SendClientMessage(%0,%1,scm_buf))

    #define SendClientMessageToAll(%0,%1,%2) \
    (format(scm_buf, sizeof scm_buf, %1,%2), __SendClientMessageToAll(%0,scm_buf))


  • Entschuldigung wenn ich diskret werde, aber bist du dumm :huh:


    Ich habe doch folgendes geschrieben:


    new str2[128];
    #define formatEx(%0,%1,%2,%3) format(str2,128,%2,%3) && SendClientMessage(%0,%1,str2)


    Zudem ist das da oben keine Funktion, sondern ein Makro !


    mfg. :thumbup:

    ast2ufdyxkb1.png


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

  • Nun, in einem Test von mir ist diese Funktion, solange die Wiederholung unter 100 liegt schneller als dieses Makro:


    Das kann absolut nicht sein.


    Deine Funktion wäre nur dann schneller, wenn du kein format benutzt hättest und direkt im string geblieben wärst.
    Dein Code hat eine lausige effektivität, zumal %.3f bei dir nicht funktioniert.

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

    Margarete Stokowski

  • Nützlich ist bei diesem Code mal relativ :D


    Es ist mal ein anderer Weg eine Addition/Subtraktion/Multiplikation/Division durchzuführen ;)


    Hier mal ein kleines Makro + eine kleine Funktion:


    #define int:%0(%1)=%2; \
    %0=Write(%0,%2,%1);
    stock Write(int1,int2,int3) {
    switch(int3) {
    case 0: {
    #emit LOAD.S.pri int1
    #emit LOAD.S.alt int2
    #emit ADD
    #emit RETN
    }
    case 1: {
    #emit LOAD.S.pri int1
    #emit LOAD.S.alt int2
    #emit SUB
    #emit RETN
    }
    case 2: {
    #emit LOAD.S.pri int1
    #emit LOAD.S.alt int2
    #emit SMUL
    #emit RETN
    }
    case 3: {
    #emit LOAD.S.pri int1
    #emit LOAD.S.alt int2
    #emit SDIV
    #emit RETN
    }
    }
    return unsigned:0;
    }


    und so rechnet man damit:


    Hier die kleine Liste:


    Code
    0 = plus1 = minus2 = multiplizieren3 = dividieren


    new test = 5;
    int:test(0)=5; //0 = plus
    printf("%d",test);
    //->Output: 10


    mfg. :thumbup:

    ast2ufdyxkb1.png


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

  • Jetzt will ich mich mal auch so kuhl fühlen wie Kaliber und ein #emit code posten um den inhalt eines arrays zu verändern
    index ist optional


    stock ChangeData(array[], val, index=sizeof(array)){
    new i;
    for(; i < index; ++i){
    #emit LOAD.S.pri i
    #emit SMUL.C 4
    #emit LOAD.S.alt array
    #emit ADD
    #emit LOAD.S.alt val
    #emit XCHG
    #emit STOR.I
    }
    }

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