onPlayerEnterVehicle Aufrufe bei Platzwechsel im Fahrzeug?

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
  • Hey


    Hab da seit längerem ein kleines Problem welches ich jetzt gerne mal behandeln würde.
    Und zwar wird die "onPlayerEnterVehicle" Funktion recht schnell aufgerufen. Wenn zum Beispiel ein Taxifahrer in sein eigenes Taxi steigen möchte muss er dies über die Fahrertür machen weil (in meinem Fall jetzt zumindest) sonst die Meldung kommt das dieses Taxi nicht in Betrieb ist.
    Aber ok das könnte ich eventuell noch mit einem Delay lösen.
    Das größere Problem für mich ist das wenn jetzt ein Taxifahrer aussteigt während ein Spieler am Beifahrer sitzt, dass sich der dann ganz einfach rüber setzen kann ohne das diese Funktion nochmal aufgerufen wird.
    Ich hab´s bisher so gelöst das ich eine "onUpdate" Funktion geschrieben habe in der das ganze nochmal überprüft wird.
    Gibt´s da keine Resourcen sparendere Möglichkeit als das ich alle paar Sekunden alle Spieler durchgehen muss und überprüfen muss ob die jetzt in einem Fahrzeug, auf einem Sitz sind auf dem sie nicht sein dürfen?

  • ohne code keine hilfe


    Versteh zwar nicht was du willst aber na gut:

    C
    public void onPlayerEnterVehicle(Client player, NetHandle vehicle) 
    {
         // Spieler wird aus dem Fahrzeug geworfen wenn er im falschen Fahrzeug bzw am falschen Sitzplatz ist   
    }


    Diese Funktion wird immer dann Aufgerufen wenn der Spieler über die Taste F oder G in ein Fahrzeug einsteigt. Allerdings wird die Funktion gleich aufgerufen sobald der Spieler im Fahrzeug ist. Sprich wenn der Spieler über die Tür vom Beifahrer als Fahrer einsteigt (sodass er zuerst am Beifahrer Sitz sitzt und dann rüber auf den anderen rutscht) wird die Funktion gleich aufgerufen sobald der Spieler am ersten (sprich am Beifahrer) Sitz sitzt obwohl er dann in weitere folge ja am Fahrersitz landet.


    Gibts nun irgend eine Möglichkeit zu überprüfen ob der Spieler jetzt am entgültigen Platz sitzt oder muss ich das über ein Delay machen?




    Des weiteren können Spieler sofern der Fahrer ausgestiegen vom Beifahrersitz auf den Fahrersitz wechseln (das hab nicht ich gecodet, das kann GTAV). Jedoch wird beim wechseln auf den anderen Platz nicht erneut die Funktion "onPlayerEnterVehicle" Aufgerufen. Um trotzdem Spieler aus dem Fahrzeug zu werfen hab ich bei "onUpdate" einen Timer erstellt.


    Das mit dem Timer funktioniert ja auch, nur stört es mich das die ganze Zeit dieser Timer alle Spieler Abfragen muss um zu überprüfen ob der jetzt den Sitzplatz im Fahrzeug wechselt.

  • Ich würde dir empfehlen in OnPlayerStateChange abzufragen auf welchem Sitzplatz er ist. Sobald du Enter oder F drückst gibt er dir OnPlayerEnterVehicle schon aus. Mit OnPlayerStateChange und newstate behebst du das ganze Problem Ideal.
    Ich denke der Fehler liegt einfach darin das er die Funktion viel zu früh aufrufen tut


    Das ist die einzige Methode die ich kenne um es richtig zu realisieren.



    Hier ein beispiel


    public OnPlayerStateChange(playerid, newstate, oldstate){
    if(newstate==PLAYER_STATE_DRIVER)
    {
    if(PlayerInfo[playerid][pLoggedIn]==false)return 1;
    new vID=GetPlayerVehicleID(playerid);
    for(new i=0; i<sizeof(ahCars); i++)
    {
    if(ahCars[i][id_x]!=vID)continue;
    SetPVarInt(playerid,"buyCarID",i);
    if(PlayerInfo[playerid][pMember]>0)
    {
    ShowPlayerDialog(playerid, DIALOG_AUTOKAUFEN2, DIALOG_STYLE_LIST, "{00ff00}Zugehörigkeit", "Privat\nFraktion", "Auswählen", "Beenden");
    }
    else
    {
    new string[256];
    format(string,sizeof(string),"Möchten sie das Fahrzeug für %i$ kaufen?",ahCars[i][c_preis]);
    ShowPlayerDialog(playerid,DIALOG_AUTOHAUS1,DIALOG_STYLE_MSGBOX,"Autoverkauf",string,"Ja","Nein");
    return 1;
    }
    }
    }

  • Ups sorry, garnicht drauf geachtet.


    Ich vermute dennoch das deine Funktion aufgerufen wird sobald du F oder Enter drückst. Du musst das aber in einer Funktion deine Abfragen stellen wo der Spieler schon an seinem Richtigen Platz ist.

  • Ich vermute dennoch das deine Funktion aufgerufen wird sobald du F oder Enter drückst. Du musst das aber in einer Funktion deine Abfragen stellen wo der Spieler schon an seinem Richtigen Platz ist.

    Ja stimmt schon. Wenn ich bei "onPlayerEnterVehicle" einen Delay (also eine Verzögerung) einbaue und dann erst Abfrage auf welchem Sitz sich der Spieler befindet sollte das größtenteils schonmal erledigt sein.


    Mein Problem ist das man in GTA V auch wenn man schon längere Zeit am Beifahrerplatz sitzt einfach hinüber auf den Fahrerplatz wechseln kann (ohne aussteigen zu müssen) und dann keine (zumindest keine mir bekannte) Funktion aufgerufen wird. Sprich er steigt als Beifahrer ein, fährt von mir aus 10 Minuten lang mit und dann sobald der Fahrer aussteigt kann der Beifahrer einfach hinüber wechseln auf den Fahrersitz.

  • Wie steigt man denn auf den Fahrersitz in GTA-N ich kann dir vielleicht nicht direkt mit Codes helfen aber dir vielleicht oft logische Tipps anbieten die du am Ende einmal ausprobieren müsstest

  • Einsteigen tust du genau wie bei SA:MP. Mit F auf den Fahrersitz und mit G auf den Beifahrersitz. Und wenn du bereits mit G eingestiegen bist und kein Fahrer mehr im Fahrzeug sitzt kannst du glaub ich mit irgend einer Pfeiltaste (oder vielleicht macht der das auch automatisch) auf den Fahrersitz wechseln.

  • Okay. Wenn der Beifahrer z.b eine Taste drücken müsste würde ich es wie folgt machen


    1. Frage ab ob das Fahrzeug einen Beifahrer hat. Wenn ja returnen
    2. Frage ab ob der Beifahrer in einem Fahrzeug ist und ob der Fahrer im Fahrzeug ist. Wenn kein Fahrer im Fahrzeug ist, werf den Beifahrer einfach aus dem Fahrzeug. Das wäre so was mir einfallen würde

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Ja gut das würde vielleicht funktionieren wäre aber auch wieder nur ein workaround.


    Aber ich hab da vielleicht grad ne Idee. Selbst eine onPlayerStateChange funktion zu basteln.



    Edit:
    Hab jetzt eine eigene Klasse angelegt und dort mein eigenes onPlayerStateChange gebastelt.



    Jetzt habe ich eigentlich nurnoch das Problem das wenn der Spieler durch die Beifahrer Tür mit der Taste F einsteigt (also das er am Fahrersitz landet) das es unter umständen dazu kommt das dann zuerst "onPlayerEnterVehicleAsPassenger" und dann "onPlayerEnterVehicleAsDriver" aufgerufen wird. Wie genau ich das jetzt noch verhindere weiß ich in dem Fall grad noch nicht.

    Einmal editiert, zuletzt von SaschaMois ()

  • Also es gibt ja nicht so ein Event wie in SA:MP, welches aufgerufen wird, wenn sich der state vom Spieler ändert, zum Beispiel von Fußgänger auf Beifahrer oder Fahrer.


    An deiner Stelle würde ich einen Timer machen, der bei jeden aufruf alle Spieler durchgeht und den aktuellen Fahrzeug-Sitz abfragt und diesen Speichert.


    Du vergleichst einfach den vorherigen Wert (zum Beispiel -1 = Fußgänger) mit dem neuen Wert(zum Beispiel 0 = Fahrer oder 1 = Beifahrer) und löst dann ein event aus welches dir den newstate und oldstate angibt. so weiß du, ob er vom Beifahrersitz auf Fahrersitz gewechselt hat.

  • Wir haben das Problem auch.


    Als Lösung haben wir einen neuen Timer gestartet welcher nach dem Enter Event erneut abfragt auf welchem sitzt er sitzt.


    In diesem Moment schlafen 6,3 Millionen Menschen, 18,9 Millionen essen, 2,2 Millionen machen Liebe und 1 Dummerchen ließt meine Signatur!



  • Wir haben das Problem auch.


    Als Lösung haben wir einen neuen Timer gestartet welcher nach dem Enter Event erneut abfragt auf welchem sitzt er sitzt.

    Und was habt ihr gegen den Platzwechsel im Fahrzeug gemacht? Also wenn der Fahrer irgendwann aussteigt und der Beifahrer rüber rutscht?

  • Ob man eine Taste drücken muss oderso weiß ich auch nicht genau. Ich hab nur mal mit nem Freund was getestet und als ich dann kurz aus meinem privaten Fahrzeug ausgestiegen bin (er am Nebensitz) konnte er einfach rüber rutschen. Zumindest sagte er das zu mir ^^


    Edit: hab grad leider starke Probleme mit dem Client weshalb ich schon länger nichts mehr austesten konnte

  • Also mit (h) geht es nicht. Ich denke es wird nicht funktionieren.


    Man könnte sich diese Funktion natürlich selber brauen.


    Wie gesagt für das einsteigen einen Timer von 1000-2000 Millisekunden setzten und erneut abfragen


    In diesem Moment schlafen 6,3 Millionen Menschen, 18,9 Millionen essen, 2,2 Millionen machen Liebe und 1 Dummerchen ließt meine Signatur!



  • Soweit ich weiß ist das nur in gta online der fall, bei gtan bleibt man einfach sitzen genauso wie bei samp.

    Dann versteh ich die Schilderung des Threaderstellers nicht genau. Somit wäre das einzige Problem ja, dass man auch an der Beifahrerseite mit F einsteigen kann, Aber man einen Timer einbinden muss, um erneut Zu fragen, auf welchem Platz die Person jetzt sitzt.


    Bei Samp ging das aber leichter oder? Könnte gtan ja dann eigentlich auch abändern, aber so dringend ist es ja nicht.

    VIVA LA REVOLUCIÓN