04.08.2020 um 21:35
Felix
Beiträge: 695
Registriert am: 07.06.14
Veraltet!
Hier entlang bitte: W_FNC
-----------------------------------------------------------------------------------------------------
FL Functions
Die Beschreibungen in diesem Thread dienen der Intuition und genügen, um die Funktionen zu verwenden.
Für erweiterte Konfigurationen einfach einen Blick in die Doc-Strings der einzelnen sqf-Dateien werfen.
Diese Scripts ändern das Verhalten der KI nicht.
Sämtlicher Code versucht nur, den "Vanilla-Weg" der Befehlsgebung an die KI einzuhalten. Das Revealing macht nichts anderes, als performant und durch den MB gut kontrollierbar den knowsAbout Value ausgewählter Einheiten zu ändern. Dadurch ändert sich die Informiertheit der KI, was die "Intelligenz" und die Kampfentfernungen deutlich steigern kann.
Reveal-Trigger
Spoiler: AnzeigenAusblenden
Motivation:
Ich wollte, dass die KI einen bestimmten Bereich sehr dynamisch und pro-aktiv gegen den Spieler verteidigen kann, ohne, dass spezielle Routen festgelegt, oder andere sehr spezifische Hacks angewendet werden müssen.
Um das zu erreichen, habe ich mit guarded Points und Waypoint:Guard experimentiert.
Wunschlos glücklich wurde ich mit der Synergie aus den Beiden und einem knows about value == 1.5, der nun durch den Reveal-Trigger verwirklicht werden kann.
Verwendung:
Schritt 1:
Das Herstück des Frameworks ist es, sog. Reveal-Trigger (siehe On Activaton) zu definieren:
[img]https://i.imgur.com/M8TJRz0.jpg[/img] is not a valid Image.
Solch ein Trigger muss nur einmalig auf dem Server ausgeführt werden.
Da der Trigger im Bild auf BLUFOR steht, werden die Gruppen derjenigen BLUFOR Units, die den Bereich dieses Triggers betreten, an die KI mit einem knows about value == 1.5 revealt werden.
Dies geschieht alle 30 Sekunden. Jedes Mal wird geprüft, ob neue BLUFOR Units in den Bereich eingetreten sind, welche anschließend ebenfalls an die KI revealed werden.
Mit diesem Code in der On-Activation würde das Revealing automatisch nach 600 Sekunden beendet. Damit entfällt dann Schritt 3!
Schritt 2:
Dieser Schritt erzeugt die Reveal-Struktur im Hintergrund und ist wenigstens für eine Gruppe nötig, bevor der Reveal-Trigger funktionieren kann.
Und er spezifiziert, an welche KI Gruppen dieser Reveal-Trigger revealen soll (Dopplungen werden zugunsten der Performance verhindert).
Oder in der Init eine Gruppe im Editor:
Wichtig ist, zu beachten, dass als erstes Argument der Triggername verwendet wird, der das Revealing an diese Gruppen übernehmen soll.
Gruppen können immer noch hinzugefügt werden, auch, wenn der Trigger bereits aktiviert wurde und das Revealing schon läuft.
Schritt 3:
Will man das Revealing erst zu einem ganz bestimmten Zeitpunkt beenden, dann geht das so:
Mit diesem Code wird das Aufdecken gestoppt und die Variablen sowie Event-Handler, die für den Trigger mit dem gegebenen Namen benötigt wurden, werden gelöscht.
Aber natürlich NICHT die zugehörigen KI-Gruppen selbst. Diese erhalten einfach keine Informationen mehr.
ADDON: Remote-Reveal-Triger:
Motivation:
Nicht immer passt ein großer Reveal-Trigger zum Gelände. Gute Avenues of Approaches sollten belohnt und der Spieler dort entsprechend nicht der KI aufgeklärt werden.
Bspw. können so Flussdeltas vom Revealing ausgeschlossen, oder bestimmte Berge in der Ferne eingeschlossen werden.
Dazu kann nun einem Reveal-Trigger ein Remote-Reveal-Trigger zugewiesen werden, der dem Reveal-Trigger ein weiteres Gebiet zuweist.
Verwendung:
Schritt 1:
Erstelle einen Remote-Reveal-Trigger:
Schritt 2:
Ergänze die Condition des Haupt-Reveal-Triggers mit "start_variableNameOfMyRevealTrigger", so dass:
So können der Remote-Reveal-Trigger aus Schritt 1, oder beliebig viele weitere mit dem Reveal-Trigger "bramar_reveal_1" verknüpft werden.
Ich wollte, dass die KI einen bestimmten Bereich sehr dynamisch und pro-aktiv gegen den Spieler verteidigen kann, ohne, dass spezielle Routen festgelegt, oder andere sehr spezifische Hacks angewendet werden müssen.
Um das zu erreichen, habe ich mit guarded Points und Waypoint:Guard experimentiert.
Wunschlos glücklich wurde ich mit der Synergie aus den Beiden und einem knows about value == 1.5, der nun durch den Reveal-Trigger verwirklicht werden kann.
Verwendung:
Schritt 1:
Das Herstück des Frameworks ist es, sog. Reveal-Trigger (siehe On Activaton) zu definieren:
[img]https://i.imgur.com/M8TJRz0.jpg[/img] is not a valid Image.
Solch ein Trigger muss nur einmalig auf dem Server ausgeführt werden.
Da der Trigger im Bild auf BLUFOR steht, werden die Gruppen derjenigen BLUFOR Units, die den Bereich dieses Triggers betreten, an die KI mit einem knows about value == 1.5 revealt werden.
Dies geschieht alle 30 Sekunden. Jedes Mal wird geprüft, ob neue BLUFOR Units in den Bereich eingetreten sind, welche anschließend ebenfalls an die KI revealed werden.
[thisTrigger, 1.5, false, 600] call FL_fnc_reveal_trigger;
Mit diesem Code in der On-Activation würde das Revealing automatisch nach 600 Sekunden beendet. Damit entfällt dann Schritt 3!
Schritt 2:
Dieser Schritt erzeugt die Reveal-Struktur im Hintergrund und ist wenigstens für eine Gruppe nötig, bevor der Reveal-Trigger funktionieren kann.
Und er spezifiziert, an welche KI Gruppen dieser Reveal-Trigger revealen soll (Dopplungen werden zugunsten der Performance verhindert).
_groups = _some_spawn_params call MIL_fnc_spawnhandler;
["bramar_reveal_1", _groups] call FL_fnc_setRevealTo;
Oder in der Init eine Gruppe im Editor:
["bramar_reveal_1", [this]] call FL_fnc_setRevealTo;
Wichtig ist, zu beachten, dass als erstes Argument der Triggername verwendet wird, der das Revealing an diese Gruppen übernehmen soll.
Gruppen können immer noch hinzugefügt werden, auch, wenn der Trigger bereits aktiviert wurde und das Revealing schon läuft.
Schritt 3:
Will man das Revealing erst zu einem ganz bestimmten Zeitpunkt beenden, dann geht das so:
"bramar_reveal_1" call FL_fnc_deleteRevealStruct;
Mit diesem Code wird das Aufdecken gestoppt und die Variablen sowie Event-Handler, die für den Trigger mit dem gegebenen Namen benötigt wurden, werden gelöscht.
Aber natürlich NICHT die zugehörigen KI-Gruppen selbst. Diese erhalten einfach keine Informationen mehr.
ADDON: Remote-Reveal-Triger:
Motivation:
Nicht immer passt ein großer Reveal-Trigger zum Gelände. Gute Avenues of Approaches sollten belohnt und der Spieler dort entsprechend nicht der KI aufgeklärt werden.
Bspw. können so Flussdeltas vom Revealing ausgeschlossen, oder bestimmte Berge in der Ferne eingeschlossen werden.
Dazu kann nun einem Reveal-Trigger ein Remote-Reveal-Trigger zugewiesen werden, der dem Reveal-Trigger ein weiteres Gebiet zuweist.
Verwendung:
Schritt 1:
Erstelle einen Remote-Reveal-Trigger:
- Variablennamen (bspw. my_spotter_1)
- Activation: Seite des Spielers (bspw. BLUFOR)
- Activation Type: Present
- Server Only
- On-Activation:
[thisTrigger, "bramar_reveal_1"] call FL_fnc_remoteRevealTrigger;
Schritt 2:
Ergänze die Condition des Haupt-Reveal-Triggers mit "start_variableNameOfMyRevealTrigger", so dass:
this || start_bramar_reveal_1
So können der Remote-Reveal-Trigger aus Schritt 1, oder beliebig viele weitere mit dem Reveal-Trigger "bramar_reveal_1" verknüpft werden.
Spawn-Wrapper
Spoiler: AnzeigenAusblenden
Motivation:
Nutzt man die MIL_fnc benötigt man für jeden Spawn sehr viele Parameter von denen sich aber nur wenige pro Spawn ändern. Die anderen sind eher als Konstante zu betrachten. Der Code schreibt sich leichter und liest sich besser, wenn man die 'Konstanten' von den Veränderlichen kapselt.
Außerdem kann für Reveal-Trigger der Name der Reveal-Struktur in den Spawnprozess eingebracht werden, wenn sich die Einheit nicht im Bereich des Reveal-Triggers befindet, aber trotzdem Informationen erhalten soll. Zu guter Letzt wollte ich stets alle gespawnten Units auch als Zeus steuer- und sichtbar haben (vor Allem auf dem Server).
Verwendung:
Schritt 1:
In der initServer.sqf muss eine Vorbereitung getroffen werden:
Das registriert die standard - beachte die nil-Argumente - Spawnparameter (MIL_fnc), die vom Spawn-Wrapper künftig verwendet werden. Man kann auch weitere Standard-Spawnparameter registrieren.
Schritt 2:
Spawnen:
Standardmäßig werden die zuerst registrierten Parameter verwendet.
Hat man bspw. zwei Spawnparameter registriert, dann verwendet man die Zweiten durch den Index 1 als letztes Argument:
Optional:
Hat man nun gespawnt, möchte man auf die Gruppen auch komfortabel zugreifen können.
Dazu einfach das Prefix vom Spawning dieser Funktion übergeben:
Hat man bspw. 5 Gruppen mit dem Prefix "cool_squad" gespawnt, erhält man nun alle 5.
Die Funktion sichert dabei auch Verzögerungen durch das Netzwerk ab, denn meist sind die Gruppen nicht sofort nach ihrem Spawn auf dem HC verfügbar.
Optional:
'mySquadConfig' (siehe Code) kann man sich ebenfalls einmal in der initServer.sqf definieren:
ADDON: Marker-Sets:
Motivation:
Diese Funktion wurde eingebaut, um das Balancing beim Bau der Mission zu erleichtern.
Es kann damit hier und da noch schnell ein Spawn hinzuzufügt oder reduziert werden, nur durch kopieren oder entfernen eines Markers und ohne zwischen den Versuchen das Skript anfassen zu müssen.
Verwendung:
Schritt 1:
initServer.sqf:
Schritt 2:
Irgendein Skript auf dem Server:
Angenommen im Editor sind die Marker platziert.
Dann wird mit diesen zwei Schritten dort jeweils ein Squad gespawnt (und erhält Infos vom Reveal-Trigger "bramar_reveal_1", usw.).
Nutzt man die MIL_fnc benötigt man für jeden Spawn sehr viele Parameter von denen sich aber nur wenige pro Spawn ändern. Die anderen sind eher als Konstante zu betrachten. Der Code schreibt sich leichter und liest sich besser, wenn man die 'Konstanten' von den Veränderlichen kapselt.
Außerdem kann für Reveal-Trigger der Name der Reveal-Struktur in den Spawnprozess eingebracht werden, wenn sich die Einheit nicht im Bereich des Reveal-Triggers befindet, aber trotzdem Informationen erhalten soll. Zu guter Letzt wollte ich stets alle gespawnten Units auch als Zeus steuer- und sichtbar haben (vor Allem auf dem Server).
Verwendung:
Schritt 1:
In der initServer.sqf muss eine Vorbereitung getroffen werden:
// Standard configuration of enemy AI for this mission
private _mil_spawnhandler_enemy_params = [
nil, //0. prefix
nil, //1. number of groups
nil, //2. array of positions
east, //3. side
"ins", //4. faction, must be defined in MIL_factions
nil, //5. array containing units with roles -> impacts setPylonLoadOut
0, //6. radius (m) of spawn -> 0 is exact position
"eng_fr", //7. language of KI, default "silent"
"persian", //8. group of faces
false, //9. bool for makeup
0.8, //10. int overall skill
[0.7,0.7], //11. precision array [LowestPossibleValue, HighestPossibleValue]
true //12. bool for hc spawn
];
Das registriert die standard - beachte die nil-Argumente - Spawnparameter (MIL_fnc), die vom Spawn-Wrapper künftig verwendet werden. Man kann auch weitere Standard-Spawnparameter registrieren.
Schritt 2:
Spawnen:
["cool_squad", [(getMarkerPos "nice_place")], mySquadConfig, "myRevealTrigger"] call FL_fnc_spawnWrapper;
Standardmäßig werden die zuerst registrierten Parameter verwendet.
Hat man bspw. zwei Spawnparameter registriert, dann verwendet man die Zweiten durch den Index 1 als letztes Argument:
["cool_squad_other_faction", [(getMarkerPos "shitty_place")], mySquadConfig, nil,nil,nil 1] call FL_fnc_spawnWrapper;
Optional:
Hat man nun gespawnt, möchte man auf die Gruppen auch komfortabel zugreifen können.
Dazu einfach das Prefix vom Spawning dieser Funktion übergeben:
private _groups = ["cool_squad"] call FL_fnc_getGroups;
Hat man bspw. 5 Gruppen mit dem Prefix "cool_squad" gespawnt, erhält man nun alle 5.
Die Funktion sichert dabei auch Verzögerungen durch das Netzwerk ab, denn meist sind die Gruppen nicht sofort nach ihrem Spawn auf dem HC verfügbar.
Optional:
'mySquadConfig' (siehe Code) kann man sich ebenfalls einmal in der initServer.sqf definieren:
mySquadConfig= [
[["sql"],"SERGEANT"],
[["tl"],"CORPORAL"],
[["ar"],"PRIVATE"],
[["gren"],"PRIVATE"],
[["rfl"],"PRIVATE"],
[["tl"],"CORPORAL"],
[["ar"],"PRIVATE"],
[["gren"],"PRIVATE"],
[["rfl"],"PRIVATE"]
];
ADDON: Marker-Sets:
Motivation:
Diese Funktion wurde eingebaut, um das Balancing beim Bau der Mission zu erleichtern.
Es kann damit hier und da noch schnell ein Spawn hinzuzufügt oder reduziert werden, nur durch kopieren oder entfernen eines Markers und ohne zwischen den Versuchen das Skript anfassen zu müssen.
Verwendung:
Schritt 1:
initServer.sqf:
[["bramar","other_markernames_beginning"]] call FL_fnc_registerMarkerSets;
Schritt 2:
Irgendein Skript auf dem Server:
private _positions = ["bramar","qrf"] call FL_fnc_getPositions;
["bramar_qrf", _positions, squad, "bramar_reveal_1"] remoteExecCall ["FL_fnc_spawnWrapper",HC];
Angenommen im Editor sind die Marker
bramar_qrf_1, bramar_qrf_2, ..., bramar_qrf_5
Dann wird mit diesen zwei Schritten dort jeweils ein Squad gespawnt (und erhält Infos vom Reveal-Trigger "bramar_reveal_1", usw.).
Multitask-Trigger
Spoiler: AnzeigenAusblenden
Motivation:
Es sollen möglichst einfach per Trigger KI-Gruppen, samt spezifischer Wegpunkte/ Tasks, nachgespawnt und entschieden werden können, ob der Spieler im Trigger an die KI revealt werden soll oder nicht.
Da die Parameter für die verschiedenen Aufgaben zum größten Teil gleich sind, wurden frühere Trigger, wie Guard-, Patrol- und Ambush-Trigger unter diesem Neuen zusammengefasst.
Bspw. kann so hervorragend die aktive oder passive Verteidigung eines Compounds erzielt werden.
Außerdem könnte so auch simuliert werden, dass die KI während laufender Gefechte "die Stellung hält" und "abwartet", bis der Spieler die mit dem Trigger versehenen Bereiche betritt.
Beschreibung:
Jeder der folgenden Tasks erhält standardisierte Parameter, sodass er ohne weiter konfiguration erst Mal verwendet werden kann.
Bei besonderen Wünschen kann wahlweise das vollständige Parameter-Array für den spezifischen Task mit übergeben werden.
Bspw. für den Fall, dass man einen CBA- oder LAMBS-Befehl exakt konfigurieren möchte.
"GUARD", "SAD", "MOVE_GUARD":
"AMBUSH":
"LAMBS_RUSH", "LAMBS_CAMP", "PATROL_CBA", "DEFEND_CBA", "SEARCH_CBA":
"NO_TASK":
Verwendung:
Schritt 1:
Siehe Spawn-Wrapper 1. Schritt.
Schritt 2:
Das Herstück ist wieder einen Trigger wie folgt zu definieren ('Variable Name' nicht vergessen!):
[img]https://i.imgur.com/4HdeKIX.jpg[/img] is not a valid Image.
Statt "MY_TASK_CHOICE" muss natürlich aus "GUARD", "SAD", "NO_TASK", "AMBUSH" oder "LAMBS_RUSH" gewählt werden.
Falls sich der Trigger nicht schon innerhalb eines großen, aktiven Reveal Triggers befindet, kann das Revealing für diesen Triggerbereich durch ein simples 'true' zugeschaltet werden:
Übergibt man statt dem 'true' den Variablennamen eines Reveal-Triggers ("bramar_reveal_1"), wird dieser Mulittask-Trigger statt zu einem eigenständigen Reveal-Trigger zu einem Remote-Reveal-Trigger.
So könnten bspw. Wachposten an bestimmten Punkten simuliert werden, die sozusagen die Wachen am Schutzobjekt alamieren und die Position an diese durchgeben.
Wichtig ist an dieser Stelle die Ausführung auf dem HC, bzw. dort wo die KI Gruppen Lokal sind!
Sämtliche Gruppen sind dann im Weiteren via 'super_task_trigger_1_1, super_task_trigger_1_2, ..., super_task_trigger_1_n' verfügbar, je nachdem wie viele gespawnt wurden.
Es sollen möglichst einfach per Trigger KI-Gruppen, samt spezifischer Wegpunkte/ Tasks, nachgespawnt und entschieden werden können, ob der Spieler im Trigger an die KI revealt werden soll oder nicht.
Da die Parameter für die verschiedenen Aufgaben zum größten Teil gleich sind, wurden frühere Trigger, wie Guard-, Patrol- und Ambush-Trigger unter diesem Neuen zusammengefasst.
Bspw. kann so hervorragend die aktive oder passive Verteidigung eines Compounds erzielt werden.
Außerdem könnte so auch simuliert werden, dass die KI während laufender Gefechte "die Stellung hält" und "abwartet", bis der Spieler die mit dem Trigger versehenen Bereiche betritt.
Beschreibung:
Jeder der folgenden Tasks erhält standardisierte Parameter, sodass er ohne weiter konfiguration erst Mal verwendet werden kann.
Bei besonderen Wünschen kann wahlweise das vollständige Parameter-Array für den spezifischen Task mit übergeben werden.
Bspw. für den Fall, dass man einen CBA- oder LAMBS-Befehl exakt konfigurieren möchte.
"GUARD", "SAD", "MOVE_GUARD":
- Beliebig viele gruppen werden an gegebenen Positionen mit Hilfe der MIL_fnc gespawnt
- Auf Wunsch wird der Trigger zum Reveal-Trigger
- Die KI erhält einmalig entsprechende Wegpunkte
"AMBUSH":
- Beliebig viele gruppen werden an gegebenen Positionen mit Hilfe der MIL_fnc gespawnt
- Die Spieler werden zwangsweise aufgeklärt.
- Search and destroy-Wegpunkte werden alle 15 Sekunden auf den nächst gelegenen Spieler gesetzt
- Wird die KI vernichtet, wird das Rvealing automatisch beendet
"LAMBS_RUSH", "LAMBS_CAMP", "PATROL_CBA", "DEFEND_CBA", "SEARCH_CBA":
- Beliebig viele gruppen werden an gegebenen Positionen mit Hilfe der MIL_fnc gespawnt
- Die KI führt entsprechende Aufgabe aus
"NO_TASK":
- Beliebig viele gruppen werden an gegebenen Positionen mit Hilfe der MIL_fnc gespawnt
- Die KI hat erhält keine konkrete Aufgabe
Verwendung:
Schritt 1:
Siehe Spawn-Wrapper 1. Schritt.
Schritt 2:
Das Herstück ist wieder einen Trigger wie folgt zu definieren ('Variable Name' nicht vergessen!):
[img]https://i.imgur.com/4HdeKIX.jpg[/img] is not a valid Image.
[thisTrigger, [[2817.37,1057.63,0]], fireteam, "MY_TASK_CHOICE"] call FL_fnc_multiTaskTrigger;
Statt "MY_TASK_CHOICE" muss natürlich aus "GUARD", "SAD", "NO_TASK", "AMBUSH" oder "LAMBS_RUSH" gewählt werden.
Falls sich der Trigger nicht schon innerhalb eines großen, aktiven Reveal Triggers befindet, kann das Revealing für diesen Triggerbereich durch ein simples 'true' zugeschaltet werden:
[thisTrigger, [[2817.37,1057.63,0]], fireteam, "SAD", nil, true] call FL_fnc_multiTaskTrigger;
Übergibt man statt dem 'true' den Variablennamen eines Reveal-Triggers ("bramar_reveal_1"), wird dieser Mulittask-Trigger statt zu einem eigenständigen Reveal-Trigger zu einem Remote-Reveal-Trigger.
So könnten bspw. Wachposten an bestimmten Punkten simuliert werden, die sozusagen die Wachen am Schutzobjekt alamieren und die Position an diese durchgeben.
Wichtig ist an dieser Stelle die Ausführung auf dem HC, bzw. dort wo die KI Gruppen Lokal sind!
Sämtliche Gruppen sind dann im Weiteren via 'super_task_trigger_1_1, super_task_trigger_1_2, ..., super_task_trigger_1_n' verfügbar, je nachdem wie viele gespawnt wurden.
Vehicle-Spawn-Wrapper
Spoiler: AnzeigenAusblenden
Beschreibung:
Spawn Einheiten und ein Fahrzeug.
Lässt die Einheiten einsteigen und führt auf Wunsch zusätzlich einen Task aus.
Verwendung:
Schritt 1:
Siehe Spawn-Wrapper 1. Schritt.
Schritt 2:
Platziere Marker im Eden-Editor:
"altis_airport_technical_1","altis_airport_technical_2",...,"altis_airport_technical_n"
In der initServer.sqf:
[["altis_airport"]] call FL_fnc_registerMarkerSets;
Schritt 3:
Beispielsweise in einem Trigger, oder in sonstigem Skript:
[
["altis_airport","technical"],
myGroupConfig,
"my_reveal_trigger_name",
"UK3CB_TKM_O_Datsun_Pkm",
"PATROL_CBA"
] call FL_fnc_createVehicleCrewTask;
Phasenverwaltung
Spoiler: AnzeigenAusblenden
Motivation:
Trigger verwalten den Zugang zur Funktionalität in einer Mission.
Leider werden es oft viele und man kann sich nicht immer sicher sein, dass die Spieler nur jene Trigger aktivieren, die für den aktuellen Zeitpunkt im Missionsverlauf vorgesehen sind. Unverhofft werden andere Trigger ausgelöst und plötzlich stimmt bspw. das Kräfteverhältnis von KI und Spieler nicht mehr. Außerdem benötigt die kontinuierliche auswertung jedes Triggers Leistung auf dem Server.
Mit der Phasenverwaltung kann man nun Kompilationen an Triggern einem einzelnen, wenn man so möchte, Objective-Trigger zuordnen.
Erst wenn dieser Objective-Trigger ausgelöst hat, werden die Trigger der nachfolgenden Triggerkompilation freigeschaltet und vom Server ausgewertet.
Verwendung:
Schritt 1:
Registrierung der Kompilation und dem zugehörigen Objective-Trigger in der initServer.sqf:
Man kann beliebig viele dieser Phasen registrieren. Die Reihenfolge der Registrierung legt dabei auch die Reihenfolge der zu erfüllenden Ziele fest.
Man kann auch einzelne Registrierungen auskommentieren, was die Trigger wieder unabhängig von den Objectives verfügbar macht.
Schritt 2:
Danach ruft man ganz kurz und knapp diese Zeile auf, welche die Phasenverwaltung initialisiert.
Kommentiert man diese Zeile aus, sind alle Trigger gewohnt in beliebiger Reihenfolge verfügbar.
Optional:
Dadurch werden Trigger grundsätzlich nur alle 5 Sekunden ausgewertet.
Einzelnen kann natürlich nachträglich noch ein anderes Intervall zugewiesen werden.
Schritt 3:
Und mal wieder die entsprechende Zeile im Objective-Trigger
[img]https://i.imgur.com/PHn9MnS.jpg[/img] is not a valid Image.
Trigger verwalten den Zugang zur Funktionalität in einer Mission.
Leider werden es oft viele und man kann sich nicht immer sicher sein, dass die Spieler nur jene Trigger aktivieren, die für den aktuellen Zeitpunkt im Missionsverlauf vorgesehen sind. Unverhofft werden andere Trigger ausgelöst und plötzlich stimmt bspw. das Kräfteverhältnis von KI und Spieler nicht mehr. Außerdem benötigt die kontinuierliche auswertung jedes Triggers Leistung auf dem Server.
Mit der Phasenverwaltung kann man nun Kompilationen an Triggern einem einzelnen, wenn man so möchte, Objective-Trigger zuordnen.
Erst wenn dieser Objective-Trigger ausgelöst hat, werden die Trigger der nachfolgenden Triggerkompilation freigeschaltet und vom Server ausgewertet.
Verwendung:
Schritt 1:
Registrierung der Kompilation und dem zugehörigen Objective-Trigger in der initServer.sqf:
private _my_trigger_compilation = [first_objective, main_spawns, patrol_1, ambush_1, ambush_2, my_reveal_trigger];
[first_objective, _my_trigger_compilation ] call FL_fnc_registerPhase;
Man kann beliebig viele dieser Phasen registrieren. Die Reihenfolge der Registrierung legt dabei auch die Reihenfolge der zu erfüllenden Ziele fest.
Man kann auch einzelne Registrierungen auskommentieren, was die Trigger wieder unabhängig von den Objectives verfügbar macht.
Schritt 2:
Danach ruft man ganz kurz und knapp diese Zeile auf, welche die Phasenverwaltung initialisiert.
call FL_fnc_initPhases;
Kommentiert man diese Zeile aus, sind alle Trigger gewohnt in beliebiger Reihenfolge verfügbar.
Optional:
// ALL TRIGGERS
private _alltriggers = allMissionObjects "EmptyDetector";
// set frequency of trigger condition evaluation
_alltriggers apply {_x setTriggerInterval 5};
Dadurch werden Trigger grundsätzlich nur alle 5 Sekunden ausgewertet.
Einzelnen kann natürlich nachträglich noch ein anderes Intervall zugewiesen werden.
Schritt 3:
Und mal wieder die entsprechende Zeile im Objective-Trigger
[img]https://i.imgur.com/PHn9MnS.jpg[/img] is not a valid Image.
KI vorplatzieren
Spoiler: AnzeigenAusblenden
Motivation:
Es gibt viele Szenarien in denen man KI ganz präzise im Editor vorplatzieren will und sich wünscht, dass sie dort die Stellung inklusive ihrer Körperhaltung hält und so auch den Kampf aufnimmt. Bspw. im Häuserkampf, bei Straßensperren, Hinterhlaten, usw..
Mit folgenden Einstellungen, die vollständig im Editor (mit W_Missionsbau, unabh. von FL Functions) vorgenommen werden können, lässt sich das problemlos und leistungsschonend umsetzen.
Damit die KI auch wirklich so schön und rechtzeitig (wie im Bild) auf den Spieler feuert, kann ich nur empfehlen, zusätzlich den Reveal-Trigger zu verwenden. Damit dreht sich die KI dann auch automatisch in Richtung des nächst gelegenen Spielers/Feindes.
[img]https://i.imgur.com/ScCHotc.jpg[/img] is not a valid Image.
Verwendung:
Im Editor die betreffende Gruppe auswählen und folgendes in ihre init kopieren:
Die vorplatzierte KI darf leider im Nachhinein nicht mehr auf den HC transferiert werden, da sonst ihre Konfiguration verloren geht.
Es gibt viele Szenarien in denen man KI ganz präzise im Editor vorplatzieren will und sich wünscht, dass sie dort die Stellung inklusive ihrer Körperhaltung hält und so auch den Kampf aufnimmt. Bspw. im Häuserkampf, bei Straßensperren, Hinterhlaten, usw..
Mit folgenden Einstellungen, die vollständig im Editor (mit W_Missionsbau, unabh. von FL Functions) vorgenommen werden können, lässt sich das problemlos und leistungsschonend umsetzen.
Damit die KI auch wirklich so schön und rechtzeitig (wie im Bild) auf den Spieler feuert, kann ich nur empfehlen, zusätzlich den Reveal-Trigger zu verwenden. Damit dreht sich die KI dann auch automatisch in Richtung des nächst gelegenen Spielers/Feindes.
[img]https://i.imgur.com/ScCHotc.jpg[/img] is not a valid Image.
Verwendung:
Im Editor die betreffende Gruppe auswählen und folgendes in ihre init kopieren:
[this] call FL_fnc_stayOnspot;
Die vorplatzierte KI darf leider im Nachhinein nicht mehr auf den HC transferiert werden, da sonst ihre Konfiguration verloren geht.
Bearbeitet von Felix am 05.01.2021 um 19:51
Squadlead Guide v2
W-Functions
Missionsbau von Null
"Einer für Alle, Alle für einen."
"Immer für die Sache, nie gegen den Menschen."
"In der Ruhe liegt die Kraft."