Abfragen ob ein Spieler an einem Auto ist.

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 zusammen!
    Ich wollte man fargen ob mir jemand sagen könnte wie ich abfragen kann ob ein Spieler neben einem Auto ist.
    Ich habe mir schon gedanke gemacht und auch schon ein code überlegt:
    for(new i=0; i<MAX_VEHICLES; i++)
    {
    new Float: vX, Float: vY, Float: vZ;
    GetVehiclePos(i, vX, vY, vZ);
    if(IsPlayerInRangeOfPoint(playerid, 5000000000, vX, vY, vZ) && !INVALID_VEHICLE_ID)
    {
    Aber wenn ich das so machen wird es trotzdem nicht abgefragt...


    Ich hoffe mir kann jemand helfen!
    MFG klaus

  • Nein ihr versteht mich nicht ganz.
    Ich will das für mein Befehl zum Auto abschliessen benutzen. Also nicht das der Player Im auto sitzem muss, sondern das das auch geht wenn er neben dran sitzt.
    Oh shitxD
    Das 5000000000 sollte eingentlich 2 heisen... Ich habe es auf 5000000000 geändert um zuschauen ob es viell an den Koordinaten liegen könnte.

  • Das Dein Codeschnipsel nicht funktioniert liegt nur an folgendem Problem.


    for(new i=0; i<MAX_VEHICLES; i++)
    {
    new Float: vX, Float: vY, Float: vZ;
    GetVehiclePos(i, vX, vY, vZ);
    if(IsPlayerInRangeOfPoint(playerid, 5000000000, vX, vY, vZ) && !INVALID_VEHICLE_ID)
    {
    ...

    In diesem Zusammenhang ist die INVALID_VEHICLE_ID Abfrage völlig
    falsch und unangebracht, denn Du musst in der Abfrage ja sagen, welcher
    Parameter nicht der Vehicle ID entspricht.


    Du kannst logischer Weiße nur eine Fahrzeug ID erwischen, da Du in der
    for-Schleife ja MAX_VEHICLES verwendest, welche nur Fahrzeuge anspricht.


    Ändere Dein Schnipsel einfach so und es wird gehen...
    (den Radius kannst Du ja beliebig wählen, in meinem Falle 15)


    for(new i=0; i<MAX_VEHICLES; i++)
    {
    new Float: vX, Float: vY, Float: vZ;
    GetVehiclePos(i, vX, vY, vZ);
    if(IsPlayerInRangeOfPoint(playerid, 15, vX, vY, vZ))
    {
    ...

  • Du kannst logischer Weiße nur eine Fahrzeug ID erwischen, da Du in der
    for-Schleife ja MAX_VEHICLES verwendest, welche nur Fahrzeuge anspricht.


    Blödsinn, eine Schleife spricht doch nicht nur Fahrzeuge oder nur Spieler an, sondern geht einfach von 0 - x alle ID's durch.
    MAX_VEHICLES ist ja auch nur 5000 anders geschrieben. (genau wie MAX_PLAYERS = 500)

  • Verlesen :/ Hab die funktion irgendwann mal selbst geschrieben

    //Einfach ganz unten ins Script damit
    stock GetPlayerNearestCarID(playerid,Float:radius)
    {
    new Float:vx,Float:vy,Float:vz,carid;
    for(new v = 1; v <= MAX_VEHICLES; v++)
    {
    GetVehiclePos(v,vx,vy,vz);
    if(IsPlayerInRangeOfPoint(playerid,radius,vx,vy,vz))
    {
    carid = v;
    }
    }
    return carid;
    }

    Oder moment, das hab ich auchnoch, iwas davon wirds sein...

    stock PlayerIsAtAnyCar(playerid,Float:radius)
    {
    new Float:vx,Float:vy,Float:vz;
    for(new v = 0; v <= MAX_VEHICLES; v++)
    {
    GetVehiclePos(v,vx,vy,vz);
    if(IsPlayerInRangeOfPoint(playerid,radius,vx,vy,vz))
    {
    return 1;
    }
    }
    return 0;
    }

  • Also danke erstmal für die vielen antworten!
    Allerdings klappt es immernochnicht.
    Also ich post jetzt mal meinen kompletten code
    if(strcmp(cmdtext, "/lock", true) == 0)
    {
    new Float:vx,Float:vy,Float:vz;
    for(new vid = 0; vid <= MAX_VEHICLES; vid++)
    {
    GetVehiclePos(vid,vx,vy,vz);
    if(IsPlayerInRangeOfPoint(playerid,5,vx,vy,vz))
    {


    if(CarLock[vid] == 0)
    {
    SendClientMessage(playerid, COLOR_WHITE, "Du hast das Auto abgeschlossen.");
    LockCar(vid);
    CarLock[vid] = 1;
    return 1;
    }
    else if(CarLock[vid] == 1)
    {
    SendClientMessage(playerid, COLOR_WHITE, "Du hast das Auto aufgeschlossen.");
    UnLockCar(vid);
    CarLock[vid] = 0;
    return 1;
    }
    }
    else return SendClientMessage(playerid, COLOR_GREY, "Es ist kein Auto in der Nähe.");

    }
    }
    Ich bekommen immer die Fehlermeldung das kein auto in der nähe ist ("Es ist kein Auto in der Nähe." also halt die bei meiner Else abfrage.)


    Gruß klaus

  • Dein Schnippsel wird zur Zeit nur das erste Fahrzeug überprüfen und dort schauen ob du in der Nähe bist.
    Falls du in der Nähe bist, dann wird das Schloss auf bzw. zugeschlossen. Solltest du aber nicht in der Nähe sein, dann bricht der Code ab!
    Mache das so:

    if(strcmp(cmdtext, "/lock", true) == 0)
    {
    new vid=GetPlayerNearestCarID(playerid,5.0);
    if(vid == INVALID_VEHICLE_ID){ SendClientMessage(playerid, COLOR_GREY, "Es ist kein Auto in der Nähe."); return 1;}
    if(CarLock[vid] == 0)
    {
    SendClientMessage(playerid, COLOR_WHITE, "Du hast das Auto abgeschlossen.");
    LockCar(vid);
    CarLock[vid] = 1;
    return 1;
    }
    else if(CarLock[vid] == 1)
    {
    SendClientMessage(playerid, COLOR_WHITE, "Du hast das Auto aufgeschlossen.");
    UnLockCar(vid);
    CarLock[vid] = 0;
    return 1;
    }
    }
    //Das fügst du dann ganz unten ein:
    stock GetPlayerNearestCarID(playerid,Float:radius)
    {
    //Credits to InternetInk aka Benjamin, edited by danfai
    new Float:vx,Float:vy,Float:vz,carid=INVALID_VEHICLE_ID;
    for(new v = 1; v <= MAX_VEHICLES; v++)
    {
    GetVehiclePos(v,vx,vy,vz);
    if(IsPlayerInRangeOfPoint(playerid,radius,vx,vy,vz))
    {
    carid = v;
    }
    }
    return carid;
    }

  • Klar gerne. Also ich denke du meinst das public LockCar() indem das auto abgeschlossen wird und nicht die Variable oder.
    Also das public:
    public LockCar(carid)
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    SetVehicleParamsForPlayer(carid,i,0,1);
    }
    }
    }