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
  • Erstmal super, du erstellst für so einen unsauberen und für mich persönlich unnötigen Code ein eigenes Thema, brauch ich, vielleicht deine Defines posten und den Code von Kaliber nehmen.
    Bitte denk nächstes Mal nach, bevor du ein neues Thema eröffnest :)


    Auch hier gehen wieder Props an dich raus.

  • Habe mal wieder etwas für dieses Thema ;)


    C
    stock RandomEx(minvalue, maxvalue){
    	return (random (maxvalue - minvalue) + minvalue);
    }


    Anwendung:


    C
    RandomEx(3500,9000);

    Das Bespiel gibt einen Zufallswert zwischen 3500 und 9000 zurück.



    Mit freundlichen Grüßen
    German_ScripterHD

  • Damit könnt ihr täglich seperierte logs erstellen lassen.

    Wichtig: Um diese Funktion zu nutzen braucht ihr das FileManager Plugin


    Achja noch etwas die Funktionen brauchen den scriptfiles Ordner im Pfad (die normalen SAMP Natives nicht) da man ja auch ausserhalb des scriptfiles ordners Ordner erstellen kann.


    fileName ist der Dateiname den die Log datei haben soll zB aus chat wird chat.log
    directory ist der unter Ordner nach dem Datums Ordner. Bsp: adm_cmds wird logs/05.06/2016/adm_cmds
    szString ist der Text der geloggt letzendlich geschrieben werden soll.




    Am Ende wird dies so aussehen scriptfiles/logs/05.08.2016/chat.log und darin kann dann stehen: [00:46:36]: XeroX: Hi !

    Einmal editiert, zuletzt von XeroX () aus folgendem Grund: Pawn Tag mit C Tag ausgetauscht

  • C
    stock SetPlayerPosEx(playerid, Float:x, Float:y, Float:z, Float:r, interior = 0, virtualworld = 0){
    	SetPlayerPos(playerid, x, y, z);
    	SetPlayerFacingAngle(playerid, r);
    	SetPlayerInterior(playerid, interior);
    	SetPlayerVirtualWorld(playerid, virtualworld);
    	return 1;
    }


    Mit freundlichen Grüßen
    German_ScripterHD

  • Beitrag von EinfachMax ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: Hat vollkommen recht :P ().

  • stock SendClientMessageToAllEx(color, string[])
    {
    new count, lenght = 72;
    for(new i, l = strlen(string); i != l; i++)
    {
    if(string[i] == '{' && string[i+7] == '}')
    count += 8;
    }
    if(strlen(string) > (lenght+count))
    {
    new text[2][128];
    strmid(text[0], string, 0, lenght+count);
    strmid(text[1], string, lenght+count, strlen(string));
    format(text[0], 128, "%s...", text[0]);
    SendClientMessageToAll(color, text[0]);
    format(text[1], 128, "...%s", text[1]);
    SendClientMessageToAll(color, text[1]);
    return 1;
    }
    SendClientMessageToAll(color, string);
    return 1;
    }


    stock SendClientMessageEx(playerid, color, string[])
    {
    new count, lenght = 72;
    for (new i, l = strlen(string); i != l; i++)
    {
    if(string[i] == '{' && string[i+7] == '}')
    count += 8;
    }
    if(strlen(string) > (lenght+count))
    {
    new text[2][128];
    strmid(text[0], string, 0, lenght+count);
    strmid(text[1], string, lenght+count, strlen(string));
    format(text[0], 128, "%s...", text[0]);
    SendClientMessage(playerid, color, text[0]);
    format(text[1], 128, "...%s", text[1]);
    SendClientMessage(playerid, color, text[1]);
    return 1;
    }
    SendClientMessage(playerid, color, string);
    return 1;
    }

  • @Tommyx3
    Vielleicht solltest du mal für Leute, die es nicht wissen, erklären, was dein Code überhaupt macht. Ich weiß es, aber andere vielleicht nicht, die es vielleicht gebrauchen könnten. ;)

  • Code
    stock GetOnlinePlayers() 
    { 
    new count; 
    for(new i; i<GetMaxPlayers(); i++) if(IsPlayerConnected(i) && !IsPlayerNPC(i)) count++; 
    return count; 
    }
  • @Rocky Balboa
    die Schleife sollte lieber so aussehen


    for(new i = 0, j = GetPlayerPoolSize(); i <= j; i++)


    Es ist a) nicht nötig alle Slots durchlaufen zu lassen und b) ist es nicht nötig bei jedem Schleifen durchlauf die Funktion erneut aufzurufen.

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

    Margarete Stokowski

  • Am sinnvollsten ist es, gar keine Schleife zu nutzen, da sich die Zahl ohnehin nur an zwei Stellen ändern kann:


    Unter den Includes:
    new countOnlinePlayers;


    OnPlayerConnect:
    if(!IsPlayerNPC(playerid)) countOnlinePlayers++;


    OnPlayerDisconnect:
    if(!IsPlayerNPC(playerid)) countOnlinePlayers--;


    Ausgabe:
    printf("Es sind %d Spieler online.", countOnlinePlayers);

  • Soo.. habs mal verbessert:
    stock IsPlayerBehindVehicle(playerid,veh){ new Float:vcoord[3]; GetVehiclePos(veh,vcoord[0],vcoord[1],vcoord[2]); new Float:vangle; GetVehicleZAngle(veh,vangle); new Float:vinfo[3]; GetVehicleModelInfo(GetVehicleModel(veh),VEHICLE_MODEL_INFO_SIZE,vinfo[0],vinfo[1],vinfo[2]); new Float:lenge = floatdiv(vinfo[1],2.0); new Float:radius = floatdiv(vinfo[0],2.0); vcoord[0] = floatadd(vcoord[0],(-lenge * floatsin(-vangle,degrees))); vcoord[1] = floatadd(vcoord[1],(-lenge * floatcos(-vangle,degrees))); if(IsPlayerInRangeOfPoint(playerid,radius,vcoord[0],vcoord[1],vcoord[2])){return 1;} else{return 0;}}


    So wird sogar die Breite des Fahrzeuges mit einbezogen.
    Viel genauer gehts nicht mehr^^

    Hat da jemand ne bessere Version?
    Beim Sultan wird auf 1 returnt wenn ich neben dem Sultan stehe. Beim Ambulance funzt alles. hmm :/

  • Hat da jemand ne bessere Version?


    Die Funktion ist eigentlich korrekt so, da mit der Länge und der Breite des jeweiligen Fahrzeugs individuell gearbeitet wird.


    Du kannst höchstens mal versuchen in IsPlayerInRangeOfPoint dem radius minus 0.1 zu nehmen oder so, dann passt es vielleicht besser zur Seite hin.

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • Nein, aus
    if(IsPlayerInRangeOfPoint(playerid,radius,vcoord[0],vcoord[1],vcoord[2]))
    das hier:
    if(IsPlayerInRangeOfPoint(playerid,radius-0.1,vcoord[0],vcoord[1],vcoord[2]))


    Eventuell auch mehr als 0.1, ich weiß nicht, welche Werte da genau zurück gegeben werden, eventuell benötigt das kleine Anpassungen. Einfach mal ausprobieren, wann es passt.

  • Ich habe mal eben eine kleine Funktion geschrieben damit man for Schleifen ganz einfach und schnell schreiben kann.

    C
    #define LOOP(%0,%1) 				for(new %1 = 0; %1 < %0; %1++)
    #define LOOPEx(%2,%0,%1) 			for(new %1 = %2; %1 < %0; %1++)




    Sollte es diese Funktion schon geben, dann ist dies nur eine Ergänzung.


    Mit freundlichen Grüßen
    German_ScripterHD

  • Naja...ist es jetzt nicht so das wahre ^^


    Man sollte eher foreach nutzen oder wenn dann so eine PlayerLoop:


    for(new i=GetPlayerPoolSize(); i!=-1; i--)
    {
    if(!IsPlayerConnected(i) || IsPlayerNPC(i)) continue;
    //Hier der Rest
    }


    Bei dir macht das nicht wirklich was schneller, zudem kann man den Variablennamen nicht ändern...
    Sehe den Sinn darin nicht so ganz...

    ast2ufdyxkb1.png


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

  • Bei dir macht das nicht wirklich was schneller, zudem kann man den Variablennamen nicht ändern...
    Sehe den Sinn darin nicht so ganz...

    Der Sinn seiner Schreibweise ist nicht die Performance sondern die Schnelligkeit im Code-Schreiben. Prinzipiell das Gleiche wie ein Define von SendClientMessage nach SCM.
    Mit foreach kann das nicht wirklich verglichen werden.


    So kann anstatt
    for(new i = 0; i < 10; i++)
    einfach
    LOOP(10, i)
    geschrieben werden.


    Natürlich macht die Abwandlung nur bedingt Sinn, aber einige nutzen dies wohl auch dem Verständnis halber, zumindest habe ich diese Schreibweise schon des Öfteren gesehen.