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
  • Ich hab mal wieder zwei neue Codeschnipsel:



    Textdrawfix für PlayerTextdraws eine ergänzung wäre noch notwendig für die Funktion CreatePlayerTexdraw und natürlich für die normalen(Speziell ausgeleget auf die deutsche Rechtschreibung)


    native __PlayerTextDrawSetString(playerid, PlayerText:playertextdraw, string[], font=2) = PlayerTextDrawSetString;
    stock _PlayerTextDrawSetString(playerid, PlayerText:playertextdraw, string[], font=2) {
    _encoding(string,font);
    return __PlayerTextDrawSetString(playerid,playertextdraw,string);
    }
    #if defined _ALS_PlayerTextDrawSetString
    #undef PlayerTextDrawSetString
    #else
    #define _ALS_PlayerTextDrawSetString
    #endif
    #define PlayerTextDrawSetString _PlayerTextDrawSetString
    stock _encoding(string[],font)
    {
    switch(font){
    case 0,1:{
    for(new i;;++i){
    switch(string[i]){
    case EOS: break;
    case 'Ä':string[i] = '\131;';
    case 'Ö':string[i] = '\145;';
    case 'Ü':string[i] = '\149;';
    case 'ä':string[i] = '\154;';
    case 'ö':string[i] = '\168;';
    case 'ü':string[i] = '\172;';
    }
    }
    }case 2,3:{
    for(new i;;++i){
    switch(string[i]){
    case EOS: break;
    case 'Ä','ä':string[i] = '\216;';
    case 'Ö','ö':string[i] = '\230;';
    case 'Ü','ü':string[i] = '\234;';
    }
    }
    }
    }
    }



    Musik über Youtube streamen:

    stock static bool:PlayYouTubeStream(playerid,str[]){
    static stream[200] = "YoutubeInMP3.com/fetch/?api=advanced&video=";
    strcat(stream,str);
    return !!HTTP(playerid,HTTP_GET,stream,"","@PlayAudioStream");
    }


    forward @PlayAudioStream(playerid, response_code, data[]);
    @PlayAudioStream(playerid, response_code, data[])
    {
    if(response_code != 200)return print("Link konnte nicht abgespielt werden!");
    strdel(data,EOF,strfind(data, "Link: ", true, -1)+5);
    return PlayAudioStreamForPlayer(playerid,data);
    }

  • #define GetUserIP(%0) l_ip[%0]//Oben im Script unter Includes


    static l_ip[MAX_PLAYERS][16];//Global


    GetPlayerIp(playerid,l_ip[playerid],16);//OnPlayerConnect


    //Verwendung #1:
    new string[128];
    format(string,sizeof string,"Deine IP-Adresse: %s",l_ip[playerid]);
    SendClientMessage(playerid,-1,string);


    //Verwendung #2:
    new string[128];
    format(string,sizeof string,"Deine IP-Adresse: %s",GetUserIP(playerid));
    SendClientMessage(playerid,-1,string);


    oder


    stock GetUserIP(playerid){
    static l_ip[16];
    return (GetPlayerIp(playerid,l_ip,16)),l_ip;
    }


    Bei beiden Möglichkeiten geht es schnell und einfach die IP-Adresse auszulesen.
    Bei der 1. Methode muss man im gesamten Script nur einmal die IP-Adresse in einem Array speichern, beim 2. mal wird es immer wieder ausgelesen.

    Einmal editiert, zuletzt von AirM4X ()

  • Ich veröffentliche hier mal meine strtok-Version, die ich vor langer Zeit erstellt habe. Diese macht 1:1 das Gleiche wie die originale strtok-Funktion, nur mit dem Unterschied, dass sie mehr als doppelt so schnell ist.


    Original: http://wiki.sa-mp.com/wiki/Strtok


    v2.0 by Jeffry:
    stock strtok(const string[], &index) //©Jeffry
    {
    new result[20], length = strlen(string), i = index;
    while ((i < length) && (string[i] == ' ')) i++;
    strmid(result,string,i,((index = strfind(string, " ", false, i)) == -1) ? (index = length) : (index) , 20);
    index++;
    return result;
    }


    Man kann einfach die alte strtok Funktion mit der Meinen ersetzen, mehr ist nicht notwendig.


    Zitat
    Zeit-Tests

    [07/09/2014 15:22:34] Original: 3233ms
    [07/09/2014 15:22:36] Jeffry: 1455ms

    Zeit-Tests

    new idx, t;
    new params[16] = "abc def ghi";
    t = GetTickCount();
    for(new i=0; i<1000000; i++)
    {
    idx = 0;
    strtok_Original(params, idx);
    strtok_Original(params, idx);
    strtok_Original(params, idx);
    }
    printf("Original: %dms", GetTickCount() - t);

    Zeit-Tests
    t = GetTickCount();
    for(new i=0; i<1000000; i++)
    {
    idx = 0;
    strtok_Jeffry(params, idx);
    strtok_Jeffry(params, idx);
    strtok_Jeffry(params, idx);
    }
    printf("Jeffry: %dms", GetTickCount() - t);
    Die Tests wurden mit einem Intel® Core™ i7-3770 Prozessor durchgeführt.


    Keywords: strtok

  • Ich hatte gerade eben ein Codeschnipsel geschrieben womit man bestimmen kann abhängig von der Rotation des fahrzeugs ob sich der Spieler vor, neben oder hinter
    dem Auto befindet



    stock GetPlayerPositionNextToACar(playerid,carid){
    if(!GetPlayerVehicleID(playerid))return 0;
    new Float:Pos[7];
    GetVehiclePos(carid,Pos[0],Pos[1],Pos[2]);
    GetVehicleZAngle(carid,Pos[3]);
    GetPlayerPos(playerid,Pos[4],Pos[5],Pos[6]);
    Pos[6] = ((Pos[4] - Pos[0])*floatcos(Pos[3],degrees)+(Pos[5] - Pos[1])*floatsin(Pos[3],degrees));
    Pos[3] = ((-(Pos[4] - Pos[0]))*floatsin(Pos[3],degrees)+(Pos[5] - Pos[1])*floatcos(Pos[3],degrees));
    GetVehicleModelInfo(GetVehicleModel(carid), VEHICLE_MODEL_INFO_SIZE, Pos[0],Pos[1],Pos[2]);
    if(Pos[6] >= 0 && Pos[3] <= (Pos[1]/2) && Pos[3] >= (-Pos[1]/2))return 1; //Rechts
    else if(Pos[6] <= 0 && Pos[3] <= Pos[1]/2 && Pos[3] >= -Pos[1]/2)return 2; //Links
    else if(Pos[3] >= 0 && Pos[6] <= Pos[0]/2 && Pos[6] >= -Pos[0]/2)return 3; // Vorne
    else if(Pos[3] <= 0 && Pos[6] <= Pos[0]/2 && Pos[6] >= -Pos[0]/2)return 4; // Dahinter
    return 0;
    }


    Anwendungsbeispiel:



    if (strcmp("/mycommand", cmdtext, true, 10) == 0)
    {
    switch(GetPlayerPositionNextACar(playerid,1)){
    case 1:SendClientMessage(playerid,-1,"Rechts");
    case 2:SendClientMessage(playerid,-1,"Links");
    case 3:SendClientMessage(playerid,-1,"Vorne");
    case 4:SendClientMessage(playerid,-1,"Hinter");
    }
    return 1;
    }


    Keywords: Spieler neben dem Fahrzeug, Spieler vor dem Fahrzeug

  • Beitrag von Pille ()

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • //Edit:
    Ich habe mal einen Fix geschrieben für den normalen Chat.


    Ihr kennt das Problem alle, ihr wollt ein % Zeichen schreiben und es kommt nur ein #...


    Das behebt ihr nun so:


    stock _Fix(const string[],bool:chat=false) {
    new tmp[145],pos = strfind(string,"#");
    strcat(tmp,string);
    if(pos == -1) return tmp;
    for(;;) {
    if(tmp[((pos-1) < 0)?0:(pos-1)] != '\\') {
    strdel(tmp,pos,pos+1),strins(tmp,(!chat)?("%%"):("%%%%"),pos,sizeof tmp);
    pos = strfind(tmp,"#",false,pos+((!chat)?(2):(4)));
    }
    else {
    strdel(tmp,pos-1,pos);
    pos = strfind(tmp,"#",false,pos);
    }
    if(pos == -1) break;
    }
    return tmp;
    }


    //Und unter OnPlayerText:
    public OnPlayerText(playerid,text[]) {
    format(text,146,_Fix(text)); //Das muss die 1. Zeile hier sein:
    return 1;
    }


    //Wenn ihr allerdings mit einer eigenen Message arbeitet, dann so:
    public OnPlayerText(playerid,text[]) {
    format(text,146,_Fix(text,true)); //Das muss die 1. Zeile hier sein:
    //Halt unten der Rest
    SendClientMessage(playerid,-1,text);
    return 0;
    }


    Dadurch wird aus dem # ein %...wenn ihr jetzt aber ein normales # inGame schreiben wollt, müsst ihr \# eingeben ;)


    //Fakultät:
    Also, mir ist keine Funktion bekannt und habe auch noch keine gesehen (nicht mal im Englischen Forum), dass man die Fakultät berechnen kann.


    Also, hier eine Funktion, mit der das möglich ist:


    stock fac(x) {
    if(x < 0) return 0;
    if(0 <= x <= 1) return 1;
    if(x==2) return x;
    new y=1,i=x;
    for(; i!=0; i--) y *= i;
    return y;
    }


    //Anwendung:
    new x = 5;
    printf("Die Fakultät von %d ist: %d",x,fac(x));
    //->: Die Fakultät von 5 ist: 120


    Keywords: Fakultät, Factorial


    mfg. :thumbup:


    //Edit: Umbenannt wegen Pille...wobei das völlig egal ist, da man das eh selber kann <(^.^)>
    //Edit²: Prozent-Fix

    ast2ufdyxkb1.png


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

    3 Mal editiert, zuletzt von Kaliber ()

  • Hier eine nützliche Funktion, wenn ihr prüfen wollt, ob eine Zahl eine Primzahl ist.


    stock IstPrimzahl(zahl) //©Jeffry
    {
    if(zahl < 0) zahl *= -1;
    if(zahl < 2) return false;
    for(new i = 2; i <= zahl / 2; i++)
    {
    if(zahl % i == 0) return false;
    }
    return true;
    }


    Beispiel zur Nutzung:
    for(new i=0; i<100; i++) if(IstPrimzahl(i)) printf("%d ist eine Primzahl", i);


    Ausgabe:


    Extra Info:
    http://www.spiegel.de/wissensc…ne-primzahl-a-882646.html
    http://www.wissenschaft-aktuel…r_Zeiten___bisher___.html



    Keywords: IstPrimzahl, IsPrimeNumber, Primzahlen, Primenumbers, CheckPrimzahl, CheckPrime, CheckPrimenumber, auf Primzahl prüfen, ist Zahl Primzahl.

  • Also, das hier ist ein schnellerer Weg etwas in eine Variable zu schreiben, als format:


    #define Push(%0,%1) %0[0]='\0',strcat(%0,%1,0x80)


    //Das schreibt oben in euer Skript und so wendet ihr es an:


    new string[] = "Hallo";


    //Um jetzt etwas anderes in den String zu schreiben als Hallo...nutzen die meisten format:
    format(string, sizeof string,"Test"); //jetzt würde Test in string stehen


    //Schneller wäre aber jetzt das hier:
    Push(string,"Test"); //hier würde jetzt auch Test in der Variable stehen


    Um euch zu beweisen, dass ich recht habe hier ein kleiner Speedtest (1.000.000 Durchläufe):


    Speedtest
    #include <a_samp>

    Speedtest
    #define COUNT 1000000
    #define Push(%0,%1) %0[0]='\0',strcat(%0,%1,0x80)
    main() {
    new string[] = "Hallo mein name ist Kaliber!";
    new t = GetTickCount();
    for(new i; i<COUNT; i++) format(string,sizeof string,"Hallo mein name ist Kaliber!");
    printf("Format: %dms",GetTickCount()-t);
    t = GetTickCount();
    for(new i; i<COUNT; i++) Push(string,"Hallo mein name ist Kaliber!");
    printf("Push: %dms",GetTickCount()-t);
    }


    Viel Spaß damit ^^


    mfg. :thumbup:


    //Edit: Danke Goldkiller :)

    ast2ufdyxkb1.png


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

    2 Mal editiert, zuletzt von Kaliber ()

  • Welchen Sinn soll das haben ?
    Wenn ich einen Text irgendwo in eine Variable "pushen" will, dann benutze ich die direkte Zuweisung.


    http://pastebin.com/b6iAEkCV


    Selbst wenn deine Funktion toll ist,sollte man lieber direkt strcat nutzen.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • sollte man lieber direkt strcat nutzen.


    Es geht ja darum, dass die Variable bereits einen Wert hat und man einen völlig neuen Wert haben will ;)


    new string[] = "Hallo";


    Wenn ich jetzt nur mit strcat arbeiten würde, dann würde da ja Halloxxx stehen ich will aber, dass nur xxx darin steht.


    mfg. :thumbup:

    ast2ufdyxkb1.png


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

  • dann mache ich string = "neuer wert"; ??


    Das geht in Pawn ja nicht immer ;)


    Zum Beispiel hier:


    main() {
    new string[] = "blub";
    func(string);
    }


    func(string[]) {
    string = "Hallo";
    print(string);
    }


    Das geht nicht, aber da kannst du z.B. Push jetzt verwenden, anstatt format ;)


    Schon klar, funktioniert ja auch mit beiden Alternativen Funktion:


    Hmm...ja stimmt, es wäre noch schneller anstatt dem strdel einfach den Null-Char zu verwenden ^^


    Danke, werde das mal anpassen :)


    mfg. :thumbup:

    ast2ufdyxkb1.png


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

  • Da kürzlich in einem Thread angesprochen, hier einen für alle User funktionsfähigen "Mixer".


    stock MixString(string[]) //©Jeffry
    {
    new mixed[256], len = strlen(string), rand;
    for(new i=0; i<len; i++)
    {
    rand = random(len-i);
    mixed[i] = string[rand];
    strdel(string, rand, rand+1);
    }
    return mixed;
    }


    Beispiel zur Nutzung:

    Spoiler anzeigen
    for(new i=0; i<5; i++) print(MixString("abcdefghijklmnopqrstuvmxyz"));

    Spoiler anzeigen
    Ausgabe:

    Zitat
    Spoiler anzeigen

    [13/10/2014 19:33:22] hlaobizfyptqjdkgnrxvcmmesu
    [13/10/2014 19:33:22] cugdfkjpanmhrzeoivmtsxbyql
    [13/10/2014 19:33:22] drftmqoixklhzsbuanjmgyecpv
    [13/10/2014 19:33:22] gfkusdpryaneojbmqzmiclhxtv
    [13/10/2014 19:33:22] ckpyidtnvfrahejzmlgxmqbsou


    Keywords: MixString, StringMix, Mixer, durcheinander, mischen, mix, random, zufällige Reihenfolge, Buchstabensalat.

  • stock ZahlNaeherNull(zahl1, zahl2){
    new z1tmp, z2tmp;
    if(zahl1 < 0){z1tmp = zahl1 * (-1);}
    else{z1tmp = zahl1;}
    if(zahl2 < 0){z2tmp = zahl2 * (-1);}
    else{z2tmp = zahl2;}
    if(z1tmp < z2tmp)return 1;
    else if(z1tmp == z2tmp)return 0;
    return 2;
    }


    Beispiel zur Nutzung:

    Spoiler anzeigen
    printf("Zahl %i ist näher an null", ZahlNaeherNull(-400, 100));


    Rückgabewerte:

    Spoiler anzeigen

    1 - Zahl 1 ist größer
    2 - Zahl 2 ist größer
    0 - Zahlen sind gleich groß

    Einmal editiert, zuletzt von Nemesus Jr. ()

  • Nemesus Jr.:
    Das wird so nicht funktionieren. Du machst einmal *-1 und einmal +-1.
    Außerdem brauchst du die beiden Hilfsvariablen nicht unbedingt:


    stock ZahlNaeherNull(zahl1, zahl2)
    {
        if(zahl1 < 0) zahl1 *= -1;
        if(zahl2 < 0) zahl2 *= -1;
        if(zahl1 < zahl2) return 1;
        else if(zahl1 == zahl2) return 0;
        else return 2;
    }


    So wäre es korrekt. ;)

  • Enum welches man nutzen kann für Map Icons anstatt umständlich immer die ID aus dem Wiki suchen zu müssen. MapIcon_4Dragons wird im Wiki als triads bezeichnet was ich etwas unpassend finde und deswegen 4Dragons genannt habe



    enum
    {
    MapIcon_ColoredSquare, // 0
    MapIcon_WhiteSquare,
    MapIcon_PlayerPosition,
    MapIcon_PlayerIcon,
    MapIcon_North,
    MapIcon_AirYard, // 5
    MapIcon_Ammunation,
    MapIcon_Barber,
    MapIcon_BigSmoke,
    MapIcon_BoatYard,
    MapIcon_BurgerShot, // 10
    MapIcon_Quarry,
    MapIcon_Catalina,
    MapIcon_Cesar,
    MapIcon_CluckinBell,
    MapIcon_CJ, // 15
    MapIcon_CRASH,
    MapIcon_Diner,
    MapIcon_Emmet,
    MapIcon_EnemyAttack,
    MapIcon_Fire, // 20
    MapIcon_GirlFriend,
    MapIcon_Hospital,
    MapIcon_Loco,
    MapIcon_MaddDogg,
    MapIcon_Caligulas, // 25
    MapIcon_OGLoc,
    MapIcon_ModGarage,
    MapIcon_OGLoc2,
    MapIcon_WellStacked,
    MapIcon_Police, // 30
    MapIcon_Property,
    MapIcon_PropertyLocked,
    MapIcon_RaceTrophy,
    MapIcon_Ryder,
    MapIcon_SaveGameDisk, // 35
    MapIcon_School,
    MapIcon_Unknown,
    MapIcon_Sweet,
    MapIcon_Tattoo,
    MapIcon_TheTruth, // 40
    MapIcon_Waypoint,
    MapIcon_Toreno,
    MapIcon_4Dragons,
    MapIcon_TraidsCasino,
    MapIcon_Clothes, // 45
    MapIcon_Woozie,
    MapIcon_Zero,
    MapIcon_Club,
    MapIcon_Bar,
    MapIcon_Restaurant, // 50
    MapIcon_Truck,
    MapIcon_Robbery,
    MapIcon_RaceFinish,
    MapIcon_Gym,
    MapIcon_Car, // 55
    MapIcon_Light,
    MapIcon_ClosestAirport,
    MapIcon_LosAztecas,
    MapIcon_Ballas,
    MapIcon_LSVagos, // 60
    MapIcon_SFRifa,
    MapIcon_GroveStreet,
    MapIcon_PayNSpray // 63
    }

  • Eine kleine Funktion um explosive Munition zu ermöglichen.
    Für welche Waffen das verfügbar sein soll müsst ihr dann selber entscheiden,
    so wie es gerade ist:
    Sämtliche Waffen sind explosiv.


    /explosionsmunition um zu de/aktivieren.


    Grundlegenes
    new ExplosionsMunition[MAX_PLAYERS];


    public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
    {
    if(ExplosionsMunition[playerid] == 1) {
    new Float:fxX,Float:fyY,Float:fzZ;
    if(hittype == 1)/*Spieler*/ { GetPlayerPos(hitid,fxX,fyY,fzZ), CreateExplosion(fxX, fyY, fzZ, 12, 10.0); }
    else if(hittype == 2)/*Auto*/ { GetVehiclePos(hitid,fxX,fyY,fzZ), CreateExplosion(fxX, fyY, fzZ, 12, 10.0); }
    else if(hittype == 3)/*Objekt*/ { GetObjectPos(hitid,fxX,fyY,fzZ), CreateExplosion(fxX, fyY, fzZ, 12, 10.0); }
    else if(hittype == 4)/*Spielerobjekt*/ { GetPlayerObjectPos(playerid,hitid,fxX,fyY,fzZ), CreateExplosion(fxX, fyY, fzZ, 12, 10.0); }
    else /*Normale Map*/{ CreateExplosion(fX, fY, fZ, 12, 10.0); }
    }
    return 1;
    }


    Aktivierungsbefehl
    CMD:exmu(playerid, params[]) {
    if(ExplosionsMunition[playerid] == 1) { ExplosionsMunition[playerid] = 0, SendClientMessage(playerid, 0xFFFFFFFF, "Explosionsmunition {FF0000}deaktiviert{FFFFFF}."); }
    else { ExplosionsMunition[playerid] = 1, SendClientMessage(playerid, 0xFFFFFFFF, "Explosionsmunition {00FF00}aktiviert{FFFFFF}."); }
    return 1;
    }