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
  • Habe mal aus Langerweile eine Funktion erstellt,
    wo Kennzeichen Automatisch erstellt werden.
    Die Abfrage bezieht sich nach 3 werten
    Sprich wenn ihr ein Auto erstellt das in LS steht, dann beginnt das kennzeichen mit LS
    Der rest kommt per zufall z.B.
    LS-BA 123
    so ein kennzeichen kann sich dann erstellen
    Verwendung:
    new car = CreateVehicle(....);
    CreateRandoomNumplate(car);


    Der Code
    stock CreateRandoomNumplate(vehicle)
    {
    new numtext[40],vornumber[5],b1[5],b2[5],other[10],rand1=random(26),rand2=random(26),Float:x,Float:y,Float:z;
    GetVehiclePos(vehicle, x, y, z);
    if((x > -992.5172 && x < 4000.0000) && (y < 528.0000 && y > -4000.0000))vornumber="LS";
    if((x > -4000.0000 && x< -992.5172) && (y < 4000.0000 && y > -4000.0000))vornumber="SF";
    if((x > -992.5172 && x< 4000.0000) && (y < 4000.0000 && y > 528.0000))vornumber="LV";
    switch(rand1)
    {
    case 0:{b1="A";}case 1:{b1="B";}case 2:{b1="C";}case 3:{b1="D";}case 4:{b1="E";}case 5:{b1="F";}case 6:{b1="G";}case 7:{b1="H";}case 8:{b1="I";}case 9:{b1="J";}
    case 10:{b1="K";}case 11:{b1="L";}case 12:{b1="M";}case 13:{b1="N";}case 14:{b1="O";}case 15:{b1="P";}case 16:{b1="Q";}case 17:{b1="R";}case 18:{b1="S";}
    case 19:{b1="T";}case 20:{b1="U";}case 21:{b1="V";}case 22:{b1="W";}case 23:{b1="X";}case 24:{b1="Y";}case 25:{b1="Z";}
    }
    switch(rand2)
    {
    case 0:{b2="A";}case 1:{b2="B";}case 2:{b2="C";}case 3:{b2="D";}case 4:{b2="E";}case 5:{b2="F";}case 6:{b2="G";}case 7:{b2="H";}case 8:{b2="I";}case 9:{b2="J";}
    case 10:{b2="K";}case 11:{b2="L";}case 12:{b2="M";}case 13:{b2="N";}case 14:{b2="O";}case 15:{b2="P";}case 16:{b2="Q";}case 17:{b2="R";}case 18:{b2="S";}
    case 19:{b2="T";}case 20:{b2="U";}case 21:{b2="V";}case 22:{b2="W";}case 23:{b2="X";}case 24:{b2="Y";}case 25:{b2="Z";}
    }
    format(other,10,"%s%s",b1,b2);
    format(numtext,40,"%s-%s %d",vornumber,other,random(999));
    SetVehicleNumberPlate(vehicle,numtext);
    return 1;
    }

    Zwar klein aber für manche RP oder Reallife Server ist es gebrauchbar


    Viel spaß damit

    All in all it's just another brick in the wall


  • das hättest du auch eleganter lösen können


    new Zeichen[26][] = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
    stock CreateRandoomNumplate(vehicle)
    {
    new numtext[20],Float:Pos[3];
    GetVehiclePos(vehicle, Pos[0], Pos[1],Pos[2]);
    format(numtext,20,"%s-%s%s %d",((Pos[0] > -992.5172 && Pos[0] < 4000.0000) && (Pos[1] < 528.0000 && Pos[1] > -4000.0000)?("LS"):((Pos[0] > -4000.0000 && Pos[0]< -992.5172) && (Pos[1] < 4000.0000 && Pos[1] > -4000.0000)?("SF"):((Pos[0] > -992.5172 && Pos[0]< 4000.0000) && (Pos[1] < 4000.0000 && Pos[1] > 528.0000)?("LV"):("CS")))),Zeichen[random(25)],Zeichen[random(25)],random(999));
    SetVehicleNumberPlate(vehicle,numtext);
    return numtext;
    }


    zu dem ist die verwendung von switch langsamer als else if :D jedoch ist der Ternäre Operator schneller als else if da nix initaliziert werden muss zu dem
    benutz arrays diese kosten weniger memory und verkleinere auch die strings verringert auch den memory verbrauch und warum alles einzelt wenn es auch so geht
    nur 1 mal formatieren format ist langsam daher versucht man dies so wenig wie möglich zu verwenden.


    //edit neu zitiert zu dem kannst du bestimmt noch einiges lernen wenn du mal mein tutorial durchlesen würdest :D

  • Returned den kleinste bzw. größten Wert aller eingegebenen Integer.



    stock findmax(...)
    {
    new count=numargs(),num=getarg(0);
    if(count==1) return num;
    for(new i=1;i<count;i++) if(getarg(i)>num) num=getarg(i);
    return num;
    }


    stock findmin(...)
    {
    new count=numargs(),num=getarg(0);
    if(count==1) return num;
    for(new i=1;i<count;i++) if(getarg(i)<num) num=getarg(i);
    return num;
    }

  • Ich will auch etwas preisgeben undzwar für Medics einen /heal und zum annehmen /accept


    ihr braucht dazu das include ocmd und sscanf ich benutze das include von sscanf also schreibe ich oben #include <sscanf> wieso sscanf? ich habe den sscanf text in eine textdatei kopiert und es erfüllt den selben zewck :)
    also oben im script:
    #include <a_samp>
    #include <sscanf>
    #include <ocmd>


    new heal[MAX_PLAYERS]; //Das ist die Variabele dazu später mehr.


    gut unter OnPlayerCommandText:
    if(strcmp(cmdtext,"/accept",true) == 0)
    {
    if(heal[playerid] == 1) //Hier ist die Variabele die was erst mit den /heal befehl aktiviert wird.
    {
    new pID, string[128],string2[128];//2 strings die brauchen wir für den format
    format(string,sizeof(string),"Sie wurden erfolgreich von %s geheilt",SpielerName(pID));//hier wird string1 formatiert
    SendClientMessage(playerid,Türkis,string);//dort string 1 abgestendet
    format(string2,sizeof(string2),"Du hast erfolgreich %s für 150$ geheilt",SpielerName(playerid));//hier string2 formatiert
    SendClientMessage(playerid,Türkis,string2);//und hier string2 abgesendet
    GivePlayerMoney(pID,150);//Der was den befehl /heal ausgeführt hat bekommt dieses geht 150$
    GivePlayerMoney(playerid,-150);//Der was geheilt wird bekommt 150$ abgezogen
    heal[pID] = 0;//Und hier wird die variabele wieder auf 0 gesetzt das sie benutzt wurde
    }
    else
    {
    SendClientMessage(playerid,Grau,"Du hast keine Healanfrage bekommen!");//dashier wird angezeigt wenn keiner zuvor den /heal befehl ausgeführt hat
    }
    }


    so möglichts weit unten im script kommt nun der /heal befehl als ocmd wir beginnen mit dem grundgerüst
    ocmd:heal(playerid,params[])
    {
    return 1;
    }
    das sieht dan so aus


    nun wollen wir das es nur Medics oder admins können ich benutze hierzu enums... ihr müsstest also nur die fraktions abfrage ändern.

    ocmd:medheal(playerid,params[])
    {
    if(PlayerInfo[playerid][pMember] == 3||PlayerInfo[playerid][pLeader] == 3)//Dashier ist die Fraktions abfrage ändert sie in eure
    {
    new pID;//dashier ist die partner id also der was geheilt werden soll
    if(sscanf(params,"u",pID))return SendClientMessage(playerid,Grau,"Benutzung: /medheal [ID]");//dashier ist der sscanf code der bewirk das er eine ID auswählt..
    {
    new string[128];hier ein string dazu gleich mehr
    format(string,sizeof(string),"%s:Ich will dich %s für 150$ heilen, nehme die Anfrage mit /accept heal an.",SpielerName(playerid),SpielerName(pID));bei diesem string wird angezeit wer wen heilt
    SendClientMessage(pID,Weiss,string);hier wird unser string abgeschickt
    SendClientMessage(playerid,Grau,"Healanfrage verschickt");und da wird bestätigt das es abgeschikt wurde
    heal[pID] = 1;//Dashier ist unsere goldene Variabale :)
    }
    }
    return 1;
    }


    jetzt noch auch ganz unten einen stock SpielerName(playerid) damit wir unseren Spielernamen herrausfinden das ist ganz einfach
    //SpielerName-Stock
    stock SpielerName(playerid)
    {
    new GetName[MAX_PLAYER_NAME];
    GetPlayerName(playerid,GetName,sizeof(GetName));//hier wird der name herrausgefunden und dan in SpielerName gepackt
    return GetName;
    }


    und das wars ich hoffe ich konnte euch hilfreich sein! :)


  • Also wenn du schon was hier postest dann doch bitte was produktives


    Der unnötigstes Fehler welchen man machen kann


    stock SpielerName(playerid)
    {
    new GetName[MAX_PLAYER_NAME];
    GetPlayerName(playerid,GetName,sizeof(GetName));//hier wird der name herrausgefunden und dan in SpielerName gepackt
    return GetName;
    }


    warum jedes mal den namen auslesen , wenn man das ganze auch als array speichern kann die meisten gf haben sogar dafür eine
    accountvariabel


    dazu kann man auch noch ein Makro benutzen. sollte dies nicht der Fall sein macht auch nix dann erstellt man ein
    3DArray und ließt für den Spieler den Namen aus


    #define PlayerName(%0) pName[%0]
    new pName[MAX_PLAYERS][MAX_PLAYER_NAME];

    strdel(pName[playerid],0,MAX_PLAYER_NAME);
    GetPlayerName(playerid,pName[playerid],MAX_PLAYER_NAME);


    und das nächste wäre dies
    new heal[MAX_PLAYERS]; 
    warum benutzt du nicht einfach ein boolean dies spart memory oder ein char array


    Nächster Punkt


    new pID, string[128],string2[128];//2 strings die brauchen wir für den format
    format(string,sizeof(string),"Sie wurden erfolgreich von %s geheilt",SpielerName(pID));//hier wird string1 formatiert
    SendClientMessage(playerid,Türkis,string);//dort string 1 abgestendet
    format(string2,sizeof(string2),"Du hast erfolgreich %s für 150$ geheilt",SpielerName(playerid));//hier string2 formatiert


    zwei unnötige große strings 64 reichen da völlig aus und einer allein auch.


    und noch was bei if-statements wo was returnt wird lässt man die Klammern weg

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • ocmd:biz(playerid,params[])
    {
    new path[128], preis, art,setx[128],sety[128],setz[128],setp[128], seta[128], sstring[128];
    new string[128] = "binfo";
    format(path, sizeof(path), "/biz/%s.ini", string);
    if(sscanf(params, "ii", preis, art))
    {
    SendClientMessage(playerid, -1, "/biz [Preis] [Art: 1-5]");
    SendClientMessage(playerid, -1, "biz-Arten: 1: Klein, 2:Mittel, 3:Groß, 4:Restaurante, 5:Sonstige");
    }
    else
    {
    if(!dini_Exists(path))
    {
    dini_Create(path);
    SendClientMessage(playerid, -1, "Biz Datei erstellt!");
    dini_IntSet(path, "bMAX", 0);
    return 0;
    }
    else
    {
    new Float:x1, Float:y1, Float:z1;
    GetPlayerPos(playerid, x1,y1,z1);
    new math = dini_Int(path, "bMAX") + 1;
    dini_IntSet(path, "bMAX", math);
    format(setx, sizeof(setx), "x%i", dini_Int(path, "bMAX"));
    format(sety, sizeof(sety), "y%i", dini_Int(path, "bMAX"));
    format(setz, sizeof(setz), "z%i", dini_Int(path, "bMAX"));
    format(setp, sizeof(setp), "preis%i", dini_Int(path, "bMAX"));
    format(seta, sizeof(seta), "art%i", dini_Int(path, "bMAX"));
    dini_FloatSet(path, setx, x1);
    dini_FloatSet(path, sety, y1);
    dini_FloatSet(path, setz, z1);
    dini_IntSet(path, setp, preis);
    dini_IntSet(path, seta, art);
    format(sstring,sizeof(sstring), "Biz %i erfolgreich erstellt. p: %i a: %i", dini_Int(path, "bMAX"), dini_Int(path, setp),dini_Int(path,seta));
    SendClientMessage(playerid, -1, sstring);
    }
    }
    return 1;
    }


    So sieht das ganze dann in etwa in Aktion aus:




    Vielleicht ist das ja für jemandem hilfreich.
    Mir hat's auf jedenfall sehr geholfen. :)

  • Vor einigen Tagen habe ich gelesen, dass so eine Funktion gebraucht wird, nun hier mal eine simple verdrehens Funktion:


    stock verdrehen(txt[]) {
    new len=strlen(txt),s,tmp[128];
    for(; s<len; s++) {
    new x = random(strlen(txt));
    tmp[s] = txt[x];
    strdel(txt,x,x+1);
    }
    strins(tmp,txt,strlen(txt),128);
    return tmp;
    }


    //Verwendung:
    printf("Wort: %s",verdrehen("Reallife"));
    //-> Output: eeillafR //ändert sich natürlich immer


    Hoffe ich konnte einigen Helfen...


    mfg. :thumbup:

    ast2ufdyxkb1.png


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

  • Für die die es satt haben für Kick ein Timer zu erstellen seit 0.3x hab ich was kleines gemacht das auch ganz gut Funktioniert


    Der Code

    Spoiler anzeigen
    #include <a_samp>

    Spoiler anzeigen
    native B_Kick(playerid) = Kick;

    Spoiler anzeigen
    forward kickplayer(playerid);

    Spoiler anzeigen
    stock _Kick(playerid)
    {
    SetTimerEx("kickplayer",100,0,"d",playerid);
    return 1;
    }

    Spoiler anzeigen
    public kickplayer(playerid)
    {
    return B_Kick(playerid);
    }

    Spoiler anzeigen
    #if defined _ALS_Kick
    #undef Kick
    #else
    #define _ALS_Kick
    #endif
    #define Kick _Kick


    Als Include datei hab ich es noch angehangen


    Die einrichtung ist ganz easy
    einfach nur im Script das einfügen (sofern ihr die include nutzt^^)
    #include <b_kick>
    Compilen und schon funktioniert alles

  • und noch was bei if-statements wo was returnt wird lässt man die Klammern weg

    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.


    Mein CS:GO Server: 62.75.168.39:27016


    Ich bin so hungrig, dass ich vor lauter Durst nicht weiß, was ich rauchen soll - so müde bin ich!
    Freedom is just another word for 'Nothing left to lose'


  • Zwar nichts großes dennoch Dynamisch :D

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