[SAMMELTHREAD] Kleine Scripting Fragen

Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
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
  • Beitrag von Dr. Frauenarzt ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: Fehler Gefunden. ().
  • Warum kommt bei /makeleader 0 1 dass der Befehl nicht existiert?
    ocmd:makeleader(playerid, params[])
    {
    new f_ID, pID, String[512];
    if(Spieler[playerid][pAdmin] < 5)return ShowFehler(playerid, NO_ADMIN);
    if(sscanf(params, "ud", pID, f_ID))return ShowInfo(playerid, "Benutze: /makeleader [Spieler/ID] [FraktionID]");
    if(!IsPlayerConnected(pID))return ShowFehler(playerid, "Der Spieler ist nicht auf dem Server!");
    if(!Spieler[pID][pLoggedIn])return ShowFehler(playerid, "Der Spieler ist nicht eingeloggt!");
    if(Spieler[pID][pFraktion] != 0)return ShowFehler(playerid, "Der Spieler ist bereits in einer Fraktion!");
    if(f_ID == 0) {
    format(String, sizeof(String), "Du hast den Spieler %s als Leader entlassen!", Spieler[pID][pName]);
    ShowAdmin(playerid, String);
    format(String, sizeof(String), "Der %s %s hat dich als Leader entlassen!", GetAdminRangName(Spieler[playerid][pAdmin]), Spieler[playerid][pName]);
    ShowInfo(pID, String);
    Spieler[pID][pFraktion] = 0;
    Spieler[pID][pFraktionRang] = 0;
    } else if(f_ID != 0){
    format(String, sizeof(String), "Du hast den Spieler %s zum Leader der %s gemacht!", Spieler[pID][pName], Fraktion[f_ID][fName]);
    ShowAdmin(playerid, String);
    format(String, sizeof(String), "Der %s %s hat dich zum Leader der %s gemacht!", GetAdminRangName(Spieler[playerid][pAdmin]), Spieler[playerid][pName], Fraktion[f_ID][fName]);
    ShowInfo(pID, String);
    Spieler[pID][pFraktion] = f_ID;
    Spieler[pID][pFraktionRang] = 6;
    }
    return 1;
    }

  • @Chiller.502



    So Versucht?

  • Warum kommt bei /makeleader 0 1 dass der Befehl nicht existiert?

    Das kommt vermutlich, weil ein RuneTime Error aufgetreten ist.


    Um diesen angezeigt zu bekommen und mehr Infos dazu zu erhalten, nutze crashdetect.


    Dann wird dir im Log genau angezeigt, wo der Fehler ist ;)

    ast2ufdyxkb1.png


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


  • Hey,


    Habe mal eine frage,



    Wen ich:
    Spieler[playerid][pFraktion] == 17


    Hinzufüge kann der Compeiler den Code nicht compeilen warum? bzw reagiert er nicht mehr

  • Hinzufüge kann der Compeiler den Code nicht compeilen warum? bzw reagiert er nicht mehr

    Vermutlich weil die Zeile zu lang ist.


    Aber lager das doch aus:


    ast2ufdyxkb1.png


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

  • Danke Klappt super.


    if(GetVehicleModel(GetPlayerVehicleID(playerid)) == 514 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 515) && GetVehicleModel(GetVehicleTrailer(vehicleid)) == 584)


    Möchte nur anfragen ob er das Fahrzeug 514 oder 515 hat und den Trailer 584.


    C:\Users\Patrick\Desktop\Reallife\gamemodes\Reallife.pwn(19559) : error 029: invalid expression, assumed zero
    C:\Users\Patrick\Desktop\Reallife\gamemodes\ReallifeReallife.pwn(19559) : warning 215: expression has no effect
    C:\Users\Patrick\Desktop\Reallife\gamemodes\Reallife.pwn(19559) : error 001: expected token: ";", but found ")"
    C:\Users\Patrick\Desktop\Reallife\gamemodes\Reallife.pwn(19559) : error 029: invalid expression, assumed zero
    C:\Users\Patrick\Desktop\Reallife\gamemodes\Reallife.pwn(19559) : fatal error 107: too many error messages on one line


    Ich komm auf den Fehler nicht ich änder das die ganze zeit und die fehler beleiben..

  • Das kommt vermutlich, weil ein RuneTime Error aufgetreten ist.
    Um diesen angezeigt zu bekommen und mehr Infos dazu zu erhalten, nutze crashdetect.


    Dann wird dir im Log genau angezeigt, wo der Fehler ist ;)

    Code
    [19:32:28] | ID: 1 | Name: Los Santos Police Department |
    [19:33:03] [connection] 84.159.233.205:58663 requests connection cookie.
    [19:33:04] [connection] incoming connection: 84.159.233.205:58663 id: 0
    [19:33:04] [join] Chiller has joined the server (0:84.159.233.205)
    [19:33:16] [debug] Run time error 4: "Array index out of bounds"
    [19:33:16] [debug]  Attempted to read/write array element at index 1 in array of size 1
    [19:33:16] [debug] AMX backtrace:
    [19:33:16] [debug] #0 0000c734 in public ocmd_makeleader (0, 89004) in SANL.amx
    [19:33:16] [debug] #1 native CallLocalFunction () in samp03svr
    [19:33:16] [debug] #2 00006200 in public OnPlayerCommandText (0, 88940) in SANL.amx
  • [19:33:16] [debug] Run time error 4: "Array index out of bounds"
    [19:33:16] [debug] Attempted to read/write array element at index 1 in array of size 1

    Da, das ist dein Fehler :)


    Wie hast du denn Fraktion deklariert? ;)



    Ich komm auf den Fehler nicht ich änder das die ganze zeit und die fehler beleiben..

    Dann schreib es doch mal ordentlich ^^


    Oder lager es aus.


    C
    new veh = GetPlayerVehicleID(playerid);
    new trailer = GetVehicleTrailer(vehicleid);
    new model = GetVehicleModel(veh);
    
    
    if((model == 514 || model == 515) && GetVehicleModel(trailer) == 584)

    ast2ufdyxkb1.png


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

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Da, das ist dein Fehler :)
    Wie hast du denn Fraktion deklariert? ;)



    Dann schreib es doch mal ordentlich ^^
    Oder lager es aus.


    C
    new veh = GetPlayerVehicleID(playerid);
    new trailer = GetVehicleTrailer(vehicleid);
    new model = GetVehicleModel(veh);
    
    
    if((model == 514 || model == 515) && GetVehicleModel(trailer) == 584)

    enum FraktionDaten {
    fID,
    fName[64],
    Float:fSpawnX,
    Float:fSpawnY,
    Float:fSpawnZ,
    Float:fSpawnR,
    fSpawnInt,
    fSpawnVWorld,
    fMaxMember,
    fRang1[32],
    fRang2[32],
    fRang3[32],
    fRang4[32],
    fRang5[32],
    fRang6[32],
    fKasse,
    };
    new Fraktion[MAX_FRAKTIONEN][FraktionDaten];

  • #define MAX_FRAKTIONEN 1

    Okay, alles klar :)


    Das Problem ist du hast einen index.


    Also schauen wir uns das mal an:



    new x[1];
    x[0] = 5; //Das ist kein Problem, denn ein Array fängt bei 0 an
    x[1] = 3; //Das geht nicht...weil wir nur 1nen Index zur Verfügung haben und zwar die 0


    Du versuchst aber, genau das untere auf x[1] zuzugreifen.


    Die Lösung ist ganz einfach, du musst entweder überall Fraktion[f_ID-1] verwenden oder direkt nur 0 als Fraktion eingeben, da sich das ja auf den Index bezieht :)

    ast2ufdyxkb1.png


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

  • Hallo, ich will ein System erstellen, welches einen Spiel verhindern das ein Spieler bunnyhoppt (also rennt und dabei gleichzeitig springt).
    Das (filter)script sieht momentan so aus:



    #include <a_samp>



    forward KillTimerSprung(playerid);
    forward FunktionInSprung(playerid);



    #define PRESSED(%0) (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))



    new InSprung[MAX_PLAYERS] = 0;
    new TimerIDSprung;



    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    new Float:vx,Float:vy,Float:vz;
    GetPlayerVelocity(playerid,vx,vy,vz);
    if (PRESSED(KEY_JUMP) && (vy > 0.01 || vy <-0.01 || vx > 0.01 || vx <-0.01) && IsPlayerInAnyVehicle(playerid) == 0 && InSprung[playerid] == 0)
    {
    if(vz > 0.01 || vz < -0.01) return 1;
    InSprung[playerid] = 1;
    TimerIDSprung = SetTimerEx("FunktionInSprung",1,true,"i",playerid);
    }
    return 1;
    }



    public KillTimerSprung(playerid)
    {
    InSprung[playerid] = 0;
    return 1;
    }



    public FunktionInSprung(playerid)
    {
    new animlib[32];
    new animname[32];
    new Float:vx,Float:vy,Float:vz;
    GetPlayerVelocity(playerid,vx,vy,vz);
    if(vz < -0.5)
    {
    KillTimer(TimerIDSprung);
    SetTimerEx("KillTimerSprung",1000,false,"i",playerid);
    return 1;
    }
    GetAnimationName(GetPlayerAnimationIndex(playerid),animlib,32,animname,32);
    if(!strcmp(animname,"JUMP_LAND") || !strcmp(animname,"FALL_LAND"))
    {
    KillTimer(TimerIDSprung);
    ClearAnimations(playerid,1);
    ApplyAnimation(playerid,"ped","FALL_land",4.1,0,1,1,0,0,1);
    SetTimerEx("KillTimerSprung",1000,false,"i",playerid);
    }
    return 1;
    }


    Nun hab ich das problem, dass das system auch den spieler in eine animation versetzt, wenn er springt und normal läuft (ohne zu sprinten) und man nach einmaligem springen (mit sprinten) in der animation ist (besser wären 3x hintereinander) hoffe jemand kann mir helfen

  • hoffe jemand kann mir helfen

    Du machst es dir viel zu kompliziert, schreib es einfach nur so:


    ast2ufdyxkb1.png


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

  • //EDIT: Hat sich erledigt, habe eine effiziente Loesung gefunden
    Ich nutze nun fuer jede Teamvariable, egal ob Bett, Farbe etc. ein eigenes Array, damit geht das deutlich simpler.
    Die Array Variante klappt prima.



    So, habe folgende Frage.
    Habe aktuell ein Kommando mit welchem ich ein Bett eines gegnerischen Teams vernichten kann, d.h. dass die BettID != gPlayerTeamSelection[playerid] ist.
    Dabei checke ich, dass das Bett nicht das Bett des eigenen Teams ist, und das Bett nicht bereits zuvor vernichtet wurde.


    Dabei habe ich aktuell diesen fetten klumpen, und den wuerde ich gerne reduzieren.



    Da habe ich versucht das ganze nun zu reduzieren, indem ich fuer die Bedobjekte ein Array erstelle, und da habe ich mir dann eine Funktion gebaut IsPlayerInRangeOfBed.



    C
    BedArray[FIRST_TEAM]= CreateObject(1794,268.1000100,1881.5000000,-31.4000000,0.0000000,0.0000000,0.0000000); //object(low_bed_3) (1) // Team Grey
    BedArray[SECOND_TEAM]= CreateObject(1798,434.5000000,2546.8999000,15.2000000,0.0000000,0.0000000,268.0000000); //object(swank_bed_1) (1) // Team Blue
    BedArray[THIRD_TEAM]= CreateObject(1801,-773.5999800,2421.3000000,156.1000100,0.0000000,0.0000000,0.0000000); //object(swank_bed_4) (1) // Team Red





    Aber geht das effizienter? Sollte ich die BED_STATEs eventuell auch in ein Array packen? Wie sollte das dann aufgebaut sein das Array? Eventuell ein Monodimensionales Array, bspw. BedStates[TEAMSIZE]?



    Das ist mein jetziger Ansatz, gefaellt mir aber noch nicht ganz, und ist noch nicht komplett fertig, weil ich da wieder tausende BED_STATE Abfragen haben werde.

    Jedoch muesste ich dann ueber CountDown die bedteamid die Teamid an CountDown, und von CountDown an BlowUpThisBed schicken.


    Bei BlowUpThisBed wuerde ich die teamid des Bettes uebergeben, und so ca. 90 Zeilen sparen.


    7 Mal editiert, zuletzt von Sub Royal ()


  • Hey,


    Kurze frage habe den Trailer mit der ID 435 angehängt troz allem kommt der fehler?


    if(GetVehicleTrailer(GetPlayerVehicleID(playerid)) != 435) return SendClientMessage(playerid, COLOR_WHITE, "Du hast den falschen Anhänger. Du brauchst den Produkt Anhänger!");