Nützliche Codeschnipsel

  • In diesem Thread können nützliche Codeschnipsel gepostet werden, die man immer mal wieder benötigt.
    Es wäre toll wenn man dazu ein kleines Verwendungsbeispiel (muss kein komplettes Script sein) schreiben würde, dann wird es leichter zu verstehen wie man es verwendet.
    Hier bitte keine Scriptfragen stellen!
    ------------------------------------------------------------------------------------------------------------------------


    Animierte Kamera


    In diesem Beispielscript wird gezeigt wie man durch Verwendung eines Timers mehr oder weniger weiche Kamerabewegungen von Punkt zu Punkt hinbekommt.


    #include <a_samp>


    enum COORD {
    Float:coord_x,
    Float:coord_y,
    Float:coord_z
    }


    enum CAMMOVEMENT {
    steps,
    currentstep,
    Float:amount_x,
    Float:amount_y,
    Float:amount_z,
    Float:look_x,
    Float:look_y,
    Float:look_z,
    CameraMoveTimerID
    }


    forward Float:GetDistanceBetweenPoints(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2);
    forward CameraMoveTimer(playerid);


    new Float:gPlayerCameraPos[MAX_PLAYERS][COORD];
    new Float:gPlayerCamMovement[MAX_PLAYERS][CAMMOVEMENT];


    main() {


    }


    //-------------------------------------------------------------------


    public OnGameModeInit() {
    AddPlayerClass(0,2040.2158,1355.9232,10.6719,267.2625,0,0,0,0,0,0);
    return 1;
    }


    //-------------------------------------------------------------------


    public OnPlayerSpawn(playerid) {
    SetPlayerCameraPosEx(playerid, 2052.1799,1384.5262,10.6719,2040.2158,1355.9232,10.6719);
    MoveCamera(playerid, 2053.9204,1348.7130,18.6719, 2040.2158,1355.9232,10.6719, 0.2);
    return 1;
    }


    //-------------------------------------------------------------------


    stock MoveCamera(playerid, Float:dest_x, Float:dest_y, Float:dest_z, Float:lookat_x, Float:lookat_y, Float:lookat_z, Float:speed) {
    new Float:distance;

    distance = GetDistanceBetweenPoints(gPlayerCameraPos[playerid][coord_x],
    gPlayerCameraPos[playerid][coord_y],
    gPlayerCameraPos[playerid][coord_z],
    dest_x,
    dest_y,
    dest_z);

    gPlayerCamMovement[playerid][steps] = floatround(distance / speed);
    gPlayerCamMovement[playerid][currentstep] = 0;

    gPlayerCamMovement[playerid][amount_x] = (dest_x - gPlayerCameraPos[playerid][coord_x]) / gPlayerCamMovement[playerid][steps];
    gPlayerCamMovement[playerid][amount_y] = (dest_y - gPlayerCameraPos[playerid][coord_y]) / gPlayerCamMovement[playerid][steps];
    gPlayerCamMovement[playerid][amount_z] = (dest_z - gPlayerCameraPos[playerid][coord_z]) / gPlayerCamMovement[playerid][steps];
    gPlayerCamMovement[playerid][look_x] = lookat_x;
    gPlayerCamMovement[playerid][look_y] = lookat_y;
    gPlayerCamMovement[playerid][look_z] = lookat_z;

    gPlayerCamMovement[playerid][CameraMoveTimerID] = SetTimerEx("CameraMoveTimer", 50, 1, "i", playerid);
    return 1;
    }


    //-------------------------------------------------------------------


    stock SetPlayerCameraPosEx(playerid, Float:cam_x, Float:cam_y, Float:cam_z, Float:lookat_x, Float:lookat_y, Float:lookat_z) {
    SetPlayerCameraPos(playerid, cam_x, cam_y, cam_z);
    SetPlayerCameraLookAt(playerid, lookat_x, lookat_y, lookat_z);

    gPlayerCameraPos[playerid][coord_x] = cam_x;
    gPlayerCameraPos[playerid][coord_y] = cam_y;
    gPlayerCameraPos[playerid][coord_z] = cam_z;

    return 1;
    }


    //-------------------------------------------------------------------


    stock Float:GetDistanceBetweenPoints(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2) {
    return floatsqroot(floatpower(x1 - x2, 2) + floatpower(y1 - y2, 2) + floatpower(z1 - z2, 2));
    }


    //-------------------------------------------------------------------


    public CameraMoveTimer(playerid) {
    if (gPlayerCamMovement[playerid][currentstep] <= gPlayerCamMovement[playerid][steps] - 1) {
    gPlayerCameraPos[playerid][coord_x] = gPlayerCameraPos[playerid][coord_x] + gPlayerCamMovement[playerid][amount_x];
    gPlayerCameraPos[playerid][coord_y] = gPlayerCameraPos[playerid][coord_y] + gPlayerCamMovement[playerid][amount_y];
    gPlayerCameraPos[playerid][coord_z] = gPlayerCameraPos[playerid][coord_z] + gPlayerCamMovement[playerid][amount_z];

    SetPlayerCameraPos(playerid, gPlayerCameraPos[playerid][coord_x], gPlayerCameraPos[playerid][coord_y], gPlayerCameraPos[playerid][coord_z]);
    SetPlayerCameraLookAt(playerid, gPlayerCamMovement[playerid][look_x], gPlayerCamMovement[playerid][look_y], gPlayerCamMovement[playerid][look_z]);

    gPlayerCamMovement[playerid][currentstep]++;
    } else {
    KillTimer(gPlayerCamMovement[playerid][CameraMoveTimerID]);
    }

    return 1;
    }


    Um es in einen Gamemmode zu verwenden ist folgendes zu tun:

    • Zeilen 3 bis 25 oben in den Gamemode, unter den #include Anweisungen einfügen
    • Zeilen 48 bis 108 an das Ende vom Gamemode einfügen

    Dann könnt ihr folgende Funktionen benutzen:


    SetPlayerCameraPosEx
    stock SetPlayerCameraPosEx(playerid, Float:cam_x, Float:cam_y, Float:cam_z, Float:lookat_x, Float:lookat_y, Float:lookat_z)


    Eine Kombination von SetPlayerCameraPos() und SetPlayerCameraLookat(). Diese Funktion muss vor MoveCamera() aufgerufen werden, da hier die Kameraposition in einer Variable gespeichert wird, weiln diese später benötigt wird (es gibt keine GetCameraPos Funktion)


    MoveCamera
    stock MoveCamera(playerid, Float:dest_x, Float:dest_y, Float:dest_z, Float:lookat_x, Float:lookat_y, Float:lookat_z, Float:speed)


    Initialisiert einige Variablen und richtet einen Timer ein, der die Kamera letztendlich bewegt. Die lookat_* Parameter werden verwendet um die Kamera auf eine Koordinate zu richten, während diese bewegt wird.

    Intel Xeon X5670 Hexacore @ 4.5 GHz - 48GB Triple Channel DDR3 - GeForce RTX 2070 Super - Asus P6T Deluxe V1

    Mainboard 11 Jahre, CPU 10 Jahre alt - old but gold!

    Einmal editiert, zuletzt von Goldkiller ()

  • Also, mit dem Command kannst du in den /afk Modus gehen, oder dein Auto /abschliessen.


    Unter public OnVehicleSpawn(vehicleid) Dass einfügen:
    SetVehicleParamsForPlayer(vehicleid,0,0); // Damit Spawnt das Fahrzeug wieder offen für alle.


    Unter public OnPlayerCommand(playerid, cmdtext []) dass einfügen:
    if (strcmp(cmdtext, "/zu", true)==0 || strcmp(cmdtext, "/lock", true) == 0) //
    {
    if(IsPlayerInAnyVehicle(playerid))
    {
    new Statu ;
    Statu=GetPlayerState(playerid);
    new vehicleid = GetPlayerVehicleID(playerid);
    if(Statu!=PLAYER_STATE_DRIVER)
    {
    SendClientMessage(playerid,COLOR_GREY,"Nur der Fahrer kann abschliessen!");
    return 1;
    }
    new i;
    for(i=0;i<MAX_PLAYERS;i++)
    {
    if(i != playerid)
    {
    SetVehicleParamsForPlayer(vehicleid,i, 0, 1);
    }
    }
    new Float:X;
    new Float:Y;
    new Float:Z;
    SendClientMessage(playerid, COLOR_GREEN, "Fahrzeug abgeschlossen");
    GetPlayerPos(playerid,X,Y,Z);
    PlayerPlaySound(playerid,1056,X,Y,Z);
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "Du kannst nur in einem Auto ein Fahrzeug abschliessen!");
    }
    return 1;
    }



    if (strcmp(cmdtext, "/auf", true) == 0 || strcmp(cmdtext, "/unlock", true) == 0)
    {
    if(IsPlayerInAnyVehicle(playerid))
    {
    new Status ;
    Status = GetPlayerState(playerid);
    new vehicleid = GetPlayerVehicleID(playerid);
    if(Status!=PLAYER_STATE_DRIVER)
    {
    SendClientMessage(playerid,COLOR_RED,"Nur der Fahrer hat den Schluessel zum aufschliessen!");
    return 1;
    }
    new i;
    for(i=0;i<MAX_PLAYERS;i++)
    {
    SetVehicleParamsForPlayer(vehicleid,i, 0, 0);
    }
    SendClientMessage(playerid, COLOR_GREEN, "Fahrzeug aufgeschlossen");
    new Float:X;
    new Float:Y;
    new Float:Z;
    GetPlayerPos(playerid,X,Y,Z);
    PlayerPlaySound(playerid,1057,X,Y,Z);
    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Du bist in keinem Fahrzeug!");
    }
    return 1;
    }
    Mit /auf und /unlock kannste aufschliessen mit /zu und /lock abschliessen.


    So: Afk Command:
    Unter public OnPlayerCommandText(playerid, cmdtext []) dass einfügen:
    if(strcmp(cmdtext, "/afk", true) == 0) {
    new str[256], pname[256]; GetPlayerName(playerid, pname, 256);
    format(str, 256, "*%s ist afk!", pname, cmdtext[4]);
    SendClientMessage(playerid, COLOR_RED, "Um dich Zurück zumelden, tippe /back");
    SendClientMessageToAll(0x4682B4AA, str);
    TogglePlayerControllable(playerid, 0);
    return 1;
    }
    if(strcmp(cmdtext, "/back", true) == 0) {
    new str[256], pname[256]; GetPlayerName(playerid, pname, 256);
    format(str, 256, "*%s ist von afk zurueck!", pname, cmdtext[4]);
    SendClientMessageToAll(0x4682B4AA, str);
    GameTextForPlayer(playerid,"~w~willkommen zurueck. :)!",2500,3);
    TogglePlayerControllable(playerid, 1);
    return 1;
    }
    Mit /afk kannst du dich abmelden, mit /back zurück.


    Wenn ihr die Farben nocht nicht habt, einfach ändern oder Definieren.


    #define COLOR_FARBENNAME Farben Hexcode am Anfang eurer Gamemode.


    Bei Fehlern, bitte Posten, anders kann ich es nicht Korrigieren. ;)

    Einmal editiert, zuletzt von ~Driver~ ()

  • Zwei Dinge:

    • Bitte in Zukunft [ pwn] [ /pwn] Tags für Quellcode benutzen (hab ich jetzt gemacht, schaus dir am besten mal an)
    • Bitte, bitte, bitte Code einrücken, so ist ungemein schwer lesbar :(

    Intel Xeon X5670 Hexacore @ 4.5 GHz - 48GB Triple Channel DDR3 - GeForce RTX 2070 Super - Asus P6T Deluxe V1

    Mainboard 11 Jahre, CPU 10 Jahre alt - old but gold!

  • Danke ;)
    Btw ist das kein kompletter Gamemode oder ein Filterscript, daher würd ich vorschlagen das kommt hier rein :>

    Intel Xeon X5670 Hexacore @ 4.5 GHz - 48GB Triple Channel DDR3 - GeForce RTX 2070 Super - Asus P6T Deluxe V1

    Mainboard 11 Jahre, CPU 10 Jahre alt - old but gold!

  • Ein einfaches Script welches die InGame Zeit automatisch wechselt.
    Find ich persöhnlich besser als dass es immer 16Uhr Ingame ist oder ein Admin die Zeit wechselt :P .


    Über Main()
    new Time=12;
    forward TimeUpdate();



    public OnGameModeInit()

    SetTimer("TimeUpdate",1000*60,1); //60Sekunden
    SetWorldTime(Time); //Ja 'Time'.



    public TimeUpdate() {
    Time++;
    SetWorldTime(Time);
    if(Time>=24) {
    Time=0;
    }
    return 1;
    }


  • stock PlayerName(playerid)
    {
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, MAX_PLAYER_NAME);
    return name;
    }
    ---------------
    stock IsPlayerNameAvaiable(const string[])
    {
    for(new i=0;i<MAX_PLAYERS;i++)
    {
    if(IsPlayerConnected(i))
    {
    new tmp[256];
    strmid(tmp, PlayerName(i), 0, strlen(string), sizeof(tmp));
    if(strcmp(string, tmp, true, strlen(string)+1)==0) return i;
    }
    }
    return -1;
    }


    ----------------------


    stock IsNumeric(const string[])
    {
    for (new i = 0, j = strlen(string); i < j; i++)
    {
    if (string[i] > '9' || string[i] < '0') return -1;
    }
    return 0;
    }


    klein aber fein

    Einmal editiert, zuletzt von MadniX ()

  • eine meiner ersten funktionen :D :
    PlaySoundForAll(soundid);
    PlaySoundForAll(soundid)
    {
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if (IsPlayerConnected(i))
    {
    new Float:x,Float:y,Float:z;
    GetPlayerPos(i, x, y, z);
    PlayerPlaySound(i, soundid, x, y, z);
    }
    }
    }


    nicht sehr ausgereift, aber meine zwecke hats erfüllt:
    array_search(needle, haystack[], size);
    (sucht im array haystack der größe size nach dem integerwert needle und gibt den indexwert zurück)
    stock array_search(needle, haystack[], size)
    {
    new result = -1;
    for(new i=0; i<size; i++) {
    if( needle == haystack[i] ) result = i;
    }
    return result;
    }


    meine neuste kreation xD :
    RemovePlayerWeapon(playerid, weaponid);
    (dank geht hier an mabako, an dessen DropWeapon script ich mich orientiert hatte)
    RemovePlayerWeapon(playerid, weaponid)
    {
    new weaponslots[14][2];

    for(new i=0; i<13; i++) {
    GetPlayerWeaponData(playerid, i, weaponslots[i][0], weaponslots[i][1]);
    }
    ResetPlayerWeapons(playerid);
    for(new i=0; i<13; i++) {
    if( weaponslots[i][0] != 0 && weaponslots[i][0] != weaponid) GivePlayerWeapon(playerid, weaponslots[i][0], weaponslots[i][1] );
    }
    }


    das wars erstmal....


    MfG Eightball

  • Als ich bemerkte, dass memcpy eigenartige Vorstellungen von der Zellengröße hat, habe ich mir schnell eine eigene Funktion gemacht.
    strcpy: Kopiert source nach dest. Falls dest nicht groß genug ist, wird der überstehende Rest abgeschnitten.

    stock strcpy(dest[], const source[], maxlength=sizeof dest)
    { strmid(dest, source, 0, strlen(source), maxlength); }

    ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬


    Da mir die explode-Funktion aus PHP sehr gefehlt hat, habe ich sie nachgemacht. Es gibt noch eine andere im offiziellen SA-MP Forum, die auch Anführungszeichen unterstützt und darin eingeschlossene Strings als ein Wort betrachtet, damit kann meine Funktion leider nicht dienen. Dafür ist bei meiner die Größe des Arrays sowie auch die Länge der einzelnen Teile unabhängig wählbar. (Damals hatte ich noch kein strcpy, daher ist alles noch mit strmid gemacht)
    explode: Teilt ensemble an den Stellen, an denen separator vorkommt und returnt alle Teile in pieces.

    stock explode(const separator[], const ensemble[], pieces[][], piecesize=sizeof pieces[])
    {
    new i, p1, p2;
    new addend;

    p1 = strfind(ensemble, separator);
    p2 = strfind(ensemble, separator, false, p1+1);
    addend = strlen(separator);

    if(p1 == -1)
    { strmid(pieces[0], ensemble, 0, piecesize, piecesize); }
    else
    {
    strmid(pieces[0], ensemble, 0, p1, piecesize);

    for(i=1; p2>-1; i++, p1=p2, p2=strfind(ensemble, separator, false, p1+1))
    { strmid(pieces[i], ensemble, p1+addend, p2, piecesize); }

    strmid(pieces[i], ensemble, p1+addend, strlen(ensemble), piecesize);
    }
    }

    ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬


    Nicht lange nach explode brauchte ich auch das Gegenstück dazu. Hier ist leider ein Bytemaximum vorhanden, das man ja aber einfach erweitern kann.
    implode: Nimmt die Teile aus pieces und setzt sie - jeweils getrennt durch separator - zu einem String zusammen. (Umkehrung von explode)

    stock implode(const separator[], pieces[][], piececount=sizeof pieces)
    {
    new i;
    new ensemble[256] = "";

    for(i=0; i<piececount; i++)
    {
    if(!strlen(pieces[i]))
    { continue; }

    format(ensemble, sizeof(ensemble), "%s%s%s", ensemble, pieces[i], separator);
    }

    strdel(ensemble, strlen(ensemble)-strlen(separator), strlen(ensemble));
    return ensemble;
    }

    ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬


    So, das war's für's Erste. Vielleicht veröffentliche ich irgendwann noch ein paar andere Funktionen.
    Ich kann nicht garantieren, dass alle Funktionen in allen Fällen einwandfrei funktionieren - natürlich sollten sie, aber Fehler kann es immer mal geben. Würde mich freuen, wenn ihr mir Probleme oder Fehler berichtet, falls ihr welche findet.

  • Hey hättet ihr vielleicht noch mehr "Schnipsel" ? ^^
    Wollte ein Reallife Server machen und bräuchte noch viele viele Sachen... bin neu und ich habe keine Ahnung wie das geht! ;)
    Postet mal was was man fürn Reallife Server braucht z.B. den Tankscript oder so... schreibt aber auch dazu wo ich das einfügen soll! ;)
    Wäre auch gut wenn ihr mir sagt wie ich welche Skins rcon passwort schütze... und Driver kannst du mir mal sagen wie und wo ich das im script einfügen soll? Ich habe das da eingefügt aber dann kommen fehlermeldungen wenn ich F5 drücke!
    Freue mich auf eure postings! :)


    Mit freundlichen Grüßen
    MGW1989

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Hey Driver du hast oben ja nen code zum auf und zuschliessen von vehicles reingestellt...
    wenn ich das ins script einfüge kommt die meldung "number of arguments does not match definition"... das wird zu "SetVehicleParamsForPlayer(vehicleid,0,0); // Damit Spawnt das Fahrzeug wieder offen für alle." gesagt!


    Was mus ich tun damit das nicht kommt?

  • Mit diesen Code könnt ihr z.B alle heilen(Müsste aber dann als Admin Command erstellt werden)

    public Healall(playerid,Float:health)
    {
    for (new i = 0, j = MAX_PLAYERS; i < j; i ++)
    {
    if (IsPlayerConnected(i)) SetPlayerHealth(playerid,Float:health);
    }
    }


    Ihr müsst dann in euer CMD das einfügen:



    Healall(playerid,100);//könnt auch 200 machen 100.0 were sicherer

  • hallo, ich zeige euch mal wie das mit dem CP-System geht!



    Wer fragen hat, der frage

    Einmal editiert, zuletzt von Tobsi ()

  • hehe lol.
    Das mit denn finden und so hab ich geschrieben nur mir geholfen hast du :D

  • Dieser Code ist auch nicht schlecht:
    Das fügt ihr in OnPlayerCommandText ein.

    if(strcmp(cmd, "/gun13", true) == 0) {
    IsPlayerAdmin(playerid)){
    //Hier euer Command variable
    }
    else
    {
    SendClientMessage(playerid,COLOR_RED,"Der Text was stehen soll,der wo nicht Admin ist");
    }
    return 1;
    }


    Und das hier über main()



    #define COLOR_RED 0xAA3333AA


    Damit könnt ihr Command erstellen die nur für Admins sind!
    Z.B.
    Zum Godmode machen oder sonstige sachen :)


    MfG



    Michael

  • Vehicle Chat



    if(strcmp(cmd, "/vc", true) == 0)
    {
    new string[256], sendername[24];
    GetPlayerName(playerid, sendername, sizeof(sendername));
    new length = strlen(cmdtext);
    while ((idx < length) && (cmdtext[idx] <= ' '))
    {
    idx++;
    }
    new offset = idx;
    new result[64];
    while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
    {
    result[idx - offset] = cmdtext[idx];
    idx++;
    }
    result[idx - offset] = EOS;
    if(!strlen(result)) return SendClientMessage(playerid, COLOR_RED, "KORREKTUR: /vc [text]");
    if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, COLOR_RED, "Du musst in einem Fahrzeug sein!");
    format(string, sizeof(string), "(( Vehicle Chat(%s): %s ))", sendername, result);
    for(new i = 0; i < MAX_PLAYERS; i ++)
    {
    if(IsPlayerConnected(i))
    {
    if(IsPlayerInVehicle(i, GetPlayerVehicleID(playerid)))
    {
    SendClientMessage(i,COLOR_BLUE, string);
    }
    }
    }
    return 1;
    }

    [GER] Bedman's Fun Server
    by You-Hoster.de
    IP: 78.111.64.126:2004


    VERREIST BIS ZUM ENDE DER FERIEN!!



  • Bei mir kommen da einige Errors...wenn ich das so umstell, dass es meiner meinung nach stimmt, kommt: "...(269) : error 029: invalid expression, assumed zero".


    if (strcmp("/meinhaus", cmdtext, true) == 0)
    {
    IsPlayerAdmin(playerid);
    {
    SetPlayerPos(playerid,1248.9946,-806.2303,84.1406);
    }
    else
    {
    SendClientMessage(playerid, rot, "Du bist kein Admin!");
    }
    return 1;
    }


    Der hat irgwie ein Problem mit dem "else"



    EDIT: hat sich geklärt...ich hatte ein return zu viel drin


    Ich scripte NICHT mehr, ich möchte mit NIEMANDEM einen Server aufmachen habe auch NICHTS mehr mit LoH zu tun, also lasst es mit den PNs!

    Einmal editiert, zuletzt von M4rciii ()

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen