Alarmgesteuerte Mehrgebäude-Garnison mit dynamischem Ausrücken und Außenpatrouillen
multiBuildingGarrisonTriggered.sqf implementiert eine ereignisgesteuerte Garnisons- und Patrouillenlogik für mehrere, explizit definierte Gebäudetypen.
Es dient dazu, Gebäude zunächst passiv zu besetzen und die darin befindlichen KI-Gruppen erst nach einem Alarmereignis (Trigger / publicVariable) koordiniert ausrücken zu lassen, um anschließend dynamische Außenpatrouillen durchzuführen.
Hinweis: In diesem Skript werden alle Kasernen-Formen (Arma Standard) angewählt, welche in einem 1000m Radius in der Nähe des genannten Markers sich befnden
Was wird benötigt?
Ein Marker mit dem Namen barracksArea
Ein Trigger, welcher die PublicVariable von false auf true stellt. Wann immer das für euch in der Mission eintreten soll.
ALARM = false;
publicVariable "ALARM";ALARM = false;
Der Eintrag für die initServer.sqf
ALARM = false;
publicVariable "ALARM";
"ALARM" addPublicVariableEventHandler {
params ["_varName", "_value"];
// Nur reagieren, wenn Alarm TRUE wird
if (_value) then {
// Schutz gegen mehrfaches Auslösen
if (missionNamespace getVariable ["ALARM", false]) exitWith {};
missionNamespace setVariable ["ALARM", true];
[
"barracksArea",
1000,
[
"Land_Barracks_06_F",
"Land_i_Barracks_V2",
"Land_i_Barracks_V1_F"
],
east,
"O_Soldier_F",
5,
500,
20
] execVM "multiBuildingGarrisonTriggered.sqf";
};
};
Der Eintrag für multiBuildingGarrisonTriggered.sqf
/*
multiBuildingGarrisonTriggered.sqf
Besetzt mehrere definierte Gebäudetypen,
wartet auf Trigger,
rückt zeitverzögert aus,
startet Patrouillen.
Parameter:
0: Markername (STRING)
1: Suchradius (NUMBER)
2: Array Gebäudeklassen (ARRAY of STRING)
3: Seite (SIDE)
4: Einheitentyp (STRING)
5: Anzahl Einheiten pro Gebäude (NUMBER)
6: Patrouillenradius (NUMBER)
7: Verzögerung Sekunden (NUMBER)
*/
params [
"_marker",
"_searchRadius",
"_buildingTypes",
"_side",
"_unitType",
"_unitCount",
"_patrolRadius",
"_delay"
];
if (!isServer) exitWith {};
private _center = getMarkerPos _marker;
// Relevante Gebäude suchen
private _buildings = nearestObjects [
_center,
_buildingTypes,
_searchRadius
];
// Für jedes Gebäude Besatzung erstellen
{
private _building = _x;
// Gebäude-Positionen sammeln
private _positions = [];
for "_i" from 0 to 50 do {
private _pos = _building buildingPos _i;
if (_pos isEqualTo [0,0,0]) exitWith {};
_positions pushBack _pos;
};
if (_positions isEqualTo []) exitWith {};
private _grp = createGroup _side;
// Einheiten spawnen (Garnison)
for "_i" from 1 to _unitCount do {
private _pos = selectRandom _positions;
private _unit = _grp createUnit [_unitType, _pos, [], 0, "NONE"];
_unit disableAI "PATH";
_unit setUnitPos "MIDDLE";
_unit setBehaviour "AWARE";
_unit setCombatMode "YELLOW";
};
// Trigger-Reaktion + Ausrücken
[_grp, _building, _patrolRadius, _delay] spawn {
params ["_grp", "_building", "_radius", "_delay"];
sleep _delay;
{
_x setVariable ["hasGTuniform",1,true];
_x allowFleeing 0;
removeAllWeapons _x ;
removeAllItems _x ;
removeAllAssignedItems _x;
removeUniform _x;
removeVest _x;
removeBackpack _x;
removeHeadgear _x;
removeGoggles _x;
_x unassignItem "Itemradio";
_x removeItem "Itemradio";
_x unassignItem "NVGoggles";
_x removeItem "NVGoggles";
_x allowFleeing 0;
removeAllWeapons _x;
removeAllItems _x;
removeAllAssignedItems _x;
removeUniform _x;
removeVest _x;
removeBackpack _x;
removeHeadgear _x;
removeGoggles _x;
comment "Add weapons";
_x addWeapon "gm_lmgk500s_blk";
_x addPrimaryWeaponItem "gm_flashlightp2_brk_akkhandguard_dino";
_x addPrimaryWeaponItem "gm_zln1k_ir_dovetail_blk";
_x addPrimaryWeaponItem "gm_30Rnd_762x39mm_B_57N231_mpikm_blk";
comment "Add containers";
_x forceAddUniform "U_B_CTRG_Soldier_F";
_x addVest "gm_ge_pol_vest_80_wht";
comment "Add binoculars";
_x addWeapon "gm_df7x40_blk";
comment "Add items to containers";
for "_i" from 1 to 2 do {_x addItemToUniform "HandGrenade";};
for "_i" from 1 to 6 do {_x addItemToVest "gm_30Rnd_762x39mm_B_57N231_mpikm_blk";};
_x addItemToVest "BWA3_DM25";
_x addHeadgear "H_PASGT_basic_black_F";
_randomNightGoogles = selectRandom [1,2,3];
if(_randomNightGoogles == 2)then{
comment "Add items";
_x linkItem "gm_nsg66_oli";
};
_x enableAI "PATH";
_x doMove getPos _building;
} forEach units _grp;
// Patrouillen-Wegpunkte
for "_i" from 1 to 6 do {
private _pos = [
getPos _building,
random _radius,
random 360
] call BIS_fnc_relPos;
private _wp = _grp addWaypoint [_pos, 0];
_wp setWaypointType "MOVE";
_wp setWaypointBehaviour "AWARE";
_wp setWaypointSpeed "NORMAL";
_wp setWaypointCompletionRadius 25;
};
private _cycle = _grp addWaypoint [getPos _building, 0];
_cycle setWaypointType "CYCLE";
};
} forEach _buildings;
Bedenkt bitte, das die Ausrüstung in diesm Skript aus einem DLC stammt und euren Ansprüchen entsprechend angepasst werden muss!