From c46f2176636a99d078e32a1e594c5c7e6ce306b2 Mon Sep 17 00:00:00 2001 From: kuplion Date: Wed, 8 Mar 2017 14:53:29 +0000 Subject: [PATCH 1/7] v65a Bug Fixes and Modifications The fixes are: * Fixed OccupyVehicles spawning out of control * Tidied up the config * Corrected a few typos * Corrected a few variable names The modifications are: * Static Heli Crashes postions * Heli Crash guards * Survivor and Bandit vehicles are now separate * Added Random Spawn AI Custom Loadout * Enable/disable naming the Random AI targeted player * Enable/disable Loot Crate and Heli Crash guards * Fixed Loot Crates and Heli Crashes spawning on the edge of Chernarus map * Version number updated to reflect changes --- README.md | 54 +- pre-packaged pbo/a3_exile_occupation.pbo | Bin 222531 -> 225967 bytes source/a3_exile_occupation/README.md | 54 +- source/a3_exile_occupation/config.cpp | 4 +- source/a3_exile_occupation/config.sqf | 124 ++++- .../scripts/functions/fnc_findsafePos.sqf | 5 + .../scripts/functions/fnc_selectGear.sqf | 33 +- .../scripts/occupationHeliCrashes.sqf | 78 ++- .../scripts/occupationLootCrates.sqf | 93 ++-- .../scripts/occupationRandomSpawn.sqf | 7 + .../scripts/occupationSea.sqf | 390 ++++++------- .../scripts/occupationSky.sqf | 409 +++++++------- .../scripts/occupationVehicle.sqf | 516 ++++++++++-------- 13 files changed, 995 insertions(+), 772 deletions(-) diff --git a/README.md b/README.md index 58672c6..517455c 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,28 @@ -# Exile Occupation (a3_exile_occupation) - -![Arma 1.62](https://img.shields.io/badge/Arma-1.62-blue.svg) ![Exile 1.0.1 Sweet Potato](https://img.shields.io/badge/Exile-1.0.1%20Sweet%20Potato-C72651.svg) - -WTF is Occupation? -An AI spawner and monitor to be used in conjunction with DMS and will not work without it: -http://www.exilemod.com/topic/61-dms-defents-mission-system/ - -Download the pbo version here: - -https://github.com/secondcoming/a3_exile_occupation/blob/development/pre-packaged%20pbo/a3_exile_occupation.pbo - - -To install place the pbo into the @ExileServer/addons folder - -For more info: -http://www.exilemod.com/topic/12517-release-exile-occupation-roaming-ai - -###License Overview: -This work is protected by [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)](http://creativecommons.org/licenses/by-nc-sa/4.0/). By using, downloading, or copying any of the work contained, you agree to the license included. - -Creative Commons License
Exile Occupation by second_coming is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - -### Donations: -Anyone wishing to donate can do so here http://exileyorkshire.co.uk/ -All donations go towards coffee to keep me awake :) +# Exile Occupation (a3_exile_occupation) + +![v65a Bug Fix](https://img.shields.io/badge/v65a-Bug%20Fix-red.svg) ![Arma 1.66](https://img.shields.io/badge/Arma-1.66-blue.svg) ![Exile 1.0.2 Sweet Potato](https://img.shields.io/badge/Exile-1.0.2%20Sweet%20Potato-C72651.svg) + +WTF is Occupation? +An AI spawner and monitor to be used in conjunction with DMS and will not work without it: +http://www.exilemod.com/topic/61-dms-defents-mission-system/ + +How to install? +To install place the pbo into the @ExileServer/addons folder + +How edit and compile? +You'll find the files in the source folder. Edit the config as you need and then compile the PBO with PBO Manager 1.4b: +http://www.armaholic.com/page.php?id=16369 - (Please note, only use the x64 version) + +For more info: +http://www.exilemod.com/topic/12517-release-exile-occupation-roaming-ai + +###License Overview: +This work is protected by [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)](http://creativecommons.org/licenses/by-nc-sa/4.0/). By using, downloading, or copying any of the work contained, you agree to the license included. + +Creative Commons License
Exile Occupation by second_coming is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. + +### Donations: +Anyone wishing to donate can do so here http://exileyorkshire.co.uk/ +All donations go towards coffee to keep me awake :) + +###Updated and modified by [FPS]kuplion \ No newline at end of file diff --git a/pre-packaged pbo/a3_exile_occupation.pbo b/pre-packaged pbo/a3_exile_occupation.pbo index e5029850c9d547bcbcd7dfab0206832450e5f4b4..d5828b945e0f3e6ea2f3a1d5310dc6921dce14b4 100644 GIT binary patch delta 26805 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 Zxdo%9OxPFeRZ{-O=<=%{Fa68d{{z3Jk4yjn delta 30003 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 diff --git a/source/a3_exile_occupation/README.md b/source/a3_exile_occupation/README.md index 9e1d447..517455c 100644 --- a/source/a3_exile_occupation/README.md +++ b/source/a3_exile_occupation/README.md @@ -1,26 +1,28 @@ -# Exile Occupation (a3_exile_occupation) - -![Arma 1.62](https://img.shields.io/badge/Arma-1.62-blue.svg) ![Exile 1.0.0 Potato](https://img.shields.io/badge/Exile-1.0.1%20Sweet%20Potato-C72651.svg) - -WTF is Occupation? -An AI spawner and monitor to be used in conjunction with DMS and will not work without it: -http://www.exilemod.com/topic/61-dms-defents-mission-system/ - -Download the pbo version here: - -https://github.com/secondcoming/a3_exile_occupation/blob/development/pre-packaged%20pbo/a3_exile_occupation.pbo - - -To install place the pbo into the @ExileServer/addons folder - -For more info: -http://www.exilemod.com/topic/12517-release-exile-occupation-roaming-ai - -###License Overview: -This work is protected by [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)](http://creativecommons.org/licenses/by-nc-sa/4.0/). By using, downloading, or copying any of the work contained, you agree to the license included. - -Creative Commons License
Exile Occupation by second_coming is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. - -### Donations: -Anyone wishing to donate can do so here http://exileyorkshire.co.uk/ -All donations go towards coffee to keep me awake :) +# Exile Occupation (a3_exile_occupation) + +![v65a Bug Fix](https://img.shields.io/badge/v65a-Bug%20Fix-red.svg) ![Arma 1.66](https://img.shields.io/badge/Arma-1.66-blue.svg) ![Exile 1.0.2 Sweet Potato](https://img.shields.io/badge/Exile-1.0.2%20Sweet%20Potato-C72651.svg) + +WTF is Occupation? +An AI spawner and monitor to be used in conjunction with DMS and will not work without it: +http://www.exilemod.com/topic/61-dms-defents-mission-system/ + +How to install? +To install place the pbo into the @ExileServer/addons folder + +How edit and compile? +You'll find the files in the source folder. Edit the config as you need and then compile the PBO with PBO Manager 1.4b: +http://www.armaholic.com/page.php?id=16369 - (Please note, only use the x64 version) + +For more info: +http://www.exilemod.com/topic/12517-release-exile-occupation-roaming-ai + +###License Overview: +This work is protected by [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)](http://creativecommons.org/licenses/by-nc-sa/4.0/). By using, downloading, or copying any of the work contained, you agree to the license included. + +Creative Commons License
Exile Occupation by second_coming is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. + +### Donations: +Anyone wishing to donate can do so here http://exileyorkshire.co.uk/ +All donations go towards coffee to keep me awake :) + +###Updated and modified by [FPS]kuplion \ No newline at end of file diff --git a/source/a3_exile_occupation/config.cpp b/source/a3_exile_occupation/config.cpp index 0d18c43..96e4bff 100644 --- a/source/a3_exile_occupation/config.cpp +++ b/source/a3_exile_occupation/config.cpp @@ -4,9 +4,9 @@ class CfgPatches units[] = {}; weapons[] = {}; requiredVersion = 0.1; - a3_exile_occupation_version = "V65 (30-08-2016)"; + a3_exile_occupation_version = "V65a (04-03-2017)"; requiredAddons[] = {"a3_dms"}; - author[]= {"second_coming"}; + author[]= {"second_coming - modified by [FPS]kuplion"}; }; }; diff --git a/source/a3_exile_occupation/config.sqf b/source/a3_exile_occupation/config.sqf index 51ecb55..b9b2cec 100644 --- a/source/a3_exile_occupation/config.sqf +++ b/source/a3_exile_occupation/config.sqf @@ -13,20 +13,18 @@ // Shared Config for each occupation monitor -SC_debug = false; // set to true to turn on debug features (not recommended for live servers) +SC_debug = false; // set to true to turn on debug features (not recommended for live servers) +SC_extendedLogging = false; // set to true for additional +SC_infiSTAR_log = true; // true Use infiSTAR logging, false logs to server rpt + SC_useApexClasses = true; // true if you want to use the Apex class list over rides, false to use vanilla Arma gear SC_useMapOverrides = true; // set to true to enable over riding options per map (see the bottom of this file for examples) -SC_extendedLogging = false; // set to true for additional logging -SC_infiSTAR_log = true; // true Use infiSTAR logging, false logs to server rpt SC_maxAIcount = 100; // the maximum amount of AI, if the AI count is above this then additional AI won't spawn SC_mapMarkers = false; // Place map markers at the occupied areas (occupyPlaces and occupyMilitary only) true/false SC_minFPS = 5; // any lower than minFPS on the server and additional AI won't spawn SC_scaleAI = 10; // any more than _scaleAI players on the server and _maxAIcount is reduced for each extra player -SC_removeUserMapMarkers = true; // true to delete map markers placed by players every 10 seconds - - // Distance limits for selecting safe places to spawn AI SC_minDistanceToSpawnZones = 750; // Minimum distance in metres to the nearest spawn zone SC_minDistanceToTraders = 750; // Minimum distance in metres to the nearest trader zone SC_minDistanceToTerritory = 350; // Minimum distance in metres to the nearest player territory @@ -50,6 +48,7 @@ SC_occupyMilitary = false; // true if you want military buildings SC_occupyVehicle = true; // true if you want to have roaming AI land vehicles SC_occupySky = true; // true if you want to have roaming AI helis SC_occupySea = false; // true if you want to have roaming AI boats +SC_occupyHeliCrashes = true; // true if you want to have Dayz style helicrashes ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Fast nights Setup @@ -71,11 +70,11 @@ SC_randomSpawnMaxGroupSize = 5; // Maximum amount of ra SC_randomSpawnChance = 12; // Percentage chance of spawning if suitable player found SC_randomSpawnIgnoreCount = true; // true if you want spawn random AI groups regardless of overall AI count (they still count towards the total though) SC_randomSpawnFrequency = 3600; // time in seconds between the possibility of random AI hunting the same player (1800 for 30 minutes) -SC_randomSpawnAnnounce = true; // true if you want a warning toast issued to all players when AI spawns - SC_randomSpawnNearBases = true; // true if you want to allow random spawns in range of territories SC_randomSpawnNearSpawns = false; // true if you want to allow random spawns in range of spawn zones SC_randomSpawnTargetBambis = false; // true if you want to allow random spawns to target bambis +SC_randomSpawnAnnounce = true; // true if you want a warning toast issued to all players when AI spawns +SC_randomSpawnNameTarget = false; // true if you want to name the targeted player ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Occupy Places Setup @@ -90,7 +89,7 @@ SC_occupyPlacesSurvivors = true; // true if you want a chance to spawn sur SC_occupyTraderDetails = [ //["Tanoa","Lifou Traders",[7317,7217,0],"trader1.sqf",true], //["Tanoa","Lijnhaven Traders",[11580,2051,0],"trader1.sqf",true], - ["Napf","Hafen Traders",[9286,17606,0],"trader1.sqf",true] + //["Napf","Hafen Traders",[9286,17606,0],"trader1.sqf",true] ]; //["mapname","Name",[x,y,z],"filename",true] trader name, location, safezone true/false ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -141,6 +140,7 @@ SC_occupyLootCratesLocations = [ [3000,3000,0], [4000,4000,0] ]; +SC_SpawnLootCrateGuards = true; // true if you want to enable AI guards SC_numberofLootCrates = 6; // if SC_occupyLootCrates = true spawn this many loot crates (overrided below for Namalsk) SC_LootCrateGuards = 2; // number of AI to spawn at each crate SC_LootCrateGuardsRandomize = true; // Use a random number of guards up to a maximum = SC_LootCrateGuards (so between 1 and SC_LootCrateGuards) @@ -196,9 +196,18 @@ SC_blackListedAreas = [ // Heli Crash Setup ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -SC_occupyHeliCrashes = true; // true if you want to have Dayz style helicrashes -SC_numberofHeliCrashesFire = true; // true if you want the crash on fire, false if you just want smoke -SC_numberofHeliCrashes = 5; // if SC_occupyHeliCrashes = true spawn this many loot crates +SC_occupyHeliCrashesStatic = false; // true if you want to have random Heli Crash spawn in pre-defined locations set in SC_occupyHeliCrashesLocations +SC_occupyHeliCrashesLocations = [ + [1000,1000,0], + [2000,2000,0], + [3000,3000,0], + [4000,4000,0] + ]; +SC_HeliCrashesOnFire = true; // true if you want the crash on fire, false if you just want smoke +SC_SpawnHeliCrashGuards = true; // true if you want to enable AI guards +SC_numberofHeliCrashes = 5; // if SC_occupyHeliCrashes = true spawn this many Heli Crashes +SC_HeliCrashGuards = 6; // number of AI to spawn at each crate +SC_HeliCrashGuardsRandomize = true; // Use a random number of guards up to a maximum = SC_HeliCrashGuards (so between 1 and SC_HeliCrashGuards) // Array of possible common items to go in heli crash crates ["classname",fixed amount,random amount] NOT INCLUDING WEAPONS // ["HandGrenade",0,2] this example would add between 0 and 2 HandGrenade to the crate (fixed 0 plus 0-2 random) @@ -272,6 +281,21 @@ SC_VehicleClassToUseRare = [ ["Exile_Car_Offroad_Armed_Guerilla03",1], ["Exile_Car_Tempest",1] ]; + +// Array of arrays of ground vehicles which can be used by Survivor AI patrols (the number next to next vehicle is the maximum amount of that class allowed, 0 for no limit) +SC_SurvivorVehicleClassToUse = [ + ["Exile_Car_LandRover_Green",0], + ["Exile_Bike_QuadBike_Black",2], + ["Exile_Car_UAZ_Open_Green",2] + ]; +SC_SurvivorVehicleClassToUseRare = [ + ["Exile_Car_Hunter",1], + ["Exile_Car_HEMMT",1], + ["Exile_Car_Zamak",1], + ["Exile_Car_Offroad_Armed_Guerilla12",1], + ["Exile_Car_Offroad_Armed_Guerilla03",1], + ["Exile_Car_Tempest",1] + ]; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Roaming Aircraft Setup @@ -391,7 +415,21 @@ SC_BanditPistol = ["hgun_ACPC2_F","hgun_P07_F","hgun_Pistol_heavy_0 SC_BanditPistolAttachments = []; SC_BanditAssignedItems = ["ItemMap","ItemCompass","ItemRadio","ItemWatch"]; // all these items will be added SC_BanditLauncher = []; -SC_BanditBackpack = ["B_HuntingBackpack","B_Kitbag_cbr","B_Kitbag_mcamo","B_Kitbag_sgg","B_OutdoorPack_blk","B_OutdoorPack_blu","B_OutdoorPack_tan","B_TacticalPack_blk","B_TacticalPack_mcamo","B_TacticalPack_ocamo","B_TacticalPack_oli","B_TacticalPack_rgr"]; +SC_BanditBackpack = ["B_HuntingBackpack","B_Kitbag_cbr","B_Kitbag_mcamo","B_Kitbag_sgg","B_OutdoorPack_blk","B_OutdoorPack_blu","B_OutdoorPack_tan","B_TacticalPack_blk","B_TacticalPack_mcamo","B_TacticalPack_ocamo","B_TacticalPack_oli","B_TacticalPack_rgr"]; + +// Possible equipment for random ai to spawn with +// spawning random ai without vests or backpacks will result in them having no ammunition +SC_RandomUniforms = ["U_B_GEN_Soldier_F"]; +SC_RandomVests = ["V_TacVest_gen_F"]; +SC_RandomHeadgear = ["H_Cap_police"]; +SC_RandomWeapon = ["SMG_05_F"]; +SC_RandomWeaponAttachments = ["muzzle_snds_L"]; +SC_RandomMagazines = ["Exile_Item_InstaDoc","Exile_Item_Vishpirin","Exile_Item_Bandage","Exile_Item_DuctTape","Exile_Item_PlasticBottleFreshWater","Exile_Item_Energydrink","Exile_Item_EMRE","Exile_Item_Cheathas","Exile_Item_Noodles","Exile_Item_BBQSandwich","Exile_Item_Catfood"]; +SC_RandomPistol = ["hgun_Rook40_F"]; +SC_RandomPistolAttachments = ["muzzle_snds_L"]; +SC_RandomAssignedItems = ["ItemMap","ItemCompass","ItemRadio","ItemWatch"]; // all these items will be added +SC_RandomLauncher = []; +SC_RandomBackpack = ["B_AssaultPack_blk"]; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Map Specific Overrides @@ -424,22 +462,64 @@ if (worldName == 'Tanoa' AND SC_useMapOverrides) then if(SC_useApexClasses) then { - SC_BanditWeapon = [ "arifle_MX_khk_F","arifle_MX_GL_khk_F","arifle_MX_SW_khk_F","arifle_MXC_khk_F","arifle_MXM_khk_F","arifle_AK12_F","arifle_AK12_GL_F","arifle_AKM_F", - "arifle_AKS_F","arifle_ARX_blk_F","arifle_ARX_ghex_F","arifle_ARX_hex_F","arifle_CTAR_blk_F","arifle_CTAR_GL_blk_F","arifle_CTARS_blk_F","arifle_SPAR_01_blk_F","arifle_SPAR_01_khk_F", - "arifle_SPAR_01_snd_F","arifle_SPAR_01_GL_blk_F","arifle_SPAR_01_GL_khk_F","arifle_SPAR_01_GL_snd_F","arifle_SPAR_02_blk_F","arifle_SPAR_02_khk_F","arifle_SPAR_02_snd_F", - "arifle_SPAR_03_blk_F","arifle_SPAR_03_khk_F","arifle_SPAR_03_snd_F"]; - SC_BanditUniforms = [ "U_I_C_Soldier_Para_1_F","U_I_C_Soldier_Para_2_F","U_I_C_Soldier_Para_3_F","U_I_C_Soldier_Para_4_F","U_I_C_Soldier_Para_5_F","U_I_C_Soldier_Bandit_1_F","U_I_C_Soldier_Bandit_2_F", - "U_I_C_Soldier_Bandit_3_F","U_I_C_Soldier_Bandit_4_F","U_I_C_Soldier_Bandit_5_F","U_I_C_Soldier_Camo_F","U_B_CTRG_Soldier_urb_1_F","U_B_CTRG_Soldier_urb_2_F","U_B_CTRG_Soldier_urb_3_F"]; - SC_VehicleClassToUse = [ + SC_BanditWeapon = [ + "arifle_MX_khk_F", + "arifle_MX_GL_khk_F", + "arifle_MX_SW_khk_F", + "arifle_MXC_khk_F", + "arifle_MXM_khk_F", + "arifle_AK12_F", + "arifle_AK12_GL_F", + "arifle_AKM_F", + "arifle_AKS_F", + "arifle_ARX_blk_F", + "arifle_ARX_ghex_F", + "arifle_ARX_hex_F", + "arifle_CTAR_blk_F", + "arifle_CTAR_GL_blk_F", + "arifle_CTARS_blk_F", + "arifle_SPAR_01_blk_F", + "arifle_SPAR_01_khk_F", + "arifle_SPAR_01_snd_F", + "arifle_SPAR_01_GL_blk_F", + "arifle_SPAR_01_GL_khk_F", + "arifle_SPAR_01_GL_snd_F", + "arifle_SPAR_02_blk_F", + "arifle_SPAR_02_khk_F", + "arifle_SPAR_02_snd_F", + "arifle_SPAR_03_blk_F", + "arifle_SPAR_03_khk_F", + "arifle_SPAR_03_snd_F" + ]; + + SC_BanditUniforms = [ + "U_I_C_Soldier_Para_1_F", + "U_I_C_Soldier_Para_2_F", + "U_I_C_Soldier_Para_3_F", + "U_I_C_Soldier_Para_4_F", + "U_I_C_Soldier_Para_5_F", + "U_I_C_Soldier_Bandit_1_F", + "U_I_C_Soldier_Bandit_2_F", + "U_I_C_Soldier_Bandit_3_F", + "U_I_C_Soldier_Bandit_4_F", + "U_I_C_Soldier_Bandit_5_F", + "U_I_C_Soldier_Camo_F", + "U_B_CTRG_Soldier_urb_1_F", + "U_B_CTRG_Soldier_urb_2_F", + "U_B_CTRG_Soldier_urb_3_F" + ]; + + SC_VehicleClassToUse = [ ["B_GEN_Offroad_01_gen_F",0], ["C_Offroad_02_unarmed_F",0], ["I_C_Offroad_02_unarmed_F",0] - ]; + ]; + SC_VehicleClassToUseRare = [ ["B_LSV_01_unarmed_black_F",1], ["O_T_LSV_02_unarmed_black_F",1], ["O_T_Truck_03_device_ghex_F",1] - ]; + ]; }; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/a3_exile_occupation/scripts/functions/fnc_findsafePos.sqf b/source/a3_exile_occupation/scripts/functions/fnc_findsafePos.sqf index 9672a04..8b8e6aa 100644 --- a/source/a3_exile_occupation/scripts/functions/fnc_findsafePos.sqf +++ b/source/a3_exile_occupation/scripts/functions/fnc_findsafePos.sqf @@ -15,6 +15,11 @@ if (worldName == 'Esseker') then _maxDist = 5000; }; +if (worldName == 'Chernarus') then +{ + _maxDist = _middle - 1500;; +}; + if(_roadSpawn) then { _maxDist = _maxDist - 1400; diff --git a/source/a3_exile_occupation/scripts/functions/fnc_selectGear.sqf b/source/a3_exile_occupation/scripts/functions/fnc_selectGear.sqf index b4aa99d..3b995e1 100644 --- a/source/a3_exile_occupation/scripts/functions/fnc_selectGear.sqf +++ b/source/a3_exile_occupation/scripts/functions/fnc_selectGear.sqf @@ -56,17 +56,28 @@ switch (_side) do }; case "cops": { - _uniform = "U_B_GEN_Soldier_F"; - _vest = "V_TacVest_gen_F"; - _headgear = "H_Cap_police"; - _weapon = "SMG_05_F"; - _weaponAttachments = ["muzzle_snds_L"]; - _pistol = "hgun_Rook40_F"; - _pistolAttachments = ["muzzle_snds_L"]; - _launcher = ""; - _backpack = ""; - _assignedItems = ["ItemMap","ItemCompass","ItemRadio","ItemWatch"]; - _magazines = ["30Rnd_9x21_Mag_SMG_02","30Rnd_9x21_Mag_SMG_02","16Rnd_9x21_Mag","16Rnd_9x21_Mag"]; + if(count SC_RandomUniforms == 0) then { _uniform = ""; } else { _uniform = SC_RandomUniforms call BIS_fnc_selectRandom; }; + if(count SC_RandomVests == 0) then { _vest = ""; } else { _vest = SC_RandomVests call BIS_fnc_selectRandom; }; + if(count SC_RandomHeadgear == 0) then { _headgear = ""; } else { _headgear = SC_RandomHeadgear call BIS_fnc_selectRandom; }; + if(count SC_RandomWeapon == 0) then { _weapon = ""; } else { _weapon = SC_RandomWeapon call BIS_fnc_selectRandom; }; + if(count SC_RandomWeaponAttachments == 0) then { _weaponAttachments = [""]; } else { _weaponAttachments = [SC_RandomWeaponAttachments call BIS_fnc_selectRandom]; }; + if(count SC_RandomPistol == 0) then { _pistol = ""; } else { _pistol = SC_RandomPistol call BIS_fnc_selectRandom; }; + if(count SC_RandomPistolAttachments == 0) then { _pistolAttachments = [""]; } else { _pistolAttachments = [SC_RandomPistolAttachments call BIS_fnc_selectRandom]; }; + if(count SC_RandomLauncher == 0) then { _launcher = ""; } else { _launcher = SC_RandomLauncher call BIS_fnc_selectRandom; }; + if(count SC_RandomBackpack == 0) then { _backpack = ""; } else { _backpack = SC_RandomBackpack call BIS_fnc_selectRandom; }; + _assignedItems = SC_RandomAssignedItems; + + _magazines = []; + if(count SC_RandomMagazines > 0) then + { + _amountOfMagazines = 1 + round random (2); + for "_i" from 1 to _amountOfMagazines do + { + _newMagazine = SC_RandomMagazines call BIS_fnc_selectRandom; + _quantity = 1 + round random (2); + _magazines pushBack [_newMagazine,_quantity]; + }; + }; }; }; diff --git a/source/a3_exile_occupation/scripts/occupationHeliCrashes.sqf b/source/a3_exile_occupation/scripts/occupationHeliCrashes.sqf index e99bea1..aff83a4 100644 --- a/source/a3_exile_occupation/scripts/occupationHeliCrashes.sqf +++ b/source/a3_exile_occupation/scripts/occupationHeliCrashes.sqf @@ -16,7 +16,22 @@ for "_i" from 1 to SC_numberofHeliCrashes do while{!_validspot} do { sleep 0.2; - _position = [ false, false ] call SC_fnc_findsafePos; + if(SC_occupyHeliCrashesStatic) then + { + _tempPosition = SC_occupyHeliCrashesLocations call BIS_fnc_selectRandom; + SC_occupyHeliCrashesLocations = SC_occupyHeliCrashesLocations - _tempPosition; + + _position = [_tempPosition select 0, _tempPosition select 1, _tempPosition select 2]; + if(isNil "_position") then + { + _position = [ false, false ] call SC_fnc_findsafePos; + }; + } + else + { + _position = [ false, false ] call SC_fnc_findsafePos; + }; + _validspot = true; //Check if near another heli crash site @@ -37,7 +52,7 @@ for "_i" from 1 to SC_numberofHeliCrashes do _effect = "test_EmptyObjectForSmoke"; - if(SC_numberofHeliCrashesFire) then + if(SC_HeliCrashesOnFire) then { _effect = "test_EmptyObjectForFireBig"; }; @@ -45,6 +60,65 @@ for "_i" from 1 to SC_numberofHeliCrashes do _heliFire = _effect createVehicle (position _vehHeli); _heliFire attachto [_vehHeli, [0,0,-1]]; _vehHeli setPos _position; + + if (SC_SpawnHeliCrashGuards) then + { + //Infantry spawn using DMS + _AICount = SC_HeliCrashGuards; + + if(SC_HeliCrashGuardsRandomize) then + { + _AICount = 1 + (round (random (SC_HeliCrashGuards-1))); + }; + + if(_AICount > 0) then + { + _spawnPosition = [_position select 0, _position select 1, 0]; + + _initialGroup = createGroup SC_BanditSide; + _initialGroup setCombatMode "BLUE"; + _initialGroup setBehaviour "SAFE"; + + for "_i" from 1 to _AICount do + { + _loadOut = ["bandit"] call SC_fnc_selectGear; + _unit = [_initialGroup,_spawnPosition,"custom","random","bandit","soldier",_loadOut] call DMS_fnc_SpawnAISoldier; + _unitName = ["bandit"] call SC_fnc_selectName; + if(!isNil "_unitName") then { _unit setName _unitName; }; + reload _unit; + }; + + // Get the AI to shut the fuck up :) + enableSentences false; + enableRadio false; + + + _group = createGroup SC_BanditSide; + _group setVariable ["DMS_LockLocality",nil]; + _group setVariable ["DMS_SpawnedGroup",true]; + _group setVariable ["DMS_Group_Side", SC_BanditSide]; + + { + _unit = _x; + [_unit] joinSilent grpNull; + [_unit] joinSilent _group; + _unit setCaptive false; + }foreach units _initialGroup; + deleteGroup _initialGroup; + + [_group, _spawnPosition, 100] call bis_fnc_taskPatrol; + _group setBehaviour "STEALTH"; + _group setCombatMode "RED"; + + _logDetail = format ["[OCCUPATION:HeliCrash]:: Creating HeliCrash %3 at %1 with %2 guards",_position,_AICount,_i]; + [_logDetail] call SC_fnc_log; + }; + } + else + { + _logDetail = format ["[OCCUPATION:HeliCrash]:: Creating HeliCrash %2 at %1 with no guards",_position,_i]; + [_logDetail] call SC_fnc_log; + }; _positionOfBox = [_position,3,10,1,0,10,0] call BIS_fnc_findSafePos; _box = "Box_NATO_Ammo_F" createvehicle _positionOfBox; diff --git a/source/a3_exile_occupation/scripts/occupationLootCrates.sqf b/source/a3_exile_occupation/scripts/occupationLootCrates.sqf index 1e74d89..83b80af 100644 --- a/source/a3_exile_occupation/scripts/occupationLootCrates.sqf +++ b/source/a3_exile_occupation/scripts/occupationLootCrates.sqf @@ -49,55 +49,58 @@ for "_i" from 1 to SC_numberofLootCrates do _event_marker setMarkerSize [(3), (3)]; }; - //Infantry spawn using DMS - _AICount = SC_LootCrateGuards; - - if(SC_LootCrateGuardsRandomize) then - { - _AICount = 1 + (round (random (SC_LootCrateGuards-1))); - }; - - if(_AICount > 0) then + if (SC_SpawnLootCrateGuards) then { - _spawnPosition = [_position select 0, _position select 1, 0]; - - _initialGroup = createGroup SC_BanditSide; - _initialGroup setCombatMode "BLUE"; - _initialGroup setBehaviour "SAFE"; - - for "_i" from 1 to _AICount do - { - _loadOut = ["bandit"] call SC_fnc_selectGear; - _unit = [_initialGroup,_spawnPosition,"custom","random","bandit","soldier",_loadOut] call DMS_fnc_SpawnAISoldier; - _unitName = ["bandit"] call SC_fnc_selectName; - if(!isNil "_unitName") then { _unit setName _unitName; }; - reload _unit; - }; - - // Get the AI to shut the fuck up :) - enableSentences false; - enableRadio false; + //Infantry spawn using DMS + _AICount = SC_LootCrateGuards; + + if(SC_LootCrateGuardsRandomize) then + { + _AICount = 1 + (round (random (SC_LootCrateGuards-1))); + }; - - _group = createGroup SC_BanditSide; - _group setVariable ["DMS_LockLocality",nil]; - _group setVariable ["DMS_SpawnedGroup",true]; - _group setVariable ["DMS_Group_Side", SC_BanditSide]; + if(_AICount > 0) then + { + _spawnPosition = [_position select 0, _position select 1, 0]; + + _initialGroup = createGroup SC_BanditSide; + _initialGroup setCombatMode "BLUE"; + _initialGroup setBehaviour "SAFE"; + + for "_i" from 1 to _AICount do + { + _loadOut = ["bandit"] call SC_fnc_selectGear; + _unit = [_initialGroup,_spawnPosition,"custom","random","bandit","soldier",_loadOut] call DMS_fnc_SpawnAISoldier; + _unitName = ["bandit"] call SC_fnc_selectName; + if(!isNil "_unitName") then { _unit setName _unitName; }; + reload _unit; + }; + + // Get the AI to shut the fuck up :) + enableSentences false; + enableRadio false; - { - _unit = _x; - [_unit] joinSilent grpNull; - [_unit] joinSilent _group; - _unit setCaptive false; - }foreach units _initialGroup; - deleteGroup _initialGroup; - - [_group, _spawnPosition, 100] call bis_fnc_taskPatrol; - _group setBehaviour "STEALTH"; - _group setCombatMode "RED"; + + _group = createGroup SC_BanditSide; + _group setVariable ["DMS_LockLocality",nil]; + _group setVariable ["DMS_SpawnedGroup",true]; + _group setVariable ["DMS_Group_Side", SC_BanditSide]; - _logDetail = format ["[OCCUPATION:LootCrates]:: Creating crate %3 at drop zone %1 with %2 guards",_position,_AICount,_i]; - [_logDetail] call SC_fnc_log; + { + _unit = _x; + [_unit] joinSilent grpNull; + [_unit] joinSilent _group; + _unit setCaptive false; + }foreach units _initialGroup; + deleteGroup _initialGroup; + + [_group, _spawnPosition, 100] call bis_fnc_taskPatrol; + _group setBehaviour "STEALTH"; + _group setCombatMode "RED"; + + _logDetail = format ["[OCCUPATION:LootCrates]:: Creating crate %3 at drop zone %1 with %2 guards",_position,_AICount,_i]; + [_logDetail] call SC_fnc_log; + }; } else { diff --git a/source/a3_exile_occupation/scripts/occupationRandomSpawn.sqf b/source/a3_exile_occupation/scripts/occupationRandomSpawn.sqf index 6532443..7388603 100644 --- a/source/a3_exile_occupation/scripts/occupationRandomSpawn.sqf +++ b/source/a3_exile_occupation/scripts/occupationRandomSpawn.sqf @@ -449,7 +449,14 @@ _livePlayers call BIS_fnc_arrayShuffle; if(SC_randomSpawnAnnounce) then { + if (SC_randomSpawnNameTarget) then + { + ["toastRequest", ["InfoTitleAndText", format["Raid group Incoming!", "A squad of Police have been despatched to take out %1!",name _selectedPlayer]]] call ExileServer_system_network_send_broadcast; + } + else + { ["toastRequest", ["InfoTitleAndText", ["Raid group Incoming!", "A squad of Police have been despatched to take out a trouble prisoner."]]] call ExileServer_system_network_send_broadcast; + }; }; _logDetail = format ["[OCCUPATION:RandomSpawn]:: Spawning a group of AI @ %2 to hunt player %1",_selectedPlayer,_spawnLocation]; diff --git a/source/a3_exile_occupation/scripts/occupationSea.sqf b/source/a3_exile_occupation/scripts/occupationSea.sqf index 083ffb5..46b7ed3 100644 --- a/source/a3_exile_occupation/scripts/occupationSea.sqf +++ b/source/a3_exile_occupation/scripts/occupationSea.sqf @@ -43,28 +43,37 @@ _maxDistance = _middle; for "_i" from 1 to _vehiclesToSpawn do { - private["_group"]; - - _locationArray = SC_occupyBoatFixedPositions; - // Select the spawn position - _spawnLocation = [0,0,0]; - _radius = 4000; - if(SC_occupyBoatUseFixedPos) then + if (_vehiclesToSpawn > 0) then { - { - _vehLocation = _x getVariable "SC_vehicleSpawnLocation"; - _locationArray = _locationArray - _vehLocation; - }forEach SC_liveBoatsArray; + private["_group"]; - if(count _locationArray > 0) then + _locationArray = SC_occupyBoatFixedPositions; + // Select the spawn position + _spawnLocation = [0,0,0]; + _radius = 4000; + if(SC_occupyBoatUseFixedPos) then { - _randomLocation = _locationArray call BIS_fnc_selectRandom; - diag_log format["_randomLocation: %1",_randomLocation]; - _tempLocation = _randomLocation select 0; - _spawnLocation = [_tempLocation select 0, _tempLocation select 1, _tempLocation select 2]; - _radius = _randomLocation select 1; - _locationArray = _locationArray - _randomLocation; + { + _vehLocation = _x getVariable "SC_vehicleSpawnLocation"; + _locationArray = _locationArray - _vehLocation; + }forEach SC_liveBoatsArray; + + if(count _locationArray > 0) then + { + _randomLocation = _locationArray call BIS_fnc_selectRandom; + diag_log format["_randomLocation: %1",_randomLocation]; + _tempLocation = _randomLocation select 0; + _spawnLocation = [_tempLocation select 0, _tempLocation select 1, _tempLocation select 2]; + _radius = _randomLocation select 1; + _locationArray = _locationArray - _randomLocation; + } + else + { + _potentialspawnLocation = [ _spawnCenter, 0, _maxDistance + 500, 25, 2, 1, 1] call BIS_fnc_findSafePos; + _spawnLocation = [_potentialspawnLocation select 0, _potentialspawnLocation select 1,0]; + _radius = 4000; + }; } else { @@ -72,193 +81,188 @@ for "_i" from 1 to _vehiclesToSpawn do _spawnLocation = [_potentialspawnLocation select 0, _potentialspawnLocation select 1,0]; _radius = 4000; }; - } - else - { - _potentialspawnLocation = [ _spawnCenter, 0, _maxDistance + 500, 25, 2, 1, 1] call BIS_fnc_findSafePos; - _spawnLocation = [_potentialspawnLocation select 0, _potentialspawnLocation select 1,0]; - _radius = 4000; - }; - diag_log format["[OCCUPATION:Sea] found position %1",_spawnLocation]; - _group = createGroup SC_BanditSide; - _group setVariable ["DMS_AllowFreezing",false]; - [_group,false] call DMS_fnc_FreezeToggle; - _group setVariable ["DMS_LockLocality",true]; - _group setVariable ["DMS_SpawnedGroup",true]; - _group setVariable ["DMS_Group_Side", SC_BanditSide]; - _VehicleClass = SC_BoatClassToUse call BIS_fnc_selectRandom; - _VehicleClassToUse = _VehicleClass select 0; - - boatOkToSpawn = false; - while{!boatOkToSpawn} do - { + diag_log format["[OCCUPATION:Sea] found position %1",_spawnLocation]; + _group = createGroup SC_BanditSide; + _group setVariable ["DMS_AllowFreezing",false]; + [_group,false] call DMS_fnc_FreezeToggle; + _group setVariable ["DMS_LockLocality",true]; + _group setVariable ["DMS_SpawnedGroup",true]; + _group setVariable ["DMS_Group_Side", SC_BanditSide]; _VehicleClass = SC_BoatClassToUse call BIS_fnc_selectRandom; - _VehicleClassToUse = _VehicleClass select 0; - _VehicleClassAllowedCount = _VehicleClass select 1; - _vehicleCount = 0; + _VehicleClassToUse = _VehicleClass select 0; + + boatOkToSpawn = false; + while{!boatOkToSpawn} do { - if(_VehicleClassToUse == typeOf _x) then { _vehicleCount = _vehicleCount + 1; }; - }forEach SC_liveHelisArray; - if(_vehicleCount < _VehicleClassAllowedCount OR _VehicleClassAllowedCount == 0) then { boatOkToSpawn = true; }; - }; + _VehicleClass = SC_BoatClassToUse call BIS_fnc_selectRandom; + _VehicleClassToUse = _VehicleClass select 0; + _VehicleClassAllowedCount = _VehicleClass select 1; + _vehicleCount = 0; + { + if(_VehicleClassToUse == typeOf _x) then { _vehicleCount = _vehicleCount + 1; }; + }forEach SC_liveHelisArray; + if(_vehicleCount < _VehicleClassAllowedCount OR _VehicleClassAllowedCount == 0) then { boatOkToSpawn = true; }; + }; - _vehicle = createVehicle [_VehicleClassToUse, _spawnLocation, [], 0, "NONE"]; - - if(!isNull _vehicle) then - { - _vehicle setPosASL _spawnLocation; - _vehicle setVariable["vehPos",_spawnLocation,true]; - _vehicle setVariable["vehClass",_VehicleClassToUse,true]; + _vehicle = createVehicle [_VehicleClassToUse, _spawnLocation, [], 0, "NONE"]; - _SC_vehicleSpawnLocation = [_spawnLocation,_radius,worldName]; - _vehicle setVariable ["SC_vehicleSpawnLocation", _SC_vehicleSpawnLocation,true]; - - // Remove the overpowered weapons from boats - _vehicle removeWeaponTurret ["HMG_01",[0]]; - _vehicle removeWeaponTurret ["GMG_40mm",[0]]; + if(!isNull _vehicle) then + { + _vehicle setPosASL _spawnLocation; + _vehicle setVariable["vehPos",_spawnLocation,true]; + _vehicle setVariable["vehClass",_VehicleClassToUse,true]; + + _SC_vehicleSpawnLocation = [_spawnLocation,_radius,worldName]; + _vehicle setVariable ["SC_vehicleSpawnLocation", _SC_vehicleSpawnLocation,true]; + + // Remove the overpowered weapons from boats + _vehicle removeWeaponTurret ["HMG_01",[0]]; + _vehicle removeWeaponTurret ["GMG_40mm",[0]]; - SC_liveBoats = SC_liveBoats + 1; - SC_liveBoatsArray = SC_liveBoatsArray + [_vehicle]; + SC_liveBoats = SC_liveBoats + 1; + SC_liveBoatsArray = SC_liveBoatsArray + [_vehicle]; - _vehicle setVehiclePosition [_spawnLocation, [], 0, "NONE"]; - _vehicle setVariable ["vehicleID", _spawnLocation, true]; - _vehicle setFuel 1; - _vehicle setDamage 0; - _vehicle engineOn true; - _vehicle lock 0; - _vehicle setVehicleLock "UNLOCKED"; - _vehicle setVariable ["ExileIsLocked", 0, true]; - _vehicle setVariable ["ExileIsPersistent", false]; - _vehicle action ["LightOn", _vehicle]; - sleep 0.2; - _group addVehicle _vehicle; - - // Calculate the number of seats in the vehicle and fill the required amount - _crewRequired = SC_minimumCrewAmount; - if(SC_maximumCrewAmount > SC_minimumCrewAmount) then - { - _crewRequired = floor(random[SC_minimumCrewAmount,SC_maximumCrewAmount-SC_minimumCrewAmount,SC_maximumCrewAmount]); - }; - _amountOfCrew = 0; - _unitPlaced = false; - _vehicleRoles = (typeOf _vehicle) call bis_fnc_vehicleRoles; - { - _unitPlaced = false; - _vehicleRole = _x select 0; - _vehicleSeat = _x select 1; - if(_vehicleRole == "Driver") then - { - _unit = [_group,_spawnLocation,"assault","random","bandit","Vehicle"] call DMS_fnc_SpawnAISoldier; - _amountOfCrew = _amountOfCrew + 1; - _unit assignAsDriver _vehicle; - _unit moveInDriver _vehicle; - _unit setVariable ["DMS_AssignedVeh",_vehicle]; - _unitPlaced = true; - }; - if(_vehicleRole == "Turret") then - { - _unit = [_group,_spawnLocation,"assault","random","bandit","Vehicle"] call DMS_fnc_SpawnAISoldier; - _amountOfCrew = _amountOfCrew + 1; - _unit moveInTurret [_vehicle, _vehicleSeat]; - _unit setVariable ["DMS_AssignedVeh",_vehicle]; - _unitPlaced = true; - }; - if(_vehicleRole == "CARGO" && _amountOfCrew < _crewRequired) then - { - _unit = [_group,_spawnLocation,"assault","random","bandit","Vehicle"] call DMS_fnc_SpawnAISoldier; - _amountOfCrew = _amountOfCrew + 1; - _unit assignAsCargo _vehicle; - _unit moveInCargo _vehicle; - _unit setVariable ["DMS_AssignedVeh",_vehicle]; - _unitPlaced = true; - }; + _vehicle setVehiclePosition [_spawnLocation, [], 0, "NONE"]; + _vehicle setVariable ["vehicleID", _spawnLocation, true]; + _vehicle setFuel 1; + _vehicle setDamage 0; + _vehicle engineOn true; + _vehicle lock 0; + _vehicle setVehicleLock "UNLOCKED"; + _vehicle setVariable ["ExileIsLocked", 0, true]; + _vehicle setVariable ["ExileIsPersistent", false]; + _vehicle action ["LightOn", _vehicle]; + sleep 0.2; + _group addVehicle _vehicle; + + // Calculate the number of seats in the vehicle and fill the required amount + _crewRequired = SC_minimumCrewAmount; + if(SC_maximumCrewAmount > SC_minimumCrewAmount) then + { + _crewRequired = floor(random[SC_minimumCrewAmount,SC_maximumCrewAmount-SC_minimumCrewAmount,SC_maximumCrewAmount]); + }; + _amountOfCrew = 0; + _unitPlaced = false; + _vehicleRoles = (typeOf _vehicle) call bis_fnc_vehicleRoles; + { + _unitPlaced = false; + _vehicleRole = _x select 0; + _vehicleSeat = _x select 1; + if(_vehicleRole == "Driver") then + { + _unit = [_group,_spawnLocation,"assault","random","bandit","Vehicle"] call DMS_fnc_SpawnAISoldier; + _amountOfCrew = _amountOfCrew + 1; + _unit assignAsDriver _vehicle; + _unit moveInDriver _vehicle; + _unit setVariable ["DMS_AssignedVeh",_vehicle]; + _unitPlaced = true; + }; + if(_vehicleRole == "Turret") then + { + _unit = [_group,_spawnLocation,"assault","random","bandit","Vehicle"] call DMS_fnc_SpawnAISoldier; + _amountOfCrew = _amountOfCrew + 1; + _unit moveInTurret [_vehicle, _vehicleSeat]; + _unit setVariable ["DMS_AssignedVeh",_vehicle]; + _unitPlaced = true; + }; + if(_vehicleRole == "CARGO" && _amountOfCrew < _crewRequired) then + { + _unit = [_group,_spawnLocation,"assault","random","bandit","Vehicle"] call DMS_fnc_SpawnAISoldier; + _amountOfCrew = _amountOfCrew + 1; + _unit assignAsCargo _vehicle; + _unit moveInCargo _vehicle; + _unit setVariable ["DMS_AssignedVeh",_vehicle]; + _unitPlaced = true; + }; - if(SC_extendedLogging && _unitPlaced) then - { - _logDetail = format['[OCCUPATION:Sky] %1 added to %2',_vehicleRole,_vehicle]; - [_logDetail] call SC_fnc_log; - }; - } forEach _vehicleRoles; - - { - _unit = _x; - _unitName = ["bandit"] call SC_fnc_selectName; - if(!isNil "_unitName") then { _unit setName _unitName; }; - [_unit] joinSilent grpNull; - [_unit] joinSilent _group; - }foreach units _group; + if(SC_extendedLogging && _unitPlaced) then + { + _logDetail = format['[OCCUPATION:Sky] %1 added to %2',_vehicleRole,_vehicle]; + [_logDetail] call SC_fnc_log; + }; + } forEach _vehicleRoles; + + { + _unit = _x; + _unitName = ["bandit"] call SC_fnc_selectName; + if(!isNil "_unitName") then { _unit setName _unitName; }; + [_unit] joinSilent grpNull; + [_unit] joinSilent _group; + }foreach units _group; - if(SC_infiSTAR_log) then - { - _logDetail = format['[OCCUPATION:Sea] %1 spawned @ %2',_VehicleClassToUse,_spawnLocation]; - [_logDetail] call SC_fnc_log; - }; + if(SC_infiSTAR_log) then + { + _logDetail = format['[OCCUPATION:Sea] %1 spawned @ %2',_VehicleClassToUse,_spawnLocation]; + [_logDetail] call SC_fnc_log; + }; - - clearMagazineCargoGlobal _vehicle; - clearWeaponCargoGlobal _vehicle; - clearItemCargoGlobal _vehicle; + + clearMagazineCargoGlobal _vehicle; + clearWeaponCargoGlobal _vehicle; + clearItemCargoGlobal _vehicle; - _vehicle addMagazineCargoGlobal ["HandGrenade", (random 2)]; - _vehicle addItemCargoGlobal ["ItemGPS", (random 1)]; - _vehicle addItemCargoGlobal ["Exile_Item_InstaDoc", (random 1)]; - _vehicle addItemCargoGlobal ["Exile_Item_PlasticBottleFreshWater", 2 + (random 2)]; - _vehicle addItemCargoGlobal ["Exile_Item_EMRE", 2 + (random 2)]; - - // Add weapons with ammo to the vehicle - _possibleWeapons = - [ - "arifle_MXM_Black_F", - "arifle_MXM_F", - "srifle_DMR_01_F", - "srifle_DMR_02_camo_F", - "srifle_DMR_02_F", - "srifle_DMR_02_sniper_F", - "srifle_DMR_03_F", - "srifle_DMR_03_khaki_F", - "srifle_DMR_03_multicam_F", - "srifle_DMR_03_tan_F", - "srifle_DMR_03_woodland_F", - "srifle_DMR_04_F", - "srifle_DMR_04_Tan_F", - "srifle_DMR_05_blk_F", - "srifle_DMR_05_hex_F", - "srifle_DMR_05_tan_f", - "srifle_DMR_06_camo_F", - "srifle_DMR_06_olive_F", - "srifle_EBR_F", - "srifle_GM6_camo_F", - "srifle_GM6_F", - "srifle_LRR_camo_F", - "srifle_LRR_F" - ]; - _amountOfWeapons = 1 + (random 3); - - for "_i" from 1 to _amountOfWeapons do - { - _weaponToAdd = _possibleWeapons call BIS_fnc_selectRandom; - _vehicle addWeaponCargoGlobal [_weaponToAdd,1]; - - _magazinesToAdd = getArray (configFile >> "CfgWeapons" >> _weaponToAdd >> "magazines"); - _vehicle addMagazineCargoGlobal [(_magazinesToAdd select 0),round random 3]; - }; + _vehicle addMagazineCargoGlobal ["HandGrenade", (random 2)]; + _vehicle addItemCargoGlobal ["ItemGPS", (random 1)]; + _vehicle addItemCargoGlobal ["Exile_Item_InstaDoc", (random 1)]; + _vehicle addItemCargoGlobal ["Exile_Item_PlasticBottleFreshWater", 2 + (random 2)]; + _vehicle addItemCargoGlobal ["Exile_Item_EMRE", 2 + (random 2)]; + + // Add weapons with ammo to the vehicle + _possibleWeapons = + [ + "arifle_MXM_Black_F", + "arifle_MXM_F", + "srifle_DMR_01_F", + "srifle_DMR_02_camo_F", + "srifle_DMR_02_F", + "srifle_DMR_02_sniper_F", + "srifle_DMR_03_F", + "srifle_DMR_03_khaki_F", + "srifle_DMR_03_multicam_F", + "srifle_DMR_03_tan_F", + "srifle_DMR_03_woodland_F", + "srifle_DMR_04_F", + "srifle_DMR_04_Tan_F", + "srifle_DMR_05_blk_F", + "srifle_DMR_05_hex_F", + "srifle_DMR_05_tan_f", + "srifle_DMR_06_camo_F", + "srifle_DMR_06_olive_F", + "srifle_EBR_F", + "srifle_GM6_camo_F", + "srifle_GM6_F", + "srifle_LRR_camo_F", + "srifle_LRR_F" + ]; + _amountOfWeapons = 1 + (random 3); + + for "_i" from 1 to _amountOfWeapons do + { + _weaponToAdd = _possibleWeapons call BIS_fnc_selectRandom; + _vehicle addWeaponCargoGlobal [_weaponToAdd,1]; + + _magazinesToAdd = getArray (configFile >> "CfgWeapons" >> _weaponToAdd >> "magazines"); + _vehicle addMagazineCargoGlobal [(_magazinesToAdd select 0),round random 3]; + }; - - [_group, _spawnLocation, _radius] call bis_fnc_taskPatrol; - _group setBehaviour "AWARE"; - _group setCombatMode "RED"; - _vehicle addEventHandler ["getin", "_this call SC_fnc_claimVehicle;"]; - _vehicle addMPEventHandler ["mpkilled", "_this call SC_fnc_vehicleDestroyed;"]; - _vehicle addMPEventHandler ["mphit", "_this call SC_fnc_hitSea;"]; - _vehicle setVariable ["SC_crewEjected", false,true]; - sleep 0.2; - } - else - { - _logDetail = format['[OCCUPATION:Sea] vehicle %1 failed to spawn (check classname is correct)',_VehicleClassToUse]; - [_logDetail] call SC_fnc_log; - }; + + [_group, _spawnLocation, _radius] call bis_fnc_taskPatrol; + _group setBehaviour "AWARE"; + _group setCombatMode "RED"; + _vehicle addEventHandler ["getin", "_this call SC_fnc_claimVehicle;"]; + _vehicle addMPEventHandler ["mpkilled", "_this call SC_fnc_vehicleDestroyed;"]; + _vehicle addMPEventHandler ["mphit", "_this call SC_fnc_hitSea;"]; + _vehicle setVariable ["SC_crewEjected", false,true]; + sleep 0.2; + } + else + { + _logDetail = format['[OCCUPATION:Sea] vehicle %1 failed to spawn (check classname is correct)',_VehicleClassToUse]; + [_logDetail] call SC_fnc_log; + }; + + }; }; diff --git a/source/a3_exile_occupation/scripts/occupationSky.sqf b/source/a3_exile_occupation/scripts/occupationSky.sqf index 97f09c6..9d6f273 100644 --- a/source/a3_exile_occupation/scripts/occupationSky.sqf +++ b/source/a3_exile_occupation/scripts/occupationSky.sqf @@ -65,27 +65,40 @@ _i = 0; for "_i" from 1 to _vehiclesToSpawn do { - private["_group"]; - _height = 350 + (round (random 200)); - _locationArray = SC_occupyHeliFixedPositions; - - // Select the spawn position - _spawnLocation = [0,0,0]; - _radius = 2000; - if(SC_occupyHeliUseFixedPos) then + if (_vehiclesToSpawn > 0) then { - { - _vehLocation = _x getVariable "SC_vehicleSpawnLocation"; - _locationArray = _locationArray - _vehLocation; - }forEach SC_liveHelisArray; + private["_group"]; + _height = 350 + (round (random 200)); + _locationArray = SC_occupyHeliFixedPositions; - if(count _locationArray > 0) then + // Select the spawn position + _spawnLocation = [0,0,0]; + _radius = 2000; + if(SC_occupyHeliUseFixedPos) then { - _randomLocation = _locationArray call BIS_fnc_selectRandom; - diag_log format["_randomLocation: %1",_randomLocation]; - _tempLocation = _randomLocation select 0; - _spawnLocation = [_tempLocation select 0, _tempLocation select 1, _tempLocation select 2]; - _radius = _randomLocation select 1; + { + _vehLocation = _x getVariable "SC_vehicleSpawnLocation"; + _locationArray = _locationArray - _vehLocation; + }forEach SC_liveHelisArray; + + if(count _locationArray > 0) then + { + _randomLocation = _locationArray call BIS_fnc_selectRandom; + diag_log format["_randomLocation: %1",_randomLocation]; + _tempLocation = _randomLocation select 0; + _spawnLocation = [_tempLocation select 0, _tempLocation select 1, _tempLocation select 2]; + _radius = _randomLocation select 1; + } + else + { + _Location = _locations call BIS_fnc_selectRandom; + _pos = position _Location; + _position = [_pos select 0, _pos select 1, 300]; + _safePos = [_position,10,100,5,0,20,0] call BIS_fnc_findSafePos; + _spawnLocation = [_safePos select 0, _safePos select 1, _height]; + _spawnLocation = [_safePos select 0, _safePos select 1, _height]; + _radius = 2000; + }; } else { @@ -97,203 +110,193 @@ for "_i" from 1 to _vehiclesToSpawn do _spawnLocation = [_safePos select 0, _safePos select 1, _height]; _radius = 2000; }; - } - else - { - _Location = _locations call BIS_fnc_selectRandom; - _pos = position _Location; - _position = [_pos select 0, _pos select 1, 300]; - _safePos = [_position,10,100,5,0,20,0] call BIS_fnc_findSafePos; - _spawnLocation = [_safePos select 0, _safePos select 1, _height]; - _spawnLocation = [_safePos select 0, _safePos select 1, _height]; - _radius = 2000; - }; - diag_log format["[OCCUPATION:Sky] found position %1",_spawnLocation]; - _group = createGroup SC_BanditSide; - _group setVariable ["DMS_AllowFreezing",false]; - [_group,false] call DMS_fnc_FreezeToggle; - _group setVariable ["DMS_LockLocality",true]; - _group setVariable ["DMS_SpawnedGroup",true]; - _group setVariable ["DMS_Group_Side", SC_BanditSide]; - - _VehicleClass = SC_HeliClassToUse call BIS_fnc_selectRandom; - _VehicleClassToUse = _VehicleClass select 0; - - heliOkToSpawn = false; - while{!heliOkToSpawn} do - { + diag_log format["[OCCUPATION:Sky] found position %1",_spawnLocation]; + _group = createGroup SC_BanditSide; + _group setVariable ["DMS_AllowFreezing",false]; + [_group,false] call DMS_fnc_FreezeToggle; + _group setVariable ["DMS_LockLocality",true]; + _group setVariable ["DMS_SpawnedGroup",true]; + _group setVariable ["DMS_Group_Side", SC_BanditSide]; + _VehicleClass = SC_HeliClassToUse call BIS_fnc_selectRandom; - _VehicleClassToUse = _VehicleClass select 0; - _VehicleClassAllowedCount = _VehicleClass select 1; - _vehicleCount = 0; + _VehicleClassToUse = _VehicleClass select 0; + + heliOkToSpawn = false; + while{!heliOkToSpawn} do { - if(_VehicleClassToUse == typeOf _x) then { _vehicleCount = _vehicleCount + 1; }; - }forEach SC_liveHelisArray; - if(_vehicleCount < _VehicleClassAllowedCount OR _VehicleClassAllowedCount == 0) then { heliOkToSpawn = true; }; - }; - - _vehicle = createVehicle [_VehicleClassToUse, _spawnLocation, [], 0, "NONE"]; - - if(!isNull _vehicle) then - { - _group addVehicle _vehicle; - _vehicle setVariable["vehPos",_spawnLocation,true]; - _vehicle setVariable["vehClass",_VehicleClassToUse,true]; - _SC_vehicleSpawnLocation = [_spawnLocation,_radius,worldName]; - diag_log format ["[occupationSky] _SC_vehicleSpawnLocation: %1",_SC_vehicleSpawnLocation]; - _vehicle setVariable ["SC_vehicleSpawnLocation", _SC_vehicleSpawnLocation,true]; - - SC_liveHelis = SC_liveHelis + 1; - SC_liveHelisArray = SC_liveHelisArray + [_vehicle]; - - _vehicle setVehiclePosition [_spawnLocation, [], 0, "FLY"]; - _vehicle setVariable ["vehicleID", _spawnLocation, true]; - _vehicle setFuel 1; - _vehicle setDamage 0; - _vehicle engineOn true; - _vehicle flyInHeight 150; - _vehicle lock 0; - _vehicle setVehicleLock "UNLOCKED"; - _vehicle setVariable ["ExileIsLocked", 0, true]; - _vehicle setVariable ["ExileIsPersistent", false]; - _vehicle action ["LightOn", _vehicle]; - - // Calculate the number of seats in the vehicle and fill the required amount - _crewRequired = SC_minimumCrewAmount; - if(SC_maximumCrewAmount > SC_minimumCrewAmount) then - { - _crewRequired = floor(random[SC_minimumCrewAmount,SC_maximumCrewAmount-SC_minimumCrewAmount,SC_maximumCrewAmount]); - }; - _amountOfCrew = 0; - _unitPlaced = false; - _vehicleRoles = (typeOf _vehicle) call bis_fnc_vehicleRoles; - { - _unitPlaced = false; - _vehicleRole = _x select 0; - _vehicleSeat = _x select 1; - if(_vehicleRole == "Driver") then + _VehicleClass = SC_HeliClassToUse call BIS_fnc_selectRandom; + _VehicleClassToUse = _VehicleClass select 0; + _VehicleClassAllowedCount = _VehicleClass select 1; + _vehicleCount = 0; { - _loadOut = ["bandit"] call SC_fnc_selectGear; - _unit = [_group,_spawnLocation,"custom","random","bandit","Vehicle",_loadOut] call DMS_fnc_SpawnAISoldier; - _amountOfCrew = _amountOfCrew + 1; - _unit assignAsDriver _vehicle; - _unit moveInDriver _vehicle; - //_vehicle lockDriver true; - _unit setVariable ["DMS_AssignedVeh",_vehicle]; - removeBackpackGlobal _unit; - _unit addBackpackGlobal "B_Parachute"; - _unitPlaced = true; - }; - if(_vehicleRole == "Turret") then - { - _loadOut = ["bandit"] call SC_fnc_selectGear; - _unit = [_group,_spawnLocation,"custom","random","bandit","Vehicle",_loadOut] call DMS_fnc_SpawnAISoldier; - _amountOfCrew = _amountOfCrew + 1; - _unit moveInTurret [_vehicle, _vehicleSeat]; - _unit setVariable ["DMS_AssignedVeh",_vehicle]; - removeBackpackGlobal _unit; - _unit addBackpackGlobal "B_Parachute"; - _unitPlaced = true; - }; - if(_vehicleRole == "CARGO" && _amountOfCrew < _crewRequired) then - { - _loadOut = ["bandit"] call SC_fnc_selectGear; - _unit = [_group,_spawnLocation,"custom","random","bandit","Vehicle",_loadOut] call DMS_fnc_SpawnAISoldier; - _amountOfCrew = _amountOfCrew + 1; - _unit assignAsCargo _vehicle; - _unit moveInCargo _vehicle; - _unit setVariable ["DMS_AssignedVeh",_vehicle]; - removeBackpackGlobal _unit; - _unit addBackpackGlobal "B_Parachute"; - _unitPlaced = true; - }; - if(SC_extendedLogging) then - { - _logDetail = format['[OCCUPATION:Sky] %1 added to %2',_vehicleRole,_vehicle]; - [_logDetail] call SC_fnc_log; - }; - } forEach _vehicleRoles; - + if(_VehicleClassToUse == typeOf _x) then { _vehicleCount = _vehicleCount + 1; }; + }forEach SC_liveHelisArray; + if(_vehicleCount < _VehicleClassAllowedCount OR _VehicleClassAllowedCount == 0) then { heliOkToSpawn = true; }; + }; + + _vehicle = createVehicle [_VehicleClassToUse, _spawnLocation, [], 0, "NONE"]; + + if(!isNull _vehicle) then { - _unit = _x; - _unitName = ["bandit"] call SC_fnc_selectName; - if(!isNil "_unitName") then { _unit setName _unitName; }; - [_unit] joinSilent grpNull; - [_unit] joinSilent _group; - }foreach units _group; + _group addVehicle _vehicle; + _vehicle setVariable["vehPos",_spawnLocation,true]; + _vehicle setVariable["vehClass",_VehicleClassToUse,true]; + _SC_vehicleSpawnLocation = [_spawnLocation,_radius,worldName]; + diag_log format ["[occupationSky] _SC_vehicleSpawnLocation: %1",_SC_vehicleSpawnLocation]; + _vehicle setVariable ["SC_vehicleSpawnLocation", _SC_vehicleSpawnLocation,true]; - if(SC_extendedLogging && _unitPlaced) then - { - _logDetail = format['[OCCUPATION:Sky] %1 spawned @ %2',_VehicleClassToUse,_spawnLocation]; - [_logDetail] call SC_fnc_log; - }; - - clearMagazineCargoGlobal _vehicle; - clearWeaponCargoGlobal _vehicle; - clearItemCargoGlobal _vehicle; + SC_liveHelis = SC_liveHelis + 1; + SC_liveHelisArray = SC_liveHelisArray + [_vehicle]; - _vehicle addMagazineCargoGlobal ["HandGrenade", (random 2)]; - _vehicle addItemCargoGlobal ["ItemGPS", (random 1)]; - _vehicle addItemCargoGlobal ["Exile_Item_InstaDoc", (random 1)]; - _vehicle addItemCargoGlobal ["Exile_Item_PlasticBottleFreshWater", 2 + (random 2)]; - _vehicle addItemCargoGlobal ["Exile_Item_EMRE", 2 + (random 2)]; - - // Add weapons with ammo to the vehicle - _possibleWeapons = - [ - "arifle_MXM_Black_F", - "arifle_MXM_F", - "srifle_DMR_01_F", - "srifle_DMR_02_camo_F", - "srifle_DMR_02_F", - "srifle_DMR_02_sniper_F", - "srifle_DMR_03_F", - "srifle_DMR_03_khaki_F", - "srifle_DMR_03_multicam_F", - "srifle_DMR_03_tan_F", - "srifle_DMR_03_woodland_F", - "srifle_DMR_04_F", - "srifle_DMR_04_Tan_F", - "srifle_DMR_05_blk_F", - "srifle_DMR_05_hex_F", - "srifle_DMR_05_tan_f", - "srifle_DMR_06_camo_F", - "srifle_DMR_06_olive_F", - "srifle_EBR_F", - "srifle_GM6_camo_F", - "srifle_GM6_F", - "srifle_LRR_camo_F", - "srifle_LRR_F" - ]; - _amountOfWeapons = 1 + (random 3); - - for "_i" from 1 to _amountOfWeapons do + _vehicle setVehiclePosition [_spawnLocation, [], 0, "FLY"]; + _vehicle setVariable ["vehicleID", _spawnLocation, true]; + _vehicle setFuel 1; + _vehicle setDamage 0; + _vehicle engineOn true; + _vehicle flyInHeight 150; + _vehicle lock 0; + _vehicle setVehicleLock "UNLOCKED"; + _vehicle setVariable ["ExileIsLocked", 0, true]; + _vehicle setVariable ["ExileIsPersistent", false]; + _vehicle action ["LightOn", _vehicle]; + + // Calculate the number of seats in the vehicle and fill the required amount + _crewRequired = SC_minimumCrewAmount; + if(SC_maximumCrewAmount > SC_minimumCrewAmount) then + { + _crewRequired = floor(random[SC_minimumCrewAmount,SC_maximumCrewAmount-SC_minimumCrewAmount,SC_maximumCrewAmount]); + }; + _amountOfCrew = 0; + _unitPlaced = false; + _vehicleRoles = (typeOf _vehicle) call bis_fnc_vehicleRoles; + { + _unitPlaced = false; + _vehicleRole = _x select 0; + _vehicleSeat = _x select 1; + if(_vehicleRole == "Driver") then + { + _loadOut = ["bandit"] call SC_fnc_selectGear; + _unit = [_group,_spawnLocation,"custom","random","bandit","Vehicle",_loadOut] call DMS_fnc_SpawnAISoldier; + _amountOfCrew = _amountOfCrew + 1; + _unit assignAsDriver _vehicle; + _unit moveInDriver _vehicle; + //_vehicle lockDriver true; + _unit setVariable ["DMS_AssignedVeh",_vehicle]; + removeBackpackGlobal _unit; + _unit addBackpackGlobal "B_Parachute"; + _unitPlaced = true; + }; + if(_vehicleRole == "Turret") then + { + _loadOut = ["bandit"] call SC_fnc_selectGear; + _unit = [_group,_spawnLocation,"custom","random","bandit","Vehicle",_loadOut] call DMS_fnc_SpawnAISoldier; + _amountOfCrew = _amountOfCrew + 1; + _unit moveInTurret [_vehicle, _vehicleSeat]; + _unit setVariable ["DMS_AssignedVeh",_vehicle]; + removeBackpackGlobal _unit; + _unit addBackpackGlobal "B_Parachute"; + _unitPlaced = true; + }; + if(_vehicleRole == "CARGO" && _amountOfCrew < _crewRequired) then + { + _loadOut = ["bandit"] call SC_fnc_selectGear; + _unit = [_group,_spawnLocation,"custom","random","bandit","Vehicle",_loadOut] call DMS_fnc_SpawnAISoldier; + _amountOfCrew = _amountOfCrew + 1; + _unit assignAsCargo _vehicle; + _unit moveInCargo _vehicle; + _unit setVariable ["DMS_AssignedVeh",_vehicle]; + removeBackpackGlobal _unit; + _unit addBackpackGlobal "B_Parachute"; + _unitPlaced = true; + }; + if(SC_extendedLogging) then + { + _logDetail = format['[OCCUPATION:Sky] %1 added to %2',_vehicleRole,_vehicle]; + [_logDetail] call SC_fnc_log; + }; + } forEach _vehicleRoles; + + { + _unit = _x; + _unitName = ["bandit"] call SC_fnc_selectName; + if(!isNil "_unitName") then { _unit setName _unitName; }; + [_unit] joinSilent grpNull; + [_unit] joinSilent _group; + }foreach units _group; + + if(SC_extendedLogging && _unitPlaced) then + { + _logDetail = format['[OCCUPATION:Sky] %1 spawned @ %2',_VehicleClassToUse,_spawnLocation]; + [_logDetail] call SC_fnc_log; + }; + + clearMagazineCargoGlobal _vehicle; + clearWeaponCargoGlobal _vehicle; + clearItemCargoGlobal _vehicle; + + _vehicle addMagazineCargoGlobal ["HandGrenade", (random 2)]; + _vehicle addItemCargoGlobal ["ItemGPS", (random 1)]; + _vehicle addItemCargoGlobal ["Exile_Item_InstaDoc", (random 1)]; + _vehicle addItemCargoGlobal ["Exile_Item_PlasticBottleFreshWater", 2 + (random 2)]; + _vehicle addItemCargoGlobal ["Exile_Item_EMRE", 2 + (random 2)]; + + // Add weapons with ammo to the vehicle + _possibleWeapons = + [ + "arifle_MXM_Black_F", + "arifle_MXM_F", + "srifle_DMR_01_F", + "srifle_DMR_02_camo_F", + "srifle_DMR_02_F", + "srifle_DMR_02_sniper_F", + "srifle_DMR_03_F", + "srifle_DMR_03_khaki_F", + "srifle_DMR_03_multicam_F", + "srifle_DMR_03_tan_F", + "srifle_DMR_03_woodland_F", + "srifle_DMR_04_F", + "srifle_DMR_04_Tan_F", + "srifle_DMR_05_blk_F", + "srifle_DMR_05_hex_F", + "srifle_DMR_05_tan_f", + "srifle_DMR_06_camo_F", + "srifle_DMR_06_olive_F", + "srifle_EBR_F", + "srifle_GM6_camo_F", + "srifle_GM6_F", + "srifle_LRR_camo_F", + "srifle_LRR_F" + ]; + _amountOfWeapons = 1 + (random 3); + + for "_i" from 1 to _amountOfWeapons do + { + _weaponToAdd = _possibleWeapons call BIS_fnc_selectRandom; + _vehicle addWeaponCargoGlobal [_weaponToAdd,1]; + + _magazinesToAdd = getArray (configFile >> "CfgWeapons" >> _weaponToAdd >> "magazines"); + _vehicle addMagazineCargoGlobal [(_magazinesToAdd select 0),round random 3]; + }; + + + [_group, _spawnLocation, _radius] call bis_fnc_taskPatrol; + _group setBehaviour "AWARE"; + _group setCombatMode "RED"; + _vehicle addEventHandler ["getin", "_this call SC_fnc_claimVehicle;"]; + _vehicle addMPEventHandler ["mpkilled", "_this call SC_fnc_vehicleDestroyed;"]; + _vehicle addMPEventHandler ["mphit", "_this call SC_fnc_hitAir;"]; + _vehicle setVariable ["SC_crewEjected", false,true]; + sleep 0.2; + } + else { - _weaponToAdd = _possibleWeapons call BIS_fnc_selectRandom; - _vehicle addWeaponCargoGlobal [_weaponToAdd,1]; - - _magazinesToAdd = getArray (configFile >> "CfgWeapons" >> _weaponToAdd >> "magazines"); - _vehicle addMagazineCargoGlobal [(_magazinesToAdd select 0),round random 3]; + _logDetail = format['[OCCUPATION:Sky] aircraft %1 failed to spawn (check classname is correct)',_VehicleClassToUse]; + [_logDetail] call SC_fnc_log; }; - - [_group, _spawnLocation, _radius] call bis_fnc_taskPatrol; - _group setBehaviour "AWARE"; - _group setCombatMode "RED"; - _vehicle addEventHandler ["getin", "_this call SC_fnc_claimVehicle;"]; - _vehicle addMPEventHandler ["mpkilled", "_this call SC_fnc_vehicleDestroyed;"]; - _vehicle addMPEventHandler ["mphit", "_this call SC_fnc_hitAir;"]; - _vehicle setVariable ["SC_crewEjected", false,true]; - sleep 0.2; - } - else - { - _logDetail = format['[OCCUPATION:Sky] aircraft %1 failed to spawn (check classname is correct)',_VehicleClassToUse]; - [_logDetail] call SC_fnc_log; }; - }; diff --git a/source/a3_exile_occupation/scripts/occupationVehicle.sqf b/source/a3_exile_occupation/scripts/occupationVehicle.sqf index 49cf04d..41c9354 100644 --- a/source/a3_exile_occupation/scripts/occupationVehicle.sqf +++ b/source/a3_exile_occupation/scripts/occupationVehicle.sqf @@ -54,264 +54,296 @@ if(_vehiclesToSpawn > 0) then }; _useLaunchers = DMS_ai_use_launchers; - for "_j" from 1 to _vehiclesToSpawn do + for "_i" from 1 to _vehiclesToSpawn do { - private["_group"]; - - _locationArray = SC_occupyVehicleFixedPositions; - - // Select the spawn position - _spawnLocation = [0,0,0]; - _radius = 2000; - if(SC_occupyVehicleUseFixedPos) then + if (_vehiclesToSpawn > 0) then { - { - _vehLocation = _x getVariable "SC_vehicleSpawnLocation"; - _locationArray = _locationArray - [_vehLocation]; - }forEach SC_liveVehiclesArray; + private["_group"]; - if(count _locationArray > 0) then + _locationArray = SC_occupyVehicleFixedPositions; + + // Select the spawn position + _spawnLocation = [0,0,0]; + _radius = 2000; + if(SC_occupyVehicleUseFixedPos) then { - _randomLocation = _locationArray call BIS_fnc_selectRandom; - _spawnLocation = _randomLocation select 0; - _radius = _randomLocation select 1; - _locationArray = _locationArray - [_randomLocation]; + { + _vehLocation = _x getVariable "SC_vehicleSpawnLocation"; + _locationArray = _locationArray - [_vehLocation]; + }forEach SC_liveVehiclesArray; + + if(count _locationArray > 0) then + { + _randomLocation = _locationArray call BIS_fnc_selectRandom; + _spawnLocation = _randomLocation select 0; + _radius = _randomLocation select 1; + _locationArray = _locationArray - [_randomLocation]; + } + else + { + _spawnLocation = [ true, false ] call SC_fnc_findsafePos; + _radius = 2000; + }; } else { _spawnLocation = [ true, false ] call SC_fnc_findsafePos; _radius = 2000; }; - } - else - { - _spawnLocation = [ true, false ] call SC_fnc_findsafePos; - _radius = 2000; - }; - - diag_log format["[OCCUPATION:Vehicle] found position %1",_spawnLocation]; - _group = createGroup SC_BanditSide; - if(_side == "survivor") then - { - deleteGroup _group; - _group = createGroup SC_SurvivorSide; - }; - _group setVariable ["DMS_AllowFreezing",false]; - _group setVariable ["DMS_LockLocality",false]; - _group setVariable ["DMS_SpawnedGroup",true]; - _group setVariable ["DMS_Group_Side", _side]; - - _VehicleClass = SC_VehicleClassToUse call BIS_fnc_selectRandom; - _VehicleClassToUse = _VehicleClass select 0; - vehicleOkToSpawn = false; - - // Percentage chance to spawn a rare vehicle - _rareChance = round (random 100); - if(_rareChance >= 90) then - { - - while{!vehicleOkToSpawn} do - { - _VehicleClass = SC_VehicleClassToUseRare call BIS_fnc_selectRandom; - _VehicleClassToUse = _VehicleClass select 0; - _VehicleClassAllowedCount = _VehicleClass select 1; - _vehicleCount = 0; - { - if(_VehicleClassToUse == typeOf _x) then { _vehicleCount = _vehicleCount + 1; }; - }forEach SC_liveVehiclesArray; - if(_vehicleCount < _VehicleClassAllowedCount OR _VehicleClassAllowedCount == 0) then { vehicleOkToSpawn = true; }; - }; - } - else - { - while{!vehicleOkToSpawn} do - { - _VehicleClass = SC_VehicleClassToUse call BIS_fnc_selectRandom; - _VehicleClassToUse = _VehicleClass select 0; - _VehicleClassAllowedCount = _VehicleClass select 1; - _vehicleCount = 0; - { - if(_VehicleClassToUse == typeOf _x) then { _vehicleCount = _vehicleCount + 1; }; - }forEach SC_liveVehiclesArray; - if(_vehicleCount < _VehicleClassAllowedCount OR _VehicleClassAllowedCount == 0) then { vehicleOkToSpawn = true; }; - }; - }; - - - _vehicle = createVehicle [_VehicleClassToUse, _spawnLocation, [], 0, "NONE"]; - - if(!isNull _vehicle) then - { - _group addVehicle _vehicle; - - SC_liveVehiclesArray = SC_liveVehiclesArray + [_vehicle]; - - _vehicle setVariable ["SC_repairStatus",false,true]; - _vehicle setVariable ["vehPos",_spawnLocation,true]; - _vehicle setVariable ["vehClass",_VehicleClassToUse,true]; - _SC_vehicleSpawnLocation = [_spawnLocation,_radius,worldName]; - _vehicle setVariable ["SC_vehicleSpawnLocation", _SC_vehicleSpawnLocation,true]; - _vehicle setFuel 1; - _vehicle engineOn true; - - if(SC_occupyVehiclesLocked) then - { - _vehicle lock 2; - _vehicle setVehicleLock "LOCKED"; - _vehicle setVariable ["ExileIsLocked", 1, true]; - } - else - { - _vehicle lock 0; - _vehicle setVehicleLock "UNLOCKED"; - _vehicle setVariable ["ExileIsLocked", 0, true]; - }; + + diag_log format["[OCCUPATION:Vehicle] found position %1",_spawnLocation]; + _group = createGroup SC_BanditSide; + if(_side == "survivor") then + { + deleteGroup _group; + _group = createGroup SC_SurvivorSide; + }; + _group setVariable ["DMS_AllowFreezing",false]; + _group setVariable ["DMS_LockLocality",false]; + _group setVariable ["DMS_SpawnedGroup",true]; + _group setVariable ["DMS_Group_Side", _side]; - _vehicle setVariable ["ExileIsPersistent", false]; - _vehicle setSpeedMode "LIMITED"; - _vehicle limitSpeed 60; - _vehicle action ["LightOn", _vehicle]; - _vehicle addEventHandler ["getin", "_this call SC_fnc_getIn;"]; - _vehicle addEventHandler ["getout", "_this call SC_fnc_getOut;"]; - _vehicle addMPEventHandler ["mpkilled", "_this call SC_fnc_vehicleDestroyed;"]; - _vehicle addMPEventHandler ["mphit", "_this call SC_fnc_hitLand;"]; - + _VehicleClass = SC_VehicleClassToUse call BIS_fnc_selectRandom; + _VehicleClassToUse = _VehicleClass select 0; + vehicleOkToSpawn = false; + + // Percentage chance to spawn a rare vehicle + _rareChance = round (random 100); + if(_rareChance >= 90) then + { + + while{!vehicleOkToSpawn} do + { + if (_side == "survivor") then { + + _VehicleClass = SC_SurvivorVehicleClassToUseRare call BIS_fnc_selectRandom; + _VehicleClassToUse = _VehicleClass select 0; + _VehicleClassAllowedCount = _VehicleClass select 1; + _vehicleCount = 0; + { + if(_VehicleClassToUse == typeOf _x) then { _vehicleCount = _vehicleCount + 1; }; + }forEach SC_liveVehiclesArray; + if(_vehicleCount < _VehicleClassAllowedCount OR _VehicleClassAllowedCount == 0) then { vehicleOkToSpawn = true; }; + + } else { + + _VehicleClass = SC_VehicleClassToUseRare call BIS_fnc_selectRandom; + _VehicleClassToUse = _VehicleClass select 0; + _VehicleClassAllowedCount = _VehicleClass select 1; + _vehicleCount = 0; + { + if(_VehicleClassToUse == typeOf _x) then { _vehicleCount = _vehicleCount + 1; }; + }forEach SC_liveVehiclesArray; + if(_vehicleCount < _VehicleClassAllowedCount OR _VehicleClassAllowedCount == 0) then { vehicleOkToSpawn = true; }; + }; + }; + } + else + { + while{!vehicleOkToSpawn} do + { + if (_side == "survivor") then { + + _VehicleClass = SC_SurvivorVehicleClassToUse call BIS_fnc_selectRandom; + _VehicleClassToUse = _VehicleClass select 0; + _VehicleClassAllowedCount = _VehicleClass select 1; + _vehicleCount = 0; + { + if(_VehicleClassToUse == typeOf _x) then { _vehicleCount = _vehicleCount + 1; }; + }forEach SC_liveVehiclesArray; + if(_vehicleCount < _VehicleClassAllowedCount OR _VehicleClassAllowedCount == 0) then { vehicleOkToSpawn = true; }; + + } else { + + _VehicleClass = SC_VehicleClassToUse call BIS_fnc_selectRandom; + _VehicleClassToUse = _VehicleClass select 0; + _VehicleClassAllowedCount = _VehicleClass select 1; + _vehicleCount = 0; + { + if(_VehicleClassToUse == typeOf _x) then { _vehicleCount = _vehicleCount + 1; }; + }forEach SC_liveVehiclesArray; + if(_vehicleCount < _VehicleClassAllowedCount OR _VehicleClassAllowedCount == 0) then { vehicleOkToSpawn = true; }; + }; + }; + }; + + + _vehicle = createVehicle [_VehicleClassToUse, _spawnLocation, [], 0, "NONE"]; + + if(!isNull _vehicle) then + { + _group addVehicle _vehicle; + + SC_liveVehiclesArray = SC_liveVehiclesArray + [_vehicle]; - - - // Calculate the number of seats in the vehicle and fill the required amount - _crewRequired = SC_minimumCrewAmount; - if(SC_maximumCrewAmount > SC_minimumCrewAmount) then - { - _crewRequired = ceil(random[SC_minimumCrewAmount,SC_maximumCrewAmount-SC_minimumCrewAmount,SC_maximumCrewAmount]); - }; - _amountOfCrew = 0; - _unitPlaced = false; - _vehicleRoles = (typeOf _vehicle) call bis_fnc_vehicleRoles; - { - _unitPlaced = false; - _vehicleRole = _x select 0; - _vehicleSeat = _x select 1; - if(_vehicleRole == "Driver") then - { - _loadOut = [_side] call SC_fnc_selectGear; - _unit = [_group,_spawnLocation,"custom","random",_side,"Vehicle",_loadOut] call DMS_fnc_SpawnAISoldier; - _amountOfCrew = _amountOfCrew + 1; - _unit disableAI "FSM"; - _unit disableAI "MOVE"; - [_side,_unit] call SC_fnc_addMarker; - _unit removeAllMPEventHandlers "mphit"; - _unit removeAllMPEventHandlers "mpkilled"; - _unit disableAI "TARGET"; - _unit disableAI "AUTOTARGET"; - _unit disableAI "AUTOCOMBAT"; - _unit disableAI "COVER"; - _unit disableAI "SUPPRESSION"; - _unit assignAsDriver _vehicle; - _unit moveInDriver _vehicle; - _unit setVariable ["DMS_AssignedVeh",_vehicle]; - _unit setVariable ["SC_drivenVehicle", _vehicle,true]; - _unit addMPEventHandler ["mpkilled", "_this call SC_fnc_driverKilled;"]; - _vehicle setVariable ["SC_assignedDriver", _unit,true]; + _vehicle setVariable ["SC_repairStatus",false,true]; + _vehicle setVariable ["vehPos",_spawnLocation,true]; + _vehicle setVariable ["vehClass",_VehicleClassToUse,true]; + _SC_vehicleSpawnLocation = [_spawnLocation,_radius,worldName]; + _vehicle setVariable ["SC_vehicleSpawnLocation", _SC_vehicleSpawnLocation,true]; + _vehicle setFuel 1; + _vehicle engineOn true; + + if(SC_occupyVehiclesLocked) then + { + _vehicle lock 2; + _vehicle setVehicleLock "LOCKED"; + _vehicle setVariable ["ExileIsLocked", 1, true]; + } + else + { + _vehicle lock 0; + _vehicle setVehicleLock "UNLOCKED"; + _vehicle setVariable ["ExileIsLocked", 0, true]; + }; + + _vehicle setVariable ["ExileIsPersistent", false]; + _vehicle setSpeedMode "LIMITED"; + _vehicle limitSpeed 60; + _vehicle action ["LightOn", _vehicle]; + _vehicle addEventHandler ["getin", "_this call SC_fnc_getIn;"]; + _vehicle addEventHandler ["getout", "_this call SC_fnc_getOut;"]; + _vehicle addMPEventHandler ["mpkilled", "_this call SC_fnc_vehicleDestroyed;"]; + _vehicle addMPEventHandler ["mphit", "_this call SC_fnc_hitLand;"]; + - }; - if(_vehicleRole == "Turret" && _amountOfCrew < _crewRequired) then - { - _loadOut = [_side] call SC_fnc_selectGear; - _unit = [_group,_spawnLocation,"custom","random",_side,"Vehicle",_loadOut] call DMS_fnc_SpawnAISoldier; - _amountOfCrew = _amountOfCrew + 1; - [_side,_unit] call SC_fnc_addMarker; - _unit moveInTurret [_vehicle, _vehicleSeat]; - _unit setVariable ["DMS_AssignedVeh",_vehicle]; - _unit addMPEventHandler ["mpkilled", "_this call SC_fnc_unitMPKilled;"]; - _unitPlaced = true; - }; - if(_vehicleRole == "CARGO" && _amountOfCrew < _crewRequired) then - { - _loadOut = [_side] call SC_fnc_selectGear; - _unit = [_group,_spawnLocation,"custom","random",_side,"Vehicle",_loadOut] call DMS_fnc_SpawnAISoldier; - _amountOfCrew = _amountOfCrew + 1; - [_side,_unit] call SC_fnc_addMarker; - _unit assignAsCargo _vehicle; - _unit moveInCargo _vehicle; - _unit setVariable ["DMS_AssignedVeh",_vehicle]; - _unit addMPEventHandler ["mpkilled", "_this call SC_fnc_unitMPKilled;"]; - _unitPlaced = true; - }; - if(SC_extendedLogging && _unitPlaced) then - { - _logDetail = format['[OCCUPATION:Vehicle] %1 %2 added to vehicle %3',_side,_vehicleRole,_vehicle]; - [_logDetail] call SC_fnc_log; - }; - if(_amountOfCrew == _crewRequired) exitWith{}; - } forEach _vehicleRoles; + + + // Calculate the number of seats in the vehicle and fill the required amount + _crewRequired = SC_minimumCrewAmount; + if(SC_maximumCrewAmount > SC_minimumCrewAmount) then + { + _crewRequired = ceil(random[SC_minimumCrewAmount,SC_maximumCrewAmount-SC_minimumCrewAmount,SC_maximumCrewAmount]); + }; + _amountOfCrew = 0; + _unitPlaced = false; + _vehicleRoles = (typeOf _vehicle) call bis_fnc_vehicleRoles; + { + _unitPlaced = false; + _vehicleRole = _x select 0; + _vehicleSeat = _x select 1; + if(_vehicleRole == "Driver") then + { + _loadOut = [_side] call SC_fnc_selectGear; + _unit = [_group,_spawnLocation,"custom","random",_side,"Vehicle",_loadOut] call DMS_fnc_SpawnAISoldier; + _amountOfCrew = _amountOfCrew + 1; + _unit disableAI "FSM"; + _unit disableAI "MOVE"; + [_side,_unit] call SC_fnc_addMarker; + _unit removeAllMPEventHandlers "mphit"; + _unit removeAllMPEventHandlers "mpkilled"; + _unit disableAI "TARGET"; + _unit disableAI "AUTOTARGET"; + _unit disableAI "AUTOCOMBAT"; + _unit disableAI "COVER"; + _unit disableAI "SUPPRESSION"; + _unit assignAsDriver _vehicle; + _unit moveInDriver _vehicle; + _unit setVariable ["DMS_AssignedVeh",_vehicle]; + _unit setVariable ["SC_drivenVehicle", _vehicle,true]; + _unit addMPEventHandler ["mpkilled", "_this call SC_fnc_driverKilled;"]; + _vehicle setVariable ["SC_assignedDriver", _unit,true]; - // Get the AI to shut the fuck up :) - enableSentences false; - enableRadio false; + }; + if(_vehicleRole == "Turret" && _amountOfCrew < _crewRequired) then + { + _loadOut = [_side] call SC_fnc_selectGear; + _unit = [_group,_spawnLocation,"custom","random",_side,"Vehicle",_loadOut] call DMS_fnc_SpawnAISoldier; + _amountOfCrew = _amountOfCrew + 1; + [_side,_unit] call SC_fnc_addMarker; + _unit moveInTurret [_vehicle, _vehicleSeat]; + _unit setVariable ["DMS_AssignedVeh",_vehicle]; + _unit addMPEventHandler ["mpkilled", "_this call SC_fnc_unitMPKilled;"]; + _unitPlaced = true; + }; + if(_vehicleRole == "CARGO" && _amountOfCrew < _crewRequired) then + { + _loadOut = [_side] call SC_fnc_selectGear; + _unit = [_group,_spawnLocation,"custom","random",_side,"Vehicle",_loadOut] call DMS_fnc_SpawnAISoldier; + _amountOfCrew = _amountOfCrew + 1; + [_side,_unit] call SC_fnc_addMarker; + _unit assignAsCargo _vehicle; + _unit moveInCargo _vehicle; + _unit setVariable ["DMS_AssignedVeh",_vehicle]; + _unit addMPEventHandler ["mpkilled", "_this call SC_fnc_unitMPKilled;"]; + _unitPlaced = true; + }; + if(SC_extendedLogging && _unitPlaced) then + { + _logDetail = format['[OCCUPATION:Vehicle] %1 %2 added to vehicle %3',_side,_vehicleRole,_vehicle]; + [_logDetail] call SC_fnc_log; + }; + if(_amountOfCrew == _crewRequired) exitWith{}; + } forEach _vehicleRoles; - _logDetail = format['[OCCUPATION:Vehicle] %3 vehicle %1 spawned @ %2',_VehicleClassToUse,_spawnLocation,_side]; - [_logDetail] call SC_fnc_log; - sleep 2; - - { - _unit = _x; - _unit enableAI "FSM"; - _unit enableAI "MOVE"; - _unit enableAI "TARGET"; - _unit enableAI "AUTOTARGET"; - _unit enableAI "AUTOCOMBAT"; - _unit allowCrewInImmobile false; - reload _unit; - _unitName = [_side] call SC_fnc_selectName; - if(!isNil "_unitName") then { _unit setName _unitName; }; - }forEach units _group; - [_group,false] call DMS_fnc_FreezeToggle; - - [units _group] orderGetIn true; - sleep 10; - - [_group, _spawnLocation, 2000] call bis_fnc_taskPatrol; - _group setBehaviour "AWARE"; - _group setCombatMode "RED"; - sleep 0.2; - - clearMagazineCargoGlobal _vehicle; - clearWeaponCargoGlobal _vehicle; - clearItemCargoGlobal _vehicle; + // Get the AI to shut the fuck up :) + enableSentences false; + enableRadio false; - _vehicle addMagazineCargoGlobal ["HandGrenade", (random 2)]; - _vehicle addItemCargoGlobal ["ItemGPS", (random 1)]; - _vehicle addItemCargoGlobal ["Exile_Item_InstaDoc", (random 1)]; - _vehicle addItemCargoGlobal ["Exile_Item_PlasticBottleFreshWater", 2 + (random 2)]; - _vehicle addItemCargoGlobal ["Exile_Item_EMRE", 2 + (random 2)]; - - // Add weapons with ammo to the vehicle - _possibleWeapons = - [ - "arifle_MXM_Black_F", - "arifle_MXM_F", - "arifle_MX_SW_Black_F", - "arifle_MX_SW_F", - "LMG_Mk200_F", - "LMG_Zafir_F" - ]; - _amountOfWeapons = 1 + (random 3); - - for "_i" from 1 to _amountOfWeapons do - { - _weaponToAdd = _possibleWeapons call BIS_fnc_selectRandom; - _vehicle addWeaponCargoGlobal [_weaponToAdd,1]; - - _magazinesToAdd = getArray (configFile >> "CfgWeapons" >> _weaponToAdd >> "magazines"); - _vehicle addMagazineCargoGlobal [(_magazinesToAdd select 0),round random 3]; - }; - } - else - { - _logDetail = format['[OCCUPATION:Vehicle] vehicle %1 failed to spawn (check classname is correct)',_VehicleClassToUse]; - [_logDetail] call SC_fnc_log; - }; + _logDetail = format['[OCCUPATION:Vehicle] %3 vehicle %1 spawned @ %2',_VehicleClassToUse,_spawnLocation,_side]; + [_logDetail] call SC_fnc_log; + sleep 2; + + { + _unit = _x; + _unit enableAI "FSM"; + _unit enableAI "MOVE"; + _unit enableAI "TARGET"; + _unit enableAI "AUTOTARGET"; + _unit enableAI "AUTOCOMBAT"; + _unit allowCrewInImmobile false; + reload _unit; + _unitName = [_side] call SC_fnc_selectName; + if(!isNil "_unitName") then { _unit setName _unitName; }; + }forEach units _group; + [_group,false] call DMS_fnc_FreezeToggle; + + [units _group] orderGetIn true; + sleep 10; + + [_group, _spawnLocation, 2000] call bis_fnc_taskPatrol; + _group setBehaviour "AWARE"; + _group setCombatMode "RED"; + sleep 0.2; + + clearMagazineCargoGlobal _vehicle; + clearWeaponCargoGlobal _vehicle; + clearItemCargoGlobal _vehicle; + + _vehicle addMagazineCargoGlobal ["HandGrenade", (random 2)]; + _vehicle addItemCargoGlobal ["ItemGPS", (random 1)]; + _vehicle addItemCargoGlobal ["Exile_Item_InstaDoc", (random 1)]; + _vehicle addItemCargoGlobal ["Exile_Item_PlasticBottleFreshWater", 2 + (random 2)]; + _vehicle addItemCargoGlobal ["Exile_Item_EMRE", 2 + (random 2)]; + + // Add weapons with ammo to the vehicle + _possibleWeapons = + [ + "arifle_MXM_Black_F", + "arifle_MXM_F", + "arifle_MX_SW_Black_F", + "arifle_MX_SW_F", + "LMG_Mk200_F", + "LMG_Zafir_F" + ]; + _amountOfWeapons = 1 + (random 3); + + for "_i" from 1 to _amountOfWeapons do + { + _weaponToAdd = _possibleWeapons call BIS_fnc_selectRandom; + _vehicle addWeaponCargoGlobal [_weaponToAdd,1]; + + _magazinesToAdd = getArray (configFile >> "CfgWeapons" >> _weaponToAdd >> "magazines"); + _vehicle addMagazineCargoGlobal [(_magazinesToAdd select 0),round random 3]; + }; + } + else + { + _logDetail = format['[OCCUPATION:Vehicle] vehicle %1 failed to spawn (check classname is correct)',_VehicleClassToUse]; + [_logDetail] call SC_fnc_log; + }; + + }; }; }; SC_liveVehicles = count(SC_liveVehiclesArray); From 4b89c41d7c5d1bc59745af8c359a6654f85e07f1 Mon Sep 17 00:00:00 2001 From: kuplion Date: Sun, 12 Mar 2017 19:05:40 +0000 Subject: [PATCH 2/7] Tweaked settings. Improved OccupationSky. Maximum AI Crew tweaked: SC_minimumCrewAmount = 2; SC_maximumCrewAmount = 3; Ignore AI count fixed for OccupationSky.. --- pre-packaged pbo/a3_exile_occupation.pbo | Bin 225967 -> 226061 bytes source/a3_exile_occupation/config.sqf | 3 ++- .../scripts/occupationSky.sqf | 10 +++++----- .../scripts/occupationVehicle.sqf | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/pre-packaged pbo/a3_exile_occupation.pbo b/pre-packaged pbo/a3_exile_occupation.pbo index d5828b945e0f3e6ea2f3a1d5310dc6921dce14b4..3e65ed225f4c7f8a6b03e7ab466afdd7d0bbf2a4 100644 GIT binary patch delta 213 zcmZ4gl(+X8?}UwfYSS3NKzYW|2(@V&_t!A-b!$L`YJfuB8j}^7L?*{FFX#PW01; Cu}x?I delta 164 zcmeBu#=HJ0?}Uwf+ov*sf!xVG5!oDOrO1%iF3NcEk>nw8GokjGXBhWl|^KBMH`uWyX=={v$VZx LVcWdhYO5Up6t6rl diff --git a/source/a3_exile_occupation/config.sqf b/source/a3_exile_occupation/config.sqf index b9b2cec..757394b 100644 --- a/source/a3_exile_occupation/config.sqf +++ b/source/a3_exile_occupation/config.sqf @@ -252,7 +252,7 @@ SC_maximumCrewAmount = 3; // Maximum amount of AI allowed in a vehi ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// SC_maxNumberofVehicles = 3; // How many roaming vehicles to spawn -SC_occupyVehicleIgnoreCount = false; // true if you want spawn vehicles regardless of overall AI count +SC_occupyLandVehicleIgnoreCount = false; // true if you want spawn vehicles regardless of overall AI count SC_occupyVehiclesLocked = false; // true if AI vehicles to stay locked until all the linked AI are dead SC_occupyVehicleSurvivors = false; // true if you want a chance to spawn survivor AI as well as bandits (SC_occupyVehicle must be true to use this option) @@ -303,6 +303,7 @@ SC_SurvivorVehicleClassToUseRare = [ // Settings for roaming airborne AI (non armed helis will just fly around) SC_maxNumberofHelis = 1; +SC_occupySkyVehicleIgnoreCount = false; // true if you want spawn vehicles regardless of overall AI count // Array of aircraft which can be used by AI patrols (the number next to next vehicle is the maximum amount of that class allowed, 0 for no limit) SC_HeliClassToUse = [ ["Exile_Chopper_Huey_Armed_Green",0] ]; diff --git a/source/a3_exile_occupation/scripts/occupationSky.sqf b/source/a3_exile_occupation/scripts/occupationSky.sqf index 9d6f273..b58a2bd 100644 --- a/source/a3_exile_occupation/scripts/occupationSky.sqf +++ b/source/a3_exile_occupation/scripts/occupationSky.sqf @@ -20,11 +20,11 @@ if(diag_fps < SC_minFPS) exitWith [_logDetail] call SC_fnc_log; }; -_aiActive = {alive _x && (side _x == SC_BanditSide OR side _x == SC_SurvivorSide)} count allUnits; -if(_aiActive > _maxAIcount) exitWith -{ - _logDetail = format ["[OCCUPATION:Sky]:: %1 active AI, so not spawning AI this time",_aiActive]; - [_logDetail] call SC_fnc_log; +_aiActive = { !isPlayer _x } count allunits; +if((_aiActive > _maxAIcount) && !SC_occupySkyVehicleIgnoreCount) exitWith +{ + _logDetail = format ["[OCCUPATION:Sky]:: %1 active AI, so not spawning AI this time",_aiActive]; + [_logDetail] call SC_fnc_log; }; SC_liveHelis = count(SC_liveHelisArray); diff --git a/source/a3_exile_occupation/scripts/occupationVehicle.sqf b/source/a3_exile_occupation/scripts/occupationVehicle.sqf index 41c9354..a744ccc 100644 --- a/source/a3_exile_occupation/scripts/occupationVehicle.sqf +++ b/source/a3_exile_occupation/scripts/occupationVehicle.sqf @@ -22,7 +22,7 @@ if(diag_fps < SC_minFPS) exitWith [_logDetail] call SC_fnc_log; }; _aiActive = { !isPlayer _x } count allunits; -if((_aiActive > _maxAIcount) && !SC_occupyVehicleIgnoreCount) exitWith +if((_aiActive > _maxAIcount) && !SC_occupyLandVehicleIgnoreCount) exitWith { _logDetail = format ["[OCCUPATION:Vehicle]:: %1 active AI, so not spawning AI this time",_aiActive]; [_logDetail] call SC_fnc_log; From 54cc7e352e07737ac66f5d0733d94c4c13f8d086 Mon Sep 17 00:00:00 2001 From: kuplion Date: Sun, 12 Mar 2017 20:27:01 +0000 Subject: [PATCH 3/7] Tweaked settings. Improved OccupationSky. --- source/a3_exile_occupation/config.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/a3_exile_occupation/config.sqf b/source/a3_exile_occupation/config.sqf index 757394b..9e6f5b0 100644 --- a/source/a3_exile_occupation/config.sqf +++ b/source/a3_exile_occupation/config.sqf @@ -244,7 +244,7 @@ SC_HeliCrashMagazinesAmount = [2,2]; // [fixed amount to add, random amount to ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// SC_minimumCrewAmount = 2; // Minimum amount of AI allowed in a vehicle -SC_maximumCrewAmount = 3; // Maximum amount of AI allowed in a vehicle +SC_maximumCrewAmount = 5; // Maximum amount of AI allowed in a vehicle // (essential crew like drivers and gunners will always spawn regardless of these settings) ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// From 9e152e21ad2c8caad9553e9b7df7fe68f2a895c3 Mon Sep 17 00:00:00 2001 From: kuplion Date: Thu, 23 Mar 2017 06:30:33 +0000 Subject: [PATCH 4/7] Added more options for Static Spawns --- pre-packaged pbo/a3_exile_occupation.pbo | Bin 226061 -> 226279 bytes source/a3_exile_occupation/config.sqf | 2 ++ .../scripts/functions/fnc_spawnStatics.sqf | 2 +- .../scripts/occupationStatic.sqf | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/pre-packaged pbo/a3_exile_occupation.pbo b/pre-packaged pbo/a3_exile_occupation.pbo index 3e65ed225f4c7f8a6b03e7ab466afdd7d0bbf2a4..62cd6ccca6356c28fdfdf5dc0212bb77914d1605 100644 GIT binary patch delta 378 zcmeBu#{2v^?}UxKd!{jfflt=uh&>zktz+VgV}*#^&%7KF$2wV&Nn~>$Gann@6>*4o z9#G{K@yYp|5|j0xa&JD%*%(;wnVy$ll&5kds)MT2#zwtB{tMQ=Dq8udfhX zkXW9lkXn|Sr;wSZPykV&kXV$ekO$Vn73>^eT#{IlnG7+=(bGA#mf+5 kn9Z0ywtJZ|ueT9794RRum%ChQrMZyRvnpLxvr89k0IouR`~Uy| delta 167 zcmaF_ zzV+e=$@Sus^Eo9pAL8r@-25bZn;N5W^X#VWvzr)Inx@ZDVf2~KZ^F#gZoBQApigX diff --git a/source/a3_exile_occupation/config.sqf b/source/a3_exile_occupation/config.sqf index 9e6f5b0..5a1a9d1 100644 --- a/source/a3_exile_occupation/config.sqf +++ b/source/a3_exile_occupation/config.sqf @@ -96,6 +96,8 @@ SC_occupyTraderDetails = [ // Occupy Static Setup ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +SC_staticIgnoreNearbyPlayers = false;// Spawn even if players are nearby +SC_staticIgnoreAICount = false;// Ignore the AI count for Static AI Spawns SC_staticBandits = [ //[[pos],ai count,radius,search buildings] ]; diff --git a/source/a3_exile_occupation/scripts/functions/fnc_spawnStatics.sqf b/source/a3_exile_occupation/scripts/functions/fnc_spawnStatics.sqf index 57b649e..b6fdb8d 100644 --- a/source/a3_exile_occupation/scripts/functions/fnc_spawnStatics.sqf +++ b/source/a3_exile_occupation/scripts/functions/fnc_spawnStatics.sqf @@ -41,7 +41,7 @@ if(_side == "survivor") then { _currentSide = SC_SurvivorSide }; // Don't spawn additional AI if there are players in range - if([_spawnPosition, 250] call ExileClient_util_world_isAlivePlayerInRange) exitwith + if(!(SC_staticIgnoreNearbyPlayers) && ([_spawnPosition, 250] call ExileClient_util_world_isAlivePlayerInRange)) exitwith { _okToSpawn = false; if(_debug) then diff --git a/source/a3_exile_occupation/scripts/occupationStatic.sqf b/source/a3_exile_occupation/scripts/occupationStatic.sqf index aab0900..f08f2e7 100644 --- a/source/a3_exile_occupation/scripts/occupationStatic.sqf +++ b/source/a3_exile_occupation/scripts/occupationStatic.sqf @@ -29,7 +29,7 @@ if(diag_fps < _minFPS) exitWith _aiActive = { !isPlayer _x } count allunits; -if(_aiActive > _maxAIcount) exitWith +if(!(SC_staticIgnoreAICount) && (_aiActive > _maxAIcount)) exitWith { _logDetail = format ["[OCCUPATION Static]:: %1 active AI, so not spawning AI this time",_aiActive]; [_logDetail] call SC_fnc_log; From a82a82565df24c9249ca1e72b18ff1793cd45abd Mon Sep 17 00:00:00 2001 From: kuplion Date: Thu, 23 Mar 2017 06:38:07 +0000 Subject: [PATCH 5/7] Incremented version number to v66.. Version number incremented to v66 due to number of new features. --- README.md | 2 +- pre-packaged pbo/a3_exile_occupation.pbo | Bin 226279 -> 226278 bytes source/a3_exile_occupation/config.cpp | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 517455c..9c1d094 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Exile Occupation (a3_exile_occupation) -![v65a Bug Fix](https://img.shields.io/badge/v65a-Bug%20Fix-red.svg) ![Arma 1.66](https://img.shields.io/badge/Arma-1.66-blue.svg) ![Exile 1.0.2 Sweet Potato](https://img.shields.io/badge/Exile-1.0.2%20Sweet%20Potato-C72651.svg) +![v66 New Features](https://img.shields.io/badge/v66-New%20Features-red.svg) ![Arma 1.68](https://img.shields.io/badge/Arma-1.68-blue.svg) ![Exile 1.0.2 Sweet Potato](https://img.shields.io/badge/Exile-1.0.2%20Sweet%20Potato-C72651.svg) WTF is Occupation? An AI spawner and monitor to be used in conjunction with DMS and will not work without it: diff --git a/pre-packaged pbo/a3_exile_occupation.pbo b/pre-packaged pbo/a3_exile_occupation.pbo index 62cd6ccca6356c28fdfdf5dc0212bb77914d1605..035e2f7e247a3a7ff79d0488debd14dbbb7b5e7e 100644 GIT binary patch delta 70 zcmaF Date: Fri, 24 Mar 2017 08:02:13 +0000 Subject: [PATCH 6/7] Bug fix for Occupy Random Spawns.. Corrected formatting when naming a targeted player. --- pre-packaged pbo/a3_exile_occupation.pbo | Bin 226278 -> 226280 bytes .../scripts/occupationRandomSpawn.sqf | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/pre-packaged pbo/a3_exile_occupation.pbo b/pre-packaged pbo/a3_exile_occupation.pbo index 035e2f7e247a3a7ff79d0488debd14dbbb7b5e7e..cb1a062d0819b65a3def9e9507ce7fc8a2c14507 100644 GIT binary patch delta 91 zcmaF%ocG0Z-VOJe_}1DmfWd)_S0dKhOjcwPX=Y^J&dAKzvu1k121ZHtwEUvn#FFUg uYt}OcOuxK=(Y)Pg1LJn14NMCTi&W=Ld?_=Nb>lT3y&w*?Hk(VcTGIeT?IW%L delta 105 zcmaFyocGyt-VOJe_*UC6fPu2r?ugYklNFgnroZiFVsGYP-p;|y*t&)-Ex#x?v1EGh zdPd3V-5VH9raxTIC^NmOok?=~`wfh;?Is%-x0`HWT5wq8aoLyeF8A8vCQRy8(7nl+ J%9ib^1^^J~D763p diff --git a/source/a3_exile_occupation/scripts/occupationRandomSpawn.sqf b/source/a3_exile_occupation/scripts/occupationRandomSpawn.sqf index 7388603..1262b1d 100644 --- a/source/a3_exile_occupation/scripts/occupationRandomSpawn.sqf +++ b/source/a3_exile_occupation/scripts/occupationRandomSpawn.sqf @@ -451,7 +451,7 @@ _livePlayers call BIS_fnc_arrayShuffle; { if (SC_randomSpawnNameTarget) then { - ["toastRequest", ["InfoTitleAndText", format["Raid group Incoming!", "A squad of Police have been despatched to take out %1!",name _selectedPlayer]]] call ExileServer_system_network_send_broadcast; + ["toastRequest", ["InfoTitleAndText", ["Raid group Incoming!", format["A squad of Police have been despatched to take out %1!",name _selectedPlayer]]]] call ExileServer_system_network_send_broadcast; } else { From e687d8b6f135fe701a67fa04f057fee12c5a31a8 Mon Sep 17 00:00:00 2001 From: MGT Date: Mon, 24 Apr 2017 14:47:56 +0100 Subject: [PATCH 7/7] Since infiSTAR updated, full log name no longer needed --- source/a3_exile_occupation/scripts/occupationLog.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/a3_exile_occupation/scripts/occupationLog.sqf b/source/a3_exile_occupation/scripts/occupationLog.sqf index 5a2c9a7..3d22424 100644 --- a/source/a3_exile_occupation/scripts/occupationLog.sqf +++ b/source/a3_exile_occupation/scripts/occupationLog.sqf @@ -3,7 +3,7 @@ _logDetail = format["%1 %2",SC_occupationVersion,_this select 0]; _fileName = _this select 1; -if(isNil "_fileName") then { _fileName = "A3_EXILE_OCCUPATION"; }; +if(isNil "_fileName") then { _fileName = "OCCUPATION"; }; if(SC_infiSTAR_log && !(isNil "INFISTARVERSION")) then { @@ -12,4 +12,4 @@ if(SC_infiSTAR_log && !(isNil "INFISTARVERSION")) then else { diag_log _logDetail; -}; \ No newline at end of file +};