305 lines
8.4 KiB
Plaintext
305 lines
8.4 KiB
Plaintext
|
/*
|
||
|
DayZ Mission System Functions by Vampire
|
||
|
Updated for DZMS 2.0 by JasonTM
|
||
|
*/
|
||
|
|
||
|
DZMSSpawnCrate = {
|
||
|
local _mission = _this select 0;
|
||
|
local _cratePos = _this select 1;
|
||
|
local _boxType = _this select 2;
|
||
|
local _lootType = _this select 3;
|
||
|
local _offset = _this select 4;
|
||
|
local _z = [0, (_cratePos select 2)] select (count _cratePos == 3);
|
||
|
local _cratePosition = [(_cratePos select 0) + (_offset select 0), (_cratePos select 1) + (_offset select 1), _z];
|
||
|
|
||
|
if (count _offset > 2) then {
|
||
|
_cratePosition set [2, (_offset select 2)];
|
||
|
};
|
||
|
|
||
|
// Override regular crates because of Vanilla blacklisting
|
||
|
if (!DZMSEpoch) then {
|
||
|
if !(_boxType == "DZ_MedBox") then {
|
||
|
_boxType = "AmmoBoxBig";
|
||
|
};
|
||
|
};
|
||
|
|
||
|
local _crate = _boxType createVehicle _cratePosition;
|
||
|
|
||
|
if (count _this > 5) then {
|
||
|
_crate setDir (_this select 5);
|
||
|
};
|
||
|
|
||
|
_crate setPos _cratePosition;
|
||
|
_crate setVariable ["permaLoot",true];
|
||
|
clearWeaponCargoGlobal _crate;
|
||
|
clearMagazineCargoGlobal _crate;
|
||
|
_crate addEventHandler ["HandleDamage", {0}];
|
||
|
_crate enableSimulation false;
|
||
|
((DZMSMissionData select _mission) select 3) set [count ((DZMSMissionData select _mission) select 3), [_crate,_lootType]];
|
||
|
_crate // return crate object for AN2 mission
|
||
|
};
|
||
|
|
||
|
DZMSNearPlayer = {
|
||
|
local _result = false;
|
||
|
local _position = _this select 0;
|
||
|
local _radius = _this select 1;
|
||
|
{
|
||
|
if ((isPlayer _x) && (_x distance _position <= _radius)) then {
|
||
|
_result = true;
|
||
|
};
|
||
|
} count playableUnits;
|
||
|
_result
|
||
|
};
|
||
|
|
||
|
DZMSCleanupThread = {
|
||
|
local _coords = _this select 0;
|
||
|
local _mission = _this select 1;
|
||
|
local _objects = _this select 2;
|
||
|
local _vehicles = _this select 3;
|
||
|
local _crates = _this select 4;
|
||
|
local _groups = _this select 5;
|
||
|
local _staticGuns = _this select 6;
|
||
|
local _posIndex = _this select 7;
|
||
|
local _time0ut = _this select 8;
|
||
|
local _cleaned = false;
|
||
|
local _time = diag_tickTime;
|
||
|
|
||
|
while {!_cleaned} do {
|
||
|
|
||
|
if (DZMSSceneryDespawnTimer > 0 || _time0ut) then {
|
||
|
if ((diag_tickTime - _time) > DZMSSceneryDespawnTimer*60 || _time0ut) then {
|
||
|
|
||
|
// delete mission objects
|
||
|
{
|
||
|
_x call sched_co_deleteVehicle;
|
||
|
} count _objects;
|
||
|
|
||
|
// delete vehicles if they are not claimed
|
||
|
{
|
||
|
if (_x getVariable ["DZMSCleanup" + dayz_serverKey,false]) then {
|
||
|
_x call sched_co_deleteVehicle;
|
||
|
};
|
||
|
|
||
|
} count _vehicles;
|
||
|
|
||
|
// Delete Remaining AI that are alive
|
||
|
{
|
||
|
if ((_x getVariable ["DZMSAI" + dayz_serverKey,nil]) select 0 == _mission) then {
|
||
|
_x call sched_co_deleteVehicle;
|
||
|
};
|
||
|
} count allunits;
|
||
|
|
||
|
// Delete Static Guns
|
||
|
{
|
||
|
_x call sched_co_deleteVehicle;
|
||
|
} count _staticGuns;
|
||
|
|
||
|
uiSleep 10; // Need to sleep to let the group count get to zero
|
||
|
|
||
|
// Remove AI groups if mission times out
|
||
|
{
|
||
|
if (count units _x == 0) then {
|
||
|
deleteGroup _x;
|
||
|
_groups = _groups - [_x];
|
||
|
//diag_log format ["DZMS: Group %1 deleted.",_x];
|
||
|
if (count _groups > 0) then {
|
||
|
diag_log format ["DZMS: Group array %1",_groups];
|
||
|
};
|
||
|
};
|
||
|
} count _groups;
|
||
|
|
||
|
// delete mission crates if enabled
|
||
|
if (DZMSSceneryDespawnLoot || _time0ut) then {
|
||
|
if (count _crates > 0) then {
|
||
|
// Wait until players are at least 50 meters away
|
||
|
if !([_coords,50] call DZMSNearPlayer) then {
|
||
|
{
|
||
|
(_x select 0) call sched_co_deleteVehicle;
|
||
|
} count _crates;
|
||
|
_cleaned = true;
|
||
|
};
|
||
|
};
|
||
|
} else {
|
||
|
_cleaned = true;
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
DZE_MissionPositions set [_posIndex, -1];
|
||
|
diag_log format ["DZMS: Cleanup for mission %1 complete.",_mission];
|
||
|
};
|
||
|
|
||
|
// Generates the keys for mission vehicles - Epoch/Overpoch only
|
||
|
DZMSVehKey = {
|
||
|
local _vehicle = _this;
|
||
|
local _keyColor = ["Green","Red","Blue","Yellow","Black"] call BIS_fnc_selectRandom;
|
||
|
local _keyNumber = (floor(random 2500)) + 1;
|
||
|
local _keySelected = format["ItemKey%1%2",_keyColor,_keyNumber];
|
||
|
local _isKeyOK = isClass(configFile >> "CfgWeapons" >> _keySelected);
|
||
|
local _characterID = str(getNumber(configFile >> "CfgWeapons" >> _keySelected >> "keyid"));
|
||
|
|
||
|
if (_isKeyOK) then {
|
||
|
_vehicle addWeaponCargoGlobal [_keySelected,1];
|
||
|
_vehicle setVariable ["CharacterID",_characterID,true];
|
||
|
} else {
|
||
|
_vehicle setVariable ["CharacterID","0",true];
|
||
|
diag_log format["There was a problem generating a key for vehicle %1",_vehicle];
|
||
|
};
|
||
|
};
|
||
|
|
||
|
DZMSMessage = {
|
||
|
local _type = _this select 0;
|
||
|
local _title = _this select 1;
|
||
|
local _message = _this select 2;
|
||
|
local _color = "";
|
||
|
|
||
|
call {
|
||
|
if (DZMSAnnounceType == "Hint") exitWith {
|
||
|
_color = if (_type == "Hero") then {"#0D00FF";} else {"#990000";}; // Blue and Red
|
||
|
RemoteMessage = ["hintNoImage",[_title,_message],[_color,"1.75"]];
|
||
|
};
|
||
|
if (DZMSAnnounceType == "titleText") exitWith {
|
||
|
RemoteMessage = ["titleText",_message];
|
||
|
};
|
||
|
if (DZMSAnnounceType == "rollingMessages") exitWith {
|
||
|
RemoteMessage = ["rollingMessages",_message];
|
||
|
};
|
||
|
if (DZMSAnnounceType == "DynamicText") exitWith {
|
||
|
_color = if (_type == "Hero") then {"#0D00FF";} else {"#990000";}; // Blue and Red
|
||
|
_params = ["0.40","#FFFFFF","0.60",_color,0,-.35,10,0.5];
|
||
|
RemoteMessage = ["dynamic_text", ["DZMS",_message],_params];
|
||
|
};
|
||
|
};
|
||
|
publicVariable "RemoteMessage";
|
||
|
};
|
||
|
|
||
|
DZMSisClosest = {
|
||
|
local _position = _this;
|
||
|
local _closest = objNull;
|
||
|
local _scandist = DZMSAutoClaimAlertDistance;
|
||
|
|
||
|
{
|
||
|
local _dist = vehicle _x distance _position;
|
||
|
if (isPlayer _x && _dist < _scandist) then {
|
||
|
_closest = _x;
|
||
|
_scandist = _dist;
|
||
|
};
|
||
|
} count playableUnits;
|
||
|
|
||
|
_closest
|
||
|
};
|
||
|
|
||
|
DZMSAutoClaimAlert = {
|
||
|
local _unit = _this select 0;
|
||
|
local _mission = _this select 1;
|
||
|
local _type = _this select 2;
|
||
|
local _name = if (typeName _unit == "ARRAY") then {_unit select 1;} else {name _unit;};
|
||
|
local _message = call {
|
||
|
if (_type == "Start") exitWith {["STR_CL_AUTOCLAIM_ANNOUNCE",_mission,DZMSAutoClaimDelayTime];};
|
||
|
if (_type == "Stop") exitWith {["STR_CL_AUTOCLAIM_NOCLAIM",_mission];};
|
||
|
if (_type == "Return") exitWith {["STR_CL_AUTOCLAIM_RETURN",DZMSAutoClaimTimeout];};
|
||
|
if (_type == "Reclaim") exitWith {"STR_CL_AUTOCLAIM_RECLAIM";};
|
||
|
if (_type == "Claimed") exitWith {["STR_CL_AUTOCLAIM_CLAIM",_name,_mission];};
|
||
|
if (_type == "Unclaim") exitWith {["STR_CL_AUTOCLAIM_ABANDON",_name,_mission];};
|
||
|
};
|
||
|
|
||
|
if (_type == "Claimed" || _type == "Unclaim") exitWith {
|
||
|
RemoteMessage = ["IWAC",_message];
|
||
|
publicVariable "RemoteMessage";
|
||
|
};
|
||
|
|
||
|
RemoteMessage = ["IWAC",_message];
|
||
|
(owner _unit) publicVariableClient "RemoteMessage";
|
||
|
};
|
||
|
|
||
|
DZMSCheckReturningPlayer = {
|
||
|
local _position = _this select 0;
|
||
|
local _acArray = _this select 1;
|
||
|
local _playerUID = _acArray select 0;
|
||
|
local _returningPlayer = objNull;
|
||
|
|
||
|
{
|
||
|
if ((isPlayer _x) && (_x distance _position <= DZMSAutoClaimAlertDistance) && (getplayerUID _x == _playerUID)) then {
|
||
|
_returningPlayer = _x;
|
||
|
};
|
||
|
} count playableUnits;
|
||
|
|
||
|
_returningPlayer
|
||
|
};
|
||
|
|
||
|
DZMSAbortMission = {
|
||
|
local _mission = _this select 0;
|
||
|
local _aiType = _this select 1;
|
||
|
local _markerIndex = _this select 2;
|
||
|
local _posIndex = _this select 3;
|
||
|
local _remove = [];
|
||
|
|
||
|
{
|
||
|
if (typeName _x == "ARRAY") then {
|
||
|
_remove set [count _remove, (_x select 1)];
|
||
|
};
|
||
|
} count (DZE_ServerMarkerArray select _markerIndex);
|
||
|
|
||
|
PVDZ_ServerMarkerSend = ["end",_remove];
|
||
|
publicVariable "PVDZ_ServerMarkerSend";
|
||
|
|
||
|
if (_aiType == "Hero") then {
|
||
|
DZMSHeroEndTime = diag_tickTime;
|
||
|
DZMSHeroRunning = DZMSHeroRunning - 1;
|
||
|
} else {
|
||
|
DZMSBanditEndTime = diag_tickTime;
|
||
|
DZMSBanditRunning = DZMSBanditRunning - 1;
|
||
|
};
|
||
|
|
||
|
DZMSMissionData set [_mission, -1];
|
||
|
DZE_ServerMarkerArray set [_markerIndex, -1];
|
||
|
DZE_MissionPositions set [_posIndex, -1];
|
||
|
};
|
||
|
|
||
|
DZMSFreeze = {
|
||
|
{
|
||
|
if !(_x getVariable ["DoNotFreeze", false]) then {
|
||
|
{
|
||
|
if (alive _x) then {
|
||
|
_x disableAI "TARGET";
|
||
|
_x disableAI "MOVE";
|
||
|
_x disableAI "FSM";
|
||
|
_x setVehicleInit "this hideObject true";
|
||
|
};
|
||
|
} count units _x;
|
||
|
processInitCommands;
|
||
|
|
||
|
{
|
||
|
clearVehicleInit _x;
|
||
|
} count units _x;
|
||
|
|
||
|
if (DZMSDebug) then {diag_log format ["DZMS: Freezing Units of Group: %1", _x];};
|
||
|
};
|
||
|
} count _this;
|
||
|
};
|
||
|
|
||
|
DZMSUnFreeze = {
|
||
|
{
|
||
|
if !(_x getVariable ["DoNotFreeze", false]) then {
|
||
|
{
|
||
|
if (alive _x) then {
|
||
|
_x enableAI "TARGET";
|
||
|
_x enableAI "MOVE";
|
||
|
_x enableAI "FSM";
|
||
|
_x setVehicleInit "this hideObject false";
|
||
|
};
|
||
|
} count units _x;
|
||
|
processInitCommands;
|
||
|
|
||
|
{
|
||
|
clearVehicleInit _x;
|
||
|
} count units _x;
|
||
|
|
||
|
if (DZMSDebug) then {diag_log format ["DZMS: Unfreezing Units of Group: %1", _x];};
|
||
|
};
|
||
|
} count _this;
|
||
|
};
|
||
|
|
||
|
//------------------------------------------------------------------//
|
||
|
if (DZMSDebug) then {diag_log text format ["[DZMS]: Mission Functions Script Loaded!"];};
|