From 1024b0d66409d0e2cc5018ab7a16648b37fcc602 Mon Sep 17 00:00:00 2001 From: Ghostrider-DbD- Date: Thu, 22 Dec 2016 20:02:19 -0500 Subject: [PATCH] Added ability to run multiple instances of a mission. --- @epochhive/addons/custom_server.pbo | Bin 0 -> 479498 bytes .../CustomMarkers/CustomMarkers_Epoch.sqf | 44 ++ .../CustomMarkers/CustomMarkers_Exile.sqf | 18 + .../CustomMarkers/CustomMarkers_Exile.sqf.bak | 18 + .../CustomMarkers/GMS_fnc_addCustomMarker.sqf | 20 + .../CustomMarkers/init_CustomMarkers.sqf | 31 ++ .../CustomMarkers/init_CustomMarkers.sqf.bak | 31 ++ .../Functions/GMS_fnc_GroupsOnAISide.sqf | 15 + .../Functions/GMS_fnc_cleanEmptyGroups.sqf | 4 +- .../Compiles/Functions/GMS_fnc_findWorld.sqf | 40 +- .../Compiles/Functions/GMS_fnc_getModType.sqf | 12 + .../Compiles/Functions/GMS_fnc_mainThread.sqf | 16 +- .../Compiles/Groups/GMS_fnc_spawnGroup.sqf | 88 ++-- .../Missions/GMS_fnc_addMIssionToQue.sqf | 4 +- .../GMS_fnc_missionSpawner - Copy.sqf | 461 ++++++++++++++++++ .../Missions/GMS_fnc_missionSpawner-debug.sqf | 459 +++++++++++++++++ .../Missions/GMS_fnc_missionSpawner.sqf | 99 ++-- .../Missions/GMS_fnc_updateMissionQue.sqf | 8 +- .../Compiles/TimeAccel/GMS_fnc_Time.sqf | 8 +- .../Compiles/Units/GMS_fnc_cleanupAliveAI.sqf | 2 +- .../Vehicles/GMS_fnc_spawnEmplaced.sqf | 5 +- .../Vehicles/GMS_fnc_spawnVehiclePatrol.sqf | 4 +- .../custom_server/Compiles/blck_functions.sqf | 7 +- .../custom_server/Compiles/blck_variables.sqf | 2 +- .../Configs/blck_configs_epoch.sqf | 10 - .../Configs/blck_configs_exile.sqf | 13 - @epochhive/addons/custom_server/changeLog.sqf | 8 + .../addons/custom_server/init/blck_init.sqf | 36 +- .../addons/custom_server/init/build.sqf | 4 +- 29 files changed, 1293 insertions(+), 174 deletions(-) create mode 100644 @epochhive/addons/custom_server.pbo create mode 100644 @epochhive/addons/custom_server/Compiles/CustomMarkers/CustomMarkers_Epoch.sqf create mode 100644 @epochhive/addons/custom_server/Compiles/CustomMarkers/CustomMarkers_Exile.sqf create mode 100644 @epochhive/addons/custom_server/Compiles/CustomMarkers/CustomMarkers_Exile.sqf.bak create mode 100644 @epochhive/addons/custom_server/Compiles/CustomMarkers/GMS_fnc_addCustomMarker.sqf create mode 100644 @epochhive/addons/custom_server/Compiles/CustomMarkers/init_CustomMarkers.sqf create mode 100644 @epochhive/addons/custom_server/Compiles/CustomMarkers/init_CustomMarkers.sqf.bak create mode 100644 @epochhive/addons/custom_server/Compiles/Functions/GMS_fnc_GroupsOnAISide.sqf create mode 100644 @epochhive/addons/custom_server/Compiles/Functions/GMS_fnc_getModType.sqf create mode 100644 @epochhive/addons/custom_server/Compiles/Missions/GMS_fnc_missionSpawner - Copy.sqf create mode 100644 @epochhive/addons/custom_server/Compiles/Missions/GMS_fnc_missionSpawner-debug.sqf diff --git a/@epochhive/addons/custom_server.pbo b/@epochhive/addons/custom_server.pbo new file mode 100644 index 0000000000000000000000000000000000000000..a98479914fb3334b9f0a2b14efcfca10b777817d GIT binary patch literal 479498 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 `ih%}P&TY68-Rg~mjfGz=yl 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 literal 0 HcmV?d00001 diff --git a/@epochhive/addons/custom_server/Compiles/CustomMarkers/CustomMarkers_Epoch.sqf b/@epochhive/addons/custom_server/Compiles/CustomMarkers/CustomMarkers_Epoch.sqf new file mode 100644 index 0000000..3cd267a --- /dev/null +++ b/@epochhive/addons/custom_server/Compiles/CustomMarkers/CustomMarkers_Epoch.sqf @@ -0,0 +1,44 @@ + +//blck_customMarkers = []; + +private _markers = [ + [31086.898,0,29440.51],"ServerRule","Server Rules:","mil_triangle","ColorRed"], + [[31143.064,0,28674.146],"ServerRule1","No PVP","mil_dot","ColorWhite"], + [[31136.533,0,27647.641],"ServerRule2","No THEFT from dead players, bases or unlocked vehicles.","mil_dot","ColorWhite"], + [[31129.488,0,25672.701],"ServerRule3","Don't go to players bases. Not to look, not hang around.","mil_dot","ColorWhite"], + [[31136.486,20.089996,26683.422],"ServerRule4","Racism, hacking, glitching, duping or theft will result in a ban.","mil_dot","ColorWhite"], + [[31137.244,5.0910034,24665.658],"ServerRule5","Please be respectful of other players and admins. What an Admin says is final.","mil_dot","ColorWhite"], + [[31140.377,28.001938,23660.883],"ServerRule6","Don't leave vehicles at the traders. These will be unlocked at restarts.","mil_dot","ColorWhite"], + [[93.216553,5.6385589e+013,-577.87292],"MissionsRule","Mission Rules:","mil_triangle","ColorRed"], + [[63.282959,5.6385589e+013,-1236.0565],"MissionRule1","Call missions in side chat and place a marker on the map with your name at the location of the mission you are headed to.","mil_dot","ColorWhite"], + [[58.716553,0,-2213.2051],"MissionRule2","You call the mission when you are on the way to it, not when you are going to do something else.","mil_dot","ColorWhite"], + [[52.185303,0,-3239.7109],"MissionRule3","Don't go to other players missions, you have nothing there to do.","mil_dot","ColorWhite"], + [[45.140381,0,-5214.6504],"MissionRule4","First to call out the mission owns it, thats includes AI gear and mission loot. (If you haven't marked and called it out, you will loose if someone do that.)","mil_dot","ColorWhite"]; + [[52.138428,0,-4203.9287],"MissionRule5","You/Your group can only call one mission at time.","mil_dot","ColorWhite"], + [[52.89624,0,-6221.6934],"MissionRule6","You don't need to call a out a mission if it is in the PVP zone. But if you are doing it from the outside of pvp zone, you will still be a target for PVP.","mil_dot","ColorWhite"], + [[56.029053,7.7267151,-7226.4678],"MissionRule7","Mission that spawns inside or if the mission marker touches the pvp marker will be marked as pvp.","mil_dot","ColorWhite"], + [[-12477.028,0,38781.328],"BuildingsRules","Buildings Rules:","mil_triangle","ColorRed"], + [[{-12420.862,0,38014.969],"BuildingsRules1","Do not build in pre-buildings.","mil_dot","ColorWhite"], + [[-12427.394,0,36988.461],"BuildingsRules2","Do not build on or so as to block roads.","mil_dot","ColorWhite"], + [[-12434.438,2.7021473e+037,35013.523],"BuildingsRules3","When you build, look around and see if your flag will effect any loot spawning. Your flag has a 150m radius, so to be on the safe side build at least 175-200m from loot spawns.","mil_dot","ColorWhite"], + [[-12427.44,0,36024.242],"BuildingsRules4","Do not build in or near high loot areas such as office buildings, airport hangers, or military installations. Flag poles block loot from spawning at these locations.","mil_dot","ColorWhite"], + [[-12426.683,0,34006.477]],"BuildingsRules5","Do not build and sniperbases near mafia places, stronghold. (They are not your personal mission.)","mil_dot","ColorWhite"], + [[-12423.55,0,33001.707,"BuildingsRules6","No air bases. Your base has to touch the ground.","mil_dot","ColorWhite"], + [[-12419.35,0,32066.854],"BuildingsRules7","Admin will delete bases that are breaking these rules, and you will get nothing back.","mil_dot","ColorWhite"], + [[24.283001,-4.3682598e-035,-8286.0889],"PVPZonesRule","PVP Zones Rules:","mil_triangle","ColorYellow"], + [[80.448997,5.0616355e+037,-9052.4521],"PVPZonesRule1","Any things goes.","mil_dot","ColorWhite"], + [[73.917999,-1.3038923e-012,-10078.958,"PVPZonesRule2","You can't be running around just outside the pvp zone and call pve if you get shoot, if you are there, you are a target.","mil_dot","ColorWhite"], + [[66.873001,-6.6600447e-037,-12053.896],"PVPZonesRule3","Mission that spawns inside or if the mission marker touches the pvp marker will be marked as pvp.","mil_dot","ColorWhite"], + [[73.871002,-7.911346e-021,-11043.177],"PVPZonesRule4","If anyone of your team/group is in the pvpzone and you are near it you will consider a legite target.","mil_dot","ColorWhite"], + [[-12857.771,4.3924521e+035,45162.469],,"Good to know:","mil_triangle","ColorOrange"], + [[-12801.605,0,44396.109],"GoodToKnow1","If you building or park your vehicles where missions spawns, be preper to login to a place where your vehicle are gone. As AI and player will have battles there.","mil_dot","ColorWhite"], + [[-12808.137,0,43369.598],"GoodToKnow2","ArmA is a glitchy game. Don't park vehicles on floors/roofs. It may work 1 server session but go boom the next. And they will not be replaced by Admins.","mil_dot","ColorWhite"], + [[12815.182,23135064,41394.66],"GoodToKnow3","What you do will effect your whole group. What your friends do will effect you. It's your job to look after your friends.","mil_dot","ColorWhite"], + [[-12808.184,0,42405.379],"GoodToKnow4","If you gone park your vehicle inside your base, make sure your base is big enough to hold them in there.","mil_dot",,"ColorWhite"], + [[-12833.245,-2.2216157e-031,40349.613],"GoodToKnow5","Use commen sense. Ask your self, would I like this happen too me?","mil_dot","ColorWhite"], + [[-12848.92,-1.4167476e-034,39791.008],"GoodToKnow6","ON EPOCH: Don't hord vehicles, 1 air, 2 land per player. Admin will delete them if think your breaking the limit.","mil_dot","ColorWhite"] +]; + +{ + _x call blck_fnc_addcustomMarker; +}forEach _markers; \ No newline at end of file diff --git a/@epochhive/addons/custom_server/Compiles/CustomMarkers/CustomMarkers_Exile.sqf b/@epochhive/addons/custom_server/Compiles/CustomMarkers/CustomMarkers_Exile.sqf new file mode 100644 index 0000000..c4cf243 --- /dev/null +++ b/@epochhive/addons/custom_server/Compiles/CustomMarkers/CustomMarkers_Exile.sqf @@ -0,0 +1,18 @@ + +blck_customMarkers = []; +blck_fnc_addCustomMarker = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\CustomMarkers\GMS_fnc_addCustomMarkers.sqf"; +if (!isServer) exitWith{}; +_modType = call blck_fnc_getModType; +if (_modType isEqualTo "Epoch") then +{ + [] execVM "\q\addons\custom_server\Compiles\CustomMarkers\CustomMarkers_Epoch.sqf"; +}; + +if (_modType isEqualTo "Exile") then +{ + [] execVM "\q\addons\custom_server\Compiles\CustomMarkers\CustomMarkers_Exile.sqf"; +}; + +{ + +}forEach blck_customMarkers; diff --git a/@epochhive/addons/custom_server/Compiles/CustomMarkers/CustomMarkers_Exile.sqf.bak b/@epochhive/addons/custom_server/Compiles/CustomMarkers/CustomMarkers_Exile.sqf.bak new file mode 100644 index 0000000..f65ae26 --- /dev/null +++ b/@epochhive/addons/custom_server/Compiles/CustomMarkers/CustomMarkers_Exile.sqf.bak @@ -0,0 +1,18 @@ + +blck_customMarkers = []; +blck_fnc_addCustomMarker = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\CustomMarkers\GMS_fnc_addCustomMarkers.sqf"; +if (!isServer) exitWith{}; +_modType = call blck_getModType; +if (_modType isEqualTo "Epoch") then +{ + [] execVM "\q\addons\custom_server\Compiles\CustomMarkers\CustomMarkers_Epoch.sqf"; +}; + +if (_modType isEqualTo "Exile") then +{ + [] execVM "\q\addons\custom_server\Compiles\CustomMarkers\CustomMarkers_Exile.sqf"; +}; + +{ + +}forEach blck_customMarkers; diff --git a/@epochhive/addons/custom_server/Compiles/CustomMarkers/GMS_fnc_addCustomMarker.sqf b/@epochhive/addons/custom_server/Compiles/CustomMarkers/GMS_fnc_addCustomMarker.sqf new file mode 100644 index 0000000..990a0c0 --- /dev/null +++ b/@epochhive/addons/custom_server/Compiles/CustomMarkers/GMS_fnc_addCustomMarker.sqf @@ -0,0 +1,20 @@ + +/* +GMS_fnc_addCustomMarker.sqf +adds a custom marker to the array of custom markers that should be shown. +*/ + +params["_marker"]; +_type = []; +if (typeName _marker select 3 isEqualTo "STRING") then {_type = [_marker select 3,[],""]}; +if (typeName _marker select 3 isEqualTo "ARRAY" and count (_marker select 3) isEqualTo 3) then {_type = _marker select 3}; +private _m = [format["cm%1%2",_marker select 0 select 0,_marker select 0 select 1],_marker select 0,_marker select 1,_marker select 2,"",_marker select 4,_type]; +diag_log format["customMarkers_Epoch.sqf:: _m = %1",_m]; +if !(_type isEqualTo []) then +{ + blck_customMarkers pushback _m; +}; + +true + + diff --git a/@epochhive/addons/custom_server/Compiles/CustomMarkers/init_CustomMarkers.sqf b/@epochhive/addons/custom_server/Compiles/CustomMarkers/init_CustomMarkers.sqf new file mode 100644 index 0000000..09f5bb9 --- /dev/null +++ b/@epochhive/addons/custom_server/Compiles/CustomMarkers/init_CustomMarkers.sqf @@ -0,0 +1,31 @@ +diag_log "-- >> Loading Custom Markers for blckeagls Mission System"; + +blck_customMarkers = []; +blck_fnc_addCustomMarker = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\CustomMarkers\GMS_fnc_addCustomMarker.sqf"; + +if (!isServer) exitWith{}; + +_modType = call blck_fnc_getModType; +if (_modType isEqualTo "Epoch") then +{ + [] execVM "\q\addons\custom_server\Compiles\CustomMarkers\CustomMarkers_Epoch.sqf"; +}; + +if (_modType isEqualTo "Exile") then +{ + //[] execVM "\q\addons\custom_server\Compiles\CustomMarkers\CustomMarkers_Exile.sqf"; +}; + +{ + /* + for spawnMarker.sqf parameters are: + _mArray params["_missionType","_markerPos","_markerLabel","_markerLabelType","_markerColor","_markerType"]; + _markerType params["_mShape","_mSize","_mBrush"]; + */ + // [31086.898,0,29440.51],"ServerRule","Server Rules:","mil_triangle","ColorRed"], + if (blck_debugON) then {diag_log format["[blckeagls] custom markers:: -- >> Adding marker %1",_x];}; + private _markerDefinitions = [_x select 1,_x select 0,_x select 2,"",_x select 4,_x select 3]; + [_markerDefinitions] execVM "debug\spawnMarker.sqf"; +}forEach blck_customMarkers; + +diag_log "[blckeagls] -- >> Custom Markers Loaded"; diff --git a/@epochhive/addons/custom_server/Compiles/CustomMarkers/init_CustomMarkers.sqf.bak b/@epochhive/addons/custom_server/Compiles/CustomMarkers/init_CustomMarkers.sqf.bak new file mode 100644 index 0000000..48e7cfe --- /dev/null +++ b/@epochhive/addons/custom_server/Compiles/CustomMarkers/init_CustomMarkers.sqf.bak @@ -0,0 +1,31 @@ +diag_log "-- >> Loading Custom Markers for blckeagls Mission System"; + +blck_customMarkers = []; +blck_fnc_addCustomMarker = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\CustomMarkers\GMS_fnc_addCustomMarker.sqf"; + +if (!isServer) exitWith{}; + +_modType = call blck_getModType; +if (_modType isEqualTo "Epoch") then +{ + [] execVM "\q\addons\custom_server\Compiles\CustomMarkers\CustomMarkers_Epoch.sqf"; +}; + +if (_modType isEqualTo "Exile") then +{ + //[] execVM "\q\addons\custom_server\Compiles\CustomMarkers\CustomMarkers_Exile.sqf"; +}; + +{ + /* + for spawnMarker.sqf parameters are: + _mArray params["_missionType","_markerPos","_markerLabel","_markerLabelType","_markerColor","_markerType"]; + _markerType params["_mShape","_mSize","_mBrush"]; + */ + // [31086.898,0,29440.51],"ServerRule","Server Rules:","mil_triangle","ColorRed"], + if (blck_debugON) then {diag_log format["[blckeagls] custom markers:: -- >> Adding marker %1",_x];}; + private _markerDefinitions = [_x select 1,_x select 0,_x select 2,"",_x select 4,_x select 3]; + [_markerDefinitions] execVM "debug\spawnMarker.sqf"; +}forEach blck_customMarkers; + +diag_log "[blckeagls] -- >> Custom Markers Loaded"; \ No newline at end of file diff --git a/@epochhive/addons/custom_server/Compiles/Functions/GMS_fnc_GroupsOnAISide.sqf b/@epochhive/addons/custom_server/Compiles/Functions/GMS_fnc_GroupsOnAISide.sqf new file mode 100644 index 0000000..722ec44 --- /dev/null +++ b/@epochhive/addons/custom_server/Compiles/Functions/GMS_fnc_GroupsOnAISide.sqf @@ -0,0 +1,15 @@ +/* + Determines the total number of spawned groups on the side used by the mission system and returns this value. + By Ghostrider-DbD- + Last updated 12/21/16 +*/ + +private _Groups_AI_Side = 0; + +{ + if ( (side _x) isEqualTo blck_AI_Side) then {_Groups_AI_Side = _Groups_AI_Side + 1;}; +}forEach allGroups; +//diag_log format["_fnc_groupsOnAISide:: -- >> allGroups = %1 | _Groups_AI_Side = %2",allGroups, _Groups_AI_Side]; + +// Return the number of groups used. +_Groups_AI_Side diff --git a/@epochhive/addons/custom_server/Compiles/Functions/GMS_fnc_cleanEmptyGroups.sqf b/@epochhive/addons/custom_server/Compiles/Functions/GMS_fnc_cleanEmptyGroups.sqf index 411d83c..d4048fa 100644 --- a/@epochhive/addons/custom_server/Compiles/Functions/GMS_fnc_cleanEmptyGroups.sqf +++ b/@epochhive/addons/custom_server/Compiles/Functions/GMS_fnc_cleanEmptyGroups.sqf @@ -4,13 +4,15 @@ By Ghostrider-DbD- 11/16/16 */ -if (true) then +if (blck_debugON) then { diag_log format ["_fnc_cleanEmptyGroups:: -- >> group count = %1 ",(count allGroups)]; + diag_log format ["_fnc_cleanEmptyGroups:: -- >> Group count AI side = %1", call blck_fnc_groupsOnAISide]; }; { //diag_log format["_fnc_cleanEmptyGroups:: - >> type of object _x = %1",typeName _x]; if ((count units _x) isEqualTo 0) then {deleteGroup _x}; }forEach allGroups; +diag_log "_fnc_cleanEmptyGroups:: -- >> exiting function"; diff --git a/@epochhive/addons/custom_server/Compiles/Functions/GMS_fnc_findWorld.sqf b/@epochhive/addons/custom_server/Compiles/Functions/GMS_fnc_findWorld.sqf index 688492c..cbe2dc6 100644 --- a/@epochhive/addons/custom_server/Compiles/Functions/GMS_fnc_findWorld.sqf +++ b/@epochhive/addons/custom_server/Compiles/Functions/GMS_fnc_findWorld.sqf @@ -8,14 +8,11 @@ private["_blck_WorldName"]; _blck_WorldName = toLower format ["%1", worldName]; _blck_worldSize = worldSize; -private["_modType"]; -_modType = [] call blck_fnc_getModType; -diag_log format["[blckeagls] Loading Map-specific settings with worldName = %1 and modType = %2",_blck_WorldName,_modType]; +diag_log format["[blckeagls] Loading Map-specific settings with worldName = %1",_blck_WorldName]; -if (_modType isEqualTo "Epoch") then -{ - switch (_blck_WorldName) do {// These may need some adjustment - including a test for shore or water should help as well to avoid missions spawning on water. +switch (_blck_WorldName) do +{// These may need some adjustment - including a test for shore or water should help as well to avoid missions spawning on water. case "altis":{ diag_log "[blckeagls] Altis-specific settings for Epoch loaded"; blck_mapCenter = [6322,7801,0]; @@ -39,14 +36,14 @@ if (_modType isEqualTo "Epoch") then }; case "esseker":{ diag_log "Esseker-specific settings loaded"; - blck_mapCenter = [6144, 6144, 0]; //centerPosition = {7100, 7750, 300}; - blck_mapRange = 5300; + blck_mapCenter = [6049.26,6239.63,0]; //centerPosition = {7100, 7750, 300}; + blck_mapRange = 6000; }; case "taviana":{blck_mapCenter = [10370, 11510, 0];blck_mapRange = 14400;}; case "namalsk":{blck_mapCenter = [4352, 7348, 0];blck_mapRange = 10000;}; case "napf": {blck_mapCenter = [10240,10240,0]; blck_mapRange = 14000}; // {_centerPos = [10240, 10240, 0];_isMountainous = true;_maxHeight = 50;}; case "australia": {blck_mapCenter = [20480,20480, 150];blck_mapRange = 40960;}; - case "panthera2":{blck_mapCenter = [4400, 4400, 0];blck_mapRange = 4400;}; + case "panthera3":{blck_mapCenter = [4400, 4400, 0];blck_mapRange = 4400;}; case "isladuala":{blck_mapCenter = [4400, 4400, 0];blck_mapRange = 4400;}; case "sauerland":{blck_mapCenter = [12800, 12800, 0];blck_mapRange = 12800;}; case "trinity":{blck_mapCenter = [6400, 6400, 0];blck_mapRange = 6400;}; @@ -56,30 +53,7 @@ if (_modType isEqualTo "Epoch") then case "tavi":{blck_mapCenter = [10370, 11510, 0];blck_mapRange = 14090;}; case "lingor":{blck_mapCenter = [4400, 4400, 0];blck_mapRange = 4400;}; case "takistan":{blck_mapCenter = [5500, 6500, 0];blck_mapRange = 5000;}; - default {_blck_WorldName = "default";blck_mapCenter = [6322,7801,0]; blck_mapRange = 12000}; - }; -}; -if (_modType isEqualTo "Exile") then -{ - switch (_blck_WorldName) do { - // These may need some adjustment - including a test for shore or water should help as well to avoid missions spawning on water. - case "altis":{diag_log "Altis-specific settings loaded";blck_mapCenter = [6322,7801,0];blck_mapRange = 21000;}; - case "taviana":{blck_mapCenter = [10370, 11510, 0];blck_mapRange = 14400;}; - case "namalsk":{blck_mapCenter = [4352, 7348, 0];blck_mapRange = 10000;}; - case "napf": {blck_mapCenter = [10240,10240,0]; blck_mapRange = 14000}; // {_centerPos = [10240, 10240, 0];_isMountainous = true;_maxHeight = 50;}; - case "tanoa": {blck_mapCenter = [ (_blck_worldSize/2),(_blck_worldSize/2),0];blck_mapRange = _blck_worldSize;}; - case "panthera2":{blck_mapCenter = [4400, 4400, 0];blck_mapRange = 4400;}; - case "isladuala":{blck_mapCenter = [4400, 4400, 0];blck_mapRange = 4400;}; - case "sauerland":{blck_mapCenter = [12800, 12800, 0];blck_mapRange = 12800;}; - case "trinity":{blck_mapCenter = [6400, 6400, 0];blck_mapRange = 6400;}; - case "utes":{blck_mapCenter = [3500, 3500, 0];blck_mapRange = 3500;}; - case "zargabad":{blck_mapCenter = [4096, 4096, 0];blck_mapRange = 4096;}; - case "fallujah":{blck_mapCenter = [3500, 3500, 0];blck_mapRange = 3500;}; - case "tavi":{blck_mapCenter = [10370, 11510, 0];blck_mapRange = 14090;}; - case "lingor":{blck_mapCenter = [4400, 4400, 0];blck_mapRange = 4400;}; - case "takistan":{blck_mapCenter = [5500, 6500, 0];blck_mapRange = 5000;}; - default {_blck_WorldName = "default";blck_mapCenter = [6322,7801,0]; blck_mapRange = 12000;}; - }; + default {_blck_WorldName = "default";blck_mapCenter = [6322,7801,0]; blck_mapRange = 6000}; }; blck_worldSet = true; diff --git a/@epochhive/addons/custom_server/Compiles/Functions/GMS_fnc_getModType.sqf b/@epochhive/addons/custom_server/Compiles/Functions/GMS_fnc_getModType.sqf new file mode 100644 index 0000000..0e5be23 --- /dev/null +++ b/@epochhive/addons/custom_server/Compiles/Functions/GMS_fnc_getModType.sqf @@ -0,0 +1,12 @@ +/* + Based on code by IT07 written for VEMF_r +*/ + +private "_mod"; + +_mod = ""; + +if not ( isNull ( configFile >> "CfgPatches" >> "exile_server" ) ) then { _mod = "Exile" }; +if not ( isNull ( configFile >> "CfgPatches" >> "a3_epoch_server" ) ) then { _mod = "Epoch" }; + +_mod diff --git a/@epochhive/addons/custom_server/Compiles/Functions/GMS_fnc_mainThread.sqf b/@epochhive/addons/custom_server/Compiles/Functions/GMS_fnc_mainThread.sqf index ca28cc4..d000a02 100644 --- a/@epochhive/addons/custom_server/Compiles/Functions/GMS_fnc_mainThread.sqf +++ b/@epochhive/addons/custom_server/Compiles/Functions/GMS_fnc_mainThread.sqf @@ -36,17 +36,19 @@ while {true} do [] call GMS_fnc_cleanupDeadAI; - if (_modType isEqualTo "Epoch") then {[] call blck_fnc_cleanEmptyGroups;}; // Exile cleans up empty groups automatically so this should not be needed with that mod. + //if (_modType isEqualTo "Epoch") then { + diag_log "calling blck_fnc_cleanEmptyGroups"; + [] spawn blck_fnc_cleanEmptyGroups; + //}; // Exile cleans up empty groups automatically so this should not be needed with that mod. _timer1min = diag_tickTime; }; - - if ((diag_tickTime - _timer5min) > 180) then { + if ((diag_tickTime - _timer5min) > 300) then { if (blck_timeAcceleration) then { if (blck_debugON) then {diag_log "[blckeagls] calling time acceleration module";}; [] call blck_fnc_timeAcceleration; }; - if (blck_useHC) then {[] call blck_fnc_monitorHC;}; + if (blck_useHC) then {[] call blck_fnc_monitorHC;}; // Not working _timer5min = diag_tickTime; }; @@ -57,7 +59,7 @@ while {true} do _timer10Min = diag_tickTime; }; */ - /* + { if (_x select 6 > 0) then // The mission is not running, check the time left till it is spawned { @@ -67,7 +69,7 @@ while {true} do _coords pushback 0; blck_ActiveMissionCoords pushback _coords; private["_markerClass","_missionName","_missionPath","_aiDifficultyLevel"]; - //diag_log format["_fnc_mainThread:: -->> _missionClass would = %1%2",_x select 2, _index]; + diag_log format["_fnc_mainThread:: -->> _missionClass would = %1%2",_x select 2, _index]; _markerClass = _x select 2; [_markerClass,"Active",_coords] call blck_fnc_updateMissionQue; _aiDifficultyLevel = _x select 4; @@ -78,6 +80,6 @@ while {true} do }; }; }forEach blck_pendingMissions; - */ + }; diff --git a/@epochhive/addons/custom_server/Compiles/Groups/GMS_fnc_spawnGroup.sqf b/@epochhive/addons/custom_server/Compiles/Groups/GMS_fnc_spawnGroup.sqf index 9d3b30e..9d8af0b 100644 --- a/@epochhive/addons/custom_server/Compiles/Groups/GMS_fnc_spawnGroup.sqf +++ b/@epochhive/addons/custom_server/Compiles/Groups/GMS_fnc_spawnGroup.sqf @@ -3,7 +3,7 @@ for DBD Clan By Ghostrider-DBD- Copyright 2016 - Last Modified 9-12-16 + Last Modified 12/21/16 */ //Sets Private Variables to they don't interfere when this script is called more than once private["_numbertospawn","_i","_groupSpawned","_safepos","_x","_weaponList","_useLauncher","_launcherType","_aiSkills"]; @@ -24,49 +24,55 @@ if (blck_debugLevel isEqualTo 3) then diag_log format["spawnGroup.sqf: _numbertospawn = %1",_numbertospawn]; }; //Creates a group to make them attack players -_groupSpawned = createGroup blck_AI_Side; // ; Group changed for Exile for which player is RESISTANCE. -_groupSpawned setcombatmode blck_combatMode; -_groupSpawned allowfleeing 0; -_groupSpawned setspeedmode "FULL"; -_groupSpawned setFormation blck_groupFormation; -_groupSpawned setVariable ["blck_group",true,true]; +_groupSpawned = createGroup blck_AI_Side; // ; Group changed for Exile for which player is RESISTANCE. +if !(isNull _groupSpawned) then +{ + diag_log format["_fnc_spawnGroup:: -- >> Group created = %1",_groupSpawned]; + _groupSpawned setcombatmode blck_combatMode; + _groupSpawned allowfleeing 0; + _groupSpawned setspeedmode "FULL"; + _groupSpawned setFormation blck_groupFormation; + _groupSpawned setVariable ["blck_group",true,true]; -//diag_log format["spawnGroup:: group is %1",_groupSpawned]; -// Determines whether or not the group has launchers -_useLauncher = blck_useLaunchers; + //diag_log format["spawnGroup:: group is %1",_groupSpawned]; + // Determines whether or not the group has launchers + _useLauncher = blck_useLaunchers; -// define weapons list for the group -switch (_skillLevel) do { - case "blue": {_weaponList = blck_WeaponList_Blue;}; - case "red": {_weaponList = blck_WeaponList_Red;}; - case "green": {_weaponList = blck_WeaponList_Green;}; - case "orange": {_weaponList = blck_WeaponList_Orange;}; - default {_weaponList = blck_WeaponList_Blue;}; -}; - - -//Spawns the correct number of AI Groups, each with the correct number of units -//Counter variable -_i = 0; -while {_i < _numbertospawn} do { - _i = _i + 1; - if (blck_useLaunchers && _i <= blck_launchersPerGroup) then - { - _launcherType = selectRandom blck_launcherTypes; - } else { - _launcherType = "none"; + // define weapons list for the group + switch (_skillLevel) do { + case "blue": {_weaponList = blck_WeaponList_Blue;}; + case "red": {_weaponList = blck_WeaponList_Red;}; + case "green": {_weaponList = blck_WeaponList_Green;}; + case "orange": {_weaponList = blck_WeaponList_Orange;}; + default {_weaponList = blck_WeaponList_Blue;}; }; - - //Finds a safe positon to spawn the AI in the area given - _safepos = [_pos,0,30,2,0,20,0] call BIS_fnc_findSafePos; - //Spawns the AI unit - //diag_log format["spawnGroup:: spawning unit #%1",_i]; - // params["_pos","_weaponList","_aiGroup",["_skillLevel","red"],["_Launcher","none"],["_uniforms",blck_SkinList],["_headGear",blck_BanditHeadgear]]; - [_safepos,_weaponList,_groupSpawned,_skillLevel,_launcherType,_uniforms,_headGear] call blck_fnc_spawnAI; + + //Spawns the correct number of AI Groups, each with the correct number of units + //Counter variable + _i = 0; + while {_i < _numbertospawn} do { + _i = _i + 1; + if (blck_useLaunchers && _i <= blck_launchersPerGroup) then + { + _launcherType = selectRandom blck_launcherTypes; + } else { + _launcherType = "none"; + }; + + //Finds a safe positon to spawn the AI in the area given + _safepos = [_pos,0,30,2,0,20,0] call BIS_fnc_findSafePos; + + //Spawns the AI unit + //diag_log format["spawnGroup:: spawning unit #%1",_i]; + // params["_pos","_weaponList","_aiGroup",["_skillLevel","red"],["_Launcher","none"],["_uniforms",blck_SkinList],["_headGear",blck_BanditHeadgear]]; + [_safepos,_weaponList,_groupSpawned,_skillLevel,_launcherType,_uniforms,_headGear] call blck_fnc_spawnAI; + }; + _groupSpawned selectLeader (units _groupSpawned select 0); + [_pos,_minDist,_maxDist,_groupSpawned] spawn blck_fnc_setupWaypoints; + + //diag_log format["fnc_spawnGroup:: Group spawned was %1 with units of %2",_groupSpawned, units _groupSpawned]; +} else { + diag_log "_fnc_spawnGroup:: ERROR CONDITION : NULL GROUP CREATED"; }; -_groupSpawned selectLeader (units _groupSpawned select 0); -[_pos,_minDist,_maxDist,_groupSpawned] spawn blck_fnc_setupWaypoints; - -//diag_log format["fnc_spawnGroup:: Group spawned was %1 with units of %2",_groupSpawned, units _groupSpawned]; _groupSpawned diff --git a/@epochhive/addons/custom_server/Compiles/Missions/GMS_fnc_addMIssionToQue.sqf b/@epochhive/addons/custom_server/Compiles/Missions/GMS_fnc_addMIssionToQue.sqf index 496070e..6b7c484 100644 --- a/@epochhive/addons/custom_server/Compiles/Missions/GMS_fnc_addMIssionToQue.sqf +++ b/@epochhive/addons/custom_server/Compiles/Missions/GMS_fnc_addMIssionToQue.sqf @@ -15,7 +15,7 @@ for "_i" from 1 to _noMissions do { private _waitTime = diag_tickTime + (_tMin) + random((_tMax) - (_tMin)); _mission = [_missionList,_path,format["%1%2",_marker,_i],_difficulty,_tMin,_tMax,_waitTime,[0,0,0]]; - diag_log format["-fnc_addMissionToQue::-->> _mission = %1",_mission]; + //diag_log format["-fnc_addMissionToQue::-->> _mission = %1",_mission]; blck_pendingMissions pushback _mission; }; -//diag_log format["_fnc_addMissionToQue:: -- >> Result - blck_pendingMissions = %1",blck_pendingMissions]; +diag_log format["_fnc_addMissionToQue:: -- >> Result - blck_pendingMissions = %1",blck_pendingMissions]; diff --git a/@epochhive/addons/custom_server/Compiles/Missions/GMS_fnc_missionSpawner - Copy.sqf b/@epochhive/addons/custom_server/Compiles/Missions/GMS_fnc_missionSpawner - Copy.sqf new file mode 100644 index 0000000..f2fd061 --- /dev/null +++ b/@epochhive/addons/custom_server/Compiles/Missions/GMS_fnc_missionSpawner - Copy.sqf @@ -0,0 +1,461 @@ +/* + Generic Mission Spawner + for DBD Clan + By Ghostrider-DBD- + Copyright 2016 +*/ + + +private ["_crates","_aiGroup","_objects","_vehicles","_groupPatrolRadius","_missionLandscape","_compositions","_missionCfg","_compSel","_mines","_blck_AllMissionAI","_blck_localMissionMarker","_AI_Vehicles"]; + +params["_coords","_missionType","_aiDifficultyLevel"]; +/* +_aiDifficultyLevel = _this select 2; // "blue","red","green" and "orange" +*/ + +// ************************* + +// Once the entire mission system can support timeout cleanup of vehicles (specifically the AI vehicle patrols) then each mission layout can define this varialbe. Until then disable timouts. + +////////////////////////////////// +// To simplify debugging and also reduce load on server besure only once instance of the mission spawner is initializing at a time. +///////////////////////////////// + +waitUntil {blck_missionSpawning isEqualTo false}; +blck_missionSpawning = true; + +diag_log format["[blckeagls] missionSpawner:: Initializing mission: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + +private["_chanceHeliPatrol","_noPara","_reinforcementLootCounts","_chanceLoot"]; +if (isNil "_chanceReinforcements") then +{ + _chanceReinforcements = 0; + _noPara = 0; + _reinforcementLootCounts = [0,0,0,0,0,0]; + _chanceHeliPatrol = 0; + _chanceLoot = 0; +}; +private["_timeOut"]; // _timeOut is the time in seconds after which a mission is deactivated. +if (isNil "_markerColor") then {_markerColor = "ColorBlack"}; +if (isNil "_markerType") then {_markerType = ["mil_box",[]]}; +if (isNil "_timeOut") then {_timeOut = -1;}; +if (isNil "_noPara") then {_noPara = 0}; +if (isNil "_chanceHeliPatrol") then {_chanceHeliPatrol = 0;}; +if (isNil "_chanceLoot") then {_chanceLoot = 0}; +if (isNil "_reinforcementLootCounts") then +{ + _weap = 2 + floor(random(4)); + _mags = 5 + floor(random(6)); + _backpacks = 1 + floor(random(2)); + _optics = 1 + floor(random(6)); + _loadout = 1 + floor(random(3)); + _reinforcementLootCounts = [_weap,_mags,_optics,0,0,_backpacks]; + //diag_log "missionSpawner:: default values used for _reinforcementLootCounts"; +} +else +{ + //diag_log "missionSpawner:: Mission specific values used for _reinforcementLootCounts"; +}; + +if (blck_debugON) then { + diag_log format["[blckEagle] Mission Reinforcement Parameters: changeReinforcements %1 numAI %2 changePatrol %3 chanceLoot %4",_chanceReinforcements,_noPara,_chanceHeliPatrol,_chanceLoot]; +}; + +private["_useMines"]; +if (isNil "_useMines") then {_useMines = blck_useMines; /*diag_log "[blckEagles] Using default setting for _useMines";*/}; + +_objects = []; +_mines = []; +_crates = []; +_aiGroup = []; +_missionAIVehicles = []; +_blck_AllMissionAI = []; +_AI_Vehicles = []; +_blck_localMissionMarker = [_missionType,_coords,"","",_markerColor,_markerType]; +_delayTime = 1; +_groupPatrolRadius = 50; + +if (blck_labelMapMarkers select 0) then +{ + //diag_log "SM1.sqf: labeling map markers *****"; + _blck_localMissionMarker set [2, _markerMissionName]; +}; +if !(blck_preciseMapMarkers) then +{ + //diag_log "SM1.sqf: Map marker will be OFFSET from the mission position"; + _blck_localMissionMarker set [1,[_coords,75] call blck_fnc_randomPosition]; +}; +_blck_localMissionMarker set [3,blck_labelMapMarkers select 1]; // Use an arrow labeled with the mission name? +[["start",_startMsg,_blck_localMissionMarker select 2]] call blck_fnc_messageplayers; +[_blck_localMissionMarker] execVM "debug\spawnMarker.sqf"; + +_fn_timedOut = { + params["_startTime"]; + private["_return"]; + _return = ( (diag_tickTime - _startTime) > blck_MissionTimout ); + _return; +}; +_fn_playerWithinRange = { + params["_pos"]; + private["_return"]; + _return = false; + { + if (isPlayer _x and _x distance _pos <= blck_TriggerDistance) then {_return = true}; + + }forEach allPlayers; // playableunits; changed for Arma 1.66 + _return; +}; + +uiSleep 1; +///////////////////////////// +// Everything has been set up for the mission and it is now waiting to be triggered by a nearby player or to time out. +// Lets let other instances of the mission spawner know it is OK to go ahead +//////////////////////////// +blck_missionSpawning = false; + +//diag_log "missionSpawner:: waiting for player to trigger the mission"; +private["_wait","_missionStartTime","_playerInRange","_missionTimedOut"]; +_missionStartTime = diag_tickTime; +_playerInRange = false; +_missionTimedOut = false; +_wait = true; +while {_wait} do +{ + if (blck_debugLevel isEqualTo 3) then + { + _wait = false; + _playerInRange = true; + } else { + if ([_coords] call _fn_playerWithinRange) then + { + _wait = false; + _playerInRange = true; + } else + { + if ((diag_tickTime - _missionStartTime) > blck_MissionTimout) then + { + _wait = false; + _missionTimedOut = true; + }; + }; + uiSleep 1; + }; +}; +//waitUntil{ { (isPlayer _x && _x distance _coords <= blck_TriggerDistance /*&& vehicle _x == _x*/) || ([_missionStartTime] call _fn_timedOut) } count playableunits > 0 }; + +if (blck_debugON) then +{ + diag_log format["missionSpawner:: Mission Triggerred contition playerInRange %1 and timout = %2",_playerInRange, _missionTimedOut]; +}; + +if (!_playerInRange && _missionTimedOut) exitWith +{ + //["timeOut",_endMsg,_blck_localMissionMarker select 2] call blck_fnc_messageplayers; + [_blck_localMissionMarker select 0] execVM "debug\deleteMarker.sqf"; + _blck_localMissionMarker set [1,[0,0,0]]; + _blck_localMissionMarker set [2,""]; + [_objects, 1] spawn blck_fnc_cleanupObjects; + if (blck_debugON) then + { + diag_log format["[blckeagls] missionSpawner:: Mission Timed Out: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + }; +}; + +if (_playerInRange) then +{ + if (blck_debugON) then + { diag_log format["[blckeagls] missionSpawner:: -- >> Mission tripped by nearby player: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + }; + + if (count _missionLootBoxes > 0) then + { + _crates = [_coords,_missionCfg select 2/* array of crates*/] call blck_fnc_spawnMissionCrates; + } + else + { + _crates = [_coords,[[selectRandom blck_crateTypes /*"Box_NATO_Wps_F"*/,[0,0,0],_crateLoot,_lootCounts]]] call blck_fnc_spawnMissionCrates; + + }; + //_objects append _crates; + + if (blck_debugON) then + { + diag_log format["[blckeagls] missionSpawner:: Crates Spawned: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + }; + + uiSleep _delayTime; + + if (blck_SmokeAtMissions select 0) then // spawn a fire and smoke near the crate + { + private ["_temp"]; + _temp = [_coords,blck_SmokeAtMissions select 1] call blck_fnc_smokeAtCrates; + _objects append _temp; + _temp = nil; + }; + uiSleep _delayTime; + if (_useMines) then + { + _mines = [_coords] call blck_fnc_spawnMines; + //waitUntil{!(_mines isEqualTo [];); + uiSleep _delayTime;; + }; + uiSleep _delayTime; + _obj = []; + if (_missionLandscapeMode isEqualTo "random") then + { + _obj = [_coords,_missionLandscape, 3, 15, 2] call blck_fnc_spawnRandomLandscape; + } else { + _obj = [_coords, floor(random(360)),_missionLandscape,true] call blck_fnc_spawnCompositionObjects; + }; + //diag_log format["_fnc_missionSpawner::->> _obj = %1",_obj]; + _objects append _obj; + //diag_log format["_fnc_missionSpawner::->> _objects = %1",_objects]; + _obj= nil; + if (blck_debugON) then + { + diag_log format["[blckeagls] missionSpawner:: Landscape spawned: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + }; + + uiSleep _delayTime;; + + if ((count _missionLootVehicles) > 0) then // spawn loot vehicles + { + { + //diag_log format["spawnMissionCVehicles.sqf _x = %1",_x]; + _offset = _x select 1; // offset relative to _coords at which to spawn the vehicle + _pos = [(_coords select 0)+(_offset select 0),(_coords select 1) + (_offset select 1),(_coords select 2)+(_offset select 2)]; + _veh = [_x select 0 /* vehicle class name*/, _pos] call blck_fnc_spawnVehicle; + _vehs pushback _veh; + [_veh,_x select 2 /*loot array*/, _x select 3 /*array of values specifying number of items of each loot type to load*/] call blck_fnc_fillBoxes; + }forEach _missionLootVehicles; + + }; + uiSleep _delayTime; + if (blck_useStatic && (_noEmplacedWeapons > 0)) then + { + private["_static","_count"]; + if ( count (_missionEmplacedWeapons) > 0 ) then + { + _static = _missionCfg select 4 select 1; + _count = _missionCfg select 4 select 0; + } + else + { + _static = blck_staticWeapons; + _count = _noEmplacedWeapons; + }; + private ["_emplacedGroup","_emplacedPositions"]; + + _emplacedPositions = [_coords,_count,35,50] call blck_fnc_findPositionsAlongARadius; + //diag_log format["missionSpawner:: _emplacedPositions = %1",_emplacedPositions]; + { + _emplacedGroup = [_x,1,1,_aiDifficultyLevel,_coords,1,2,_uniforms,_headGear] call blck_fnc_spawnGroup; + //_emplacedUnits = units _emplacedGroup; + _blck_AllMissionAI = _blck_AllMissionAI + (units _emplacedGroup); + _emplacedWeapon = [_x,_emplacedGroup,blck_staticWeapons,5,15] call blck_fnc_spawnEmplacedWeapon; + _missionAIVehicles pushback _emplacedWeapon; + uiSleep _delayTime; + }forEach _emplacedPositions; + //diag_log format["missionSpawner:: emplaced weapons data: _AI_Vehicles %1 _blck_AllMissionAI %1",_AI_Vehicles,_blck_AllMissionAI]; + if (blck_debugON) then + { + diag_log format["[blckeagls] missionSpawner:: Static Weapons Spawned: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + }; + }; + uiSleep _delayTime; + //diag_log format["_fnc_missionSpawner:: after adding any static weapons, _blck_AllMissionAI is %1",_blck_AllMissionAI]; + + //diag_log format["_fnc_missionSpawner:: after adding any vehicle patrols, _blck_AllMissionAI is %1",_blck_AllMissionAI]; + //diag_log format["missionSpawner:: _noAIGroups = %1; spawning AI Groups now",_noAIGroups]; + uiSleep _delayTime; + private["_unitsToSpawn","_unitsPerGroup","_ResidualUnits","_newGroup"]; + _unitsToSpawn = round(_minNoAI + round(random(_maxNoAI - _minNoAI))); + _unitsPerGroup = floor(_unitsToSpawn/_noAIGroups); + _ResidualUnits = _unitsToSpawn - (_unitsPerGroup * _noAIGroups); + //diag_log format["missionSpawner:: _unitsToSpawn %1 ; _unitsPerGroup %2 _ResidualUnits %3",_unitsToSpawn,_unitsPerGroup,_ResidualUnits]; + switch (_noAIGroups) do + { + case 1: { // spawn the group near the mission center + //params["_pos", ["_numai1",5], ["_numai2",10], ["_skillLevel","red"], "_center", ["_minDist",20], ["_maxDist",35], ["_uniforms",blck_SkinList], ["_headGear",blck_headgear] ]; + _newGroup = [_coords,_unitsToSpawn,_unitsToSpawn,_aiDifficultyLevel,_coords,3,18,_uniforms,_headGear] call blck_fnc_spawnGroup; + _newAI = units _newGroup; + _blck_AllMissionAI = _blck_AllMissionAI + _newAI; + //diag_log format["missionSpawner: Spawning Groups: _noAIGroups=1 _newGroup=%1 _newAI = %2",_newGroup, _newAI]; + }; + case 2: { + //diag_log format["missionSpawner: Spawning Groups: _noAIGroups=2"]; // spawn groups on either side of the mission area + _groupLocations = [_coords,_noAIGroups,15,30] call blck_fnc_findPositionsAlongARadius; + { + private["_adjusttedGroupSize"]; + if (_ResidualUnits > 0) then + { + _adjusttedGroupSize = _unitsPerGroup + _ResidualUnits; + _ResidualUnits = 0; + } else { + _adjusttedGroupSize = _unitsPerGroup; + }; + _newGroup = [_x,_adjusttedGroupSize,_adjusttedGroupSize,_aiDifficultyLevel,_coords,1,12,_uniforms,_headGear] call blck_fnc_spawnGroup; + _newAI = units _newGroup; + _blck_AllMissionAI = _blck_AllMissionAI + _newAI; + //diag_log format["missionSpawner: Spawning 2 Groups: _newGroup=%1 _newAI = %2",_newGroup, _newAI]; + }forEach _groupLocations; + + }; + case 3: { // spawn one group near the center of the mission and the rest on the perimeter + //diag_log format["missionSpawner: Spawning Groups: _noAIGroups=3"]; + _newGroup = [_coords,_unitsPerGroup + _ResidualUnits,_unitsPerGroup + _ResidualUnits,_aiDifficultyLevel,_coords,1,12,_uniforms,_headGear] call blck_fnc_spawnGroup; + _newAI = units _newGroup; + _blck_AllMissionAI = _blck_AllMissionAI + _newAI; + //diag_log format["missionSpawner: Spawning Groups: _noAIGroups=3 _newGroup=%1 _newAI = %2",_newGroup, _newAI]; + _groupLocations = [_coords,2,20,35] call blck_fnc_findPositionsAlongARadius; + { + _newGroup = [_x,_unitsPerGroup,_unitsPerGroup,_aiDifficultyLevel,_coords,1,12,_uniforms,_headGear] call blck_fnc_spawnGroup; + _newAI = units _newGroup; + _blck_AllMissionAI = _blck_AllMissionAI + _newAI; + //diag_log format["missionSpawner: Spawning 2 Groups:_newGroup=%1 _newAI = %2",_newGroup, _newAI]; + }forEach _groupLocations; + + }; + default { // spawn one group near the center of the mission and the rest on the perimeter + //diag_log format["missionSpawner: Spawning Groups: _noAIGroups=default"]; + _newGroup = [_coords,_unitsPerGroup + _ResidualUnits,_unitsPerGroup + _ResidualUnits,_aiDifficultyLevel,_coords,1,12,_uniforms,_headGear] call blck_fnc_spawnGroup; + _newAI = units _newGroup; + _blck_AllMissionAI = _blck_AllMissionAI + _newAI; + //diag_log format["missionSpawner: Spawning Groups: _noAIGroups=%3 _newGroup=%1 _newAI = %2",_newGroup, _newAI,_noAIGroups]; + _groupLocations = [_coords,(_noAIGroups - 1),20,40] call blck_fnc_findPositionsAlongARadius; + { + _newGroup = [_x,_unitsPerGroup,_unitsPerGroup,_aiDifficultyLevel,_coords,1,12,_uniforms,_headGear] call blck_fnc_spawnGroup; + _newAI = units _newGroup; + _blck_AllMissionAI = _blck_AllMissionAI + _newAI; + //diag_log format["missionSpawner: Spawning %3 Groups: _newGroup=%1 _newAI = %2",_newGroup, _newAI,_noAIGroups]; + }forEach _groupLocations; + }; + }; + uiSleep _delayTime; + if (blck_debugON) then + { + diag_log format["[blckeagls] missionSpawner:: AI Patrols Spawned: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + }; + + if ((random(1) < _chanceReinforcements)) then + { + _weaponList = blck_WeaponList_Red; + + switch (_aiDifficultyLevel) do { + case "blue": {_weaponList = blck_WeaponList_Blue;}; + case "red": {_weaponList = blck_WeaponList_Red;}; + case "green": {_weaponList = blck_WeaponList_Green;}; + case "orange": {_weaponList = blck_WeaponList_Orange;}; + default {_weaponList = blck_WeaponList_Blue;}; + }; + + //diag_log format["missionSpawner:: weaponList = %1",_weaponList]; + private["_grpReinforcements"]; + _grpReinforcements = grpNull; + + diag_log format["[blckeagls] missionSpawner:: calling in reinforcements: Current mission: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + [] spawn { + //[_coords,_noPara,_aiDifficultyLevel,_chanceLoot,_reinforcementLootCounts,_weaponList,_uniforms,_headgear,_chanceHeliPatrol] call blck_fnc_Reinforcements; + //waitUntil {_grpReinforcements != grpNull}; + //diag_log format["[blckeagls] missionSpawner::reinforcement spawner started: Current mission: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + }; + if !(_grpReinforcements isEqualTo grpNull) then + { + _blck_AllMissionAI = _blck_AllMissionAI + (units _grpReinforcements); + //diag_log format["missionSpawner:: _grpReinforcements = %1",_grpReinforcements]; + }; + }; + + if (blck_useVehiclePatrols && (_noVehiclePatrols > 0)) then + { + private["_vehGroup","_patrolVehicle","_vehiclePatrolSpawns"]; + _vehiclePatrolSpawns= [_coords,_noVehiclePatrols,45,60] call blck_fnc_findPositionsAlongARadius; + //diag_log format["missionSpawner:: _vehiclePatrolSpawns = %1",_vehiclePatrolSpawns]; + //for "_i" from 1 to _noVehiclePatrols do + { + _vehGroup = [_x,3,3,_aiDifficultyLevel,_coords,1,2,_uniforms,_headGear] call blck_fnc_spawnGroup; + //diag_log format["missionSpawner:: group for AI Patrol vehicle spawn: group is %1 with units of %2",_vehGroup, units _vehGroup]; + _blck_AllMissionAI = _blck_AllMissionAI + (units _vehGroup); + _randomVehicle = blck_AIPatrolVehicles call BIS_fnc_selectRandom; + //diag_log format["missionSpawner:: vehicle selected is %1", _randomVehicle]; + _patrolVehicle = [_coords,_x,_randomVehicle,(_x distance _coords) -5,(_x distance _coords) + 5,_vehGroup] call blck_fnc_spawnVehiclePatrol; + //diag_log format["missionSpawner:: patrol vehicle spawned was %1",_patrolVehicle]; + _vehGroup setVariable["groupVehicle",_patrolVehicle,true]; + //uiSleep _delayTime; + _AI_Vehicles pushback _patrolVehicle; + }forEach _vehiclePatrolSpawns; + //diag_log format["missionSpawner:: vehicle patrols data: _AI_Vehicles %1 _blck_AllMissionAI %1",_AI_Vehicles,_blck_AllMissionAI]; + uiSleep _delayTime; + if (blck_debugON) then + { + diag_log format["[blckeagls] missionSpawner:: Vehicle Patrols Spawned: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + }; + }; + // Trigger for mission end + //diag_log format["[blckeagls] mission Spawner _endCondition = %1",_endCondition]; + private["_missionComplete"]; + _missionComplete = -1; + + _endIfPlayerNear = false; + _endIfAIKilled = false; + _startTime = diag_tickTime; + _missionTimedOut = false; + + switch (_endCondition) do + { + case "playerNear": {_endIfPlayerNear = true;}; + case "allUnitsKilled": {_endIfAIKilled = true;}; + case "allKilledOrPlayerNear": {_endIfPlayerNear = true;_endIfAIKilled = true;}; + }; + //diag_log format["missionSpawner :: _endIfPlayerNear = %1 _endIfAIKilled= %2",_endIfPlayerNear,_endIfAIKilled]; + private["_locations"]; + _locations = [_coords] + _crates; + + //diag_log format["missionSpawner:: Waiting for player to satisfy mission end criteria of _endIfPlayerNear %1 with _endIfAIKilled %2",_endIfPlayerNear,_endIfAIKilled]; + while {_missionComplete isEqualTo -1} do + { + if (blck_debugLevel isEqualTo 3) then + { + uiSleep 120; + _missionComplete = 1; + } else { + if (_endIfPlayerNear) then { + if ( { (isPlayer _x) && ([_x,_locations,20] call blck_fnc_playerInRange) && (vehicle _x == _x) } count allPlayers > 0) then { + _missionComplete = 1; + }; + }; + //diag_log format["missionSpawner:: count alive _blck_AllMissionAI = %1",{alive _x} count _blck_AllMissionAI]; + if (_endIfAIKilled) then { + if (({alive _x} count _blck_AllMissionAI) < 1 ) then { + _missionComplete = 1; + //diag_log format["missionSpawner:: _blck_AllMissionAI = %1","testing case _endIfAIKilled"]; + }; + }; + uiSleep 2; + }; + }; + + if (blck_debugON) then + { + diag_log format["[blckeagls] missionSpawner:: Mission completion criteria fulfilled: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + }; + + if (blck_useSignalEnd) then + { + //diag_log format["**** Minor\SM1.sqf:: _crate = %1",_crates select 0]; + [_crates select 0] spawn blck_fnc_signalEnd; + + if (blck_debugON) then + { + diag_log format["[blckeagls] missionSpawner:: SignalEnd called: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + }; + }; + [_mines] spawn blck_fnc_clearMines; + [_objects, blck_cleanupCompositionTimer] call blck_fnc_addObjToQue; + [_blck_AllMissionAI,blck_AliveAICleanUpTime] call blck_fnc_addLiveAItoQue; + [["end",_endMsg,_blck_localMissionMarker select 2]] call blck_fnc_messageplayers; + [_blck_localMissionMarker select 1, _missionType] execVM "debug\missionCompleteMarker.sqf"; + [_blck_localMissionMarker select 0] execVM "debug\deleteMarker.sqf"; + //[_blck_localMissionMarker select 0,"Completed"] call blck_fnc_updateMissionQue; + diag_log format["[blckeagls] missionSpawner:: end of mission: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; +}; diff --git a/@epochhive/addons/custom_server/Compiles/Missions/GMS_fnc_missionSpawner-debug.sqf b/@epochhive/addons/custom_server/Compiles/Missions/GMS_fnc_missionSpawner-debug.sqf new file mode 100644 index 0000000..c966a9b --- /dev/null +++ b/@epochhive/addons/custom_server/Compiles/Missions/GMS_fnc_missionSpawner-debug.sqf @@ -0,0 +1,459 @@ +/* + Generic Mission Spawner + for DBD Clan + By Ghostrider-DBD- + Copyright 2016 +*/ + + +private ["_crates","_aiGroup","_objects","_vehicles","_groupPatrolRadius","_missionLandscape","_compositions","_missionCfg","_compSel","_mines","_blck_AllMissionAI","_blck_localMissionMarker","_AI_Vehicles"]; + +params["_coords","_missionType","_aiDifficultyLevel"]; +/* +_aiDifficultyLevel = _this select 2; // "blue","red","green" and "orange" +*/ + +// ************************* + +// Once the entire mission system can support timeout cleanup of vehicles (specifically the AI vehicle patrols) then each mission layout can define this varialbe. Until then disable timouts. + +////////////////////////////////// +// To simplify debugging and also reduce load on server besure only once instance of the mission spawner is initializing at a time. +///////////////////////////////// + +waitUntil {blck_missionSpawning isEqualTo false}; +blck_missionSpawning = true; + +diag_log format["[blckeagls] missionSpawner:: INITIALIZING USING MISSION PARAMETERS mission: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + +private["_chanceHeliPatrol","_noPara","_reinforcementLootCounts","_chanceLoot"]; +if (isNil "_chanceReinforcements") then +{ + _chanceReinforcements = 0; + _noPara = 0; + _reinforcementLootCounts = [0,0,0,0,0,0]; + _chanceHeliPatrol = 0; + _chanceLoot = 0; +}; +private["_timeOut"]; // _timeOut is the time in seconds after which a mission is deactivated. +if (isNil "_markerColor") then {_markerColor = "ColorBlack"}; +if (isNil "_markerType") then {_markerType = ["mil_box",[]]}; +if (isNil "_timeOut") then {_timeOut = -1;}; +if (isNil "_noPara") then {_noPara = 0}; +if (isNil "_chanceHeliPatrol") then {_chanceHeliPatrol = 0;}; +if (isNil "_chanceLoot") then {_chanceLoot = 0}; +if (isNil "_reinforcementLootCounts") then +{ + _weap = 2 + floor(random(4)); + _mags = 5 + floor(random(6)); + _backpacks = 1 + floor(random(2)); + _optics = 1 + floor(random(6)); + _loadout = 1 + floor(random(3)); + _reinforcementLootCounts = [_weap,_mags,_optics,0,0,_backpacks]; + //diag_log "missionSpawner:: default values used for _reinforcementLootCounts"; +} +else +{ + //diag_log "missionSpawner:: Mission specific values used for _reinforcementLootCounts"; +}; + +if (blck_debugON) then { + diag_log format["(2) [blckEagle] REINFORCEMENT PARAMETERS: Mission Reinforcement Parameters for missionType %5: changeReinforcements %1 numAI %2 changePatrol %3 chanceLoot %4",_chanceReinforcements,_noPara,_chanceHeliPatrol,_chanceLoot,_missionType]; +}; + +private["_useMines"]; +if (isNil "_useMines") then {_useMines = blck_useMines; /*diag_log "[blckEagles] Using default setting for _useMines";*/}; + +_objects = []; +_mines = []; +_crates = []; +_aiGroup = []; +_missionAIVehicles = []; +_blck_AllMissionAI = []; +_AI_Vehicles = []; +_blck_localMissionMarker = [_missionType,_coords,"","",_markerColor,_markerType]; +_delayTime = 1; +_groupPatrolRadius = 50; + +if (blck_labelMapMarkers select 0) then +{ + //diag_log "SM1.sqf: labeling map markers *****"; + _blck_localMissionMarker set [2, _markerMissionName]; +}; +if !(blck_preciseMapMarkers) then +{ + //diag_log "SM1.sqf: Map marker will be OFFSET from the mission position"; + _blck_localMissionMarker set [1,[_coords,75] call blck_fnc_randomPosition]; +}; +_blck_localMissionMarker set [3,blck_labelMapMarkers select 1]; // Use an arrow labeled with the mission name? +["start",_startMsg,_blck_localMissionMarker select 2] call blck_fnc_messageplayers; +[_blck_localMissionMarker] execVM "debug\spawnMarker.sqf"; + +_fn_timedOut = { + params["_startTime"]; + private["_return"]; + _return = ( (diag_tickTime - _startTime) > blck_MissionTimout ); + _return; +}; +_fn_playerWithinRange = { + params["_pos"]; + private["_return"]; + _return = false; + { + if (isPlayer _x and _x distance _pos <= blck_TriggerDistance) then {_return = true}; + + }forEach playableunits; + _return; +}; + +uiSleep 1; +///////////////////////////// +// Everything has been set up for the mission and it is now waiting to be triggered by a nearby player or to time out. +// Lets let other instances of the mission spawner know it is OK to go ahead +//////////////////////////// +blck_missionSpawning = false; + +if (DBD_debugON) then {diag_log format["missionSpawner:: WAITING FOR PLAYER to trigger the mission for missionType %1",_missionType];}; + +private["_wait","_missionStartTime","_playerInRange","_missionTimedOut"]; +_missionStartTime = diag_tickTime; +_playerInRange = false; +_missionTimedOut = false; +_wait = true; + +while {_wait} do +{ + uiSleep 1; + if ([_coords] call _fn_playerWithinRange) then + { + _wait = false; + _playerInRange = true; + } else + { + if ( (diag_tickTime - _missionStartTime) > blck_MissionTimout ) then + { + _wait = false; + _missionTimedOut = true; + } else { + if (blck_debugLevel == 3) then + { + sleep 120; + _wait = false; + _playerInRange = true; + diag_log format["(3) _fnc_missionSpawner:: -->> ACTIVATION Mission of missionType %1 activated based on blck_debugLevel == 3",_missionType]; + }; + }; + }; +}; +//waitUntil{ { (isPlayer _x && _x distance _coords <= blck_TriggerDistance /*&& vehicle _x == _x*/) || ([_missionStartTime] call _fn_timedOut) } count playableunits > 0 }; + +if (blck_debugON) then +{ + diag_log format["missionSpawner:: MISSION TRIGGER contition _missionType = %4 and playerInRange %1 and timout = %2 and blck_debugLevel = %3",_playerInRange, _missionTimedOut,blck_debugLevel,_missionType]; +}; + +if (_missionTimedOut) exitWith +{ + //["timeOut",_endMsg,_blck_localMissionMarker select 2] call blck_fnc_messageplayers; + [_blck_localMissionMarker select 0] execVM "debug\deleteMarker.sqf"; + _blck_localMissionMarker set [1,[0,0,0]]; + _blck_localMissionMarker set [2,""]; + [_objects, 1] spawn blck_fnc_cleanupObjects; + if (blck_debugON) then + { + diag_log format["[blckeagls] missionSpawner:: Mission Timed Out: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + }; +}; + +if (_playerInRange || blck_debugLevel == 3) then +{ + if (blck_debugON) then + { diag_log format["[blckeagls] missionSpawner:: -- >> Mission tripped by nearby player: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + }; + + if (count _missionLootBoxes > 0) then + { + _crates = [_coords,_missionCfg select 2/* array of crates*/] call blck_fnc_spawnMissionCrates; + } + else + { + _crates = [_coords,[[selectRandom blck_crateTypes /*"Box_NATO_Wps_F"*/,[0,0,0],_crateLoot,_lootCounts]]] call blck_fnc_spawnMissionCrates; + + }; + _objects = _objects + _crates; + + if (blck_debugON) then + { + diag_log format["[blckeagls] missionSpawner:: CRATES SPAWNED: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + }; + + uiSleep _delayTime; + + if (blck_SmokeAtMissions select 0) then // spawn a fire and smoke near the crate + { + private ["_temp"]; + _temp = [_coords,blck_SmokeAtMissions select 1] call blck_fnc_smokeAtCrates; + _objects = _objects + _temp; + }; + uiSleep _delayTime; + if (_useMines) then + { + _mines = [_coords] call blck_fnc_spawnMines; + //waitUntil{!(_mines isEqualTo [];); + uiSleep _delayTime;; + }; + uiSleep _delayTime; + + if (_missionLandscapeMode isEqualTo "random") then + { + _objects = [_coords,_missionLandscape, 3, 15, 2] call blck_fnc_spawnRandomLandscape; + } else { + _objects = [_coords, round(random(360)),_missionLandscape,true] call blck_fnc_spawnCompositionObjects; + }; + if (blck_debugON) then + { + diag_log format["[blckeagls] missionSpawner:: LANDSCAPE SPAWNED: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + }; + + uiSleep _delayTime;; + + if ((count _missionLootVehicles) > 0) then // spawn loot vehicles + { + { + //diag_log format["spawnMissionCVehicles.sqf _x = %1",_x]; + _offset = _x select 1; // offset relative to _coords at which to spawn the vehicle + _pos = [(_coords select 0)+(_offset select 0),(_coords select 1) + (_offset select 1),(_coords select 2)+(_offset select 2)]; + _veh = [_x select 0 /* vehicle class name*/, _pos] call blck_fnc_spawnVehicle; + _vehs pushback _veh; + [_veh,_x select 2 /*loot array*/, _x select 3 /*array of values specifying number of items of each loot type to load*/] call blck_fnc_fillBoxes; + }forEach _missionLootVehicles; + uiSleep _delayTime; + }; + + if (blck_useStatic && (_noEmplacedWeapons > 0)) then + { + private["_static","_count"]; + if ( count (_missionEmplacedWeapons) > 0 ) then + { + _static = _missionCfg select 4 select 1; + _count = _missionCfg select 4 select 0; + } + else + { + _static = blck_staticWeapons; + _count = _noEmplacedWeapons; + }; + private ["_emplacedGroup","_emplacedPositions"]; + + _emplacedPositions = [_coords,_count,35,50] call blck_fnc_findPositionsAlongARadius; + //diag_log format["missionSpawner:: _emplacedPositions = %1",_emplacedPositions]; + { + _emplacedGroup = [_x,1,1,_aiDifficultyLevel,_coords,1,2,_uniforms,_headGear] call blck_fnc_spawnGroup; + //_emplacedUnits = units _emplacedGroup; + _blck_AllMissionAI = _blck_AllMissionAI + (units _emplacedGroup); + _emplacedWeapon = [_x,_emplacedGroup,blck_staticWeapons,5,15] call blck_fnc_spawnEmplacedWeapon; + _missionAIVehicles pushback _emplacedWeapon; + uiSleep _delayTime; + }forEach _emplacedPositions; + //diag_log format["missionSpawner:: emplaced weapons data: _AI_Vehicles %1 _blck_AllMissionAI %1",_AI_Vehicles,_blck_AllMissionAI]; + if (blck_debugON) then + { + diag_log format["[blckeagls] missionSpawner:: STATIC WEAPONS SPAWNED: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + }; + }; + + //diag_log format["_fnc_missionSpawner:: after adding any static weapons, _blck_AllMissionAI is %1",_blck_AllMissionAI]; + if (blck_useVehiclePatrols && (_noVehiclePatrols > 0)) then + { + private["_vehGroup","_patrolVehicle","_vehiclePatrolSpawns"]; + _vehiclePatrolSpawns= [_coords,_noVehiclePatrols,45,60] call blck_fnc_findPositionsAlongARadius; + diag_log format["missionSpawner:: _vehiclePatrolSpawns = %1",_vehiclePatrolSpawns]; + //for "_i" from 1 to _noVehiclePatrols do + { + _vehGroup = [_x,3,3,_aiDifficultyLevel,_coords,1,2,_uniforms,_headGear] call blck_fnc_spawnGroup; + //diag_log format["missionSpawner:: group for AI Patrol vehicle spawn: group is %1 with units of %2",_vehGroup, units _vehGroup]; + _blck_AllMissionAI = _blck_AllMissionAI + (units _vehGroup); + _randomVehicle = blck_AIPatrolVehicles call BIS_fnc_selectRandom; + //diag_log format["missionSpawner:: vehicle selected is %1", _randomVehicle]; + _patrolVehicle = [_coords,_x,_randomVehicle,(_x distance _coords) -5,(_x distance _coords) + 5,_vehGroup] call blck_fnc_spawnVehiclePatrol; + //diag_log format["missionSpawner:: patrol vehicle spawned was %1",_patrolVehicle]; + _vehGroup setVariable["groupVehicle",_patrolVehicle,true]; + //uiSleep _delayTime; + _AI_Vehicles pushback _patrolVehicle; + }forEach _vehiclePatrolSpawns; + //diag_log format["missionSpawner:: vehicle patrols data: _AI_Vehicles %1 _blck_AllMissionAI %1",_AI_Vehicles,_blck_AllMissionAI]; + uiSleep _delayTime; + if (blck_debugON) then + { + diag_log format["[blckeagls] missionSpawner:: VEHICLE PATROLS SPAWNED: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + }; + }; + //diag_log format["_fnc_missionSpawner:: after adding any vehicle patrols, _blck_AllMissionAI is %1",_blck_AllMissionAI]; + //diag_log format["missionSpawner:: _noAIGroups = %1; spawning AI Groups now",_noAIGroups]; + + private["_unitsToSpawn","_unitsPerGroup","_ResidualUnits","_newGroup"]; + _unitsToSpawn = round(_minNoAI + round(random(_maxNoAI - _minNoAI))); + _unitsPerGroup = floor(_unitsToSpawn/_noAIGroups); + _ResidualUnits = _unitsToSpawn - (_unitsPerGroup * _noAIGroups); + //diag_log format["missionSpawner:: _unitsToSpawn %1 ; _unitsPerGroup %2 _ResidualUnits %3",_unitsToSpawn,_unitsPerGroup,_ResidualUnits]; + switch (_noAIGroups) do + { + case 1: { // spawn the group near the mission center + //params["_pos", ["_numai1",5], ["_numai2",10], ["_skillLevel","red"], "_center", ["_minDist",20], ["_maxDist",35], ["_uniforms",blck_SkinList], ["_headGear",blck_headgear] ]; + _newGroup = [_coords,_unitsToSpawn,_unitsToSpawn,_aiDifficultyLevel,_coords,3,18,_uniforms,_headGear] call blck_fnc_spawnGroup; + _newAI = units _newGroup; + _blck_AllMissionAI = _blck_AllMissionAI + _newAI; + //diag_log format["missionSpawner: Spawning Groups: _noAIGroups=1 _newGroup=%1 _newAI = %2",_newGroup, _newAI]; + }; + case 2: { + //diag_log format["missionSpawner: Spawning Groups: _noAIGroups=2"]; // spawn groups on either side of the mission area + _groupLocations = [_coords,_noAIGroups,15,30] call blck_fnc_findPositionsAlongARadius; + { + private["_adjusttedGroupSize"]; + if (_ResidualUnits > 0) then + { + _adjusttedGroupSize = _unitsPerGroup + _ResidualUnits; + _ResidualUnits = 0; + } else { + _adjusttedGroupSize = _unitsPerGroup; + }; + _newGroup = [_x,_adjusttedGroupSize,_adjusttedGroupSize,_aiDifficultyLevel,_coords,1,12,_uniforms,_headGear] call blck_fnc_spawnGroup; + _newAI = units _newGroup; + _blck_AllMissionAI = _blck_AllMissionAI + _newAI; + //diag_log format["missionSpawner: Spawning 2 Groups: _newGroup=%1 _newAI = %2",_newGroup, _newAI]; + }forEach _groupLocations; + + }; + case 3: { // spawn one group near the center of the mission and the rest on the perimeter + //diag_log format["missionSpawner: Spawning Groups: _noAIGroups=3"]; + _newGroup = [_coords,_unitsPerGroup + _ResidualUnits,_unitsPerGroup + _ResidualUnits,_aiDifficultyLevel,_coords,1,12,_uniforms,_headGear] call blck_fnc_spawnGroup; + _newAI = units _newGroup; + _blck_AllMissionAI = _blck_AllMissionAI + _newAI; + //diag_log format["missionSpawner: Spawning Groups: _noAIGroups=3 _newGroup=%1 _newAI = %2",_newGroup, _newAI]; + _groupLocations = [_coords,2,20,35] call blck_fnc_findPositionsAlongARadius; + { + _newGroup = [_x,_unitsPerGroup,_unitsPerGroup,_aiDifficultyLevel,_coords,1,12,_uniforms,_headGear] call blck_fnc_spawnGroup; + _newAI = units _newGroup; + _blck_AllMissionAI = _blck_AllMissionAI + _newAI; + //diag_log format["missionSpawner: Spawning 2 Groups:_newGroup=%1 _newAI = %2",_newGroup, _newAI]; + }forEach _groupLocations; + + }; + default { // spawn one group near the center of the mission and the rest on the perimeter + //diag_log format["missionSpawner: Spawning Groups: _noAIGroups=default"]; + _newGroup = [_coords,_unitsPerGroup + _ResidualUnits,_unitsPerGroup + _ResidualUnits,_aiDifficultyLevel,_coords,1,12,_uniforms,_headGear] call blck_fnc_spawnGroup; + _newAI = units _newGroup; + _blck_AllMissionAI = _blck_AllMissionAI + _newAI; + //diag_log format["missionSpawner: Spawning Groups: _noAIGroups=%3 _newGroup=%1 _newAI = %2",_newGroup, _newAI,_noAIGroups]; + _groupLocations = [_coords,(_noAIGroups - 1),20,40] call blck_fnc_findPositionsAlongARadius; + { + _newGroup = [_x,_unitsPerGroup,_unitsPerGroup,_aiDifficultyLevel,_coords,1,12,_uniforms,_headGear] call blck_fnc_spawnGroup; + _newAI = units _newGroup; + _blck_AllMissionAI = _blck_AllMissionAI + _newAI; + //diag_log format["missionSpawner: Spawning %3 Groups: _newGroup=%1 _newAI = %2",_newGroup, _newAI,_noAIGroups]; + }forEach _groupLocations; + }; + }; + + if (blck_debugON) then + { + diag_log format["[blckeagls] missionSpawner:: AI PATROLS SPAWNED: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + }; + + if ((random(1) < _chanceReinforcements)) then + { + _weaponList = blck_WeaponList_Red; + + switch (_aiDifficultyLevel) do { + case "blue": {_weaponList = blck_WeaponList_Blue;}; + case "red": {_weaponList = blck_WeaponList_Red;}; + case "green": {_weaponList = blck_WeaponList_Green;}; + case "orange": {_weaponList = blck_WeaponList_Orange;}; + default {_weaponList = blck_WeaponList_Blue;}; + }; + + diag_log format["missionSpawner:: weaponList = %1",_weaponList]; + private["_grpReinforcements"]; + _grpReinforcements = grpNull; + + diag_log format["[blckeagls] missionSpawner:: calling in reinforcements: Current mission: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + [] spawn { + //[_coords,_noPara,_aiDifficultyLevel,_chanceLoot,_reinforcementLootCounts,_weaponList,_uniforms,_headgear,_chanceHeliPatrol] call blck_fnc_Reinforcements; + //waitUntil {_grpReinforcements != grpNull}; + //diag_log format["[blckeagls] missionSpawner::reinforcement spawner started: Current mission: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + }; + if !(_grpReinforcements isEqualTo grpNull) then + { + _blck_AllMissionAI = _blck_AllMissionAI + (units _grpReinforcements); + //diag_log format["missionSpawner:: _grpReinforcements = %1",_grpReinforcements]; + }; + }; + + // Trigger for mission end + //diag_log format["[blckeagls] mission Spawner _endCondition = %1",_endCondition]; + private["_missionComplete"]; + _missionComplete = -1; + + _endIfPlayerNear = false; + _endIfAIKilled = false; + _startTime = diag_tickTime; + _missionTimedOut = false; + + switch (_endCondition) do + { + case "playerNear": {_endIfPlayerNear = true;}; + case "allUnitsKilled": {_endIfAIKilled = true;}; + case "allKilledOrPlayerNear": {_endIfPlayerNear = true;_endIfAIKilled = true;}; + }; + //diag_log format["missionSpawner :: _endIfPlayerNear = %1 _endIfAIKilled= %2",_endIfPlayerNear,_endIfAIKilled]; + private["_locations"]; + _locations = [_coords] + _crates; + + //diag_log format["missionSpawner:: Waiting for player to satisfy mission end criteria of _endIfPlayerNear %1 with _endIfAIKilled %2",_endIfPlayerNear,_endIfAIKilled]; + while {_missionComplete == -1} do + { + if (_endIfPlayerNear) then { + if ( { (isPlayer _x) && ([_x,_locations,20] call blck_fnc_playerInRange) && (vehicle _x == _x) } count playableunits > 0) then { + _missionComplete = 1; + }; + }; + //diag_log format["missionSpawner:: count alive _blck_AllMissionAI = %1",{alive _x} count _blck_AllMissionAI]; + if (_endIfAIKilled) then { + if (({alive _x} count _blck_AllMissionAI) < 1 ) then { + _missionComplete = 1; + //diag_log format["missionSpawner:: _blck_AllMissionAI = %1","testing case _endIfAIKilled"]; + }; + }; + if (blck_debugLevel == 3) then + { + uiSleep 60; + _missionComplete = 1; + diag_log format["_fnc_missionSpawner:: -- >> Mission of missionType %1 was Tripped based on blck_debugLevel == 3",_missionType]; + }; + uiSleep 2; + }; + + if (blck_debugON) then + { + diag_log format["[blckeagls] missionSpawner:: Mission COMPLETION CRITERIA FULFILLED: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4 : blck_debugLevel = %5",_coords,_missionType,_aiDifficultyLevel,_markerMissionName,blck_debugLevel]; + }; + + if (blck_useSignalEnd) then + { + //diag_log format["**** Minor\SM1.sqf:: _crate = %1",_crates select 0]; + [_crates select 0] spawn blck_fnc_signalEnd; + + if (blck_debugON) then + { + diag_log format["[blckeagls] missionSpawner:: SignalEnd called: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; + }; + }; + [_mines] spawn blck_fnc_clearMines; + [_objects, blck_cleanupCompositionTimer] call blck_fnc_addObjToQue; + [_blck_AllMissionAI,blck_AliveAICleanUpTime] call blck_fnc_addLiveAItoQue; + ["end",_endMsg,_blck_localMissionMarker select 2] call blck_fnc_messageplayers; + [_blck_localMissionMarker select 1, _missionType] execVM "debug\missionCompleteMarker.sqf"; + [_blck_localMissionMarker select 0] execVM "debug\deleteMarker.sqf"; + [_blck_localMissionMarker select 0,"Completed"] call blck_fnc_updateMissionQue; + diag_log format["[blckeagls] missionSpawner:: end of mission: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; +}; diff --git a/@epochhive/addons/custom_server/Compiles/Missions/GMS_fnc_missionSpawner.sqf b/@epochhive/addons/custom_server/Compiles/Missions/GMS_fnc_missionSpawner.sqf index f2fd061..981f002 100644 --- a/@epochhive/addons/custom_server/Compiles/Missions/GMS_fnc_missionSpawner.sqf +++ b/@epochhive/addons/custom_server/Compiles/Missions/GMS_fnc_missionSpawner.sqf @@ -35,7 +35,7 @@ if (isNil "_chanceReinforcements") then _chanceHeliPatrol = 0; _chanceLoot = 0; }; -private["_timeOut"]; // _timeOut is the time in seconds after which a mission is deactivated. +private["_timeOut","_blck_AllMissionAI"]; // _timeOut is the time in seconds after which a mission is deactivated. if (isNil "_markerColor") then {_markerColor = "ColorBlack"}; if (isNil "_markerType") then {_markerType = ["mil_box",[]]}; if (isNil "_timeOut") then {_timeOut = -1;}; @@ -57,11 +57,12 @@ else //diag_log "missionSpawner:: Mission specific values used for _reinforcementLootCounts"; }; -if (blck_debugON) then { +if (blck_debugON) exitWith { diag_log format["[blckEagle] Mission Reinforcement Parameters: changeReinforcements %1 numAI %2 changePatrol %3 chanceLoot %4",_chanceReinforcements,_noPara,_chanceHeliPatrol,_chanceLoot]; + [_blck_localMissionMarker select 0,"Completed"] call blck_fnc_updateMissionQue; }; -private["_useMines"]; +private["_useMines","_abortMissionSpawner","_blck_AllMissionAI","_delayTime","_groupPatrolRadius"]; if (isNil "_useMines") then {_useMines = blck_useMines; /*diag_log "[blckEagles] Using default setting for _useMines";*/}; _objects = []; @@ -74,6 +75,14 @@ _AI_Vehicles = []; _blck_localMissionMarker = [_missionType,_coords,"","",_markerColor,_markerType]; _delayTime = 1; _groupPatrolRadius = 50; +_abortMissionSpawner = false; + +if ((_noEmplacedWeapons + _noAIGroups + _noVehiclePatrols + ([] call blck_fnc_groupsOnAISide)) > 140) then { + // There are insufficient groups available within the 144 group per side maximum to spawn the entire mission + // Log the Error Condition + diag_log format["[blckeagls] ERROR CONDITION: Mission spawner aborted. Insufficient groups available to spawn entire mission | %1 groups used", [] call blck_fnc_groupsOnAISide]; + +}; // max groups per side = 144; leave a safety factor of 4 groups. if (blck_labelMapMarkers select 0) then { @@ -106,6 +115,10 @@ _fn_playerWithinRange = { _return; }; +_fnc_abortMissionSpawner = { + +}; + uiSleep 1; ///////////////////////////// // Everything has been set up for the mission and it is now waiting to be triggered by a nearby player or to time out. @@ -250,11 +263,15 @@ if (_playerInRange) then //diag_log format["missionSpawner:: _emplacedPositions = %1",_emplacedPositions]; { _emplacedGroup = [_x,1,1,_aiDifficultyLevel,_coords,1,2,_uniforms,_headGear] call blck_fnc_spawnGroup; - //_emplacedUnits = units _emplacedGroup; - _blck_AllMissionAI = _blck_AllMissionAI + (units _emplacedGroup); - _emplacedWeapon = [_x,_emplacedGroup,blck_staticWeapons,5,15] call blck_fnc_spawnEmplacedWeapon; - _missionAIVehicles pushback _emplacedWeapon; - uiSleep _delayTime; + if !(isNull _emplacedGroup) then + { + _blck_AllMissionAI = _blck_AllMissionAI + (units _emplacedGroup); + _emplacedWeapon = [_x,_emplacedGroup,blck_staticWeapons,5,15] call blck_fnc_spawnEmplacedWeapon; + _missionAIVehicles pushback _emplacedWeapon; + uiSleep _delayTime; + } exitWith { + _abortMissionSpawner = true; + }; }forEach _emplacedPositions; //diag_log format["missionSpawner:: emplaced weapons data: _AI_Vehicles %1 _blck_AllMissionAI %1",_AI_Vehicles,_blck_AllMissionAI]; if (blck_debugON) then @@ -276,11 +293,16 @@ if (_playerInRange) then switch (_noAIGroups) do { case 1: { // spawn the group near the mission center - //params["_pos", ["_numai1",5], ["_numai2",10], ["_skillLevel","red"], "_center", ["_minDist",20], ["_maxDist",35], ["_uniforms",blck_SkinList], ["_headGear",blck_headgear] ]; - _newGroup = [_coords,_unitsToSpawn,_unitsToSpawn,_aiDifficultyLevel,_coords,3,18,_uniforms,_headGear] call blck_fnc_spawnGroup; - _newAI = units _newGroup; - _blck_AllMissionAI = _blck_AllMissionAI + _newAI; - //diag_log format["missionSpawner: Spawning Groups: _noAIGroups=1 _newGroup=%1 _newAI = %2",_newGroup, _newAI]; + //params["_pos", ["_numai1",5], ["_numai2",10], ["_skillLevel","red"], "_center", ["_minDist",20], ["_maxDist",35], ["_uniforms",blck_SkinList], ["_headGear",blck_headgear] ]; + _newGroup = [_coords,_unitsToSpawn,_unitsToSpawn,_aiDifficultyLevel,_coords,3,18,_uniforms,_headGear] call blck_fnc_spawnGroup; + if !(isNull _newGroup) then + { + _newAI = units _newGroup; + _blck_AllMissionAI = _blck_AllMissionAI + _newAI; + //diag_log format["missionSpawner: Spawning Groups: _noAIGroups=1 _newGroup=%1 _newAI = %2",_newGroup, _newAI]; + } else { + _abortMissionSpawner = true; + }; }; case 2: { //diag_log format["missionSpawner: Spawning Groups: _noAIGroups=2"]; // spawn groups on either side of the mission area @@ -295,6 +317,7 @@ if (_playerInRange) then _adjusttedGroupSize = _unitsPerGroup; }; _newGroup = [_x,_adjusttedGroupSize,_adjusttedGroupSize,_aiDifficultyLevel,_coords,1,12,_uniforms,_headGear] call blck_fnc_spawnGroup; + if (isNull _newGroup) exitWith {_abortMissionSpawner = true;}; _newAI = units _newGroup; _blck_AllMissionAI = _blck_AllMissionAI + _newAI; //diag_log format["missionSpawner: Spawning 2 Groups: _newGroup=%1 _newAI = %2",_newGroup, _newAI]; @@ -304,17 +327,20 @@ if (_playerInRange) then case 3: { // spawn one group near the center of the mission and the rest on the perimeter //diag_log format["missionSpawner: Spawning Groups: _noAIGroups=3"]; _newGroup = [_coords,_unitsPerGroup + _ResidualUnits,_unitsPerGroup + _ResidualUnits,_aiDifficultyLevel,_coords,1,12,_uniforms,_headGear] call blck_fnc_spawnGroup; - _newAI = units _newGroup; - _blck_AllMissionAI = _blck_AllMissionAI + _newAI; - //diag_log format["missionSpawner: Spawning Groups: _noAIGroups=3 _newGroup=%1 _newAI = %2",_newGroup, _newAI]; - _groupLocations = [_coords,2,20,35] call blck_fnc_findPositionsAlongARadius; + if (isNull _newGroup) then {_abortMissionSpawner = true;} else { - _newGroup = [_x,_unitsPerGroup,_unitsPerGroup,_aiDifficultyLevel,_coords,1,12,_uniforms,_headGear] call blck_fnc_spawnGroup; _newAI = units _newGroup; _blck_AllMissionAI = _blck_AllMissionAI + _newAI; - //diag_log format["missionSpawner: Spawning 2 Groups:_newGroup=%1 _newAI = %2",_newGroup, _newAI]; - }forEach _groupLocations; - + //diag_log format["missionSpawner: Spawning Groups: _noAIGroups=3 _newGroup=%1 _newAI = %2",_newGroup, _newAI]; + _groupLocations = [_coords,2,20,35] call blck_fnc_findPositionsAlongARadius; + { + _newGroup = [_x,_unitsPerGroup,_unitsPerGroup,_aiDifficultyLevel,_coords,1,12,_uniforms,_headGear] call blck_fnc_spawnGroup; + if (isNull _newGroup) exitWith {_abortMissionSpawner = true;}; + _newAI = units _newGroup; + _blck_AllMissionAI = _blck_AllMissionAI + _newAI; + //diag_log format["missionSpawner: Spawning 2 Groups:_newGroup=%1 _newAI = %2",_newGroup, _newAI]; + }forEach _groupLocations; + }; }; default { // spawn one group near the center of the mission and the rest on the perimeter //diag_log format["missionSpawner: Spawning Groups: _noAIGroups=default"]; @@ -325,6 +351,7 @@ if (_playerInRange) then _groupLocations = [_coords,(_noAIGroups - 1),20,40] call blck_fnc_findPositionsAlongARadius; { _newGroup = [_x,_unitsPerGroup,_unitsPerGroup,_aiDifficultyLevel,_coords,1,12,_uniforms,_headGear] call blck_fnc_spawnGroup; + if (isNull _newGroup) exitWith {_abortMissionSpawner = true;}; _newAI = units _newGroup; _blck_AllMissionAI = _blck_AllMissionAI + _newAI; //diag_log format["missionSpawner: Spawning %3 Groups: _newGroup=%1 _newAI = %2",_newGroup, _newAI,_noAIGroups]; @@ -349,21 +376,12 @@ if (_playerInRange) then default {_weaponList = blck_WeaponList_Blue;}; }; - //diag_log format["missionSpawner:: weaponList = %1",_weaponList]; - private["_grpReinforcements"]; - _grpReinforcements = grpNull; - diag_log format["[blckeagls] missionSpawner:: calling in reinforcements: Current mission: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; [] spawn { //[_coords,_noPara,_aiDifficultyLevel,_chanceLoot,_reinforcementLootCounts,_weaponList,_uniforms,_headgear,_chanceHeliPatrol] call blck_fnc_Reinforcements; //waitUntil {_grpReinforcements != grpNull}; //diag_log format["[blckeagls] missionSpawner::reinforcement spawner started: Current mission: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; }; - if !(_grpReinforcements isEqualTo grpNull) then - { - _blck_AllMissionAI = _blck_AllMissionAI + (units _grpReinforcements); - //diag_log format["missionSpawner:: _grpReinforcements = %1",_grpReinforcements]; - }; }; if (blck_useVehiclePatrols && (_noVehiclePatrols > 0)) then @@ -374,6 +392,7 @@ if (_playerInRange) then //for "_i" from 1 to _noVehiclePatrols do { _vehGroup = [_x,3,3,_aiDifficultyLevel,_coords,1,2,_uniforms,_headGear] call blck_fnc_spawnGroup; + if (isNull _vehGroup) exitWith {_abortMissionSpawner = true;}; //diag_log format["missionSpawner:: group for AI Patrol vehicle spawn: group is %1 with units of %2",_vehGroup, units _vehGroup]; _blck_AllMissionAI = _blck_AllMissionAI + (units _vehGroup); _randomVehicle = blck_AIPatrolVehicles call BIS_fnc_selectRandom; @@ -391,6 +410,22 @@ if (_playerInRange) then diag_log format["[blckeagls] missionSpawner:: Vehicle Patrols Spawned: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; }; }; + + if (_abortMissionSpawner) then + { + // discard everything + {deleteVehicle _x} forEach _objects; + {deleteVehicle _x} forEach _mines; + {deleteVehicle _x} forEach _crates; + {deleteVehicle _x} forEach _blck_AllMissionAI; + {deleteVehicle _x} forEach _AI_Vehicles; + // set the mission status to waiting + [_blck_localMissionMarker select 0,"Completed"] call blck_fnc_updateMissionQue; + uiSleep 1; + // delete any empty groups left over from the cleanup. + [] call blck_fnc_cleanEmptyGroups; + + }; // Trigger for mission end //diag_log format["[blckeagls] mission Spawner _endCondition = %1",_endCondition]; private["_missionComplete"]; @@ -416,7 +451,7 @@ if (_playerInRange) then { if (blck_debugLevel isEqualTo 3) then { - uiSleep 120; + uiSleep 240; _missionComplete = 1; } else { if (_endIfPlayerNear) then { @@ -456,6 +491,6 @@ if (_playerInRange) then [["end",_endMsg,_blck_localMissionMarker select 2]] call blck_fnc_messageplayers; [_blck_localMissionMarker select 1, _missionType] execVM "debug\missionCompleteMarker.sqf"; [_blck_localMissionMarker select 0] execVM "debug\deleteMarker.sqf"; - //[_blck_localMissionMarker select 0,"Completed"] call blck_fnc_updateMissionQue; + [_blck_localMissionMarker select 0,"Completed"] call blck_fnc_updateMissionQue; diag_log format["[blckeagls] missionSpawner:: end of mission: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName]; }; diff --git a/@epochhive/addons/custom_server/Compiles/Missions/GMS_fnc_updateMissionQue.sqf b/@epochhive/addons/custom_server/Compiles/Missions/GMS_fnc_updateMissionQue.sqf index 56ad3e9..61d3da7 100644 --- a/@epochhive/addons/custom_server/Compiles/Missions/GMS_fnc_updateMissionQue.sqf +++ b/@epochhive/addons/custom_server/Compiles/Missions/GMS_fnc_updateMissionQue.sqf @@ -6,12 +6,12 @@ */ params["_mission","_status",["_coords",[0,0,0]] ]; -//diag_log format["_fnc_updateMissionQue :: _mission = %1 | _status = %2 | _coords = %3",_mission,_status,_coords]; +diag_log format["_fnc_updateMissionQue :: _mission = %1 | _status = %2 | _coords = %3",_mission,_status,_coords]; { if (_mission isEqualTo (_x select 2)) exitWith { private _element = _x; - //diag_log format ["_fnc_updateMissionQue :: _element = %1",_element]; + diag_log format ["_fnc_updateMissionQue :: _element = %1",_element]; blck_pendingMissions = blck_pendingMissions - _element; if (toLower(_status) isEqualTo "active") then { _element set[6, -1]; @@ -23,9 +23,9 @@ params["_mission","_status",["_coords",[0,0,0]] ]; _element set[6, _waitTime]; _element set [7,[0,0,0]]; }; - //diag_log format["_fnc_updateMissionQue:: -- >> _element updated from %1 to %2",_x,_element]; + diag_log format["_fnc_updateMissionQue:: -- >> _element updated from %1 to %2",_x,_element]; blck_pendingMissions pushback _element; - //diag_log format ["_fnc_updateMissionQue :: blck_pendingMissions updated to %1",blck_pendingMissions]; + diag_log format ["_fnc_updateMissionQue :: blck_pendingMissions updated to %1",blck_pendingMissions]; }; }forEach blck_pendingMissions; diff --git a/@epochhive/addons/custom_server/Compiles/TimeAccel/GMS_fnc_Time.sqf b/@epochhive/addons/custom_server/Compiles/TimeAccel/GMS_fnc_Time.sqf index b1923cc..7c2c50f 100644 --- a/@epochhive/addons/custom_server/Compiles/TimeAccel/GMS_fnc_Time.sqf +++ b/@epochhive/addons/custom_server/Compiles/TimeAccel/GMS_fnc_Time.sqf @@ -1,12 +1,14 @@ // GMS_fnc_time.sqf // by Ghostrider-DBD_ -// +// Last Updated 12/21/16 // Creds to AWOL, A3W, LouD and Creampie for insights. if (!isServer) exitWith {}; /* - blck_timeAcceleration = true; // When true, time acceleration will be periodically updated based on amount of daylight at that time according to the values below. + blck_timeAcceleration = true; // When true, time acceleration will be periodically updated based on amount of daylight at that time according to the values below + // which can be set using the corresponding variables in the config file for that mod. + blck_timeAccelerationDay = 1; // Daytime time accelearation blck_timeAccelerationDusk = 3; // Dawn/dusk time accelearation blck_timeAccelerationNight = 6; // Nighttim time acceleration @@ -16,7 +18,7 @@ _arr = date call BIS_fnc_sunriseSunsetTime; _sunrise = _arr select 0; _sunset = _arr select 1; _time = dayTime; -diag_log format["_fnc_Time:: -- > _sunrise = %1 | _sunset = %2 | _time = %3",_sunrise,_sunset,_time]; +//diag_log format["_fnc_Time:: -- > _sunrise = %1 | _sunset = %2 | _time = %3",_sunrise,_sunset,_time]; // Night if (_time > (_sunset + 0.5) || _time < (_sunrise - 0.5)) exitWith {setTimeMultiplier blck_timeAccelerationNight; diag_log format["NIGHT TIMGE ADJUSTMENT:: time accel updated to %1; time of day = %2",timeMultiplier,dayTime];}; diff --git a/@epochhive/addons/custom_server/Compiles/Units/GMS_fnc_cleanupAliveAI.sqf b/@epochhive/addons/custom_server/Compiles/Units/GMS_fnc_cleanupAliveAI.sqf index a76c6ab..ef6be0e 100644 --- a/@epochhive/addons/custom_server/Compiles/Units/GMS_fnc_cleanupAliveAI.sqf +++ b/@epochhive/addons/custom_server/Compiles/Units/GMS_fnc_cleanupAliveAI.sqf @@ -41,4 +41,4 @@ params["_aiList"]; deleteVehicle _ai; }; }forEach _aiList; -//diag_log format["_fnc_cleanupAliveAI:: AI Cleanup Completed"]; +diag_log format["_fnc_cleanupAliveAI:: AI Cleanup Completed"]; diff --git a/@epochhive/addons/custom_server/Compiles/Vehicles/GMS_fnc_spawnEmplaced.sqf b/@epochhive/addons/custom_server/Compiles/Vehicles/GMS_fnc_spawnEmplaced.sqf index 241010c..218ecb6 100644 --- a/@epochhive/addons/custom_server/Compiles/Vehicles/GMS_fnc_spawnEmplaced.sqf +++ b/@epochhive/addons/custom_server/Compiles/Vehicles/GMS_fnc_spawnEmplaced.sqf @@ -4,9 +4,8 @@ private["_emplaced","_safepos","_emp","_gunner"]; params["_pos","_emplacedGroup","_emplacedTypes",["_minDist",20],["_maxDist",35] ]; - -if (isNull _emplacedGroup) exitWith {}; - +if (isNull _emplacedGroup) exitWith {diag_log "[blckeagls] ERROR CONDITION:-->> NULL-GROUP Provided to _fnc_spawnEmplaced"; objNull;}; +diag_log format["_fnc_spawnEmplacedGroup:: -- >> _emplacedGroup = %1",_emplacedGroup]; _safepos = [_pos,_minDist,_maxDist,0,0,20,0] call BIS_fnc_findSafePos; _emplaced = selectRandom _emplacedTypes; _emp = [_emplaced,_safepos] call blck_fnc_spawnVehicle; diff --git a/@epochhive/addons/custom_server/Compiles/Vehicles/GMS_fnc_spawnVehiclePatrol.sqf b/@epochhive/addons/custom_server/Compiles/Vehicles/GMS_fnc_spawnVehiclePatrol.sqf index 61330b4..f4de1b8 100644 --- a/@epochhive/addons/custom_server/Compiles/Vehicles/GMS_fnc_spawnVehiclePatrol.sqf +++ b/@epochhive/addons/custom_server/Compiles/Vehicles/GMS_fnc_spawnVehiclePatrol.sqf @@ -16,8 +16,8 @@ params["_center","_pos",["_vehType","I_G_Offroad_01_armed_F"],["_minDis",30],["_ //_maxDis = maximum distance from the center of the mission for vehicle waypoints //_groupForVehiclePatrol = The group with which to man the vehicle -if (isNull _group) exitWith {diag_log "[blckeagls] ERROR CONDITION:-->> NULL-GROUP Provided to _fnc_spawnVehiclePatrol"}; - +if (isNull _group) exitWith {diag_log "[blckeagls] ERROR CONDITION:-->> NULL-GROUP Provided to _fnc_spawnVehiclePatrol"; objNull;}; +diag_log format["_fnc_spawnVehiclePatrol::->> _group = %1",_group]; _safepos = [_pos,0,25,0,0,20,0] call BIS_fnc_findSafePos; _veh = [_vehType,_safepos] call blck_fnc_spawnVehicle; diff --git a/@epochhive/addons/custom_server/Compiles/blck_functions.sqf b/@epochhive/addons/custom_server/Compiles/blck_functions.sqf index 12998f6..1d5733b 100644 --- a/@epochhive/addons/custom_server/Compiles/blck_functions.sqf +++ b/@epochhive/addons/custom_server/Compiles/blck_functions.sqf @@ -14,7 +14,8 @@ blck_fnc_findPositionsAlongARadius = compileFinal preprocessFileLineNumbers "\ blck_fnc_giveTakeCrypto = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Functions\GMS_fnc_giveTakeCrypto.sqf"; blck_fnc_monitorHC = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Functions\GMS_fnc_monitorHC.sqf"; blck_fnc_timeAcceleration = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\TimeAccel\GMS_fnc_Time.sqf"; -blck_fnc_getModType = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Functions\GMS_getModType.sqf"; // Test if Epoch or Exile is loaded +blck_fnc_getModType = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Functions\GMS_fnc_getModType.sqf"; // Test if Epoch or Exile is loaded +blck_fnc_groupsOnAISide = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Functions\GMS_fnc_GroupsOnAISide.sqf"; // Returns the number of groups on the side used by AI // Player-related functions blck_fnc_rewardKiller = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Units\GMS_fnc_rewardKiller.sqf"; @@ -24,8 +25,8 @@ blck_fnc_MessagePlayers = compileFinal preprocessFileLineNumbers "\q\addons\cus // Mission-related functions blck_fnc_missionTimer = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_missionTimer.sqf"; -//blck_fnc_addMissionToQue = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_addMissionToQue.sqf"; // -//blck_fnc_updateMissionQue = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_updateMissionQue.sqf"; // +blck_fnc_addMissionToQue = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_addMissionToQue.sqf"; // +blck_fnc_updateMissionQue = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_updateMissionQue.sqf"; // blck_fnc_addLiveAItoQue = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_addLiveAItoQue.sqf"; blck_fnc_addObjToQue = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_addObjToQue.sqf"; // blck_fnc_playerInRange = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_playerInRange.sqf"; diff --git a/@epochhive/addons/custom_server/Compiles/blck_variables.sqf b/@epochhive/addons/custom_server/Compiles/blck_variables.sqf index 67016fe..300ba4f 100644 --- a/@epochhive/addons/custom_server/Compiles/blck_variables.sqf +++ b/@epochhive/addons/custom_server/Compiles/blck_variables.sqf @@ -7,7 +7,7 @@ */ //blck_variablesLoaded = false; blck_debugON = false; -blck_debugLevel = 0; // Reserved for future use. +blck_debugLevel = 0; // Reserved for certain testing modes. blck_minFPS = 10; //////////////////////////////////////////////// diff --git a/@epochhive/addons/custom_server/Configs/blck_configs_epoch.sqf b/@epochhive/addons/custom_server/Configs/blck_configs_epoch.sqf index 8d7ac6e..f1f1add 100644 --- a/@epochhive/addons/custom_server/Configs/blck_configs_epoch.sqf +++ b/@epochhive/addons/custom_server/Configs/blck_configs_epoch.sqf @@ -94,8 +94,6 @@ Last modified 8/1/15 blck_enableGreenMissions = 1; blck_enableRedMissions = 1; blck_enableBlueMissions = 1; - blck_enableHunterMissions = 1; - blck_enableScoutsMissions = 1; // AI VEHICLE PATROL PARAMETERS //Defines how many AI Vehicles to spawn. Set this to -1 to disable spawning of static weapons or vehicles. To discourage players runniing with with vehicles, spawn more B_GMG_01_high @@ -123,20 +121,12 @@ Last modified 8/1/15 blck_TMin_Green = 200; blck_TMin_Blue = 120; blck_TMin_Red = 150; - blck_TMin_Hunter = 120; - blck_TMin_Scouts = 115; - blck_TMin_Crashes = 115; - blck_TMin_UMS = 200; //Maximum Spawn time between missions in seconds blck_TMax_Orange = 360; blck_TMax_Green = 300; blck_TMax_Blue = 200; blck_TMax_Red = 250; - blck_TMax_Hunter = 200; - blck_TMax_Scouts = 200; - blck_TMax_Crashes = 200; - blck_TMax_UMS = 280; blck_MissionTimout = 40*60; // 40 min diff --git a/@epochhive/addons/custom_server/Configs/blck_configs_exile.sqf b/@epochhive/addons/custom_server/Configs/blck_configs_exile.sqf index 8c6c0be..00042e2 100644 --- a/@epochhive/addons/custom_server/Configs/blck_configs_exile.sqf +++ b/@epochhive/addons/custom_server/Configs/blck_configs_exile.sqf @@ -96,8 +96,6 @@ Last modified 8/1/15 blck_enableGreenMissions = 1; blck_enableRedMissions = 1; blck_enableBlueMissions = 1; - blck_enableHunterMissions = 1; - blck_enableScoutsMissions = 1; // AI VEHICLE PATROL PARAMETERS //Defines how many AI Vehicles to spawn. Set this to -1 to disable spawning of static weapons or vehicles. To discourage players runniing with with vehicles, spawn more B_GMG_01_high @@ -129,26 +127,15 @@ Last modified 8/1/15 blck_TMin_Green = 200; blck_TMin_Blue = 120; blck_TMin_Red = 150; - blck_TMin_Hunter = 120; - blck_TMin_Scouts = 115; - blck_TMin_Crashes = 115; - blck_TMin_UMS = 200; //Maximum Spawn time between missions in seconds blck_TMax_Orange = 360; blck_TMax_Green = 300; blck_TMax_Blue = 200; blck_TMax_Red = 250; - blck_TMax_Hunter = 200; - blck_TMax_Scouts = 200; - blck_TMax_Crashes = 200; - blck_TMax_UMS = 280; blck_MissionTimout = 40*60; // 40 min - // Define the maximum number of crash sites on the map at any one time - blck_maxCrashSites = 3; // recommended settings: 3 for Altis, 2 for Tanoa, 1 for smaller maps. Set to -1 to disable - blck_maxDynamicUnderwaterMissions = 3; /**************************************************************** GENERAL AI SETTINGS diff --git a/@epochhive/addons/custom_server/changeLog.sqf b/@epochhive/addons/custom_server/changeLog.sqf index 2f3f8ed..8e4fe61 100644 --- a/@epochhive/addons/custom_server/changeLog.sqf +++ b/@epochhive/addons/custom_server/changeLog.sqf @@ -4,6 +4,14 @@ Loosely based on the AI mission system by blckeagls ver 2.0.2 Contributions by Narines: bug fixes, testing, 'fired' event handler Ideas or code from that by Vampire and KiloSwiss have been used for certain functions. +12/21/16 Version 6.50 Build 21 +Added a check for mod type to the routine that deletes empty groups as this is only needed for Epoch. +Added back the code that (a) eliminates the mission timers and (b) allows multiple instances of a mission to be spawned. + +12/20/16 Version 6.46 Buid 20 +Moved Variables for time acceleration to the config files. +Reworked code for time acceleration to use timeDay and BIS_fnc_sunriseSunsetTime. + 11/20/16 Build 6.45 Build 19 Added Option to display mission information in Toasts (Exile Only). Fixed an issue related to bugs in Arma 1.66 diff --git a/@epochhive/addons/custom_server/init/blck_init.sqf b/@epochhive/addons/custom_server/init/blck_init.sqf index bbc866a..3045f26 100644 --- a/@epochhive/addons/custom_server/init/blck_init.sqf +++ b/@epochhive/addons/custom_server/init/blck_init.sqf @@ -89,23 +89,27 @@ if (blck_spawnStaticLootCrates) then blck_spawnStaticLootCrates = nil; //Start the mission timers +if (blck_enableOrangeMissions > 0) then +{ + //[_missionListOrange,_pathOrange,"OrangeMarker","orange",blck_TMin_Orange,blck_TMax_Orange] spawn blck_fnc_missionTimer;//Starts major mission system (Orange Map Markers) + [_missionListOrange,_pathOrange,"OrangeMarker","orange",blck_TMin_Orange,blck_TMax_Orange,blck_enableOrangeMissions] call blck_fnc_addMissionToQue; +}; +if (blck_enableGreenMissions > 0) then +{ + //[_missionListGreen,_pathGreen,"GreenMarker","green",blck_TMin_Green,blck_TMax_Green] spawn blck_fnc_missionTimer;//Starts major mission system 2 (Green Map Markers) + [_missionListGreen,_pathGreen,"GreenMarker","green",blck_TMin_Green,blck_TMax_Green,blck_enableGreenMissions] call blck_fnc_addMissionToQue; +}; +if (blck_enableRedMissions > 0) then +{ + //[_missionListRed,_pathRed,"RedMarker","red",blck_TMin_Red,blck_TMax_Red] spawn blck_fnc_missionTimer;//Starts minor mission system (Red Map Markers)//Starts minor mission system 2 (Red Map Markers) + [_missionListRed,_pathRed,"RedMarker","red",blck_TMin_Red,blck_TMax_Red,blck_enableRedMissions] call blck_fnc_addMissionToQue; +}; +if (blck_enableBlueMissions > 0) then +{ + //[_missionListBlue,_pathBlue,"BlueMarker","blue",blck_TMin_Blue,blck_TMax_Blue] spawn blck_fnc_missionTimer;//Starts minor mission system (Blue Map Markers) + [_missionListBlue,_pathBlue,"BlueMarker","blue",blck_TMin_Blue,blck_TMax_Blue,blck_enableBlueMissions] call blck_fnc_addMissionToQue; +}; -if (blck_enableOrangeMissions == 1) then -{ - [_missionListOrange,_pathOrange,"OrangeMarker","orange",blck_TMin_Orange,blck_TMax_Orange] spawn blck_fnc_missionTimer;//Starts major mission system (Orange Map Markers) -}; -if (blck_enableGreenMissions == 1) then -{ - [_missionListGreen,_pathGreen,"GreenMarker","green",blck_TMin_Green,blck_TMax_Green] spawn blck_fnc_missionTimer;//Starts major mission system 2 (Green Map Markers) -}; -if (blck_enableRedMissions == 1) then -{ - [_missionListRed,_pathRed,"RedMarker","red",blck_TMin_Red,blck_TMax_Red] spawn blck_fnc_missionTimer;//Starts minor mission system (Red Map Markers)//Starts minor mission system 2 (Red Map Markers) -}; -if (blck_enableBlueMissions == 1) then -{ - [_missionListBlue,_pathBlue,"BlueMarker","blue",blck_TMin_Blue,blck_TMax_Blue] spawn blck_fnc_missionTimer;//Starts minor mission system (Blue Map Markers) -}; // start the main thread for the mission system which monitors missions running and stuff to be cleaned up [] execVM "\q\addons\custom_server\Compiles\Functions\GMS_fnc_mainThread.sqf"; [] execVM "\q\addons\custom_server\Compiles\Vehicles\GMS_fnc_vehicleMonitorLoop.sqf"; diff --git a/@epochhive/addons/custom_server/init/build.sqf b/@epochhive/addons/custom_server/init/build.sqf index 0364bf8..b10ba6a 100644 --- a/@epochhive/addons/custom_server/init/build.sqf +++ b/@epochhive/addons/custom_server/init/build.sqf @@ -1,3 +1,3 @@ private ["_version","_versionDate"]; -_blck_version = "6.46 Build 20"; -_blck_versionDate = "12-19-16 3:00 PM"; +_blck_version = "6.50 Build 21"; +_blck_versionDate = "12-22-16 8:00 PM";