global func GetTargetCrew(Range, posX, posY,pathclosed) // verfeindetes Crewmitglied
{
var obj;
for ( obj in FindObjects(Find_Distance(Range),Find_NoContainer(),Find_OCF(OCF_CrewMember), Find_Hostile(GetOwner() ) ) )
{
if(pathclosed)
return(obj);
if(!pathclosed)
if (PathFree(GetX()+posX,GetY()+posY,GetX(obj),GetY(obj)))
return(obj);
}
}
diese Funktion soll einfach nur alle feindlichen Clonks in der Umgebung finden und den erstbesten returnen (damit auf diesen dann zb geschossen werden kann).
Merkwürdigerweise schießen die Türme mit dieser Funktion nun aber auch auf meine eigenen Clonks ?!
Wo ist der fehler in der Funktion? Ich hab auch vorsichtshalber auch nochmal den Besitzer des Turmes geprüft, es ist derselbe Besitzer wie der des Clonks.
okay, ich hab festgestellt, dass an der funktion nichts verkehrt ist… der fehler muss woanders liegen…
der fehler lag in meiner Tiersuchfunktion. Diese habe ich mit pathclosed erweitert und dabei hat sich dann der fehler eingeschlichen, dass evlt jedes lebende objekt ausgegeben wird…global func GetTargetAnimal(Range, posX, posY,pathclosed) // gefährliche Tiere
{
var obj;
while (1)
{
obj = FindObject(0, posX, posY,-1,-1, OCF_Alive(),0,0,NoContainer(),obj);
if (!obj) break;
if (Distance(GetX()+posX,GetY()+posY,GetX(obj),GetY(obj)) > Range) return(0);
if (obj->~IsAnimalAim())
if(pathclosed)
return(obj);
if(!pathclosed)
if (PathFree(GetX()+posX,GetY()+posY,GetX(obj),GetY(obj)))
return(obj);
return(0);
}
return(0);
}
Du könntest beide Funktionen auch zu einer kombinieren:c4script<br/>FindObjects(Find_Distance(Range), Find_NoContainer(), Find_OCF(OCF_Alive), Find_Or(Find_Hostile(GetOwner()), Find_Func("IsAnimalAim")))<br/>
Das Problem bei deiner Funktion sind fehlende {}-Klammern. Aber für sowas ist FindObjects wirklich besser geeignet als das manuelle filtern - und du hast das doch eigentlich schon alles in der anderen Funktion auf FindObjects übersetzt.
ja genau, habe jetzt nach obj->~IsAnimalAim() die Klammern {} gesetzt.
Stimmt, hier hatte ich es noch nicht in eine for schleife umgewandelt, weil ich nicht drauf gekommen bin, dass obj->~IsAnimalAim() einfach nur nach dieser funktion sucht und ich es also mit Find_Func suchen lassen kann
Ich schreibe es also gleich mal um
Zusätzlich hab ich noch einen weiteren Parameter "container" zugefügt. Wenn dieser wahr ist, möchte ich ,dass auch Ziele innerhalb von Containern gefunden werden.
Muss ich dafür dann eine zweite for schleife bassteln, oder kann ich das irgendwie in FindObjects berücksichtigen, dass die Bedingung "Find_NoContaier()" nur gültig ist, wenn !container ?
Du kannst mit Find_And auch deine Suchargumente Schritt für Schritt zusammenbauen. Das könnte dann so aussehen:<br/>var criteria = Find_And(Find_Distance(Range), Find_OCF(OCF_Alive), Find_Or(Find_Hostile(GetOwner()), Find_Func("IsAnimalAim")));<br/>if (!container)<br/>  criteria = Find_And(criteria, Find_NoContainer());<br/><br/>for (var obj in FindObjects(criteria)) { ... }<br/>