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);
}
NearestObject?
- Cr1me
- Geschlossen
- Erledigt
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
-
-
Wie erstellst du die Steine denn im Code?
-
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)
.................... -
For Schleife der Steine
GetDistanceFromPoint abfragen und dann beim 1. mal zwischenspeichernWenn Distanz kleiner ist als variable die kleinere Distanz zwischenspeichern
Ist schwer zu erklären
-
okay werde ich gleich machen
danke -
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. -
Außerdem bekommst du die Distanz zum nächsten Stein, und nicht den nächsten Stein zurück. Das bringt relativ wenig.
Stimmt habs in der schnelle in Notepad geschrieben ändere das noch aber deins ist eh besserEdit: Dürfte jz richtig sein?
-
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
-
Wobei...Jeffrys code doch völlig ausreicht
Wollte nichts falsches da stehen haben -
breadfish.de
Hat das Thema geschlossen.