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
  • geschrieben werden.

    Ach was..mir schon klar..mir auch klar, dass das keinen Performanz unterschied macht.. Ich redete von der Schnelligkeit des Code schreibens...dass das kaum Unterschied macht...


    und wie gesagt, dass das Einsetzen davon eig kaum sinn macht..

    ast2ufdyxkb1.png


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

  • Wie gesagt.


    Und damit wieder zurück zum Thema.


    stock IsPlayerSkydiving(playerid)
    {
    switch(GetPlayerAnimationIndex(playerid))
    {
    case 958..979,1134: return true;
    }
    return false;
    }
    Mit dieser Funktion kann überprüft werden, ob ein Spieler gerade mit einem Fallschirm in der Luft fliegt.

  • Hier kleines Schnippselchen
    Bietet die Moeglichkeit gewuensche Sound IDs mit /sound [soundid] einzugeben
    Setzt gl_common.inc vorraus und ein beliebiges Array mit SoundIDs, dieses einfach ValidSounds nennen.


    Ich habe Tomo and Garsino Array aus dem SAMP Wiki genutzt.
    Funktionsweise:
    Der String wird aufgesplittet, und der Teil mit der SoundID in einen Wert umgewandelt (strval).
    targetsoundid ist gleich der Wert den die Funktion strval(tmp) ausgibt, also die SoundID
    Es wird mit einer Schleife ueberprueft ob die gewuensche SoundID in dem Array vorhanden ist, wenn nicht wird mit der Fehlermeldung bei else abgebrochen, wenn die ID "valid" ist wird der Ton abgespielt.
    Simpel aber laeuft


  • Simpel aber laeuft

    Nein, das wird nicht funktionieren.
    Grund ist, dass, wenn die erste ID im ValidSounds-Array nicht der targetsoundid entspricht, die Schleife mit der Fehlermeldung abgebrochen wird, da da else in der Schleife ist.


    Außerdem ist targetsoundid in dem Code nicht deklariert, das wird zu einem Fehler führen.


    Korrekt wäre es so:
    if(strcmp(cmd, "/sound", true) == 0)
    {
    new tmp[20], targetsoundid;
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp)) return SendClientMessage(playerid, 0xFF0000FF, "USAGE: /sound [soundid]");
    targetsoundid = strval(tmp);
    for(new i=0; i < sizeof(ValidSounds); i++)
    {
    if(targetsoundid == ValidSounds[i])
    {
    PlayerPlaySound(playerid, targetsoundid, 0,0,0);
    //printf("Playing SoundID: %i",targetsoundid);
    return 1;
    }
    }
    SendClientMessage(playerid, 0xFF0000FF, "Invalid SoundID!");
    //printf("Tried to playback invalid SoundID: %i",targetsoundid);
    return 1;
    }


    Zusätzlich wird vor diesem Code (meist ist das direkt unter OnPlayerCommandText zu finden) folgendes benötigt:
    new cmd[20], idx;
    cmd = strtok(cmdtext, idx);


    Anbei das Array mit den Sound IDs: http://pastebin.com/sA5DNFaw (von: https://wiki.sa-mp.com/wiki/SoundID)



    Zusätzlich ist anzumerken, dass für diesen Code die strtok Funktion vorausgesetzt wird (daher die gl_common.inc). Die gl_common.inc nutzt allerdings eine veraltete strtok Funktion.
    Meine strtok 2.0 Funktion findet sich hier:
    http://wiki.sa-mp.com/wiki/Code_Snippets#Strtok

  • Hier ne kleine Funktion fuer random Floats


    Einfach wie random(); benutzen nur mit f am Anfang :D


    C
    stock Float:frandom(Float:max, Float:min = 0.0, dp = 4)
    {
    	new
    Float:mul = floatpower(10.0, dp),
    	imin = floatround(min * mul),
    	imax = floatround(max * mul);
    	return float(random(imax - imin) + imin) / mul;
    }
  • Habe mir mal ne Funktion erstellt um in einer Zone mit y_max, y_min, x_max, x_min, bspw. einer Gangzone, random Pickups erstellen zu lassen.


    Weiterhin braucht ih dazu meine frandom Funktion oben fuer random Floats.


    Weiterhin erstellt ihr am Kopf des Scripts eine Variable maxmoney, damit ihr das Pickuplimit von 4096 nicht ueberschreitet!

  • Ne Funktion um formatierte Nachrichten direkt mit SendClientMessageEx ausgeben zu koennen statt immer format zu nutzen


  • Ne Funktion um formatierte Nachrichten direkt mit SendClientMessageEx ausgeben zu koennen statt immer format zu nutzen

    Du solltest Quellen angeben, wenn du Funktionen postest, die von anderen entwickelt worden sind und nicht unbedingt trivial sind.


    Übrigens geht es viel einfacher:
    stock _g_str[145];
    #define SendClientMessageEx(%0,%1,%2,%3); \
    format(_g_str, sizeof(_g_str), %2, %3); \
    SendClientMessage(%0, %1, _g_str);


    Zu nutzen:
    SendClientMessageEx(playerid, 0xFF0000FF, "Hallo %s, du hast die ID %d!", pName(playerid), playerid);




    Keywords: SendClientMessageEx, SendClientMessageFormatted, SendFormattedClientMessage.

  • Auf Nachfrage von @Muho55 poste ich hier den Code zum Geld-System mit Cent-Beträgen.


    Es ist zwar etwas mehr als nur ein Schnipsel, aber für einen separaten Release ist mir das dann doch zu wenig.
    Für ein Tutorial lohnt sich das auch nicht wirklich, da der Code, bis auf die Berechnung, selbsterklärend ist.


    Anbei der Code:
    new PlayerText:pMoneyText[MAX_PLAYERS];
    new pMoney[MAX_PLAYERS];


    public OnPlayerConnect(playerid)
    {
    pMoneyText[playerid] = CreatePlayerTextDraw(playerid, 496.0000, 79.0000, "$0,00");
    PlayerTextDrawColor(playerid, pMoneyText[playerid], 0x27941EFF);
    PlayerTextDrawLetterSize(playerid, pMoneyText[playerid], 0.4000, 2.0000);
    PlayerTextDrawUseBox(playerid, pMoneyText[playerid], 1);
    PlayerTextDrawBoxColor(playerid, pMoneyText[playerid], 0x000000FF);
    PlayerTextDrawAlignment(playerid, pMoneyText[playerid], 1);
    PlayerTextDrawTextSize(playerid, pMoneyText[playerid], 610.0000, 10.0000);
    PlayerTextDrawSetShadow(playerid, pMoneyText[playerid], 0);

    pMoney[playerid] = 0; //Entsprechend beim Laden des Spielers mit Wert befüllen.
    return 1;
    }


    public OnPlayerSpawn(playerid)
    {
    PlayerTextDrawShow(playerid, pMoneyText[playerid]);
    return 1;
    }


    public OnPlayerDisconnect(playerid, reason)
    {
    PlayerTextDrawDestroy(playerid, pMoneyText[playerid]);
    return 1;
    }


    stock GivePlayerMoneyEx(playerid, money)
    {
    if(!IsPlayerConnected(playerid)) return 0;
    pMoney[playerid] += money;
    new str[16];
    if(pMoney[playerid] >= 0)
    {
    format(str, sizeof(str), "$%d,%02d", pMoney[playerid]/100, pMoney[playerid]%100);
    for(new i = strlen(str)-6; i > 1; i-=3) strins(str, ".", i);
    PlayerTextDrawColor(playerid, pMoneyText[playerid], 0x27941EFF);
    }
    else
    {
    format(str, sizeof(str), "$%d,%02d", (pMoney[playerid]/100)+1, ((pMoney[playerid]%100)-100)*-1);
    for(new i = strlen(str)-6; i > 2; i-=3) strins(str, ".", i);
    PlayerTextDrawColor(playerid, pMoneyText[playerid], 0xFF0000FF);
    }
    PlayerTextDrawSetString(playerid, pMoneyText[playerid], str);
    PlayerTextDrawShow(playerid, pMoneyText[playerid]);
    return 1;
    }


    stock ResetPlayerMoneyEx(playerid)
    {
    if(!IsPlayerConnected(playerid)) return 0;
    GivePlayerMoneyEx(playerid, -pMoney[playerid]);
    return 1;
    }


    stock SetPlayerMoneyEx(playerid, money)
    {
    if(!IsPlayerConnected(playerid)) return 0;
    ResetPlayerMoneyEx(playerid);
    GivePlayerMoneyEx(playerid, money);
    return 1;
    }


    stock GetPlayerMoneyEx(playerid)
    {
    if(!IsPlayerConnected(playerid)) return 0;
    return pMoney[playerid];
    }


    stock GetPlayerMoneyEx_Str(playerid)
    {
    if(!IsPlayerConnected(playerid)) return 0;
    new str[16];
    if(pMoney[playerid] >= 0)
    {
    format(str, sizeof(str), "$%d,%02d", pMoney[playerid]/100, pMoney[playerid]%100);
    for(new i = strlen(str)-6; i > 1; i-=3) strins(str, ".", i);
    }
    else
    {
    format(str, sizeof(str), "$%d,%02d", (pMoney[playerid]/100)+1, ((pMoney[playerid]%100)-100)*-1);
    for(new i = strlen(str)-6; i > 2; i-=3) strins(str, ".", i);
    }
    return str;
    }


    Außerdem hatte Muho55 gewünscht, die Sprunk-Maschinen (etc) abzufangen.
    Hierzu kann diese Include verwendet werden: http://forum.sa-mp.com/showthread.php?t=367838


    Eine Einschränkung ergibt sich auf Grund des 32-Bit Limits in SA:MP.
    Der maximale Geld-Betrag liegt bei +/-21.474.836,47. (https://de.wikipedia.org/wiki/2147483647)


    Solange man nicht mit Millionenbeträgen jongliert, sollte das aber ausreichend sein.


    Anbei noch Beispielbilder:




    Das TextDraw-Design kann natürlich angepasst werden, ich habe nur beispielhaft ein simples Design genommen.



    Für Nachfragen zum Code bitte die Scripting Base nutzen: Scripting Base


  • Gerne würde ich nicht das Alter ausgeben lassen sondern viel mehr das Geburtsdatum. Wie mache ich das am besten mit der Speicherung des Geburtsdatums ?

  • Gerne würde ich nicht das Alter ausgeben lassen sondern viel mehr das Geburtsdatum. Wie mache ich das am besten mit der Speicherung des Geburtsdatums ?

    Du speicherst das einfach als String (bzw varchar in mysql).


    Wenn er das eingibt, steht das ja einfach im inputtext.


    Musst halt nur prüfen ob es 3 Punkte hat zur Abgrenzung und vorne jeweils 2 Zeichen, in der Mitte 2 und hinten 4.
    Und dann halt schauen, dass die Zahlen halt in einem gültigen Bereich liegen..& fertig ^^

    ast2ufdyxkb1.png


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

  • Musst halt nur prüfen ob es 3 Punkte hat zur Abgrenzung und vorne jeweils 2 Zeichen, in der Mitte 2 und hinten 4.
    Und dann halt schauen, dass die Zahlen halt in einem gültigen Bereich liegen..& fertig

    Es reicht zu prüfen, ob GetPlayerAge -1 zurück gibt.
    new age = GetPlayerAge(inputtext);
    if(age == -1) //Datum erneut eingeben lassen
    else //Datum speichern



    Gerne würde ich nicht das Alter ausgeben lassen sondern viel mehr das Geburtsdatum. Wie mache ich das am besten mit der Speicherung des Geburtsdatums ?

    Zum Datum speichern (else Teil im Code oben):
    format(SpielerInfo[playerid][pGeburtstag], 11, inputtext);


    Im enum:
    pGeburtstag[11],


    Bitte nutze für weitere Fragen die Scripting Base, dieser Thread ist nur zur Sammlung von nützlichen Funktionen.

  • Funktion zum encoding von OE, AE, UE etc. ...
    stock Encoding_Textdraw(string[]){new original[50] = {192,193,194,196,198,199,200,201,202,203,204,205,206,207,210,211,212,214,217,218,219,220,223,224,225,226,228,230,231,232,233,234,235,236,237,238,239,242,243,244,246,249,250,251,252,209,241,191,161,176};new fixed[50] = {128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,94,124};new len = strlen(string);for (new i; i < len; i++){for(new j;j < 50;j++){if(string[i] == original[j]){string[i] = fixed[j];break;}}}}


    Pastebin:
    https://pastebin.com/qFfXQupi

  • Bin mir nicht sicher, ob das für andere auch einen Nutzen haben wird, aber ab und zu vergesse ich hinterm Komma ein Leerzeichen beim Scripten (sieht optisch besser aus und besserer Überblick).
    Habe mir dafür eben ein Script geschrieben, um die Leerzeilen automatisch einfügen zu lassen.


    Achtung: Solltet ihr OCMD oder andere Command-Scripte verwenden, müsst ihr das Leerzeichen dort manuell entfernen, weil der Compiler sonst crasht. Hierbei empfehle ich dringend ein Backup, wobei die Datei, welche für die Bearbeitung genutzt wird, auch vollkommen ausreichen sollte.
    Solltet ihr die Datei auf einem vServer/Root Server anlegen, müsst ihr beachten, dass der User, mit dem ihr den Server auch startet, Besitzer dieser Datei ist. Ansonsten hat der User keine Zugriffsrechte!


    Nutzung: Datei namens "script.txt" anlegen, Befehl in GameMode/Filterscript oder was auch immer einfügen und dann halt bei Server-Start die Funktion per Command oder FilterScript laden.



    stock putspaceinscript(){
    new File:file = fopen("script.txt", io_readwrite), line[1024];
    if(!file)
    {
    print("Fehlgeschlagen!");
    return 1;
    }
    else {
    new File:nfile = fopen("nscript.txt", io_append);
    if(!nfile){
    return 1;
    }
    while(fread(file, line)){
    for( new i=0; i < strlen(line); i++){
    if(line[i] == ',' && line[i+1] != ' '){
    strins(line, " ", i+1);
    }
    }
    fwrite(nfile, line);
    continue;
    }
    fclose(file);
    fclose(nfile);
    print("Fertig! =)");
    return 1;
    }
    }


    Hoffe, dass einige damit auch etwas anfangen können. Falls soetwas bereits existiert, habe ich es selbst noch nie gesehen oder wüsste gar nicht, nach welchem Begriff ich suchen soll.


    Viel Erfolg damit.
    LG

  • Wollte nur auf ein paar Funktionen hinweisen, die es seit 0.3.7 gibt und die kaum bekannt sind.


    Mit der Funktion [wiki]SetVehicleParamsCarDoors[/wiki] ist es nun möglich, dem Spieler sneaky Türen von Fahrzeugen wirklich zu öffnen :)


    Und mit [wiki]SetVehicleParamsCarWindows[/wiki] kann man Fenster von Türen im Auto, auf und zu machen.


    Viel Spaß euch beim skripten :)

    ast2ufdyxkb1.png


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

  • kann man denn zb auch alle türen gleich auf machen und wie sieht das vom code her aus bzw wie wende ich es an ?
    so zb ?
    SetVehicleParamsCarDoors(meien car id wo ich grade drin bin,1,1,1,1)

  • bzw wie wende ich es an ?

    Jaaaa...in meinem Post kannst du auf die jeweilige Funktion klicken und landest im Wiki.


    Dein Code ist korrekt.


    Das sind die Parameter:
    (vehicleid, driver, passenger, backleft, backright)


    Aber klick einfach drauf, da ist es erklärt.

    ast2ufdyxkb1.png


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

  • Beitrag von Jexian ()

    Dieser Beitrag wurde von Trooper[Y] gelöscht ().