[Brauche] GetNearestVehicle

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
    kann mir einer schnall was machen sowie GetNearestPlayer
    GetNearestPlayer(playerid,max_dist)
    {
    new Float:x1,Float:y1,Float:z1;
    if (!IsPlayerConnected(playerid))
    {
    return -1;
    }
    GetPlayerPos(playerid,x1,y1,z1);


    new closest = -1;
    new closest_dist = -1;


    new Float:dis,string[256];
    new Float:x2,Float:y2,Float:z2;
    for (new i; i < MAX_PLAYERS; i++)
    {
    if (IsPlayerConnected(i) && i != playerid)
    {
    GetPlayerPos(i,x2,y2,z2);
    dis = floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
    format(string, sizeof(string), "%f", dis);
    if (strval(string) < closest_dist || closest_dist == -1)
    {
    if (strval(string) <= max_dist)
    {
    closest = i;
    closest_dist = strval(string);
    }
    }
    }
    }
    return closest;
    }


    Nur das halt mit Vehicle


    MFG
    Deathrunner

  • Da ich jetzt an meinem Laptop sitze und keinen Bock dazu habe, sage ich dir soviel:
    mit den bei dem zweiten GetPlayerPos einfach mal GetVehiclePos verwenden, bei der Schleife etwas verändern, und sonst noch etwas, was dir irgendwie so vorkommt, dass es das sein könnte, ich google mal ein bisschen.



    Try this:

    stock GetNearestVehicle(playerid, Float:Distance = 1000.0)
    {
    Distance = floatabs(Distance);
    if(Distance == 0.0) Distance = 1000.0;
    new Float:X[2], Float:Y[2], Float:Z[2];
    new Float:NearestPos = Distance;
    new NearestVehicle = INVALID_VEHICLE_ID;
    GetPlayerPos(playerid, X[0], Y[0], Z[0]);
    for(new i; i<MAX_VEHICLES; i++)
    {
    if(!IsVehicleStreamedIn(i, playerid) || i == GetPlayerVehicleID(playerid)) continue;
    GetVehiclePos(i, X[1], Y[1], Z[1]);
    if(NearestPos > GetDistanceBetweenPoints(X[0], Y[0], Z[0], X[1], Y[1], Z[1])) NearestPos = GetDistanceBetweenPoints(X[0], Y[0], Z[0], X[1], Y[1], Z[1]), NearestVehicle = i;
    }
    if(NearestPos < Distance) return NearestVehicle;
    return INVALID_VEHICLE_ID;
    }
    }

  • ne frage wenn ich fragen darf, ich mach hier gleich das kommando rein


    stock GetNearestVehicle(playerid, Float:Distance = 1000.0)
    {
    Distance = floatabs(Distance);
    if(Distance == 0.0) Distance = 1000.0;
    new Float:X[2], Float:Y[2], Float:Z[2];
    new Float:NearestPos = Distance;
    new NearestVehicle = INVALID_VEHICLE_ID;
    GetPlayerPos(playerid, X[0], Y[0], Z[0]);
    for(new i; i<MAX_VEHICLES; i++)
    {
    if(!IsVehicleStreamedIn(i, playerid) || i == GetPlayerVehicleID(playerid)) continue;
    GetVehiclePos(i, X[1], Y[1], Z[1]);
    if(NearestPos > GetDistanceBetweenPoints(X[0], Y[0], Z[0], X[1], Y[1], Z[1])) NearestPos = GetDistanceBetweenPoints(X[0], Y[0], Z[0], X[1], Y[1], Z[1]), NearestVehicle = i;
    }
    if(NearestPos < Distance) return NearestVehicle;
    return INVALID_VEHICLE_ID;
    }
    das ist das stock


    und jetzt das kommando


    dcmd_rtv(playerid,params[])
    {
    if(gAdmin[playerid]<1)
    {
    return SendClientMessage(playerid,COLOR_RED,"Du bist kein Admin oder dein Admin-Rang ist zu niedrig!");
    }
    new nauto = GetNearestVehicle(playerid, 10);
    if(sscanf(params, "u"))
    {
    return SendClientMessage(playerid,COLOR_YELLOW,"Benutzung: /rtv");
    }
    else
    {
    SetVehicleToRespawn(nauto);
    }
    return 1;
    }


    da kommen errors:
    C:\Users\Deathrunner\Desktop\GTA-Server R8\gamemodes\ReallifeBeta07.pwn(3949) : error 017: undefined symbol "GetDistanceBetweenPoints"
    C:\Users\Deathrunner\Desktop\GTA-Server R8\gamemodes\ReallifeBeta07.pwn(3949) : error 017: undefined symbol "GetDistanceBetweenPoints"
    die kammen vorher nicht


    und die errors sind in dieser zeile
    if(NearestPos > GetDistanceBetweenPoints(X[0], Y[0], Z[0], X[1], Y[1], Z[1])) NearestPos = GetDistanceBetweenPoints(X[0], Y[0], Z[0], X[1], Y[1], Z[1]), NearestVehicle = i;


    MFG
    deathrunner

    Einmal editiert, zuletzt von [XF12]deathrunner ()

  • Soweit ich weiss, brauchst du nur das Benutzen:



    GetNearestVehicle(playerid, 10.0); // Radius kannste ändern, dann wird dir das näheste Auto returned, was dann in diesem Umkreis steht, so wie ich es aus diesem Quellcode heruaslese.

  • Wo du es gerne hättest.


    Ich mach ein Beispiel.


    BEFEHL
    {
    SetPVarInt(playerid, "NearestVeh", GetNearestVehicle(playerid, 10.0)); // Nicht sicher obs klappt! Ich weiss nicht, was genau GetNearestVehicle. returned.
    return 1;
    }

  • dcmd_rtv(playerid,params[])
    {
    if(gAdmin[playerid]<1)
    {
    return SendClientMessage(playerid,COLOR_RED,"Du bist kein Admin oder dein Admin-Rang ist zu niedrig!");
    }
    new nauto = GetPlayerVehicleID(playerid);
    if(sscanf(params, "u"))
    {
    return SendClientMessage(playerid,COLOR_YELLOW,"Benutzung: /rtv");
    }
    else
    {
    SetVehicleToRespawn(nauto);
    }
    SetPVarInt(playerid, "NearestVeh", GetNearestVehicle(playerid, 10.0)); // Nicht sicher obs klappt! Ich weiss nicht, was genau GetNearestVehicle. returned.
    return 1;
    }
    wenn ichs so mache dann kommen immer noch diese errors

  • Jo das ist wieder einmal Flip...


    Du hast die Funktion nicht, die er im Code mitgegeben hat.


    Hier mal etwas für dich:


    stock Float:GetDistanceBetweenPlayerAndCar(vehicleid,playerid)
    {
    new Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2;
    if(vehicleid == -1)
    {
    return -1.00;
    }
    GetVehiclePos(vehicleid,x1,y1,z1);
    GetPlayerPos(playerid,x2,y2,z2);
    return floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
    }


    Du denkst jetzt bestimmt, dass dir das nicht viel bringt:



    Aber:



    mit einer for schleife und einer Variable die die vehicleid mit dem kleinsten Abstand speichert, hast du das was du brauchst.

  • also zur zusammenfassung
    stock GetNearestVehicle(playerid, Float:Distance = 1000.0)
    {
    Distance = floatabs(Distance);
    if(Distance == 0.0) Distance = 1000.0;
    new Float:X[2], Float:Y[2], Float:Z[2];
    new Float:NearestPos = Distance;
    new NearestVehicle = INVALID_VEHICLE_ID;
    GetPlayerPos(playerid, X[0], Y[0], Z[0]);
    for(new i; i<MAX_VEHICLES; i++)
    {
    if(!IsVehicleStreamedIn(i, playerid) || i == GetPlayerVehicleID(playerid)) continue;
    GetVehiclePos(i, X[1], Y[1], Z[1]);
    if(NearestPos > GetDistanceBetweenPoints(X[0], Y[0], Z[0], X[1], Y[1], Z[1])) NearestPos = GetDistanceBetweenPoints(X[0], Y[0], Z[0], X[1], Y[1], Z[1]), NearestVehicle = i;
    }
    if(NearestPos < Distance) return NearestVehicle;
    return INVALID_VEHICLE_ID;
    }


    stock Float:GetDistanceBetweenPlayerAndCar(vehicleid,playerid)
    {
    new Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2;
    if(vehicleid == -1)
    {
    return -1.00;
    }
    GetVehiclePos(vehicleid,x1,y1,z1);
    GetPlayerPos(playerid,x2,y2,z2);
    return floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
    }


    dcmd_rtv(playerid,params[])
    {
    if(gAdmin[playerid]<1)
    {
    return SendClientMessage(playerid,COLOR_RED,"Du bist kein Admin oder dein Admin-Rang ist zu niedrig!");
    }
    new nauto = GetNearestVehicle(playerid, 10);
    if(sscanf(params, "u"))
    {
    return SendClientMessage(playerid,COLOR_YELLOW,"Benutzung: /rtv");
    }
    else
    {
    SetVehicleToRespawn(nauto);
    }
    return 1;
    }


    und wenn ich das so mache kommen
    2errors
    C:\Users\Deathrunner\Desktop\GTA-Server R8\gamemodes\ReallifeBeta07.pwn(3949) : error 017: undefined symbol "GetDistanceBetweenPoints"
    C:\Users\Deathrunner\Desktop\GTA-Server R8\gamemodes\ReallifeBeta07.pwn(3949) : error 017: undefined symbol "GetDistanceBetweenPoints"
    in der selben zeile

  • Öhm warum so umständlich...


    dcmd_rtv(playerid,params[])
    {
    #pragma unused params
    if(gAdmin[playerid]<1)
    {
    return SendClientMessage(playerid,COLOR_RED,"Du bist kein Admin oder dein Admin-Rang ist zu niedrig!");
    }
    new Float:ergebnis = 9999.9999, id = -1;
    for(new v= 0; v < MAX_VEHICLES; v++)
    {
    if(ergebnis > GetDistanceBetweenPlayerAndCar(v,playerid))
    {
    ergebnis = GetDistanceBetweenPlayerAndCar(v,playerid);
    id = v;
    }
    }


    if(id != -1)
    {
    SetVehicleToRespawn(id);
    }
    }
    return 1;
    }

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • irgendwie sieht das complezierter aus


    aber es kommt kein warning und kein error


    nur noch ne frage wie weit ist der radius

  • Bei dem anderen hast du 2 Stocks.


    Bei meinem nur ein Stock + die kleine Abänderung bei dem Befehl, welche die 2 Funktion ersetzt. :)


    EDIT: Der Radius wird automatisch bestimmt, halt vom am nächsten vorhandenen Fahrzeug.


    Oder willst du den "Suchradius" selbst bestimmen?

  • also wie bei IsPlayerInRangeOfPoint(playerid, radius, x, y, z)


    verstehst was ich mein

  • genau, das er nicht irgendwo seht und dann /rtv eingibt und das näherste respawnt

  • Gibt da Zwei Optionen:


    1.


    stock IsPlayerInRangeOfVehicle(playerid,vehicleid,Float:range)
    {
    new Float:x1,Float:x2,Float:x3;
    GetVehiclePos(vehicleid,x1,x2,x3);
    if(IsPlayerInRangeOfPoint(playerid,range,x1,x2,x3)) return true;
    else return false;
    }


    und dann den Befehl umbauen zu:


    dcmd_rtv(playerid,params[])
    {
    #pragma unused params
    if(gAdmin[playerid]<1)
    {
    return SendClientMessage(playerid,COLOR_RED,"Du bist kein Admin oder dein Admin-Rang ist zu niedrig!");
    }
    new Float:ergebnis = 9999.9999, id = -1;
    for(new v= 0; v < MAX_VEHICLES; v++)
    {
    if(ergebnis > GetDistanceBetweenPlayerAndCar(v,playerid))
    {
    ergebnis = GetDistanceBetweenPlayerAndCar(v,playerid);
    id = v;
    }
    }


    if(id != -1 && IsPlayerInRangeOfVehicle(playerid,id,20.0))
    {
    SetVehicleToRespawn(id);
    }
    }
    return 1;
    }



    ODER 2. Nur den Befehl umbauen zu:



    dcmd_rtv(playerid,params[])
    {
    #pragma unused params
    if(gAdmin[playerid]<1)
    {
    return SendClientMessage(playerid,COLOR_RED,"Du bist kein Admin oder dein Admin-Rang ist zu niedrig!");
    }
    new Float:ergebnis = 9999.9999, id = -1;
    for(new v= 0; v < MAX_VEHICLES; v++)
    {
    if(ergebnis > GetDistanceBetweenPlayerAndCar(v,playerid))
    {
    ergebnis = GetDistanceBetweenPlayerAndCar(v,playerid);
    id = v;
    }
    }


    if(id != -1 && ergebnis <= 20.0))
    {
    SetVehicleToRespawn(id);
    }
    }
    return 1;
    }