Not logged inClonkspot Forum
Forum Home Help Search Register Login
Up Topic Deutsch / Hilfestellung / [Gelöst] for schleife zum finden von Feinden findet eigene
- - By Serpens66 (More than 200 posts.) Date 05.03.2015 23:06 Edited 06.03.2015 12:39
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.
Parent - - By Serpens66 (More than 200 posts.) Date 06.03.2015 12:25 Edited 06.03.2015 13:13
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);
}
Parent - - By Luchs (More than 1000 posts.) Date 06.03.2015 13:25
Du könntest beide Funktionen auch zu einer kombinieren:

```c4script
FindObjects(Find_Distance(Range), Find_NoContainer(), Find_OCF(OCF_Alive), Find_Or(Find_Hostile(GetOwner()), Find_Func("IsAnimalAim")))
```

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.
Parent - - By Serpens66 (More than 200 posts.) Date 06.03.2015 16:10
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 ?
Parent - By Luchs (More than 1000 posts.) Date 06.03.2015 17:05
Du kannst mit Find_And auch deine Suchargumente Schritt für Schritt zusammenbauen. Das könnte dann so aussehen:

```
var criteria = Find_And(Find_Distance(Range), Find_OCF(OCF_Alive), Find_Or(Find_Hostile(GetOwner()), Find_Func("IsAnimalAim")));
if (!container)
  criteria = Find_And(criteria, Find_NoContainer());

for (var obj in FindObjects(criteria)) { ... }
```
Up Topic Deutsch / Hilfestellung / [Gelöst] for schleife zum finden von Feinden findet eigene

Powered by mwForum 2.29.7 © 1999-2015 Markus Wichitill