# \[Gelöst\] for schleife zum finden von Feinden findet eigene

**URL:** https://forum.clonkspot.org/t/gelost-for-schleife-zum-finden-von-feinden-findet-eigene/815
**Category:** Hilfestellung
**Created:** [5. März 2015 um 23:06 UTC](https://forum.clonkspot.org/t/gelost-for-schleife-zum-finden-von-feinden-findet-eigene/815 "2015-03-05T23:06:28Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![Serpens66](https://forum.clonkspot.org/letter_avatar_proxy/v4/letter/s/74df32/32.png) [@Serpens66](https://forum.clonkspot.org/u/Serpens66)
#### Post date: [5. März 2015 um 23:06 UTC](https://forum.clonkspot.org/t/gelost-for-schleife-zum-finden-von-feinden-findet-eigene/815/1 "2015-03-05T23:06:28Z")

</div>

`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 ?!&nbsp;   
Wo ist der fehler in der Funktion?&nbsp; Ich hab auch vorsichtshalber auch nochmal den Besitzer des Turmes geprüft, es ist derselbe Besitzer wie der des Clonks.

---

<div class="post-metadata">

### Author: ![Serpens66](https://forum.clonkspot.org/letter_avatar_proxy/v4/letter/s/74df32/32.png) [@Serpens66](https://forum.clonkspot.org/u/Serpens66)
#### Post date: [6. März 2015 um 12:25 UTC](https://forum.clonkspot.org/t/gelost-for-schleife-zum-finden-von-feinden-findet-eigene/815/2 "2015-03-06T12:25:52Z")

</div>

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);}`

---

<div class="post-metadata">

### Author: ![Luchs](https://forum.clonkspot.org/user_avatar/forum.clonkspot.org/luchs/32/9_2.png) [@Luchs](https://forum.clonkspot.org/u/Luchs)
#### Post date: [6. März 2015 um 13:25 UTC](https://forum.clonkspot.org/t/gelost-for-schleife-zum-finden-von-feinden-findet-eigene/815/3 "2015-03-06T13:25:42Z")

</div>

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(&quot;IsAnimalAim&quot;)))<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.

---

<div class="post-metadata">

### Author: ![Serpens66](https://forum.clonkspot.org/letter_avatar_proxy/v4/letter/s/74df32/32.png) [@Serpens66](https://forum.clonkspot.org/u/Serpens66)
#### Post date: [6. März 2015 um 16:10 UTC](https://forum.clonkspot.org/t/gelost-for-schleife-zum-finden-von-feinden-findet-eigene/815/4 "2015-03-06T16:10:34Z")

</div>

ja genau, habe jetzt nach obj-\>~IsAnimalAim() die Klammern {} gesetzt.   
Stimmt,&nbsp; hier hatte ich es noch nicht in eine for schleife umgewandelt, weil ich nicht drauf gekommen bin, dass&nbsp; 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 ?

---

<div class="post-metadata">

### Author: ![Luchs](https://forum.clonkspot.org/user_avatar/forum.clonkspot.org/luchs/32/9_2.png) [@Luchs](https://forum.clonkspot.org/u/Luchs)
#### Post date: [6. März 2015 um 17:05 UTC](https://forum.clonkspot.org/t/gelost-for-schleife-zum-finden-von-feinden-findet-eigene/815/5 "2015-03-06T17:05:14Z")

</div>

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(&quot;IsAnimalAim&quot;)));<br/>if (!container)<br/>&#160; criteria = Find_And(criteria, Find_NoContainer());<br/><br/>for (var obj in FindObjects(criteria)) { ... }<br/>`
