NearestObject?

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
  • Schönen Tag euch allen,
    meine Frage ist wie folgt: ich möchte einen Stein abfragen. Um genau zu sein möchte ich abfragen welcher am nächsten bei mir ist und diesen dann an mein Fahrzeug heften.
    Wie frage ich das am besten ab?
    if(IsPlayerNearObject(playerid,stein[]))
    {
    new vehicleid = GetPlayerVehicleID(playerid);
    AttachObjectToVehicle(stein[], vehicleid, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0);
    }

  • new stein[44];
    stein[0] = CreateDynamicObject(1303,471.0000000,868.0000000,-29.3000000,0.0000000,0.0000000,0.0000000); //object(dyn_quarryrock03) (1)
    stein[1] = CreateDynamicObject(1303,467.3999900,868.7000100,-28.7000000,0.0000000,0.0000000,0.0000000); //object(dyn_quarryrock03) (2)
    stein[2] = CreateDynamicObject(1303,472.7999900,871.7000100,-29.8000000,0.0000000,0.0000000,0.0000000); //object(dyn_quarryrock03) (3)
    stein[3] = CreateDynamicObject(1303,475.0000000,876.9000200,-30.4000000,0.0000000,0.0000000,0.0000000); //object(dyn_quarryrock03) (4)
    stein[4] = CreateDynamicObject(1303,471.7999900,881.0000000,-30.0000000,0.0000000,0.0000000,0.0000000); //object(dyn_quarryrock03) (5)
    ....................

  • Verwende diese Funktion:
    stock GetNearestStone(playerid, Float:dist)
    {
    new Float:x, Float:y, Float:z, Float:smallest = 9999999.9, id = -1, Float:tmp;
    for(new i=0; i<sizeof(stein); i++)
    {
    GetDynamicObjectPos(stein[i], x, y, z);
    tmp = GetPlayerDistanceFromPoint(playerid, x, y, z);
    if(tmp <= dist && tmp < smallest)
    {
    smallest = tmp;
    id = i;
    }
    }
    return id;
    }


    Dann siehst es so aus:
    new vehicleid = GetPlayerVehicleID(playerid);
    new id = GetNearestStone(playerid, 10.0); //Nächster Stein im Umkreis von 10 Meter
    if(id == -1) return SendClientMessage(playerid, 0xFF0000FF, "Error: Du bist nicht in der Nähe eines Steins!");
    AttachDynamicObjectToVehicle(stein[id], vehicleid, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0);


  • stock getMin() {
    new min, i;
    new Float:Pos[4];
    for(; i < sizeof(stein);i++) {
    GetDynamicObjectPos(stein[i], Pos[0], Pos[1], Pos[2]);
    Pos[3] = GetPlayerDistanceFromPoint(playerid, Pos[0], Pos[1], Pos[2]);
    if(i == 0) {
    min = i;
    }
    if(Pos[3] < min)
    min = i;
    }
    return min;
    }


    Ist natürlich ungetestet


    Edit: Jeffrys ist besser
    Edit2: Jeffrys Verbesserungen
    Edit3: Jetzt aber

  • ChristianW:
    Das wird dir Tag Mismatches geben, da du zum einen einen Float returnst ohne es im Kopf angegeben zu haben und zum anderen der Variable min (Integer) den 4. Index von Pos (Float) zuweist.

    Außerdem bekommst du die Distanz zum nächsten Stein, und nicht den nächsten Stein zurück. Das bringt relativ wenig. ;)
    Zudem musst du GetDynamicObjectPos verwenden, da er den Streamer verwendet.


    Cr1me: Es sei anzumerken, dass du "stein[44]" natürlich global unter den Includes deklarieren musst, aber ich denke das weißt du.

  • Edit: Dürfte jz richtig sein?


    Nein...so wäre es richtig:


    stock getMin() {
    new Float:min, i, t, Float:Pos[4];
    for(; i < sizeof(stein);i++) {
    GetDynamicObjectPos(stein[i], Pos[0], Pos[1], Pos[2]);
    Pos[3] = GetPlayerDistanceFromPoint(playerid, Pos[0], Pos[1], Pos[2]);
    if(!i) min = Pos[3];
    if(Pos[3] < min) min = Pos[3],t=i;
    }
    return t;
    }


    Wobei...Jeffrys code doch völlig ausreicht :rolleyes:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

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