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 mir gedacht da ich schonmal geguckt habe ob es eine Andere art gibt für MAX_PLAYERS nur bis dort hin zu zählen bis zur Letzten ID. hier die Lösung.


    Einfach einen Sekunden timer machen z.B. "Sekundentimer" und eine Server Variable names "Max_Online"


    dann kommt bei dem Sekundetimer das hier rein.



    Max_Online = 0;
    for(new i = 0; i <MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    Max_Online += 1;
    }
    }


    nun Könnte eine MAX_PLAYERS Abfrage so ausschauen

    for(new i = 0; i < Max_Online; i++)
    {
    SendClientMessage(i, ....);
    }


    Hoffe es gefällt euch. eine einfache Lösung.

  • Es ist eine sau schlechte Lösung. Entweder foreach (siehe englisches Forum => Plugin Developement).
    Eine Alternative für MAX_PLAYERS ist GetMaxPlayers();
    Oder ganz einfach:

    #undefine MAX_PLAYERS
    #define MAX_PLAYERS 15

    Aber nur dann, wenn man nicht immer die a_samp.inc ändern will.

  • stock RemovePlayerWeapon(playerid, weaponid)
    {
    SetPlayerAmmo(playerid, weaponid, 0);
    return 1;
    }
    Klein aber fein :D

    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|

  • #if !defined SPRINTF_BUFFER_LINES
    #define SPRINTF_BUFFER_LINES (8)
    #endif


    #if !defined SPRINTF_BUFFER_SIZE
    #define SPRINTF_BUFFER_SIZE (1024)
    #endif


    new stock
    sprintf_buf[SPRINTF_BUFFER_LINES][SPRINTF_BUFFER_SIZE],
    sprintf_bufidx; // Ohne diesen Index, kann man sprintf jeweils nur einmal als Argument einer Funktion verwenden.

    #define sprintf(%0) \
    (sprintf_bufidx = (sprintf_bufidx + 1) % sizeof sprintf_buf, format(sprintf_buf[sprintf_bufidx], sizeof sprintf_buf[], %0), sprintf_buf[sprintf_bufidx])


    Diese Funktion ist unglaublich nützlich!
    Nie mehr unzählige nervige Lines mit new string[...]; format(...) und all dem schreiben!


    Einfach wie folgt anwenden:

    SendClientMessage(playerid, COLOR_RED, sprintf("Hallo %s, deine ID ist %d!", PlayerName[playerid], playerid));

  • Hier mal ein kleines Hotdog Job System:
    #define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1



    public OnPlayerCommandText(playerid, cmdtext[])
    {
    dcmd(sellhotdog,15,cmdtext);
    dcmd(Hotdog,6,cmdtext);
    dcmd(HotDogSeller,12,cmdtext);
    return 0;
    }


    dcmd_sellhotdog(playerid,params[])
    {
    new ID, Preis, Float:iX,Float:iY,Float:iZ, string[256],string2[256], pName[MAX_PLAYER_NAME],iName[MAX_PLAYER_NAME];
    if(sscanf(params,"d",ID, Preis)) return SendClientMessage(playerid,0xFF000000,"Syntax: /SellHotDog [ID] [Preis]");
    if(GetPVarInt(playerid,"HotDogSeller") == 0) return SendClientMessage(playerid,0xFF000000,"Du bist kein Hot Dog Verkäufer, nutze dazu /HotDogSeller!");
    if(ID == playerid) return SendClientMessage(playerid,0xFF000000,"Du kannst dir selber kein Hotdog verkaufen!");
    if(!IsPlayerConnected(ID)) return SendClientMessage(playerid,0xFF000000,"Der Spieler ist nicht Online!");
    GetPlayerPos(ID,iX,iY,iZ);
    if(!IsPlayerInRangeOfPoint(playerid, 5.0, iX, iY, iZ)) return SendClientMessage(playerid,0xFF000000,"Du bist nicht in der nähe eines Spielers!");
    SetPVarInt(playerid, "HotDogPlayer", ID);
    SetPVarInt(ID, "HotDogPlayer", playerid);
    SetPVarInt(ID, "HotDogKosten", Preis);
    GetPlayerName(playerid, pName, sizeof(pName));
    GetPlayerName(ID, iName, sizeof(iName));
    format(string, sizeof(string),"Du hast %s angeboten ein Hotdog von dir zu kaufen für %d $.",iName, Preis);
    format(string2, sizeof(string2),"%s hat dir angeboten ein Hotdog von ihm für %d $ zu kaufen.",pName, Preis);
    SendClientMessage(playerid,0xFF000000,string);
    SendClientMessage(ID,0xFF000000,string2);
    SendClientMessage(ID,0xFFFFFFFF,"Du kannst das Angebot via /Hotdog annehmen.");
    return 1;
    }


    dcmd_Hotdog(playerid,params[])
    {
    #pragma unused params
    new Float:X,Float:Y,Float:Z, pName[MAX_PLAYER_NAME],iName[MAX_PLAYER_NAME], string[256],string2[256];
    GetPlayerPos(GetPVarInt(playerid,"HotDogPlayer"),X,Y,Z);
    if(GetPVarInt(playerid,"HotDogPlayer") == -1) return SendClientMessage(playerid,0xFF000000,"Dir hat keiner einen Hotdog angeboten!");
    if(!IsPlayerInRangeOfPoint(playerid,5.0,X,Y,Z)) return SendClientMessage(playerid,0xFF000000,"Du bist nicht in der nähe deines Hotdogs Verkäufer!");
    if(GetPlayerMoney(playerid) < GetPVarInt(playerid,"HotDogKosten")) return SendClientMessage(playerid,0xFF000000,"Du hast nicht genug Geld!");
    SetPlayerHealth(playerid,100);
    GetPlayerName(GetPVarInt(playerid,"HotDogPlayer"),iName, sizeof(iName));
    GetPlayerName(playerid, pName, sizeof(pName));
    format(string, sizeof(string),"Der Spieler %s hat einen Hotdog von dir für %d $ gekauft.",pName, GetPVarInt(playerid,"HotDogKosten"));
    format(string2, sizeof(string2),"Du hast von %s einen Hotdog für %d $ gekauft.",iName, GetPVarInt(playerid,"HotDogKosten"));
    SendClientMessage(GetPVarInt(playerid,"HotDogPlayer"),0xFFFFFFFF,string);
    SendClientMessage(playerid,0xFFFFFFFF,string2);
    GivePlayerMoney(playerid,-GetPVarInt(playerid,"HotDogKosten"));
    GivePlayerMoney(GetPVarInt(playerid,"HotDogPlayer"),(GetPlayerMoney(GetPVarInt(playerid,"HotDogPlayer")) +GetPVarInt(playerid,"HotDogKosten")));
    SetPVarInt(GetPVarInt(playerid,"HotDogPlayer"),"HotDogPlayer",-1);
    SetPVarInt(playerid,"HotDogKosten",0);
    SetPVarInt(playerid,"HotDogPlayer",-1);
    return 1;
    }


    dcmd_HotDogSeller(playerid,params[])
    {
    #pragma unused params
    if(GetPVarInt(playerid,"HotDogSeller") == 1)
    {
    SetPVarInt(playerid,"HotDogSeller",0);
    SendClientMessage(playerid,0xFF000000,"Du bist nun kein Hotdog Verkäufer mehr!");
    }
    else
    {
    SetPVarInt(playerid,"HotDogSeller",1);
    SendClientMessage(playerid,0xFF000000,"Du bist nun ein Hotdog Verkäufer!");
    }
    return 1;
    }

  • Ist Schwachsinn und funktioniert nicht.

  • GetPointer gibt die Addresse der Variable, welche als Argument übergeben wurde zurück.
    SetData schreibt value in die Addresse, welche im Pointer gespeichert ist.
    GetData liest den Wert aus Addresse, welche im Pointer gespeichert ist.


    stock Pointer:GetPointer(...)
    {
    #emit LOAD.S.pri 0x0C
    #emit RETN

    return Pointer:0;
    }


    stock SetData(Pointer:ptr, value, idx = 0)
    {
    #emit LOAD.S.pri idx // PRI = idx
    #emit SMUL.C 0x04 // PRI = 4 * idx
    #emit LOAD.S.alt ptr // ALT = ptr
    #emit ADD // PRI = ptr + 4 * idx
    #emit LOAD.S.alt value // ALT = value
    #emit XCHG // ALT = ptr + 4 * idx, PRI = value
    #emit STOR.I // [ptr + 4 * idx] = value ([ALT] = PRI)
    }


    stock GetData(Pointer:ptr, idx = 0)
    {
    #emit LOAD.S.pri idx // PRI = idx
    #emit SMUL.C 0x04 // PRI = 4 * idx
    #emit LOAD.S.alt ptr // ALT = ptr
    #emit ADD // PRI = ptr + 4 * idx
    #emit LOAD.I // PRI = [PRI] = [ptr + 4 * idx]
    #emit RETN

    return 0;
    }

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Pointer sind dazu da Adressen im Speicher zu markieren dies ermöglicht schnell Zugriffe auf Informationen,
    selbst das verändern der Daten erfolgt schneller und unkomplizierter.


    Kurze Erklärung :


    Unser Speicher wie wir ihn kennen hat hat ein jeder Stelle eine Minimale Größe ( 1 Byte ) jeder dieser Plätze hat eine Bezeichnung sprich ist Nummeriert,
    diese Datensätze wandern Teilweise immer hin und her im Speicher also nehmen immer eine andere Position im Speicher an je nach Veränderung.


    Pointer
    Man kann sie wie Verknüpfungen sehen anders als normale Zuweisungen von Werten zu Variablen wie z.b. das normale setzen var1 = var2 wird beim Pointer setzen
    nicht der Inhalt kopiert von einer Variable zur anderen sondern der Inhalt wird verknüpft sprich enthält var1 = 12 und wir setzen einen pointer mit var2 so wird
    in var2 die Nummer des Slots gespeichert wo der Inhalt von var1 ist sprich wir können var2 genauso verwenden wie wir var1 verwendet hätten
    da var2 Praktisch genau wie var1 ist aber eben nur eine indirekte Verknüpfung darstellt.


    Sprich ein Pointer übernimmt die Adresse der Variable so zu sagen ihren Standard , so kann man dieser Pointer auch geändert werden und Daten können an dieser Adresse verändert werden.


    Das ganze ist Prinzipell dazu da Ressourcen schonender zu arbeiten sprich direkt anzusetzen ohne jedes mal neu zu definieren und zu kopieren und so eine Verknüpfung im Speicher macht gar nichts aus

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • Wer gerne mit PVars arbeitet:


    Es gibt Integer, Float & String. Jedoch keine Booleans. Habe mal 2 kleine funktionen gemacht:


    SetPVarBool(playerid, vName, Wert); // Wert ist true oder false
    GetPVarBool(playerid, vName); //gibt den Wert wieder, auch hier: true oder false.


    stock SetPVarBool(playerid, vName[], bool:value)
    {
    SetPVarInt(playerid,vName,((value) ? 1 : 0));
    return 1;
    }


    stock GetPVarBool(playerid, vName[])
    {
    return ((GetPVarInt(playerid,vName) == 1) ? true : false);
    }


    //edit: DeltePVarBool ist sinnlos und falsch, habe es verbessert

    Einmal editiert, zuletzt von Simon ()

  • stock GetPVarBool(playerid, vName[]) { return ((GetPVarInt(playerid,vName) == 1) ? true : false); }


    Bist du irgendwie komplett stoned?
    1. Wird 0 zurück gegeben wenn die Var ungleich 1 ist d.h. auch wenn die PVar 2 oder 4 enthält.
    2. Verbraucht der Mist genauso viel CPU wie eine normale PVar.
    3. SetPVarInt(playerid,"PVAR",true); bewirkt exakt das gleiche, wie dein SetPVarBool

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

    Margarete Stokowski

  • zu 1. wenns 1 ist = true, wenn nicht = false. in der Regel sollte es keinen anderen Wert außer 0 und 1 geben.
    zu 2. ist für die, die nicht ständig "new bool:varname;" schreiben wollen und ganz einfach mit PVarBool ihre Booleans auflisten.


    Bringen tuts nicht viel, macht es einigen nur eventuell etwas leichter und übersichtlicher.


    zu 3. wusste nicht das man bei PVarInts auch werte wie true oder false nehmen kann. Das würde meine Funktionen dann natürlich sinnlos machen.


    //edit: und zum stoned: Bin Krank, liegt wohl daran ;)

  • Ich hab da mal wieder was zufälligerweise ausgegraben.. ;)


    /*
    * Library: Files
    *
    * Note: It only supports 32bit cells
    */


    #define file:: ns_files_


    #define MAX_FILES 16


    enum file::return
    {
    file::yes,
    file::yes_end,
    file::no_handle,
    file::no_free_handle
    };


    new File:file::fhandles[MAX_FILES];
    new bool:file::fhandles_used[MAX_FILES];


    /*
    * in: filename, mode
    * out:
    * -1 no free handle
    * -2 file doesn't exist
    * ~~ id
    */
    stock file::new(const fname[], filemode:mode = io_readwrite)
    {
    new free = file::getFree();
    if(free == -1)
    return -1;

    if(mode == io_read && !fexist(fname))
    return -2;


    file::fhandles[free] = fopen(fname, mode);
    file::fhandles_used[free] = bool:true;

    return free;
    }


    static file::getFree()
    {
    for(new i = 0; i < MAX_FILES; i++)
    {
    if(!file::fhandles_used[i])
    return i;
    }
    return -1;
    }


    /*
    * in: id, data, read cells [, size of data]
    * out:
    * file::yes everything is okay
    * file::yes_end end of file
    */
    stock file::return:file::read(id, data[], &readsize, size = sizeof data)
    {
    if(id >= MAX_FILES)
    return file::no_handle;
    if(!file::fhandles_used[id])
    return file::no_handle;


    readsize = fblockread(file::fhandles[id], data, size);

    if(!readsize)
    return file::yes_end;


    return file::yes;
    }


    /*
    * in: id, data, written cells [, size of data]
    * out:
    * file::yes everything is okay
    */
    stock file::return:file::write(id, data[], &writtensize, size = sizeof data)
    {
    if(id >= MAX_FILES)
    return file::no_handle;
    if(!file::fhandles_used[id])
    return file::no_handle;


    writtensize = fblockwrite(file::fhandles[id], data, size);


    return file::yes;
    }


    /*
    * in: id
    * out:
    * file::yes everything is okay
    * file::no_handle no handle
    */
    stock file::return:file::delete(id)
    {
    if(id >= MAX_FILES)
    return file::no_handle;
    if(!file::fhandles_used[id])
    return file::no_handle;

    fclose(file::fhandles[id]);
    file::fhandles_used[id] = bool:false;

    return file::yes;
    }

  • Ich weis nicht ob das nützlich ist^^:


    Stock ganz unten einfügen (nicht in ein Public!):
    stock SetPlusInt(playerid,variable[],wert)
    {
    return SetPVarInt(playerid,variable,GetPVarInt(playerid,variable)+wert);
    }


    Verwendung: SetPlusInt(playerid,"Geld",1); // Wert Geld wird um 1 erhöht!

  • Ich habe einige Funktionen gesehen, die mehrere Waffen gelöscht haben, aber keine wirkliche, welche eine bestimmte Waffe löscht.
    Habe nun mal eine geschrieben.


    stock DeletePlayerWeapon(playerid, dWeaponid)
    {
    new ndWeapons[13], ndAmmo[13], aWeapon = GetPlayerWeapon(playerid);
    for(new i = 0; i < 13; i++) GetPlayerWeaponData(playerid,i,ndWeapons[i],ndAmmo[i]);
    ResetPlayerWeapons(playerid);
    for(new i = 0; i < 13; i++)
    {
    if(ndWeapons[i] == dWeaponid) continue;
    GivePlayerWeapon(playerid,ndWeapons[i],ndAmmo[i]);
    }
    SetPlayerArmedWeapon(playerid,aWeapon);
    return 1;
    }

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