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
  • einfaches savep. und loadp. also position speichern und laden.
    new Float:PosX[MAX_PLAYERS], Float:PosY[MAX_PLAYERS], Float:PosZ[MAX_PLAYERS], Float:PosA[MAX_PLAYERS], PosI[MAX_PLAYERS];
    if (strcmp(cmdtext, "/savep", true)==0)
    {
    GetPlayerPos(playerid, PosX[playerid], PosY[playerid], PosZ[playerid]);
    GetPlayerFacingAngle(playerid, PosA[playerid]);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, ".:SERVER:. Position gespeichert! Du kannst sie mit /loadp Laden.");
    PosI[playerid] = (GetPlayerInterior(playerid));
    PlayerPlaySound(playerid, 1137 , 0.0, 0.0, 0.0);
    return 1;
    }


    if (strcmp(cmdtext, "/loadp", true)==0)
    {
    if (!floatsqroot(PosX[playerid]+PosY[playerid]+PosZ[playerid]))
    {
    return SendClientMessage(playerid, COLOR_RED, "[ERROR:] Benutze /savep Als erstes!");
    }
    else
    {
    ResetPlayerWeapons(playerid);
    if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
    {
    SetVehiclePos(GetPlayerVehicleID(playerid), PosX[playerid], PosY[playerid], PosZ[playerid]);
    SetVehicleZAngle(GetPlayerVehicleID(playerid), PosA[playerid]);
    SetCameraBehindPlayer(playerid);
    LinkVehicleToInterior(GetPlayerVehicleID(playerid), PosI[playerid]);
    }
    else
    {
    InCar[playerid] = false;
    SetPlayerPos(playerid, PosX[playerid], PosY[playerid], PosZ[playerid]);
    SetPlayerFacingAngle(playerid, PosA[playerid]);
    SetCameraBehindPlayer(playerid);
    }
    PlayerPlaySound(playerid, 1085, 0.0, 0.0, 0.0);
    SetPlayerInterior(playerid, PosI[playerid]);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, ".:SERVER:. Gespeicherte Position Geladen!");
    }
    return 1;
    }

    526C4Hj.png Mit freundlichen Grüßen,
    Noneatme

  • Sicher kennt Ihr doch den verheerenden Glitch (NICHT C-BUG), der auftretet, wenn man mit der Faust 1x zuschlägt und dann RENN & DUCK Taste (oder RENN danach DUCK Taste oder DUCK Taste und danach RENN) drückt? Wer nicht: Wenn das erfolgreich und richtig ausgeführt wird, duckt sich der Spieler und ist gefreezed und kann sich nicht bewegen aber dennoch Waffe wählen. Außerdem ist es dem Spieler möglich mit unendlich Munition zu schießen und ohne nachzuladen. Das schlimmste dazu, es geht mit jeder Waffe! (Ja sogar Minigun und andere schwere Waffen lassen sich geduckt schießen!)


    Anti-Reload Glitch:
    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if(oldkeys & KEY_CROUCH && newkeys & KEY_SPRINT) {
    GetPlayerPos(playerid, X, Y, Z);
    SetPlayerPos(playerid, X, Y, Z);
    }
    else
    if(oldkeys & KEY_SPRINT && newkeys & KEY_CROUCH) {
    GetPlayerPos(playerid, X, Y, Z);
    SetPlayerPos(playerid, X, Y, Z);
    }
    else
    if(oldkeys & KEY_SPRINT && oldkeys & KEY_CROUCH) {
    GetPlayerPos(playerid, X, Y, Z);
    SetPlayerPos(playerid, X, Y, Z);
    }
    }
    Damit lässt es sich verhindern.

    Einmal editiert, zuletzt von (DFE)Roy ()

  • getTopScore(startid,list[])
    {
    new maximal_id = startid,counter = -1;
    for(new j = 0;j<MAX_PLAYERS;j++)
    {
    if(!IsPlayerConnected(j) || IsPlayerNPC(j) || j = startid)continue;
    if(GetPlayerScore(maximal_id) < GetPlayerScore(j))
    {
    counter++;
    list[counter] = j;
    maximal_id = j;
    }
    }
    return 1;
    }


    • Liste mit dem Spielern wiedergeben die den meisten Score haben ( Nach Reihenfolge )

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • Warum macht ihr denn immer new j oder new i. Das ist eigentlich richig richtig schrecklich.
    Man sollte schon entweder playerid oder index schreiben können.
    Ich hab immer Strafe bekommen, als mein Scriptlehrer das gesehen hat.

  • Weil scripten ist wie lesen und schreiben. Wenn du etwas schreibst, dann soll jemand anderes es lesen.
    Irgendwann hast du alles voller ies, jöts, as, has, pees, dees und der Leser kommt nicht klar.
    Wenn da aber steht: SpielerID, ZielID, AutoID,... etc dann weiß er bescheid.


    Stell dir vor, ich würde dir sowas schreiben:
    s d v, i w d s s.


    Ich weiß was es heißt, weißt du es auch? Du musstdann nochmal genau hingucken um rauszufinden, was ich jetzt genau damit meine.

  • i = Integer
    j = sieht ähnlich aus


    daher sehe ich das immer als Zahlenbezeichner ;)
    Ist so eine Angewohnheit, als Programmierer oder auch Scripter sollte man alles Möglichst knapp halten ^^ , hängt aber auch mit dem Style desjenigen ab , wie
    er seinen Code Strukturiert.


    Aso und um das wiederfinden mache ich mir keine Sorgen, versteht man die Logik des Codes & der Sprache, kann man das locker zurückverfolgen ^^

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • Ich habs eigentlich so übernommen, da ich es damals so bei Blaggy gesehen hatte :D
    Hinterfragt hatte ich es eigentlich nie und darum, dass es ein anderer nicht lesen kann, mach ich mir keine Sorgen, da ich lediglich Scripte für den Eigengebrauch scripte. ;) Sollte kein anderer bekommen.
    Die gleiche Angewohnheit mit dem so kurz wie möglich hab ich auch, z.B. wird bei mir aus PlayerInfo pInfo das enum heißt pEnum, bei Vehikeln wirds vInfo und vEnum und so weiter..;) So weiß ICH was gemeint ist und jeder andere muss es sich zwar erdenken, aber so kompliziert ist es ja auch nicht.


  • new sendfstring[128];
    #define SendFormattedText(%1,%2,%3,%4) format(sendfstring,128,(%3),%4); SendClientMessage((%1), (%2) ,sendfstring)
    #define SendFormattedTextToAll(%1,%2,%3) format(sendfstring,128,(%2),%3); SendClientMessageToAll((%1),sendfstring)


    new i = 12;
    SendFormattedText(playerid, 0xffffffff, "Text: integer = %d", i);


  • Ist zwar nicht von mir aber das ist ne dynamischere Variante ;)
    stock SendFormatedMessage(playerid, color, message[], {Float,_}:...)
    {
    new args = numargs();
    #define MAX_NUMARGS 10
    new string[MAX_NUMARGS][256];
    for(new i = 3; i < args+1; i++)
    {
    new gchar = 0;
    for(new a = 0; a < 256; a++)
    {
    string[i][a] = getarg(i, gchar);
    gchar++;
    }
    }
    for(new i = 3; i <= args; i++)
    {
    new bstring[256];
    for(new a = 0; a <= 256; a++)
    {
    bstring[a] = string[i][a];
    }
    format(message, 256, message, bstring);
    }
    SendClientMessage(playerid, color, message);
    }


    // Bsp.:
    SendFormatedMessage(playerid, color, "%d, %s, %f..", 1, "Eins, 1.0);

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • forward languageMessage(userid, color, string1[], string2[]);
    new language[MAX_PLAYERS];


    OnPlayerConnect(playerid) language[playerid]= 0;


    stock languageMessage(userid, color, string1[], string2[])
    {
    if(language[userid]==0){SendClientMessage(userid, color, string1); }else {SendClientMessage(userid, color, string2); }
    }


    Verwendungsbeispiel:
    languageMessage(playerid, COLOR_01, "deutsch","german");


    Oder noch eine andere Version

    forward languageMessage(userid, color, string1[], string2[], germanenglish)


    stock languageMessage(userid, color, string1[], string2[], germanenglish)
    {
    if(germanenglish == 0) { SendClientMessage(userid, color, string1);}
    if(germanenglish == 1) { SendClientMessage(userid, color, string2); }
    else { SendClientMessage(userid, color, "Error, wende dich an einen Administrator."); }
    }


    Anwendungsbeispiel:



    languageMessage(playerid, COLOR_01, "deutsch", "german", 0);

  • Frage: Seitwann forwardet man ein stock? lol.

  • Etwas sauberere Lösung:

    stock SendMultiMessage(playerid,color,lang1[],lang2[],lang3[])
    {
    switch(GetPVarInt(playerid,"Language"))
    {
    case 0: SendClientMessage(playerid,color,lang1);
    case 1: SendClientMessage(playerid,color,lang2);
    case 2: SendClientMessage(playerid,color,lang3);
    default: SendClientMessage(playerid,0xA10000AA," Error, bitte melde dies einem Admin!"); //Könnte man dann auch auf English oder so machen
    }
    }


    public OnPlayerCommandText(playerid, cmdtext[])
    {
    dcmd(language,8,cmdtext);
    return 1;
    }


    dcmd_language(playerid,params[])
    {
    #pragma unused params
    switch(GetPVarInt(playerid,"Language"))
    {
    case 0: SetPVarInt(playerid,"Language",1);
    case 1: SetPVarInt(playerid,"Language",2);
    case 2: SetPVarInt(playerid,"Language",0);
    }
    SendMultiMessage(playerid,0xFFFF00AA,"Sprache geändert","Language Changed","Langue changé");
    return 1;
    }


    Nutzt die neuen 0.3 Funktionen, sowie das schnellere Dcmd.
    Außerdem kann man schnell neue Sprachen hinzufügen.

  • Einfach nur eine simple Mathematikfunktion um die Fakultät einer Zahl auszurechnen:
    Wers auch immer braucht..
    Wer nicht weiß was Fakultät ist:
    Fakultät von 5 z.B. ist: 1*2*3*4*5 = 120
    Fakultät von 7 ist dann: 1*2*3*4*5*6*7 = 5040


    stock faculty(number)
    {
    new returnvar = 1;
    for(new a=1; a<=number; a++)
    {
    returnvar = returnvar*a;
    }
    return returnvar;
    }

  • Schnelle & sichere Methode um Kommando und Parameter zu trennen...
    Also wer noch vor hat Kommando Formate zu bauen wie das unsinnige dcmd und zcmd ...


    if(strlen(cmdtext) < 1)return 1;
    new cmd[32],parameter[255],bool:switcher,cnt = -1;
    for(new i = 1;i<stlren(cmdtext);i++)
    {
    if(cmdtext[i] == ' ')
    {
    switcher = true;
    cnt = -1;
    }
    if(!switcher)
    {
    cnt++;
    cmd[cnt] = tolower(cmdtext[i]);
    }
    else
    {
    cnt++;
    parameter[cnt] = cmdtext[i];
    }
    }

    Mfg. BlackFoX_UD_ alias [BFX]Explosion



  • stock ErmittleGeschwindigkeit(playerid,bool:kmh)
    {
    new
    Float:x,
    Float:y,
    Float:z,
    Float:rtn;
    if(IsPlayerInAnyVehicle(playerid)) {
    GetVehicleVelocity(GetPlayerVehicleID(playerid),x,y,z);
    }
    else {
    GetPlayerVelocity(playerid,x,y,z);
    }
    rtn = floatsqroot(x*x+y*y+z*z);
    if(kmh) {
    return floatround(rtn * 100 * 2.0);
    }
    else {
    return floatround(rtn * 100);
    }
    }


    Benutzung:
    new Variable = ErmittleGeschwindigkeit(playerid,true);
    by Goldkiller

  • RegEx(string[],pattern[])
    {
    new brc;
    new regex_p[50],mx,s,bool:trues,
    offset,cnt_tr = 0;
    do
    {
    brc = strfind(pattern,"[",false,brc);
    if(brc!=-1)
    {
    brc++;
    while(pattern[brc]!=']' && pattern[brc])
    {
    regex_p[mx] = pattern[brc];
    brc++;
    mx++;
    }
    while(string[s])
    {
    if(regex_p[0] == '!')
    {
    for(new j = 1;j<strlen(regex_p);j++)
    {
    if(regex_p[j] == string[s])
    {
    trues = true;
    break;
    }
    }
    }
    else if(regex_p[0] == ':')
    {
    new other_one;
    do
    {
    other_one = strfind(regex_p,":",false,other_one);
    if(other_one!=-1)
    {
    other_one++;
    if(string[s] >= regex_p[other_one] && string[s] <= regex_p[other_one+1])
    {
    trues = true;
    break;
    }
    }
    }
    while(other_one!=-1);
    }
    else if(regex_p[0] == ';')
    {
    for(new j = 1;j<strlen(regex_p);j++)
    {
    if(regex_p[j] == string[s])
    {
    offset++;
    cnt_tr--;
    trues = true;
    break;
    }
    }
    }
    if(!trues)break;
    trues = false;
    cnt_tr++;
    s++;
    }
    regex_p[0] = '\0';
    mx = 0;
    }

    }
    while(brc!=-1);
    return (cnt_tr == (strlen(string)-offset)) ? (1) : (0);
    }


    Jeder kennt RegEx , Reguläre Ausdrücke , diese Funktion überprüft nicht Exakt sondern nach Format Muster,
    als Beispiel :


    RegEx("3.14","[:09][!.][:09]");
    RegEx("C.12","[:09:AZ][!.][:09]");


    Wie ihr seht ganz einfach ...


    : = ( Von bis )


    Diese Anweisung überprüft ob Bestimmte Zeichen von einem Zeichen
    bis zu einem anderen Zeichen vorhanden sind,
    z.b. [:AZ] , alle Zeichen von A bis Z , es geht von A bis T , 0 bis 2 usw...
    Es können mehrere von bis Werte gestellt werden [:AZ:09] darf von A bis Z oder 0 bis 9 sein.


    ! = ( Exakt )


    Diese Anweisung überprüft Exakt sprich , eine Exakte Reihenfolge von Zeichen
    [!tzuü] , nun dürfen an der Stelle nur t,z,u oder ü sein sonst nichts ;)



    ; = ( Kann sein , muss nicht )


    Werte die nicht sein müssen aber können ,
    können so bestimmt werden :
    [;+%&] , so darf an der Stelle + % oder & stehen,
    wenn es dort nicht steht ist es auch nicht schlimm ;)
    Weil es sein kann.




    Ich wünsche viel Spaß damit, ich werde die Funktion bei bedarf verbessern.

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


    2 Mal editiert, zuletzt von BlackFoX ()

  • Hab mehrere Funktionen gemacht, um ein bestimmten Teil von einen String (ähnlich strtok) zu bekommen:


    stock GetFieldString(field, string[], dest[], bool:end=false)
    {
    new result[256], index = 0;
    for(new i=1; i<field; i++) if(field != 1) { index = strfind(string, " ", true, index+1); }
    if(field == 1) strmid(result, string, 0, strfind(string, " ", true, 0), 64);
    else if(end) strmid(result, string, index+1, strlen(string), sizeof(result));
    else strmid(result, string, index+1, strfind(string, " ", true, index+1), 64);
    return format(dest, 64, "%s", result);
    }


    stock GetFieldInt(field, string[], &dest, bool:end=false)
    {
    new result[64], index = 0;
    for(new i=1; i<field; i++) if(field != 1) { index = strfind(string, " ", true, index+1); }
    if(field == 1) strmid(result, string, 0, strfind(string, " ", true, 0), 64);
    else if(end) strmid(result, string, index+1, strlen(string), sizeof(result));
    else strmid(result, string, index+1, strfind(string, " ", true, index+1), 64);
    return dest = strval(result);
    }


    stock GetFieldFloat(field, string[], &Float:dest, bool:end=false)
    {
    new result[64], index = 0;
    for(new i=1; i<field; i++) if(field != 1) { index = strfind(string, " ", true, index+1); }
    if(field == 1) strmid(result, string, 0, strfind(string, " ", true, 0), 64);
    else if(end) strmid(result, string, index+1, strlen(string), sizeof(result));
    else strmid(result, string, index+1, strfind(string, " ", true, index+1), 64);
    return dest = floatstr(result);
    }


    new cmdtext[256] = "/kick 6 15 Wir wollen keine Cheater";
    new player, grund[64], dauer;
    GetFieldInt(2, cmdtext, player);
    GetFieldInt(3, cmdtext, dauer);
    GetFieldString(4, cmdtext, grund, true);
    printf("%d, %s, %d Minuten", player, grund, dauer);

    2 Mal editiert, zuletzt von d30af26d ()

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