Gejagte Script problem

  • Hallo liebe scripter.


    Ich bin gerade drann ein script zu schreiben in dem die Spieler von gegnergruppen verfolgt werden klappt auch bis jetzt sehr gut.
    Nur komm ich auf das problem wenn ich eine 2 gruppe Call wird es nicht nicht mehr ausgeführt solange die erste Gruppe da ist.



    und das ganze wird so ausgelöst.


    Code
    1. [spawn1,independent,["LOP_AFR_Infantry_TL","LOP_AFR_Infantry_Rifleman_2","LOP_AFR_Infantry_Rifleman"],"FULL",s1] call hunting;

    für hilfe wäre ich sehr dankbar :thumbsup:


    gruss florian

  • wenn du eine function callst in einem scheulded env wird die function ausgeführt und die oberen scopes nicht weiter bearbeitet bis der call durch ist. d.h. 1. du spawnst das ganze oder setzt auf eine andere methode wie z.b. einen PFH der alle 30 sec auslöst was hier warscheilich besser währe ;)

  • Also ich hab keine Ahnung wie fit du in SQF bist, aber solltest du Jokos Antwort nicht ganz verstehen erkläre ich es hier nochmal etwas verständlicher :)


    • Scheduled Environment: Das ist letztendlich eine Laufzeitumgebung für dein Script, bei dem ArmA deinem Script max. 3ms Zeit gibt, um fertig zu werden. Scahfft es das nicht, so wird das Script pausiert und im nächsten Frame dort fortgesetzt (wieder max. 3ms, dann wieder Pause, usw.) bis es schließlich beendet ist. Und bevor du dich fragst: Solange du keine "fancy" Sachen gemacht hast um in einer unscheduled environment zu landen gilt das oben genannte Prinzip
    • Der call Befehl macht letztendlich nichts anderes, als den Code der aufgerufenen Funktion direkt in das aktuelle Script einzubetten, also quasi á la Copy+Paste (so kann man sichs zumindest gut vorstellen). Das bedeuetet, dass eine Funktion die mit call aufgerufen wird Teil des aufrufenden Scripts wird. Im Gegensatz dazu landen Funktionen mit spawn auf dem Tisch des ArmA-Schedulers, laufen also eigenständig und unabhängig von dem aufrufenden Script ab.

    Daraus folgt:
    Da deine Funktion mit call aufgerufen wird, macht dein aufrufendes Script erst dann weiter, wenn diese Funktion beendet ist. Da aber deine Funktion einen while {true} beeinhaltet (was nebenbei bemerkt nie eine gute Idee ist) wird sie niemals fertig (sie hängt für immer in dieser Schleife). Da du dich in der scheduled environment befindest wird die Funktion alle 3ms gestoppt und auf den nächsten Frame verschoben, sodass du kein Standbild bekommst (das würde in der unscheduled environment bei diesem Code passieren, da Scripte abgeschlossen werden müssen, damit der nächste Frame erscheint).
    Wenn du also eine zweite Gruppe hinzufügen willst, wird der entsprechende Funktionsaufruf niemals erreicht, da das Script noch im ersten Script hängt.



    Lösungsvorschläge:

    du spawnst das ganze

    Bedeutet also, dass deine Funktion nicht Teil des aufrufenden Scripts wird, sondern eigenständig weiter läuft, sodass dein Ursprungsscript weiter machen kann (z.B. die nächste Gruppe erstellen). Funktioniert, ist aber die definitv unperformantere Methode



    oder setzt auf eine andere methode wie z.b. einen PFH der alle 30 sec auslöst was hier warscheilich besser wäre

    PFH = PerFrameEventHandler und das ist letztendlich ein EventHandler, der jedes Frame ausgelöst wird, dh wenn du einem solchen EH Code mitgibst, wird er jedes Frame ausgeführt.
    Was Joko dir vorschlägt ist also in deiner Funktione anstatt der while {true} einen solchen EventHandler hinzuzufügen, der dann in jedem Frame überprüft, ob er die WegpunktPosition verändern muss.
    Das ist mit Abstand die performantere (und elegantere) Lösung, wobei du das call auch weiter verwenden kannst und solltest, aber leider auch mit Abstand die komplexere Lösung (zumindest wenn man es richtig macht). Wenn dich diese Methode interessiert, dann schau dir mal das an und falls du dich dazu entschließt diese Lösung anzugehen, dann kannst du ja spezifisch dazu nochmal eine Frage stellen und dann können wir dir da auch noch etwas unter die Arme greifen ;)


    MFG Raven

  • Danke joko für die hilfe habe das ganze so gelöst.



    Auch wenn es nicht die Performante lösung sie funktioniert einmal.

    Code
    1. 0 = [] spawn {
    2. [spawn1,independent,["LOP_AFR_Infantry_TL","LOP_AFR_Infantry_Rifleman_2","LOP_AFR_Infantry_Rifleman"],"FULL",s1] call hunting;
    3. };

    Aber das mit dem PFH habe ich angeschaut doch ich bin da nicht durchgestigen für ein beispiel wäre ich sehr dankbar ich denke rein performance technisch wäre es die bessere lösung.



    ach noch danke an alle die geholfen haben :thumbup:

  • viel einfacher geht es wenn du einfach die function einfach direct spawnst und nicht erste einen spawn erstellst und dann dadrinne callst
    [spawn1,independent,["LOP_AFR_Infantry_TL","LOP_AFR_Infantry_Rifleman_2","LOP_AFR_Infantry_Rifleman"],"FULL",s1] spawn hunting

  • so schwer ist das garnicht mal wenn man CBA nutzt.

  • habe noch bischen am script gearbeitet und das ist rausgekommen


  • jop klappt bis jetzt alles habe aber noch weiter daran gearbeitet


    habe jetz noch ein hund zur gruppe dazu gefügt der im moment zwar nur bellt und noch keinen schaden macht.