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

  • PlayerDropBoxAudioStream(playerid,FileHash[],file[],Float:posX = 0.0, Float:posY = 0.0, Float:posZ = 0.0, Float:distance = 50.0, usepos = 0){
    new stream[300] = "https://dl.dropboxusercontent.com/s/";
    strcat(stream,FileHash);
    new i = strlen(stream),x;
    stream[i++] = '/';
    for(;;++i,++x){
    switch(file[x]){
    case '\32;':stream[i] = '%',stream[++i] = '2',stream[++i] = '0';
    case EOS:break;
    default:stream[i] = file[x];
    }
    }
    return PlayAudioStreamForPlayer(playerid, stream, posX, posY, posZ, distance, usepos);
    }


    Ich hab mal einen kleinen Code geschrieben, womit das einbinden von .mp3 datein auf einem dropboxaccount vereinfacht.


    Beispiel:


    PlayerDropBoxAudioStream(0,"w3bocxbmqmph11z","Martin Garrix - Proxy (FREE DOWNLOAD).mp3");



    Dazu braucht man den hash code , wenn man ein link erstellt.


    https://www.dropbox.com/s/w3bocxbmqmph11z/Martin Garrix - Proxy (FREE DOWNLOAD).mp3

  • Hier eine Funktion um einem Spieler eine Waffe komplett oder nur teilweise abzunehmen:


    stock RemovePlayerWeapon(playerid, weaponid, ammo = 0) //©Jeffry
    {
    new w = GetPlayerWeapon(playerid), plyWeapons[13], plyAmmo[13];
    for(new slot = 0; slot <= 12; slot++)
    {
    GetPlayerWeaponData(playerid, slot, plyWeapons[slot], plyAmmo[slot]);
    if(plyWeapons[slot] == weaponid)
    {
    if(ammo == 0 || plyAmmo[slot] <= ammo)
    {
    if(w == plyWeapons[slot]) w = 0;
    plyAmmo[slot] = 0;
    plyWeapons[slot] = 0;
    }
    else
    {
    plyAmmo[slot]-=ammo;
    }
    }
    }
    ResetPlayerWeapons(playerid);
    for(new slot = 0; slot <= 12; slot++)
    {
    GivePlayerWeapon(playerid, plyWeapons[slot], plyAmmo[slot]);
    }
    SetPlayerArmedWeapon(playerid, w);
    return 1;
    }



    Benutzung:

    Spoiler anzeigen
    RemovePlayerWeapon(playerid, 24, 10); //Entfernt 10 Schuss Deagle von playerid.
    RemovePlayerWeapon(playerid, 24); //Entfernt den Deagle komplett von playerid.


    Keywords: EntferneWaffe, EntferneAmmo, SpielerWaffeWeg, EntferneSpielerWaffe, EntferneSpielerAmmo, RemovePlayerAmmo, RemoveWeaponFromPlayer, WaffeAbnehmen, RemoveWeapon.

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • Hey, ich habe hier auch mal einen interessanten Codeschnipsel :)


    Damit könnt ihr bestimmen, welchen Typ eine Variable hat:


    #define INVALID -1
    stock GetVarType({Float,_}:...) {
    if(numargs() != 1) return INVALID;
    static buffer[16],tmp[16];
    format(tmp,sizeof tmp,"%.02f",getarg(0,0));
    if(strcmp(tmp,"0.00") != 0 && strfind(tmp,".") != -1) return 1;
    for(new i; i<sizeof buffer; i++) buffer[i] = getarg(0,i);
    return (strlen(buffer) >= 2) ? 0 : 2;
    }
    #undef INVALID


    //Nutzen kann man es so:
    new x=500,buffer[32];
    switch(GetVarType(x)) {
    case 0: strcat(buffer,"String.");
    case 1: strcat(buffer,"Float.");
    case 2: strcat(buffer,"normaler Integer.");
    case -1: strcat(buffer,"Invalide Variable!");
    }
    printf("Variable x ist ein %s",buffer);
    //->Output: Variable x ist ein normaler Integer.


    mfg. :thumbup:

    ast2ufdyxkb1.png


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

  • Ich hab hier nochmal was für Euch, grade eben kurz gemacht, dachte ich gebe es weiter, vielleicht kann es ja der ein oder andere brauchen.


    stock GetWochenTag(timestamp) //©Jeffry
    {
    new day[11];
    switch((timestamp % 604800) / 86400)
    {
    case 0: day = "Donnerstag";
    case 1: day = "Freitag";
    case 2: day = "Samstag";
    case 3: day = "Sonntag";
    case 4: day = "Montag";
    case 5: day = "Dienstag";
    case 6: day = "Mittwoch";
    }
    return day;
    }


    Benutzung:

    Spoiler anzeigen
    printf("Der heutige Tag ist ein %s.", GetWochenTag(gettime()));
    printf("Gestern war %s.", GetWochenTag(gettime()-(60*60*24))); //24 Stunden mit je 60 Minuten mit je 60 Sekunden = 1 Tag.

    Spoiler anzeigen
    Gibt aus:

    Zitat
    Spoiler anzeigen

    [11/08/2014 15:02:13] Der heutige Tag ist ein Montag.
    [11/08/2014 15:02:13] Gestern war Sonntag.


    Keywords: HeutigerTag, WochenTag, WeekDay, GetToday, GetWeekDay, Welcher Tag ist heute?, Wochentag ausgeben.

  • Jeffry nix gegen deinen Codeschnipsel jedoch kommt dein Codeschnipsel nicht mit der Sommerzeit klar ^^ entweder ziehst du noch getdate dazu oder machst ein extra funktionsparameter


    kannst ja abfragen wenn sommerzeit ist die std drauf rechnen? oder abziehn ich nix wissen , und bei winterzeit die abziehen draufrechenn ?


    http://prntscr.com/4bwb5q


    ist halt jedes jahr anders


  • kannst ja abfragen wenn sommerzeit ist die std drauf rechnen? oder abziehn ich nix wissen , und bei winterzeit die abziehen draufrechenn ?


    http://prntscr.com/4bwb5q


    ist halt jedes jahr anders


    Auch der zeitlich Wechsel der Sommer und Winterzeit liegt einem Algorithmus zugrunde.




    Ein Codeschnipsel für ein Anticheat gegen Waffenhacks.



    #if !defined _ALS_
    forward public _ALS_();
    _ALS_()<_ALS_:unhooked>{}
    _ALS_()<_ALS_:hooked>{}
    _ALS_()<>{}
    #endif


    public OnPlayerUpdate(playerid) {
    static Waffen[13][2];
    for (new i=1; i != 13; ++i)
    {
    GetPlayerWeaponData(playerid, i, Waffen[i][0], Waffen[i][1]);
    if (1 <= Waffen[i][0] <= 18){
    if(!(AntiCheat[playerid][aWeapons1] & (1 << Waffen[i][0])))SendClientMessage(playerid,-1,"Du benutzt einen Waffencheat!");
    }
    else if (22 <= Waffen[i][0] <= 46){
    if(!(AntiCheat[playerid][aWeapons2] & (1 << (Waffen[i][0]-22))))SendClientMessage(playerid,-1,"Du benutzt einen Waffencheat!");
    }
    }
    return PH_OnPlayerUpdate(playerid);
    }
    forward PH_OnPlayerUpdate(playerid);
    #if defined _ALS_OnPlayerUpdate
    #undef OnPlayerUpdate
    #else
    #define _ALS_OnPlayerUpdate
    #endif
    public PH_OnPlayerUpdate(playerid)<_ALS_:unhooked> return 1;
    public PH_OnPlayerUpdate(playerid) <> return 1;
    #define OnPlayerUpdate(%0) PH_OnPlayerUpdate(%0)<_ALS_:hooked>

    native __GivePlayerWeapon(playerid, weaponid, ammo) = GivePlayerWeapon;
    stock _GivePlayerWeapon(playerid, weaponid, ammo) {
    if (0 <= weaponid <= 18 || 22 <= weaponid <= 46){
    if (0 <= weaponid <= 18)AntiCheat[playerid][aWeapons1] |= (1 << weaponid);
    else if (22 <= weaponid <= 46)AntiCheat[playerid][aWeapons2] |= (1 << (weaponid-22));
    }
    return __GivePlayerWeapon(playerid, weaponid, ammo);
    }
    #if defined _ALS_GivePlayerWeapon
    #undef GivePlayerWeapon
    #else
    #define _ALS_GivePlayerWeapon
    #endif
    #define GivePlayerWeapon _GivePlayerWeapon


    enum aData {
    aWeapons1,
    aWeapons2,
    };


    new AntiCheat[MAX_PLAYERS][aData];

  • Jeffry nix gegen deinen Codeschnipsel jedoch kommt dein Codeschnipsel nicht mit der Sommerzeit klar ^^ entweder ziehst du noch getdate dazu oder machst ein extra funktionsparameter


    Soll er auch gar nicht. Er ist auf GMT+0 programmiert, und die kennt bekanntlich keine Sommerzeit.
    gettime() gibt dir den Timestamp ja auch in GMT+0 zurück. (http://www.unixtimestamp.com/index.php)


    Die Zeitverschiebung kannst du einfach mit (3600*GMT_OFFSET) dazurechnen (wie NicoWiss schon sagte), bzw. musst du sogar. Das beinhaltet auch die Sommer- und Winterzeit. Da es nicht in jedem Land die Sommer- und Winterzeit gibt, kann man das auch nicht berücksichtigen. Für meinen Server zum Beispiel läuft alles auf GMT+0, da er international ist. Hier müssen die Spieler selbst die Uhr vorstellen, da es ja nicht in jedem Land bzw. in jeder Zeitzone die Umstellung gibt. Ein Code der sich automatisch umstellt wäre hier fehl am Platz, da dann alle die den Code ändern müssten, bei denen es keine Umstellung gibt. Insofern ist das genau so gewollt.


  • Dazu hät ich nocheinmal eine Frage,


    OnPlayerUpdate ist ja sehr recourcenaufwendig kann man das auch in einen sagen wir mal Sekunden Timer legen?


    OnPlayerUpdate wie Raven^ bereits geschrieben hat kommt es letztendlich auf den Code an, OnPlayerUpdate wird ebenfalls nicht in der selben Zeit aufgerufen
    wie es bei einem Timer der Fall ist, sondern nur wenn es etwas zu Synchronisieren gibt zwischen Client und dem Server.
    So kommt es das OnPlayerUpdate sollte der Spieler auf dem Desktop ist nicht aufgerufen wird, falls sich der Spieler recht langsam oder garnicht bewegt reduziert sich auch der Aufruf von OnPlayerUpdate, besser gesagt OnPlayerUpdate wird nicht so oft aufgerufen.


    Jeffry
    Nun gut es war lediglich ein Hinweis, da ich selbst mal solch eine Funktion geschrieben habe, die läuft jedoch über getdate und getdate richtet sich nach der Serverzeit,
    also auf das Datum , welches eingestellt wurde auf dem Server



    stock const WeekDays[7][11] = {
    "Sonntag",
    "Monntag",
    "Dienstag",
    "Mittwoch",
    "Donnerstag",
    "Freitag",
    "Samstag"
    };


    #define DATE_W(%0,%1,%2) WeekDays[(( %0 + _:DATE_Y(%1,%2) + _:DATE_Y(%1,%2)/4 - _:DATE_Y(%1,%2)/100 + _:DATE_Y(%1,%2)/400 + (31 * _:DATE_M(%1))/12 )% 7)]
    #define DATE_M(%0) (%0 + 12 * _:DATE_A(%0) - 2)
    #define DATE_Y(%0,%1) (%1 - _:DATE_A(%0))
    #define DATE_A(%0) ((14 - %0) / 12)

  • Nun gut es war lediglich ein Hinweis, da ich selbst mal solch eine Funktion geschrieben habe, die läuft jedoch über getdate


    Klar, es kommt ja immer auf die Anwendung drauf an. In meinem Fall ist die Anwendung auf internationale Möglichkeiten bestimmt, in deinem Beispiel wird nur die Zeit des Servers akzeptiert, du kannst es nicht manipulieren, zum Beispiel eine Stunde drauf rechnen, weil ich mich als Spieler gerade in Griechenland befinde, bzw. eine Stunde abziehen weil ich grade in England rumsitze.


    Übrigens funktioniert dein Anti-Cheat nicht, wenn du dem Spieler Waffen über AddPlayerClass gibst, wenn er/sie sich Waffen im Ammu-Nation kauft oder wenn er/sie die Waffen über statische Pickups aufnimmt, dafür müssten noch Ausnahmen bzw. Erkennungen eingebaut werden. :thumbup:

  • Übrigens funktioniert dein Anti-Cheat nicht, wenn du dem Spieler Waffen über AddPlayerClass gibst, wenn er/sie sich Waffen im Ammu-Nation kauft oder wenn er/sie die Waffen über statische Pickups aufnimmt.


    :P deshalb ist es auch ein Codeschnipsel , also ein Schnipsel von einem ganzen Code, das wird man ja wohl noch selbst ergänzen können ^^.

  • Schnelle Methode, um Adminränge o. Ä zu erstellen und zu ändern, ohne 1000x den einzelnen Rang suchen & ändern zu müssen.


    static const names[][] = {
    "User","Supporter","Admin","Projektleiter","Scripter"
    };


    printf("%s",names[data[playerid][adminrang]]);


    Wurde bestimmt schon 1000x gepostet, aber egal^^



    Hier noch ein anderer Code
    stock SetTimeForVar(&var, addSeconds) //Speichert die aktuelle Zeit + addSeconds in 'var'
    {
    var = gettime() + addSeconds; // var = aktuelle Zeit in Sekunden + x Sekunden
    return 1;
    }


    stock GetRestTimerForVar(var) // gibt die restzeit in Sekunden an bis die gespeicherte Zeit in 'var' erreicht wurde
    {
    if(var <= gettime()) return 0; // zeit vorbei
    return var - gettime(); //restliche zeit


    //Usage


    new timer;
    SetTimeForVar(timer, 317); // 317 = 5 Minuten 17 Sekunden


    // an einem anderen Zeitpunkt,
    if(GetRestTimerForVar(timer) == 0) print("Die Zeit ist Abgelaufen!");
    else printf("Es sind noch %d Sekunden bis die Zeit erreicht wurde", GetRestTimerForVar(timer));
    }


    Code ist nicht von mir, müsste - glaube ich - von d0ma: sein. ( Ich hoffe du hast nichts dagegen, dass ich den Code poste)

  • stock DezimalToBinary(number,str[],len)
    {
    new bool:check=false;
    while(!check)
    {
    new num=number%2;
    format(str,len,"%d%s",num,str);
    number=number/2;
    if(number==0)
    {
    check=true;
    }
    }
    while(strlen(str)+1<len)
    {
    format(str,len,"0%s",str);
    }
    return strval(str);
    }


    stock BinaryToDezimal(str[])
    {
    new count;


    new i=strlen(str)-1;
    new num=1;
    for(;i>=0;i--)
    {
    if(str[i]=='1')
    {
    count+=num;
    }
    num=num*2;
    }


    return count;
    }


    Habe ich anfangs geschrieben, damit ich genau heraufinden konnte welcher Reifen kaputt ist oder welche Tür etc.


    Mittlerweile habe ich aufbauend darauf ein Premission System geschrieben und benutze es immer wieder um mehrere Dinge in eine einzelne Variable zu speichern.

  • Schnelle Methode, um Adminränge o. Ä zu erstellen und zu ändern, ohne 1000x den einzelnen Rang suchen &


    Code ist nicht von mir, müsste - glaube ich - von d0ma: sein. ( Ich hoffe du hast nichts dagegen, dass ich den Code poste)


    Code ist nicht von mir, müsste - glaube ich - von d0ma: sein. ( Ich hoffe du hast nichts dagegen, dass ich den Code poste)


    Was spricht hier noch dagegen hier noch ein define zu erstellen :D


    names[data[playerid][adminrang]]



    #define GetAdminRang(%0) names[data[%0][adminrang]]


    [pwnGetRestTimerForVar(var)[/pwn] und die nadere Funktion


    kann man auch in ein define umändern



    #define SetTimeForVar(%0,%1) %0 = gettime() + %1
    #define GetRestTimerForVar(%0) ((%0 <= gettime())?(0):(%0 - gettime()))


    @ Sniper:


    #define DezimalToBinary(%0,%1) format(%1,sizeof(%1),"%b",%0)


    nutz doch einfach den Plathalter %b

  • muss man hier nicht noch %1 returnen oder fällt das durchs define weg?


    Dann würdest du ja mitten in einem Codeblock returnen quasi so:


    code
    code
    define // define = return 1;
    code
    ->
    code
    code
    code
    return 1;
    code


    //EDIT
    Besser erklärt:
    #define TEST 50
    Funktion(TEST); // Der Compiler liest direkt Funktion(50);
    //Hat zur Folge:
    #define DezimalToBinary(%0,%1) format(%1,sizeof(%1),"%b",%0) return 1;
    DezimalToBinary(dezimal, string); //Liest der Compiler so:
    format(string, sizeof(string), "%b", dezimal); return 1;
    Wenn da jetzt noch Code hinter ist, kommts blöd ;)
    (Cant reach code)