diff --git a/@ExileServer/addons/a3_dms/config.cpp b/@ExileServer/addons/a3_dms/config.cpp index 7e53926..5c2ba01 100644 --- a/@ExileServer/addons/a3_dms/config.cpp +++ b/@ExileServer/addons/a3_dms/config.cpp @@ -62,6 +62,7 @@ class CfgFunctions class SpawnBanditMission {}; class SpawnCrate {}; class SpawnMinefield {}; + class SpawnPersistentVehicle {}; class SpawnNonPersistentVehicle {}; class TargetsKilled {}; }; diff --git a/@ExileServer/addons/a3_dms/config.sqf b/@ExileServer/addons/a3_dms/config.sqf index 84b96dc..de8a193 100644 --- a/@ExileServer/addons/a3_dms/config.sqf +++ b/@ExileServer/addons/a3_dms/config.sqf @@ -25,6 +25,10 @@ DMS_DEBUG = false; DMS_AI_KillPercent = 100; // The percent amount of AI that need to be killed for "killPercent" mission requirement (NOT IMPLEMENTED) /*Mission Marker settings*/ + DMS_MarkerText_ShowMissionPrefix = true; // Whether or not to place a prefix before the mission marker text. Enable this if your players get confused by the marker names :P + DMS_MarkerText_MissionPrefix = "Mission:"; // The text displayed before the mission name in the mission marker. + DMS_MarkerText_ShowAICount = true; // Whether or not to display the number of remaining AI in the marker name. + DMS_MarkerText_AIName = "Units"; // What the AI will be called in the map marker. For example, the marker text can show: "Car Dealer (3 Units remaining)" 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 @@ -94,21 +98,22 @@ DMS_DEBUG = false; /*Mission notification settings*/ DMS_BanditMissionTypes = [ // List of missions with spawn chances. If they add up to 100%, they represent the percentage chance each one will spawn - ["bandits",25], - ["bauhaus",25], - ["beertransport",15], - ["behindenemylines",10], ["blackhawkdown",45], - ["cardealer",25], ["construction",35], ["donthasslethehoff",30], - ["foodtransport",25], - ["guntransport",20], + ["bandits",25], + ["bauhaus",25], + ["cardealer",25], ["humanitarian",25], - ["lost_battalion",10], - ["mercenaries",20], - ["roguenavyseals",15], + ["foodtransport",25], ["walmart",20], + ["mercenaries",20], + ["guntransport",20], + ["beertransport",15], + ["roguenavyseals",15], + ["thieves",10], + ["lost_battalion",10], + ["behindenemylines",10], ["mercbase",5] ]; @@ -591,7 +596,9 @@ DMS_DEBUG = false; DMS_TransportTrucks = [ // List of transport trucks that can spawn "Exile_Car_Van_Guerilla01", - "Exile_Car_Van_Black" + "Exile_Car_Zamak", + "Exile_Car_Tempest", + "Exile_Car_HEMMT" ]; DMS_RefuelTrucks = [ // List of refuel trucks that can spawn diff --git a/@ExileServer/addons/a3_dms/fn_DMS_postInit.sqf b/@ExileServer/addons/a3_dms/fn_DMS_postInit.sqf index 63ebdd6..0c516bd 100644 --- a/@ExileServer/addons/a3_dms/fn_DMS_postInit.sqf +++ b/@ExileServer/addons/a3_dms/fn_DMS_postInit.sqf @@ -27,6 +27,20 @@ if(DMS_StaticMission) then if (DMS_DynamicMission) then { DMS_AttemptsUntilThrottle = DMS_AttemptsUntilThrottle + 1; + + DMS_CLIENT_fnc_spawnDynamicText = + { + [ + _this, + 0, + safeZoneY, + 10, + 1 + ] spawn BIS_fnc_dynamicText; + }; + + publicVariable "DMS_CLIENT_fnc_spawnDynamicText"; + call compileFinal preprocessFileLineNumbers "\x\addons\dms\missions\mission_init.sqf"; execFSM "\x\addons\dms\FSM\missions.fsm"; }; diff --git a/@ExileServer/addons/a3_dms/missions/bandit/bandits.sqf b/@ExileServer/addons/a3_dms/missions/bandit/bandits.sqf index 42616a7..5a5b1b4 100644 --- a/@ExileServer/addons/a3_dms/missions/bandit/bandits.sqf +++ b/@ExileServer/addons/a3_dms/missions/bandit/bandits.sqf @@ -71,7 +71,7 @@ _msgStart = ['#FFFF00',"A heavily armed bandit group has been spotted, take them _msgWIN = ['#0080ff',"Convicts have successfully taken care of the bandit group!"]; // Define Mission Lose message -_msgLOSE = ['#FF0000',"The bandits have taken their vehicle and drove off, no loot today!"]; +_msgLOSE = ['#FF0000',"The bandits have driven off, no loot today!"]; // Define mission name (for map markers, mission messages, and logging) _missionName = "Armed Bandits"; diff --git a/@ExileServer/addons/a3_dms/missions/bandit/bauhaus.sqf b/@ExileServer/addons/a3_dms/missions/bandit/bauhaus.sqf index 94f39f7..8b89b4d 100644 --- a/@ExileServer/addons/a3_dms/missions/bandit/bauhaus.sqf +++ b/@ExileServer/addons/a3_dms/missions/bandit/bauhaus.sqf @@ -76,13 +76,13 @@ _missionObjs = ]; -_msgStart = ['#FFFF00',"A Bauhaus truck has crashed and lost all its building supplies, get there quickly!"]; +_msgStart = ['#FFFF00',"A Bauhaus truck has crashed and lost all its building supplies! Get there quickly!"]; // Define Mission Win message _msgWIN = ['#0080ff',"Convicts have successfully claimed the crashed Bauhaus truck!"]; // Define Mission Lose message -_msgLOSE = ['#FF0000',"The Bauhaus truck has been repaired and escaped!"]; +_msgLOSE = ['#FF0000',"The crew have repaired the Bauhaus truck and escaped!"]; // Define mission name (for map marker and logging) _missionName = "Bauhaus Truck"; diff --git a/@ExileServer/addons/a3_dms/missions/bandit/beertransport.sqf b/@ExileServer/addons/a3_dms/missions/bandit/beertransport.sqf index c739175..47e4592 100644 --- a/@ExileServer/addons/a3_dms/missions/bandit/beertransport.sqf +++ b/@ExileServer/addons/a3_dms/missions/bandit/beertransport.sqf @@ -75,7 +75,7 @@ _msgStart = ['#FFFF00',"A transport truck carrying beer and guns is being robbed _msgWIN = ['#0080ff',"Convicts have successfully claimed all of the beer and guns. 'Murica."]; // Define Mission Lose message -_msgLOSE = ['#FF0000',"The robbers have taken off with all the beer and all the guns, what a travesty!"]; +_msgLOSE = ['#FF0000',"The robbers have taken off with all the beer and all the guns! What a travesty!"]; // Define mission name (for map marker and logging) _missionName = "Beer N' Guns Truck"; diff --git a/@ExileServer/addons/a3_dms/missions/bandit/cardealer.sqf b/@ExileServer/addons/a3_dms/missions/bandit/cardealer.sqf index d00e032..7ac8d99 100644 --- a/@ExileServer/addons/a3_dms/missions/bandit/cardealer.sqf +++ b/@ExileServer/addons/a3_dms/missions/bandit/cardealer.sqf @@ -80,10 +80,10 @@ _missionObjs = ]; // Define Mission Start message -_msgStart = ['#FFFF00',"A local car dealership is being robbed by bandits, stop them!"]; +_msgStart = ['#FFFF00',"A local car dealership is being robbed by bandits. Stop them!"]; // Define Mission Win message -_msgWIN = ['#0080ff',"Convicts have secured the local dealership and removed the bandits!"]; +_msgWIN = ['#0080ff',"Convicts have secured the local dealership and eliminated the bandits!"]; // Define Mission Lose message _msgLOSE = ['#FF0000',"The bandits have escaped with the cars and left nothing but a trail of smoke behind!"]; diff --git a/@ExileServer/addons/a3_dms/missions/bandit/construction.sqf b/@ExileServer/addons/a3_dms/missions/bandit/construction.sqf index cdb1cdb..e604b3d 100644 --- a/@ExileServer/addons/a3_dms/missions/bandit/construction.sqf +++ b/@ExileServer/addons/a3_dms/missions/bandit/construction.sqf @@ -71,7 +71,7 @@ _missionObjs = ]; // Define Mission Start message -_msgStart = ['#FFFF00',"A group of mercenaries have set up a construction site, clear them out!"]; +_msgStart = ['#FFFF00',"A group of mercenaries have set up a construction site. Clear them out!"]; // Define Mission Win message _msgWIN = ['#0080ff',"Convicts have successfully demolished the construction site!"]; diff --git a/@ExileServer/addons/a3_dms/missions/bandit/donthasslethehoff.sqf b/@ExileServer/addons/a3_dms/missions/bandit/donthasslethehoff.sqf index 4907619..631523e 100644 --- a/@ExileServer/addons/a3_dms/missions/bandit/donthasslethehoff.sqf +++ b/@ExileServer/addons/a3_dms/missions/bandit/donthasslethehoff.sqf @@ -83,13 +83,13 @@ _missionObjs = ]; // Define Mission Start message -_msgStart = ['#FFFF00',"KITT has been kidnapped, secure the position and reclaim KITT!"]; +_msgStart = ['#FFFF00',"KITT has been kidnapped! Secure the position and reclaim KITT!"]; // Define Mission Win message -_msgWIN = ['#0080ff',"Convicts secured KITT, that will show the bandits not to Hassle the Hoff!"]; +_msgWIN = ['#0080ff',"Convicts secured KITT; that will show the bandits not to Hassle the Hoff!"]; // Define Mission Lose message -_msgLOSE = ['#FF0000',"KITT was never secured and has now been dismantled by the bandits, what a grim fate."]; +_msgLOSE = ['#FF0000',"KITT was never secured and has now been dismantled by the bandits... What a grim fate."]; // Define mission name (for map marker and logging) _missionName = "KITT's Location"; diff --git a/@ExileServer/addons/a3_dms/missions/bandit/foodtransport.sqf b/@ExileServer/addons/a3_dms/missions/bandit/foodtransport.sqf index 9fd136d..c9f419f 100644 --- a/@ExileServer/addons/a3_dms/missions/bandit/foodtransport.sqf +++ b/@ExileServer/addons/a3_dms/missions/bandit/foodtransport.sqf @@ -69,10 +69,10 @@ _missionObjs = ]; // Define Mission Start message -_msgStart = ['#FFFF00',"A food supply truck has been sized by ruthless bandits, stop them!"]; +_msgStart = ['#FFFF00',"A food supply truck has been sized by ruthless bandits. Stop them!"]; // Define Mission Win message -_msgWIN = ['#0080ff',"Convicts have successfully claimed the food supplies for themselves!"]; +_msgWIN = ['#0080ff',"Convicts have successfully claimed the food supplies!"]; // Define Mission Lose message _msgLOSE = ['#FF0000',"The bandits have taken the food supplies and escaped!"]; diff --git a/@ExileServer/addons/a3_dms/missions/bandit/guntransport.sqf b/@ExileServer/addons/a3_dms/missions/bandit/guntransport.sqf index 96eaf68..c9f9345 100644 --- a/@ExileServer/addons/a3_dms/missions/bandit/guntransport.sqf +++ b/@ExileServer/addons/a3_dms/missions/bandit/guntransport.sqf @@ -69,13 +69,13 @@ _missionObjs = ]; // Define Mission Start message -_msgStart = ['#FFFF00',"A gun transport truck has crashed, secure the crash site and the guns!"]; +_msgStart = ['#FFFF00',"A gun transport truck has crashed. Secure the crash site!"]; // Define Mission Win message _msgWIN = ['#0080ff',"Convicts have successfully secured the area and claimed the guns for their own!"]; // Define Mission Lose message -_msgLOSE = ['#FF0000',"The transport truck has been repaired and escaped the area!"]; +_msgLOSE = ['#FF0000',"The transport truck has been repaired and driven off!"]; // Define mission name (for map marker and logging) _missionName = "Gun Transport"; diff --git a/@ExileServer/addons/a3_dms/missions/bandit/humanitarian.sqf b/@ExileServer/addons/a3_dms/missions/bandit/humanitarian.sqf index ba32f94..20f9ff5 100644 --- a/@ExileServer/addons/a3_dms/missions/bandit/humanitarian.sqf +++ b/@ExileServer/addons/a3_dms/missions/bandit/humanitarian.sqf @@ -69,7 +69,7 @@ _missionObjs = ]; // Define Mission Start message -_msgStart = ['#FFFF00',"A truck carrying humanitarian supplies has been sized by bandits, stop them!"]; +_msgStart = ['#FFFF00',"A truck carrying humanitarian supplies has been sized by bandits. Stop them!"]; // Define Mission Win message _msgWIN = ['#0080ff',"Convicts have successfully claimed the humanitarian supplies for themselves!"]; diff --git a/@ExileServer/addons/a3_dms/missions/bandit/medical.sqf b/@ExileServer/addons/a3_dms/missions/bandit/medical.sqf index 85b33c8..4b688cf 100644 --- a/@ExileServer/addons/a3_dms/missions/bandit/medical.sqf +++ b/@ExileServer/addons/a3_dms/missions/bandit/medical.sqf @@ -69,13 +69,13 @@ _missionObjs = ]; // Define Mission Start message -_msgStart = ['#FFFF00',"A group of deranged doctors have set up a field hospital, sieze it for your own!"]; +_msgStart = ['#FFFF00',"A group of deranged doctors have set up a field hospital. Seize it for your own!"]; // Define Mission Win message _msgWIN = ['#0080ff',"Convicts have claimed the medical supplies for their own!"]; // Define Mission Lose message -_msgLOSE = ['#FF0000',"Hawkeye has ran off with the medical supplies, everything is gone!"]; +_msgLOSE = ['#FF0000',"Hawkeye has ran off with the medical supplies! Everything is gone!"]; // Define mission name (for map marker and logging) _missionName = "Deranged Doctors"; diff --git a/@ExileServer/addons/a3_dms/missions/bandit/mercenaries.sqf b/@ExileServer/addons/a3_dms/missions/bandit/mercenaries.sqf index 8e1d0b8..c3b0423 100644 --- a/@ExileServer/addons/a3_dms/missions/bandit/mercenaries.sqf +++ b/@ExileServer/addons/a3_dms/missions/bandit/mercenaries.sqf @@ -70,7 +70,7 @@ _missionObjs = _msgStart = ['#FFFF00',"A group of mercenaries has been spotted. Kill them and take their equipment!"]; // Define Mission Win message -_msgWIN = ['#0080ff',"Convicts have successfully eliminated the mercenaries"]; +_msgWIN = ['#0080ff',"Convicts have successfully eliminated the mercenaries!"]; // Define Mission Lose message _msgLOSE = ['#FF0000',"The mercenaries have escaped and they took all their loot with them!"]; diff --git a/@ExileServer/addons/a3_dms/missions/bandit/roguenavyseals.sqf b/@ExileServer/addons/a3_dms/missions/bandit/roguenavyseals.sqf index 8c6e159..22bbeee 100644 --- a/@ExileServer/addons/a3_dms/missions/bandit/roguenavyseals.sqf +++ b/@ExileServer/addons/a3_dms/missions/bandit/roguenavyseals.sqf @@ -67,10 +67,10 @@ _missionObjs = ]; // Define Mission Start message -_msgStart = ['#FFFF00',"A squad of professional Navy Seals team is performing gorilla warfare in convict land, deal with them!"]; +_msgStart = ['#FFFF00',"A squad of professional Navy Seals is performing gorilla warfare in convict land. Deal with them!"]; // Define Mission Win message -_msgWIN = ['#0080ff',"Convicts have successfully taken care of the Navy Seals, you must be the top of your class!"]; +_msgWIN = ['#0080ff',"Convicts have successfully taken care of the Navy Seals. You must be the top of your class!"]; // Define Mission Lose message _msgLOSE = ['#FF0000',"The Navy Seals have escaped and are now planning their next raid!"]; diff --git a/@ExileServer/addons/a3_dms/missions/bandit/thieves.sqf b/@ExileServer/addons/a3_dms/missions/bandit/thieves.sqf new file mode 100644 index 0000000..0e8a341 --- /dev/null +++ b/@ExileServer/addons/a3_dms/missions/bandit/thieves.sqf @@ -0,0 +1,149 @@ +/* + Sample mission (duplicate for testing purposes) +*/ + +// For logging purposes +_num = DMS_MissionCount; + + +// Set mission side (only "bandit" is supported for now) +_side = "bandit"; + + +// find position +_pos = +[ + 15,DMS_WaterNearBlacklist,DMS_MaxSurfaceNormal,DMS_SpawnZoneNearBlacklist,DMS_TraderZoneNearBlacklist,DMS_MissionNearBlacklist,DMS_PlayerNearBlacklist,DMS_ThrottleBlacklists +]call DMS_fnc_findSafePos; + + +// Set general mission difficulty +_difficulty = "easy"; + + +// Create AI +// TODO: Spawn AI only when players are nearby +_AICount = 3 + (round (random 1)); + +_group = +[ + _pos, // Position of AI + _AICount, // Number of AI + "hardcore", // "random","hardcore","difficult","moderate", or "easy" + "random", // "random","assault","MG","sniper" or "unarmed" OR [_type,_launcher] + _side // "bandit","hero", etc. +] call DMS_fnc_SpawnAIGroup; + + +_class = (DMS_MilitaryVehicles+DMS_TransportTrucks) call BIS_fnc_SelectRandom; + +//DMS_fnc_SpawnPersistentVehicle will automatically turn the pincode into a string and format it. +_pinCode = round (random 9999); + +_vehicle = [_class,_pos,_pinCode] call DMS_fnc_SpawnPersistentVehicle; + + + +// Define mission-spawned AI Units +_missionAIUnits = +[ + _group // We only spawned the single group for this mission +]; + +// Define mission-spawned objects +_missionObjs = +[ + [], // No spawned buildings + [_vehicle], + [] +]; + +// Define Mission Start message +_msgStart = ['#FFFF00',format ["A band of thieves are attempting to break into a %1. Eliminate them and you might get the car for yourself!",getText (configFile >> "CfgVehicles" >> _class >> "displayName")]]; + +// Define Mission Win message +_msgWIN = ['#0080ff',format ["Convicts have eliminated the thieves! Looks like the thieves managed to figure out that the code was %1...",_pinCode]]; + +// Define Mission Lose message +_msgLOSE = ['#FF0000',"The thieves cracked the code and drove off!"]; + +// Define mission name (for map markers, mission messages, and logging) +_missionName = "Car Thieves"; + +// Create Markers +_markers = +[ + _pos, + _missionName, + _difficulty +] call DMS_fnc_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, + true + ], + [ + "playerNear", + [_pos,DMS_playerNearRadius] + ] + ], + [ + _time, + (DMS_MissionTimeOut select 0) + random((DMS_MissionTimeOut select 1) - (DMS_MissionTimeOut select 0)) + ], + _missionAIUnits, + _missionObjs, + [_missionName,_msgWIN,_msgLOSE], + _markers, + _side, + _difficulty, + [] +] call DMS_fnc_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; + } forEach _missionAIUnits; + + _cleanup pushBack ((_missionObjs select 0)+(_missionObjs select 1)); + + { + _cleanup pushBack (_x select 0); + } foreach (_missionObjs select 2); + + _cleanup call DMS_fnc_CleanUp; + + + // Delete the markers directly + {deleteMarker _x;} forEach _markers; + + + // Reset the mission count + DMS_MissionCount = DMS_MissionCount - 1; +}; + + +// Notify players +[_missionName,_msgStart] call DMS_fnc_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/bandit/walmart.sqf b/@ExileServer/addons/a3_dms/missions/bandit/walmart.sqf index 11278af..7a99aa8 100644 --- a/@ExileServer/addons/a3_dms/missions/bandit/walmart.sqf +++ b/@ExileServer/addons/a3_dms/missions/bandit/walmart.sqf @@ -72,13 +72,13 @@ _missionObjs = ]; // Define Mission Start message -_msgStart = ['#FFFF00',"A local Walmart shop is being raided, stop the raiders and take the loot!"]; +_msgStart = ['#FFFF00',"A local Walmart shop is being raided. Stop the raiders and take the loot!"]; // Define Mission Win message _msgWIN = ['#0080ff',"Convicts have done a good deed and stopped the raiders!"]; // Define Mission Lose message -_msgLOSE = ['#FF0000',"The raiders has looted everything from Walmart and escaped!"]; +_msgLOSE = ['#FF0000',"The raiders have looted everything from Walmart and escaped!"]; // Define mission name (for map marker and logging) _missionName = "Walmart Riot"; diff --git a/@ExileServer/addons/a3_dms/scripts/fn_AddMissionToMonitor.sqf b/@ExileServer/addons/a3_dms/scripts/fn_AddMissionToMonitor.sqf index 326dde4..274b259 100644 --- a/@ExileServer/addons/a3_dms/scripts/fn_AddMissionToMonitor.sqf +++ b/@ExileServer/addons/a3_dms/scripts/fn_AddMissionToMonitor.sqf @@ -188,6 +188,11 @@ try DMS_Mission_Arr pushBack _arr; _added = true; + if (DMS_MarkerText_ShowAICount) then + { + _markerDot setMarkerText (format ["%1 (%2 %3 remaining)",markerText _markerDot,count _units,DMS_MarkerText_AIName]); + }; + if (DMS_DEBUG) then { diag_log format ["DMS_DEBUG AddMissionToMonitor :: Added |%1| to DMS_Mission_Arr!",_arr]; diff --git a/@ExileServer/addons/a3_dms/scripts/fn_BroadcastMissionStatus.sqf b/@ExileServer/addons/a3_dms/scripts/fn_BroadcastMissionStatus.sqf index d599206..f34e648 100644 --- a/@ExileServer/addons/a3_dms/scripts/fn_BroadcastMissionStatus.sqf +++ b/@ExileServer/addons/a3_dms/scripts/fn_BroadcastMissionStatus.sqf @@ -57,16 +57,15 @@ if ((typeName _message) != "STRING") then case "dynamictextrequest": { - //Unfortunately that doesn't work, so I have to do some funky stuff... - //[_x, [format ["%1
%2",toUpper _missionName,_message], 0, DMS_dynamicText_Size, DMS_dynamicText_Color]] call ExileServer_system_network_send_broadcast; - - [ - format ['%2
%5',_titleColor,_missionName,DMS_dynamicText_Color,DMS_dynamicText_Size,_message], - 0, - 0, - 10, - 1 - ] remoteExec ["BIS_fnc_dynamicText", -2]; + (format + [ + '%2
%5', + _titleColor, + _missionName, + DMS_dynamicText_Color, + DMS_dynamicText_Size,_message + ]) + remoteExecCall ["DMS_CLIENT_fnc_spawnDynamicText", -2]; }; default { diag_log format ["DMS ERROR :: Unsupported Notification Type in DMS_PlayerNotificationTypes: %1 | Calling parameters: %2",_x,_this]; }; diff --git a/@ExileServer/addons/a3_dms/scripts/fn_CreateMarker.sqf b/@ExileServer/addons/a3_dms/scripts/fn_CreateMarker.sqf index bea5fa1..086bc74 100644 --- a/@ExileServer/addons/a3_dms/scripts/fn_CreateMarker.sqf +++ b/@ExileServer/addons/a3_dms/scripts/fn_CreateMarker.sqf @@ -66,6 +66,12 @@ _dot setMarkerType "mil_dot"; _dot setMarkerText _text; missionNamespace setVariable [format ["%1_pos",_dot], _pos]; +missionNamespace setVariable [format ["%1_text",_dot], _text]; + +if (DMS_MarkerText_ShowMissionPrefix) then +{ + _dot setMarkerText (format ["%1 %2",DMS_MarkerText_MissionPrefix,_text]); +}; if (_randomMarker) then { diff --git a/@ExileServer/addons/a3_dms/scripts/fn_MissionsMonitor.sqf b/@ExileServer/addons/a3_dms/scripts/fn_MissionsMonitor.sqf index e76ac5d..bc0edfa 100644 --- a/@ExileServer/addons/a3_dms/scripts/fn_MissionsMonitor.sqf +++ b/@ExileServer/addons/a3_dms/scripts/fn_MissionsMonitor.sqf @@ -66,10 +66,28 @@ private ["_pos", "_success", "_timeStarted", "_timeUntilFail", "_units", "_build _arr = DMS_Mission_Arr deleteAt _forEachIndex; { - _x lock 1; _x allowDamage true; _x enableRopeAttach true; _x enableSimulationGlobal true; + + if (_x getVariable ["ExileIsPersistent", false]) then + { + _x lock 0; + _x setVariable ["ExileIsLocked",0]; + + _x setVariable ["ExileLastLockToggleAt", time]; + _x setVariable ["ExileAccessDenied", false]; + _x setVariable ["ExileAccessDeniedExpiresAt", 0]; + + // NOW we save the vehicle in the database, since we know we're not deleting this vehicle. + _x call ExileServer_object_vehicle_database_insert; + _x call ExileServer_object_vehicle_database_update; + } + else + { + _x lock 1; + }; + _x call ExileServer_system_simulationMonitor_addVehicle; } forEach _vehs; @@ -90,15 +108,17 @@ private ["_pos", "_success", "_timeStarted", "_timeUntilFail", "_units", "_build throw format ["Mission (%1) Success at %2 with message %3.",_missionName,_pos,_msgWIN]; }; - if (DMS_MissionTimeoutReset && {[_pos,DMS_MissionTimeoutResetRange] call DMS_fnc_IsPlayerNearby}) then - { - _x set [2,[diag_tickTime,_timeUntilFail]]; - - throw format ["Mission Timeout Extended at %1 with timeout after %2 seconds. Position: %3",diag_tickTime,_timeUntilFail,_pos]; - }; - if ((diag_tickTime-_timeStarted)>_timeUntilFail) then { + // Check to see if the timeout should be extended before ending the mission. + if (DMS_MissionTimeoutReset && {[_pos,DMS_MissionTimeoutResetRange] call DMS_fnc_IsPlayerNearby}) then + { + _x set [2,[diag_tickTime,_timeUntilFail]]; + + throw format ["Mission Timeout Extended at %1 with timeout after %2 seconds. Position: %3",diag_tickTime,_timeUntilFail,_pos]; + }; + + //Nobody is nearby so just cleanup objects from here _cleanupList = (_units+_buildings+_vehs); @@ -125,6 +145,21 @@ private ["_pos", "_success", "_timeStarted", "_timeUntilFail", "_units", "_build throw format ["Mission (%1) Fail at %2 with message %3.",_missionName,_pos,_msgLose]; }; + + if (DMS_MarkerText_ShowAICount) then + { + private ["_dot", "_text"]; + + _dot = _markers select 0; + _text = missionNamespace getVariable [format ["%1_text",_dot],_missionName]; + + if (DMS_MarkerText_ShowMissionPrefix) then + { + _text = format ["%1 %2",DMS_MarkerText_MissionPrefix,_text]; + }; + + _dot setMarkerText (format ["%1 (%2 %3 remaining)",_text,{alive _x} count _units,DMS_MarkerText_AIName]); + }; } catch { diff --git a/@ExileServer/addons/a3_dms/scripts/fn_RemoveMarkers.sqf b/@ExileServer/addons/a3_dms/scripts/fn_RemoveMarkers.sqf index 5dcf140..3d9f2b6 100644 --- a/@ExileServer/addons/a3_dms/scripts/fn_RemoveMarkers.sqf +++ b/@ExileServer/addons/a3_dms/scripts/fn_RemoveMarkers.sqf @@ -12,11 +12,12 @@ ] call DMS_fnc_RemoveMarkers; */ -private ["_markerDot","_markerCircle","_status"]; +private ["_markerDot", "_markerCircle", "_status", "_text"]; _markerDot = _this select 0 select 0; _markerCircle = _this select 0 select 1; _status = _this select 1; +_text = missionNamespace getVariable [format ["%1_text",_markerDot],markerText _markerDot]; if (DMS_DEBUG) then @@ -27,6 +28,7 @@ if (DMS_DEBUG) then deleteMarker _markerCircle; missionNamespace setVariable [format ["%1_pos",_markerDot], nil]; +missionNamespace setVariable [format ["%1_text",_markerDot], nil]; if (_status == "win") then { @@ -34,7 +36,7 @@ if (_status == "win") then { deleteMarker _markerDot; }; - _markerDot setMarkerText ("COMPLETED: "+markerText _markerDot); + _markerDot setMarkerText ("COMPLETED: "+_text); _markerDot setMarkerColor DMS_MissionMarkerWinDotColor; //_markerDot spawn {sleep DMS_MissionMarkerWinDotTime;deleteMarker _this;}; [DMS_MissionMarkerWinDotTime, {deleteMarker _this;}, _markerDot, false] call ExileServer_system_thread_addTask; @@ -49,7 +51,7 @@ else { deleteMarker _markerDot; }; - _markerDot setMarkerText ("FAILED: "+markerText _markerDot); + _markerDot setMarkerText ("FAILED: "+_text); _markerDot setMarkerColor DMS_MissionMarkerLoseDotColor; //_markerDot spawn {sleep DMS_MissionMarkerLoseDotTime;deleteMarker _this;}; [DMS_MissionMarkerLoseDotTime, {deleteMarker _this;}, _markerDot, false] call ExileServer_system_thread_addTask; diff --git a/@ExileServer/addons/a3_dms/scripts/fn_SpawnPersistentVehicle.sqf b/@ExileServer/addons/a3_dms/scripts/fn_SpawnPersistentVehicle.sqf new file mode 100644 index 0000000..b51cbe9 --- /dev/null +++ b/@ExileServer/addons/a3_dms/scripts/fn_SpawnPersistentVehicle.sqf @@ -0,0 +1,103 @@ +/* + DMS_fnc_SpawnPersistentVehicle + Created by eraser1 + + Usage: + [ + _vehicleClass, // STRING: Vehicle classname to spawn. + _pos, // ARRAY (positionATL or position2d): Where the vehicle will be spawned (strict) + _pinCode // STRING or NUMBER: String has to be 4 digits. Number has to be between 0-9999, and will be automatically formatted. + ] call DMS_fnc_SpawnPersistentVehicle; + + Returns the created vehicle object. +*/ + + +private ["_vehicleClass", "_pos", "_pinCode", "_vehObj"]; + +_OK = params +[ + ["_vehicleClass","",[""]], + ["_pos",[],[[]],[2,3]], + ["_pinCode","",[0,""]] +]; + +_vehObj = objNull; + +try +{ + if (!_OK) then + { + throw (format ["invalid parameters: %1",_this]); + }; + + + if ((count _pos) isEqualTo 2) then + { + _pos set [2,0]; + }; + + + if ((typeName _pinCode)=="SCALAR") then + { + if (_pinCode<0 || {_pinCode>9999}) then + { + throw (format ["invalid SCALAR _pinCode value (must be between 0 and 9999): %1",_pinCode]); + }; + + switch (true) do + { + case (_pinCode<10): + { + _pinCode = format ["000%1",_pinCode]; + }; + + case (_pinCode<100): + { + _pinCode = format ["00%1",_pinCode]; + }; + + case (_pinCode<1000): + { + _pinCode = format ["0%1",_pinCode]; + }; + + default + { + _pinCode = str _pinCode; + }; + }; + }; + + if ((count _pinCode)!=4) then + { + throw (format ["invalid STRING _pinCode value (must be 4 digits): %1",_pinCode]); + }; + + // Create and set the vehicle + _vehObj = [_vehicleClass,_pos] call DMS_fnc_SpawnNonPersistentVehicle; + _vehObj setPosATL _pos; + + // Set up EHs + _vehObj addEventHandler ["GetOut", { _this call ExileServer_object_vehicle_event_onGetOut}]; + _vehObj addMPEventHandler ["MPKilled", { _this call ExileServer_object_vehicle_event_onMPKilled}]; + + // Set up vars + _vehObj setVariable ["ExileIsPersistent", true]; + _vehObj setVariable ["ExileAccessCode", _pinCode]; + _vehObj setVariable ["ExileOwnerUID", "76561198027700602"]; // That is my (eraser1's) PUID. Just so you don't think I'm trying to be sneaky... + + // Deny access until specified to do so. + _vehObj setVariable ["ExileIsLocked",-1]; + _vehObj setVariable ["ExileLastLockToggleAt", time]; + _vehObj setVariable ["ExileAccessDenied", true]; + _vehObj setVariable ["ExileAccessDeniedExpiresAt", 999999]; +} +catch +{ + diag_log format ["DMS ERROR :: Calling DMS_fnc_SpawnPersistentVehicle with %1!",_exception]; +}; + + + +_vehObj \ No newline at end of file diff --git a/Pre-Packed PBO/a3_dms.pbo b/Pre-Packed PBO/a3_dms.pbo index 2215fe2..9866b46 100644 Binary files a/Pre-Packed PBO/a3_dms.pbo and b/Pre-Packed PBO/a3_dms.pbo differ diff --git a/README.md b/README.md index 64ec851..b6a9ba8 100644 --- a/README.md +++ b/README.md @@ -52,14 +52,31 @@ if (!hasInterface && !isServer) then ## Changelog: +#### October 4, 2015 (10:30 PM CST-America): +* **NEW CONFIG VALUES**: + + |DMS_MarkerText_ShowMissionPrefix| + |DMS_MarkerText_MissionPrefix| + |DMS_MarkerText_ShowAICount| + |DMS_MarkerText_AIName| +* New function: DMS_fnc_SpawnPersistentVehicle. It will spawn inaccessible vehicles by default and convert VALID pincode inputs to the proper format. +* New mission: "Car Thieves" (thieves.sqf). It uses the new DMS_fnc_SpawnPersistentVehicle. When the mission is completed successfully, the code is displayed in the completion message. +* You can now add a "prefix" to the marker text of each mission. +* You can now display the number of remaining AI in the marker text (it should update about every 15 seconds). +* Rearranged the missions in the config to look prettier. Don't judge. +* Added the "Zamak", "Tempest", and "HEMMT" to "DMS_TransportTrucks" array. Removed "Exile_Car_Van_Black" +* "dynamicTextRequest" messages will now appear at the top of the screen, so it shouldn't distract/block stuff in focus. +* Fixed some spelling, improved some grammar (will require mission updates, it's really minor though). + + #### October 3, 2015 (10:30 PM CST-America): * **You must update all of your mission files; the mission message system as well as the calling parameters for DMS_fnc_FindSafePos have been overhauled and will be incompatible with previous versions.** * NEW CONFIG VALUES: - |DMS_ThrottleBlacklists| - |DMS_AttemptsUntilThrottle| - |DMS_ThrottleCoefficient| - |DMS_MinThrottledDistance| + |DMS_ThrottleBlacklists| + |DMS_AttemptsUntilThrottle| + |DMS_ThrottleCoefficient| + |DMS_MinThrottledDistance| * Decreased "DMS_TraderZoneNearBlacklist","DMS_MissionNearBlacklist","DMS_WaterNearBlacklist" * Changed "DMS_dynamicText_Color" to "#FFFFFF" (white) * Replaced weapon classes in "DMS_CrateCase_Sniper" to the base classes; all attachments should now spawn in the box separately.