From d4733a5559a4cd957896aa9cd43f6e206bcdf87b Mon Sep 17 00:00:00 2001 From: eraser1 Date: Sun, 20 Sep 2015 15:26:08 -0500 Subject: [PATCH] Fixes + Idiot-proofing + New Function * NEW CONFIG VALUE: "DMS_MaxSurfaceNormal" * The above config value now determines the maximum incline that a mission can spawn on. Default value is 0.95, which should be sufficiently flat. * Added some grouping explanations in mission config settings. * Added check for A3XAI for the lovely ["Face"/"dayzai"](https://github.com/dayzai) * Added ability for people to use a static export from M3Editor. DMS will then calculate the relative position, and spawn it at the mission. Example provided in testmission.sqf. * Fixed an issue with DMS_fnc_TargetsKilled always returning false. --- @ExileServer/addons/a3_dms/config.cpp | 3 + @ExileServer/addons/a3_dms/config.sqf | 14 ++- .../addons/a3_dms/fn_DMS_postInit.sqf | 5 + @ExileServer/addons/a3_dms/fn_DMS_preInit.sqf | 89 ++++++++++++++++-- .../addons/a3_dms/missions/testmission.sqf | 11 ++- .../a3_dms/objects/static/base1STATIC.sqf | 27 ++++++ .../addons/a3_dms/scripts/fn_FindSafePos.sqf | 6 ++ .../a3_dms/scripts/fn_ImportFromM3E.sqf | 4 +- .../scripts/fn_ImportFromM3E_Convert.sqf | 74 +++++++++++++++ .../a3_dms/scripts/fn_MissionSuccessState.sqf | 2 +- .../a3_dms/scripts/fn_TargetsKilled.sqf | 35 +++++-- Pre-Packed PBO/a3_dms.pbo | Bin 193655 -> 200658 bytes README.md | 9 ++ 13 files changed, 257 insertions(+), 22 deletions(-) create mode 100644 @ExileServer/addons/a3_dms/objects/static/base1STATIC.sqf create mode 100644 @ExileServer/addons/a3_dms/scripts/fn_ImportFromM3E_Convert.sqf diff --git a/@ExileServer/addons/a3_dms/config.cpp b/@ExileServer/addons/a3_dms/config.cpp index ce5050f..8834d91 100644 --- a/@ExileServer/addons/a3_dms/config.cpp +++ b/@ExileServer/addons/a3_dms/config.cpp @@ -38,7 +38,10 @@ class CfgFunctions class FillCrate {}; class FindSafePos {}; class FindSuppressor {}; + //class HeliParatroopers {}; + //class HeliPatrol {}; class ImportFromM3E {}; + class ImportFromM3E_Convert {}; class IsPlayerNearby {}; class IsNearWater {}; class MissionsMonitor {}; diff --git a/@ExileServer/addons/a3_dms/config.sqf b/@ExileServer/addons/a3_dms/config.sqf index 717c3ac..649170f 100644 --- a/@ExileServer/addons/a3_dms/config.sqf +++ b/@ExileServer/addons/a3_dms/config.sqf @@ -12,16 +12,19 @@ DMS_DEBUG = false; /* Mission System Settings */ + /*General settings for dynamic missions*/ DMS_DynamicMission = true; // Enable/disable dynamic mission system DMS_MaxBanditMissions = 3; // Maximum number of Bandit Missions running at the same time DMS_StaticMission = false; // Enable/disable static missions DMS_TimeBetweenMissions = [600,900]; // [Minimum,Maximum] time between missions (if mission limit is not reached) | DEFAULT: 10-15 mins DMS_MissionTimeOut = [900,1800]; // [Minimum,Maximum] time it will take for a mission to timeout | Default: 15-30 mins + /*General settings for dynamic missions*/ DMS_playerNearRadius = 100; // How close a player has to be to a mission in order to satisfy the "playerNear" mission requirement (can be customized per mission). DMS_AI_KillPercent = 100; // The percent amount of AI that need to be killed for "killPercent" mission requirement (NOT IMPLEMENTED) + /*Mission Marker settings*/ DMS_MarkerPosRandomization = false; // Randomize the position of the circle marker of a mission DMS_MarkerPosRandomRadius = [25,100]; // Minimum/Maximum distance that the circle marker position will be randomized | Default: 0 meters to 200 meters DMS_RandomMarkerBrush = "Cross"; // See: https://community.bistudio.com/wiki/setMarkerBrush @@ -31,30 +34,38 @@ DMS_DEBUG = false; DMS_MissionMarkerLoseDotTime = 30; // How many seconds the "lose" mission dot will remain on the map DMS_MissionMarkerWinDotColor = "ColorBlue"; // The color of the "win" marker dot DMS_MissionMarkerLoseDotColor = "ColorRed"; // The color of the "lose" marker dot + /*Mission Marker settings*/ + /*Mission Cleanup/Timeout settings*/ DMS_CompletedMissionCleanup = true; // Cleanup mission-spawned buildings and AI bodies after some time DMS_CompletedMissionCleanupTime = 3600; // Minimum time until mission-spawned buildings and AI are cleaned up DMS_CleanUp_PlayerNearLimit = 20; // Cleanup of an object is aborted if a player is this many meters close to the object DMS_AIVehCleanUpTime = 900; // Time until a destroyed AI vehicle is cleaned up. DMS_MissionTimeoutReset = true; // Enable mission timeout timer reset if a player is close DMS_MissionTimeoutResetRange = 1000; // If a player is this close to a mission then it won't time-out + /*Mission Cleanup/Timeout settings*/ + /*Mission spawn location settings*/ DMS_PlayerNearBlacklist = 2000; // Missions won't spawn in a position this many meters close to a player DMS_SpawnZoneNearBlacklist = 2500; // Missions won't spawn in a position this many meters close to a spawn zone DMS_TraderZoneNearBlacklist = 3000; // Missions won't spawn in a position this many meters close to a trader zone DMS_MissionNearBlacklist = 4000; // Missions won't spawn in a position this many meters close to another mission DMS_WaterNearBlacklist = 750; // Missions won't spawn in a position this many meters close to water + DMS_MaxSurfaceNormal = 0.95; // Missions won't spawn if the surface normal of the location is less than this amount. The lower the value, the steeper the location. Greater values means flatter locations + /*Mission spawn location settings*/ DMS_MinWaterDepth = 20; // Minimum depth of water that an underwater mission can spawn at. + /*Crate/Box settings*/ DMS_HideBox = false; // "Hide" the box from being visible by players until the mission is completed. DMS_SpawnBoxSmoke = true; // Spawn a smoke grenade on mission box upon misson completion during daytime DMS_SpawnBoxIRGrenade = true; // Spawn an IR grenade on mission box upon misson completion during nighttime + /*Crate/Box settings*/ DMS_MinPlayerCount = 0; // Minimum number of players until mission start DMS_MinServerFPS = 5; // Minimum server FPS for missions to start - //Mission notification settings + /*Mission notification settings*/ DMS_PlayerNotificationTypes = [ // Notification types. Supported values are: ["dynamicTextRequest", "standardHintRequest", "systemChatRequest"] //"dynamicTextRequest", <--- Text formatting makes this weird... "standardHintRequest" @@ -62,6 +73,7 @@ DMS_DEBUG = false; ]; DMS_dynamicText_Size = 0.65; // Dynamic Text size for "dynamicTextRequest" notification type. DMS_dynamicText_Color = "#FFCC00"; // Dynamic Text color for "dynamicTextRequest" notification type. + /*Mission notification settings*/ DMS_MissionTypes = [ // List of missions with spawn chances. If they add up to 100%, they represent the percentage chance each one will spawn ["bandits",25], diff --git a/@ExileServer/addons/a3_dms/fn_DMS_postInit.sqf b/@ExileServer/addons/a3_dms/fn_DMS_postInit.sqf index 71bfe61..42bc610 100644 --- a/@ExileServer/addons/a3_dms/fn_DMS_postInit.sqf +++ b/@ExileServer/addons/a3_dms/fn_DMS_postInit.sqf @@ -12,6 +12,11 @@ EAST setFriend[RESISTANCE,0]; EAST setFriend[WEST,0]; WEST setFriend[EAST,0]; +if ((!isNil "A3XAI_isActive") && {!DMS_ai_offload_Only_DMS_AI}) then +{ + diag_log 'DMS DETECTED A3XAI. Enabling "DMS_ai_offload_Only_DMS_AI"!'; +}; + if(DMS_StaticMission) then { diff --git a/@ExileServer/addons/a3_dms/fn_DMS_preInit.sqf b/@ExileServer/addons/a3_dms/fn_DMS_preInit.sqf index 7cdda39..3151c35 100644 --- a/@ExileServer/addons/a3_dms/fn_DMS_preInit.sqf +++ b/@ExileServer/addons/a3_dms/fn_DMS_preInit.sqf @@ -1,16 +1,89 @@ /* DMS Pre-init Written by eraser1 (trainwreckdayz.com) - - This will be completely deprecated soon... -*/ - -/* Future stuff -DMS_HeliPara = compileFinal preprocessFileLineNumbers "\x\addons\dms\scripts\HeliPara.sqf"; -DMS_HeliPatrol = compileFinal preprocessFileLineNumbers "\x\addons\dms\scripts\HeliPatrol.sqf"; */ DMS_HC_Object = objNull; + //Load config -call compileFinal preprocessFileLineNumbers "\x\addons\dms\config.sqf"; \ No newline at end of file +call compileFinal preprocessFileLineNumbers "\x\addons\dms\config.sqf"; + + +/* + Original Functions from + http://maca134.co.uk/portfolio/m3editor-arma-3-map-editor/ + + Slightly modified by eraser1 +*/ + +M3E_fnc_getCenter = +{ + private ['_objects', '_ax', '_ay', '_az', '_xs', '_xc', '_xz', '_ys', '_yc', '_yz', '_zs', '_zc', '_zz']; + _objects = [_this, 0, [], [[]]] call BIS_fnc_param; + _ax = []; + _ay = []; + _az = []; + { + private ['_position']; + _position = getPosATL _x; + _ax pushBack (_position select 0); + _ay pushBack (_position select 1); + _az pushBack (_position select 2); + } foreach _objects; + _xs = 0; + _xc = {_xs = _xs + _x; true} count _ax; + _xz = _xs / _xc; + + _ys = 0; + _yc = {_ys = _ys + _x; true} count _ay; + _yz = _ys / _yc; + + _zs = 0; + _zc = {_zs = _zs + _x; true} count _az; + _zz = _zs / _zc; + + [_xz, _yz, _zz] +}; + +M3E_fnc_subArr = +{ + private ['_a1', '_a2', '_a3']; + _a1 = [_this, 0, [], [[]]] call BIS_fnc_param; + _a2 = [_this, 1, [], [[]]] call BIS_fnc_param; + if (count _a1 == 0 || {count _a2 == 0}) exitWith {[]}; + if (count _a1 != count _a2) exitWith {[]}; + _a3 = []; + { + _a3 pushBack ((_a1 select _foreachindex) - (_a2 select _foreachindex)); + } foreach _a1; + _a3 +}; + +DMS_fnc_setRelPositions = +{ + private ['_OK','_objects','_newCPos','_center']; + + _OK = params + [ + ["_objects", [], [[]]], + ["_newCPos", [], [[]],[3]] + ]; + + if (!_OK) exitWith + { + diag_log format ["DMS ERROR :: Calling DMS_fnc_setRelPositions with invalid parameters: %1",_this]; + }; + + + _center = [_objects] call M3E_fnc_getCenter; + { + private ['_relpos','_objPos']; + + _relpos = [getPosATL _x, _center] call M3E_fnc_subArr; + _objPos = [_newCPos,_relpos] call DMS_fnc_CalcPos; + + _x setPosATL _objPos; + //diag_log format ["Setting %1 at %2; %3 is the relpos from original center %4, reapplied to new center %5",typeOf _x,_objPos,_relpos,_center,_newCPos]; + } foreach _objects; +}; \ No newline at end of file diff --git a/@ExileServer/addons/a3_dms/missions/testmission.sqf b/@ExileServer/addons/a3_dms/missions/testmission.sqf index 813c580..cafee48 100644 --- a/@ExileServer/addons/a3_dms/missions/testmission.sqf +++ b/@ExileServer/addons/a3_dms/missions/testmission.sqf @@ -77,6 +77,15 @@ _veh = ] call DMS_fnc_SpawnAIVehicle; +_baseObjs = +[ + "base1STATIC", + _pos +] call DMS_fnc_ImportFromM3E_Convert; + + + + // Define mission-spawned AI Units _missionAIUnits = [ @@ -86,7 +95,7 @@ _missionAIUnits = // Define mission-spawned objects and loot values _missionObjs = [ - _staticGuns+[_veh], + _staticGuns+[_veh]+_baseObjs, [_vehicle], [[_crate,"Sniper"]] ]; diff --git a/@ExileServer/addons/a3_dms/objects/static/base1STATIC.sqf b/@ExileServer/addons/a3_dms/objects/static/base1STATIC.sqf new file mode 100644 index 0000000..ee72396 --- /dev/null +++ b/@ExileServer/addons/a3_dms/objects/static/base1STATIC.sqf @@ -0,0 +1,27 @@ +// This file is effectively the exact same as "base1.sqf" in the folder above it. +//Using relative position is preferable; this file is just an example on how to format a file with static objects. + +private ["_objs"]; +_objs = [ + ["Land_HBarrierTower_F",[1688.42,5601.6,0],180.049,[[-0.000857441,-1,0],[-0,0,1]],false], + ["Land_HBarrierTower_F",[1702.61,5582.49,0],270.462,[[-0.999968,0.00806372,0],[0,0,1]],false], + ["Land_HBarrierTower_F",[1688.42,5563.38,0],0,[[0,1,0],[0,0,1]],false], + ["Land_HBarrierTower_F",[1674.23,5582.49,0],90.6414,[[0.999937,-0.0111948,0],[0,-0,1]],false], + ["Land_HBarrierWall_corridor_F",[1673.47,5576.89,0],0,[[0,1,0],[0,0,1]],false], + ["Land_CncWall4_F",[1682.45,5565.37,0],0,[[0,1,0],[0,0,1]],false], + ["Land_CncWall4_F",[1678.62,5567.57,0],53.1818,[[0.800541,0.599277,0],[0,0,1]],false], + ["Land_CncWall4_F",[1676.66,5572.1,0],82.6364,[[0.991753,0.128166,0],[0,0,1]],false], + ["Land_CncWall4_F",[1694.47,5565.37,0],0,[[0,1,0],[0,0,1]],false], + ["Land_CncWall4_F",[1698.32,5567.56,0],302.318,[[-0.845092,0.534621,0],[0,0,1]],false], + ["Land_CncWall4_F",[1700.14,5572.25,0],280.636,[[-0.982818,0.184575,0],[0,0,1]],false], + ["Land_HBarrierWall_corridor_F",[1703.4,5577.06,0],0,[[0,1,0],[0,0,1]],false], + ["Land_CncWall4_F",[1700.73,5588.52,0],262.221,[[-0.990797,-0.135353,0],[-0,0,1]],false], + ["Land_CncWall4_F",[1699.35,5593.46,0],249.539,[[-0.936912,-0.349566,0],[-0,0,1]],false], + ["Land_CncWall4_F",[1696.28,5597.31,0],215.994,[[-0.587697,-0.809081,0],[-0,0,1]],false], + ["Land_CncWall1_F",[1693.6,5599.05,0],201.682,[[-0.369452,-0.92925,0],[-0,0,1]],false], + ["Land_HBarrier_1_F",[1692.58,5600.12,0],290.455,[[-0.93695,0.349464,0],[0,0,1]],false], + ["Land_HBarrier_Big_F",[1681.72,5597.13,0],309.682,[[-0.769601,0.638525,0],[0,0,1]],false], + ["Land_HBarrier_Big_F",[1677,5589.9,0],298.636,[[-0.877679,0.479249,0],[0,0,1]],false] +]; + +_objs; \ No newline at end of file diff --git a/@ExileServer/addons/a3_dms/scripts/fn_FindSafePos.sqf b/@ExileServer/addons/a3_dms/scripts/fn_FindSafePos.sqf index f6cf442..342149a 100644 --- a/@ExileServer/addons/a3_dms/scripts/fn_FindSafePos.sqf +++ b/@ExileServer/addons/a3_dms/scripts/fn_FindSafePos.sqf @@ -50,6 +50,12 @@ while{!_validspot} do { throw ("players"); }; + + if (((surfaceNormal _pos) select 2)0) && {((time - (_x getVariable ["DMS_LastAIDistanceCheck",time]))>DMS_AIDistanceCheckFrequency) && {((getPosWorld _x) distance2D (_x getVariable ["DMS_AISpawnPos",getPosWorld _x]))>DMS_MaxAIDistance}}) then + private ["_lastDistanceCheckTime", "_spawnPos"]; + + _lastDistanceCheckTime = _x getVariable ["DMS_LastAIDistanceCheck",time]; + _pos = getPosWorld _x; + _spawnPos = _x getVariable ["DMS_AISpawnPos",_pos]; + + if ((DMS_MaxAIDistance>0) && {((time - _lastDistanceCheckTime)>DMS_AIDistanceCheckFrequency) && {(_pos distance2D _spawnPos)>DMS_MaxAIDistance}}) then { _x setDamage 1; diag_log format ["Killed a runaway unit! |%1| was more than %2m away from its spawn position %3!",_x,DMS_MaxAIDistance,_x getVariable "DMS_AISpawnPos"]; @@ -49,14 +54,23 @@ try diag_log format ["DMS ERROR :: %1 is neither OBJECT nor GROUP!",_x]; }; { - if ((DMS_MaxAIDistance>0) && {((time - (_x getVariable ["DMS_LastAIDistanceCheck",time]))>DMS_AIDistanceCheckFrequency) && {((getPosWorld _x) distance2D (_x getVariable ["DMS_AISpawnPos",getPosWorld _x]))>DMS_MaxAIDistance}}) then + if (alive _x) then { - _x setDamage 1; - diag_log format ["Killed a runaway unit! |%1| was more than %2m away from its spawn position %3!",_x,DMS_MaxAIDistance,_x getVariable "DMS_AISpawnPos"]; - } - else - { - throw _x; + private ["_lastDistanceCheckTime", "_spawnPos"]; + + _lastDistanceCheckTime = _x getVariable ["DMS_LastAIDistanceCheck",time]; + _pos = getPosWorld _x; + _spawnPos = _x getVariable ["DMS_AISpawnPos",_pos]; + + if ((DMS_MaxAIDistance>0) && {((time - _lastDistanceCheckTime)>DMS_AIDistanceCheckFrequency) && {(_pos distance2D _spawnPos)>DMS_MaxAIDistance}}) then + { + _x setDamage 1; + diag_log format ["Killed a runaway unit! |%1| was more than %2m away from its spawn position %3!",_x,DMS_MaxAIDistance,_x getVariable "DMS_AISpawnPos"]; + } + else + { + throw _x; + }; }; } forEach (units _x); }; @@ -66,7 +80,8 @@ try } catch { - if (DMS_DEBUG) then { + if (DMS_DEBUG) then + { diag_log format ["DMS_DEBUG TargetsKilled :: %1 is still alive! All of %2 are not yet killed!",_exception,_this]; }; }; diff --git a/Pre-Packed PBO/a3_dms.pbo b/Pre-Packed PBO/a3_dms.pbo index a7009dd5463f814ac1cbada0cd0a68190fc0acd7..c1dc7fc3481867abe302f307ff4fcf450ecb2c4c 100644 GIT binary patch delta 6015 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 diff --git a/README.md b/README.md index 332599e..561b93b 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,15 @@ if (!hasInterface && !isServer) then ## Changelog: +#### September 20, 2015 (3:30 PM CST-America): +* NEW CONFIG VALUE: "DMS_MaxSurfaceNormal" +* The above config value now determines the maximum incline that a mission can spawn on. Default value is 0.95, which should be sufficiently flat. +* Added some grouping explanations in mission config settings. +* Added check for A3XAI for the lovely ["Face"/"dayzai"](https://github.com/dayzai) +* Added ability for people to use a static export from M3Editor. DMS will then calculate the relative position, and spawn it at the mission. Example provided in testmission.sqf. +* Fixed an issue with DMS_fnc_TargetsKilled always returning false. + + #### September 20, 2015 (12:30 AM CST-America): * NEW CONFIG VALUE: "DMS_ai_offload_Only_DMS_AI" * You can use "DMS_ai_offload_Only_DMS_AI" to offload only AI spawned by DMS. This should resolve any issues with other mission systems from DMS.