Fahrzeuge buggen (id verschiebung?)

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
  • Guten Tag


    Ich bin echt überfragt..
    Ich habe ganz normal Fahrzeuge aufm server.. ziemlich viele..
    Und ich frage ab ob jemand berechtigt ist einzusteigen.. wenn ja dann lässt er ihn einsteigen, wenn nein, wird die aktion gestoppt..


    Aber iwie buggt es zwischendurch.. teilweise wird die aktion gestoppt obwohl er berechtigt ist einzusteigen..


    Es ist eigentlich eine ganz simple sache die jeder kann.. aber es buggt :S
    Ich habe schon Testmessage senden lassen. wenn er nicht berechtigt ist einzusteigen, wird die testmessage ganz normal gesendet und das script funktioniert.
    Wenn er berechtigt ist, wird die aktion gestoppt, aber die testmessage wird nicht gesendet. Aber ich frage mich wodurch die aktion gestoppt wird..


    Ich hoffe ihr könnt mir da helfen.


    Hier mal mein Code:


    public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
    {
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    if(!ispassenger)
    {
    for(new i = 0; i < sizeof noobbike; i++)
    {
    if(vehicleid == noobbike[i])
    {
    if(GetPlayerScore(playerid) == 1) continue;
    SendClientMessage(playerid,grau,"Test 1");
    return TogglePlayerControllable(playerid,1);
    }
    }
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i) && login[i] == 1)
    {
    if(vehicleid == Testcar[i])
    {
    if(i == playerid) continue
    SendClientMessage(playerid,grau,"Test 2");
    return TogglePlayerControllable(playerid,1);
    }
    }
    }
    for(new i = 0; i < sizeof Rentcars;i++)
    {
    if(vehicleid == Mietauto[i])
    {
    if(strcmp(Rentcars[i][Mietername],"Keiner",true))
    {
    if(!strcmp(Rentcars[i][Mietername],name,true)) continue;
    SendClientMessage(playerid,grau,"Test 3");
    return TogglePlayerControllable(playerid,1);
    }
    }
    }
    for(new i = 0; i < sizeof Frakcars; i++)
    {
    if(vehicleid == Frakauto[i])
    {
    if(GetPlayerFrak(playerid) == Frakcars[i][Frakid]) continue;
    SendClientMessage(playerid,grau,"Test 4");
    return TogglePlayerControllable(playerid,1);
    }
    }
    }
    entercar[playerid] = vehicleid;
    return 1;
    }


    LG
    Simon


    //edit: Also ich habe nun herausbekommen das es aufjedenfall an der Fahrzeug verschiebung liegt.


    Ein beispiel:


    Man spawnt ein auto per Admcmd. Man zerstört dieses wieder und ein User kauft sich ein auto. dieses auto wird nun ales Admincar erkannt. Andersherum wäre es genau das selbe.
    Nach einer bestimmten Zeit werden Admin autos automatisch zerstört. wenns nun ein spielerauto als admincar erkannt wird durch id verschiebung, wird das Spielerauto zerstört.


    Das selbe problem tritt auch bei den Fraktionsautos auf, wenn man frakcars kauft und verkauft. Jedoch besitzen alle cars eine eindeutige variable :S


    Ich hoffe mir kann einer bei dem Problem helfen.


    LG
    Simon

    Einmal editiert, zuletzt von Simon ()

  • Ich habe schon eine menge Bugs behoben. Nun gibt es nur noch ein Bug durch die id verschiebung.
    Der Grund dafür ist, das ich Autos kaufen und verkaufen kann innerhalb der fraktion und als spieler selbst.


    wenn ich nun zum Beispiel ein Auto kaufe und mich auslogge, wirds zerstört. Das ist auch richtig so. Wenn ich jedoch mein privates auto verkaufe, wird es zerstört. kauft sich nun eine Fraktion ein Fahrzeug, und der spieler, der das auto verkauft hat, loggt sich aus, dann wird das fraktionsauto zerstört, da das ja die selbe id hat, wie das private Fahrzeug hatte.


    So werden beispielweise fraktionscars erstellt:


    Frakcar[0] = CreateVehicle..
    Frakcar[1] = CreateVehicle..
    usw.


    ein spielerfahrzeug wird so hinzugefügt:
    Spielercar[playerid][0] = CreateVehicle..
    Spielercar[playerid][1] = CreateVehicle..


    beim verkaufen siehts dann so aus:
    DestroyVehicle(Spielercar[playerid][0]);


    Das Problem ist nun das das fraktionsauto dann die selbe id hat wie das spielerfahrzeug vorher und deswegen als spielercar angesehen wird, obwohl das schon längst zerstört wurde.


    LG
    Simon :thumbup:

  • Das Problem wird wohl daran liegen, dass die Vehicleid in der Variable gespeichert bleibt auch wenn das Fahrzeug bereits gelöscht wurde. Daher musst du vor dem Löschen abfragen, ob das Fahrzeug überhaupt erstellt wurde.

  • ich habe sie bisher auf -1 gesetzt, hat aber nicht geklappt :S
    das problem ist, das auch die parameter für diese vehicleid gespeichert werden. beim zerstören werden die wieder resettet.


    stock p_DestroyVehicle(carid)
    {
    SetVehicleParamsEx(carid,0,0,0,0,0,0,0);
    for(new i = 0; i < MAX_PLAYERS; i++) SetVehicleParamsForPlayer(carid,i,0,0);
    Adminauto[carid] = 0;
    DestroyVehicle(carid);
    carid = -1;
    return 1;
    }


    //edit: es will einfach nicht.. hier der aktuelle code:


    stock p_DestroyVehicle(carid)
    {
    if(carid == 0) return 0;
    SetVehicleParamsEx(carid,0,0,0,0,0,0,0);
    for(new i = 0; i < MAX_PLAYERS; i++) SetVehicleParamsForPlayer(carid,i,0,0);
    Adminauto[carid] = 0;
    DestroyVehicle(carid);
    carid = 0;
    return 1;
    }

    Einmal editiert, zuletzt von Simon ()

  • stock IsAnAdminCar(carid)
    {
    for(new i;i<sizeof(Adminauto);i++)if(carid == Adminauto[i])return i;
    return -1;
    }


    stock p_DestroyVehicle(carid)
    {
    if(IsAnAdminCar(carid) != -1)
    {
    DestroyVehicle(Adminauto[IsAnAdminCar(carid)]);
    }
    return 1;
    }
    so würde ich das versuchen. Nach deiner Methode wird zwar das Auto gelöscht, aber Adminauto[carid] wird immer auf 0 gesetzt auch wenn es kein Admincar war. Außerdem kann es passieren, dass carid größer als der Array Adminauto ist, dann hängt sich die Funktion auf.

  • das problem liegt ja nicht direkt bei den admincars und das array ist nicht zu klein:


    new Adminauto[MAX_VEHICLES];


    das Problem ist, das wenn ich 49 Fahrzeuge besitze und sich jemand einloggt, der sich irgendwann mal ein auto gekauft hat und sein auto dann erstellt wird, die id 50 hat.


    es wird zwar so erstellt: Spielercar[bla][bla] = .. aber die vehicleid ist 50, also Spielercar[bla][bla] gibt den Wert 50 wieder. wenn das auto nun durch ausloggen oder verkaufen zerstört wird, hat Spielercar[bla][bla] immernoch den Wert 50. wird nun ein Adminauto oder Fraktionsauto erstellt, so hat dieses auch den Wert 50.


    Nun wird überprüft ob es die und die vehicleid id ist, und da beide den selben wert haben, wirds als Spielerfahrzeug erkannt und beim ausloggen des spielers zerstört. so kommt es, das Fraktionsfahrzeuge oder gespawnte Adminautos zerstört werden.


    Abfragen tu ich natürlich nicht: if(vehicleid == 50) sondern if(vehicleid == Spielercar[bla][bla]); aber es haut halt nicht hin, das ich den Wert dieser variable auf 0 setzte und abfrage. der wert bleibt 50 in diesem Beispiel


    LG
    Simon

  • Du musst mein Beispiel nur erweitern. Zu erst solltest du beim Löschen rausfinden, was für ein Fahrzeug es ist, damit du die Variable wieder auf 0 setzten kannst. Wenn es z.b. ein Admincar war bringt es ja nichts PlayerCars[blabl] auf 0 zu setzten.

    stock p_DestroyVehicle(carid)
    {
    if(IsAnAdminCar(carid) != -1)
    {
    new id = IsAnAdminCar(carid);
    DestroyVehicle(Adminauto[id]);
    Adminauto[id] = 0;
    }
    return 1;
    }
    wenn du das jetzt noch mit allen anderen Fahrzeugen machst, die man löschen kann.. Versuchs einfach mal :D

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