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
  • OnPlayerWeaponShot:
    Da kann man aber noch einiges refaktorieren.
    Eine Frage nebenbei. Warum nimmst du von dem getroffenem Objekt/Auto/Spieler die Position ? Ist da nicht fX,fY,fZ genauer ? Ich stelle mir nur mal vor, ich habe ein riesen Objekt (Hochhaus) und treffe es irgendwo außen. Deiner Funktion nach würde es aber die Map-Position nehmen und dort die Explosion erstellen. Das wäre mit Sicherheit irgendwo "im Haus", was ich niemals sehen könnte.
    Habe ehrlich gesagt OnPlayerWeaponShot noch nie verwendet, daher die Frage zu fX,fY und fZ.


    explosionsmunition:
    Das str ist aber ganz schön überflüssig :/.

  • OnPlayerWeaponShot:
    Da kann man aber noch einiges refaktorieren.
    Eine Frage nebenbei. Warum nimmst du von dem getroffenem Objekt/Auto/Spieler die Position ? Ist da nicht fX,fY,fZ genauer ? Ich stelle mir nur mal vor, ich habe ein riesen Objekt (Hochhaus) und treffe es irgendwo außen. Deiner Funktion nach würde es aber die Map-Position nehmen und dort die Explosion erstellen. Das wäre mit Sicherheit irgendwo "im Haus", was ich niemals sehen könnte.
    Habe ehrlich gesagt OnPlayerWeaponShot noch nie verwendet, daher die Frage zu fX,fY und fZ.


    explosionsmunition:
    Das str ist aber ganz schön überflüssig :/.


    Naja, das habe ich Anfangs auch probiert.
    Das Problem war nur:
    Sobald man ein Auto oder einen Spieler getroffen hatte wurde keine Explosion mehr erstellt.
    D.H das war eigentlich die einzige Lösung das zu lösen da die fKoordinaten bei Spielern und Fahrzeugen nicht gewirkt haben.
    Das mit dem Hochhaus stimmt so halb.
    Allerdings nur bei gemappten Objekten, da da erneut die fKoordinaten nicht greifen.
    Bei der normalen San Andreas Map wird es dort erstellt wo getroffen wurde.


    //Goldkiller: Klingt logisch

  • Warum nimmst du von dem getroffenem Objekt/Auto/Spieler die Position ?


    fX, fY, fZ beinhalten nur dann die absoluten Koordinaten, wenn es keinen Gegenstand gibt der getroffen wurde.
    Die Koordinaten sind dann auch die, an der die "Kugel" eingeschlagen ist.


    Ist da nicht fX,fY,fZ genauer ?


    Sobald es ein Server"objekt" ist, der getroffen wurde, Spieler, Auto oder Objekt, ist das der Offset zur Position.


    Genauer wäre es dann nur, wenn man es zusammenrechnet.

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

    Margarete Stokowski

  • Nichts Weltbewegendes, aber damit ihr euch in Zukunft die Arbeit ersparen könnt, dies selbst aus der Liste der Waffen rauszusuchen:


    stock GetWeaponSlot(weaponid) //©Jeffry
    {
    switch(weaponid)
    {
    case 0,1: return 0;
    case 2..9: return 1;
    case 22..24: return 2;
    case 25..27: return 3;
    case 28,29,32: return 4;
    case 30,31: return 5;
    case 33,34: return 6;
    case 35..38: return 7;
    case 16..18,39: return 8;
    case 41..43: return 9;
    case 10..15: return 10;
    case 44..46: return 11;
    case 40: return 12;
    default: return -1;
    }
    return -1;
    }


    Beispiel zur Nutzung:

    Spoiler anzeigen
    new wSlot = GetWeaponSlot(17);
    printf("Slot der Waffen-ID 17: %d", wSlot);

    Spoiler anzeigen
    Ausgabe:

    Zitat
    Spoiler anzeigen

    [12/12/2014 18:12:21] Slot der Waffen-ID 17: 8



    Keywords: GetWeaponSlot, GetWaffenSlot, WaffenSlot, GetWaffenIndex, GetWeaponIndex, SlotDerWaffe, IndexDerWaffe.

  • stock GetFreeVehicleSeatID(vehID)
    {
    static ivID = 0;
    static bool:Seat[5] = false;
    for(new i;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i))
    {
    if(!IsPlayerNPC(i))
    {
    if(IsPlayerInAnyVehicle(i))
    {
    ivID = GetPlayerVehicleID(i);
    if(vehID == ivID)
    {
    switch(GetPlayerVehicleSeat(i))
    {
    case 0:Seat[0] = true;
    case 1:Seat[1] = true;
    case 2:Seat[2] = true;
    case 3:Seat[3] = true;
    case 4:Seat[4] = true;
    }
    }
    }
    }
    }
    }
    for(new j;j<sizeof Seat;j++) if(Seat[j] == false)return j;
    return -1;
    }


    Damit ist es möglich die Vehicle Seats abzufragen.


    Beispiele:


    // Abfrage ob kein Sitzplatz frei ist.
    if(GetFreeVehicleSeatID(vehicleid) == -1)return SendClientMessage(playerid, -1, "Es ist kein Platz mehr frei!");


    //Ausgabe des nächst freien Platzes.
    if(GetFreeVehicleSeatID(vehicleid) != -1)printf("seat:%i",GetFreeVehicleSeatID(vehicleid));

  • Damit ist es möglich die Vehicle Seats abzufragen.


    Besser wäre folgendes:


    stock GetVehicleSeatCount(model) {
    static const scMaxPassengers[] = {
    0x10331113, 0x11311131, 0x11331313, 0x80133301, 0x1381F110, 0x10311103, 0x10001F10, 0x11113311, 0x13113311,
    0x31101100, 0x30001301, 0x11031311, 0x11111331, 0x10013111, 0x01131100, 0x11111110, 0x11100031, 0x11130221,
    0x33113311, 0x11111101, 0x33101133, 0x101001F0, 0x03133111, 0xFF11113F, 0x13330111, 0xFF131111, 0x0000FF3F
    };
    if (model < 400 || model > 611) return -1;
    model -= 400,model = (scMaxPassengers[model >>> 3] >>> ((model & 7) << 2)) & 0xF;
    return (model == 0xF) ? -1 : model;
    }


    stock GetVehicleFreeSeat(veh) {
    new m = GetVehicleModel(veh);
    if(!m) return -1;
    new c = GetVehicleSeatCount(m)+1,bool:seat[0xF],x;
    for(new i; i<MAX_PLAYERS; i++) {
    if(!IsPlayerConnected(i) || IsPlayerNPC(i)) continue;
    if(GetPlayerVehicleID(i) == veh) seat[GetPlayerVehicleSeat(i)] = true,x++;
    }
    if(x >= c) return -1;
    for(new i; i<sizeof seat; i++) if(!seat[i]) return i;
    return -1;
    }


    mfg. :thumbup:


    //Edit: Code editiert

    ast2ufdyxkb1.png


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

  • Hier sind wieder ein paar kleine Schnipsel:


    stock gDate()
    {
    new day,month,year,string[15];
    getdate(year, month, day);
    format(string, sizeof(string), "%d.%d.%d", day, month, year);
    return string;
    }
    stock gTime()
    {
    new hour,minute,second,string[15];
    gettime(hour, minute, second);
    format(string, sizeof(string), "%d:%d:%d", hour, minute, second);
    return string;
    }
    stock ClearChat(playerid)
    {
    for(new x=0;x<13;x++) SendClientMessage(playerid, -1, "");
    return 1;
    }
    stock GetVehicleUserID(vehicleid)
    {
    if(!IsValidVehicle(vehicleid))return 0;
    new template_id = -1;
    for(new x;x<GetMaxPlayers();x++)
    {
    if(!IsPlayerConnected(x) || IsPlayerNPC(x))continue;
    if(GetPlayerState(x) != PLAYER_STATE_DRIVER)continue;
    if(GetPlayerVehicleID(x) == vehicleid){template_id = x; break;}
    }
    if(template_id!=-1)return template_id;
    return 999;
    }


    Die schnipsel sind sehr alt von mir!

  • Hallo,


    Auch wenn es dies schon oft gegeben hat und es vielleicht auch schon oft genug Released wurde.
    Arbeite gerade am Ordnungsamt in meinem Script und hab mir eben die Warnleuchten vom Towtruck gebaut.
    Hier habt ihr den Snippet, kann nützlich sein für manch einen.


    new TowLights[MAX_VEHICLES][4];
    new TowLightsBool[MAX_PLAYERS];
    new Float:TowLightPos[][] = {
    {-0.19590, 2.47680, 0.37230, 0.00000, 0.00000, 0.00000},
    {0.22910, 2.47680, 0.37230, 0.00000, 0.00000, 0.00000},
    {-0.53590, -0.49220, 1.48230, 0.00000, 0.00000, 0.00000},
    {0.54510, -0.49220, 1.48230, 0.00000, 0.00000, 0.00000}
    };


    if(newkeys == KEY_CROUCH)
    {
    if(IsPlayerInAnyVehicle(playerid))
    {
    new VehicleID;
    VehicleID = GetPlayerVehicleID(playerid);
    if(GetVehicleModel(VehicleID) == 525)
    {
    if(!TowLightsBool)
    {
    TowLightsBool[playerid] = true;
    for(new i = 0; i < 4; i++)
    {
    TowLights[VehicleID][i] = CreateObject(19154, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 90.0);
    AttachObjectToVehicle(TowLights[VehicleID][i], VehicleID, TowLightPos[i][0], TowLightPos[i][1], TowLightPos[i][2], TowLightPos[i][3], TowLightPos[i][4], TowLightPos[i][5]);
    }
    SendClientMessage(playerid, 0xFFFF00FF, "INFO: Du hast die Warnleuchten eingeschaltet!");
    }
    else
    {
    TowLightsBool[playerid] = false;
    for(new i = 0; i < 4; i++)
    {
    DestroyObject(TowLights[VehicleID][i]);
    }
    SendClientMessage(playerid, 0xFFFF00FF, "INFO: Du hast die Warnleuchten ausgeschaltet!");
    }
    }
    }
    }



    Have fun.

    Einmal editiert, zuletzt von Warren ()

  • Have fun.


    Wenn du das compilt hast...solltest du eigentlich Warnings bzw Errors bekommen...


    Besser wäre es so:



    new TowLights[MAX_VEHICLES][4],TowLightsBool[MAX_PLAYERS char];
    stock const Float:TowLightPos[][] = {
    {-0.19590, 2.47680, 0.37230, 0.00000, 0.00000, 0.00000},
    {0.22910, 2.47680, 0.37230, 0.00000, 0.00000, 0.00000},
    {-0.53590, -0.49220, 1.48230, 0.00000, 0.00000, 0.00000},
    {0.54510, -0.49220, 1.48230, 0.00000, 0.00000, 0.00000}
    };
    if(newkeys & KEY_CROUCH)
    {
    if(!IsPlayerInAnyVehicle(playerid)) return 1;
    new veh = GetPlayerVehicleID(playerid);
    if(GetVehicleModel(veh) != 525) return 1;
    TowLightsBool{playerid} = !TowLightsBool{playerid};
    if(TowLightsBool{playerid}) {
    for(new i; i < 4; i++) {
    TowLights[veh][i] = CreateObject(19154, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 90.0);
    AttachObjectToVehicle(TowLights[veh][i], veh, TowLightPos[i][0], TowLightPos[i][1], TowLightPos[i][2], TowLightPos[i][3], TowLightPos[i][4], TowLightPos[i][5]);
    }
    return SendClientMessage(playerid, 0xFFFF00FF, "INFO: Du hast die Warnleuchten eingeschaltet!");
    }
    for(new i; i < 4; i++) DestroyObject(TowLights[veh][i]);
    return SendClientMessage(playerid, 0xFFFF00FF, "INFO: Du hast die Warnleuchten ausgeschaltet!");
    }


    mfg. :thumbup:

    ast2ufdyxkb1.png


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

  • Wenn du das compilt hast...solltest du eigentlich Warnings bzw Errors bekommen...


    Ich möchte jetzt nichts Kritisieren, aber du hast regelrecht nur die Variablen Konstant gemacht und den Code verkürzt.
    Wieso sollte ich Errors bekommen? Das ist nur ein Snippet kein voller Code.


    Meine Persönliche meinung zu Sparen an Platz ist anders.


    Ich mag es nicht wenn alles gleich in eine Zeile geklatscht wird wie der loop: for(new i = 0; i < 4; i++) { Destroy(...); }
    Wirkt mir auf dauer einfach so zusammen gequetscht :P



    IsPlayerInAnyVehicle sollte z.B im Else zurückgeben das man nicht im Fahrzeug sitzt.
    Natürlich kann man GetPlayerVehicleId gleich an die Variable übergeben, find ich aber unübersichtlicher.
    Und zu dem anderen halt immer noch die Meinung, zuviel kürzen find ich unübersichtlich.

  • Du hast da [playerid] vergessen, und dann funktioniert das ganze nicht mehr, sondern du erhälst einen Error bzw. Warning.
    Das muss so aussehen: if(!TowLightsBool[playerid])

  • Funktioniert auch ohne das man die Variable in eine Klammer setzt.


    Das muss so aussehen:


    Richtig.


    Zudem fragt man keys nicht mit == ab, sondern mit &.


    Desweiteren sind char Arrays besonders bei bools wesentlich Speicher sparender.


    Und ja auch ein konstantes Array ist besser :)


    mfg. :rolleyes:

    ast2ufdyxkb1.png


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

  • Du hast da [playerid] vergessen, und dann funktioniert das ganze nicht mehr, sondern du erhälst einen Error bzw. Warning.
    Das muss so aussehen: if(!TowLightsBool[playerid])


    Oh stimmt, hab ich ja jetzt garnicht drauf geachtet. Hatte gedacht Kaliber meinte damit den Operator.


    Ja, hatte ich vergessen weil ich den Code nochmal editiert hatte im Forum. Kommt vor.


    Du hast da [playerid] vergessen, und dann funktioniert das ganze nicht mehr, sondern du erhälst einen Error bzw. Warning.
    Das muss so aussehen: if(!TowLightsBool[playerid])



    Right,
    Ja, konstante variable sind besser, wenn man sie nicht im Code verändern möchte.
    In SAMP wusste ich bis jetzt noch nicht das man ein bools in char Arrays verwenden kann.