Traingings Zone

  • Hi,


    mir fiel leider kein passender Titel für meine Frage bzw. Ergebnis ein.


    Ich möchte auf meiner default Trainings Map/Mission eine Zone haben, in der feindliche Einheiten dann erstellt (spanen) werden, wenn ein Spieler (BLUEFOR) diese betritt und wieder gelöscht werden wenn man diese verlässt. Ich bin ziemlich neu beim scripten in SQF und sonst habe ich auch nur rudimentäre Kenntnisse vom Programmieren.


    Als Ergebnis ist bei mir folgendes herausgekommen:


    Die Zivilisten und BLUEFOR habe ich für die Positionen gebraucht und diese dann auf 0% Presence gestellt.
    https://i.imgur.com/hIDwVB5.jpg


    Der Trigger beinhaltet im "On Activation":


    Code
    1. hint "The area was entered.";
    2. _null = execVM "scripts\spawn_vil.sqf";


    und in "On Deactivation":

    Code
    1. {deleteVehicle _x} forEach thisList;
    2. hint "The area was abandoned."

    Den Inhalt der spawn_vil.sqf habe ich im pastebin eingefügt
    https://pastebin.com/SRdHsax1


    Ich bin mir nur allzu bewusst, dass dies nicht die Glanzleistung dieses Forums ist. Umso mehr würde ich mich über konstruktive Kritik freuen und noch besser wäre eine gute Erklärung zu einem verbesserten CODE.

  • Mal ganz wichtig: Verwende Schleifen!
    Es ist absolut unnötig den selben Befehl mit nur unterschiedlichen Parametern tausend mal untereinander zu schreiben. Mach einfach ne Schleife die diesen Befehl dann mit den entsprechenden Argumenten aufruft...


    Und für deine Poitionen kannst du auch einfach einen Array machen. Dann hast du nicht so wahsinnig viele Variablen die vor ich hin siechen. Darüber hinaus ist es eig immer empfehlenswert lokale Variablen als private zu deklarieren, um unerwünschten Nebenwirkungen voruzbeugen.


    Dein Code würde dann etwa so aussehen:

    Und falls der Trigger öfters ausgelöst wird solltest du lieber mit hideObjectGlobal arbeiten, anstatt die Einheiten jedes mal zu löschen und wieder neu zu spawnen, da das den Server immer recht stark belastet...

  • Danke sehr Raven.


    dies war echt eine Hilfe.


    Vermutlich wolltest du in der Zeile 7. "_groups pushBack ([_x ......" schreiben und nicht _positions - hab ich bei mir geändert.


    zu hideObjecktGlobal:


    ich bekomme es leider nicht hin das die AI Einheiten "gelöscht" werden. Ich hatte ja geschrieben,
    dass ich im Trigger "{deleteVehicle _x} forEach thisList;" verwende. Dies ist aber sinnlos und ändert sich auch nicht wenn ich hiefür "{_x hideObjectGlobal} forEach thisList;" schreibe. So wie ich das nachgelesen habe, bezieht sich thisList nur auf Einheiten die den Trigger auslösen.


    Könntest du mir da helfen? Es ist natürlich auch jeder gefragt, der einem Noob helfen möchte.


    P.S. Ich möchte die AI Einheiten entfernen um immer wieder ein neues scenario zu bieten.


    P.P.S. Ich könnte mir auch vorstellen nur alle (noch nicht toten) AI aus dem _groups Array zu löschen, hierfür müsste ich aber später darauf zugreifen können.


    ist dieser Code beim "On Deactivation" gut?

    Code
    1. {_x hideObjectGlobal true;} count nearestObjects [getPos this, ["man"], 120];

    Einmal editiert, zuletzt von AvanKova () aus folgendem Grund: Idee zum löschen ergänzt.

  • Vermutlich wolltest du in der Zeile 7. "_groups pushBack ([_x ......" schreiben und nicht _positions - hab ich bei mir geändert.

    Oh ja in der Tat das sollte eig _groups heißen xD


    Hast du dir auch schon mal den Inhalt von thisList ausgeben lassen? Weil ich bin mir nicht ganz sicher ob der Trigger nicht nur die Blufor-Einheiten ausgeben würde...


    trigger list – This is the list of all objects that meet criteria set in trigger activation. To make it easier to understand: If this list is not empty, special variable this is true. From inside the trigger statement the same list can be obtained via special variable thisList.

    ist dieser Code beim "On Deactivation" gut?

    Jein... Wenn der Trigger nur auf dem Server initialisiert wird (was er sowieso sollte, da nicht jeder Client selber versuchen braucht Einheiten zu erstellen oder zu löschen) und du dir bewusst bist, dass der Code nur funktioniert, weil hideObjectGlobal als Return-Wert nil hat (Boolean wüde auch gehen). Wenn Letzteres nicht der Fall ist, dann füge noch ein nil-return in deinem count hinzu: {_x hideObjectGlobal true; nil;} count ...

  • Hi,


    hier nun meine Lösung:


    ich habe viel mit hideObjectGlobal experimentiert, doch nie das richtige verhalten hervorrufen können.


    nun sieht das Ergebniss so aus:
    im "On Deactivation"
    {deleteVehicle _x;} count nearestObjects [getPos vilTrig_01, ["man"], 120];
    dabei ist die Wahl des Objekts "man" nur Zufall, ich konnte im biki keine Liste finden welche akzeptiert werden.


    das script so:

    Damit auch jeder Spieler mitbekommt das Jemand in die Zone rein ist, noch 2 folgende Meldungen:
    "On Activation" ["The area was entered.", "hint", true, true] call BIS_fnc_MP;
    "On Deactivation" ["The area was abandoned.", "hint", true, true] call BIS_fnc_MP;



    Ich werde nun noch versuchen Geiseln hinzu zu fügen und allem Tasks zuordnen. Mal sehen was daraus wird.

  • Damit auch jeder Spieler mitbekommt das Jemand in die Zone rein ist, noch 2 folgende Meldungen:

    Der Trigger ist also rein Server-seitig? Weil wenn der sowieso auf allen Clients ist, ist das Aufrufen von BIS_fnc_MP unnötig... Außerdem macht man das inzwischen vorzugsweise via remoteExec :P