diff --git a/@ExileServer/addons/a3_dms/config.sqf b/@ExileServer/addons/a3_dms/config.sqf index 0c9cf5a..bdd17de 100644 --- a/@ExileServer/addons/a3_dms/config.sqf +++ b/@ExileServer/addons/a3_dms/config.sqf @@ -58,9 +58,12 @@ DMS_DEBUG = false; DMS_MissionTypes = [ // List of missions with spawn chances. If they add up to 100%, they represent the percentage chance each one will spawn ["mission1",25], - ["mission2",50], + ["mission2",25], ["mission3",15], - ["mission4",10] + ["mission4",10], + ["bauhaus",45], + ["lost_battalion",30], + ["walmart",20] ]; DMS_findSafePosBlacklist = [ // For BIS_fnc_findSafePos position blacklist info refer to: https://community.bistudio.com/wiki/BIS_fnc_findSafePos diff --git a/@ExileServer/addons/a3_dms/fn_DMS_preInit.sqf b/@ExileServer/addons/a3_dms/fn_DMS_preInit.sqf index 6543701..c5e1443 100644 --- a/@ExileServer/addons/a3_dms/fn_DMS_preInit.sqf +++ b/@ExileServer/addons/a3_dms/fn_DMS_preInit.sqf @@ -33,6 +33,7 @@ DMS_AddMissionToMonitor = compileFinal preprocessFileLineNumbers "\x\addons\d DMS_CreateMarker = compileFinal preprocessFileLineNumbers "\x\addons\dms\scripts\CreateMarker.sqf"; DMS_FindSuppressor = compileFinal preprocessFileLineNumbers "\x\addons\dms\scripts\FindSuppressor.sqf"; DMS_SpawnCrate = compileFinal preprocessFileLineNumbers "\x\addons\dms\scripts\SpawnCrate.sqf"; +DMS_SetAILocality = compileFinal preprocessFileLineNumbers "\x\addons\dms\scripts\SetAILocality.sqf"; //Load config call compileFinal preprocessFileLineNumbers "\x\addons\dms\config.sqf"; \ No newline at end of file diff --git a/@ExileServer/addons/a3_dms/missions/bauhaus.sqf b/@ExileServer/addons/a3_dms/missions/bauhaus.sqf new file mode 100644 index 0000000..e181886 --- /dev/null +++ b/@ExileServer/addons/a3_dms/missions/bauhaus.sqf @@ -0,0 +1,151 @@ +/* + Sample mission + Created by Defent and eraser1 + + Called from DMS_selectMission +*/ + +private ["_num", "_side", "_pos", "_difficulty", "_AICount", "_group", "_crate", "_crate_loot_values", "_msgStart", "_msgWIN", "_msgLOSE", "_missionName", "_missionAIUnits", "_missionObjs", "_markers", "_time", "_added","_wreck"]; + +// For logging purposes +_num = DMS_MissionCount; + + +// Set mission side (only "bandit" is supported for now) +_side = "bandit"; + + +// find position +_pos = [10,100] call DMS_findSafePos; + + +// Set general mission difficulty +_difficulty = "difficult"; + + +// Create AI +// TODO: Spawn AI only when players are nearby +_AICount = 6 + (round (random 2)); + +_group = +[ + _pos, // Position of AI + _AICount, // Number of AI + "random", // "random","hardcore","difficult","moderate", or "easy" + "random", // "random","assault","MG","sniper" or "unarmed" OR [_type,_launcher] + _side // "bandit","hero", etc. +] call DMS_SpawnAIGroup; + + +// Create Crate +_crate = ["Box_NATO_Wps_F",_pos] call DMS_SpawnCrate; + +_wreck = createVehicle ["Land_Wreck_Ural_F",[(_pos select 0) - 10, (_pos select 1),-0.2],[], 0, "CAN_COLLIDE"]; + +// Set crate loot values +_crate_loot_values = +[ + 2, // Weapons + 15, // Items + 2 // Backpacks +]; + + +// Define mission-spawned AI Units +_missionAIUnits = +[ + _group // We only spawned the single group for this mission +]; + +// Define mission-spawned objects and loot values +_missionObjs = +[ + [], // No spawned buildings + [_crate,_wreck], + _crate_loot_values +]; + +// Define Mission Start message +_msgStart = format["A Bauhaus truck has crashed and lost all its building supplies, get there quickly!"]; + +// Define Mission Win message +_msgWIN = format["Convicts have successfully claimed the crashed Buahaus truck %1!"]; + +// Define Mission Lose message +_msgLOSE = format["The Bauhause truck has been repaired and escaped!"]; + + +// Define mission name (for map marker and logging) +_missionName = "Bauhaus Truck"; + +// Create Markers +_markers = +[ + _pos, + _missionName, + _difficulty +] call DMS_CreateMarker; + +// Record time here (for logging purposes, otherwise you could just put "diag_tickTime" into the "DMS_AddMissionToMonitor" parameters directly) +_time = diag_tickTime; + +// Parse and add mission info to missions monitor +_added = +[ + _pos, + [ + [ + "kill", + _group + ], + [ + "playerNear", + [_pos,DMS_playerNearRadius] + ] + ], + [ + _time, + (DMS_MissionTimeOut select 0) + random((DMS_MissionTimeOut select 1) - (DMS_MissionTimeOut select 0)) + ], + _missionAIUnits, + _missionObjs, + [_msgWIN,_msgLOSE], + _markers, + _side +] call DMS_AddMissionToMonitor; + +// Check to see if it was added correctly, otherwise delete the stuff +if !(_added) exitWith +{ + diag_log format ["DMS ERROR :: Attempt to set up mission %1 with invalid parameters for DMS_AddMissionToMonitor! Deleting mission objects and resetting DMS_MissionCount.",_missionName]; + + // Delete AI units and the crate. I could do it in one line but I just made a little function that should work for every mission (provided you defined everything correctly) + _cleanup = []; + { + _cleanup pushBack _x; + false; + } count _missionAIUnits; + + _cleanup pushBack ((_missionObjs select 0)+(_missionObjs select 1)); + + _cleanup call DMS_CleanUp; + + + // Delete the markers directly + {deleteMarker _x;false;} count _markers; + + + // Reset the mission count + DMS_MissionCount = DMS_MissionCount - 1; +}; + + +// Notify players +_msgStart call DMS_BroadcastMissionStatus; + + + +if (DMS_DEBUG) then +{ + diag_log format ["DMS_DEBUG MISSION: (%1) :: Mission #%2 started at %3 with %4 AI units and %5 difficulty at time %6",_missionName,_num,_pos,_AICount,_difficulty,_time]; +}; \ No newline at end of file diff --git a/@ExileServer/addons/a3_dms/missions/lost_battalion.sqf b/@ExileServer/addons/a3_dms/missions/lost_battalion.sqf new file mode 100644 index 0000000..5fdc685 --- /dev/null +++ b/@ExileServer/addons/a3_dms/missions/lost_battalion.sqf @@ -0,0 +1,151 @@ +/* + Sample mission + Created by Defent and eraser1 + + Called from DMS_selectMission +*/ + +private ["_num", "_side", "_pos", "_difficulty", "_AICount", "_group", "_crate", "_crate2", "_crate_loot_values", "_msgStart", "_msgWIN", "_msgLOSE", "_missionName", "_missionAIUnits", "_missionObjs", "_markers", "_time", "_added"]; + +// For logging purposes +_num = DMS_MissionCount; + + +// Set mission side (only "bandit" is supported for now) +_side = "bandit"; + + +// find position +_pos = [10,100] call DMS_findSafePos; + + +// Set general mission difficulty +_difficulty = "hardcore"; + + +// Create AI +// TODO: Spawn AI only when players are nearby +_AICount = 6 + (round (random 2)); + +_group = +[ + _pos, // Position of AI + _AICount, // Number of AI + "random", // "random","hardcore","difficult","moderate", or "easy" + "random", // "random","assault","MG","sniper" or "unarmed" OR [_type,_launcher] + _side // "bandit","hero", etc. +] call DMS_SpawnAIGroup; + + +// Create Crate +_crate = ["Box_NATO_Wps_F",_pos] call DMS_SpawnCrate; +uiSleep 3; +_crate2 = ["Box_NATO_Wps_F",_pos] call DMS_SpawnCrate; + +// Set crate loot values +_crate_loot_values = +[ + 7, // Weapons + 5, // Items + 5 // Backpacks +]; + + +// Define mission-spawned AI Units +_missionAIUnits = +[ + _group // We only spawned the single group for this mission +]; + +// Define mission-spawned objects and loot values +_missionObjs = +[ + [], // No spawned buildings + [_crate,_crate2], + _crate_loot_values +]; + +// Define Mission Start message +_msgStart = format["A battalion of soldiers have gotten lost in convict land! Eliminate them!"]; + +// Define Mission Win message +_msgWIN = format["Convicts have successfully eliminated the lost battalion!"]; + +// Define Mission Lose message +_msgLOSE = format["Whittlesey escaped with his Lost Battalion!"]; + + +// Define mission name (for map marker and logging) +_missionName = "Lost Battalion"; + +// Create Markers +_markers = +[ + _pos, + _missionName, + _difficulty +] call DMS_CreateMarker; + +// Record time here (for logging purposes, otherwise you could just put "diag_tickTime" into the "DMS_AddMissionToMonitor" parameters directly) +_time = diag_tickTime; + +// Parse and add mission info to missions monitor +_added = +[ + _pos, + [ + [ + "kill", + _group + ], + [ + "playerNear", + [_pos,DMS_playerNearRadius] + ] + ], + [ + _time, + (DMS_MissionTimeOut select 0) + random((DMS_MissionTimeOut select 1) - (DMS_MissionTimeOut select 0)) + ], + _missionAIUnits, + _missionObjs, + [_msgWIN,_msgLOSE], + _markers, + _side +] call DMS_AddMissionToMonitor; + +// Check to see if it was added correctly, otherwise delete the stuff +if !(_added) exitWith +{ + diag_log format ["DMS ERROR :: Attempt to set up mission %1 with invalid parameters for DMS_AddMissionToMonitor! Deleting mission objects and resetting DMS_MissionCount.",_missionName]; + + // Delete AI units and the crate. I could do it in one line but I just made a little function that should work for every mission (provided you defined everything correctly) + _cleanup = []; + { + _cleanup pushBack _x; + false; + } count _missionAIUnits; + + _cleanup pushBack ((_missionObjs select 0)+(_missionObjs select 1)); + + _cleanup call DMS_CleanUp; + + + // Delete the markers directly + {deleteMarker _x;false;} count _markers; + + + // Reset the mission count + DMS_MissionCount = DMS_MissionCount - 1; +}; + + +// Notify players +_msgStart call DMS_BroadcastMissionStatus; + + + +if (DMS_DEBUG) then +{ + diag_log format ["DMS_DEBUG MISSION: (%1) :: Mission #%2 started at %3 with %4 AI units and %5 difficulty at time %6",_missionName,_num,_pos,_AICount,_difficulty,_time]; +}; \ No newline at end of file diff --git a/@ExileServer/addons/a3_dms/missions/walmart.sqf b/@ExileServer/addons/a3_dms/missions/walmart.sqf new file mode 100644 index 0000000..94c1e31 --- /dev/null +++ b/@ExileServer/addons/a3_dms/missions/walmart.sqf @@ -0,0 +1,154 @@ +/* + Sample mission + Created by Defent and eraser1 + + Called from DMS_selectMission +*/ + +private ["_num", "_side", "_pos", "_difficulty", "_AICount", "_group", "_crate", "_crate_loot_values", "_msgStart", "_msgWIN", "_msgLOSE", "_missionName", "_missionAIUnits", "_missionObjs", "_markers", "_time", "_added","_wreck1","_wreck2","_wreck3","_wreck4"]; + +// For logging purposes +_num = DMS_MissionCount; + + +// Set mission side (only "bandit" is supported for now) +_side = "bandit"; + + +// find position +_pos = [10,100] call DMS_findSafePos; + + +// Set general mission difficulty +_difficulty = "moderate"; + + +// Create AI +// TODO: Spawn AI only when players are nearby +_AICount = 6 + (round (random 2)); + +_group = +[ + _pos, // Position of AI + _AICount, // Number of AI + "random", // "random","hardcore","difficult","moderate", or "easy" + "random", // "random","assault","MG","sniper" or "unarmed" OR [_type,_launcher] + _side // "bandit","hero", etc. +] call DMS_SpawnAIGroup; + + +// Create Crate +_crate = ["Box_NATO_Wps_F",_pos] call DMS_SpawnCrate; +_wreck1 = createVehicle ["Land_i_Shop_01_V1_F",[(_pos select 0) - 10, (_pos select 1),-0.1],[], 0, "CAN_COLLIDE"]; +_wreck2 = createVehicle ["Land_Sacks_goods_F",[(_pos select 0) - 2, (_pos select 1),-0.8],[], 0, "CAN_COLLIDE"]; +_wreck3 = createVehicle ["Land_StallWater_F",[(_pos select 0) - 5, (_pos select 1),-0.8],[], 0, "CAN_COLLIDE"]; +_wreck4 = createVehicle ["Land_WoodenCart_F",[(_pos select 0) - 16, (_pos select 1),-0.5],[], 0, "CAN_COLLIDE"]; +_wreck4 = createVehicle ["Land_CratesWooden_F",[(_pos select 0) - 16, (_pos select 1),-0.3],[], 0, "CAN_COLLIDE"]; + +// Set crate loot values +_crate_loot_values = +[ + 2, // Weapons + 15, // Items + 2 // Backpacks +]; + + +// Define mission-spawned AI Units +_missionAIUnits = +[ + _group // We only spawned the single group for this mission +]; + +// Define mission-spawned objects and loot values +_missionObjs = +[ + [_wreck1,_wreck2,_wreck3,_wreck4], // No spawned buildings + [_crate], + _crate_loot_values +]; + +// Define Mission Start message +_msgStart = format["A local Walmart shop is being raided, stop the raiders and take the loot!"]; + +// Define Mission Win message +_msgWIN = format["Convicts have done a good deed and stopped the raiders!"]; + +// Define Mission Lose message +_msgLOSE = format["The raiders has looted everything from Walmart and escaped!"]; + + +// Define mission name (for map marker and logging) +_missionName = "Walmart Riot"; + +// Create Markers +_markers = +[ + _pos, + _missionName, + _difficulty +] call DMS_CreateMarker; + +// Record time here (for logging purposes, otherwise you could just put "diag_tickTime" into the "DMS_AddMissionToMonitor" parameters directly) +_time = diag_tickTime; + +// Parse and add mission info to missions monitor +_added = +[ + _pos, + [ + [ + "kill", + _group + ], + [ + "playerNear", + [_pos,DMS_playerNearRadius] + ] + ], + [ + _time, + (DMS_MissionTimeOut select 0) + random((DMS_MissionTimeOut select 1) - (DMS_MissionTimeOut select 0)) + ], + _missionAIUnits, + _missionObjs, + [_msgWIN,_msgLOSE], + _markers, + _side +] call DMS_AddMissionToMonitor; + +// Check to see if it was added correctly, otherwise delete the stuff +if !(_added) exitWith +{ + diag_log format ["DMS ERROR :: Attempt to set up mission %1 with invalid parameters for DMS_AddMissionToMonitor! Deleting mission objects and resetting DMS_MissionCount.",_missionName]; + + // Delete AI units and the crate. I could do it in one line but I just made a little function that should work for every mission (provided you defined everything correctly) + _cleanup = []; + { + _cleanup pushBack _x; + false; + } count _missionAIUnits; + + _cleanup pushBack ((_missionObjs select 0)+(_missionObjs select 1)); + + _cleanup call DMS_CleanUp; + + + // Delete the markers directly + {deleteMarker _x;false;} count _markers; + + + // Reset the mission count + DMS_MissionCount = DMS_MissionCount - 1; +}; + + +// Notify players +_msgStart call DMS_BroadcastMissionStatus; + + + +if (DMS_DEBUG) then +{ + diag_log format ["DMS_DEBUG MISSION: (%1) :: Mission #%2 started at %3 with %4 AI units and %5 difficulty at time %6",_missionName,_num,_pos,_AICount,_difficulty,_time]; +}; \ No newline at end of file diff --git a/@ExileServer/addons/a3_dms/scripts/SetAILocality.sqf b/@ExileServer/addons/a3_dms/scripts/SetAILocality.sqf new file mode 100644 index 0000000..11af5a9 --- /dev/null +++ b/@ExileServer/addons/a3_dms/scripts/SetAILocality.sqf @@ -0,0 +1,28 @@ +/* + Makes a random player within 3 KM of the AI the owner. + Offloading AI can increase server performance. + Could however have negative effects if target player has a potato PC. + + How To Use: + [_pos, _group] call DMS_SetAILocality; + Posistion of the player and the group that the AIs are in. + +*/ +private ["_group","_position","_exit","_randomPlayer"]; + +_group = _this select 0; +_position = _this select 1; +_exit = false; + +while {!_exit} do +{ + _randomPlayer = call ExileServer_system_session_getRandomPlayer; + if((_randomPlayer distance2D _position) < 3000)then + { + _exit = true; + }; +}; + +ExileServerOwnershipSwapQueue pushBack [_group,_randomPlayer]; + +true \ No newline at end of file diff --git a/@ExileServer/addons/a3_dms/scripts/SpawnAIGroup.sqf b/@ExileServer/addons/a3_dms/scripts/SpawnAIGroup.sqf index d9af1f2..ce40852 100644 --- a/@ExileServer/addons/a3_dms/scripts/SpawnAIGroup.sqf +++ b/@ExileServer/addons/a3_dms/scripts/SpawnAIGroup.sqf @@ -80,12 +80,16 @@ for "_i" from 1 to _count do { // An AI will definitely spawn with a launcher if you define type if ((!isNil "_launcher") || {DMS_ai_use_launchers && {(random 100) <= DMS_ai_use_launchers_chance}}) then { + /* if (!isNil "_launcher") then { _launcher = "AT"; }; _launcher = ((missionNamespace getVariable [format ["DMS_AI_wep_launchers_%1",_launcher],["launch_NLAW_F"]]) call BIS_fnc_selectRandom); + */ + + _launcher = DMS_AI_wep_launchers_AT call BIS_fnc_selectRandom; _unit addBackpack "B_Carryall_mcamo"; @@ -110,13 +114,18 @@ if(_pos_z == 0) then if (DMS_ai_offload_to_client) then -{ +{ + /* _client = (allPlayers call BIS_fnc_selectRandom); ExileServerOwnershipSwapQueue pushBack [_group,_client]; + */ + + [_group,_pos] call DMS_SetAILocality; + if(DMS_DEBUG) then { - diag_log format["DMS_DEBUG SpawnAIGroup :: Swapping group ownership of %1 to %2",_group,_client]; - }; + diag_log format["DMS_DEBUG SpawnAIGroup :: Swapping group ownership of %1 to clients.",_group]; + }; }; diff --git a/Pre-Packed PBO/a3_dms.pbo b/Pre-Packed PBO/a3_dms.pbo index 632f000..7bc5e58 100644 Binary files a/Pre-Packed PBO/a3_dms.pbo and b/Pre-Packed PBO/a3_dms.pbo differ