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
  • Hallo alle zusammen, heute möchte ich einen kleinen Fix posten.


    Manche kennen eventuell diese Include
    http://forum.sa-mp.com/showthread.php?p=2362690


    Da ich eine einfachere Lösung gefunden habe um diesen Fehler zu behebt möchte ich das ganze hier posten, wenn man


    TogglePlayerSpectating(playerid,true);


    nutzen möchte und anschließend SetPlayerCameraPos und SetPlayerCameraLookAt so bleibt die Kamera automatisch an der Blueberry Farm hängen.



    Lösung:


    #define SetPlayerCamera(%0, %1, %2, %3, %4, %5, %6) InterpolateCameraPos(%0, %1, %2, %3, %1, %2, %3, 1000, CAMERA_CUT),InterpolateCameraLookAt(%0, %4, %5, %6, %4, %5, %6, 1000, CAMERA_CUT);

  • Ich habe gerade was lustiges herausgefunden, man kann mit dem Pawn-Compiler if-Abfragen auch so schreiben:


    new a=5;
    if a==5 *then print("a=5");


    Dieses *then habe ich bis jetzt noch nie in irgendeinem Skript gesehen, weil es natürlich total überflüssig ist, wenn man auch einfach nur Klammern setzen kann, fand es aber mal ganz nützlich zu wissen, dass so ein "then" auch in Pawn existiert :)


    mfg. :thumbup:

    ast2ufdyxkb1.png


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

  • Damit man nicht immer #define FARBE machen muss:



    enum //Farben
    {
    COLOR_RED = 0xFF0005FF,
    COLOR_GREEN = 0x00FF00FF
    //Weitere Farben einfügen & Komma nach dem Farbcode nicht vergessen!
    }


    Nutzung:
    public OnPlayerConnect(playerid)
    {
    SendClientMessage(playerid, COLOR_RED, "Das ist eine Nachricht.");
    return 1;
    }

    2 Mal editiert, zuletzt von Dr.Almighty () aus folgendem Grund: Etwas hinzugefügt

  • Beitrag von seegras ()

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Beitrag von Dr.Almighty ()

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Manche nutzen ja immer noch das alte MySQL Plugin von BlueG R5 oder R6, wegen dem Tutorial von maddin, daher wollte ich mit meinem Codeschnipsel zeigen, das man wie früher auch bei der neuen Version ohne Probleme mit mysql_query arbeiten kann , das einzige Problem dabei ist das die queries nicht threaded sind.


  • Hey,


    Ich habe hier ein Actor System viel Spaß damit.





    Gruß:
    ZeusLukas

    2 Mal editiert, zuletzt von Lukaz ()

  • Hier drei String-Funktionen, um einen String umzudrehen, zu mixen oder einen zufälligen String zu erstellen:


    Hinweis:
    Für alle drei Funktionen wird einmalig unter den Includes folgende Definition benötigt:

    C
    #define MAX_STR 256





    strreverse:
    Ein String wird umgedreht zurückgegeben.


    C
    stock strreverse(str[])
    {
    	new len = strlen(str), tmp[MAX_STR], j;
    	for(new i = len-1; i >= 0; i--)
    	{
    		tmp[j] = str[i];
    		j++;
    	}
    	return tmp;
    }


    Beispiel:

    C
    print(strreverse("abcdef"));


    Ausgabe:

    Zitat

    [14/11/2015 12:15:19] fedcba





    strmix:
    Ein String wird zufällig gemixt zurückgegeben.



    Beispiel:

    C
    print(strmix("abcdef"));


    Ausgabe:

    Zitat

    [14/11/2015 12:17:18] dcbaef





    randstr:
    Es wird ein zufälliger String der Länge x zurückgegeben.



    Beispiel:

    C
    printf(randstr(10));


    Ausgabe:

    Zitat

    [14/11/2015 12:19:12] Wyf2P92RNN

  • lässt sich von selbst erklären


    Beispiel:


    C
    public OnGameModeInit(){
    	new string[32];
    	ConvertToString(1111111111, string);
    	printf("%s", string); //string -> 1.111.111.111
    	return 1;
    }
  • lässt sich von selbst erklären


    Also dein Code hat noch optimierungs potenzial


    Code
    stock ConvertIntToString(val, string[]){
        valstr(string, val);
        for(new i = strlen(string)-1; i >= 3;) {
             i-= 2;
            strins(string, ".", i--, 1);
        }
        return 1;
    }




    Dein #undef DECIMAL_SYMBOL kannst du dir sparen, das würdest du nur brauchen falls du dasselbe Define nur mit einem anderen Inhalt nochmal im Code verwenden würdest


    //edit
    Paar nützliche Funktionen


    //edit neue Funktion


    Code
    SetPlayerCameraLookAtEx(playerid, Float:X, Float:Y, Float:Z, Float:RotX, Float:RotZ)


    Mit dieser Position kann man durch Winkel die Kamera via SetPlayerCameraPos setzen


    Code
    stock SetPlayerCameraLookAtEx(playerid, Float:X, Float:Y, Float:Z, Float:RotX, Float:RotZ) {
    	SetPlayerCameraPos(playerid, X, Y, Z);
    	X += 10.0 * floatcos(RotX, degrees) * floatcos(RotZ, degrees);
    	Y += 10.0 * floatcos(RotX, degrees) * floatsin(RotZ, degrees);
    	Z += 10.0 * floatsin(RotX, degrees);
    	SetPlayerCameraLookAt(playerid, X, Y, Z);
    	return 1;
    }


  • Beitrag von malE ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: Mein Fehler gewesen, funktioniert super! Good Job IPrototypeI ().
  • Auf Nachfrage von @[LnD]JustMe.77 habe ich mir gedacht ich schreibe das kurz für den DIALOG_STYLE_MSGBOX zusammen und poste es hier, falls mal wieder jemand danach sucht bzw. jemand es benötigt.


    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.



    Unter den Includes die Variablen sowie der Hook für die Dialoge:
    #define DIALOG_TEST 1337
    new testCount[MAX_PLAYERS];


    new pDialog[MAX_PLAYERS] = {-1,...};
    stock my_ShowPlayerDialog(playerid, dialogid, style, caption[], info[], button1[], button2[]) //©Jeffry
    {
    if(!IsPlayerConnected(playerid)) return 0;
    pDialog[playerid] = dialogid;
    ShowPlayerDialog(playerid, dialogid, style, caption, info, button1, button2);
    return 1;
    }


    #if defined _ALS_ShowPlayerDialog
    #undef ShowPlayerDialog
    #else
    #define _ALS_ShowPlayerDialog
    #endif
    #define ShowPlayerDialog my_ShowPlayerDialog


    Bei OnFilterScriptInit/OnGameModeInit:
    SetTimer("ReshowDialog", 460, true);


    Bei OnPlayerDisconnect:
    pDialog[playerid] = -1;


    Hier einen Test-Befehl für OnPlayerCommandText:

    if(!strcmp(cmdtext, "/dialog", true))
    {
    testCount[playerid] = gettime();
    ShowPlayerDialog(playerid, DIALOG_TEST, DIALOG_STYLE_MSGBOX, "Test Dialog", "Du hast diesen Dialog offen seit: 00:00", "Ok", "Abbrechen");
    return 1;
    }


    Dann der Teil zu OnDialogResponse:
    //Ganz oben als erstes in OnDialogResponse:
    pDialog[playerid] = -1;
    Sowie:if(dialogid == DIALOG_TEST)
    {
    if(response)
    {
    SendClientMessage(playerid, 0xFFFFFFFF, "Hallo Welt!");
    }
    else
    {
    SendClientMessage(playerid, 0xFF0000FF, "Hallo Welt!");
    }
    return 1;
    }


    Und dann ganz unten im Filterscript/Gamemode:
    forward ReshowDialog();
    public ReshowDialog()
    {
    new str[128];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(pDialog[i] == -1) continue;
    if(pDialog[i] == DIALOG_TEST)
    {
    new t = gettime() - testCount[i];
    format(str, sizeof(str), "Du hast diesen Dialog offen seit: %02d:%02d", t/60, t%60);
    ShowPlayerDialog(i, DIALOG_TEST, DIALOG_STYLE_MSGBOX, "Test Dialog", str, "Ok", "Abbrechen");
    }
    //andere Dialoge...
    }
    return 1;
    }



    Oder alternativ hier das ganze als kompletten Filterscript:

  • Dieser Codedchnipsel ist z.B für Roleplay oder Reallife Server ganz nützlich. Hierbei handelt es sich um ein Vor- & Nachnamen System.


    Beispiel: German_ScripterHD --> Vorname: German Nachname: ScripterHD


    C
    main()
    {
    	new rpName[MAX_PLAYER_NAME]="Bread_Fish",RP_PlayerName[2][128];
    	if(strfind(rpName, "_", true) == -1)return print("Fehler! Kein Unterstrich!");
    	split(rpName, RP_PlayerName, '_');
    	printf("Vorname: %s | Nachname: %s",RP_PlayerName[0],RP_PlayerName[1]);
    	return 1;
    }


    print:


    C
    [22:08:55] Vorname: Bread | Nachname: Fish



    MfG :thumbup:


    Mit freundlichen Grüßen
    German_ScripterHD

  • Ob das jetzt performanter ist, keine Ahnung. (Würde sowas auch mit sscanf machen)


    Die Beschränkung auf 10 Zeichen für Vorname und Nachname find ich nicht so gut.
    Je nachdem ob mein Vor- bzw Nachname mehr als 10 Zeichen hat, wird der Rest abgeschnitten. Da der Name sowieso nie länger als MAX_PLAYER_NAME sein kann, würde ich eher das als Größe für Vor- und Nachname nehmen. Lieber auf Nummer sicher gehen. ( Wobei 128 für beides definitiv zu groß ist :P, Siehe https://breadfish.de/index.php?thread/18-n%C3%BCtzliche-codeschnipsel/&postID=2166483#post2166483)


    Beispiel:
    Markus_Hildebrandt


    name[0] = "Markus"
    name[1] = "Hildebran"

    • Ich glaub es sollte an sich performanter sein , klar natives sind schnell und das sscanf plugin hat beim Aufruf auch einiges zu tun aber an sich vergleiche ich das mal mit dem Aufruf der natives, welche sich bei einem Durchlauf auf 1 + 3 * 2 handelt. Also über den Daumen gepeilt behaupte ich das einfach mal. Zusätzlich kann man sagen ist definitiv via sscanf übersichtlicher und weniger Code zum schreiben. Zu dem Punkt mit 10 Zeichen, das war eher als Beispiel gedacht dennoch danke für die Anmerkung ^^.
  • Nützlich für zum bsp /timeban oder auch für die dauer des Donater Ranges:

    stock GetSecondsByTimeString(string[], type[4]="hms", bool:ignorecase=true) //bsp: 45h32m10s oder 1y30m5d
    {
    new time=0, var[32], years, months, days, hours, mins, secs, pos;
    if(!strcmp(type, "hms", ignorecase)) //bsp: 5h30m15s (5 Stunden & 30 Minuten & 15 Sekunden)
    {
    for (new i, l = strlen(string); i != l; i++)
    {
    if(string[i] == 'h' || (ignorecase && string[i] == 'H'))
    {
    strmid(var, string, 0, i);
    hours = strval(var)*3600;
    pos = i;
    continue;
    }
    if(string[i] == 'm' || (ignorecase && string[i] == 'M'))
    {
    strmid(var, string, pos+1, i);
    mins = strval(var)*60;
    pos = i;
    continue;
    }
    if(string[i] == 's' || (ignorecase && string[i] == 'S'))
    {
    strmid(var, string, pos+1, i);
    secs = strval(var);
    pos = i;
    continue;
    }
    }
    time = hours+mins+secs;
    }
    else if(!strcmp(type, "ymd", ignorecase)) //bsp: 5y6m12d (5 Jahre & 6 Monate & 12 Tage)
    {
    for (new i, l = strlen(string); i != l; i++)
    {
    if(string[i] == 'y' || (ignorecase && string[i] == 'Y'))
    {
    strmid(var, string, 0, i);
    years = strval(var)*31557600;
    pos = i;
    continue;
    }
    if(string[i] == 'm' || (ignorecase && string[i] == 'M'))
    {
    strmid(var, string, pos+1, i);
    months = strval(var)*2629800;
    pos = i;
    continue;
    }
    if(string[i] == 'd' || (ignorecase && string[i] == 'D'))
    {
    strmid(var, string, pos+1, i);
    days = strval(var)*86400;
    pos = i;
    continue;
    }
    }
    time = years+months+days;
    }
    return time;
    }


    Verwendung:



    printf("%d", GetSecondsByTimeString("5h30m15s"));
    printf("%d", GetSecondsByTimeString("5h30m"));
    printf("%d", GetSecondsByTimeString("5h"));
    printf("%d", GetSecondsByTimeString("5h15s"));
    printf("%d", GetSecondsByTimeString("30m5h"));
    printf("%d", GetSecondsByTimeString("5h30M15s"));
    printf("%d", GetSecondsByTimeString("5y6m12d", "ymd"));
    printf("%d", GetSecondsByTimeString("5y12d", "ymd"));