Freien Fahrzeug sitz rausbekommen ?

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
  • Hallo & einen schönen Guten Morgen 8)


    Ich versuche gerade den freien Sitz eines Fahrzeuges raus zu bekommen .. ich mache das alles mit einer Schleife, aber irgendwie funktioniert
    das nicht so richtig. Und zwar kann ich nur einen reinziehen ?..


    for(new i; i<MAX_PLAYERS; i++)
    {
    if(IsPlayerInVehicle(i,vID))
    {
    new sit = GetPlayerVehicleSeat(i);
    if(sit == 3 && sit == 4)return SendClientMessage(playerid,Orange,"Deine Rückbank ist besetzt!");
    else if(sit != 2){ siit = 2; }
    else if(sit != 3){ siit = 3; }
    }
    if(IsPlayerInRangeOfPoint(i,5.0,x,y,z))
    {
    if(Spieler[i][Handschellen] == 1)
    {
    PutPlayerInVehicle(i,vID,siit);
    siit = 0;
    }
    }
    }
    return SendClientMessage(playerid,Weiss,"Kein Spieler zum Cuffen in der Nähe!");

  • Also als Erstes wäre es wichtig zu wissen, in welches Fahrzeug der Spieler soll...
    Haben wir eine Möglichkeit das herauszufinden z.B. das Fahrzeug in dem der Bulle sitzt oder das Polizeiauto was in der nähe des Spielers ist ect?


    Wenn wir das wissen können wir eine schleife durchgehen und den Zustand aller 4 sitze dieses Autos ein einem Array zu speichern.
    Dann müssen wir nurnoch herausfinden of das Arrayelement 2 oder 3 (Sitz 3 oder 4) Leer ist.

  • Das ist nicht mit dieser Schleife getan.
    Beispiel:
    Spieler 0 fährt, Spieler 1 bis 15 sind außerdem noch online.
    ID 14 und 15 sitzen hinten im Wagen.
    ID 7 ist in der Nähe vom Fahrzeug und wird auf die Rückbank teleportiert. Aber Moment:
    ID 14 sitzt auf dem Platz und es wird womöglich mit einem Crash enden. Auf jeden Fall wird alles unsynchron und buggy ...


    1. Schleife durch alle Spieler und schauen welche Sitze belegt sind.
    2. Dann noch eine Schleife zum Reincuffen.
    Lässt sich auch in einer Schleife realisieren.
    Wichtig hierbei ist, dass erst alle Spieler durchgegangen werden müssen bevor einer reinteleportiert wird!
    Hinweis: Schau mal in welcher Ebene sich new sit befindet.

  • Okey playerid ist also der COP der den Befehl in seinem Auto ausfürt


    new vID = GetPlayerVehicleID(playerid);
    new sit[4];
    new siit;
    new targetID; //Die id des Spielers, der gecufft werden soll
    for(new i; i<MAX_PLAYERS; i++)
    {
    if(IsPlayerInVehicle(i,vID))
    {
    new seat = GetPlayerVehicleSeat(i);
    sit[seat] = 1;
    }
    }
    if(sit[2] == 0)
    {
    siit = 2;
    }
    else if(sit[3] == 0)
    {
    siit = 3;
    }
    else return SendClientMessage(playerid,COLOR_RED,"Alda, deine Rüchbank is schon voll!!");
    if(IsPlayerInRangeOfPoint(targetID,5.0,x,y,z))
    {
    if(Spieler[targetID][Handschellen] == 1)
    {
    PutPlayerInVehicle(targetID,vID,siit);
    }
    }
    return SendClientMessage(playerid,Weiss,"Kein Spieler zum Cuffen in der Nähe!");


    Hoffe jmd steigt bissle durch bin arg krank noch ein Tip das ganze kann crashen wenn das auto mehr als 4 sitze hat, dann wird das array überfordert

  • Ich hab da ne kleine Funktion
    stock CheckSeatTaken(vehicleid,seatid)
    {
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i))continue;
    if(GetPlayerVehicleID(i)==vehicleid&&GetPlayerVehicleSeat(i)==seatid)return 0;
    }
    return 1;
    }
    Anwendung ist auch recht einfach
    ]if(!CheckSeatTaken(vehicleid, sitzid))return da sitzt schon einer

    All in all it's just another brick in the wall

  • Zu dem Beitrag von carlos:
    - targetID wird nicht vorgegeben, sondern der Spieler der nah am Auto steht soll genappt werden.
    - Wegen dem "Crash" einfach in den Klammern bei "GetPlayerVehicleSeat" abfragen ob seat < 4

  • dazu war ich ehrlich gesagt zu faul man will ja nicht aolles vormachen und so ne abfrage ob das ding größer ist dürfte ja kein problem sein nun ob target gegeben ist oder nicht wusst ich nicht da auch nicht der gesmte befehl gegeben wurde (deswegen hab ich auch paar variablen nochmal deklariert)
    Aber irgendwie finde ich das nicht gut, im seltensten fall kann das ein unschuldigen Spieler treffen wenn der Bulle dem Server keine Angabe über den verhafteten macht, wie auch immer


    Beavis hats eigentlich schon kompakt auf den Punkt gebracht.


  • Ich habs jetzt mal mit deiner Funktion versucht, aber ingame passiert einfach nichts ? :o


    for(new i; i<MAX_PLAYERS; i++)
    {
    if(IsPlayerInRangeOfPoint(i,5.0,x,y,z))
    {
    if(Spieler[i][Handschellen] == 1 && !IsPlayerInAnyVehicle(playerid))
    {
    if(CheckSeatTaken(vID, 2)){ siit = 2;}
    else if(CheckSeatTaken(vID,3)){siit = 3;}
    PutPlayerInVehicle(i,vID,siit);
    }
    }
    }

  • !IsPlayerInAnyVehicle(playerid)


    Ich denke du meinst i, oder darf der Cop in keinem Fahrzeug sein? :P

  • Was ist vID?
    wie gibst du den wert an?


    Ansonsten debuggen


    //edit
    Ansonsten teste mal das
    stock GetFreeSeat(vehicleid, bool:all=false){//vehicleid, all (optional) = false nur rücksitze, true alle sitze
    for(new i=0; i<MAX_PLAYERS; i++){
    if(!IsPlayerConnected(i))continue;
    if(GetPlayerVehicleID(i) != vehicleid)continue;
    if(all){
    if(GetPlayerVehicleSeat(i) != 0)return 0;//driver
    if(GetPlayerVehicleSeat(i) != 1)return 1;//co driver
    }
    if(GetPlayerVehicleSeat(i) != 2)return 2;//back seat passenger 2
    if(GetPlayerVehicleSeat(i) != 3)return 3;//back seat passenger 3
    }
    return -1;
    }
    Anwendung:
    new seat = GetFreeSeat(vehicleid);
    if(seat == -1)return kein platz frei

    All in all it's just another brick in the wall

    Einmal editiert, zuletzt von Beavis ()