diff --git a/sem/$PREFIX$ b/sem/$PREFIX$
new file mode 100644
index 0000000..b9fc40e
--- /dev/null
+++ b/sem/$PREFIX$
@@ -0,0 +1 @@
+sem
\ No newline at end of file
diff --git a/sem/config.cpp b/sem/config.cpp
new file mode 100644
index 0000000..6c2e105
--- /dev/null
+++ b/sem/config.cpp
@@ -0,0 +1,60 @@
+class CfgPatches {
+ class SEM {
+ units[] = {};
+ weapons[] = {};
+ SEM_version = 0.8.3;
+ requiredVersion = 1.38;
+ requiredAddons[] = {"a3_epoch_server"};
+ };
+};
+
+class CfgFunctions {
+ class SEM {
+ class main {
+ file = "sem";
+ class semInit {
+ //preInit = 1;
+ postInit = 1;
+ };
+ };
+
+ class SEM_scripts
+ {
+ file = "sem\scripts";
+ class createComposition {};
+ class getWorldData {};
+ class missionController {};
+ class missionCleanup {};
+ class findMissionPos {};
+ class selectMission {};
+ class selectClosest {};
+ class endCondition {};
+ class spawnVehicle {};
+ class vehicleUnlock {};
+ class saveVehicle {};
+ class convoyRoute {};
+ class attachToVeh {};
+ class safeDetach {};
+ class emptyGear {};
+ class randomPos {};
+ class crateLoot {};
+ };
+
+ class SEM_AIscripts
+ {
+ file = "sem\scripts\ai";
+ class spawnAI {};
+ class stripUnit {};
+ class removeGear {};
+ class findThread {};
+ class AIactDeact {};
+ class AIsetOwner {};
+ class AIdamageEH {};
+ class AIkilledEH {};
+ class AIfiredEH {};
+ class broadcastAI {};
+ class AImove {};
+ class AIconvoy {};
+ };
+ };
+};
\ No newline at end of file
diff --git a/sem/fn_semInit.sqf b/sem/fn_semInit.sqf
new file mode 100644
index 0000000..a97f30b
--- /dev/null
+++ b/sem/fn_semInit.sqf
@@ -0,0 +1,248 @@
+/*
+ SEM - "Simple Epoch Missions" configuration file
+ By KiloSwiss
+*/
+/*
+ Update 27.03.2017
+ By [Ignatz] He-Man
+*/
+[] spawn {
+ diag_log "#SEM INIT: Waiting for Epoch Server Ready ...";
+ waituntil {!isnil "EPOCH_SERVER_READY"};
+ diag_log "#SEM INIT: Epoch Server is ready... SEM waiting more 10s to start ...";
+ uisleep 10;
+ diag_log "#SEM INIT: Initialize Simple Epoch Missions";
+
+ private ["_handle","_end"];
+ _handle = execVM "sem\sem_config.sqf";
+ waitUntil {isNull _handle};
+ diag_log "#SEM: Loaded settings.";
+
+ if ((typeName SEM_debug) isEqualTo "SCALAR") then {
+ SEM_debug = (switch(round SEM_debug)do{
+ case 0:{"off"};
+ case 1:{"log"};
+ case 2:{"full"};
+ default{"log"};
+ });
+ };
+ if !(SEM_debug in ["off","log","full"]) then {
+ SEM_debug = "log"
+ };
+
+ if (SEM_debug in ["log","full"]) then{
+ SEM_version = getText(configFile >> "CfgPatches" >> "sem" >> "SEM_version");
+ diag_log format ["#SEM Version %1 is running on %2 %3 version %4 [%5] %6 branch.",
+ SEM_version,
+ (productVersion select 1),
+ str(if(isDedicated)then[{"dedicated server"},{if(hasInterface)then[{if(isServer)then[{"localhost"},{"client"}]},{"headless client"}]}]),
+ str(floor((productVersion select 2)/100)) + "." + str((productVersion select 2)-((floor((productVersion select 2)/100))*100)),
+ str(productVersion select 3),
+ (productVersion select 4)];
+ };
+
+ /* Set up variables */
+
+ SEM_MinPlayerStatic = (if(isMultiPlayer)then[{1 max SEM_MinPlayerStatic},{0}]);
+ SEM_MinPlayerDynamic = (if(isMultiPlayer)then[{1 max SEM_MinPlayerDynamic},{0}]);
+ SEM_MissionTimerMin = 1 max SEM_MissionTimerMin;
+ SEM_MissionTimerMax = 1 max SEM_MissionTimerMax;
+ SEM_MissionCleanup = -1 max SEM_MissionCleanup;
+ if(SEM_MissionTimerMin > SEM_MissionTimerMax)then{
+ private "_tempValueHolder";
+ _tempValueHolder = SEM_MissionTimerMax;
+ SEM_MissionTimerMax = SEM_MissionTimerMin;
+ SEM_MissionTimerMin = _tempValueHolder;
+ };
+
+ SEM_Krypto_AIroadkill = 1 max (abs SEM_Krypto_AIroadkill);
+
+ {if !(_x in SEM_removeWeaponsFromDeadAI)then{SEM_removeWeaponsFromDeadAI pushBack _x}}forEach ["launch_RPG32_F","Srifle_GM6_F","Srifle_LRR_F","m107_EPOCH","m107Tan_EPOCH"];
+ {if !(_x in SEM_removeMagazinesFromDeadAI)then{SEM_removeMagazinesFromDeadAI pushBack _x}}forEach ["RPG32_F","RPG32_HE_F","5Rnd_127x108_Mag","5Rnd_127x108_APDS_Mag","7Rnd_408_Mag"];
+ SEM_AIdropGearChance = 0 max SEM_AIdropGearChance min 100;
+ SEM_AIsniperDamageDistance = 300 max SEM_AIsniperDamageDistance min 1000;
+ SEM_AIsniperDamageEHunits = [];
+
+ if(SEM_debug isEqualTo "full")then{ /* Load debug settings */
+ SEM_MinPlayerStatic = 0;
+ SEM_MinPlayerDynamic = 0;
+ SEM_MissionCleanup = 2;
+ SEM_AIdisableSniperDamage = true; SEM_AIsniperDamageDistance = 100;
+ [] spawn {
+ SEM_version = SEM_version + " - DEBUG IS ON!";
+ while{true}do{publicVariable "SEM_version"; UIsleep 180};
+ };
+ }else{publicVariable "SEM_version"; UIsleep 30};
+
+ SEM_worldData = call SEM_fnc_getWorldData;
+ if(SEM_debug in ["log","full"])then{diag_log format["#SEM DEBUG: World Data received. Counting %1 locations on island %2", count (SEM_worldData select 2), str worldName]};
+
+ publicVariable "SEM_AIsniperDamageDistance";
+ SEM_lastMissionPositions = [];
+ SEM_MissionID = 0;
+
+ if(hasInterface && isServer)then{waitUntil{isPlayer player}};
+
+ SEM_createMissionMarker = {
+ private ["_create","_markerPos","_markerID","_markerA","_markerB","_markerC","_markerD","_markerC_Pos","_markerName","_markerColor"];
+ _create = _this select 0;
+
+ //Create Marker
+ if (_create) then {
+ _markerPos = _this select 1;
+ _markerID = _this select 2;
+ _markerName = _this select 3;
+ _markerColor = (
+ switch (_this select 4) do {
+ case 0: {"ColorWhite"};
+ case 1: {"ColorUNKNOWN"};
+ case 2: {"ColorOrange"};
+ case 3: {"ColorEAST"};
+ case 4: {"ColorCIV"};
+ case 5: {"ColorBlack"};
+ default {"Default"};
+ }
+ );
+ _staticMission = ( switch(_this select 5)do{
+ case "static": {true};
+ case "dynamic": {false};
+ default {true};
+ });
+
+
+ if (_staticMission)then { //Static Mission
+ _markerA = createMarker [format["SEM_MissionMarkerA_%1", _markerID], _markerPos];
+ _markerB = createMarker [format["SEM_MissionMarkerB_%1", _markerID], _markerPos];
+ _markerC = createMarker [format["SEM_MissionMarkerC_%1", _markerID], _markerPos];
+
+ {
+ _x setMarkerShape "ELLIPSE";
+ _x setMarkerSize [500,500];
+ _x setMarkerPos _markerPos
+ }forEach [_markerA,_markerB];
+
+ _markerA setMarkerBrush "Cross";
+ _markerA setMarkerColor _markerColor;
+
+ _markerB setMarkerBrush "Border";
+ _markerB setMarkerColor "ColorRed";
+
+ _markerC_Pos = [(_markerPos select 0) - (count _markerName * 15), (_markerPos select 1) - 530, 0];
+ _markerC setMarkerShape "Icon";
+ _markerC setMarkerType "HD_Arrow";
+ _markerC setMarkerColor _markerColor;
+ _markerC setMarkerPos _markerC_Pos;
+ _markerC setMarkerText _markerName;
+ _markerC setMarkerDir 37;
+ }
+ else { //Dynamic Mission
+ _markerD = createMarker [format["SEM_MissionMarkerD_%1", _markerID], _markerPos];
+ _markerD setMarkerShape "Icon";
+ _markerD setMarkerType "mil_circle"; //"HD_Destroy";
+ _markerD setMarkerColor _markerColor;
+ _markerD setMarkerPos _markerPos;
+ _markerD setMarkerText _markerName;
+ };
+ }
+ else { //else delete marker
+ _this spawn {
+ private ["_endCondition","_deleteMarkerID","_endMissionType"];
+ _endCondition = _this select 1;
+ _deleteMarkerID = _this select 2;
+ _endMissionType = _this select 3;
+
+ if(_endCondition == 3)then {
+ {
+ if (getMarkerColor format["SEM_MissionMarker%1_%2", _x, _deleteMarkerID] != "") then {
+ format["SEM_MissionMarker%1_%2", _x, _deleteMarkerID] setMarkerColor "ColorIndependent";
+ };
+ } forEach (
+ if (_endMissionType == "static") then {
+ ["A","B","C"]
+ }
+ else {
+ ["D"]
+ }
+ );
+ sleep 120;
+ }
+ else {
+ {
+ if (getMarkerColor format["SEM_MissionMarker%1_%2", _x, _deleteMarkerID] != "")then{
+ format["SEM_MissionMarker%1_%2", _x, _deleteMarkerID] setMarkerColor "ColorGrey";
+ };
+ } forEach (if(_endMissionType == "static")then {
+ ["A","B","C"]
+ }
+ else {
+ ["D"]
+ }
+ );
+ uisleep 30;
+ };
+
+ { /* Only delete existing Marker */
+ if (getMarkerColor format["SEM_MissionMarker%1_%2", _x, _deleteMarkerID] != "") then {
+ deleteMarker format["SEM_MissionMarker%1_%2", _x, _deleteMarkerID];
+ }
+ } forEach (
+ if (_endMissionType == "static") then {
+ ["A","B","C"]
+ }
+ else {
+ ["D"]
+ }
+ );
+ };
+ };
+ };
+
+ SEM_client_updateMissionMarkerPos = {
+ private["_updateMarkerID","_updateMarkerPos"];
+ _updateMarkerID = _this select 0;
+ _updateMarkerPos = _this select 1;
+
+ if (getMarkerColor format["SEM_MissionMarkerD_%1", _updateMarkerID] != "")then{
+ format["SEM_MissionMarkerD_%1", _updateMarkerID] setMarkerPos _updateMarkerPos;
+ };
+ };
+
+ SEM_Client_VehDamage = compilefinal "
+ private ['_vk','_vP','_s'];
+ _vk = _this;
+ _vP = vehicle player;
+ if (!local _vk) exitWith {};
+ if (_vk != _vP) exitWith {};
+ {
+ _vk setHitIndex [_forEachIndex,((_vk getHitIndex _forEachIndex)+(0.15+(random 0.15)))];
+ } forEach ((getAllHitPointsDamage _vk) param [0,[]]);
+ ";
+ SEM_Client_GlobalHint = compilefinal "
+ _this spawn {
+ if (isnil 'SEM_lastEvent') then {
+ SEM_lastEvent = 0;
+ };
+ waitUntil {
+ if(time - SEM_lastEvent > 20) exitwith {
+ SEM_lastEvent = time;
+ true
+ };
+ false
+ };
+ _sound = _this select 0;
+ switch(_sound)do{
+ case 0:{playSound 'UAV_05'};
+ case 1:{playSound 'UAV_01'};
+ case 2:{playSound 'UAV_04'};
+ case 3:{playsound 'UAV_03'};
+ };
+ hint parseText format['%1', _this select 1];
+ };
+ ";
+ publicvariable 'SEM_Client_VehDamage';
+ publicvariable 'SEM_Client_GlobalHint';
+
+ [
+ [SEM_staticMissions, SEM_staticMissionsPath ,"static"]
+ ] call SEM_fnc_missionController;
+};
\ No newline at end of file
diff --git a/sem/missionsDynamic/convoyRepair.sqf b/sem/missionsDynamic/convoyRepair.sqf
new file mode 100644
index 0000000..fdfe8a8
--- /dev/null
+++ b/sem/missionsDynamic/convoyRepair.sqf
@@ -0,0 +1,59 @@
+ /* KiloSwiss */
+private["_startPos","_endPos","_timeout","_name","_missionID","_missionType","_dir","_missionObjects","_convoyVehicles","_group","_box1","_hintString","_convoy","_start","_units","_endCondition","_enterableVehicles"];
+
+_startPos = _this select 0 select 0;
+_endPos = _this select 0 select 1;
+_name = _this select 1 select 1;
+_timeOut = _this select 1 select 2; //Mission timeout
+_missionID = _this select 2;
+_missionType = _this select 3;
+_dir = (_this select 0) call BIS_fnc_dirTo;
+_missionObjects = [];
+_convoyVehicles = [];
+_enterableVehicles = [];
+//--
+
+_convoyVeh1 = ["I_G_Quadbike_01_F",_startPos,1,0,_dir] call SEM_fnc_spawnVehicle;
+_mainVehicle = ["I_G_Offroad_01_repair_F",_startPos,1,0,_dir] call SEM_fnc_spawnVehicle;
+_convoyVeh2 = ["I_G_Offroad_01_armed_F",_startPos,1,0,_dir] call SEM_fnc_spawnVehicle;
+{_convoyVehicles pushBack _x}forEach [_convoyVeh1, _mainVehicle, _convoyVeh2];
+
+_mainVehicle setRepairCargo (0.0007 +(random 0.0003));
+_enterableVehicles pushBack _mainVehicle;
+
+//--
+_group = [_startPos,(5+(random 2))] call SEM_fnc_spawnAI;
+{_missionObjects pushBack _x}forEach units _group;
+
+_convoy = [_group, _endPos, _missionID, _mainVehicle, _convoyVehicles, _enterableVehicles] spawn SEM_fnc_AIconvoy;
+
+_hintString = format["Mission
%1
+______________
Blablablablabla!", _name];
+[0,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+
+ /* Mission End Conditions */
+waitUntil{sleep 1; scriptDone _convoy};
+_start = time;
+_units = units _group;
+waitUntil{ sleep 5;
+ _endCondition = [(getPos _mainVehicle),_units,_start,_timeout,_missionID,[_mainVehicle]]call SEM_fnc_endCondition;
+ (_endCondition > 0)
+};
+
+SEM_globalMissionMarker = [false,_endCondition,_missionID,_missionType];
+SEM_globalMissionMarker call SEM_createMissionMarker;
+
+if(_endCondition == 3)then[{ //Win!
+ {_x call SEM_fnc_vehicleUnlock}count _enterableVehicles;
+ {_x setVehicleAmmo 0}count _convoyVehicles;
+ _hintString = "Mission success
+ ______________
All bandits have been defeated!";
+ [_endCondition,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+},{ // 1 or 2 = Fail
+ {deleteVehicle _x; sleep .1}forEach _missionObjects;
+ _convoyVehicles spawn{{_x setDamage 1} count _this; sleep 300; {deleteVehicle _x}count _this};
+ _hintString = "Mission FAILED";
+ [_endCondition,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+}];
+
+deleteGroup _group;
diff --git a/sem/missionsDynamic/convoyStrider.sqf b/sem/missionsDynamic/convoyStrider.sqf
new file mode 100644
index 0000000..a906d81
--- /dev/null
+++ b/sem/missionsDynamic/convoyStrider.sqf
@@ -0,0 +1,70 @@
+ /* KiloSwiss */
+private["_startPos","_endPos","_timeout","_name","_missionID","_missionType","_dir","_missionObjects","_convoyVehicles","_group","_box1","_hintString","_convoy","_start","_units","_endCondition","_enterableVehicles"];
+
+_startPos = _this select 0 select 0;
+_endPos = _this select 0 select 1;
+_name = _this select 1 select 1;
+_timeOut = _this select 1 select 2; //Mission timeout
+_missionID = _this select 2;
+_missionType = _this select 3;
+_dir = (_this select 0) call BIS_fnc_dirTo;
+_missionObjects = [];
+_convoyVehicles = [];
+_enterableVehicles = [];
+//--
+
+_convoyVeh1 = ["I_G_Offroad_01_armed_F",_startPos,1,0,_dir] call SEM_fnc_spawnVehicle;
+_mainVehicle = ["I_MRAP_03_F",_startPos,1,0,_dir] call SEM_fnc_spawnVehicle;
+_convoyVeh2 = ["I_G_Offroad_01_armed_F",_startPos,1,0,_dir] call SEM_fnc_spawnVehicle;
+{
+ _convoyVehicles pushBack _x
+} forEach [_convoyVeh1, _mainVehicle, _convoyVeh2];
+
+_enterableVehicles pushBack _mainVehicle;
+
+//--
+_group = [_startPos,(5+(random 2))] call SEM_fnc_spawnAI;
+{
+ _missionObjects pushBack _x
+} forEach units _group;
+
+_convoy = [_group, _endPos, _missionID, _mainVehicle, _convoyVehicles, _enterableVehicles] spawn SEM_fnc_AIconvoy;
+
+_hintString = format["Mission
%1
+______________
Blablablablabla!", _name];
+[0,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+
+ /* Mission End Conditions */
+waitUntil{sleep 1; scriptDone _convoy};
+_start = time;
+_units = units _group;
+waitUntil{ sleep 5;
+ _endCondition = [(getPos _mainVehicle),_units,_start,_timeout,_missionID,[_mainVehicle]]call SEM_fnc_endCondition;
+ (_endCondition > 0)
+};
+
+SEM_globalMissionMarker = [false,_endCondition,_missionID,_missionType];
+SEM_globalMissionMarker call SEM_createMissionMarker;
+
+if (_endCondition == 3) then { //Win!
+ {
+ _x call SEM_fnc_vehicleUnlock
+ } count _enterableVehicles;
+ {
+ _x setVehicleAmmo 0
+ } count _convoyVehicles;
+ _hintString = "Mission success
+ ______________
All bandits have been defeated!";
+ [_endCondition,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+}
+else { // 1 or 2 = Fail
+ {
+ deleteVehicle _x;
+ uisleep 0.1
+ } forEach _missionObjects;
+ _convoyVehicles spawn{{_x setDamage 1} count _this; sleep 300; {deleteVehicle _x}count _this};
+ _hintString = "Mission FAILED";
+ [_endCondition,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+};
+
+deleteGroup _group;
diff --git a/sem/missionsDynamic/convoySupply.sqf b/sem/missionsDynamic/convoySupply.sqf
new file mode 100644
index 0000000..009592e
--- /dev/null
+++ b/sem/missionsDynamic/convoySupply.sqf
@@ -0,0 +1,84 @@
+ /* KiloSwiss */
+private["_startPos","_endPos","_timeout","_name","_missionID","_missionType","_dir","_missionObjects","_convoyVehicles","_group","_box1","_hintString","_convoy","_start","_units","_endCondition","_enterableVehicles"];
+
+
+/* Convoy VEHICLES
+I_G_Quadbike_01_F
+I_G_Offroad_01_F
+I_G_Offroad_01_armed_F
+
+I_G_Offroad_01_repair_F //Repair Jeep
+xyz setRepairCargo (0.0007 +(random 0.0003));
+
+I_MRAP_03_F //Armored Infantry Transporter
+
+I_G_Van_01_transport_F //small van
+I_Truck_02_transport_F //truck
+I_G_Offroad_01_F //offroad
+*/
+
+
+_startPos = _this select 0 select 0;
+_endPos = _this select 0 select 1;
+_name = _this select 1 select 1;
+_timeOut = _this select 1 select 2; //Mission timeout
+_missionID = _this select 2;
+_missionType = _this select 3;
+_dir = (_this select 0) call BIS_fnc_dirTo;
+_missionObjects = [];
+_convoyVehicles = [];
+_enterableVehicles = [];
+//--
+
+_convoyVeh1 = ["I_G_Quadbike_01_F",_startPos,1,0,_dir] call SEM_fnc_spawnVehicle;
+_mainVehicle = ["I_G_Van_01_transport_F",_startPos,1,0,_dir] call SEM_fnc_spawnVehicle;
+_convoyVeh2 = ["I_G_Offroad_01_F",_startPos,1,0,_dir] call SEM_fnc_spawnVehicle;
+{_convoyVehicles pushBack _x}forEach [_convoyVeh1, _mainVehicle, _convoyVeh2];
+
+//_enterableVehicles pushBack _mainVehicle;
+
+//--
+_box1 = createVehicle ["C_supplyCrate_F", _startPos, [], 30, "NO_COLLIDE"];
+_missionObjects pushBack _box1;
+_box1 call SEM_fnc_emptyGear;
+_box1 setDir (getDir _mainVehicle);
+[_box1, _mainVehicle] call SEM_fnc_attachtoVeh;
+
+//--
+_group = [_startPos,(5+(random 2))] call SEM_fnc_spawnAI;
+{_missionObjects pushBack _x}forEach units _group;
+
+_convoy = [_group, _endPos, _missionID, _mainVehicle, _convoyVehicles, _enterableVehicles] spawn SEM_fnc_AIconvoy;
+
+_hintString = format["Mission
%1
+______________
Blablablablabla!", _name];
+[0,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+
+ /* Mission End Conditions */
+waitUntil{sleep 1; scriptDone _convoy};
+_start = time;
+_units = units _group;
+waitUntil{ sleep 5;
+ _endCondition = [(getPos _mainVehicle),_units,_start,_timeout,_missionID,[_mainVehicle,_box1]]call SEM_fnc_endCondition;
+ (_endCondition > 0)
+};
+
+SEM_globalMissionMarker = [false,_endCondition,_missionID,_missionType];
+SEM_globalMissionMarker call SEM_createMissionMarker;
+
+if(_endCondition == 3)then[{ //Win!
+ [_box1,0] call SEM_fnc_crateLoot;
+ _box1 call SEM_fnc_safeDetach;
+ {_x call SEM_fnc_vehicleUnlock}count _enterableVehicles;
+ {_x setVehicleAmmo 0}count _convoyVehicles;
+ _hintString = "Mission success
+ ______________
All bandits have been defeated!";
+ [_endCondition,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+},{ // 1 or 2 = Fail
+ {deleteVehicle _x; sleep .1}forEach _missionObjects;
+ _convoyVehicles spawn{{_x setDamage 1} count _this; sleep 300; {deleteVehicle _x}count _this};
+ _hintString = "Mission FAILED";
+ [_endCondition,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+}];
+
+deleteGroup _group;
diff --git a/sem/missionsDynamic/convoyWeapon.sqf b/sem/missionsDynamic/convoyWeapon.sqf
new file mode 100644
index 0000000..845294a
--- /dev/null
+++ b/sem/missionsDynamic/convoyWeapon.sqf
@@ -0,0 +1,68 @@
+ /* KiloSwiss */
+private["_startPos","_endPos","_timeout","_name","_missionID","_missionType","_dir","_missionObjects","_convoyVehicles","_group","_box1","_hintString","_convoy","_start","_units","_endCondition","_enterableVehicles"];
+
+_startPos = _this select 0 select 0;
+_endPos = _this select 0 select 1;
+_name = _this select 1 select 1;
+_timeOut = _this select 1 select 2; //Mission timeout
+_missionID = _this select 2;
+_missionType = _this select 3;
+_dir = (_this select 0) call BIS_fnc_dirTo;
+_missionObjects = [];
+_convoyVehicles = [];
+_enterableVehicles = [];
+//--
+
+_convoyVeh1 = ["I_G_Offroad_01_F",_startPos,1,0,_dir] call SEM_fnc_spawnVehicle;
+_mainVehicle = ["I_Truck_02_transport_F",_startPos,1,0,_dir] call SEM_fnc_spawnVehicle;
+_convoyVeh2 = ["I_G_Offroad_01_armed_F",_startPos,1,0,_dir] call SEM_fnc_spawnVehicle;
+{_convoyVehicles pushBack _x}forEach [_convoyVeh1, _mainVehicle, _convoyVeh2];
+
+//_enterableVehicles pushBack _mainVehicle;
+
+//--
+_box1 = createVehicle ["Box_NATO_Wps_F", _startPos, [], 30, "NO_COLLIDE"];
+_missionObjects pushBack _box1;
+_box1 call SEM_fnc_emptyGear;
+_box1 setDir (getDir _mainVehicle);
+[_box1, _mainVehicle] call SEM_fnc_attachtoVeh;
+
+//--
+_group = [_startPos,(5+(random 2))] call SEM_fnc_spawnAI;
+{_missionObjects pushBack _x}forEach units _group;
+
+_convoy = [_group, _endPos, _missionID, _mainVehicle, _convoyVehicles, _enterableVehicles] spawn SEM_fnc_AIconvoy;
+
+_hintString = format["Mission
%1
+______________
Blablablablabla!", _name];
+[0,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+
+
+ /* Mission End Conditions */
+waitUntil{sleep 1; scriptDone _convoy};
+_start = time;
+_units = units _group;
+waitUntil{ sleep 5;
+ _endCondition = [(getPos _mainVehicle),_units,_start,_timeout,_missionID,[_mainVehicle,_box1]]call SEM_fnc_endCondition;
+ (_endCondition > 0)
+};
+
+SEM_globalMissionMarker = [false,_endCondition,_missionID,_missionType];
+SEM_globalMissionMarker call SEM_createMissionMarker;
+
+if(_endCondition == 3)then[{ //Win!
+ [_box1] call SEM_fnc_crateLoot;
+ _box1 call SEM_fnc_safeDetach;
+ {_x call SEM_fnc_vehicleUnlock}count _enterableVehicles;
+ {_x setVehicleAmmo 0}count _convoyVehicles;
+ _hintString = "Mission success
+ ______________
All bandits have been defeated!";
+ [_endCondition,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+},{ // 1 or 2 = Fail
+ {deleteVehicle _x; sleep .1}forEach _missionObjects;
+ _convoyVehicles spawn{{_x setDamage 1} count _this; sleep 300; {deleteVehicle _x}count _this};
+ _hintString = "Mission FAILED";
+ [_endCondition,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+}];
+
+deleteGroup _group;
diff --git a/sem/missionsStatic/bCamp_big.sqf b/sem/missionsStatic/bCamp_big.sqf
new file mode 100644
index 0000000..a65c84a
--- /dev/null
+++ b/sem/missionsStatic/bCamp_big.sqf
@@ -0,0 +1,75 @@
+private["_pos","_timeout","_cleanup","_missionID","_missionType","_missionObjects","_group","_composition","_compositions","_compositionObjects","_hintString","_start","_units","_endCondition"];
+/*
+ Based Of drsubo Mission Scripts
+ File: bCamp.sqf
+ Author: Cammygames, drsubo
+ Edited by KiloSwiss
+*/
+/*
+ Update 27.03.2017
+ By [Ignatz] He-Man
+*/
+
+
+_pos = _this select 0;
+_name = _this select 1 select 1;
+_timeout = _this select 1 select 2; //Mission timeout
+_missionID = _this select 2;
+_missionType = _this select 3;
+_missionObjects = [];
+//--
+
+_compositions =["camp4"];
+_composition = _compositions select random (count _compositions -1);
+_compositionObjects = [_composition, (random 359), _pos] call SEM_fnc_createComposition;
+{
+ _missionObjects pushBack _x
+} forEach _compositionObjects;
+
+_group1 = [_pos,4] call SEM_fnc_spawnAI;
+_group2 = [_pos,4] call SEM_fnc_spawnAI;
+_group3 = [_pos,(4+round(random 1))] call SEM_fnc_spawnAI;
+_units = units _group1 + units _group2 + units _group3;
+{
+ _missionObjects pushBack _x
+} forEach _units;
+
+[_group1, _pos] call SEM_fnc_AImove;
+[_group2, _pos] call SEM_fnc_AImove;
+[_group3, _pos] call SEM_fnc_AImove;
+
+_hintString = "Mission
Bandit Base
+______________
A bandit Base has been discovered!
+You have our permission to confiscate any property you find as payment for eliminating the threat!";
+[0,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+
+ /* Mission End Conditions */
+_start = time;
+waitUntil{ uisleep 5;
+ _endCondition = [_pos,_units,_start,_timeout,_missionID]call SEM_fnc_endCondition;
+ (_endCondition > 0)
+};
+
+SEM_globalMissionMarker = [false,_endCondition,_missionID,_missionType];
+SEM_globalMissionMarker call SEM_createMissionMarker;
+
+if (_endCondition == 3) then { //Win!
+ if (SEM_MissionCleanup > 0) then {
+ [_pos, _missionObjects] call SEM_fnc_missionCleanup
+ };
+ _hintString = "Mission success
+ ______________
All bandits have been defeated!";
+ [_endCondition,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+}
+else { // 1 or 2 = Fail
+ {
+ deleteVehicle _x;
+ uisleep 0.1
+ } forEach _missionObjects;
+ _hintString = "Mission FAILED";
+ [_endCondition,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+};
+
+deleteGroup _group1;
+deleteGroup _group2;
+deleteGroup _group3;
diff --git a/sem/missionsStatic/bCamp_small.sqf b/sem/missionsStatic/bCamp_small.sqf
new file mode 100644
index 0000000..bc34d0e
--- /dev/null
+++ b/sem/missionsStatic/bCamp_small.sqf
@@ -0,0 +1,72 @@
+private["_pos","_timeout","_cleanup","_missionID","_missionType","_missionObjects","_group","_composition","_compositions","_compositionObjects","_hintString","_start","_units","_endCondition"];
+/*
+ Based Of drsubo Mission Scripts
+ File: bCamp.sqf
+ Author: Cammygames, drsubo
+ Edited by KiloSwiss
+*/
+/*
+ Update 27.03.2017
+ By [Ignatz] He-Man
+*/
+
+
+_pos = _this select 0;
+_name = _this select 1 select 1;
+_timeout = _this select 1 select 2; //Mission timeout
+_missionID = _this select 2;
+_missionType = _this select 3;
+_missionObjects = [];
+//--
+
+_compositions =["camp1","camp2","camp3"];
+_composition = _compositions select random (count _compositions -1);
+_compositionObjects = [_composition, (random 359), _pos] call SEM_fnc_createComposition;
+{
+ _missionObjects pushBack _x
+} forEach _compositionObjects;
+
+_group1 = [_pos,(4+(random 1))] call SEM_fnc_spawnAI;
+_group2 = [_pos,(4+(random 1))] call SEM_fnc_spawnAI;
+_units = units _group1 + units _group2;
+{
+ _missionObjects pushBack _x
+} forEach _units;
+
+[_group1, _pos] call SEM_fnc_AImove;
+[_group2, _pos] call SEM_fnc_AImove;
+
+_hintString = "Mission
Bandit Base Camp
+______________
A bandit camp has been discovered!
+You have our permission to confiscate any property you find as payment for eliminating the threat!";
+[0,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+
+ /* Mission End Conditions */
+_start = time;
+waitUntil{ uisleep 5;
+ _endCondition = [_pos,_units,_start,_timeout,_missionID]call SEM_fnc_endCondition;
+ (_endCondition > 0)
+};
+
+SEM_globalMissionMarker = [false,_endCondition,_missionID,_missionType];
+SEM_globalMissionMarker call SEM_createMissionMarker;
+
+if (_endCondition == 3) then { //Win!
+ if (SEM_MissionCleanup > 0) then {
+ [_pos, _missionObjects] call SEM_fnc_missionCleanup
+ };
+ _hintString = "Mission success
+ ______________
All bandits have been defeated!";
+ [_endCondition,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+}
+else { // 1 or 2 = Fail
+ {
+ deleteVehicle _x;
+ uisleep 0.1
+ } forEach _missionObjects;
+ _hintString = "Mission FAILED";
+ [_endCondition,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+};
+
+deleteGroup _group1;
+deleteGroup _group2;
diff --git a/sem/missionsStatic/bDevice.sqf b/sem/missionsStatic/bDevice.sqf
new file mode 100644
index 0000000..54cb106
--- /dev/null
+++ b/sem/missionsStatic/bDevice.sqf
@@ -0,0 +1,73 @@
+private["_pos","_timeout","_name","_missionID","_missionType","_missionObjects","_group","_box1","_camonet","_wreck","_hintString","_boxPos","_start","_units","_endCondition"];
+/*
+ Based Of drsubo Mission Scripts
+ File: bCamp.sqf
+ Author: Cammygames, drsubo
+ Edited by KiloSwiss
+*/
+/*
+ Update 27.03.2017
+ By [Ignatz] He-Man
+*/
+
+
+_pos = _this select 0;
+_name = _this select 1 select 1;
+_timeout = _this select 1 select 2; //Mission timeout
+_missionID = _this select 2;
+_missionType = _this select 3;
+_missionObjects = [];
+//--
+
+_wreck = createVehicle ["Land_Device_disassembled_F",_pos,[], 0, "NONE"];
+_missionObjects pushBack _wreck;
+_wreck setDir (random 360);
+_wreck setPos _pos;
+
+_camonet = createVehicle ["CamoNet_INDP_open_F",_pos,[], 0, "NO_COLLIDE"];
+_missionObjects pushBack _camonet;
+_camonet setDir (getDir _wreck);
+_camonet setPos _pos;
+
+_boxPos = (_wreck modelToWorld [4,0,0]);
+_boxPos set [2,0];
+_box1 = createVehicle ["Box_NATO_Wps_F", _boxPos, [], 0, "NO_COLLIDE"];
+_missionObjects pushBack _box1;
+_box1 call SEM_fnc_emptyGear;
+_box1 setDir (getDir _wreck);
+_box1 setPos _boxPos;
+
+_group = [_pos,(6+(random 2))] call SEM_fnc_spawnAI;
+{_missionObjects pushBack _x}forEach units _group;
+[_group, _pos] call SEM_fnc_AImove;
+//[_group, _pos] spawn SEM_fnc_AIsetOwner;
+
+_hintString = "Mission
Device discovered!
+______________
A nuclear device has been discovered
+Remove the device and enemies as soon as possible!";
+[0,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+
+ /* Mission End Conditions */
+_start = time;
+_units = units _group;
+waitUntil{ sleep 5;
+ _endCondition = [_pos,_units,_start,_timeout,_missionID,[_box1]]call SEM_fnc_endCondition;
+ (_endCondition > 0)
+};
+
+SEM_globalMissionMarker = [false,_endCondition,_missionID,_missionType];
+SEM_globalMissionMarker call SEM_createMissionMarker;
+
+if(_endCondition == 3)then[{ //Win!
+ [_box1,1] call SEM_fnc_crateLoot;
+ if(SEM_MissionCleanup > 0)then{[_pos, _missionObjects] call SEM_fnc_missionCleanup};
+ _hintString = "Mission success
+ ______________
All bandits have been defeated!";
+ [_endCondition,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+},{ // 1 or 2 = Fail
+ {deleteVehicle _x; sleep .1}forEach _missionObjects;
+ _hintString = "Mission FAILED";
+ [_endCondition,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+}];
+
+deleteGroup _group;
diff --git a/sem/missionsStatic/bHeliCrash.sqf b/sem/missionsStatic/bHeliCrash.sqf
new file mode 100644
index 0000000..f3cca62
--- /dev/null
+++ b/sem/missionsStatic/bHeliCrash.sqf
@@ -0,0 +1,59 @@
+private["_pos","_timeout","_cleanup","_missionID","_missionType","_missionObjects","_group","_box1","_wreck","_hintString","_start","_units","_endCondition"];
+/*
+ Based Of drsubo Mission Scripts
+ File: bHeliCrash.sqf
+ Author: Cammygames, drsubo
+ Edited by KiloSwiss
+*/
+
+_pos = _this select 0;
+_name = _this select 1 select 1;
+_timeout = _this select 1 select 2; //Mission timeout
+_missionID = _this select 2;
+_missionType = _this select 3;
+_missionObjects = [];
+//--
+
+_wreck = createVehicle ["Land_Wreck_Heli_Attack_02_F", _pos, [], 0, "NONE"];
+_missionObjects pushBack _wreck;
+_wreck setDir (random 360);
+_wreck setPos _pos;
+
+_box1 = createVehicle ["Box_NATO_WpsSpecial_F", _pos, [], 15, "NONE"];
+_missionObjects pushBack _box1;
+_box1 call SEM_fnc_emptyGear;
+
+_group = [_pos,(6+(random 2))] call SEM_fnc_spawnAI;
+{_missionObjects pushBack _x}forEach units _group;
+[_group, _pos] call SEM_fnc_AImove;
+//[_group, _pos] spawn SEM_fnc_AIsetOwner;
+
+_hintString = "Mission
Heli Crash
+______________
A heli with supplies and bandit troops has crashed
+You have our permission to confiscate any property you find as payment for eliminating the threat!";
+[0,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+
+ /* Mission End Conditions */
+_start = time;
+_units = units _group;
+waitUntil{ sleep 5;
+ _endCondition = [_pos,_units,_start,_timeout,_missionID,[_box1]]call SEM_fnc_endCondition;
+ (_endCondition > 0)
+};
+
+SEM_globalMissionMarker = [false,_endCondition,_missionID,_missionType];
+SEM_globalMissionMarker call SEM_createMissionMarker;
+
+if(_endCondition == 3)then[{ //Win!
+ [_box1,1] call SEM_fnc_crateLoot;
+ if(SEM_MissionCleanup > 0)then{[_pos, _missionObjects] call SEM_fnc_missionCleanup};
+ _hintString = "Mission success
+ ______________
All bandits have been defeated!";
+ [_endCondition,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+},{ // 1 or 2 = Fail
+ {deleteVehicle _x; sleep .1}forEach _missionObjects;
+ _hintString = "Mission FAILED";
+ [_endCondition,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+}];
+
+deleteGroup _group;
diff --git a/sem/missionsStatic/bPlaneCrash.sqf b/sem/missionsStatic/bPlaneCrash.sqf
new file mode 100644
index 0000000..3d5a720
--- /dev/null
+++ b/sem/missionsStatic/bPlaneCrash.sqf
@@ -0,0 +1,59 @@
+private["_pos","_timeout","_cleanup","_missionID","_missionType","_missionObjects","_group","_box1","_wreck","_hintString","_start","_units","_endCondition"];
+/*
+ Based Of drsubo Mission Scripts
+ File: bPlaneCrash.sqf
+ Author: Cammygames, drsubo
+ Edited by KiloSwiss
+*/
+
+_pos = _this select 0;
+_name = _this select 1 select 1;
+_timeout = _this select 1 select 2; //Mission timeout
+_missionID = _this select 2;
+_missionType = _this select 3;
+_missionObjects = [];
+//--
+
+_wreck = createVehicle ["Land_Wreck_Plane_Transport_01_F", _pos, [], 0, "NONE"];
+_missionObjects pushBack _wreck;
+_wreck setDir (random 360);
+_wreck setPos _pos;
+
+_box1 = createVehicle ["Box_NATO_WpsSpecial_F", _pos, [], 15, "NONE"];
+_missionObjects pushBack _box1;
+_box1 call SEM_fnc_emptyGear;
+
+_group = [_pos,(6+(random 2))] call SEM_fnc_spawnAI;
+{_missionObjects pushBack _x}forEach units _group;
+[_group, _pos] call SEM_fnc_AImove;
+//[_group, _pos] spawn SEM_fnc_AIsetOwner;
+
+_hintString = "Mission
Supply Plane
+______________
A supply plane has crashed
+You have our permission to confiscate any property you find as payment for eliminating the threat!";
+[0,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+
+ /* Mission End Conditions */
+_start = time;
+_units = units _group;
+waitUntil{ sleep 5;
+ _endCondition = [_pos,_units,_start,_timeout,_missionID,[_box1]]call SEM_fnc_endCondition;
+ (_endCondition > 0)
+};
+
+SEM_globalMissionMarker = [false,_endCondition,_missionID,_missionType];
+SEM_globalMissionMarker call SEM_createMissionMarker;
+
+if(_endCondition == 3)then[{ //Win!
+ [_box1,1] call SEM_fnc_crateLoot;
+ if(SEM_MissionCleanup > 0)then{[_pos, _missionObjects] call SEM_fnc_missionCleanup};
+ _hintString = "Mission success
+ ______________
All bandits have been defeated!";
+ [_endCondition,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+},{ // 1 or 2 = Fail
+ {deleteVehicle _x; sleep .1}forEach _missionObjects;
+ _hintString = "Mission FAILED";
+ [_endCondition,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+}];
+
+deleteGroup _group;
diff --git a/sem/missionsStatic/bSupplyCrash.sqf b/sem/missionsStatic/bSupplyCrash.sqf
new file mode 100644
index 0000000..43b6785
--- /dev/null
+++ b/sem/missionsStatic/bSupplyCrash.sqf
@@ -0,0 +1,72 @@
+private["_pos","_timeout","_cleanup","_missionID","_missionType","_missionObjects","_group","_box1","_truck","_wreck","_smallWrecks","_truckWrecks","_wreckPos","_hintString","_start","_units","_endCondition"];
+/*
+ Based Of drsubo Mission Scripts
+ File: supplyVanCrash.sqf
+ Author: Cammygames, drsubo
+ Edited by KiloSwiss
+*/
+
+_pos = _this select 0;
+_name = _this select 1 select 1;
+_timeout = _this select 1 select 2; //Mission timeout
+_missionID = _this select 2;
+_missionType = _this select 3;
+_missionObjects = [];
+//--
+
+_smallWrecks = ["Land_Wreck_HMMWV_F","Land_Wreck_Hunter_F","Land_Wreck_Van_F","Land_Wreck_Ural_F"];
+
+_truck = createVehicle ["Land_Wreck_Truck_dropside_F",_pos,[], 0, "NONE"];
+_missionObjects pushBack _truck;
+_truck setDir (random 360);
+_truck setPos _pos;
+
+_wreckPos = (_truck modelToWorld [(2-(random 4)),(if(random 1 > 0.5)then[{12},{-12}]),0]);
+_wreckPos set [2,0];
+_wreck = _smallWrecks select random(count _smallWrecks -1);
+_wreck = createVehicle [_wreck,_wreckPos,[], 0, "NONE"];
+_missionObjects pushBack _wreck;
+_wreck setDir ((getDir _truck)+(if(random 1 > 0.5)then[{+(random 12)},{-(random 12)}]));
+_wreck setPos _wreckPos;
+
+_box1 = createVehicle ["C_supplyCrate_F", _pos, [], 3, "NONE"];
+_missionObjects pushBack _box1;
+_box1 call SEM_fnc_emptyGear;
+_box1 attachTo [_truck,[-1.2345,1.2,.345]];
+deTach _box1; /* Let it fall off */
+
+_group = [_pos,(6+(random 2))] call SEM_fnc_spawnAI;
+{_missionObjects pushBack _x}forEach units _group;
+[_group, _pos] call SEM_fnc_AImove;
+//[_group, _pos] spawn SEM_fnc_AIsetOwner;
+
+_hintString = "Mission
Supply Van Crash
+______________
A supply van with base building material has crashed!
+You have our permission to confiscate any property you find as payment for eliminating the threat!";
+[0,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+
+ /* Mission End Conditions */
+
+_start = time;
+_units = units _group;
+waitUntil{ sleep 5;
+ _endCondition = [_pos,_units,_start,_timeout,_missionID,[_box1]]call SEM_fnc_endCondition;
+ (_endCondition > 0)
+};
+
+SEM_globalMissionMarker = [false,_endCondition,_missionID,_missionType];
+SEM_globalMissionMarker call SEM_createMissionMarker;
+
+if(_endCondition == 3)then[{ //Win!
+ [_box1,1] call SEM_fnc_crateLoot;
+ if(SEM_MissionCleanup > 0)then{[_pos, _missionObjects] call SEM_fnc_missionCleanup};
+ _hintString = "Mission success
+ ______________
All bandits have been defeated!";
+ [_endCondition,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+},{ // 1 or 2 = Fail
+ {deleteVehicle _x; sleep .1}forEach _missionObjects;
+ _hintString = "Mission FAILED";
+ [_endCondition,_hintString] remoteexec ["SEM_Client_GlobalHint",-2];
+}];
+
+deleteGroup _group;
diff --git a/sem/missionsStatic/compositions/camp1.sqf b/sem/missionsStatic/compositions/camp1.sqf
new file mode 100644
index 0000000..f4fc9a9
--- /dev/null
+++ b/sem/missionsStatic/compositions/camp1.sqf
@@ -0,0 +1,51 @@
+/*
+ Update 27.03.2017
+ By [Ignatz] He-Man
+*/
+
+private ["_objs"];
+_objs =
+[
+ ["Land_CncWall1_F",[-2.03516,0.556641,-1.85966e-005],137.606,1,0,"_this setVectorUp [0,0,1]"],
+ ["Land_CncWall1_F",[2.19727,0.253906,-1.66893e-005],227.703,1,0,"_this setVectorUp [0,0,1]"],
+ ["Land_CncWall1_F",[1.91406,-4.06055,0.000117779],318.571,1,0,"_this setVectorUp [0,0,1]"],
+ ["Land_CncWall1_F",[-2.5293,-3.76953,-0.000117779],47.7458,1,0,"_this setVectorUp [0,0,1]"],
+ ["Land_CncWall4_F",[6.28516,1.91797,0.000105381],270.731,1,0],
+ ["Land_CncWall1_F",[7.00195,-0.888672,-5.24521e-006],180.23,1,0],
+ ["Land_CncBarrierMedium_F",[5.74805,5,9.01222e-005],224.048,1,0],
+ ["Land_ToiletBox_F",[7.67383,-2.74023,3.19481e-005],88.3438,1,0],
+ ["Land_CncWall1_F",[8.29102,-0.896484,0.000154972],180.23,1,0],
+ ["Land_RattanTable_01_F",[4.44531,-7.15625,4.76837e-007],5.7211,1,0],
+ ["Land_GymRack_01_F",[-8.67773,0.246094,6.62804e-005],88.887,1,0],
+ ["Land_WoodenTable_large_F",[-4.76367,-7.41602,2.38419e-006],299.179,1,0],
+ ["Land_GymBench_01_F",[-8.63281,-2.55273,5.38826e-005],269.768,1,0],
+ ["MetalBarrel_burning_F",[1.58398,8.84766,1.66893e-005],0,1,0],
+ ["Land_ChairPlastic_F",[3.77539,-8.3457,1.78814e-005],295.095,1,0],
+ ["Land_ChairPlastic_F",[5.64648,-7.26563,1.78814e-005],182.996,1,0],
+ ["Land_ChairPlastic_F",[-3.375,-8.86719,1.85966e-005],241.077,1,0],
+ ["Land_CncShelter_F",[9.62695,0.476563,0.000114918],90.4933,1,0],
+ ["Land_GymRack_03_F",[-8.86328,-4.57813,-0.000160694],271.388,1,0],
+ ["MetalBarrel_burning_F",[8.29297,-5.64258,-5.38826e-005],0,1,0],
+ ["Land_Bench_F",[-5.46875,-8.45508,2.38419e-006],120.094,1,0],
+ ["Land_CncWall4_F",[-10.4707,1.25977,8.10623e-006],89.1825,1,0],
+ ["Land_CncBarrierMedium_F",[-8.76758,5.40625,-0.000279903],141.274,1,0],
+ ["Land_CncWall4_F",[3.375,10.0684,0.000101566],179.973,1,0],
+ ["Land_BagBunker_Large_F",[-3.70898,10.3105,3.09944e-005],179.083,1,0],
+ ["Land_CncWall4_F",[10.1172,-3.37891,0.000106335],270.731,1,0],
+ ["Land_WaterCooler_01_old_F",[-8.84375,-6.03906,7.27177e-005],44.5031,1,0],
+ ["Land_CncWall4_F",[-10.418,-3.875,-2.90871e-005],89.1807,1,0],
+ ["Land_CncWall4_F",[10.2344,4.41211,6.62804e-005],270.614,1,0],
+ ["Land_CncBarrierMedium_F",[-9.94141,4.48047,1.00136e-005],141.274,1,0],
+ ["Land_HBarrierBig_F",[6.91992,-9,4.91142e-005],329.663,1,0],
+ ["Land_CncBarrierMedium_F",[5.20508,-9.96289,-0.215637],146.229,1,0],
+ ["Land_CncWall4_F",[8.0332,8.60547,6.1512e-005],214.572,1,0],
+ ["Land_CncBarrierMedium_F",[-5.72266,-10.166,-0.348724],30.8811,1,0],
+ ["Land_CncBarrierMedium_F",[8.61523,-8.08594,-0.226772],145.456,1,0],
+ ["Land_HBarrierBig_F",[-7.26953,-9.29883,-0.000293255],31.8765,1,0],
+ ["Land_HBarrierTower_F",[0.00585938,-12.123,-0.000235081],358.383,1,0],
+ ["Land_CncBarrierMedium_F",[-8.80469,-8.12109,-0.258788],31.1346,1,0],
+// ["Box_NATO_WpsSpecial_F",[-4.05078,9.38672,0.23],88.477,1,0,"[_this,2]call SEM_fnc_crateLoot"],
+// ["Land_MetalCase_01_large_F",[0.00195313,-9.41016,-3.57628e-006],88.0797,1,0,"[_this,1]call SEM_fnc_crateLoot"],
+ ["Box_NATO_AmmoVeh_F",[0.0625,-1.94922,-2.38419e-006],344.12,1,0,"[_this,0]call SEM_fnc_crateLoot"]
+];
+_objs
\ No newline at end of file
diff --git a/sem/missionsStatic/compositions/camp2.sqf b/sem/missionsStatic/compositions/camp2.sqf
new file mode 100644
index 0000000..3f15de1
--- /dev/null
+++ b/sem/missionsStatic/compositions/camp2.sqf
@@ -0,0 +1,41 @@
+/*
+ Update 27.03.2017
+ By [Ignatz] He-Man
+*/
+
+private ["_objs"];
+_objs =
+[
+ ["Land_BagFence_Round_F",[0.757813,0.849609,-0.000125408],223.283,1,0],
+ ["Land_BagFence_Short_F",[1.14063,-1.47461,-0.000127316],90.2709,1,0],
+ ["Land_BagFence_Short_F",[-1.45703,1.28125,-2.81334e-005],0.678136,1,0],
+ ["Land_BagFence_Round_F",[0.548828,-3.72656,-0.000146866],319.226,1,0],
+ ["Land_BagFence_Round_F",[-3.83203,0.935547,-7.58171e-005],135.737,1,0],
+ ["Land_BagFence_Short_F",[-1.80859,-4.03125,7.10487e-005],0.678136,1,0],
+ ["Land_BagFence_Short_F",[-4.35938,-1.4043,1.57356e-005],90.2709,1,0],
+ ["Land_WoodenTable_large_F",[4.375,-1.82227,2.6226e-006],91.0072,1,0],
+ ["Land_BagFence_Round_F",[-4.08398,-3.50781,-4.52995e-005],47.0398,1,0],
+ ["Land_BarrelEmpty_grey_F",[-2.04102,5.2207,6.12736e-005],0.00310008,1,0],
+ ["Land_FieldToilet_F",[1.45313,-6.13281,2.3365e-005],90.4438,1,0],
+ ["Land_HBarrierWall4_F",[-1.08789,6.39844,-0.000239849],3.9928,1,0],
+ ["Land_BarrelEmpty_grey_F",[7.05273,2.29883,6.12736e-005],0.00309681,1,0],
+ ["Land_BarrelEmpty_grey_F",[7.01563,3.57422,6.12736e-005],0.00314962,1,0],
+ ["Land_HBarrierWall6_F",[9.16211,1.94141,-0.000191212],93.0184,1,0],
+ ["Land_HBarrierWall_corner_F",[-5.73242,5.98633,-5.67436e-005],273.483,1,0],
+ ["Land_PaperBox_open_full_F",[-2.44336,-8.30859,-0.000125408],358.264,1,0],
+ ["MetalBarrel_burning_F",[0.451172,-8.80469,0.000204563],0,1,0],
+ ["Land_Pallet_MilBoxes_F",[-4.4707,-8.16016,-0.000335217],91.9018,1,0],
+ ["Land_BagBunker_Tower_F",[7.4043,-5.54102,-1.43051e-006],270.266,1,0],
+ ["MetalBarrel_burning_F",[6.96094,6.125,-0.000161648],0,1,0],
+ ["Land_HBarrierWall6_F",[-9.89258,-4.11914,-6.05583e-005],272.841,1,0],
+ ["Land_HBarrierWall_corner_F",[1.81055,-9.55078,1.38283e-005],90.7513,1,0],
+ ["Land_HBarrierWall4_F",[-2.7168,-9.94727,-2.81334e-005],184.12,1,0],
+ ["Land_HBarrierWall_corner_F",[7.54297,7.41797,0.000103474],1.63958,1,0],
+ ["Land_HBarrierWall_corridor_F",[-10.8281,2.49219,-6.7234e-005],1.70905,1,0],
+ ["Land_HBarrierWall_corridor_F",[2.61914,11.1465,2.38419e-006],271.076,1,0],
+ ["Land_HBarrierWall_corner_F",[-8.21289,-9.62695,4.76837e-007],181.676,1,0],
+// ["Box_NATO_WpsSpecial_F",[4.97461,-5.53125,0],270.708,1,0,"[_this,2]call SEM_fnc_crateLoot"],
+// ["Land_MetalCase_01_large_F",[-7.32031,-8.11719,1.19209e-006],132.164,1,0,"[_this,1]call SEM_fnc_crateLoot"],
+ ["Box_NATO_AmmoVeh_F",[-1.76563,-1.27539,1.43051e-006],337.757,1,0,"[_this,0]call SEM_fnc_crateLoot"]
+];
+_objs
\ No newline at end of file
diff --git a/sem/missionsStatic/compositions/camp3.sqf b/sem/missionsStatic/compositions/camp3.sqf
new file mode 100644
index 0000000..0d715c0
--- /dev/null
+++ b/sem/missionsStatic/compositions/camp3.sqf
@@ -0,0 +1,65 @@
+/*
+ Update 27.03.2017
+ By [Ignatz] He-Man
+*/
+
+private ["_objs"];
+_objs =
+[
+ ["Land_Obstacle_Pass_F",[-0.939453,1.53906,-1.07127],180.173,1,0,"_this enableSimulation false; _this allowDamage false"],
+ ["MetalBarrel_burning_F",[-1.85742,-1.82422,-3.19481e-005],0.128915,1,0],
+ ["Land_CncBarrierMedium_F",[2.31055,-1.67188,-0.724247],91.0734,1,0],
+ ["Land_CncWall4_F",[-2.66211,-0.339844,-1.38283e-005],269.841,1,0],
+ ["Land_CncWall4_F",[2.70898,2.36523,0.000135899],0.887989,1,0],
+ ["Land_CncWall4_F",[2.05078,-3.125,-1.09673e-005],180.487,1,0],
+ ["Land_Obstacle_Pass_F",[-3.94531,1.51758,-1.0242],180.173,1,0],
+ ["Land_CncWall4_F",[-3.11328,-3.01367,0.000207424],0.415082,1,0],
+ ["Land_CncBarrierMedium_F",[-2.37305,3.50781,-0.178329],89.3517,1,0],
+ ["Land_CncWall4_F",[4.85742,-0.53125,-4.33922e-005],90.9194,1,0],
+ ["GroundWeaponHolder",[-0.199219,6.30664,0],271.646,1,0],
+ ["Land_CncShelter_F",[6.61719,1.43945,-2.43187e-005],1.5348,1,0],
+ ["Land_BagBunker_Large_F",[-3.06836,7.04883,-1.09673e-005],180.251,1,0],
+ ["Land_HBarrierBig_F",[2.82813,6.96289,0.000105381],271.904,1,0],
+ ["Land_Obstacle_Crawl_F",[-7.82617,0.746094,3.57628e-005],90.7407,1,0],
+ ["Land_CncBarrierMedium4_F",[-8.18555,-1.26367,-1.7643e-005],1.40305,1,0],
+ ["Land_CncWall4_F",[-8.27344,-2.96875,0.000179768],0.689722,1,0],
+ ["Land_CncBarrierMedium4_F",[8.44336,-3.13281,-0.00012064],0.62749,1,0],
+ ["Land_CncBarrierMedium_F",[-8.70313,3.17188,-6.53267e-005],180.687,1,0],
+ ["Land_Obstacle_RunAround_F",[5.81445,7.99805,-9.53674e-006],1.1785,1,0,"_this enableSimulation false; _this allowDamage false"],
+ ["Land_HBarrierBig_F",[8.88086,4.25391,-5.10216e-005],92.8236,1,0],
+ ["Land_Obstacle_Cross_F",[10.0273,-1.2168,4.29153e-006],89.424,1,0,"_this enableSimulation false; _this allowDamage false"],
+ ["Land_CncShelter_F",[-9.01367,4.54297,-0.000121593],0.647442,1,0],
+ ["I_HMG_01_A_F",[-9.03711,5.17773,0.00170755],359.754,1,0],
+ ["Land_CncBarrierMedium_F",[-9.98242,3.17578,-2.0504e-005],180.687,1,0],
+ ["Land_CncBarrierMedium_F",[1.17188,12.5117,-1.28746e-005],90.4673,1,0],
+ ["Land_ConcretePipe_F",[-12.1543,3.31641,0.0604606],1.48036,1,0,"_this enableSimulation false; _this allowDamage false"],
+ ["Land_CncWall4_F",[-12.4277,-0.685547,0.00018549],237.848,1,0],
+ ["Land_CncBarrierMedium4_F",[-10.6855,7.16797,8.10623e-006],89.8421,1,0],
+ ["Land_CncBarrierMedium_F",[-3.60742,12.5703,0.000341892],89.7082,1,0],
+ ["Land_ConcretePipe_F",[-12.1523,6.31445,0.0511794],0.516319,1,0,"_this enableSimulation false; _this allowDamage false"],
+ ["MetalBarrel_burning_F",[7.03906,12.1895,-1.85966e-005],0.372423,1,0],
+ ["Land_CncShelter_F",[0.0234375,14.1914,1.7643e-005],0.0516688,1,0],
+ ["Land_CncShelter_F",[-2.41211,14.1855,-4.14848e-005],0.00567879,1,0],
+ ["Land_CncShelter_F",[2.46484,14.2031,-0.000396252],0.00567879,1,0],
+ ["Land_CncBarrierMedium4_F",[-13.6445,5.33789,-7.00951e-005],90.2575,1,0],
+ ["Land_CncShelter_F",[-4.85352,14.1738,0.00037241],0.0516688,1,0],
+ ["Land_ConcretePipe_F",[-12.1582,9.35742,0.0404024],359.299,1,0,"_this enableSimulation false; _this allowDamage false"],
+ ["Land_HBarrierBig_F",[9.11523,12.6914,-1.43051e-006],271.406,1,0],
+ ["Land_CncBarrierMedium_F",[-1.20508,15.8867,-0.000380993],89.7082,1,0],
+ ["Land_BagBunker_Small_F",[5.58398,14.6758,-4.24385e-005],1.38705,1,0],
+ ["Land_CncBarrierMedium_F",[3.49805,15.873,0.000109196],89.7082,1,0],
+ ["Land_CncBarrierMedium4_F",[0.490234,16.916,-0.0226235],0.696245,1,0],
+ ["Land_CncBarrierMedium_F",[-6.08203,15.8691,-2.6226e-005],89.7082,1,0],
+ ["MetalBarrel_burning_F",[-7.30273,15.9004,-6.81877e-005],1.38656,1,0],
+ ["Land_CncBarrierMedium_F",[5.12109,16.8945,0.000258923],182.057,1,0],
+ ["Land_CncBarrierMedium_F",[6.94141,16.8496,3.09944e-005],182.14,1,0],
+ ["Land_CncBarrierMedium4_F",[-6.9375,16.9727,-0.000205994],0.696245,1,0],
+ ["Land_HBarrierBig_F",[-2.9043,18.2578,7.86781e-005],1.59054,1,0],
+ ["Land_HBarrierBig_F",[5.76172,18.0664,4.43459e-005],2.27927,1,0],
+ ["Land_HBarrierBig_F",[-14.6777,13.2188,-1.28746e-005],92.3338,1,0],
+ ["Land_Pallets_stack_F",[-12.4121,16.1094,-2.38419e-007],13.2322,1,0],
+ ["Land_HBarrierBig_F",[-11.5391,18.3164,-0.000188351],2.27927,1,0],
+// ["Land_MetalCase_01_large_F",[-2.53906,6.50391,-0.0250037],179.146,1,0,"[_this,1]call SEM_fnc_crateLoot"],
+ ["Box_NATO_AmmoVeh_F",[3.27539,0.876953,-3.8147e-006],29.1847,1,0,"[_this,0]call SEM_fnc_crateLoot"]
+];
+_objs
\ No newline at end of file
diff --git a/sem/missionsStatic/compositions/camp4.sqf b/sem/missionsStatic/compositions/camp4.sqf
new file mode 100644
index 0000000..984f691
--- /dev/null
+++ b/sem/missionsStatic/compositions/camp4.sqf
@@ -0,0 +1,118 @@
+/*
+ 27.03.2017
+ By [Ignatz] He-Man
+*/
+
+private ["_objs"];
+_objs =
+[
+ ["Land_LampStreet_small_F",[23513.1,18872.8,0],0,[[0,1,0],[0,0,1]],false],
+ ["Box_NATO_AmmoVeh_F",[23516.1,18872.8,0],0,1,0,"[_this,0]call SEM_fnc_crateLoot"],
+ ["Land_Obstacle_Crawl_F",[23551.5,18867.2,0],0,[[0,1,0],[0,0,1]],false],
+ ["Land_Obstacle_RunAround_F",[23546.4,18867.2,0],0,[[0,1,0],[0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23553.8,18867.9,0],90.8329,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23549.1,18867.9,0],90.8329,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23553.8,18868,2.08234],90.8329,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23549.1,18867.8,2.08234],90.8329,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrierTower_F",[23514.5,18839.7,0],359.091,[[-0.0158654,0.999874,0],[0,0,1]],false],
+ ["Land_HBarrierWall_corridor_F",[23551.4,18874.9,0.109977],91.3637,[[0.999717,-0.0237979,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23554,18859.4,0],90.8328,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23554,18859.4,2.08234],90.8329,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23554.1,18850.9,2.08234],90.8329,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23548.9,18847.6,2.08234],180.833,[[-0.0145355,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23554.2,18851,0],90.8328,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23548.8,18847.6,0],180.833,[[-0.014536,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23522,18840.5,0],180.833,[[-0.014536,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23530.5,18840.6,2.08234],180.833,[[-0.0145355,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23543.7,18867,0],90.8328,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23543.7,18858.6,0],90.8328,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23543.7,18867,2.08234],90.8329,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23543.6,18858.5,2.08234],90.8329,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_BagBunker_Tower_F",[23548.5,18851.8,0],269.091,[[-0.999874,-0.0158651,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23544.9,18874.9,0],180.833,[[-0.014536,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23498.6,18840.3,0],180.833,[[-0.014536,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23490.9,18841.7,0],204.015,[[-0.406971,-0.913441,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23544.9,18874.9,2.08234],180.833,[[-0.0145355,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23507,18840.2,2.08234],180.833,[[-0.0145355,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23490.9,18841.7,2.08234],204.469,[[-0.414204,-0.910184,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23538.8,18840.6,2.08234],180.833,[[-0.0145355,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23538.8,18840.7,0],180.833,[[-0.014536,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23543.6,18852.1,2.08234],90.8329,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23543.7,18852.2,0],90.8328,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23543.8,18844.1,0],90.8328,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23543.8,18844.1,2.08234],90.8329,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23530.5,18840.6,0],180.833,[[-0.014536,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23507,18840.3,0],180.833,[[-0.014536,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23522.1,18840.6,2.08234],180.833,[[-0.0145355,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23498.6,18840.3,2.08234],180.833,[[-0.0145355,-0.999894,0],[-0,0,1]],false],
+ ["Land_Cargo_Patrol_V1_F",[23539.3,18844.1,-0.0557444],0,[[0,1,0],[0,0,1]],false],
+ ["Land_ScrapHeap_2_F",[23538.2,18854.4,0],142.727,[[0.605609,-0.795762,0],[0,-0,1]],false],
+ ["Land_Scrap_MRAP_01_F",[23531.3,18847,0],228.182,[[-0.745264,-0.666769,0],[-0,0,1]],false],
+ ["WaterPump_01_forest_F",[23522.7,18843.7,0],90,[[1,-4.37114e-008,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23541.6,18880.1,0],90.8328,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23541.5,18888.5,0],90.8328,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23541.3,18896.9,0],90.8328,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_ReservoirTank_V1_F",[23494.1,18852.5,0],311.364,[[-0.750531,0.660836,0],[0,0,1]],false],
+ ["Land_Airport_Tower_dam_F",[23489.1,18884.9,0],5.9091,[[0.10295,0.994686,0],[0,0,1]],false],
+ ["Land_BagBunker_Large_F",[23493.1,18867.2,0],270.909,[[-0.999874,0.0158656,0],[0,0,1]],false],
+ ["Land_Cargo_HQ_V1_F",[23530.5,18883.6,0],0,[[0,1,0],[0,0,1]],false],
+ ["Land_Cargo_House_V1_F",[23530.1,18860.3,-0.0453615],179.546,[[0.00793154,-0.999969,0],[0,-0,1]],false],
+ ["Land_Cargo_House_V1_F",[23523.9,18860.2,-0.0453615],179.546,[[0.00793154,-0.999969,0],[0,-0,1]],false],
+ ["Land_Cargo_House_V1_F",[23517.6,18860.2,-0.0453615],179.546,[[0.00793154,-0.999969,0],[0,-0,1]],false],
+ ["Land_Cargo_House_V1_F",[23511.4,18860.1,-0.0453615],179.546,[[0.00793154,-0.999969,0],[0,-0,1]],false],
+ ["Land_BagBunker_Large_F",[23518.9,18902.9,0],180.455,[[-0.00793338,-0.999969,0],[-0,0,1]],false],
+ ["Land_Cargo40_white_F",[23507.1,18851.3,0],21.3637,[[0.364286,0.931287,0],[0,0,1]],false],
+ ["Land_Cargo20_military_green_F",[23520.8,18869.6,2.61306],89.9999,[[1,9.09963e-007,0],[0,0,1]],false],
+ ["Land_Wreck_HMMWV_F",[23523.2,18850.3,0],0,[[0,1,0],[0,0,1]],false],
+ ["Land_Wreck_Slammer_F",[23509.4,18888.8,0],48.6363,[[0.75053,0.660836,0],[0,0,1]],false],
+ ["Land_Wreck_Slammer_hull_F",[23505.1,18867.3,0],337.273,[[-0.386345,0.922354,0],[0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23536.1,18900,0],180.833,[[-0.014536,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23527.7,18899.9,0],180.833,[[-0.014536,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23510.3,18900,0],180.833,[[-0.014536,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23501.8,18899.9,0],180.833,[[-0.014536,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23493.4,18899.7,0],180.833,[[-0.014536,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23484.9,18899.5,0],180.833,[[-0.014536,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23541.6,18880,2.08234],90.8329,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23541.5,18888.6,2.08234],90.8329,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23541.2,18896.9,2.08234],90.8329,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23536.1,18899.9,2.08234],180.833,[[-0.0145355,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23527.7,18899.8,2.08234],180.833,[[-0.0145355,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23510.3,18900,2.08234],180.833,[[-0.0145355,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23501.8,18899.7,2.08234],180.833,[[-0.0145355,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23493.4,18899.6,2.08234],180.833,[[-0.0145355,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23484.9,18899.6,2.08234],180.833,[[-0.0145355,-0.999894,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23481.8,18894.4,0],90.8328,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23481.9,18886.1,0],90.8328,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23482,18877.6,0],90.8328,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23482.1,18869.3,0],90.8328,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23482.2,18861,0],90.8328,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23482.3,18852.6,0],90.8328,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23484.8,18846.2,0],50.3784,[[0.770272,0.637715,0],[0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23484.8,18846.1,2.08234],229.924,[[-0.765188,-0.643807,0],[-0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23481.8,18894.4,2.08234],90.8329,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23482,18886.1,2.08234],90.8329,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23482.1,18877.7,2.08234],90.8329,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23482.3,18860.9,2.08234],90.8329,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23482.3,18852.6,2.08234],90.8329,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_HBarrier_Big_F",[23519,18899.9,2.08234],180.833,[[-0.0145355,-0.999894,0],[-0,0,1]],false],
+ ["Land_Cargo40_white_F",[23523.6,18871.9,0],0,[[0,1,0],[0,0,1]],false],
+ ["Land_Cargo40_white_F",[23523.6,18867.6,0],0,[[0,1,0],[0,0,1]],false],
+ ["Land_Cargo40_white_F",[23503.6,18883.5,0],233.636,[[-0.805271,-0.592907,0],[-0,0,1]],false],
+ ["Land_Cargo20_military_green_F",[23517,18883.4,0],321.818,[[-0.618159,0.786053,0],[0,0,1]],false],
+ ["Land_Cargo20_military_green_F",[23524.5,18869.7,2.61306],70.9091,[[0.945001,0.327068,0],[0,0,1]],false],
+ ["Land_Cargo20_military_green_F",[23528.3,18869.6,2.61306],89.9999,[[1,9.09963e-007,0],[0,0,1]],false],
+ ["Land_Wreck_BRDM2_F",[23536.1,18867.6,0],0,[[0,1,0],[0,0,1]],false],
+ ["Land_HBarrier_Big_F",[23482.2,18869.2,2.08234],90.8329,[[0.999894,-0.0145356,0],[0,-0,1]],false],
+ ["Land_Cargo20_military_green_F",[23533.6,18894.7,0],0.454559,[[0.00793347,0.999969,0],[0,0,1]],false],
+ ["Land_ScrapHeap_2_F",[23521.9,18893.7,0],105.455,[[0.963842,-0.266474,0],[0,-0,1]],false],
+ ["Land_HBarrierWall_corridor_F",[23556,18874.9,0],89.5455,[[0.999969,0.00793242,0],[0,0,1]],false],
+ ["Land_HBarrierWall_corridor_F",[23544.8,18889,0],89.5455,[[0.999969,0.00793242,0],[0,0,1]],false],
+ ["Land_HBarrierWall_corner_F",[23555.1,18889.8,0],0,[[0,1,0],[0,0,1]],false],
+ ["Land_HBarrierWall4_F",[23549.6,18889.6,0],0,[[0,1,0],[0,0,1]],false],
+ ["Land_CncWall4_F",[23557.4,18880.3,0],268.636,[[-0.999717,-0.0237976,0],[-0,0,1]],false],
+ ["Land_CncWall4_F",[23557.3,18885.5,0],268.636,[[-0.999717,-0.0237976,0],[-0,0,1]],false],
+ ["Land_CncWall4_F",[23549.4,18882.6,0],131.818,[[0.745265,-0.666769,0],[0,-0,1]],false],
+ ["Land_MetalCase_01_large_F",[23519.6,18900.1,0],270,1,0,"[_this,0]call SEM_fnc_crateLoot"]
+
+];
+_objs
\ No newline at end of file
diff --git a/sem/scripts/ai/_____fn_AIconvoy.sqf b/sem/scripts/ai/_____fn_AIconvoy.sqf
new file mode 100644
index 0000000..e72d502
--- /dev/null
+++ b/sem/scripts/ai/_____fn_AIconvoy.sqf
@@ -0,0 +1,303 @@
+ /* KiloSwiss */
+private["_group","_endPos","_missionID","_mainVehicle","_convoyVehicles","","","","",""];
+
+_group = _this select 0;
+_endPos = _this select 1;
+_missionID = _this select 2;
+_mainVehicle = _this select 3;
+_convoyVehicles = _this select 4;
+
+ /* Marker position update */
+_this spawn { private["_endPos","_missionID","_mainVehicle","_oldPos","_newPos"];
+ _endPos = _this select 1;
+ _missionID = _this select 2;
+ _mainVehicle = _this select 3;
+ _oldPos = position _mainVehicle;
+
+ while{alive _mainVehicle && _mainVehicle distance _endPos > 20}do{
+ UIsleep 10;
+ _newPos = position _mainVehicle;
+ if(_oldPos distance _newPos > 10)then{
+ _oldPos = _newPos;
+ SEM_updateMissionMarkerPos = [_missionID, _newPos];
+ SEM_updateMissionMarkerPos call SEM_client_updateMissionMarkerPos;
+ };
+ };
+};
+
+_units = (units _group);
+_startPos = getPos _mainVehicle;
+{_group addVehicle _x; _x lock 3}forEach _convoyVehicles;
+
+_vehFront = (if(count _convoyVehicles == 1)then[{_mainVehicle},{{if(_x != _mainVehicle)exitWith{_x}; (_convoyVehicles select 0)}count _convoyVehicles}];
+_ranks = ["COLONEL","MAJOR","CAPTAIN","LIEUTENANT","SERGEANT","CORPORAL","PRIVATE"];
+_convoyGrps = [];
+{
+ _x setVariable ["AIrank", (_ranks select (_forEachIndex min (count _ranks -1)))];
+ _x addEventHandler ["getIn",{ private "_unit";
+ _unit = _this select 2;
+ _unit setUnitRank (_this select 0 getVariable ["AIrank","PRIVATE"]);
+ _unit joinSilent (format ["_convoy%1Grp%2", _missionID, _forEachIndex]);
+ }];
+ call compile format["
+ _convoy%1Grp%2 = createGroup (side %3);
+ _convoyGrps pushBack _convoy%1Grp%2;
+ ", _missionID, _forEachIndex, _group];
+
+ //assign at least one driver per vehicle
+ (_units select _forEachIndex) assignAsDriver _x;
+ (_units select _forEachIndex) moveInDriver _x;
+
+}forEach [_vehFront, _mainVehicle] + [(_convoyVehicles - [_vehFront,_mainVehicle])];
+
+//Order all Units to get in
+_units allowGetIn true;
+_units orderGetIn true;
+
+//-- Get lowest TopSpeed from all vehicles
+_topSpeeds = [];
+{
+ _maxSpd = getNumber (configFile >> "cfgVehicles" >> typeOf _x >> "maxSpeed");
+ if(!isNil "_maxSpd")then{_topSpeeds pushBack _maxSpd};
+}forEach _convoyVehicles;
+
+_select = 0;
+_maxSpd = _topSpeeds select _select;
+while{{_maxSpd > _x}count _topSpeeds != 0}do{
+ _select = _select + 1;
+ _maxSpd = _topSpeeds select _select;
+};
+{_x forceSpeed (_maxSpd*0.7)*0.2777778}forEach _convoyVehicles; // m/s
+//DEBUG
+if(SEM_debug in ["log","full"])then{diag_log format["SEM DEBUG: Convoy Vehicles TopSpeeds: %1 - Selected lowest: %2", _topSpeeds, _maxSpd]};
+
+
+//Wait until every unit has boarded a vehicle
+waitUntil{sleep 1; {vehicle _x in _convoyVehicles}count (units _group) == 0};
+
+
+
+/*
+_unit1 = units _group select (count units _group -1);
+_unit1 assignAsDriver _veh;
+[_unit1] orderGetIn true;
+*/
+
+_group move _endPos;
+_group setSpeedMode "NORMAL";//"FULL";
+_group setBehaviour "SAFE"; //"CARELESS";
+_group setCombatMode "GREEN";
+_group setFormation "FILE";
+
+
+
+
+
+_lastMoveCheck = time;
+_oldPos = getPos _vehFront;
+
+
+ /* Convoy loop */
+_stayToDefend = true;
+while {_mainVehicle distance _endPos >= _distance} do { //CONVOY LOOP
+
+_vehiclePos = getPos _mainVehicle;
+_vehFrontPos = getPos _vehFront;
+
+if({!canMove _x}count _convoyVehicles > 0 && _stayToDefend)then{
+ {if(canMove _x)then{(driver _x) doMove _vehiclePos;};}forEach _convoyVehicles;
+ sleep 5;
+ {
+ if(_x distance _vehiclePos < 50)then{
+ if(_x != gunner (vehicle _x))then{
+ _x action ["GetOut", (vehicle _x)];
+ sleep 0.5;
+ [_x] orderGetIn false;
+ [_x] allowGetIn false;
+ _x doMove _vehiclePos;
+ };
+ }else{
+ _x doMove _vehiclePos;
+ };
+ }forEach units _group;
+ _group move _vehiclePos;
+ _group setSpeedMode "FULL";
+
+ if({_x distance _veh2 < 50}count units _group == count units _group)then{
+ _endPos = _vehiclePos;
+ };
+}else{
+ //-- Work In Progress!
+
+ if({alive _x && !(vehicle _x in _convoyVehicles)}count units _group > 0)then{ //AI has left the vehicle
+ _group setBehaviour "CARELESS";
+ _group setCombatMode "GREEN";
+ {
+ if(!(vehicle _x in _convoyVehicles))then{
+ [_x] allowGetIn true;
+ [_x] orderGetIn true;
+ };
+ }forEach units _group;
+ sleep 10; //Brake the loop for 10 seconds
+ _group move _endPos;
+ _group setSpeedMode "NORMAL";
+
+ }else{ //Do vehicle speed management and continue travel to destination
+
+ _group setBehaviour "SAFE";
+ _group setCombatMode "GREEN";
+ _group setFormation "COLUMN";
+
+ if(time - _lastMoveCheck > 30)then{
+ _lastMoveCheck = time;
+ if(_vehFrontPos distance _oldPos < 10)then{
+ //FAILSAFE IF CONVOY IS STUCK
+ _group move _endPos;
+ _group setSpeedMode "FULL";
+ sleep 10; //Brake the loop for 10 seconds
+ _group setSpeedMode "NORMAL";
+ };
+ _oldPos = getPos _vehFront;
+ };
+
+ //-- Distance Checks
+ // forceSpeed = m/s
+ // limitSpeed = km/h
+ // 1 km/h == ~0.2777778 m/s
+
+ //Check Formation
+ _distanceA = _veh1 distance _veh2;
+ _distanceB = _veh1 distance _veh3;
+ if(_distanceA > _distanceB)then{
+ _3inFrontOf2 = [_veh2, _veh3, 0] call BIS_fnc_isInFrontOf;
+ if(_3inFrontOf2 || abs(_distanceA - _distanceB) > 10)then{//Swap Vehicles position in convoy (2 <-> 3)
+ //diag_log format["A: Distance 1-2: %1 - Distance 1-3: %2", round (_veh1 distance _veh2), round (_veh1 distance _veh3)];
+ _vehinMiddle = _veh3;
+ _veh3 = _veh2;
+ _veh2 = _vehinMiddle;
+ //diag_log format["B: Distance 1-2: %1 - Distance 1-3: %2", round (_veh1 distance _veh2), round (_veh1 distance _veh3)];
+ };
+ };
+
+ //Speed Management for Vehicle 1
+ if(_veh1 distance _veh2 > 50 || _veh1 distance _veh3 > 80)then{
+ if(_veh1 distance _veh2 > 80 || _veh1 distance _veh3 > 120)then{
+ _veh1 forceSpeed (_maxSpd*0.1)*0.2777778;
+ _veh1 limitSpeed (_maxSpd*0.1);
+ }else{
+ if(speed _veh3 < 10)then{
+ _veh1 forceSpeed (speed _veh3)*0.2777778;
+ _veh1 limitSpeed (speed _veh3);
+ }else{
+ _veh1 forceSpeed (_maxSpd*0.4)*0.2777778;
+ _veh1 limitSpeed (_maxSpd*0.4);
+ };
+ };
+ }else{
+ if(speed _veh3 < 10 && _veh1 distance _veh3 > 30)then{
+ _veh1 forceSpeed (_maxSpd*0.1)*0.2777778;
+ _veh1 limitSpeed (_maxSpd*0.1);
+ }else{
+ _veh1 forceSpeed (_maxSpd*0.7)*0.2777778; //-- m/s
+ _veh1 limitSpeed (_maxSpd*0.7);
+ };
+ };
+
+ //Speed Management for Vehicle 2
+ if(_veh2 distance _veh1 > 40)then{
+ if(_veh2 distance _veh3 > _veh2 distance _veh1)then{ //let Vehicle3 catch up
+ _veh2 forceSpeed (_maxSpd*0.4)*0.2777778;
+ _veh2 limitSpeed (_maxSpd*0.4);
+ }else{
+ if(speed _veh1 < 10)then{ //FAILSAFE IF CONVOY IS STUCK
+ (driver _veh2) doMove (getPos _veh1);
+ _veh2 forceSpeed (_maxSpd*0.7)*0.2777778;
+ _veh2 limitSpeed (_maxSpd*0.7);
+ }else{
+ //Move faster to catch up with Vehicle1
+ _veh2 forceSpeed _maxSpd*0.2777778;
+ _veh2 limitSpeed _maxSpd;
+ };
+ };
+ }else{
+ if(_veh2 distance _veh1 < 20)then{
+ _veh2 forceSpeed (speed _veh1)*0.2777778;
+ _veh2 limitSpeed (speed _veh1);
+ }else{
+ _veh2 forceSpeed (_maxSpd*0.7)*0.2777778;
+ _veh2 limitSpeed (_maxSpd*0.7);
+ };
+ };
+
+ //Speed Management for Vehicle 3
+ if(_veh3 distance _veh2 > 30 || _veh3 distance _veh1 > 60)then{ //catch up
+ _veh3 forceSpeed _maxSpd*0.2777778;
+ _veh3 limitSpeed _maxSpd;
+ }else{
+ if(_veh3 distance _veh2 < 15 && speed _veh2 > 5)then{
+ _veh3 forceSpeed (speed _veh2)*0.2777778;
+ _veh3 limitSpeed (speed _veh2);
+ }else{
+ if(speed _veh1 < 10)then{ //FAILSAFE IF CONVOY IS STUCK
+ (driver _veh3) doMove (getPos _veh1);
+ _veh3 forceSpeed (_maxSpd*0.7)*0.2777778;
+ _veh3 limitSpeed (_maxSpd*0.7);
+ }else{
+ _veh3 forceSpeed (_maxSpd*0.7)*0.2777778;
+ _veh3 limitSpeed (_maxSpd*0.7);
+ };
+ };
+ };
+ };
+};
+
+//code to end the while
+_unitsAlive = ({alive _x}count units _group);
+if(_unitsAlive < 1) then {
+ _endPos = _vehiclePos;
+};
+if (damage _mainVehicle == 1) then {
+ _endPos = _vehiclePos;
+};
+if({isPlayer _x && alive _x}count crew _mainVehicle > 0)then{
+ doStop (units _group);
+ {
+ _x spawn{
+ _this action ["engineOff", (vehicle _this)];
+ sleep 0.5;
+ deleteVehicle _this;
+ };
+ }foreach units _group;
+ _endPos = _vehiclePos;
+};
+
+sleep 1;
+}; //END OF LOOP
+
+diag_log "Dynamic Mission Status: Convoy Ended";
+
+if({alive _x}count units _group > 0 && damage _mainVehicle < 1)then{
+ {if(canMove _x)then{(driver _x) doMove _vehiclePos;};}forEach _convoyVehicles;
+ sleep 10;
+ {
+ if(_x != gunner (vehicle _x))then{
+ _x spawn{
+ doStop _this;
+ sleep 1;
+ _this action ["engineOff", (vehicle _this)];
+ _this action ["GetOut", (vehicle _this)];
+ sleep 0.1;
+ [_this] orderGetIn false;
+ [_this] allowGetIn false;
+ _this doMove _vehiclePos;
+ };
+ };
+ }forEach units _group;
+ _group move _vehiclePos;
+ _group setBehaviour "AWARE";
+ _group setFormation "FILE";
+ _group setCombatMode "YELLOW";
+};
+
+
+
diff --git a/sem/scripts/ai/___fn_AIconvoy.sqf b/sem/scripts/ai/___fn_AIconvoy.sqf
new file mode 100644
index 0000000..a639fd1
--- /dev/null
+++ b/sem/scripts/ai/___fn_AIconvoy.sqf
@@ -0,0 +1,348 @@
+ /* KiloSwiss */
+private["_group","_endPos","_missionID","_mainVehicle","_convoyVehicles","_enterableVehicles","_convoyGrps","_ranks","_side","_vehiclePos","_vehFrontPos","_veh1","_veh2","_veh3","_start"];
+
+_group = _this select 0;
+_endPos = _this select 1;
+_missionID = _this select 2;
+_mainVehicle = _this select 3;
+_convoyVehicles = _this select 4;
+_enterableVehicles = _this select 5;
+
+ /* Marker position update */
+_this spawn { private["_endPos","_missionID","_mainVehicle","_oldPos","_newPos"];
+ _endPos = _this select 1;
+ _missionID = _this select 2;
+ _mainVehicle = _this select 3;
+ _oldPos = position _mainVehicle;
+
+ while{alive _mainVehicle && _mainVehicle distance _endPos > 50}do{
+ UIsleep 10;
+ _newPos = position _mainVehicle;
+ if(_oldPos distance _newPos > 10)then{
+ _oldPos = _newPos;
+ SEM_updateMissionMarkerPos = [_missionID, _newPos];
+ SEM_updateMissionMarkerPos call SEM_client_updateMissionMarkerPos;
+ };
+ };
+};
+
+_units = (units _group);
+_side = side (_units select 0);
+_startPos = getPos _mainVehicle;
+
+_vehFront = (if(count _convoyVehicles == 1)then[{_mainVehicle},{{if(_x != _mainVehicle)exitWith{_x}; (_convoyVehicles select 0)}count _convoyVehicles}]);
+
+{_x setVariable ["AIskill",(skill _x)]}count _units;
+
+_ranks = ["COLONEL","MAJOR","CAPTAIN","LIEUTENANT","SERGEANT","CORPORAL","PRIVATE"];
+{
+ _x setFuel 1;
+ _x setDamage 0;
+ _group addVehicle _x;
+ if(_x in _enterableVehicles)then[{_x lock 0},{_x lock 3}];
+ _x setVariable ["AIrank", (_ranks select (_forEachIndex min (count _ranks -1)))];
+
+ _x addEventHandler ["getIn",{
+ (_this select 2) setUnitRank ((_this select 0) getVariable ["AIrank","PRIVATE"]);
+ if((_this select 1) == "driver")then{
+ (_this select 2) setSkill 1;
+ };
+ }];
+
+ _x addEventHandler ["getOut",{
+ (_this select 2) setSkill ((_this select 2) getVariable ["AIskill",0.7]);
+ }];
+
+ _x addeventHandler ["handleDamage",{
+ if(isNull (_this select 3))then{false};
+ }];
+
+ // Fill driver seats first
+ (_units select _forEachIndex) assignAsDriver _x;
+ //(_units select _forEachIndex) moveInDriver _x;
+ //(_units select _forEachIndex) setSkill 1;
+ //(_units select _forEachIndex) setUnitRank (_x getVariable ["AIrank","PRIVATE"]);
+
+ if(_x emptyPositions "GUNNER" > 0)then{ // Assign a gunner
+ _x allowCrewInImmobile true; //allow gunner to stay in immobilized vehicle
+ (_units select (_forEachIndex + (count _convoyVehicles))) assignAsGunner _x;
+ //(_units select (_forEachIndex + (count _convoyVehicles))) moveInGunner _x;
+ //(_units select (_forEachIndex + (count _convoyVehicles))) setUnitRank (_x getVariable ["AIrank","PRIVATE"]);
+ };
+
+}forEach _convoyVehicles;
+
+//Order all Units to get in
+_units allowGetIn true;
+_units orderGetIn true;
+
+//Wait until every unit has boarded a vehicle
+_start = time;
+waitUntil{sleep 1;{(alive _x && vehicle _x == _x)}count _units == 0 || time - _start >= 30};
+if({alive _x && vehicle _x == _x}count _units > 0)then{
+ { /* Move stuck AI into vehicles */
+ if(vehicle _x == _x)then{
+ _y = _x;
+ { /* Fill driver/gunner seats first */
+ if(_x emptyPositions "DRIVER" > 0)exitWith{_y moveInDriver _x; _y setSkill 1};
+ if(_x emptyPositions "GUNNER" > 0)exitWith{_y moveInGunner _x};
+ }forEach _convoyVehicles;
+ { /* Fill cargo seats */
+ if(_x emptyPositions "CARGO" > 0)exitWith{_y moveInCargo _x};
+ }forEach (_convoyVehicles - [_mainVehicle]);
+ };
+ _x setUnitRank ((vehicle _x) getVariable ["AIrank","PRIVATE"]);
+ }forEach _units;
+};
+
+//-- Get lowest TopSpeed from all vehicles
+_topSpeeds = [];
+{
+ _maxSpd = getNumber (configFile >> "cfgVehicles" >> typeOf _x >> "maxSpeed");
+ if(!isNil "_maxSpd")then{_topSpeeds pushBack _maxSpd};
+}forEach _convoyVehicles;
+
+_select = 0;
+_maxSpd = _topSpeeds select _select;
+while{{_maxSpd > _x}count _topSpeeds != 0}do{
+ _select = _select + 1;
+ _maxSpd = _topSpeeds select _select;
+};
+{_x forceSpeed (_maxSpd*0.8)*0.2777778}forEach _convoyVehicles; // m/s
+//DEBUG
+if(SEM_debug in ["log","full"])then{diag_log format["SEM DEBUG: Convoy Vehicles TopSpeeds: %1 - Selected lowest: %2", _topSpeeds, _maxSpd]};
+
+
+
+hint "start";
+
+_group move _endPos;
+//{driver _x move _endPos}count _convoyVehicles;
+_group setSpeedMode "FULL";//"FULL";
+_group setBehaviour "SAFE"; //"CARELESS";
+_group setCombatMode "GREEN";
+_group setFormation "COLUMN";
+
+ /* temporary definition of 3 vehicles */
+_veh1 = _convoyVehicles select 0;
+_veh2 = _convoyVehicles select 1;
+_veh3 = _convoyVehicles select 2;
+
+
+_lastMoveCheck = time;
+_oldPos = getPos _mainVehicle;
+
+ /* Convoy loop */
+_stayToDefend = true;
+while{{_x distance _endPos < 20}count _convoyVehicles < 1}do{ //CONVOY LOOP
+
+_vehiclePos = getPos _mainVehicle;
+_vehFrontPos = getPos _vehFront;
+
+if({!canMove _x}count _convoyVehicles > 0 && _stayToDefend)then{
+ {if(canMove _x)then{(driver _x) doMove _vehiclePos}}forEach _convoyVehicles;
+ sleep 5;
+ {
+ if(_x distance _vehiclePos < 50)then[{
+ if(_x != gunner (vehicle _x))then{
+ _x action ["GetOut", (vehicle _x)];
+ sleep 0.5;
+ [_x] orderGetIn false;
+ [_x] allowGetIn false;
+ _x doMove _vehiclePos;
+ };
+ },{
+ _x doMove _vehiclePos;
+ }];
+ }forEach units _group;
+ _group move _vehiclePos;
+ _group setSpeedMode "FULL";
+
+ if({_x distance _veh2 < 50}count units _group == count units _group)then{
+ _endPos = _vehiclePos;
+ };
+}else{
+ //-- Work In Progress!
+
+ if({alive _x && !(vehicle _x in _convoyVehicles)}count units _group > 0)then{ //AI has left the vehicle
+hint "AI has left the vehicle";
+ _group setBehaviour "CARELESS";
+ _group setCombatMode "GREEN";
+ {
+ if(!(vehicle _x in _convoyVehicles))then{
+ [_x] allowGetIn true;
+ [_x] orderGetIn true;
+ };
+ }forEach units _group;
+ sleep 10; //Brake the loop for 10 seconds
+ _group move _endPos;
+ //_group setSpeedMode "NORMAL";
+
+ }else{ //Do vehicle speed management and continue travel to destination
+
+ //_group move _endPos;
+ //{driver _x move _endPos}count _convoyVehicles;
+ _group setBehaviour "SAFE";
+ _group setCombatMode "GREEN";
+ //_group setFormation "COLUMN";//"FILE";
+ _group setSpeedMode "FULL";
+
+ if(time - _lastMoveCheck > 60)then{
+ _group move _endPos;
+ _lastMoveCheck = time;
+ if(_vehiclePos distance _oldPos < 30)then[{
+ hint "Convoy is stuck";
+ //FAILSAFE IF CONVOY IS STUCK
+ {driver _x doMove _endPos}count _convoyVehicles;
+ //_group setSpeedMode "FULL";
+ sleep 10; //Brake the loop for 20 seconds
+ //_group move _endPos;
+ //_group setSpeedMode "NORMAL";
+ },{_group move _endPos}];
+ _oldPos = getPos _mainVehicle;
+ _group move _endPos;
+ };
+
+ //-- Distance Checks
+ // forceSpeed = m/s
+ // limitSpeed = km/h
+ // 1 km/h == ~0.2777778 m/s
+
+ /*
+ //Check Formation
+ _distanceA = _veh1 distance _veh2;
+ _distanceB = _veh1 distance _veh3;
+ if(_distanceA > _distanceB)then{
+ _3inFrontOf2 = [_veh2, _veh3, 0] call BIS_fnc_isInFrontOf;
+ if(_3inFrontOf2 || abs(_distanceA - _distanceB) > 10)then{//Swap Vehicles position in convoy (2 <-> 3)
+ //diag_log format["A: Distance 1-2: %1 - Distance 1-3: %2", round (_veh1 distance _veh2), round (_veh1 distance _veh3)];
+ _vehinMiddle = _veh3;
+ _veh3 = _veh2;
+ _veh2 = _vehinMiddle;
+ //diag_log format["B: Distance 1-2: %1 - Distance 1-3: %2", round (_veh1 distance _veh2), round (_veh1 distance _veh3)];
+ };
+ };
+ */
+
+ //Speed Management for Vehicle 1
+ if(_veh1 distance _veh2 > 80 || _veh1 distance _veh3 > 120)then{
+ if(_veh1 distance _veh2 > 100 || _veh1 distance _veh3 > 150)then{
+ //_veh1 forceSpeed (_maxSpd*0.1)*0.2777778;
+ _veh1 limitSpeed 0;
+ }else{
+ if(speed _veh3 < 10)then{
+ //_veh1 forceSpeed (1 max (speed _veh3)*0.2777778);
+ _veh1 limitSpeed (1 max (speed _veh3));
+ }else{
+ //_veh1 forceSpeed (_maxSpd*0.4)*0.2777778;
+ _veh1 limitSpeed (_maxSpd*0.5);
+ };
+ };
+ }else{
+ if(speed _veh3 < 10)then{
+ //_veh1 forceSpeed (_maxSpd*0.1)*0.2777778;
+ _veh1 limitSpeed (_maxSpd*0.1);
+ }else{
+ //_veh1 forceSpeed (_maxSpd*0.8)*0.2777778; //-- m/s
+ _veh1 limitSpeed (_maxSpd*0.8);
+ };
+ };
+
+ //Speed Management for Vehicle 2
+ if(_veh2 distance _veh1 > 80)then{
+ if(_veh2 distance _veh3 < _veh2 distance _veh1)then{
+ //_veh2 forceSpeed (_maxSpd*0.8)*0.2777778;
+ _veh2 limitSpeed (_maxSpd*0.8);
+ }else{
+ //Move faster to catch up with Vehicle1
+ //_veh2 forceSpeed _maxSpd*0.2777778;
+ _veh2 limitSpeed _maxSpd;
+ };
+ }else{
+ if(_veh2 distance _veh1 < 40)then{
+ //_veh2 forceSpeed (1 max (speed _veh1)*0.2777778);
+ _veh2 limitSpeed (1 max (speed _veh1));
+ }else{
+ if(_veh2 distance _veh3 > _veh2 distance _veh1)then{ //let Vehicle3 catch up
+ //_veh2 forceSpeed (_maxSpd*0.5)*0.2777778;
+ _veh2 limitSpeed (_maxSpd*0.5);
+ }else{
+ //_veh2 forceSpeed (_maxSpd*0.8)*0.2777778;
+ _veh2 limitSpeed (_maxSpd*0.8);
+ };
+ };
+ };
+
+ //Speed Management for Vehicle 3
+ if(_veh3 distance _veh2 > 80 || _veh3 distance _veh1 > 120)then{ //catch up
+ //_veh3 forceSpeed _maxSpd*0.2777778;
+ _veh3 limitSpeed _maxSpd;
+ }else{
+ if(_veh3 distance _veh2 < 40)then{
+ //_veh3 forceSpeed (1 max (speed _veh2)*0.2777778);
+ _veh3 limitSpeed (1 max (speed _veh2));
+ }else{
+ //if(speed _veh1 < 10)then{ //FAILSAFE IF CONVOY IS STUCK
+ // (driver _veh3) doMove (getPos _veh1);
+ //_veh3 forceSpeed (_maxSpd*0.8)*0.2777778;
+ // _veh3 limitSpeed (_maxSpd*0.8);
+ //}else{
+ //_veh3 forceSpeed (_maxSpd*0.8)*0.2777778;
+ _veh3 limitSpeed (_maxSpd*0.8);
+ //};
+ };
+ };
+ };
+};
+
+//code to end the while
+_unitsAlive = ({alive _x}count units _group);
+if(_unitsAlive < 1) then {
+ _endPos = _vehiclePos;
+};
+if (damage _mainVehicle == 1) then {
+ _endPos = _vehiclePos;
+};
+
+if({isPlayer _x && alive _x}count crew _mainVehicle > 0)then{
+ doStop (units _group);
+ {
+ _x spawn{
+ _this action ["engineOff", (vehicle _this)];
+ sleep 0.5;
+ deleteVehicle _this;
+ };
+ }foreach units _group;
+ _endPos = _vehiclePos;
+};
+
+UIsleep 1;
+}; //END OF LOOP
+
+hint "Dynamic Mission Status: Convoy Ended";
+
+if({alive _x}count units _group > 0 && damage _mainVehicle < 1)then{
+ _group move _vehiclePos;
+ sleep 10;
+ {
+ if(_x != gunner (vehicle _x))then{
+ [_x,_vehiclePos] spawn{ private "_unit";
+ _unit = _this select 0;
+ doStop _unit;
+ sleep 1;
+ _unit action ["engineOff", (vehicle _unit)];
+ _unit action ["GetOut", (vehicle _unit)];
+ unassignVehicle _unit;
+ sleep 0.1;
+ [_unit] orderGetIn false;
+ [_unit] allowGetIn false;
+ };
+ };
+ }forEach (units _group);
+
+ _group move _vehiclePos;
+ _group setBehaviour "AWARE";
+ _group setFormation "FILE";
+ _group setCombatMode "YELLOW";
+ [_group, _vehiclePos] call SEM_fnc_AImove;
+};
diff --git a/sem/scripts/ai/fn_AIactDeact.sqf b/sem/scripts/ai/fn_AIactDeact.sqf
new file mode 100644
index 0000000..edb7591
--- /dev/null
+++ b/sem/scripts/ai/fn_AIactDeact.sqf
@@ -0,0 +1,46 @@
+private["_enable","_group","_pos"];
+
+_group = _this select 0;
+_enable = _this select 1;
+
+if (_enable )then { //Enable AI
+
+ {
+ if (!isnull _x) then {
+ _x enableAI "AUTOTARGET";
+ //_x enableAI "TARGET";
+ _x enableAI "MOVE";
+ _x enableAI "ANIM";
+ _x enableAI "FSM";
+ _x stop false;
+ _x spawn {
+ _this setUnitPos "Middle";
+ uisleep 30;
+ _this setUnitPos "AUTO"
+ };
+ [_x, false] call SEM_fnc_AIdamageEH;
+ };
+ } count units _group;
+ _group setCombatMode "YELLOW";
+ _group setBehaviour "COMBAT"; //"AWARE";
+
+ diag_log "#SEM: Mission AI enabled";
+
+}
+else { //Disable AI
+ {
+ if (!isnull _x) then {
+ _x disableAI "AUTOTARGET";
+ _x disableAI "TARGET";
+ _x disableAI "MOVE";
+ _x disableAI "FSM";
+ _x stop true;
+ _x spawn {_this setUnitPos "DOWN"; sleep 5; _this disableAI "ANIM"};
+ [_x, true] call SEM_fnc_AIdamageEH;
+ };
+ } count units _group;
+ _group setBehaviour "SAFE";
+ _group setCombatMode "BLUE";
+
+ diag_log "#SEM: Mission AI disabled";
+};
\ No newline at end of file
diff --git a/sem/scripts/ai/fn_AIconvoy.sqf b/sem/scripts/ai/fn_AIconvoy.sqf
new file mode 100644
index 0000000..ff084cf
--- /dev/null
+++ b/sem/scripts/ai/fn_AIconvoy.sqf
@@ -0,0 +1,322 @@
+ /* KiloSwiss */
+private["_group","_endPos","_missionID","_mainVehicle","_convoyVehicles","_enterableVehicles","_convoyGrps","_ranks","_side","_vehiclePos","_vehFrontPos","_veh1","_veh2","_veh3","_start"];
+
+_group = _this select 0;
+_endPos = _this select 1;
+_missionID = _this select 2;
+_mainVehicle = _this select 3;
+_convoyVehicles = _this select 4;
+_enterableVehicles = _this select 5;
+
+ /* Marker position update */
+_this spawn { private["_endPos","_missionID","_mainVehicle","_oldPos","_newPos"];
+ _endPos = _this select 1;
+ _missionID = _this select 2;
+ _mainVehicle = _this select 3;
+ _oldPos = position _mainVehicle;
+
+ while{alive _mainVehicle && _mainVehicle distance _endPos > 50}do{
+ UIsleep 10;
+ _newPos = position _mainVehicle;
+ if(_oldPos distance _newPos > 10)then{
+ _oldPos = _newPos;
+ SEM_updateMissionMarkerPos = [_missionID, _newPos];
+ SEM_updateMissionMarkerPos call SEM_client_updateMissionMarkerPos;
+ };
+ };
+};
+
+_units = (units _group);
+_side = side (_units select 0);
+_startPos = getPos _mainVehicle;
+
+_vehFront = (if(count _convoyVehicles == 1)then[{_mainVehicle},{{if(_x != _mainVehicle)exitWith{_x}; (_convoyVehicles select 0)}count _convoyVehicles}]);
+
+{
+ _x setVariable ["AIskill",(skill _x)]
+} count _units;
+
+_ranks = ["COLONEL","MAJOR","CAPTAIN","LIEUTENANT","SERGEANT","CORPORAL","PRIVATE"];
+{
+ _x setFuel 1;
+ _x setDamage 0;
+ _group addVehicle _x;
+ if (_x in _enterableVehicles) then {
+ _x lock 0
+ }
+ else {
+ _x lock 3
+ };
+ _x setVariable ["AIrank", (_ranks select (_forEachIndex min (count _ranks -1)))];
+
+ _x addEventHandler ["getIn",{
+ (_this select 2) setUnitRank ((_this select 0) getVariable ["AIrank","PRIVATE"]);
+ if((_this select 1) == "driver")then{
+ (_this select 2) setSkill 1;
+ };
+ }];
+
+ _x addEventHandler ["getOut",{
+ (_this select 2) setSkill ((_this select 2) getVariable ["AIskill",0.7]);
+ }];
+
+ _x addeventHandler ["handleDamage",{
+ if(isNull (_this select 3))then{false};
+ }];
+
+ // Fill driver seats first
+ (_units select _forEachIndex) assignAsDriver _x;
+
+ if(_x emptyPositions "GUNNER" > 0)then{ // Assign a gunner
+ _x allowCrewInImmobile true; //allow gunner to stay in immobilized vehicle
+ (_units select (_forEachIndex + (count _convoyVehicles))) assignAsGunner _x;
+ };
+
+}forEach _convoyVehicles;
+
+//Order all Units to get in
+_units allowGetIn true;
+_units orderGetIn true;
+
+//Wait until every unit has boarded a vehicle
+_start = time;
+waitUntil {
+ uisleep 1;
+ {
+ (alive _x && vehicle _x == _x)
+ } count _units == 0 || time - _start >= 30
+};
+
+if({alive _x && vehicle _x == _x}count _units > 0)then{
+ { /* Move stuck AI into vehicles */
+ if(vehicle _x == _x)then{
+ _y = _x;
+ { /* Fill driver/gunner seats first */
+ if(_x emptyPositions "DRIVER" > 0)exitWith{_y moveInDriver _x; _y setSkill 1};
+ if(_x emptyPositions "GUNNER" > 0)exitWith{_y moveInGunner _x};
+ }forEach _convoyVehicles;
+ { /* Fill cargo seats */
+ if(_x emptyPositions "CARGO" > 0)exitWith{_y moveInCargo _x};
+ }forEach (_convoyVehicles - [_mainVehicle]);
+ };
+ _x setUnitRank ((vehicle _x) getVariable ["AIrank","PRIVATE"]);
+ }forEach _units;
+};
+
+//-- Get lowest TopSpeed from all vehicles
+_topSpeeds = [];
+{
+ _maxSpd = getNumber (configFile >> "cfgVehicles" >> typeOf _x >> "maxSpeed");
+ if(!isNil "_maxSpd")then{_topSpeeds pushBack _maxSpd};
+}forEach _convoyVehicles;
+
+_select = 0;
+_maxSpd = _topSpeeds select _select;
+while{{_maxSpd > _x}count _topSpeeds != 0}do{
+ _select = _select + 1;
+ _maxSpd = _topSpeeds select _select;
+};
+{_x forceSpeed (_maxSpd*0.8)*0.2777778}forEach _convoyVehicles; // m/s
+//DEBUG
+if(SEM_debug in ["log","full"])then{diag_log format["SEM DEBUG: Convoy Vehicles TopSpeeds: %1 - Selected lowest: %2", _topSpeeds, _maxSpd]};
+
+//_group move _endPos;
+{driver _x move _endPos}count _convoyVehicles;
+_group setSpeedMode "FULL";//"FULL";
+_group setBehaviour "SAFE"; //"CARELESS";
+_group setCombatMode "GREEN";
+_group setFormation "COLUMN";
+
+uisleep 30;
+
+ /* temporary definition of 3 vehicles */
+_veh1 = _convoyVehicles select 0;
+_veh2 = _convoyVehicles select 1;
+_veh3 = _convoyVehicles select 2;
+
+_lastMoveCheck = time;
+_oldPos = getPos _mainVehicle;
+
+ /* Convoy loop */
+_stayToDefend = true;
+while{{_x distance _endPos < 20}count _convoyVehicles < 1}do{ //CONVOY LOOP
+
+_vehiclePos = getPos _mainVehicle;
+_vehFrontPos = getPos _vehFront;
+
+if({!canMove _x}count _convoyVehicles > 0 && _stayToDefend)then{
+ {if(canMove _x)then{(driver _x) doMove _vehiclePos}}forEach _convoyVehicles;
+ sleep 5;
+ {
+ if(_x distance _vehiclePos < 50)then[{
+ if(_x != gunner (vehicle _x))then{
+ _x action ["GetOut", (vehicle _x)];
+ sleep 0.5;
+ [_x] orderGetIn false;
+ [_x] allowGetIn false;
+ _x doMove _vehiclePos;
+ };
+ },{
+ _x doMove _vehiclePos;
+ }];
+ }forEach units _group;
+ _group move _vehiclePos;
+ _group setSpeedMode "FULL";
+
+ if({_x distance _veh2 < 50}count units _group == count units _group)then{
+ _endPos = _vehiclePos;
+ };
+}
+else{
+ //-- Work In Progress!
+
+ if({alive _x && !(vehicle _x in _convoyVehicles)}count units _group > 0)then{ //AI has left the vehicle
+ _group setBehaviour "CARELESS";
+ _group setCombatMode "GREEN";
+ {
+ if(!(vehicle _x in _convoyVehicles))then{
+ [_x] allowGetIn true;
+ [_x] orderGetIn true;
+ };
+ }forEach units _group;
+ uisleep 10; //Brake the loop for 10 seconds
+ _group move _endPos;
+
+ }
+ else{ //Do vehicle speed management and continue travel to destination
+
+ _group setBehaviour "SAFE";
+ _group setCombatMode "GREEN";
+ _group setSpeedMode "FULL";
+
+ if(time - _lastMoveCheck > 60)then{
+ _group move _endPos;
+ _lastMoveCheck = time;
+ if(_vehiclePos distance _oldPos < 30)then {
+ //FAILSAFE IF CONVOY IS STUCK
+ {
+ driver _x doMove _endPos
+ } count _convoyVehicles;
+ sleep 20;
+ if(_vehiclePos distance _oldPos < 10)then{
+ _endPos = _vehiclePos;
+ };
+ }
+ else {
+ _group move _endPos
+ };
+ _oldPos = getPos _mainVehicle;
+ _group move _endPos;
+ };
+
+ //Speed Management for Vehicle 1
+ if(_veh1 distance _veh2 > 80 || _veh1 distance _veh3 > 120)then{
+ if(_veh1 distance _veh2 > 90 || _veh1 distance _veh3 > 130)then{
+ _veh1 limitSpeed 0;
+ }else{
+ if(speed _veh3 < 10)then{
+ _veh1 limitSpeed (1 max (speed _veh3));
+ }else{
+ _veh1 limitSpeed (_maxSpd*0.4);
+ };
+ };
+ }else{
+ if(speed _veh3 < 10)then{
+ _veh1 limitSpeed (_maxSpd*0.1);
+ }else{
+ _veh1 limitSpeed (_maxSpd*0.8);
+ };
+ };
+
+ //Speed Management for Vehicle 2
+ if(_veh2 distance _veh1 > 80)then{
+ if(_veh2 distance _veh3 < _veh2 distance _veh1)then{
+ _veh2 limitSpeed (_maxSpd*0.8);
+ }
+ else{
+ _veh2 limitSpeed _maxSpd;
+ };
+ }else{
+ if(_veh2 distance _veh1 < 50)then{
+ _veh2 limitSpeed (1 max (speed _veh1));
+ }
+ else{
+ if(_veh2 distance _veh3 > _veh2 distance _veh1)then{
+ _veh2 limitSpeed (_maxSpd*0.5);
+ }
+ else{
+ _veh2 limitSpeed (_maxSpd*0.8);
+ };
+ };
+ };
+
+ //Speed Management for Vehicle 3
+ if(_veh3 distance _veh2 > 80 || _veh3 distance _veh1 > 150)then{
+ if(_veh3 distance _veh2 < 40)then{
+ _veh3 limitSpeed (1 max (speed _veh2));
+ }else{
+ _veh3 limitSpeed _maxSpd;
+ };
+ }else{
+ if(_veh3 distance _veh2 < 40)then{
+ _veh3 limitSpeed (1 max (speed _veh2));
+ }
+ else{
+ _veh3 limitSpeed (_maxSpd*0.8);
+ };
+ };
+ };
+};
+
+//code to end the while
+_unitsAlive = ({alive _x}count units _group);
+if(_unitsAlive < 1) then {
+ _endPos = _vehiclePos;
+};
+if (damage _mainVehicle == 1) then {
+ _endPos = _vehiclePos;
+};
+
+if({isPlayer _x && alive _x}count crew _mainVehicle > 0)then{
+ doStop (units _group);
+ {
+ _x spawn{
+ _this action ["engineOff", (vehicle _this)];
+ sleep 0.5;
+ deleteVehicle _this;
+ };
+ }foreach units _group;
+ _endPos = _vehiclePos;
+};
+
+uisleep 1;
+};
+//END OF LOOP
+
+
+if ({alive _x}count units _group > 0 && damage _mainVehicle < 1) then {
+ _group move _vehiclePos;
+ uisleep 10;
+ {
+ if(_x != gunner (vehicle _x))then{
+ [_x,_vehiclePos] spawn{
+ private "_unit";
+ _unit = _this select 0;
+ doStop _unit;
+ uisleep 1;
+ _unit action ["engineOff", (vehicle _unit)];
+ _unit action ["GetOut", (vehicle _unit)];
+ unassignVehicle _unit;
+ sleep 0.1;
+ [_unit] orderGetIn false;
+ [_unit] allowGetIn false;
+ };
+ };
+ } forEach (units _group);
+
+ _group move _vehiclePos;
+ _group setBehaviour "AWARE";
+ _group setFormation "FILE";
+ _group setCombatMode "YELLOW";
+ [_group, _vehiclePos] call SEM_fnc_AImove;
+};
diff --git a/sem/scripts/ai/fn_AIdamageEH.sqf b/sem/scripts/ai/fn_AIdamageEH.sqf
new file mode 100644
index 0000000..8618c83
--- /dev/null
+++ b/sem/scripts/ai/fn_AIdamageEH.sqf
@@ -0,0 +1,34 @@
+private ["_addEH","_unit","_EHindex"];
+
+_unit = _this select 0;
+_addEH = _this select 1;
+
+if(_addEH)then[{ //Add damage detection EventHandler
+
+ _EHindex = _unit addEventHandler ["handleDamage",{ private["_AIunit","_source"];
+ _AIunit = _this select 0;
+ _source = _this select 3;
+ if(isPlayer _source)then{
+ (group _AIunit) reveal [_source, 1.5];
+ //_AIunit removeEventHandler ["handleDamage",(_AIunit getVariable "damageEHindex")];
+ _AIunit setVariable ["gotHitBy", [_source, time]]; //define attacker and time
+ _AIunit setVariable ["damageEHindex", -1]; //this is used later
+ };
+ }];
+ _unit setVariable ["damageEHindex", _EHindex];
+
+},{ //Remove damage detection EventHandler
+
+ _EHindex = _unit getVariable "damageEHindex";
+ if(_EHindex >= 0)then{
+ _unit removeEventHandler ["handleDamage",_EHindex];
+ _unit setVariable ["damageEHindex", -1];
+ };
+
+ if(!isNil {_unit getVariable "gotHitBy"})then{
+ if((time - ((_unit getVariable "gotHitBy") select 1)) >= 150)then{
+ _unit setVariable ["gotHitBy", Nil];
+ };
+ };
+
+}];
\ No newline at end of file
diff --git a/sem/scripts/ai/fn_AIfiredEH.sqf b/sem/scripts/ai/fn_AIfiredEH.sqf
new file mode 100644
index 0000000..c621f5a
--- /dev/null
+++ b/sem/scripts/ai/fn_AIfiredEH.sqf
@@ -0,0 +1,8 @@
+
+call compile format["
+ _this addEventHandler ['Fired',{
+ if(_this select 2 in %1)then{
+ _this select 0 addMagazines [_this select 5, 1];
+ };
+ }];
+", ["launch_RPG32_F","launch_NLAW_F","launch_Titan_short_F","launch_Titan_F"]];
\ No newline at end of file
diff --git a/sem/scripts/ai/fn_AIkilledEH.sqf b/sem/scripts/ai/fn_AIkilledEH.sqf
new file mode 100644
index 0000000..ddbded3
--- /dev/null
+++ b/sem/scripts/ai/fn_AIkilledEH.sqf
@@ -0,0 +1,74 @@
+/*
+ Update 27.03.2017
+ By [Ignatz] He-Man
+*/
+
+/* Remove Weapons when killed */
+call compile format["
+ _this addEventHandler ['Killed',{
+ private['_unit','_z','_ran'];
+ _unit = _this select 0;
+ _killer = _this select 1;
+ {_unit removeWeaponGlobal _x}count (%1 + ['EpochRadio0','ItemMap','ItemRadio','ItemWatch','ItemCompass','ItemGPS']);
+ {if(_x in (magazines _unit))then{_unit removeMagazines _x}}count %2;
+ if (SEM_AIdropGearChance < ceil(random 100)) then {
+ _unit call SEM_fnc_removeGear;
+ {deleteVehicle _x} forEach nearestObjects [(getPosATL _unit), ['GroundWeaponHolder','WeaponHolderSimulated','WeaponHolder'], 1];
+ };
+ _unit spawn{
+ sleep .1;
+ {_z = _x;
+ if(_x in (getweaponcargo _z))exitWith{deleteVehicle _z}count %1;
+ if(_x in (getmagazinecargo _z))exitWith{deleteVehicle _z}count %2;
+ }forEach nearestObjects [(getPosATL _this), ['GroundWeaponHolder','WeaponHolderSimulated','WeaponHolder'], 3];
+ };
+ }];
+", SEM_removeWeaponsFromDeadAI, SEM_removeMagazinesFromDeadAI];
+
+/* AI run over by vehicle */
+if(SEM_punish_AIroadkill || SEM_reward_AIkill)then{
+ _this addEventHandler ["killed",{
+ private["_u","_k","_vk"];
+ _u = _this select 0;
+ _k = _this select 1;
+ _vk = vehicle _k;
+ if (SEM_punish_AIroadkill) then {
+ if (_vk isKindOf "Car") then {
+ if (abs speed _vk > 0) then {
+ if (_vk distance _u < 10) then {
+ if (isEngineOn _vk || !isNull (driver _vk)) then {
+ if (SEM_damage_AIroadkill) then {
+ if (!local _vk) then {
+ _vk remoteexec ["SEM_Client_VehDamage",_vk];
+ };
+ };
+ if(SEM_Krypto_AIroadkill > 0)then{
+ [_k,SEM_Krypto_AIroadkill*-1] call EPOCH_server_effectCrypto;
+ };
+ {
+ deleteVehicle _x
+ } forEach nearestObjects [(getPosATL _u), ['GroundWeaponHolder','WeaponHolderSimulated','WeaponHolder'], 3];
+ _u call SEM_fnc_removeGear;
+ if ({alive _x}count units group _u < 1) then {
+ _u spawn {
+ uisleep 5;
+ createMine ["APERSTripMine", (position _this),[],0]
+ };
+ };
+ }
+ }
+ }
+ }
+ else {
+ if(SEM_reward_AIkill)then{
+ [_k,(ceil(random 15))] call EPOCH_server_effectCrypto;
+ };
+ };
+ }
+ else {
+ if (SEM_reward_AIkill) then {
+ [_k,(ceil(random 15))] call EPOCH_server_effectCrypto;
+ };
+ };
+ }];
+};
\ No newline at end of file
diff --git a/sem/scripts/ai/fn_AImove.sqf b/sem/scripts/ai/fn_AImove.sqf
new file mode 100644
index 0000000..862bb22
--- /dev/null
+++ b/sem/scripts/ai/fn_AImove.sqf
@@ -0,0 +1,55 @@
+/* KiloSwiss */
+_this call SEM_fnc_findthread;
+
+_this spawn {
+ private["_group","_pos","_owner","_firstLoop","_oldPos","_newPos","_dir","_dist","_posX","_posY","_wp"];
+ _group = _this select 0;
+ _pos = _this select 1;
+
+ {
+ if (!isnull _x) then {
+ if (_x == leader _group) then {
+ _x setUnitRank "CORPORAL";
+ }
+ else {
+ _x setUnitRank "PRIVATE";
+ };
+ };
+ } forEach units _group;
+
+ _firstLoop = true;
+ _oldPos = [0,0,0];
+ _newPos = _pos;
+
+ while {
+ {
+ if (!isnull _x) then {
+ alive _x
+ };
+ } count units _group > 0
+ } do {
+ while {_oldPos distance _newPos < 30} do {
+ uisleep 0.1;
+ _dir = random 360;
+ _dist = (15+(random 45));
+ _posX = (_pos select 0) + sin (_dir) * _dist;
+ _posY = (_pos select 1) + cos (_dir) * _dist;
+ _newPos = [_posX, _posY, 0];
+ };
+ _oldPos = _newPos;
+
+ _group move _newPos;
+ _group setSpeedMode (["FULL","NORMAL","LIMITED"]call BIS_fnc_selectRandom);
+ _group setFormation (["WEDGE","VEE","FILE","DIAMOND"]call BIS_fnc_selectRandom);
+
+ waitUntil {
+ uisleep 5;
+ {
+ if (!isnull _x) then {
+ alive _x && vehicle _x == _x && unitReady _x
+ };
+ } count (units _group) == {alive _x && vehicle _x == _x} count (units _group)
+ };
+ };
+ diag_log format["#SEM: AI moving stopped - Remaining AIs: (%1/%2)", {alive _x}count units _group, count units _group];
+};
\ No newline at end of file
diff --git a/sem/scripts/ai/fn_AIsetOwner.sqf b/sem/scripts/ai/fn_AIsetOwner.sqf
new file mode 100644
index 0000000..40c762a
--- /dev/null
+++ b/sem/scripts/ai/fn_AIsetOwner.sqf
@@ -0,0 +1,174 @@
+private["_group","_pos","_units","_checkPos","_serverID","_firstLoop","_loops","_possibleThreads","_z","_newOwner","_ownerLeft","_AIkilled","_changeOwner"];
+/*
+ Disable AI processing and move it to nearby players via "setOwner"
+ Work In Progress!
+
+ Update 03.01.2015
+ KiloSwiss
+
+ [_group, true] call SEM_fnc_AIactDeact; //Enable AI
+ [_group, false] call SEM_fnc_AIactDeact; //Disable AI
+
+*/
+#define getAttacker(WHO) WHO getVariable "gotHitBy"
+
+_group = _this select 0;
+_pos = _this select 1;
+_checkPos = _pos; _checkPos set [2,2];
+_units = units _group;
+_serverID = owner (units _group select 0);
+//diag_log format["#SEM DEBUG: ServerID: %1", _serverID];
+
+_group move _pos;
+_group setspeedMode "FULL";
+_group setFormation "DIAMOND";
+sleep 10;
+[_group, false] call SEM_fnc_AIactDeact; //Disable AI
+
+_oldPos = _pos;
+_newPos = _pos;
+_newOwner = objNull;
+_firstLoop = true;
+_changeOwner = false;
+while {
+ {
+ if (!isnull _x) then {
+ alive _x
+ };
+ } count units _group > 0
+} do {
+
+ if (_firstLoop) then {
+ _firstLoop=false;
+ _loops = -1;
+ diag_log "#SEM: Mission AI waiting for their first encounter"
+ }
+ else {
+ _loops = 0;
+ diag_log "#SEM: Mission AI searching for new possible thread(s)"
+ };
+
+ waitUntil{
+ uisleep 5;
+ _possibleThreads = []; //Check if any thread for the AI has been detected
+ //Check if any AI is shot by player
+ {
+ if (!isnull _x) then {
+ if (!isNil {getAttacker(_x)}) then {
+ if (isPlayer (getAttacker(_x) select 0) && (getAttacker(_x) select 0) != _newOwner) then {
+ if((time - (getAttacker(_x) select 1)) < 150)then {
+ _possibleThreads pushBack (getAttacker(_x) select 0)
+ }
+ else {
+ _x setVariable ["gotHitBy", Nil]
+ };
+ };
+ };
+ };
+ } forEach _units; //Do NOT replace forEach with count!
+ //Check if any players are near
+ {
+ uisleep 0.1;
+ if (!isnull _x) then {
+ if (isPlayer _x && alive _x && !(_x in _possibleThreads) && _x != _newOwner) then {
+ if (_x isKindOf "Epoch_Man_base_F" || _x isKindOf "Epoch_Female_base_F") then {
+ _possibleThreads pushBack _x
+ }
+ else {
+ _z = _x;
+ if (count crew _z > 0) then {
+ {
+ if (isPlayer _x && _x != _newOwner) then {
+ _possibleThreads pushBack _x
+ }
+ } forEach crew _z;
+ };
+ };
+ };
+ };
+ } forEach (_pos nearEntities [["Epoch_Man_base_F","Epoch_Female_base_F","Helicopter","Car","Motorcycle"], 500]); //Do NOT replace forEach with count!
+
+ if (_loops >= 0) then {
+ if(_loops>5)then {
+ _loops = -1;
+ [_group, false] call SEM_fnc_AIactDeact
+ }
+ else {
+ _loops = _loops + 1
+ };
+ };
+
+ (count _possibleThreads > 0)
+ };
+ /* Thread has been detected */
+
+ [_group, true] call SEM_fnc_AIactDeact; //Enable AI system
+ {_group reveal _x}count _possibleThreads; //Reveal threads
+
+
+ //Select the closest alive player to the mission
+ diag_log format["#SEM DEBUG: Possible threads: %1", _possibleThreads];
+ _newOwner = [_pos, _possibleThreads] call SEM_fnc_selectClosest;
+ _newOwnerID = owner _newOwner; //Define the new owners ID
+
+ {
+ if (!isnull _x) then {
+ _x setOwner _newOwnerID;
+ diag_log format["#SEM: Setowner: Unit: %1 New Owner: %2", _x, _newOwnerID];
+ };
+ }forEach units _group; //Set the new owner
+ waitUntil {
+ {
+ if (!isnull _x) then {
+ owner _x == _newOwnerID;
+ };
+ } forEach units _group || !isPlayer _newOwner;
+ };
+
+if(isPlayer _newOwner)then[{
+ diag_log format["#SEM: Mission AI has new Owner: %1 - ID: %2", _newOwner, _newOwnerID];
+
+ /* AI transfer completed. */
+
+ //Announce transfer of the ownership to the client
+ SEM_takeAIownership = [_group, _pos];
+ _newOwnerID publicVariableClient "SEM_takeAIownership";
+
+ //[_group,_pos,_newOwner] spawn SEM_fnc_AImove; //IMPORTANT: spawn not call!
+
+ /* Check some stuff */
+ _ownerDistance = _pos distance _newOwner;
+ waitUntil{ UIsleep 5; _ownerLeft = false; _AIkilled = false; _changeOwner = false;
+ if (
+ {
+ if (!isnull _x) then {
+ alive _x
+ }
+ } count units _group < 1
+ ) then {
+ _AIkilled = true
+ };
+ if (!_aiKilled) then {
+ if (!isPlayer _newOwner || local (units _group select 0)) then {
+ _ownerLeft = true
+ };
+ if (!_ownerLeft) then {
+ _newDistance = _pos distance _newOwner;
+ if (_newDistance > 800 || (_newDistance > _ownerDistance + 50 && _newDistance > 500)) then { //Current owner moved too far away
+ {
+ uisleep 0.1; //Check for other possible nearby owner
+ if (isPlayer _x && alive _x && !(_x == _newOwner)) then {
+ if (_x distance _pos < _newDistance) exitwith {
+ _changeOwner = true
+ };
+ };
+ } forEach (_pos nearEntities [["Epoch_Man_base_F","Epoch_Female_base_F","Helicopter","Car","Motorcycle"], 500]);
+ };
+ };
+ };
+ (_ownerLeft || _AIkilled || _changeOwner) //All AI units dead or player disconnected or closer player detected
+ };
+
+},{diag_log format["#SEM: Mission AI new Owner left during processing: %1 - ID: %2", _newOwner, _newOwnerID]}];
+
+}; //End of while loop
diff --git a/sem/scripts/ai/fn_broadcastAI.sqf b/sem/scripts/ai/fn_broadcastAI.sqf
new file mode 100644
index 0000000..6a8b1c2
--- /dev/null
+++ b/sem/scripts/ai/fn_broadcastAI.sqf
@@ -0,0 +1,30 @@
+ /* KiloSwiss */
+private "_units";
+
+if (isNil "SEM_AI_Units") then {
+ SEM_AI_Units = []
+};
+
+_units = SEM_AI_Units;
+
+ /* Remove old/dead units */
+//{if(isNull _x || !alive _x)then{_units deleteAt _forEachIndex}}forEach _units;
+{
+ if (isNull _x || !alive _x) then {
+ _units set [_forEachIndex, "delete"]
+ }
+}forEach _units;
+_units = _units - ["delete"];
+
+ /* Add new units */
+{
+ _units pushBack _x
+} forEach _this;
+
+ /* Broadcast to clients */
+SEM_AI_Units = _units;
+publicVariable "SEM_AI_Units";
+
+if (SEM_debug in ["log","full"]) then {
+ diag_log format["#SEM DEBUG: Broadcasted %1 AI units to clients", count SEM_AI_Units]
+};
\ No newline at end of file
diff --git a/sem/scripts/ai/fn_findThread.sqf b/sem/scripts/ai/fn_findThread.sqf
new file mode 100644
index 0000000..767985a
--- /dev/null
+++ b/sem/scripts/ai/fn_findThread.sqf
@@ -0,0 +1,81 @@
+/*
+ Detect Threads in form of players.
+
+ Update 03.01.2015
+ KiloSwiss
+*/
+/*
+ Update 27.03.2017
+ By [Ignatz] He-Man
+*/
+
+_this spawn {
+ diag_log format["#SEM DEBUG: 1st Find Thread"];
+ private["_group","_pos","_units","_checkPos","_possibleThreads","_z"];
+ _group = _this select 0;
+ _pos = _this select 1;
+ _checkPos = _pos; _checkPos set [2,2];
+ _units = units _group;
+ {
+ [_x, true] call SEM_fnc_AIdamageEH
+ } count _units;
+ {
+ _group reveal [_x,4];
+ } foreach (nearestobjects [_pos,[],50]);
+
+ while {{alive _x}count units _group > 0} do {
+ waitUntil {
+ uisleep 5;
+ _possibleThreads = []; //Check if any thread for the AI has been detected
+ //Check if any AI is shot by player
+ {
+ if (!isnull _x) then {
+ _attackervar = _x getVariable ["gotHitBy", Nil];
+ if (!isNil "_attackervar") then {
+ _attacker = _attackervar select 0;
+ _attacktime = _attackervar select 1;
+ if (isPlayer _attacker && !(_attacker in _possibleThreads)) then {
+ if ((time - _attacktime) < 150) then {
+ _possibleThreads pushBack _attacker;
+ diag_log format["#SEM DEBUG: Attacker: %1",_attacker];
+ }
+ else {
+ _x setVariable ["gotHitBy", Nil]
+ };
+ };
+ };
+ };
+ } forEach _units; //Do NOT replace forEach with count!
+ //Check if any players are near
+ {
+ uisleep 0.1;
+ if (isPlayer _x && alive _x && !(_x in _possibleThreads)) then {
+ if (_x isKindOf "Epoch_Man_base_F" || _x isKindOf "Epoch_Female_base_F") then {
+ _possibleThreads pushBack _x
+ }
+ else {
+ _z = _x;
+ if (count crew _z > 0) then {
+ {
+ if (isPlayer _x) then {
+ _possibleThreads pushBack _x
+ };
+ } forEach crew _z;
+ };
+ };
+ };
+ } forEach (_pos nearEntities [["Epoch_Man_base_F","Epoch_Female_base_F","Helicopter","Car","Motorcycle"], 500]); //Do NOT replace forEach with count!
+
+ (count _possibleThreads > 0)
+ };
+ /* Thread has been detected */
+ if(SEM_debug in ["log","full"])then{
+ diag_log format["#SEM DEBUG: Possible threads: %1", _possibleThreads]
+ };
+
+ /* AI react immediately */
+ {
+ _group reveal [_x,2]
+ } count _possibleThreads; //Reveal threads
+ }; //End of while loop
+};
\ No newline at end of file
diff --git a/sem/scripts/ai/fn_removeGear.sqf b/sem/scripts/ai/fn_removeGear.sqf
new file mode 100644
index 0000000..08b9e2b
--- /dev/null
+++ b/sem/scripts/ai/fn_removeGear.sqf
@@ -0,0 +1,9 @@
+if (!isnull _this) then {
+ removeVest _this;
+ //removeHeadgear _this;
+ removeGoggles _this;
+ removeAllItems _this;
+ removeAllWeapons _this;
+ removeBackpackGlobal _this;
+ {_this removeMagazine _x}count magazines _this;
+};
\ No newline at end of file
diff --git a/sem/scripts/ai/fn_spawnAI.sqf b/sem/scripts/ai/fn_spawnAI.sqf
new file mode 100644
index 0000000..8126953
--- /dev/null
+++ b/sem/scripts/ai/fn_spawnAI.sqf
@@ -0,0 +1,308 @@
+private["_pos","_cnt","_group","_unit","_wpn","_opt","_Umale","_Ufemale","_Uciv","_Ukart","_rifles","_riflesGL","_LMGs","_SMGs","_rifleOptics","_smgOptics","_Sniper","_loadoutsAssigned"];
+/*
+ File: ai.sqf
+ Author: drsubo
+ usage : [_uLoc] execVM
+
+ Update 03.01.2015
+ Re-written by KiloSwiss
+*/
+/*
+ Update 27.03.2017
+ By [Ignatz] He-Man
+*/
+
+
+_pos = _this select 0;
+_cnt = (if(count _this > 1)then[{(_this select 1) max 4},{7}]); //Unit Count (min 5 - default 7)
+_group = createGroup RESISTANCE;
+
+while {count (units _group) < _cnt} do {
+ _group createUnit ['I_Soldier_EPOCH', _pos, [], 10, 'NO_COLLIDE'];
+ sleep 0.1;
+};
+
+{
+ _x call SEM_fnc_AIkilledEH;
+ _x call SEM_fnc_AIfiredEH;
+ _x call SEM_fnc_stripUnit;
+ _x setVariable["LASTLOGOUT_EPOCH",99999999];
+} count units _group;
+
+if(SEM_AIdisableSniperDamage)then{
+ units _group call SEM_fnc_broadcastAI;
+};
+
+diag_log format["#SEM: Spawned %1 units at position %2", count units _group, _pos];
+
+
+_Umale = ["U_O_CombatUniform_ocamo","U_O_PilotCoveralls","U_OG_leader"];
+
+_Ufemale = ["U_Camo_uniform","U_CamoBlue_uniform","U_CamoBrn_uniform","U_CamoRed_uniform"];
+
+_Uguer = ["U_OG_Guerilla1_1","U_OG_Guerilla2_1","U_OG_Guerilla2_2","U_OG_Guerilla2_3","U_OG_Guerilla3_1","U_OG_Guerilla3_2"];
+
+_Uciv = ["U_C_Poloshirt_stripped","U_C_Poloshirt_blue","U_C_Poloshirt_burgundy","U_C_Poloshirt_tricolour","U_C_Poloshirt_salmon",
+ "U_C_Poloshirt_redwhite","U_C_Poor_1","U_C_WorkerCoveralls","U_C_Journalist","U_C_Scientist","U_OrestesBody"];
+
+_Ukart = ["U_C_Driver_1","U_C_Driver_2","U_C_Driver_3","U_C_Driver_4","U_C_Driver_1_black","U_C_Driver_1_blue",
+ "U_C_Driver_1_green","U_C_Driver_1_red","U_C_Driver_1_white","U_C_Driver_1_yellow","U_C_Driver_1_orange"];
+
+
+_rifles = [
+ ["akm_EPOCH", "30Rnd_762x39_Mag"],
+ ["m16_EPOCH", "30Rnd_556x45_Stanag_Tracer_Yellow"],
+ ["m16Red_EPOCH", "30Rnd_556x45_Stanag_Tracer_Green"],
+ ["m4a3_EPOCH", "30Rnd_556x45_Stanag_Tracer_Red"],
+ ["Arifle_Katiba_C_F", "30Rnd_65x39_caseless_green_mag_Tracer"],
+ ["Arifle_Mk20_F", "30Rnd_556x45_Stanag_Tracer_Red"],
+ ["Arifle_Mk20C_F", "30Rnd_556x45_Stanag_Tracer_Green"],
+ ["Arifle_Mk20C_plain_F", "30Rnd_556x45_Stanag_Tracer_Red"],
+ ["Arifle_Mk20_plain_F", "30Rnd_556x45_Stanag_Tracer_Red"],
+ ["Arifle_MXC_F", "30Rnd_65x39_caseless_mag_Tracer"],
+ ["Arifle_MXC_Black_F", "30Rnd_65x39_caseless_mag_Tracer"],
+ ["Arifle_MX_F", "30Rnd_65x39_caseless_mag_Tracer"],
+ ["Arifle_MX_Black_F", "30Rnd_65x39_caseless_mag_Tracer"],
+ ["Arifle_SDAR_F", "30Rnd_556x45_Stanag_Tracer_Red"],
+ ["Arifle_TRG21_F", "30Rnd_556x45_Stanag_Tracer_Green"],
+ ["Arifle_TRG20_F", "30Rnd_556x45_Stanag_Tracer_Yellow"]
+];
+
+_riflesGL = [
+ ["Arifle_Katiba_GL_F", "30Rnd_65x39_caseless_green_mag_Tracer"],
+ ["Arifle_Mk20_GL_F", "30Rnd_556x45_Stanag_Tracer_Yellow"],
+ ["Arifle_Mk20_GL_plain_F", "30Rnd_556x45_Stanag_Tracer_Yellow"],
+ ["Arifle_MX_GL_F", "30Rnd_65x39_caseless_mag_Tracer"],
+ ["Arifle_MX_GL_Black_F", "30Rnd_65x39_caseless_mag_Tracer"],
+ ["Arifle_TRG21_GL_F", "30Rnd_556x45_Stanag_Tracer_Green"]
+];
+
+_LMGs = [
+ ["m249_EPOCH", "200Rnd_556x45_M249"],
+ ["m249Tan_EPOCH", "200Rnd_556x45_M249"],
+ ["LMG_Mk200_F", "200Rnd_65x39_cased_Box_Tracer"],
+ ["Arifle_MX_SW_F", "100Rnd_65x39_caseless_mag_Tracer"],
+ ["Arifle_MX_SW_Black_F", "100Rnd_65x39_caseless_mag_Tracer"],
+ ["LMG_Zafir_F", "150Rnd_762x54_Box_Tracer"]
+];
+
+_rifleOptics = ["optic_Aco","optic_ACO_grn","optic_Holosight"]; //"optic_Hamr","optic_Arco"
+
+_SMGs = [
+ ["SMG_02_F", "30Rnd_9x21_Mag"],
+ ["SMG_01_F", "30Rnd_45ACP_Mag_SMG_01"],
+ ["Hgun_PDW2000_F", "30Rnd_9x21_Mag"]
+];
+
+_smgOptics = ["optic_Aco_smg","optic_ACO_grn_smg","optic_Holosight_smg"];
+
+
+_DMRs = [
+ ["M14_EPOCH", "20Rnd_762x51_Mag"],
+ ["M14Grn_EPOCH", "20Rnd_762x51_Mag"],
+ ["srifle_EBR_F", "20Rnd_762x51_Mag"],
+ ["srifle_DMR_01_F", "10Rnd_762x51_Mag"],
+ ["arifle_MXM_F", "30Rnd_65x39_caseless_mag_Tracer"],
+ ["arifle_MXM_Black_F", "30Rnd_65x39_caseless_mag_Tracer"]
+];
+
+//"optic_Nightstalker", "optic_SOS", "optic_LRPS", "optic_DMS"
+_Sniper = [
+ ["m107_EPOCH", "5Rnd_127x108_Mag"],
+ ["m107Tan_EPOCH", "5Rnd_127x108_Mag"],
+ ["Srifle_GM6_F", "5Rnd_127x108_Mag"],
+ ["Srifle_LRR_F", "7Rnd_408_Mag"]
+];
+
+if(sunOrMoon < 0.1)then{{_x addWeapon "NVG_EPOCH"}count units _group};
+
+//Special Hunter (leader)
+_unit = units _group select 0;
+_unit setSkill 1;
+if (surfaceiswater (getpos _unit)) then {
+ _unit forceAddUniform "U_O_Wetsuit";
+ _unit addVest "V_19_EPOCH";
+ _unit addMagazines ["30Rnd_556x45_Stanag_Tracer_Red", 3];
+ _unit addWeapon "Arifle_SDAR_F";
+}
+else {
+ _unit forceAddUniform "U_OG_leader";
+ _unit addVest format["V_%1_EPOCH", ceil(random 40)];
+ _wpn = _DMRs select (random (count _DMRs -1));
+ _unit addMagazines [(_wpn select 1), 6];
+ _unit addWeapon (_wpn select 0);
+};
+_unit addHeadgear format["H_%1_EPOCH", ceil(random 104)];
+_unit addPrimaryWeaponItem "optic_Arco";
+
+
+//Sniper
+_unit = units _group select 1;
+_unit setSkill 1;
+if (surfaceiswater (getpos _unit)) then {
+ _unit forceAddUniform "U_O_Wetsuit";
+ _unit addVest "V_19_EPOCH";
+ _unit addMagazines ["30Rnd_556x45_Stanag_Tracer_Red", 3];
+ _unit addWeapon "Arifle_SDAR_F";
+}
+else {
+ _unit forceAddUniform "U_O_GhillieSuit";
+ _unit addVest format["V_%1_EPOCH", ceil(random 40)];
+ _wpn = _Sniper select (random (count _Sniper -1));
+ _unit addMagazines [(_wpn select 1), 4];
+ _unit addWeapon (_wpn select 0);
+};
+_unit addPrimaryWeaponItem "optic_SOS";
+_unit selectWeapon (primaryWeapon _unit);
+_unit addMagazines ["9rnd_45X88_magazine", 4];
+_unit addWeapon "1911_pistol_EPOCH";
+
+
+//Rifleman
+_unit = units _group select 2;
+_unit setSkill 1;
+if (surfaceiswater (getpos _unit)) then {
+ _unit forceAddUniform "U_O_Wetsuit";
+ _unit addVest "V_19_EPOCH";
+ _unit addMagazines ["30Rnd_556x45_Stanag_Tracer_Red", 3];
+ _unit addWeapon "Arifle_SDAR_F";
+}
+else {
+ _unit forceAddUniform (_Uguer select (random (count _Uguer -1)));
+ _unit addVest format["V_%1_EPOCH", ceil(random 40)];
+ _wpn = _riflesGL select (random (count _riflesGL -1));
+ _unit addMagazines ["3Rnd_HE_Grenade_shell", 2];
+ _unit addMagazines [(_wpn select 1), 4];
+ _unit addWeapon (_wpn select 0);
+};
+_unit addHeadgear format["H_%1_EPOCH", ceil(random 104)];
+_unit addPrimaryWeaponItem (_rifleOptics select (random (count _rifleOptics -1)));
+
+
+//Anti Tank
+_unit = units _group select 3;
+_unit setSkill 1;
+if (surfaceiswater (getpos _unit)) then {
+ _unit forceAddUniform "U_O_Wetsuit";
+ _unit addVest "V_19_EPOCH";
+ _unit addMagazines ["30Rnd_556x45_Stanag_Tracer_Red", 3];
+ _unit addWeapon "Arifle_SDAR_F";
+}
+else {
+ _unit forceAddUniform "U_O_CombatUniform_ocamo";
+ _unit addVest format["V_%1_EPOCH", ceil(random 40)];
+ _wpn = _SMGs select (random (count _SMGs -1));
+ _unit addMagazines [(_wpn select 1), 3];
+ _unit addWeapon (_wpn select 0);
+};
+_unit addHeadgear format["H_%1_EPOCH", ceil(random 104)];
+
+_unit addBackPack "B_Carryall_ocamo";
+_unit addMagazines ["RPG32_HE_F", 1];
+_unit addMagazines ["RPG32_F", 1];
+_unit addWeapon "launch_RPG32_F";
+
+_opt = _smgOptics select (random (count _smgOptics -1));
+_unit addPrimaryWeaponItem _opt;
+_unit selectWeapon (secondaryWeapon _unit);
+
+if(_cnt > 4)then{
+ if(_cnt > 9)then [{ //Group over 10 - spawn some elite soldiers
+
+ //Rifleman
+ _unit = units _group select 5;
+ _unit setSkill 1;
+ if (surfaceiswater (getpos _unit)) then {
+ _unit forceAddUniform "U_O_Wetsuit";
+ _unit addVest "V_19_EPOCH";
+ _unit addMagazines ["30Rnd_556x45_Stanag_Tracer_Red", 3];
+ _unit addWeapon "Arifle_SDAR_F";
+ }
+ else {
+ _unit forceAddUniform (_Uguer select (random (count _Uguer -1)));
+ _unit addVest format["V_%1_EPOCH", ceil(random 40)];
+ _wpn = _riflesGL select (random (count _riflesGL -1));
+ _unit addMagazines [(_wpn select 1), 6];
+ _unit addMagazines ["1Rnd_HE_Grenade_shell", 6];
+ _unit addWeapon (_wpn select 0);
+ };
+ _unit addHeadgear format["H_%1_EPOCH", ceil(random 104)];
+ _unit addPrimaryWeaponItem "optic_Arco";
+
+ //MG
+ _unit = units _group select 6;
+ _unit setSkill 1;
+ if (surfaceiswater (getpos _unit)) then {
+ _unit forceAddUniform "U_O_Wetsuit";
+ _unit addVest "V_19_EPOCH";
+ _unit addMagazines ["30Rnd_556x45_Stanag_Tracer_Red", 3];
+ _unit addWeapon "Arifle_SDAR_F";
+ }
+ else {
+ _unit forceAddUniform "U_O_CombatUniform_ocamo";
+ _unit addVest format["V_%1_EPOCH", ceil(random 40)];
+ _wpn = _LMGs select (random (count _LMGs -1));
+ _unit addMagazines [(_wpn select 1), 3];
+ _unit addWeapon (_wpn select 0);
+ };
+ _unit addHeadgear format["H_%1_EPOCH", ceil(random 104)];
+ _unit addPrimaryWeaponItem "optic_Hamr";
+
+ //Anti Tank
+ _unit = units _group select 7;
+ _unit setSkill 1;
+ if (surfaceiswater (getpos _unit)) then {
+ _unit forceAddUniform "U_O_Wetsuit";
+ _unit addVest "V_19_EPOCH";
+ _unit addMagazines ["30Rnd_556x45_Stanag_Tracer_Red", 3];
+ _unit addWeapon "Arifle_SDAR_F";
+ }
+ else {
+ _unit forceAddUniform "U_O_CombatUniform_ocamo";
+ _unit addVest format["V_%1_EPOCH", ceil(random 40)];
+ _wpn = _SMGs select (random (count _SMGs -1));
+ _unit addMagazines [(_wpn select 1), 3];
+ _unit addWeapon (_wpn select 0);
+ };
+ _unit addHeadgear format["H_%1_EPOCH", ceil(random 104)];
+ _unit addBackPack "B_Carryall_ocamo";
+ _unit addMagazines ["RPG32_HE_F", 1];
+ _unit addMagazines ["RPG32_F", 1];
+ _unit addWeapon "launch_RPG32_F";
+ _opt = _smgOptics select (random (count _smgOptics -1));
+ _unit addPrimaryWeaponItem _opt;
+ _unit selectWeapon (secondaryWeapon _unit);
+
+ _loadoutsAssigned = 7},{_loadoutsAssigned = 4}];
+
+ //spawn additional hunters
+ for "_i" from _loadoutsAssigned to (count units _group -1) step 1 do{
+ private "_unit";
+ call compile format ["
+ _unit = units _group select %1;
+ _unit setSkill 1;
+ if (surfaceiswater (getpos _unit)) then {
+ _unit forceAddUniform 'U_O_Wetsuit';
+ _unit addVest 'V_19_EPOCH';
+ _unit addMagazines ['30Rnd_556x45_Stanag_Tracer_Red', 3];
+ _unit addWeapon 'Arifle_SDAR_F';
+ }
+ else {
+ _unit forceAddUniform (%2 select (random (count %2 -1)));
+ _unit addVest 'V_%3_EPOCH';
+ _unit addMagazines [(%5 select 1),(3+(random 3))];
+ _unit addWeapon (%5 select 0);
+ };
+ _unit addHeadgear 'H_%4_EPOCH';
+ _unit addPrimaryWeaponItem (%6 select (random (count %6 -1)));
+
+ ", _i, _Uguer, ceil(random 40), ceil(random 104), (_rifles select (random (count _rifles -1))), _rifleOptics];
+ };
+};
+
+{_x setskill ["courage",1]}count (units _group);
+_group allowFleeing 0;
+
+_group selectLeader (units _group select 0);
+
+_group
diff --git a/sem/scripts/ai/fn_stripUnit.sqf b/sem/scripts/ai/fn_stripUnit.sqf
new file mode 100644
index 0000000..5bed75e
--- /dev/null
+++ b/sem/scripts/ai/fn_stripUnit.sqf
@@ -0,0 +1,9 @@
+if (!isnull _this) then {
+ removeVest _this;
+ removeUniform _this;
+ removeBackpack _this;
+ removeHeadgear _this;
+ removeGoggles _this;
+ removeAllItems _this;
+ removeAllWeapons _this;
+};
\ No newline at end of file
diff --git a/sem/scripts/fn_attachToVeh.sqf b/sem/scripts/fn_attachToVeh.sqf
new file mode 100644
index 0000000..46ffb13
--- /dev/null
+++ b/sem/scripts/fn_attachToVeh.sqf
@@ -0,0 +1,25 @@
+ /* KiloSwiss */
+private ["_obj","_veh","_attachOffset"];
+
+_obj = _this select 0;
+_veh = _this select 1;
+
+_attachOffset = switch(typeOf _obj)do{
+ case "Box_NATO_Wps_F" :{ (switch(typeOf _veh)do{
+ case "I_G_Van_01_transport_F" :{[0, -2.8, -.3]};
+ case "I_Truck_02_transport_F" :{[0, -3, -.3]};
+ case "I_G_Offroad_01_F" :{[0, -2.5, -.1]};
+ })
+ };
+
+ case "C_supplyCrate_F" :{ (switch(typeOf _veh)do{
+ case "I_G_Van_01_transport_F" :{[0, -2.8, .3]};
+ case "I_Truck_02_transport_F" :{[0, -3, .3]};
+ case "I_G_Offroad_01_F" :{[0, -2.4, .3]};
+ })
+ };
+
+ default{[0,-2.5,0]};
+};
+
+_obj attachto [_veh, _attachOffset];
\ No newline at end of file
diff --git a/sem/scripts/fn_convoyRoute.sqf b/sem/scripts/fn_convoyRoute.sqf
new file mode 100644
index 0000000..681e22e
--- /dev/null
+++ b/sem/scripts/fn_convoyRoute.sqf
@@ -0,0 +1,71 @@
+/* KiloSwiss */
+private["_startPos","_endPos","_defaultCenterPos","_worldSize","_locations","_worldRadius","_searchRadius","_blockRadius","_blockPos","_found"];
+
+_defaultCenterPos = getArray(configFile >> "CfgWorlds" >> worldName >> "centerPosition");
+
+_worldSize = SEM_worldData select 0;
+_worldCenterPos = SEM_worldData select 1;
+_locations = SEM_worldData select 2;;
+
+_worldRadius = (1500 max (_worldSize/2));
+_searchRadius = (150 max (_worldRadius/5) min 300);
+_blockRadius = (500 max (_worldRadius/3) min 3000);
+
+_blockPos = [];
+{_blockPos pushBack _x}forEach SEM_lastMissionPositions;
+{_blockPos pushBack (getMarkerPos _x)}forEach SEM_blockMarker;
+
+ /* Convoy start position */
+waitUntil{ private["_dir","_searchDist","_posX","_posY","_checkPos","_roads"]; sleep .1; _found = false;
+ /* Randomize the search area */
+ _dir = random 360;
+ _searchDist = (_worldRadius/2 max random(_worldRadius - _searchRadius));
+ _posX = (_worldCenterPos select 0) + sin(_dir) * _searchDist;
+ _posY = (_worldCenterPos select 1) + cos(_dir) * _searchDist;
+ _checkPos = [_posX, _posY, 0];
+
+ _roads = _checkPos nearRoads _searchRadius;
+ if(count _roads > 0)then{
+ { private "_checkPos";
+ _checkPos = getPos (_roads select _forEachIndex);
+ _startPos = _checkPos findEmptyPosition [0,0,"ProtectionZone_F"];
+ if(count _startPos > 0)exitWith{_found = true};
+ }forEach _roads;
+ };
+ if(_found)then{
+ {if(_x distance _startPos < _blockRadius)exitWith{_found = false}}forEach _blockPos;
+
+ if(_found)then{
+ {if(isPlayer _x)then[{if(_x distance _startPos < _blockRadius)exitWith{_found = false}},{UIsleep .05}]}forEach (if(isMultiplayer)then[{allplayers},{allUnits}]);
+ };
+ };
+
+ (_found)
+};
+
+ /* Convoy destination */
+_found = false;
+while{!_found}do{ UIsleep .1; private["_randomLocation","_locationPos","_locationSize"];
+
+ /* Select a random location */
+ _randomLocation = _locations select random(count _locations -1);
+ _locationPos = locationPosition _randomLocation;
+
+ /* Let's suppose this position is a valid convoy destination */
+ _found = true;
+
+ /* Now check this position */
+ if(_locationPos distance _startPos < (_worldRadius))then{_found = false};
+
+ if(_found)then{ /* Check it again */
+ _locationSize = (if(size _randomLocation select 0 > size _randomLocation select 1)then[{size _randomLocation select 0},{size _randomLocation select 1}]);
+ _endPos = _locationPos findEmptyPosition [0,_locationSize,"ProtectionZone_F"];
+ if(count _endPos == 0)then{_found = false};
+ //_endPos = [_locationPos,0,(50 max _locationSize*1.5 min 200),30,0,0.7,0] call BIS_fnc_findSafePos;
+ //if(_endPos isEqualTo _defaultCenterPos)then{_found = false};
+ };
+};
+_endPos set [2,0];
+_convoyRoute = [_startPos, _endPos];
+
+_convoyRoute
diff --git a/sem/scripts/fn_crateLoot.sqf b/sem/scripts/fn_crateLoot.sqf
new file mode 100644
index 0000000..5841c18
--- /dev/null
+++ b/sem/scripts/fn_crateLoot.sqf
@@ -0,0 +1,914 @@
+/*
+ Update 27.03.2017
+ By [Ignatz] He-Man
+*/
+
+/*
+ [_box,1] call SEM_fnc_crateLoot;
+ _box = crate where the loot should be added
+ 1 = selected loadout
+ leadouts configure at the bottom of this file!
+*/
+
+private ["_crate","_loadout"];
+_crate = _this select 0;
+if (count _this > 1) then {
+ _loadout = _this select 1
+}
+else {
+ _loadout = round(random 1)
+};
+
+
+_crate call SEM_fnc_emptyGear;
+
+
+_Backpacks_Assault = [
+ "B_AssaultPack_cbr",
+ "B_AssaultPack_dgtl",
+ "B_AssaultPack_khk",
+ "B_AssaultPack_mcamo",
+ "B_AssaultPack_ocamo",
+ "B_AssaultPack_rgr",
+ "B_AssaultPack_sgg"
+ ];
+
+_Backpacks_Carryall = [
+ "B_Carryall_cbr",
+ "B_Carryall_khk",
+ "B_Carryall_mcamo",
+ "B_Carryall_ocamo",
+ "B_Carryall_oli",
+ "B_Carryall_oucamo"
+ ];
+
+_Backpacks_Field = [
+ "B_FieldPack_blk",
+ "B_FieldPack_cbr",
+ "B_FieldPack_khk",
+ "B_FieldPack_ocamo",
+ "B_FieldPack_oli",
+ "B_FieldPack_oucamo"
+ ];
+
+_Backpacks_Kit = [
+ "B_Kitbag_cbr",
+ "B_Kitbag_mcamo",
+ "B_Kitbag_rgr",
+ "B_Kitbag_sgg"
+ ];
+
+_Backpacks_Tactical = [
+ "B_TacticalPack_blk",
+ "B_TacticalPack_mcamo",
+ "B_TacticalPack_ocamo",
+ "B_TacticalPack_oli",
+ "B_TacticalPack_rgr"
+ ];
+
+_Backpacks_Small = [
+ "smallbackpack_red_epoch",
+ "smallbackpack_green_epoch",
+ "smallbackpack_teal_epoch",
+ "smallbackpack_pink_epoch"
+ ];
+
+_Backpacks_Other = ["B_Parachute"];
+_Backpacks_All = _Backpacks_Carryall +
+ _Backpacks_Field +
+ _Backpacks_Kit +
+ _Backpacks_Tactical +
+ _Backpacks_Small +
+ _Backpacks_Other;
+//////////////////////////////////////////////////////////////////////////////////////////////////////////
+_Explosives = [
+ "DemoCharge_Remote_Mag",
+ "SatchelCharge_Remote_Mag",
+ "ATMine_Range_Mag",
+ "ClaymoreDirectionalMine_Remote_Mag",
+ "APERSMine_Range_Mag",
+ "APERSBoundingMine_Range_Mag",
+ "SLAMDirectionalMine_Wire_Mag",
+ "APERSTripMine_Wire_Mag"
+ ];
+
+_Paint = [
+ "PaintCanBlk",
+ "PaintCanBlu",
+ "PaintCanBrn",
+ "PaintCanGrn",
+ "PaintCanOra",
+ "PaintCanPur",
+ "PaintCanRed",
+ "PaintCanTeal",
+ "PaintCanYel"
+ ];
+
+/*
+_Keys = [
+ "ItemKey",
+ "ItemKeyBlue",
+ "ItemKeyGreen",
+ "ItemKeyRed",
+ "ItemKeyYellow",
+ "ItemKeyKit"
+ ];
+*/
+
+/*
+_Documents = [
+ "ItemDoc1",
+ "ItemDoc2",
+ "ItemDoc3",
+ "ItemDoc4",
+ "ItemDoc5",
+ "ItemDoc6",
+ "ItemDoc7",
+ "ItemDoc8",
+ "ItemVehDoc1",
+ "ItemVehDoc2",
+ "ItemVehDoc3",
+ "ItemVehDoc4"
+ ];
+*/
+
+_Gems = [
+ "ItemTopaz",
+ "ItemOnyx",
+ "ItemSapphire",
+ "ItemAmethyst",
+ "ItemEmerald",
+ "ItemCitrine",
+ "ItemRuby",
+ "ItemQuartz",
+ "ItemJade",
+ "ItemGarnet"
+ ];
+
+_RareMetal = [
+ //"ItemBriefcaseGold100oz",
+ "ItemAluminumBar",
+ "ItemCopperBar",
+ "ItemTinBar",
+ "PartOreGold",
+ "PartOreSilver",
+ "ItemGoldBar",
+ "ItemSilverBar",
+ "ItemGoldBar10oz"
+ ];
+
+_Medical = [
+ "FAK",
+ "HeatPack",
+ "ColdPack"
+ ];
+
+_Food_Canned = [
+ "FoodBioMeat",
+ "FoodWalkNSons",
+ "sardines_epoch",
+ "meatballs_epoch",
+ "scam_epoch",
+ "sweetcorn_epoch"
+ ];
+
+_Food_Other = [
+ "FoodMeeps",
+ "FoodSnooter",
+ "honey_epoch"
+ ];
+
+_Food_Cooked = [
+ "CookedSheep_EPOCH",
+ "CookedGoat_EPOCH",
+ "SnakeMeat_EPOCH",
+ "CookedRabbit_EPOCH",
+ "CookedChicken_EPOCH"
+ ];
+
+_Food_Craft = [
+ "SnakeCarcass_EPOCH",
+ "RabbitCarcass_EPOCH",
+ "ChickenCarcass_EPOCH",
+ "GoatCarcass_EPOCH",
+ "SheepCarcass_EPOCH"
+ ];
+
+_Food_Fish = [
+ "ItemTrout",
+ "ItemSeaBass",
+ "ItemTuna"
+ ];
+
+_Food_All = _Food_Canned +
+ _Food_Other +
+ _Food_Cooked +
+ _Food_Fish +
+ _Food_Craft;
+
+_Drink = [
+ "WhiskeyNoodle",
+ "ItemSodaOrangeSherbet",
+ "ItemSodaPurple",
+ "ItemSodaMocha",
+ "ItemSodaBurst",
+ "ItemSodaRbull"
+ ];
+
+_OtherItems = [
+// "ItemBriefcaseE",
+ "ItemCoolerE",
+ "ItemDocument",
+ "lighter_epoch",
+ "JackKit"
+ ];
+
+_BuildingKits = [
+ "ItemLockbox",
+ "KitStudWall",
+ "KitWoodFloor",
+ "KitWoodStairs",
+ "KitWoodRamp",
+ "KitFirePlace",
+ "KitShelf",
+ "KitFoundation",
+ "KitCinderWall",
+ "KitSolarGen",
+ "KitWorkbench",
+ "KitWoodTower"
+ ];
+
+_BuildingComponents = [
+// "PartPlankPack",
+// "WoodLog_EPOCH",
+ "CinderBlocks",
+ "MortarBucket",
+ "ItemScraps",
+ "ItemCorrugated",
+ "ItemCorrugatedLg"
+ ];
+
+_CraftingTools = [
+ "ChainSaw",
+ "VehicleRepairLg",
+ "Hatchet",
+ "MultiGun",
+ "MeleeSledge"
+ ];
+
+_CraftingComponents = [
+// "ItemHotwire",
+// "ItemComboLock",
+// "ItemPipe",
+// "ItemBulb",
+// "ItemBurlap",
+ "CircuitParts",
+ "VehicleRepair",
+ "ItemMixOil",
+ "emptyjar_epoch",
+ "jerrycan_epoch",
+ "ItemBarrelF",
+ "ItemBarrelE",
+ "EnergyPack",
+ "EnergyPackLg",
+ "Heal_EPOCH",
+ "Defib_EPOCH",
+ "Repair_EPOCH",
+ "ItemSolar",
+ "ItemCables",
+ "ItemBattery",
+ "ItemPlywoodPack"
+ ];
+
+_Grenades_Hand = [
+ "HandGrenade",
+ "MiniGrenade"
+ ];
+
+_Grenades_Smoke = [
+ "SmokeShell",
+ "SmokeShellYellow",
+ "SmokeShellGreen",
+ "SmokeShellRed",
+ "SmokeShellPurple",
+ "SmokeShellOrange",
+ "SmokeShellBlue"
+ ];
+
+_Grenades_Light = [
+ "Chemlight_green",
+ "Chemlight_red",
+ "Chemlight_yellow",
+ "Chemlight_blue"
+ ];
+
+_Grenades_ALL = _Grenades_Hand +
+ _Grenades_Smoke +
+ _Grenades_Light;
+
+_Shell_Smokes = [
+// "1Rnd_Smoke_Grenade_shell",
+// "1Rnd_SmokeRed_Grenade_shell",
+// "1Rnd_SmokeGreen_Grenade_shell",
+// "1Rnd_SmokeYellow_Grenade_shell",
+// "1Rnd_SmokePurple_Grenade_shell",
+// "1Rnd_SmokeBlue_Grenade_shell",
+// "1Rnd_SmokeOrange_Grenade_shell",
+ "3Rnd_Smoke_Grenade_shell",
+ "3Rnd_SmokeRed_Grenade_shell",
+ "3Rnd_SmokeGreen_Grenade_shell",
+ "3Rnd_SmokeYellow_Grenade_shell",
+ "3Rnd_SmokePurple_Grenade_shell",
+ "3Rnd_SmokeBlue_Grenade_shell",
+ "3Rnd_SmokeOrange_Grenade_shell"
+ ];
+
+_Shell_Flares = [
+// "UGL_FlareWhite_F",
+// "UGL_FlareGreen_F",
+// "UGL_FlareRed_F",
+// "UGL_FlareYellow_F",
+// "UGL_FlareCIR_F",
+ "3Rnd_UGL_FlareWhite_F",
+ "3Rnd_UGL_FlareGreen_F",
+ "3Rnd_UGL_FlareRed_F",
+ "3Rnd_UGL_FlareYellow_F",
+ "3Rnd_UGL_FlareCIR_F"
+ ];
+
+_Shell_Grenade = [
+ "3Rnd_HE_Grenade_shell",
+ "1Rnd_HE_Grenade_shell",
+ "1Rnd_HE_Grenade_shell"
+ ];
+
+_Shell_ALL = _Shell_Smokes +
+ _Shell_Flares +
+ _Shell_Grenade;
+
+_Radios = [
+ "EpochRadio0",
+ "EpochRadio1",
+ "EpochRadio2",
+ "EpochRadio3",
+ "EpochRadio4",
+ "EpochRadio5",
+ "EpochRadio6",
+ "EpochRadio7",
+ "EpochRadio8",
+ "EpochRadio9"
+ ];
+
+_BeltItems = [
+ "ItemCompass",
+ "ItemGPS",
+ "ItemWatch",
+ "Binocular",
+ "NVG_EPOCH",
+ "Rangefinder"
+ ];
+/////////////////////////////////////////////////////////////////////////////////////////////////
+_Ammo762 = [
+ "20Rnd_762x51_Mag",
+ "10Rnd_762x54_Mag",
+ "30Rnd_762x39_Mag",
+ "20rnd_762_magazine",
+ "150Rnd_762x54_Box",
+ "150Rnd_762x54_Box_Tracer"
+ ];
+
+_Ammo127 = [
+ "5Rnd_127x108_Mag",
+ "5Rnd_127x108_APDS_Mag"
+ ];
+
+_Ammo65 = [
+ "30Rnd_65x39_caseless_green",
+ "30Rnd_65x39_caseless_green_mag_Tracer",
+ "30Rnd_65x39_caseless_mag",
+ "30Rnd_65x39_caseless_mag_Tracer",
+ "200Rnd_65x39_cased_Box",
+ "100Rnd_65x39_caseless_mag",
+ "200Rnd_65x39_cased_Box_Tracer",
+ "100Rnd_65x39_caseless_mag_Tracer"
+ ];
+
+_Ammo556 = [
+ "20Rnd_556x45_UW_mag",
+ "30Rnd_556x45_Stanag",
+ "30Rnd_556x45_Stanag_Tracer_Red",
+ "30Rnd_556x45_Stanag_Tracer_Green",
+ "30Rnd_556x45_Stanag_Tracer_Yellow",
+ "200Rnd_556x45_M249"
+ ];
+
+_AmmoMarks = [
+ "10Rnd_338_Mag",
+ "20Rnd_762x51_Mag",
+ "10Rnd_127x54_Mag",
+ "10Rnd_93x64_DMR_05_Mag"
+ ];
+_AmmoMarksMMG = [
+ "150Rnd_93x64_Mag",
+ "130Rnd_338_Mag"
+ ];
+
+_AmmoOther = [
+ "7Rnd_408_Mag",
+ "spear_magazine",
+ "5Rnd_rollins_mag"
+ ];
+
+_AmmoHandGun = [
+ "30Rnd_45ACP_Mag_SMG_01",
+ "30Rnd_45ACP_Mag_SMG_01_Tracer_Green",
+ "9Rnd_45ACP_Mag",
+ "11Rnd_45ACP_Mag",
+ "6Rnd_45ACP_Cylinder",
+ "16Rnd_9x21_Mag",
+ "30Rnd_9x21_Mag",
+ "10rnd_22X44_magazine",
+ "9rnd_45X88_magazine",
+ "6Rnd_GreenSignal_F",
+ "6Rnd_RedSignal_F"
+ ];
+
+_Ammo_ALL = _Ammo762 +
+ _Ammo127 +
+ _Ammo65 +
+ _Ammo556 +
+ _AmmoMarks +
+// _AmmoMarksMMG +
+ _AmmoOther +
+ _AmmoHandGun;
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+_Pistols = [
+ ["hgun_PDW2000_F", "30Rnd_9x21_Mag"],
+ ["hgun_ACPC2_F", "9Rnd_45ACP_Mag"],
+ ["hgun_Rook40_F", "30Rnd_9x21_Mag"],
+ ["hgun_P07_F", "30Rnd_9x21_Mag"],
+ ["hgun_Pistol_heavy_01_F", "11Rnd_45ACP_Mag"],
+ ["hgun_Pistol_heavy_02_F", "6Rnd_45ACP_Cylinder"],
+ ["ruger_pistol_epoch", "10rnd_22X44_magazine"],
+ ["1911_pistol_epoch", "9rnd_45X88_magazine"],
+ ["hgun_Pistol_Signal_F", "6Rnd_RedSignal_F0"]
+ ];
+
+_RifleSniper762 = [
+ ["srifle_EBR_F", "20Rnd_762x51_Mag"],
+ ["srifle_DMR_01_F", "20Rnd_762x51_Mag"],
+ ["M14_EPOCH", "20Rnd_762x51_Mag"],
+ ["M14Grn_EPOCH", "20Rnd_762x51_Mag"]
+ ];
+
+_RifleSniper127 = [
+ ["srifle_GM6_F", "5Rnd_127x108_Mag"],
+ ["m107Tan_EPOCH", "5Rnd_127x108_Mag"],
+ ["m107_EPOCH", "5Rnd_127x108_Mag"]
+ ];
+
+_RifleSniper408 = [
+ ["srifle_LRR_F", "7Rnd_408_Mag"]
+ ];
+
+_RifleSniper65 = [
+ ["arifle_MXM_F", "30Rnd_65x39_caseless_mag_Tracer"],
+ ["arifle_MXM_Black_F", "30Rnd_65x39_caseless_mag_Tracer"]
+ ];
+
+_RifleLMG762 = [
+ ["LMG_Zafir_F", "150Rnd_762x54_Box_Tracer"]
+ ];
+
+_RifleLMG65 = [
+ ["LMG_Mk200_F", "200Rnd_65x39_cased_Box_Tracer"],
+ ["arifle_MX_SW_F", "100Rnd_65x39_caseless_mag_Tracer"],
+ ["arifle_MX_SW_Black_F", "100Rnd_65x39_caseless_mag_Tracer"]
+ ];
+
+_RifleLMG556 = [
+ ["m249_EPOCH", "200Rnd_556x45_M249"],
+ ["m249Tan_EPOCH", "200Rnd_556x45_M249"]
+ ];
+_RifleMarksMMG = [
+ ["MMG_01_hex_F", "150Rnd_93x64_Mag"],
+ ["MMG_01_tan_F", "150Rnd_93x64_Mag"],
+ ["MMG_02_camo_F", "130Rnd_338_Mag"],
+ ["MMG_02_black_F", "130Rnd_338_Mag"],
+ ["MMG_02_sand_F", "130Rnd_338_Mag"]
+ ];
+_Rifle65Lnchr = [
+ ["arifle_Katiba_GL_F", "30Rnd_65x39_caseless_green_mag_Tracer"],
+ ["arifle_MX_GL_F", "30Rnd_65x39_caseless_mag_Tracer"],
+ ["arifle_MX_GL_Black_F", "30Rnd_65x39_caseless_mag_Tracer"]
+ ];
+
+_Rifle556Lnchr = [
+ ["arifle_Mk20_GL_F", "30Rnd_556x45_Stanag_Tracer_Yellow"],
+ ["arifle_Mk20_GL_plain_F", "30Rnd_556x45_Stanag_Tracer_Yellow"],
+ ["arifle_TRG21_GL_F", "30Rnd_556x45_Stanag_Tracer_Green"]
+ ];
+
+_RifleAssault762 = [
+ ["AKM_EPOCH", "30Rnd_762x39_Mag"]
+ ];
+
+_RifleAssault65 = [
+ ["arifle_Katiba_C_F", "30Rnd_65x39_caseless_green_mag_Tracer"],
+ ["arifle_Katiba_F", "30Rnd_65x39_caseless_green_mag_Tracer"],
+ ["arifle_MXC_F", "30Rnd_65x39_caseless_mag_Tracer"],
+ ["arifle_MX_F", "30Rnd_65x39_caseless_mag_Tracer"],
+ ["arifle_MX_Black_F", "30Rnd_65x39_caseless_mag_Tracer"],
+ ["arifle_MXC_Black_F", "30Rnd_65x39_caseless_mag_Tracer"]
+ ];
+
+_RifleAssault556 = [
+ ["arifle_TRG21_F", "30Rnd_556x45_Stanag_Tracer_Green"],
+ ["arifle_TRG20_F", "30Rnd_556x45_Stanag_Tracer_Yellow"],
+ ["arifle_Mk20_plain_F", "30Rnd_556x45_Stanag_Tracer_Red"],
+ ["arifle_Mk20C_plain_F", "30Rnd_556x45_Stanag_Tracer_Red"],
+ ["arifle_Mk20C_F", "30Rnd_556x45_Stanag_Tracer_Red"],
+ ["arifle_Mk20_F", "30Rnd_556x45_Stanag_Tracer_Green"],
+ ["m16_EPOCH", "30Rnd_556x45_Stanag_Tracer_Yellow"],
+ ["m16Red_EPOCH", "30Rnd_556x45_Stanag_Tracer_Green"],
+ ["m4a3_EPOCH", "30Rnd_556x45_Stanag_Tracer_Red"]
+ ];
+
+_RifleMarks = [
+ ["srifle_DMR_02_F", "10Rnd_338_Mag"],
+ ["srifle_DMR_02_camo_F", "10Rnd_338_Mag"],
+ ["srifle_DMR_02_sniper_F", "10Rnd_338_Mag"],
+ ["srifle_DMR_03_F", "20Rnd_762x51_Mag"],
+ ["srifle_DMR_03_khaki_F", "20Rnd_762x51_Mag"],
+ ["srifle_DMR_03_tan_F", "20Rnd_762x51_Mag"],
+ ["srifle_DMR_03_multicam_F", "20Rnd_762x51_Mag"],
+ ["srifle_DMR_03_woodland_F", "20Rnd_762x51_Mag"],
+ ["srifle_DMR_06_camo_F", "20Rnd_762x51_Mag"],
+ ["srifle_DMR_06_olive_F", "20Rnd_762x51_Mag"],
+ ["srifle_DMR_04_Tan_F", "10Rnd_127x54_Mag"],
+ ["srifle_DMR_05_blk_F", "10Rnd_93x64_DMR_05_Mag"],
+ ["srifle_DMR_05_hex_F", "10Rnd_93x64_DMR_05_Mag"],
+ ["srifle_DMR_05_tan_F", "10Rnd_93x64_DMR_05_Mag"]
+ ];
+
+_RifleSniper = _RifleSniper762 +
+ _RifleSniper127 +
+ _RifleSniper408 +
+ _RifleSniper65 +
+ _RifleMarks;
+
+_RifleLMG = _RifleLMG762 +
+ _RifleLMG65 +
+// _RifleMarksMMG +
+ _RifleLMG556;
+
+_RifleLnchr = _Rifle65Lnchr +
+ _Rifle556Lnchr;
+
+_RifleAssault = _RifleAssault762 +
+ _RifleAssault65 +
+ _RifleAssault556 +
+ _RifleLnchr;
+
+_Rifle_Mid = _RifleAssault +
+ _RifleLnchr;
+
+_Rifle_Heavy = _RifleSniper +
+ _RifleLMG;
+
+_Rifle_ALL = _RifleSniper +
+ _RifleLMG +
+ _RifleLnchr +
+ _RifleAssault;
+
+_WeaponAttachments_Optics =[
+// "optic_Nightstalker",
+ "optic_Arco",
+ "optic_Hamr",
+ "optic_Aco",
+ "optic_ACO_grn",
+ "optic_Aco_smg",
+ "optic_ACO_grn_smg",
+ "optic_Holosight",
+ "optic_Holosight_smg",
+ "optic_SOS",
+ "optic_MRCO",
+ "optic_DMS",
+ "optic_Yorris",
+ "optic_MRD",
+ "optic_LRPS",
+ "optic_NVS",
+ "optic_tws",
+ "optic_tws_mg"
+ ];
+
+_WeaponAttachments_Muzzle =[
+ "muzzle_snds_H", // 6.5mm
+ "muzzle_snds_L", // 9mm
+ "muzzle_snds_M", // 556mm
+ "muzzle_snds_B", // 7.62mm
+ "muzzle_snds_H_MG", // 6.5 LMG
+ "muzzle_snds_acp" // 45 cal
+ ];
+
+_WeaponAttachments_Other = [
+ "acc_flashlight",
+ "acc_pointer_IR"
+ ];
+
+_out = switch (_loadout) do {
+ case 0:{
+ [
+ [_Backpacks_All,[2,0]],
+ [_Food_All,[2,1]],
+ [_Drink,[2,1]],
+ [_BeltItems,[0,1]],
+ [_OtherItems,[0,1]],
+ [_Medical,[0,1]],
+ [_Gems,[0,1]],
+ [_Explosives,[0,1]],
+ [_Grenades_ALL,[0,3]],
+ [_Rifle_ALL,[1,3]],
+ [_Ammo_ALL,[1,3]],
+ [_Shell_ALL,[0,3]],
+ [_WeaponAttachments_Optics,[0,2]],
+ [_WeaponAttachments_Muzzle,[0,2]],
+ [_WeaponAttachments_Other,[0,2]],
+ [_BuildingKits,[1,4]],
+ [_BuildingComponents,[1,5]],
+ [_CraftingTools,[0,2]],
+ [_CraftingComponents,[0,1]],
+ ["FAK",[1,3]]
+ ];
+ };
+ case 1:{
+ [
+ [_Backpacks_All,[2,0]],
+ [_Food_All,[2,1]],
+ [_Drink,[2,1]],
+ [_BeltItems,[0,1]],
+ [_OtherItems,[0,1]],
+ [_Medical,[0,1]],
+ [_Gems,[0,1]],
+ [_Explosives,[0,1]],
+ [_Grenades_ALL,[0,3]],
+ [_Rifle_ALL,[1,3]],
+ [_Ammo_ALL,[1,3]],
+ [_Shell_ALL,[0,3]],
+ [_WeaponAttachments_Optics,[0,2]],
+ [_WeaponAttachments_Muzzle,[0,2]],
+ [_WeaponAttachments_Other,[0,2]],
+ [_BuildingKits,[1,4]],
+ [_BuildingComponents,[1,5]],
+ [_CraftingTools,[0,2]],
+ [_CraftingComponents,[0,1]],
+ ["FAK",[1,3]]
+ ];
+ };
+ case 2:{
+ [
+ [_Backpacks_All,[2,0]],
+ [_Food_All,[2,1]],
+ [_Drink,[2,1]],
+ [_BeltItems,[0,1]],
+ [_OtherItems,[0,1]],
+ [_Medical,[0,1]],
+ [_Gems,[0,1]],
+ [_Explosives,[0,1]],
+ [_Grenades_ALL,[0,3]],
+ [_Rifle_ALL,[1,3]],
+ [_Ammo_ALL,[1,3]],
+ [_Shell_ALL,[0,3]],
+ [_WeaponAttachments_Optics,[0,2]],
+ [_WeaponAttachments_Muzzle,[0,2]],
+ [_WeaponAttachments_Other,[0,2]],
+ [_BuildingKits,[1,4]],
+ [_BuildingComponents,[1,5]],
+ [_CraftingTools,[0,2]],
+ [_CraftingComponents,[0,1]],
+ ["FAK",[1,3]]
+ ];
+ };
+ case 3:{
+ [
+ [_Backpacks_All,[2,0]],
+ [_Food_All,[2,1]],
+ [_Drink,[2,1]],
+ [_BeltItems,[0,1]],
+ [_OtherItems,[0,1]],
+ [_Medical,[0,1]],
+ [_Gems,[0,1]],
+ [_Explosives,[0,1]],
+ [_Grenades_ALL,[0,3]],
+ [_Rifle_ALL,[1,3]],
+ [_Ammo_ALL,[1,3]],
+ [_Shell_ALL,[0,3]],
+ [_WeaponAttachments_Optics,[0,2]],
+ [_WeaponAttachments_Muzzle,[0,2]],
+ [_WeaponAttachments_Other,[0,2]],
+ [_BuildingKits,[1,4]],
+ [_BuildingComponents,[1,5]],
+ [_CraftingTools,[0,2]],
+ [_CraftingComponents,[0,1]],
+ ["FAK",[1,3]]
+ ];
+ };
+ case 4:{
+ [
+ [_Backpacks_All,[2,0]],
+ [_Food_All,[2,1]],
+ [_Drink,[2,1]],
+ [_BeltItems,[0,1]],
+ [_OtherItems,[0,1]],
+ [_Medical,[0,1]],
+ [_Gems,[0,1]],
+ [_Explosives,[0,1]],
+ [_Grenades_ALL,[0,3]],
+ [_Rifle_ALL,[1,3]],
+ [_Ammo_ALL,[1,3]],
+ [_Shell_ALL,[0,3]],
+ [_WeaponAttachments_Optics,[0,2]],
+ [_WeaponAttachments_Muzzle,[0,2]],
+ [_WeaponAttachments_Other,[0,2]],
+ [_BuildingKits,[1,4]],
+ [_BuildingComponents,[1,5]],
+ [_CraftingTools,[0,2]],
+ [_CraftingComponents,[0,1]],
+ ["FAK",[1,3]]
+ ];
+ };
+ case 5:{
+ [
+ [_Backpacks_All,[2,0]],
+ [_Food_All,[2,1]],
+ [_Drink,[2,1]],
+ [_BeltItems,[0,1]],
+ [_OtherItems,[0,1]],
+ [_Medical,[0,1]],
+ [_Gems,[0,1]],
+ [_Explosives,[0,1]],
+ [_Grenades_ALL,[0,3]],
+ [_Rifle_ALL,[1,3]],
+ [_Ammo_ALL,[1,3]],
+ [_Shell_ALL,[0,3]],
+ [_WeaponAttachments_Optics,[0,2]],
+ [_WeaponAttachments_Muzzle,[0,2]],
+ [_WeaponAttachments_Other,[0,2]],
+ [_BuildingKits,[1,4]],
+ [_BuildingComponents,[1,5]],
+ [_CraftingTools,[0,2]],
+ [_CraftingComponents,[0,1]],
+ ["FAK",[1,3]]
+ ];
+ };
+ case 6:{
+ [
+ [_Backpacks_All,[2,0]],
+ [_Food_All,[2,1]],
+ [_Drink,[2,1]],
+ [_BeltItems,[0,1]],
+ [_OtherItems,[0,1]],
+ [_Medical,[0,1]],
+ [_Gems,[0,1]],
+ [_Explosives,[0,1]],
+ [_Grenades_ALL,[0,3]],
+ [_Rifle_ALL,[1,3]],
+ [_Ammo_ALL,[1,3]],
+ [_Shell_ALL,[0,3]],
+ [_WeaponAttachments_Optics,[0,2]],
+ [_WeaponAttachments_Muzzle,[0,2]],
+ [_WeaponAttachments_Other,[0,2]],
+ [_BuildingKits,[1,4]],
+ [_BuildingComponents,[1,5]],
+ [_CraftingTools,[0,2]],
+ [_CraftingComponents,[0,1]],
+ ["FAK",[1,3]]
+ ];
+ };
+ case 7:{
+ [
+ [_Backpacks_All,[2,0]],
+ [_Food_All,[2,1]],
+ [_Drink,[2,1]],
+ [_BeltItems,[0,1]],
+ [_OtherItems,[0,1]],
+ [_Medical,[0,1]],
+ [_Gems,[0,1]],
+ [_Explosives,[0,1]],
+ [_Grenades_ALL,[0,3]],
+ [_Rifle_ALL,[1,3]],
+ [_Ammo_ALL,[1,3]],
+ [_Shell_ALL,[0,3]],
+ [_WeaponAttachments_Optics,[0,2]],
+ [_WeaponAttachments_Muzzle,[0,2]],
+ [_WeaponAttachments_Other,[0,2]],
+ [_BuildingKits,[1,4]],
+ [_BuildingComponents,[1,5]],
+ [_CraftingTools,[0,2]],
+ [_CraftingComponents,[0,1]],
+ ["FAK",[1,3]]
+ ];
+ };
+ case 8:{
+ [
+ [_Backpacks_All,[2,0]],
+ [_Food_All,[2,1]],
+ [_Drink,[2,1]],
+ [_BeltItems,[0,1]],
+ [_OtherItems,[0,1]],
+ [_Medical,[0,1]],
+ [_Gems,[0,1]],
+ [_Explosives,[0,1]],
+ [_Grenades_ALL,[0,3]],
+ [_Rifle_ALL,[1,3]],
+ [_Ammo_ALL,[1,3]],
+ [_Shell_ALL,[0,3]],
+ [_WeaponAttachments_Optics,[0,2]],
+ [_WeaponAttachments_Muzzle,[0,2]],
+ [_WeaponAttachments_Other,[0,2]],
+ [_BuildingKits,[1,4]],
+ [_BuildingComponents,[1,5]],
+ [_CraftingTools,[0,2]],
+ [_CraftingComponents,[0,1]],
+ ["FAK",[1,3]]
+ ];
+ };
+ case 9:{
+ [
+ [_Backpacks_All,[2,0]],
+ [_Food_All,[2,1]],
+ [_Drink,[2,1]],
+ [_BeltItems,[0,1]],
+ [_OtherItems,[0,1]],
+ [_Medical,[0,1]],
+ [_Gems,[0,1]],
+ [_Explosives,[0,1]],
+ [_Grenades_ALL,[0,3]],
+ [_Rifle_ALL,[1,3]],
+ [_Ammo_ALL,[1,3]],
+ [_Shell_ALL,[0,3]],
+ [_WeaponAttachments_Optics,[0,2]],
+ [_WeaponAttachments_Muzzle,[0,2]],
+ [_WeaponAttachments_Other,[0,2]],
+ [_BuildingKits,[1,4]],
+ [_BuildingComponents,[1,5]],
+ [_CraftingTools,[0,2]],
+ [_CraftingComponents,[0,1]],
+ ["FAK",[1,3]]
+ ];
+ };
+ case 10:{
+ [
+ [_Backpacks_All,[2,0]],
+ [_Food_All,[2,1]],
+ [_Drink,[2,1]],
+ [_BeltItems,[0,1]],
+ [_OtherItems,[0,1]],
+ [_Medical,[0,1]],
+ [_Gems,[0,1]],
+ [_Explosives,[0,1]],
+ [_Grenades_ALL,[0,3]],
+ [_Rifle_ALL,[1,3]],
+ [_Ammo_ALL,[1,3]],
+ [_Shell_ALL,[0,3]],
+ [_WeaponAttachments_Optics,[0,2]],
+ [_WeaponAttachments_Muzzle,[0,2]],
+ [_WeaponAttachments_Other,[0,2]],
+ [_BuildingKits,[1,4]],
+ [_BuildingComponents,[1,5]],
+ [_CraftingTools,[0,2]],
+ [_CraftingComponents,[0,1]],
+ ["FAK",[1,3]]
+ ];
+ };
+};
+
+{
+ _objArr = _x select 0;
+ _countarr = _x select 1;
+ _min = _countarr select 0;
+ _add = round (random (_countarr select 1));
+ if (_objArr isequaltype "") then {
+ _crate additemcargoGlobal [_objArr, _min + _add];
+ }
+ else {
+ for "_i" from 1 to (_min + _add) do {
+ _item = selectrandom _objArr;
+ _objArr = _objArr - [_item];
+ if (_item isequaltype []) then {
+ _crate addWeaponCargoGlobal [(_item select 0), 1];
+ _crate addMagazineCargoGlobal [(_item select 1), 2];
+ }
+ else {
+ if (_item iskindof "Bag_Base") then {
+ _crate addbackpackcargoGlobal [_item,1];
+ }
+ else {
+ _crate additemcargoGlobal [_item, 1];
+ };
+ };
+ };
+ };
+} foreach _out;
+
diff --git a/sem/scripts/fn_createComposition.sqf b/sem/scripts/fn_createComposition.sqf
new file mode 100644
index 0000000..6c00e3d
--- /dev/null
+++ b/sem/scripts/fn_createComposition.sqf
@@ -0,0 +1,101 @@
+/*
+ Update 27.03.2017
+ By [Ignatz] He-Man
+*/
+
+_script = _this select 0;
+_azi = _this select 1;
+_pos = _this select 2;
+
+_objs = [];
+_objs = call (compile (preprocessFileLineNumbers format [SEM_staticMissionsPath + "compositions\%1.sqf",_script]));
+private ["_posX", "_posY"];
+
+_anchorBldg = _objs select 0;
+_xShift = (_anchorBldg select 1) select 0;
+_yShift = (_anchorBldg select 1) select 1;
+_zShift = (_anchorBldg select 1) select 2;
+{
+ (_x select 1) set [0,((_x select 1 select 0) - _xShift)];
+ (_x select 1) set [1,((_x select 1 select 1) - _yShift)];
+ (_x select 1) set [2,(_x select 1 select 2)];
+} forEach _objs;
+
+_posX = _pos select 0;
+_posY = _pos select 1;
+_newObjs = [];
+private ["_multiplyMatrixFunc"];
+_multiplyMatrixFunc =
+{
+ private ["_array1", "_array2", "_result"];
+ _array1 = _this select 0;
+ _array2 = _this select 1;
+ _result =
+ [
+ (((_array1 select 0) select 0) * (_array2 select 0)) + (((_array1 select 0) select 1) * (_array2 select 1)),
+ (((_array1 select 1) select 0) * (_array2 select 0)) + (((_array1 select 1) select 1) * (_array2 select 1))
+ ];
+ _result
+};
+for "_i" from 0 to ((count _objs) - 1) do
+{
+ private ["_obj", "_type", "_relPos", "_azimuth", "_fuel", "_damage", "_newObj"];
+ _obj = _objs select _i;
+ _type = _obj select 0;
+ _relPos = _obj select 1;
+ _azimuth = _obj select 2;
+
+ private ["_rotMatrix", "_newRelPos", "_newPos"];
+ _rotMatrix =[[cos _azi, sin _azi],[-(sin _azi), cos _azi]];
+ _newRelPos = [_rotMatrix, _relPos] call _multiplyMatrixFunc;
+ private ["_z"];
+ if ((count _relPos) > 2) then {
+ _z = _relPos select 2
+ }
+ else {
+ _z = 0
+ };
+ _newPos = [_posX + (_newRelPos select 0), _posY + (_newRelPos select 1), _z];
+ _newObj = createVehicle [_type, _newPos, [], 0, "CAN_COLLIDE"];
+ _newObj setDir (_azi + _azimuth);
+ if (surfaceiswater _newPos) then {
+ _newObj setPosASL _newPos;
+ }
+ else {
+ _newObj setPosATL _newPos;
+ };
+ _newObj allowdamage false;
+ if !(_type in ["Box_NATO_AmmoVeh_F","Land_MetalCase_01_large_F"]) then {
+ if !(_newObj iskindof "house") then {
+ _newObj enablesimulationglobal false;
+ };
+ };
+
+ if (count _obj > 3) then {
+ if (typename (_obj select 3) == "ARRAY") then {
+// _newObj setvectordirandup (_obj select 3);
+ };
+ if (typename (_obj select 3) == "STRING") then {
+ _newObj call compile format ["%1",(_obj select 3)];
+ };
+ if (typename (_obj select 3) == "SCALAR") then {
+ _newObj setFuel (_obj select 3);
+ };
+ };
+ if (count _obj > 4) then {
+ if (typename (_obj select 4) == "STRING") then {
+ _newObj call compile format ["%1",(_obj select 4)];
+ };
+ if (typename (_obj select 4) == "SCALAR") then {
+ _newObj setDamage (_obj select 4);
+ };
+ };
+ if (count _obj > 5) then {
+ if (typename (_obj select 5) == "STRING") then {
+ _newObj call compile format ["%1",(_obj select 5)];
+ };
+ };
+ _newObjs pushBack _newObj;
+};
+
+_newObjs
diff --git a/sem/scripts/fn_emptyGear.sqf b/sem/scripts/fn_emptyGear.sqf
new file mode 100644
index 0000000..07ed087
--- /dev/null
+++ b/sem/scripts/fn_emptyGear.sqf
@@ -0,0 +1,4 @@
+clearItemCargoGlobal _this;
+clearWeaponCargoGlobal _this;
+clearMagazineCargoGlobal _this;
+clearBackPackCargoGlobal _this;
\ No newline at end of file
diff --git a/sem/scripts/fn_endCondition.sqf b/sem/scripts/fn_endCondition.sqf
new file mode 100644
index 0000000..de170d5
--- /dev/null
+++ b/sem/scripts/fn_endCondition.sqf
@@ -0,0 +1,69 @@
+/*
+ EMS Mission end condition
+
+ _return = [_pos,_units,_start,_timeout,[_obj1,_obj2,_obj3]]call SEM_fnc_endCondition;
+
+ Returns:
+ 0 = false (default when no condition is met)
+ 1 = time is up and no player is nearby
+ 2 = All objects (vehicles) are destroyed
+ 3 = AI is dead
+
+*/
+private["_pos","_units","_start","_timeOut","_missionID","_objects","_return","_playerPresent"];
+
+_pos = _this select 0;
+_units = _this select 1;
+_start = _this select 2;
+_timeOut = _this select 3;
+_missionID = _this select 4;
+if (count _this > 5) then {
+ _objects = _this select 5
+}
+else {
+ _objects = []
+};
+
+
+_return = 0;
+_playerPresent = false;
+
+if (_timeOut > 0) then { //Mission time out possible
+ if (time - _start > _timeOut) then { //Time is up
+ /* Check for players in the area */
+ {
+ uisleep 0.1;
+ if(isPlayer _x && _x distance _pos < (500 max SEM_AIsniperDamageDistance)) exitwith {
+ _playerPresent = true
+ };
+ } forEach (if(isMultiplayer)then[{allplayers},{allUnits}]);
+ if (!_playerPresent) then {_return = 1};
+ };
+};
+
+if (_return < 1 && count _objects > 0) then {
+ if ({alive _x}count _objects == 0) then {
+ _return = 2
+ };
+};
+
+if (_return < 2) then {
+ if({alive _x} count _units < 1)then{
+ _return = 3
+ };
+};
+
+if (_return < 3) then{
+ {
+ if(_x isKindOf "Car" || _x isKindOf "tank")then{
+ _y = _x;
+ {
+ if(isPlayer _x && alive _x) exitWith {
+ _return = 3
+ }
+ } count crew _y;
+ };
+ }forEach _objects;
+};
+
+_return
diff --git a/sem/scripts/fn_findMissionPos.sqf b/sem/scripts/fn_findMissionPos.sqf
new file mode 100644
index 0000000..b1840be
--- /dev/null
+++ b/sem/scripts/fn_findMissionPos.sqf
@@ -0,0 +1,64 @@
+/* KiloSwiss */
+private["_defaultCenterPos","_worldsize","_worldRadius","_worldCenterPos","_blockPos","_searchDist","_searchRadius","_blockRadius","_found","_dir","_posX","_posY","_searchPos","_newPos"];
+
+_defaultCenterPos = getArray(configFile >> "CfgWorlds" >> worldName >> "centerPosition");
+
+_worldsize = SEM_worldData select 0;
+_worldCenterPos = SEM_worldData select 1;
+
+_worldRadius = (1500 max ((_worldsize*0.9)/2));
+_searchRadius = (150 max (_worldRadius/5) min 300);
+_blockRadius = (500 max (_worldRadius/3) min 1200);
+
+
+while{count SEM_lastMissionPositions > 5}do{SEM_lastMissionPositions deleteAt 0};
+if(SEM_debug in ["log","full"])then{diag_log format["#SEM DEBUG: previous mission pos: %1 %2",count SEM_lastMissionPositions, SEM_lastMissionPositions]};
+
+_blockPos = [];
+{_blockPos pushBack _x}forEach SEM_lastMissionPositions;
+{_blockPos pushBack (getMarkerPos _x)}forEach SEM_blockMarker;
+{_blockPos pushBack _x}forEach SEM_blockPos;
+
+_found = false;
+while{!_found}do{
+ uisleep 0.5;
+
+ /* Randomize the search area */
+ _dir = random 360;
+ _searchDist = (_searchRadius max (random _worldRadius) min (_worldRadius - _searchRadius));
+ _posX = (_worldCenterPos select 0) + sin(_dir) * _searchDist;
+ _posY = (_worldCenterPos select 1) + cos(_dir) * _searchDist;
+ _searchPos = [_posX, _posY, 0];
+ /* Get a position using "BIS_fnc_findSafePos" */
+ _newPos = [_searchPos,0,_searchRadius,45,0,0.5,0] call BIS_fnc_findSafePos;
+ /* Let's suppose this position is ready to spawn a mission on it */
+ _found = true;
+
+ /* Now check this position */
+ if(_newPos isEqualTo _defaultCenterPos)then{_found = false};
+
+ if(_found)then{ /* Check it again */
+ {if(_x distance _newPos < _blockRadius)exitWith{_found = false}}forEach _blockPos;
+
+ if(_found)then{ /* And again */
+ for "_i" from 0 to 300 step 60 do{ _dir = _i;
+ _posX = (_newPos select 0) + sin (_dir) * 40;
+ _posY = (_newPos select 1) + cos (_dir) * 40;
+ if(surfaceIsWater [_posX, _posY])exitWith{_found = false};
+ };
+
+ if(_found)then{ /* And do a last check */
+ {if(isPlayer _x)then[{if(_x distance _newPos < _blockRadius)exitWith{_found = false}},{UIsleep .05}]}forEach (if(isMultiplayer)then[{allplayers},{allUnits}]);
+ };
+ if(_found) then {
+ _plotpoles = nearestobjects [_newPos, ["PlotPole_EPOCH"],_blockRadius];
+ if !(_plotpoles isequalto []) exitwith {
+ _found = false;
+ };
+ };
+ };
+ };
+};
+_newPos set [2,0];
+
+_newPos;
diff --git a/sem/scripts/fn_getWorldData.sqf b/sem/scripts/fn_getWorldData.sqf
new file mode 100644
index 0000000..29a938a
--- /dev/null
+++ b/sem/scripts/fn_getWorldData.sqf
@@ -0,0 +1,84 @@
+private["_mapSize","_mapCenter","_worldData","_locations"];
+/*
+ _return = [] call SEM_fnc_getWorldData;
+
+ Returns the following:
+ _return select 0 = World size
+ _return select 1 = World center position
+ _return select 2 = Locations
+
+
+ 06.02.2015 by KiloSwiss
+*/
+
+_mapSize = getNumber(configFile >> "CfgWorlds" >> worldName >> "MapSize");
+if(_mapSize > 0)then{
+ _worldData = [_mapSize, [(_mapSize/2), (_mapSize/2), 0]];
+ if(SEM_debug in ["log","full"])then{diag_log format["#SEM DEBUG: WorldData get MapSize (%1) for island %2 from config", _mapSize, str worldName]};
+}else{
+ if((getMarkerPos "center" select 0) > (getArray(configFile >> "CfgWorlds" >> worldName >> "centerPosition") select 0))then[{
+ _mapSize = (getMarkerPos "center" select 0) * 2;
+ _mapCenter = getMarkerPos "center";
+ _worldData = [_mapSize, _mapCenter];
+ if(SEM_debug in ["log","full"])then{diag_log format["#SEM DEBUG: WorldData get MapSize (%1) for island %2 from center Marker", _mapSize, str worldName]};
+ },{
+ _mapCenter = getArray(configFile >> "CfgWorlds" >> worldName >> "centerPosition");
+ _mapCenter set [2,0];
+ _mapSize = (_mapCenter select 0) * 2;
+ _worldData =[_mapSize, _mapCenter];
+ if(SEM_debug in ["log","full"])then{diag_log format["#SEM DEBUG: WorldData get MapSize (%1) for island %2 from default center position", _worldData select 0, str worldName]};
+ }];
+};
+
+
+_locations = nearestLocations [_worldData select 1, ["NameCityCapital","NameCity","NameVillage","NameLocal","CityCenter","Airport"], ((_worldData select 0)/2)];
+
+//_locations = (configfile >> "CfgWorlds" >> worldName >> "Names") call BIS_fnc_returnChildren;
+
+_worldData pushBack _locations;
+
+_worldData
+
+/* To check size on different islands, use this code:
+private["_worldRadius","_worldCenterPos","_marker"];
+deleteMarkerLocal "Center";
+_worldRadius = (getNumber(configFile >> "CfgWorlds" >> worldName >> "MapSize")/2);
+_worldCenterPos = [ _worldRadius, _worldRadius, 0];
+_marker = createMarkerLocal ["Center", _worldCenterPos];
+_marker setMarkerPosLocal _worldCenterPos;
+_marker setMarkerShapeLocal "ELLIPSE";
+_marker setMarkerSizeLocal [_worldRadius, _worldRadius];
+_marker setMarkerColorLocal "ColorBlack";
+_marker setMarkerAlphaLocal 0.5;
+_marker setMarkerBrushLocal "SolidFull";
+copytoClipboard format["%1 / %2 / %3", toLower worldName, _worldRadius*2, _worldCenterPos];
+hint format["Copy to clipboard\nUse %4 to paste this information:\n\nWorldName: %1\nSize: %2\nCenter: %3", worldName, _worldRadius*2, _worldCenterPos, str (ctrl+v)];
+*/
+
+/* To create coloured markers on all found locations use:
+_worldRadius = (getNumber(configFile >> "CfgWorlds" >> worldName >> "MapSize")/2);
+_worldCenterPos = [ _worldRadius, _worldRadius, 0];
+_allLocations = nearestLocations [_centerPos, ["NameCityCapital","NameCity","NameVillage","NameLocal","CityCenter","Airport","NameMarine","Strategic","ViewPoint","RockArea","StrongpointArea","FlatArea","FlatAreaCity","FlatAreaCitySmall"], _worldRadius * 2];
+{ private ["_marker","_markerName","_marker2","_markerName2"];
+_markerName = format["Marker_%1", _forEachIndex];
+deleteMarkerLocal _markerName;
+_marker = createMarkerLocal [_markerName, position _x];
+_marker setMarkerShapeLocal "ELLIPSE";
+_marker setMarkerSizeLocal [size _x select 0, size _x select 1];
+_marker setMarkerTextLocal format["%1 %2", _forEachIndex, type _x];
+
+if ((type _x) in ["NameCityCapital","NameCity","NameVillage","NameLocal","CityCenter","Airport"])then{ _marker setMarkerColorLocal "ColorWhite"; };
+if ((type _x) in ["NameMarine"])then{ _marker setMarkerColorLocal "ColorBlue"; };
+if ((type _x) in ["Strategic","StrongpointArea"])then{ _marker setMarkerColorLocal "ColorOrange"; };
+if ((type _x) in ["ViewPoint","RockArea"])then{ _marker setMarkerColorLocal "ColorGreen"; };
+if ((type _x) in ["FlatArea"])then{ _marker setMarkerColorLocal "ColorRed"; };
+if ((type _x) in ["FlatAreaCity","FlatAreaCitySmall"])then{ _marker setMarkerColorLocal "ColorYellow"; };
+
+_markerName2 = format["#Marker_%1", _forEachIndex];
+deleteMarkerLocal _markerName2;
+_marker2 = createMarkerLocal [_markerName2, position _x];
+_marker2 setMarkerTypeLocal "mil_dot";
+_marker2 setMarkerTextLocal format["%1 %2", _forEachIndex, type _x];
+_marker2 setMarkerColorLocal "ColorBlack";
+}forEach _allLocations;
+*/
\ No newline at end of file
diff --git a/sem/scripts/fn_missionCleanup.sqf b/sem/scripts/fn_missionCleanup.sqf
new file mode 100644
index 0000000..549a871
--- /dev/null
+++ b/sem/scripts/fn_missionCleanup.sqf
@@ -0,0 +1,32 @@
+ /* KiloSwiss */
+_this spawn {
+ private ["_pos","_objs","_sGren"];
+ _pos = _this select 0;
+ _objs = _this select 1;
+
+ uisleep (SEM_MissionCleanup *60);
+
+ for "_i" from 30 to 360 step 30 do {
+ private ["_dist","_posX","_posY","_sGren"];
+ _dist = (10+(random 15));
+ _posX = (_pos select 0) + sin (_i) * _dist;
+ _posY = (_pos select 1) + cos (_i) * _dist;
+ _sGren = createVehicle["SmokeShellOrange", [_posX,_posY,-.1], [], 0, "CAN_COLLIDE"];
+ _objs pushBack _sGren;
+ };
+ sleep 30;
+ {
+ if (!isnull _x) then {
+ if (_x isKindOf "Man") then {
+ removeFromRemainsCollector [_x];
+ deletevehicle _x;
+ }
+ else {
+ if (_x distance _pos < 250) then {
+ deleteVehicle _x
+ };
+ };
+ uisleep 0.1;
+ };
+ } forEach _objs;
+};
\ No newline at end of file
diff --git a/sem/scripts/fn_missionController.sqf b/sem/scripts/fn_missionController.sqf
new file mode 100644
index 0000000..ba3190d
--- /dev/null
+++ b/sem/scripts/fn_missionController.sqf
@@ -0,0 +1,115 @@
+private["_this","_x","_forEachIndex"];
+
+
+{
+ [_x,_forEachIndex] spawn {
+ private["_missionsArr","_missionPath","_missionType","_lastMission","_playerOnline","_minPlayers","_randomMission","_runningMission","_runningMissionID","_missionStart","_missionTime","_missionPos","_markerPos"];
+ _missionsArr = _this select 0 select 0;
+ _missionPath = _this select 0 select 1;
+ _missionType = _this select 0 select 2;
+ _minPlayers = ( switch(_missionType)do{
+ case "static": {SEM_MinPlayerStatic};
+ case "dynamic": {SEM_MinPlayerDynamic};
+ default {1};
+ });
+
+
+ for "_i" from 0 to (count _missionsArr -1) step 1 do{ // Remove inactive missions
+ if((_missionsArr select _i) select 3 < 1)then[{_missionsArr set [_i, "delete"]},{
+ if(((_missionsArr select _i) select 2) > 0)then{
+ (_missionsArr select _i) set [2, (((_missionsArr select _i) select 2) * 60)];
+ };
+ (_missionsArr select _i) set [3, 1 max ((_missionsArr select _i) select 3) min 100];
+ }];
+ }; _missionsArr = _missionsArr - ["delete"];
+
+ if(SEM_debug isEqualTo "full")then{
+ {
+ _x set [2, (10*60)]
+ }forEach _missionsArr
+ }; // Set mission time out to 10
+
+ _lastMission = "";
+ while {true} do {
+ _playerOnline = playersNumber civilian;
+ if (SEM_debug in ["log","full"]) then {
+ diag_log format["#SEM DEBUG: Online players: %1", playersNumber civilian]
+ };
+ if (_playerOnline < _minPlayers || _playerOnline > SEM_MaxPlayers) then {
+ diag_log format ["#SEM: Waiting for players (%1/%2) to start %3 Missions", _playerOnline, _minPlayers, _missionType];
+ waitUntil {
+ uisleep 5;
+ if(playersNumber civilian != _playerOnline) then {
+ _playerOnline = playersNumber civilian;
+ diag_log format ["#SEM: Waiting for players (%1/%2) to start %3 Missions", _playerOnline, _minPlayers, _missionType];
+ };
+ (_playerOnline >= _minPlayers && _playerOnline <= SEM_MaxPlayers)
+ };
+ diag_log format ["#SEM: Online players: (%1/%2) - Starting next %3 Mission", _playerOnline, _minPlayers, _missionType];
+ };
+
+ _start = time;
+ if (SEM_debug isEqualTo "full") then {
+ uisleep 10
+ }
+ else {
+ if (!isnil "SEM_TimerStart") then {
+ _wait = SEM_TimerStart*60;
+ waitUntil {uisleep 1; (time - _start) >= _wait};
+ SEM_TimerStart = nil;
+ }
+ else {
+ _wait = SEM_MissionTimerMin*60 + random(SEM_MissionTimerMax*60-SEM_MissionTimerMin*60);
+ waitUntil {uisleep 1; (time - _start) >= _wait};
+ }
+ };
+
+ _randomMission = [_missionsArr, _lastMission] call SEM_fnc_selectMission;
+ _lastMission = _randomMission select 0;
+
+ if (_missionType == "static")then{
+ _missionPos = [] call SEM_fnc_findMissionPos;
+ SEM_lastMissionPositions pushBack _missionPos
+ };
+ if (_missionType == "dynamic") then {
+ _missionPos = [] call SEM_fnc_convoyRoute;
+ {
+ SEM_lastMissionPositions pushBack _x
+ } forEach _missionPos
+ };
+
+ SEM_MissionID = SEM_MissionID + 1;
+ _runningMissionID = SEM_MissionID;
+ _runningMission = [_missionPos, _randomMission, _runningMissionID, _missionType] execVM format["%1%2.sqf", _missionPath, _randomMission select 0];
+ _missionStart = time;
+
+ diag_log format ["#SEM: Start %1 mission %2: %3 %4.", _missionType, _runningMissionID, str(_randomMission select 1),
+ if (_missionType == "static") then {
+ "at position " + str(_missionPos)
+ }
+ else {
+ "from position " + str(_missionPos select 0) + " to " + str(_missionPos select 1)
+ }
+ ];
+
+ if (_missionType == "static") then {
+ _markerPos = _missionPos call SEM_fnc_randomPos
+ }
+ else {
+ _markerPos = _missionPos select 0
+ };
+ SEM_globalMissionMarker = [true,_markerPos,_runningMissionID,_randomMission select 1, _randomMission select 4, _missionType];
+ SEM_globalMissionMarker call SEM_createMissionMarker;
+
+ waitUntil {uisleep 1; scriptDone _runningMission};
+ _missionTime = (time - _missionStart);
+ diag_log format["#SEM: Finished %1 mission %2: %3 after %4.", _missionType, _runningMissionID, str(_randomMission select 1), str(floor (_missionTime/60)) + "m " + str(_missionTime-(floor(_missionTime/60)*60)) + "s"];
+ };
+ };
+ if (SEM_debug isEqualTo "full") then {
+ uisleep 10
+ }
+ else {
+ uisleep 180
+ };
+}forEach _this;
\ No newline at end of file
diff --git a/sem/scripts/fn_randomPos.sqf b/sem/scripts/fn_randomPos.sqf
new file mode 100644
index 0000000..91ff0ec
--- /dev/null
+++ b/sem/scripts/fn_randomPos.sqf
@@ -0,0 +1,12 @@
+/* KiloSwiss */
+private["_pos","_dir","_dist","_posX","_posY","_newPos"];
+
+_pos = _this;
+
+_dir = random 360;
+_dist = (100 + (random 200));
+_posX = (_pos select 0) + sin(_dir) * _dist;
+_posY = (_pos select 1) + cos(_dir) * _dist;
+_newPos = [_posX, _posY, 0];
+
+_newPos;
diff --git a/sem/scripts/fn_safeDetach.sqf b/sem/scripts/fn_safeDetach.sqf
new file mode 100644
index 0000000..ac150b3
--- /dev/null
+++ b/sem/scripts/fn_safeDetach.sqf
@@ -0,0 +1,26 @@
+ /* KiloSwiss */
+_this spawn { private ["_obj","_radius","_safePos","_smoke"];
+ _obj = _this;
+
+ _radius = 10;
+ waitUntil{ sleep .1;
+ _safePos = (getPos _obj) findEmptyPosition [0,_radius,(typeOf _obj)];
+ _radius = _radius + 5;
+ (count _safePos > 0)
+ };
+ detach _obj;
+ _safePos set [2,0];
+ _obj setPos _safePos;
+
+ if(sunOrMoon < 0.1)then[{ //Dark
+ for "_i" from 120 to 360 step 120 do{ private ["_posX","_posY","_dist"];
+ _dist = (3+(random 5));
+ _posX = (_safePos select 0) + sin (_i) * _dist;
+ _posY = (_safePos select 1) + cos (_i) * _dist;
+ "Chemlight_blue" createVehicle [_posX, _posY, 0];
+ };
+ },{ //Bright
+ _smoke = "SmokeShellBlue" createVehicle _safePos;
+ _smoke setPos _safePos;
+ }];
+};
\ No newline at end of file
diff --git a/sem/scripts/fn_saveVehicle.sqf b/sem/scripts/fn_saveVehicle.sqf
new file mode 100644
index 0000000..1dbb4c1
--- /dev/null
+++ b/sem/scripts/fn_saveVehicle.sqf
@@ -0,0 +1,18 @@
+ /* KiloSwiss */
+private["_veh","_pos","_fuel","_damage","_direction","_searchRadius","_spawnPos"];
+
+_veh = _this;
+
+if !(_veh getVariable ["SEM_vehicle",false])exitWith{{_x setDamage 1}count (crew _veh + [_veh])};
+if (_veh getVariable ["saveEH",0] >= 0)exitWith{};
+if (!SEM_permanentVehicles)exitWith{};
+/*
+EPOCH_VehicleSlotsLimit = EPOCH_VehicleSlotsLimit + 1;
+EPOCH_VehicleSlots pushBack str(EPOCH_VehicleSlotsLimit);
+EPOCH_VehicleSlots=EPOCH_VehicleSlots - [(EPOCH_VehicleSlots select 0)];
+EPOCH_VehicleSlotCount = count EPOCH_VehicleSlots;
+publicVariable "EPOCH_VehicleSlotCount";
+_veh setVariable ["VEHICLE_SLOT", (EPOCH_VehicleSlots select 0), true];
+*/
+ /* Save Vehicle */
+_veh call EPOCH_server_save_vehicle;
\ No newline at end of file
diff --git a/sem/scripts/fn_selectClosest.sqf b/sem/scripts/fn_selectClosest.sqf
new file mode 100644
index 0000000..28b46ec
--- /dev/null
+++ b/sem/scripts/fn_selectClosest.sqf
@@ -0,0 +1,21 @@
+private["_pos","_arr","_sorted","_return"];
+/*
+ Source: http://forums.bistudio.com/showthread.php?97602-Sort-Array-per-Distance
+ Edited by KiloSwiss to directly return the closest element in the array that is a player
+*/
+
+_pos = _this select 0;
+_arr = _this select 1;
+diag_log format["### Possible threads: %1", _arr];
+_sorted = [];
+{ private "_closest";
+ _closest = _arr select 0; diag_log format["### A: %1", _closest];
+ {if ((_x distance _pos) < (_closest distance _pos)) then {_closest = _x}} count _arr;
+ _sorted pushBack _closest;
+ _arr = _arr - [_closest];
+}forEach _arr;
+diag_log format["### B: %1", _sorted];
+_return = _sorted select 0;
+diag_log format["### C: %1", _return];
+
+_return
diff --git a/sem/scripts/fn_selectMission.sqf b/sem/scripts/fn_selectMission.sqf
new file mode 100644
index 0000000..afc442e
--- /dev/null
+++ b/sem/scripts/fn_selectMission.sqf
@@ -0,0 +1,20 @@
+private["_arr","_last","_ran","_sel"];
+/*
+ Source: http://forums.bistudio.com/showthread.php?97602-Sort-Array-per-Distance
+ Edited by KiloSwiss to select a random mission, accorded to their probability setting.
+*/
+
+
+_arr = _this select 0;
+_last = _this select 1;
+
+if(count _arr < 2)exitWith{_arr select 0};
+
+if(count _this > 2)then[{_ran = 1 max (_this select 2) min 100},{_ran = 1 max ceil(random 100);}];
+
+while{{_x select 3 >= _ran}count _arr == 0}do{_ran = _ran -1};
+
+_sel = _arr select random (count _arr -1);
+while{_sel select 3 < _ran || _sel select 0 == _last}do{_sel = _arr select random (count _arr -1)};
+
+_sel
diff --git a/sem/scripts/fn_spawnVehicle.sqf b/sem/scripts/fn_spawnVehicle.sqf
new file mode 100644
index 0000000..00c0848
--- /dev/null
+++ b/sem/scripts/fn_spawnVehicle.sqf
@@ -0,0 +1,50 @@
+ /* KiloSwiss */
+private["_veh","_pos","_fuel","_damage","_direction","_searchRadius","_spawnPos"];
+
+_veh = _this select 0;
+_pos = _this select 1; _pos set[2, 0];
+_fuel = if(count _this > 2)then[{_this select 2},{0.15 max (random .35)}];
+_damage = if(count _this > 3)then[{_this select 3},{0.35 max (random .75)}];
+_direction = if(count _this > 4)then[{_this select 4},{random 360}];
+
+_searchRadius = 0;
+waitUntil{
+ _spawnPos = _pos findEmptyPosition [0,_searchRadius,_veh];
+ _searchRadius = _searchRadius + 10;
+ (count _spawnPos > 0)
+};
+_veh = createVehicle[_veh, _spawnPos, [], 0, "NO_COLLIDE"];
+_veh setVariable ["BIS_enableRandomization", false];
+_veh allowDamage false;
+_veh setDir _direction;
+_veh setVectorUp (surfaceNormal (getPos _veh));
+
+_veh call SEM_fnc_emptyGear;
+_veh call EPOCH_server_setVToken;
+_veh call EPOCH_server_vehicleInit;
+_veh setVariable ["SEM_vehicle", true];
+
+_veh disableTIEquipment true;
+_veh lock 2;
+
+_veh setFuel _fuel;
+_veh setDamage _damage;
+_veh allowDamage true;
+
+_veh
+
+/*
+_config=(configFile >> "CfgVehicles" >> _vehClass >> "availableColors");
+if(isArray(_config))then{_textureSelectionIndex=configFile >> "CfgVehicles" >> _vehClass >> "textureSelectionIndex";
+_selections=if(isArray(_textureSelectionIndex))then{getArray(_textureSelectionIndex)}else{[0]};
+_colors=getArray(_config);
+_textures=_colors select 0;
+_color=floor(random(count _textures));
+_count=(count _colors)-1;
+{if(_count >=_forEachIndex)then{_textures=_colors select _forEachIndex;
+};
+_veh setObjectTextureGlobal[_x,(_textures select _color)];
+}forEach _selections;
+_veh setVariable["VEHICLE_TEXTURE",_color];
+};
+*/
diff --git a/sem/scripts/fn_vehicleUnlock.sqf b/sem/scripts/fn_vehicleUnlock.sqf
new file mode 100644
index 0000000..2df4e98
--- /dev/null
+++ b/sem/scripts/fn_vehicleUnlock.sqf
@@ -0,0 +1,35 @@
+ /* KiloSwiss */
+private["_veh","_saveEH"];
+
+_veh = _this;
+
+if(SEM_permanentVehicles)then[{
+
+ if({isPlayer _x}count (crew _veh) > 0)exitWith{
+ _veh setVariable ["saveEH",-1];
+ _veh call SEM_fnc_saveVehicle;
+ };
+
+ _saveEH = _veh addEventHandler ["getIn", {
+ if(isPlayer (_this select 2))then{
+ (_this select 0) removeEventHandler ["getIn", ((_this select 0) getVariable ["saveEH",0])];
+ (_this select 0) setVariable ["saveEH",-1];
+ (_this select 0) call SEM_fnc_saveVehicle;
+ };
+ }];
+ _veh setVariable ["saveEH",_saveEH];
+ _veh lock 0;
+
+ _veh spawn{ private ["_start","_vehicle"];
+ _vehicle = _this;
+ _start = time;
+ waitUntil{ sleep 30;
+ ((time - _start > 1800) || (_vehicle getVariable ["saveEH",0] < 0))
+ };
+ if((_vehicle getVariable ["saveEH",0]) >= 0)then{_vehicle setDamage 1};
+ };
+},{
+ _veh lock 0;
+}];
+
+true
diff --git a/sem/scripts/objectGrabber/objectGrabber.sqf b/sem/scripts/objectGrabber/objectGrabber.sqf
new file mode 100644
index 0000000..6f29fea
--- /dev/null
+++ b/sem/scripts/objectGrabber/objectGrabber.sqf
@@ -0,0 +1,57 @@
+scriptName "DynO\data\scripts\objectGrabber.sqf";
+/*
+ File: objectGrabber.sqf
+ Author: Joris-Jan van 't Land
+
+ Description:
+ Converts a set of placed objects to an object array for the DynO mapper.
+ Places this information in the debug output for processing.
+
+ Parameter(s):
+ _this select 0: position of the anchor point
+ _this select 1: size of the covered area
+
+ Returns:
+ Success flag (Boolean)
+*/
+
+//Validate parameter count
+if ((count _this) < 2) exitWith {debugLog "Log: [objectGrabber] Function requires at least 2 parameters!"; false};
+
+private ["_anchorPos", "_anchorDim"];
+_anchorPos = _this select 0;
+_anchorDim = _this select 1;
+
+//Validate parameters
+if ((typeName _anchorPos) != (typeName [])) exitWith {debugLog "Log: [objectGrabber] Anchor position (0) must be an Array!"; false};
+if ((typeName _anchorDim) != (typeName 0)) exitWith {debugLog "Log: [objectGrabber] Covered area size (1) must be an Number!"; false};
+
+private ["_objs"];
+_objs = nearestObjects [_anchorPos, ["All"], _anchorDim];
+
+for "_i" from 0 to ((count _objs) - 1) do
+{
+ private ["_obj", "_type"];
+ _obj = _objs select _i;
+
+ _type = typeOf _obj;
+
+ //Exclude human objects.
+ private ["_sim"];
+ _sim = getText (configFile >> "CfgVehicles" >> _type >> "simulation");
+ if !(_sim in ["soldier"]) then
+ {
+ private ["_objPos", "_dX", "_dY", "_z", "_azimuth", "_fuel", "_damage"];
+ _objPos = position _obj;
+ _dX = (_objPos select 0) - (_anchorPos select 0);
+ _dY = (_objPos select 1) - (_anchorPos select 1);
+ _z = _objPos select 2;
+ _azimuth = direction _obj;
+ _fuel = fuel _obj;
+ _damage = damage _obj;
+
+ diag_log (format ["Log: objectGrabber: %1", [_type, [_dX, _dY, _z], _azimuth, _fuel, _damage]]);
+ };
+};
+
+true
\ No newline at end of file
diff --git a/sem/sem_config.sqf b/sem/sem_config.sqf
new file mode 100644
index 0000000..1a265bf
--- /dev/null
+++ b/sem/sem_config.sqf
@@ -0,0 +1,124 @@
+/*
+ SEM - "Simple Epoch Missions" configuration file
+ By KiloSwiss
+*/
+/*
+ Update 27.03.2017
+ By [Ignatz] He-Man
+*/
+
+ /* Mission start/timer settings */
+
+SEM_MinPlayerStatic = 1; // Minimum number of online players for basic missions to spawn.
+SEM_MinPlayerDynamic = 1; // Minimum number of online players for additional/parallel running missions.
+SEM_MaxPlayers = 40;
+
+SEM_TimerStart = 5; // Minutes to start first Mission.
+
+SEM_MissionTimerMin = 10; // Minimum minutes between missions.
+SEM_MissionTimerMax = 20; // Maximum minutes between missions.
+
+/* Reward/punish settings */
+SEM_reward_AIkill = true; // Defines if players get some Krypto as reward for each AI they kill.
+SEM_punish_AIroadkill = true; // Defines if players should be punished for killing AI units by driving them over with cars.
+SEM_damage_AIroadkill = true; // Defines if the players car should be damaged when driving over an AI unit.
+SEM_Krypto_AIroadkill = 20; // How much Krypto will be removed by punishing players for AI roadkills.
+
+
+/* Advanced mission settings */
+
+// Minutes after a finished mission where all mission objects (including AI) will be deleted.
+SEM_MissionCleanup = 10; // 0 or -1 equals never.
+
+// Allow captured Vehicles do be permanent (saved to Database).
+SEM_permanentVehicles = false; // true or false
+
+// Chance of AI dropping their guns and keeping their gear (vests, backpacks and magazines) when killed.
+SEM_AIdropGearChance = 40; // Values: 0-100% Where 0 means all gear gets removed from dead AI units.
+
+// Disable Damage over a specific distance so players can't snipe the mission AI from safe distance.
+SEM_AIdisableSniperDamage = true; // Set to false to allow sniper damage from any distance.
+SEM_AIsniperDamageDistance = 700; // Max. distance (in meters) where AI takes damage (min. 300 - max. 1000).
+
+
+ /* ################# */ /* ################# */ /* ################# */
+ /* Advanced settings */ /* Advanced settings */ /* Advanced settings */
+ /* ################# */ /* ################# */ /* ################# */
+
+
+SEM_removeWeaponsFromDeadAI = []; // Weapons that should be removed from killed AI
+SEM_removeMagazinesFromDeadAI = []; // Magazines that should be removed from killed AI
+
+//Marker Names where mission spawning is blocked.
+SEM_blockMarker = [
+// "respawn_west"
+ ];
+SEM_blockPos = [
+ [6717,19562,25],
+ [19375,17620,25],
+ [13323,14500,25],
+ [9275,10857,25],
+ [19359,9696,25]
+ ];
+
+ /* Static Missions */
+SEM_staticMissionsPath = "sem\missionsStatic\";
+SEM_staticMissions = [
+ ["bSupplyCrash", "Supply Van", 45, 15, 2, false],
+ ["bPlaneCrash", "Plane Crashsite", 45, 15, 2, false],
+ ["bHeliCrash", "Heli Crashsite", 45, 15, 2, false],
+ ["bCamp_big", "Bandit Base", 60, 50, 3, false],
+ ["bCamp_small", "Bandit Camp", 70, 50, 3, false],
+ ["bDevice", "Strange Device", 45, 15, 2, false],
+ /* example */
+ ["file name", "marker name", -1, -1, 5, false] //NO COMMA AT THE LAST LINE!
+/* 1. 2. 3. 4. 5. 6.
+
+ 1. "file name" MUST be equal to the sqf file name!
+ 2. "marker name" Name of the mission marker.
+ 3. time out, (Number) Minutes until running mission times out (0 or -1 equals no mission time out).
+ 4. probability (Number) Percentage of probability how often a mission will spawn: 1 - 100 (0 and -1 equals OFF).
+ 5. danger level (Number) Color for the mission marker (0=white, 1=yellow, 2=orange, 3=red, 4=violet, 5=black)
+ 6. static/dynamic Use dynamic (true) for convoys and static (false) for stationary missions.
+*/];
+
+ /* Dynamic Missions */
+SEM_dynamicMissionsPath = "sem\missionsDynamic\";
+SEM_dynamicMissions = [
+ ["convoySupply", "Supply Convoy", 90, -1, 0, true],
+ ["convoyRepair", "Repair Convoy", 90, -1, 1, true],
+ ["convoyStrider", "Strider Convoy", 90, -1, 2, true],
+ ["convoyWeapon", "Weapon Convoy", 90, -1, 3, true] //NO COMMA AT THE LAST LINE!
+/* 1. 2. 3. 4. 5. 6.
+
+ 1. "file name" MUST be equal to the sqf file name!
+ 2. "marker name" Name of the mission marker.
+ 3. time out, (Number) Minutes until running mission times out (0 or -1 equals no mission time out).
+ 4. probability (Number) Percentage of probability how often a mission will spawn: 1 - 100 (0 and -1 equals OFF).
+ 5. danger level (Number) Colour for the mission marker (0=white, 1=yellow, 2=orange, 3=red, 4=violet, 5=black)
+ 6. static/dynamic Use dynamic (true) for convoys and static (false) for stationary missions.
+*/
+];
+
+
+SEM_debug = "off"; // Valid values: "off", "log" and "full" or 0, 1 and 2.
+/*Debug settings explained:
+
+ 0 or "off" = Debug is off
+ - This is the default setting.
+
+ 1 or "log" = Only additional logging is active.
+ - For debugging and proper error reports, please activate this!
+ - Any RPT submitted for bug reports with debug off will be ignored!
+
+ 2 or "full" = Many settings are changed + additional logging is active.
+ - Missions time out after 10min.
+ - Minimum players is set to 0 (for both static and dynamic missions).
+ - Time between missions is 30sec.
+ - Mission clean up happens after 2min.
+ - AI only takes damage from below 100m.
+ - More events and additional data is logged to the .rpt.
+*/
+
+/* DO NOT EDIT BELOW THIS LINE */
+/**/SEM_config_loaded = true;/**/
\ No newline at end of file