"Alive" für Objekte... Wie kann man checken ob Gruppen noch existieren?

  • Hallo Forengemeinde,


    und immer noch bastel ich an einer ArmA-Mission die sich wie eine "Battlefield X" - Mission spielen läßt!
    Es ist immer das Selbe: Ist ein Problem gelöst, taucht das Nächste auf!


    Ich habe es jetzt dank Eurer Hilfe geschafft das der Status eines "Punktes" gecheckt werden kann, soll heißen: Ein Trigger reagiert darauf ob sich Blufor oder Opfor Truppen im Bereich des Triggers befinden!
    Allerdings war meine Denkweise (logik) falsch!


    Lange Rede, kurzer Sinn (und würde außerdem nur verwirren und vom Thema ablenken)!


    Was ich brauchte wäre eine Möglichkeit um zu checken ob eine Komplette Gruppe...



    Code
    1. _OpfWaPuEins = [getmarkerpos "OpfWaPuEinsStart", east, ["O_Soldier_SL_F", "O_HeavyGunner_F", "O_soldier_AR_F", "O_soldier_M_F", "O_soldier_AAR_F", "O_soldier_LAT_F", "O_Sharpshooter_F", "O_medic_F"],[],[],[],[],[],270] call BIS_fnc_spawnGroup;

    ...noch lebt/existiert!?


    Ansonsten... Gibt es eine Möglichkeit ein Objekt/einen Soldaten zu spawnen, bzw. wird ein Soldat überhaupt als Objekt erkannt/akzeptiert?


    Viele Grüße,


    Ulli

  • Entscheidender ob die Gruppe exisitert finde ich, ob noch mindestens eine Einheit in der besagten Gruppe lebt:


    Code
    1. units _OpfWaPuEins findIf {alive _x} != -1

    Was auf deutsch heißt: Es exisitert eine Einheit in Gruppe "OpfWaPuEins", die lebt.


    Explizit gibt es mit @CBA_A3 die Funktion:


    Code
    1. _OpfWaPuEins call CBA_fnc_isAlive


    >Ansonsten... Gibt es eine Möglichkeit ein Objekt/einen Soldaten zu spawnen, bzw. wird ein Soldat überhaupt als Objekt erkannt/akzeptiert?


    Ne, Soldaten (simulation soldier-Klassen) können nur innerhalb einer Gruppe exisiteren. Aber mit createUnit kann man neue Soldaten zu alten Gruppen hinzufügen.


    Btw, du kannst ruhig die Variablennamen ausschreiben. OpfWaPuEins sieht aus, als wäre die Stirn mit der Tastatur kollidiert. Moderne Texteditoren können lange Variablennamen automatisch mit Tab vervollständigen.

  • Ich habe jetzt Folgendes ausprobiert:



    Code
    1. _OpfWaPuEins = [];
    2. if !(PuEiSta) then {
    3. OpfWaPuEins = execVM "Scripte\OpfWaPuEins.sqf";
    4. hint "Unser Hauptquartier ist nicht besetzt / wird nicht verteidigt!";
    5. } else {
    6. if !(isNull OpfWaPuEins) then {
    7. BluWaPuEins = execVM "Scripte\BluWaPuEins.sqf";
    8. hint "Unser Hauptquartier wird verteidigt!";
    9. }
    10. };

    In Zeile 1 wird die Gruppe _OpfWaPuEins (Opfor Wache Punkt 1) deklariert.
    In Zeile 2: Wenn Punkt 1 Status = falsch (also, wenn keine Bluefor-Truppen mehr da sind) dann gehört der Punkt Opfor, also spawne eine Opfor-Wachgruppe für Punkt 1
    In Zeile 3 wird o.g. Gruppe gespawnt
    In Zeile 4: Testkommentar
    In Zeile 5: Andernfalls...
    In Zeile 6:... aber NUR wenn KEINE Opfortruppen mehr da sind (!!!)...
    In Zeile 7:... spawne wieder eine Bluefor-Wachtruppe für Punkt 1!
    In Zeile 8: Wieder ein Testkommentar!


    Wenn ich Zeile 6 weg lasse gibt's keine Fehlermeldung!
    Ist Zeile 6 aber aktiv gibt es die Meldung das OpfWaPuEins nicht definiert sei...


    Wieso?
    Das habe ich doch in Zeile 1 getan... Oder nicht? ?(


    Ups, Das hat sich jetzt überschnitten!

  • Entscheidender ob die Gruppe exisitert finde ich, ob noch mindestens eine Einheit in der besagten Gruppe lebt:

    Da hast Du völlig Recht, aber ich kämpfe noch etwas (ETWAS???) mit " der Logik"!
    Soll heißen: Ich kenne ja kaum Möglichkeiten, also überlege ich mir "etwas"... Und diese "etwas" ist wahrscheinlich SEHR weit von Dem entfernt was erfahrenen Scriptern einfallen würde, aber ich weiß es eben noch nicht besser! :(
    Klar, die Möglichkeit ist noch besser... Aber wie setze ich die jetzt um?
    Rethorische Frage, ich überlege mir Was... Und frage dann warum's nicht funktioniert! ;)

  • _OpfWaPuEins ist eindeutig etwas anderes als OpfWaPuEins ohne Underscore.



    In SQF werden Variablen nicht deklariert. Der Datentyp der Variable wird mit der Wertzuweisung (Assignment =) festgelegt.



    In Z1 wird ein ARRAY zugewiesen. In Z3 wird ein SCRIPT handle zugewiesen. Und in Z6 wird der isNull-Befehl benutzt. isNull akzeptiert keine ARRAY, sondern nur GROUP, OBJECT, SCRIPT und noch so ein paar Typen.



    Ich kann ehrlich gesagt von dem Schnipsel nicht ausmachen, was das überhaupt tun soll. Ist OpFWaPuEins immer noch eine GROUP?

  • Entscheidender ob die Gruppe exisitert finde ich, ob noch mindestens eine Einheit in der besagten Gruppe lebt:

    Ja, genau. War es nicht so, dass die Gruppe selbst auch dann noch existiert, wenn alle Einheiten tot (leer) sind?! Ich meine mich erinnern zu können, dass man sowohl Einheiten als auch Gruppe löschen musste.

  • Gut, mir ist empfohlen worden das Problem so ausführlich wie möglich zu beschreiben und zum besseren Verständnis hole ich mal etwas weiter aus!


    Also, ich möchte eine Mission machen die sich wie eine "Battlefield 1942 - Mission" spielen läßt!
    Warum kaufe ich mir ArmA wenn ich BF42 spielen möchte?
    Nun, das ist meine selbst gestellte Aufgabe zum scripten lernen! :)


    Wie BF42 läuft brauche ich, glaube ich Niemandem zu erklären?
    Mein Projekt soll (ganz grob erklärt) folgendermaßen funktionieren:
    Das Spiel startet, ein Startscript wird ausgeführt!
    Bluefor und Opfor starten mit jeweils 4 eigenen "Punkten", diese Punkte werden durch jeweils eine Wachmannschaft verteidigt!
    Außerdem spawnen bei Spielbeginn weitere Truppen, die nun die Aufgabe haben die Gegnerischen Punkte zu erobern.
    Sollte eine dieser Einheiten vernichtet werden, spawnt Sie neu, aber...
    Je mehr Punkte eine Seite hält, desto mehr Einheiten bekommt die Seite zurück. Je weniger Punkte Sie hält, desto weniger Einheiten bekommt Sie zurück!
    Aber Das ist Alles bisher nur geplant.


    Zur Zeit habe ich folgendes Problem (Beispiel):
    Das Spiel beginnt, eine Bluefor-Wacheinheit spawnt auf Punkt X.
    Eine Opfor-Einheit greift an, gewinnt, die Bluefor-Einheit existiert nicht mehr... Der Punkt gehört Opfor!
    Zum Zeichen, das der Punkt Opfor "gehört" spawnt nun eine Opfor-Wacheinheit auf dem Punkt!
    Wenn dieser Punkt nun von Bluefor zurück erobert wird, also wenn sich nur Bluefor-Truppen und keine Opfor-Einheiten mehr auf dem Punkt befinden, spawnt wieder eine Bluefor-Wacheinheit!


    Ich wollte das Problem folgendermaßen lösen (Beispiel für einen Punkt, der Bluefor gehört):
    Auf dem Punkt liegt ein wiederholbarer (!!!) Trigger, Variablenname = PuEiSta (Punkt 1 Status), Radius = 100 Meter, ausgelöst durch Bluefor wenn vorhanden.
    Bei Aktivierung wird das Script StatusPunktEins ausgeführt, hier der Aktivierungscode:

    Code
    1. PuEiSta = true;StatusPunktEins = execVM "Scripte\StatusPunktEins.sqf";


    Und hier script StatusPunkt Eins:


    Code
    1. if !(PuEiSta) then {
    2. OpfWaPuEins = execVM "Scripte\OpfWaPuEins.sqf";
    3. hint "Unser Hauptquartier ist nicht besetzt / wird nicht verteidigt!";
    4. } else {
    5. BluWaPuEins = execVM "Scripte\BluWaPuEins.sqf";
    6. hint "Unser Hauptquartier wird verteidigt!";
    7. };


    Wenn die Variable PuEiSta wahr ist (ist Sie, wenn Bluefor vorhanden ist!)... Aber ich denke, Das brauche ich Euch wirklich nicht zu erklären! ^^


    Bei Deaktivierung, also wenn keine Bluefor -Einheit mehr vorhanden ist:

    Code
    1. PuEiSta = false;StatusPunktEins = execVM "Scripte\StatusPunktEins.sqf";


    Soweit, so falsch, denn nun passiert Folgendes:
    Bluefor wird angegriffen, vernichtet, Opfor spawnt und sobald irgendeine Bluefor-Einheit in den Trigger läuft spawnt eine neue Bluefor-Wachmannschaft in die in Stellung liegende Opfor-Truppe!


    SO SOLL DAS NICHT SEIN!!!


    Die neue Bluefor Wachmannschaft soll erst dann spawnen, wenn sich KEINE Opfor-Einheit mehr im Triggerbereich befindet!


    Auch soll verhindert werden daß Einheiten mehrfach gespawnt werden!
    Falls die Wacheinheiten aus irgendwelchen Gründen aus dem Triggerbereich raus laufen, aber noch existieren, sollen Sie NICHT neu spawnen können...
    NUR WAS DEFINITIV NICHT MEHR EXISTIERT, DARF (ggf.) NEU SPAWNEN!!!


    Ich habe lange drüber nachgedacht und denke (sicher bin ich mir da nicht! Ich dachte ja auch die o. g. Methode würde funktionieren! :( ) das Folgende könnte helfen:


    if !(PuEiSta) then {
    if OpfWaPuEins NICHT existiert then {
    OpfWaPuEins = execVM "Scripte\OpfWaPuEins.sqf";
    hint "Eine Opfor-Wachmannschaft wird gespawnt!";
    } else {
    hint "Sorry, diese Truppe existiert noch!";
    }
    } else {
    if BluWaPuEins NICHT existiert then {
    BluWaPuEins = execVM "Scripte\BluWaPuEins.sqf";
    hint "Eine neue Bluefor Wachmannschaft wird gespawnt!";
    } else {
    hint "Sorry, diese Truppe existiert noch!";
    };


    Das natürlich jetzt nur so als Beispiel, deswegen habe ich's auch nicht als Code ausgegeben!


    Also, in der If-Verzweigung eine weitere If-Verzweigung die abfragt ob OpfWaPuEins noch lebt!
    Falls ja... NICHT neu spawnen!


    Das Selbe dann natürlich für BluWaPuEins!


    So, ich hoffe die Logik stimmt jetzt... Aber irgendwie habe ich das Gefühl... Na ja, warten wir den Probelauf ab!


    Also, wie sieht der Code aus, was muß ich da reinschreiben?

  • OH WOW... Die Profilösung!!! :thumbsup: :thumbsup: :thumbsup:


    Also, da ich ja scripten lernen möchte werde ich zuerst mal versuchen (wenigstens halbwegs!) aufzudröseln was da abgeht... Auch wenn ich da wenige Chancen sehe Das wirklich zu verstehen!
    Und was die Variablennamen betrifft: Die kann ich relativ schnell ändern! ;)


    Und direkt die erste Frage: Das ist kein Script das auf (für mich) normalem Wege gestartet wird, richtig? Dieses Programm muß in eine... Datei (?) eingebaut werden die bei Programmstart/Missionsstart automatisch gestartet wird (init.sqf?), richtig?
    Insofern ich richtig liege (was ich bezweifle)... Wo finde ich diese Datei, wie komme ich da dran? Ich höre/lese da heute nämlich zum ersten Mal von!


    Init.sqf are function files for pre-loading secondary scripts and if you intend on including additional functions all you need to do is create one and include it -edited with the additional commands- along side your .sqm inside the mission folder.


    Was? Ich "Kreiere" einfach Eine und speichere Sie in meinem Missionsordner???
    Das kann's nicht sein, oder?

  • >Auch wenn ich da wenige Chancen sehe Das wirklich zu verstehen!
    Es ist wirklich nicht kompliziert.


    >Und was die Variablennamen betrifft: Die kann ich relativ schnell ändern!
    Das wäre gut, denn im Moment sind es Zungenbrecher und wirklich beschreibend - was sie sind und was sie tun - sind sie auch nicht.


    >Das ist kein Script das auf (für mich) normalem Wege gestartet wird, richtig?
    Der normalste aller Wege ist die init.sqf-Datei. Alles im Editor ist Fluff rundherum.


    >Wo finde ich diese Datei, wie komme ich da dran?
    So wie jede Datei. Rechtklick -> Neu -> Textdokument -> nach Init.sqf umbenennen.


    Wenn Windows das TXT der Textdatei ausblendet, dann muss das erst in den Ordneroptionen deaktiviert werden. Ansonsten heißt die Datei init.sqf.txt und funktioniert nicht.
    Lies die Dokumentation: https://community.bistudio.com/wiki/Event_Scripts

  • Schaue mir grade das Tutorial von ArmaOpterix an... Dürfte klappen! ;)


    Ok, Das mit der Init.sqf scheint geklappt zu haben, allerdings gibt es beim Start eine Fehlermeldung, das übliche "fehlendes ;"!
    Leider ist die Meldung viel zu schnell wieder weg um irgendwas erkennen zu können!
    Anscheinend bemängelt er irgendwas bei "wait until" und "private units = all units"... Aber da ist definitiv ein ";"!


    Muß für Heute Schluß machen, kümmere mich Morgen weiter drum!


    Auf jeden Fall: VIELEN VIELEN DANK!!!!! :thumbsup: