Beitrag von ReborN ()
Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
Denkanstoß:
Schleife die alle Möglichen Objekte durchgeht. (2000?)
Abfragen ob Objekt Valid, Abfrage wo das Objekt ist, Abfragen wie weit der Spieler vom Objekt weg ist.
Das nächste Objekt ist dann das mit der geringsten Differenz.
Schreib wenn du wo nicht weiter kommst
Mal ein etwas sinnvollerer Denkanstoß, der die Pumpe deines Servers nicht unnötig rennen lässt:
Geladene Objekte mit Koordinaten und Indikator in einem Array speichern -> So schließt du schonmal alle nicht vorhandenen Objekt-IDs aus und kannst auch problemlos mit Streamern arbeiten. Der Rest von SynonymousZ ist eigentlich korrekt, while oder for-Schleife über den Array heizen und Entfernung zum Spieler mittels IsPlayerInRangeOfPoint ermitteln, fertig.
Der Array bietet dir dann übrigens auch darüber hinaus die Möglichkeit deine Objekte dynamisch zu editieren, ohne dabei immer wieder auf ein Filesystem zurückgreifen zu müssen.
Ich danke euch
Funktioniert nun wie es soll.
MfG
//Edit
Hab mal noch eine andere Frage und zwar,
habe ich einen Befehl mit IsPlayerInArea (bei mir umbenannt zu IsPlayerInZone), die Area wird wie folgt abgefragt:
if(IsPlayerInZone(playerid,HausBau[hb][hbPosX],HausBau[hb][hbPosY],HausBau[hb][hbPos2X],HausBau[hb][hbPos2Y]))
Eine for schleife geht in den Fall durch alle Gebiete, an der stelle wo der Besitzer identisch ist mit dem gespeicherten Wert wird die schleife "gestoppt" und es sollte zu der Abfrage IsPlayerInZone weiter gehen.
Dies tut es auch.
Lediglich habe ich nun folgendes Problem, irgendwie akzeptiert er das mit dem Area nicht.
Die Prints sind wie folgt:
printf("return PlayerPOS X:%f - Y:%f", pPos[0], pPos[1]);
printf("return ZoneAreaMin X:%f - X:%f", HausBau[hb][hbPosX],HausBau[hb][hbPosY]);
printf("return ZoneAreaMax X:%f - X:%f", HausBau[hb][hbPos2X],HausBau[hb][hbPos2Y]);
Bei IsPlayerInZone, sollte eine 1 zurück gegeben werden, tut es jedoch nicht, sondern eine 0.
Der Stock dazu:
stock IsPlayerInZone(playerid,Float:MinX,Float:MinY,Float:MaxX,Float:MaxY)
{
new Float:Pos[3];
GetPlayerPos(playerid,Pos[0],Pos[1],Pos[2]);
if(Pos[0] >= MinX && Pos[0] <= MaxX && Pos[1] >= MinY && Pos[1] <= MaxY)
{
return true;
}
return false;
}
Der Witz hierbei ist jedoch, dass er mit genau den gleichen Koordinaten (auch gleiche Anordnung) die Funktion "GangZoneCreate" ausführt und diese wird auch erstellt.
Meine weitere Frage nun, wo soll hier ein Fehler sein?
Die Koordinaten sind korrekt & laut den Print stimmen diese auch mit der Abfrage im stock überein.
MfG
Möglicherweise übergibst du die Werte falsch, oder lädst sie sogar falsch.
Printe dir das ganze mal, dann siehst du wo der Fehler liegt.
stock IsPlayerInZone(playerid,Float:MinX,Float:MinY,Float:MaxX,Float:MaxY)
{
new Float:Pos[3];
GetPlayerPos(playerid,Pos[0],Pos[1],Pos[2]);
printf("%0.2f >= %0.2f | %0.2f <= %0.2f | %0.2f >= %0.2f | %0.2f <= %0.2f", Pos[0], MinX, Pos[0], MaxX, Pos[1], MinY, Pos[1], MaxY);
if(Pos[0] >= MinX && Pos[0] <= MaxX && Pos[1] >= MinY && Pos[1] <= MaxY)
{
print("true");
return true;
}
print("false");
return false;
}
Falls du den Fehler nicht findest, poste bitte den print.
Hallo Jeffry:,
Den gleichen Print hatte ich ja oben schon ausgeführt, leider jedoch vergessen den Print hier mit einzufügen.
Er gibt mir bei meinen Print (was das gleiche ist wie bei dir) folgendes aus:
Print:
printf("return PlayerPOS X:%f - Y:%f", pPos[0], pPos[1]);
printf("return ZoneAreaMin X:%f - X:%f", HausBau[hb][hbPosX],HausBau[hb][hbPosY]);
printf("return ZoneAreaMax X:%f - X:%f", HausBau[hb][hbPos2X],HausBau[hb][hbPos2Y]);
Log:
[19:11:55] return PlayerPOS X:913.007568 - Y:-1659.893310
[19:11:55] return ZoneAreaMin X:921.935729 - X:-1646.126220
[19:11:55] return ZoneAreaMax X:898.636779 - X:-1668.512207
[19:11:55] if(Pos[0] >= MinX && Pos[0] <= MaxX && Pos[1] >= MinY && Pos[1] <= MaxY)
Der Wert von GetPlayerPos X & Y stimmt so, wie es auch in der If Abfrage im Stock abgefragt wird.
Jedoch muss ich dazu sagen, dass wir "IsPlayerInZone" ebenfalls schon des öfteren verwendet haben, wo es auch funktioniert hatte bzw. noch immer funktioniert.
Wieso es jetzt hierbei plötzlich nicht funktioniert ist komisch.
ocmd:bauen(playerid)
{
for(new hb= 0;hb<10;hb++)
{
print("1");
if(HausBau[hb][BesitzerGR] == SpielerInfo[playerid][SPName])
{
print("2");
new Float:pPos[3];
GetPlayerPos(playerid, pPos[0], pPos[1], pPos[2]);
printf("return PlayerPOS X:%f - Y:%f", pPos[0], pPos[1]);
printf("return ZoneAreaMin X:%f - X:%f", HausBau[hb][hbPosX],HausBau[hb][hbPosY]);
printf("return ZoneAreaMax X:%f - X:%f", HausBau[hb][hbPos2X],HausBau[hb][hbPos2Y]);
print("if(Pos[0] >= MinX && Pos[0] <= MaxX && Pos[1] >= MinY && Pos[1] <= MaxY)");
if(IsPlayerInZone(playerid,HausBau[hb][hbPosX],HausBau[hb][hbPosY],HausBau[hb][hbPos2X],HausBau[hb][hbPos2Y]))
{
print("3");
ShowPlayerDialog(playerid,DIALOG_HAUS_BAUEN,DIALOG_STYLE_LIST,"Objekt Verwaltung","Bau Objekte","Weiter","Abbruch");
return true;
}
}
}
return true;
}
Die prints werden alle anzeigt, welche vor der Abfrage "IsPlayerInZone" sind, mehr jedoch nicht.
MfG
Naja, deine prints sind nicht wirklich hilfreich, die sind zum einen falsch beschriftet und zum anderen durcheinander.
Aber wie du hier siehst:
Zitat[19:11:55] return ZoneAreaMin X:921.935729 - X:-1646.126220
[19:11:55] return ZoneAreaMax X:898.636779 - X:-1668.512207
Der Min Wert ist größer als der Max Wert. Das ist falsch.
Also entweder du lädst es falsch, oder du musst es bei der Abfrage umdrehen, sprich zuerst die "2"-Pos eintragen, und dann die "normale".
Du bist zwar schon etwas weiter in deinem System jedoch würde ich um das baugebiet eine Zone erstellt mit der Hilfe des Streamerplugins.
http://forum.sa-mp.com/showthread.php?t=102865
CreateDynamicRectangle(Float:minx, Float:miny, Float:maxx, Float:maxy, worldid = -1, interiorid = -1, playerid = -1);
Du kannst bei dem Befehl bauen dem user die Möglichkeit geben Objekte anzuklicken:
SelectObject(playerid);
über das Callback
OnPlayerSelectDynamicObject(playerid, objectid, modelid, Float:x, Float:y, Float:z);
kannst du abprüfen ob dieses Objekt in der bauzone ist, die dem Spieler gehört.
IsPointInDynamicArea(areaid, Float:x, Float:y, Float:z);
Danke dir.
Da hilft es doch des öfteren, wenn man die natives mal lesen würde
MfG