Merge pull request #35 from Ghostrider-DbD-/Version-6.54-Build-32

Version 6 54 build 32
This commit is contained in:
Ghostrider-DbD- 2017-01-23 01:09:51 -05:00 committed by GitHub
commit 8da2d0dc03
62 changed files with 1190 additions and 763 deletions

View File

@ -3,7 +3,7 @@
//blck_Message = _this;
params["_msg",["_players",playableUnits]];
diag_log format["AIM.sqf ===] _this = %1 | _msg = %2 | _players = %3",_this,_msg, _players];
if (blck_debugLevel > 1) then {diag_log format["AIM.sqf ===] _this = %1 | _msg = %2 | _players = %3",_this,_msg, _players];};
blck_Message = _msg;
{
//diag_log format["AIM.sqf ===] _ = %2, and (owner _x) = %1", (owner _x), _x];

View File

@ -9,10 +9,10 @@ if (blck_debugLevel > 2) then
diag_log format ["_fnc_cleanEmptyGroups:: -- >> group count = %1 ",(count allGroups)];
diag_log format ["_fnc_cleanEmptyGroups:: -- >> Group count AI side = %1", call blck_fnc_groupsOnAISide];
};
private _grp = +allGroups;
{
//diag_log format["_fnc_cleanEmptyGroups:: - >> type of object _x = %1",typeName _x];
if ((count units _x) isEqualTo 0) then {deleteGroup _x};
}forEach allGroups;
}forEach _grp;
//if (blck_debugLevel > 2) then {diag_log "_fnc_cleanEmptyGroups:: -- >> exiting function";};

View File

@ -0,0 +1,6 @@
params["_veh"];
clearWeaponCargoGlobal _veh;
clearMagazineCargoGlobal _veh;
clearBackpackCargoGlobal _veh;
clearItemCargoGlobal _veh;

View File

@ -3,10 +3,10 @@
for DBD Clan
By Ghostrider-DBD-
Copyright 2016
Last Modified 8-13-16
Last Modified 1-22-17
*/
private["_locs","_radius","_startDir","_currentDir","_Arc","_dist","_newpos","_xpos","_ypos"];
private["_locs","_startDir","_currentDir","_Arc","_dist","_newpos"];
params["_center","_num","_minDistance","_maxDistance"];
_locs = [];

View File

@ -5,9 +5,9 @@
for DBD Clan
By Ghostrider-DBD-
Copyright 2016
Last Modified 11-16-16
Last Modified 1-22-17
*/
private["_findNew","_coords","_blackListCenter","_blackListRadius","_dist","_xpos","_ypos","_newPos","_townPos"];
private["_findNew","_coords","_dist","_xpos","_ypos","_newPos","_townPos","_pole"];
_findNew = true;
@ -19,22 +19,22 @@ while {_findNew} do {
//diag_log format["<<--->> _coords = %1",_coords];
{
if ((_x distance _coords) < blck_MinDistanceFromMission) then {
_FindNew = true;
if ((_x distance2D _coords) < blck_MinDistanceFromMission) then {
_findNew = true;
};
}forEach DBD_HeliCrashSites;
{
if ( ((_x select 0) distance _coords) < (_x select 1)) exitWith
if ( ((_x select 0) distance2D _coords) < (_x select 1)) exitWith
{
_FindNew = true;
_findNew = true;
};
} forEach blck_locationBlackList;
//diag_log format["#- findSafePosn -# blck_ActiveMissionCoords isEqualTo %1", blck_ActiveMissionCoords];
{
//diag_log format["#- findSafePosn -# blck_ActiveMissionCoords active mission item is %1", _x];
if ( (_x distance _coords) < blck_MinDistanceFromMission) exitWith
if ( (_x distance2D _coords) < blck_MinDistanceFromMission) exitWith
{
_FindNew = true;
};
@ -54,9 +54,9 @@ while {_findNew} do {
if !(_ignore) then
{
//diag_log format["-# findSafePosn.sqf -# testing _coords against Old Mission coords is %1", _x select 0];
if ( ((_x select 0) distance _coords) < blck_MinDistanceFromMission) then
if ( ((_x select 0) distance2D _coords) < blck_MinDistanceFromMission) then
{
_FindNew = true;
_findNew = true;
//diag_log format["-# findSafePosn.sqf -# Too Close to Old Mission element: %1", _x];
};
};
@ -72,15 +72,15 @@ while {_findNew} do {
_newPos = [_xpos,_ypos,0];
if (surfaceIsWater _newPos) then
{
_FindNew = true;
_findNew = true;
_i = 361;
};
};
// check that missions spawn at least 1 kkm from towns
{
_townPos = [((locationPosition _x) select 0), ((locationPosition _x) select 1), 0];
if (_townPos distance _coords < 200) exitWith {
_FindNew = true;
if (_townPos distance2D _coords < 200) exitWith {
_findNew = true;
};
} forEach blck_townLocations;
@ -91,17 +91,17 @@ while {_findNew} do {
if (_mod isEqualTo "Exile") then {_pole = "Exile_Construction_Flag_Static"};
//diag_log format["_fnc_findSafePosn:: -- >> _mod = %1 and _pole = %2",_mod,_pole];
{
if ((_x distance _coords) < 600) then
if ((_x distance2D _coords) < 600) then
{
_FindNew = true;
_findNew = true;
};
}forEach nearestObjects[player, [_pole], 800];
// check to be sure we do not spawn a mission on top of a player.
{
if (isPlayer _x && (_x distance _coords) < 600) then
if (isPlayer _x && (_x distance2D _coords) < 600) then
{
_FindNew = true;
_findNew = true;
};
}forEach playableUnits;

View File

@ -19,7 +19,7 @@
Contact : halvhjearne@gmail.com
*/
params["_player","_nr"];
private["_cIndex","_vars","_current_crypto","_current_cryptoRaw","_playerCryptoLimit"];
_cIndex = EPOCH_customVars find "Crypto";
_vars = _player getVariable["VARS", call EPOCH_defaultVars_SEPXVar];
_current_crypto = _vars select _cIndex;

View File

@ -5,56 +5,65 @@
- whether it is time to delete the mission objects at a specific location
- whether it is time to delete live AI associated with a specific mission
By Ghostrider-DbD-
Last modified 1-13-17
Last modified 1-22-17
*/
private ["_index","_timer10Min","_timer1min","_timer5min","_modType"];
_index = 0;
private ["_timer10Min","_timer1min","_timer5min","_modType","_coords"];
_timer1sec = diag_tickTime;
_timer5sec = diag_tickTime;
_timer1min = diag_tickTime;
_timer20sec = diag_tickTime;
//_timer1min = diag_tickTime;
_timer5min = diag_tickTime;
_timer10Min = diag_tickTime;
//_timer10Min = diag_tickTime;
_modType = [] call blck_fnc_getModType;
_ai = [];
_obj = [];
while {true} do
{
uiSleep blck_mainThreadUpdateInterval; // defined in custom_server\compiles\blck_variables.sqf
if ((diag_tickTime - _timer5sec) > 5) then
uiSleep 1; // defined in custom_server\compiles\blck_variables.sqf
if ((diag_tickTime - _timer1sec) > 1) then
{
[] call blck_fnc_vehicleMonitor;
_timer5sec = diag_tickTime;
_timer1sec = diag_tickTime;
};
if ((diag_tickTime - _timer1min) > 60) then
if ((diag_tickTime - _timer5sec) > 5) then
{
_ai = blck_liveMissionAI;
//diag_log format["_fnc_mainThread:: (30) diag_tickTime = %1", diag_tickTime];
diag_log format["_fnc_mainThread:: (31) blck_liveMissionAI = %1", blck_liveMissionAI];
_ai = +blck_liveMissionAI;
{
//diag_log format["_fnc_mainThread:: (34) evaluating liveAIArray %1 with diag_tickTime %2", _x,diag_tickTime];
if (diag_tickTime > (_x select 1) ) then {
//diag_log format["_fnc_mainTread:: cleaning up AI group %1",_x];
[_x select 0] call blck_fnc_cleanupAliveAI;
blck_liveMissionAI set[ _forEachIndex, -1];
blck_liveMissionAI = blck_liveMissionAI - [-1]; // Remove that list of live AI from the list.
//diag_log format["_fnc_mainTread:: blck_liveMissionAI updated from %1",_ai];
if (blck_debugLevel > 1) then {diag_log format["_fnc_mainTread:: blck_liveMissionAI updated to %1",blck_liveMissionAI];};
};
blck_liveMissionAI = blck_liveMissionAI - [_x]; // Remove that list of live AI from the list.
}forEach _ai;
diag_log format["_fnc_mainThread:: (44) blck_oldMissionObjects = %1", blck_oldMissionObjects];
_obj = +blck_oldMissionObjects;
_obj = blck_oldMissionObjects;
{
//diag_log format["mainThread::-->> missionObjects _x = %1",_x];
//diag_log format["mainThread::-->> evaluating missionObjects = %1 diag_tickTime %2",_x,diag_tickTime];
if (diag_tickTime > (_x select 1) ) then {
//diag_log format["_fnc_mainTread:: cleaning up mission objects %1",_x];
[_x select 0] call blck_fnc_cleanupObjects;
blck_oldMissionObjects set[_forEachIndex, -1];
blck_oldMissionObjects = blck_oldMissionObjects - [-1];
//diag_log format["_fnc_mainTread:: blck_oldMissionObjects updated from %1",_obj];
if (blck_debugLevel > 1) then {diag_log format["_fnc_mainTread:: blck_oldMissionObjects updated to %1",blck_oldMissionObjects];};
};
blck_oldMissionObjects = blck_oldMissionObjects - [_x];
}forEach _obj;
[] call GMS_fnc_cleanupDeadAI;
diag_log format["_fnc_mainThread:: (59) blck_fnc_cleanupDeadAI = %1", blck_deadAI];
[] call blck_fnc_cleanupDeadAI;
if (_modType isEqualTo "Epoch") then {
//diag_log "calling blck_fnc_cleanEmptyGroups";
[] call blck_fnc_cleanEmptyGroups;
}; // Exile cleans up empty groups automatically so this should not be needed with that mod.
/* [Jan 14, 2017] reverted the the approach based on mission timers for now
diag_log format["_fnc_mainThread:: (66) blck_pendingMissions = %1", blck_pendingMissions];
{
if (blck_debugLevel > 2) then {diag_log format["_fnc_mainThread:: -- >> _x = %1 and _x select 6 = %2",_x, _x select 6];};
if (_x select 6 > 0) then // The mission is not running, check the time left till it is spawned
@ -63,23 +72,17 @@ while {true} do
{
private _coords = [] call blck_fnc_FindSafePosn;
_coords pushback 0;
blck_ActiveMissionCoords pushback _coords; // Note, old entries are delete in blck_fnc_FindSafePosn
private["_markerClass","_missionName","_missionPath","_aiDifficultyLevel"];
//diag_log format["_fnc_mainThread:: -->> _missionClass would = %1%2",_x select 2, _index];
_markerClass = _x select 2;
if (blck_debugLevel > 2) then {diag_log format["_fnc_mainThread:: -->> _markerClass = %1",_markerClass];};
_aiDifficultyLevel = _x select 4;
private["_missionName","_missionPath"];
_missionName = selectRandom (_x select 0);
_missionPath = _x select 1;
// example:
// [_missionListHunters,_pathHunters,"HunterMarker","green",blck_TMin_Hunter,blck_TMax_Hunter]
[_coords,_markerClass,_aiDifficultyLevel] execVM format["\q\addons\custom_server\Missions\%1\%2.sqf",_missionPath,_missionName];
[_coords,_x] execVM format["\q\addons\custom_server\Missions\%1\%2.sqf",_missionPath,_missionName];
};
};
}forEach blck_pendingMissions;
_timer1min = diag_tickTime;
_timer5sec = diag_tickTime;
};
*/
if ((diag_tickTime - _timer5min) > 300) then {
if (blck_timeAcceleration) then
{

View File

@ -0,0 +1,19 @@
//////////////////////////////////////////////////////
// Test whether one object (e.g., a player) is within a certain range of any of an array of other objects
/*
for DBD Clan
By Ghostrider-DBD-
Copyright 2016
Last Modified 1/22/17
*/
/////////////////////////////////////////////////////
private ["_result"];
params["_pos","_dist"];
_result = false;
{
if ((_x distance2D _pos) < _dist) exitWith {_result = true;};
} forEach allPlayers;
//diag_log format["_fnc_playerInRange:: -> _pos = %1 and _dist = %2 and _result = %3",_pos,_dist,_result];
_result

View File

@ -1,12 +1,13 @@
//////////////////////////////////////////////////////
// test if a timeout condition exists.
// by Ghostrider-DBD-
// Last modified 1/9/17
// Last modified 1/22/17
// [_startTime] call blck_fnc_timedOut
// Returns true (timed out) or false (not timed out)
/////////////////////////////////////////////////////
params["_startTime"];
private["_return"];
_return = ( (diag_tickTime - _startTime) > blck_MissionTimout );
if ((diag_tickTime - _startTime) > blck_MissionTimout ) then {_return = true} else {_return = false};
//diag_log format["fnc_timedOut:: blck_MissionTimout = %2 || _return = %1",_return,blck_MissionTimout];
_return;

View File

@ -2,7 +2,7 @@
if !(blck_blacklistTraderCities) exitWith {};
diag_log format["[blckeagls] Adding Trader Cities to blacklisted locations based on setting for blck_blacklistTraderCities = %1",blck_blacklistTraderCities];
_traderCites = allMapMarkers;
private _traderCites = allMapMarkers;
{
if (_x in ["center","respawn_east","respawn_west","respawn_north"] && blck_blacklistTraderCities) then

View File

@ -1,5 +1,5 @@
// pull trader cities from config
_traderCites = allMapMarkers;
private _traderCites = allMapMarkers;
_tc = [];
{
if (getMarkerType _x isEqualTo "ExileTraderZone" && blck_blacklistTraderCities) then {

View File

@ -26,7 +26,7 @@ _arc = 360/_wpnum;
for [{ _x=1 },{ _x < _wpnum },{ _x = _x + 1; }] do {
_dir = _dir + _arc;
if (_dir > 360) then {_dir = _dir - 360;};
while{_oldpos distance _newpos < 20}do{
while{_oldpos distance2D _newpos < 20}do{
sleep .1;
_dist = (_minDis+(random (_maxDis - _minDis)));

View File

@ -3,15 +3,15 @@
for DBD Clan
By Ghostrider-DBD-
Copyright 2016
Last Modified 12/21/16
Last Modified 1/22/17
*/
//Sets Private Variables to they don't interfere when this script is called more than once
private["_numbertospawn","_i","_groupSpawned","_safepos","_x","_weaponList","_useLauncher","_launcherType","_aiSkills"];
private["_numbertospawn","_groupSpawned","_safepos","_weaponList","_useLauncher","_launcherType"];
params["_pos", ["_numai1",5], ["_numai2",10], ["_skillLevel","red"], "_center", ["_minDist",20], ["_maxDist",35], ["_uniforms",blck_SkinList], ["_headGear",blck_headgear] ];
if (blck_debugLevel isEqualTo 3) then
if (blck_debugLevel > 2) then
{
diag_log format["[blckeagls] _fnc_spawnGroup called parameters: _numai1 %1, _numbai2 %2, _skillLevel %3, _center %4",_numai1,_numai2,_skillLevel,_center];
//diag_log format["[blckeagls] _fnc_spawnGroup called parameters: _numai1 %1, _numbai2 %2, _skillLevel %3, _center %4",_numai1,_numai2,_skillLevel,_center];
};
//Spawns correct number of AI
if (_numai2 > _numai1) then {
@ -19,15 +19,15 @@ if (_numai2 > _numai1) then {
} else {
_numbertospawn = _numai2;
};
if (blck_debugLevel isEqualTo 3) then
if (blck_debugLevel > 2) then
{
diag_log format["spawnGroup.sqf: _numbertospawn = %1",_numbertospawn];
//diag_log format["spawnGroup.sqf: _numbertospawn = %1",_numbertospawn];
};
//Creates a group to make them attack players
_groupSpawned = createGroup blck_AI_Side;
if !(isNull _groupSpawned) then
{
diag_log format["_fnc_spawnGroup:: -- >> Group created = %1",_groupSpawned];
if (blck_debugLevel > 1) then {diag_log format["_fnc_spawnGroup:: -- >> Group created = %1",_groupSpawned]};
_groupSpawned setcombatmode blck_combatMode;
_groupSpawned allowfleeing 0;
_groupSpawned setspeedmode "FULL";

View File

@ -3,10 +3,11 @@
call as [ [list of AI], time] call blck_fnc_addLiveAItoQue; where time is the time delay before deletion occurs
by Ghostrider-DbD-
Last modified 10-14-16
Last modified 1-14-17
*/
//diag_log format["_fnc_addLiveAIToQue:: -> when called, blck_liveMissionAI = %1",blck_liveMissionAI];
params["_aiList","_timeDelay"];
if (blck_debugON) then {diag_log format["_fnc_addLiveAIToQue:: -->> _aiList = %1 || _timeDelay = %2",_aiList,_timeDelay];};
//diag_log format["_fnc_addLiveAIToQue:: -->> _aiList = %1 || _timeDelay = %2",_aiList,_timeDelay];
blck_liveMissionAI pushback [_aiList, (diag_tickTime + _timeDelay)];
//diag_log format["_fnc_addLiveAIToQue:: -> blck_fnc_addLiveAI updated to %1",blck_liveMissionAI];

View File

@ -2,7 +2,7 @@
Adds the basic list of parameters that define a mission such as the marker name, mission list, mission path, AI difficulty, and timer settings, to the arrays that the main thread inspects.
by Ghostrider-DbD-
Last modified 10-14-16
Last modified 1-21-17
*/
//private _mission = _this;
@ -16,7 +16,8 @@ for "_i" from 1 to _noMissions do
private _waitTime = diag_tickTime + (_tMin) + random((_tMax) - (_tMin));
// 0 1 2 3 4 5 6 7
private _mission = [_missionList,_path,format["%1%2",_marker,_i],_difficulty,_tMin,_tMax,_waitTime,[0,0,0]];
diag_log format["-fnc_addMissionToQue::-->> _mission = %1",_mission];
if (blck_debugLevel > 0) then {diag_log format["-fnc_addMissionToQue::-->> _mission = %1",_mission];};
blck_pendingMissions pushback _mission;
};
diag_log format["_fnc_addMissionToQue:: -- >> Result - blck_pendingMissions = %1",blck_pendingMissions];
if (blck_debugLevel > 0) then {diag_log format["_fnc_addMissionToQue:: -- >> Result - blck_pendingMissions = %1",blck_pendingMissions];};

View File

@ -7,6 +7,8 @@
*/
params["_objList","_timeDelay"];
if (blck_debugON) then {diag_log format["_fnc_addObjToQue:: -- >> _objList = %1 || _timeDelay = %2",_objList,_timeDelay];};
//diag_log format["_fnc_addObjToQue:: -- >> _objList = %1 || _timeDelay = %2",_objList,_timeDelay];
//diag_log format["_fnc_addObjToQue:: (11) -- >> blck_oldMissionObjects prior to update = %1",blck_oldMissionObjects];
blck_oldMissionObjects pushback [_objList, (diag_tickTime + _timeDelay)];
//diag_log format["_fnc_addObjToQue:: (11) -- >> blck_oldMissionObjects after update = %1",blck_oldMissionObjects];

View File

@ -6,13 +6,23 @@
for DBD Clan
By Ghostrider-DBD-
Copyright 2016
Last Modified 8-13-16
Last Modified 1-22-17
*/
params["_buildings"];
params["_objects"];
{
if ((typeOf _x) isKindOf "LandVehicle") then
{
//diag_log format["cleanupObjects.sqf: -- >> object %1 is typeOf %2",_x, typeOf _x];
deleteVehicle _x;
} forEach _buildings;
if !(_x getVariable["releasedToPlayers",false]) then
{
private _crew = crew _x;
{
[_x] call blck_fnc_deleteAI;
}forEach _crew;
};
_x setVariable["blck_DeleteAt",0]; // Schedule it to be deleted by fnc_vehicleMonitor immediately
};
} forEach _objects;

View File

@ -0,0 +1,35 @@
/*
[_mines,_objects,_blck_AllMissionAI,_endMsg,_blck_localMissionMarker,_coords,_mission] call blck_fnc_endMission;
schedules deletion of all remaining alive AI and mission objects.
Updates the mission que.
Updates mission markers.
By Ghostrider-DbD-
1/22/17
*/
if (blck_useSignalEnd) then
{
diag_log format["**** Minor\SM1.sqf:: _crate = %1",_crates select 0];
[_crates select 0] spawn blck_fnc_signalEnd;
if (blck_debugLevel > 1) then
{
diag_log format["[blckeagls] _fnc_endMission:: (18) SignalEnd called: _cords %1 : _markerClass %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_markerClass,_aiDifficultyLevel,_markerMissionName];
};
};
params["_mines","_objects","_blck_AllMissionAI","_endMsg","_blck_localMissionMarker","_coords","_mission"];
[_mines] spawn blck_fnc_clearMines;
diag_log format["_fnc_endMission: (23) _objects = %1",_objects];
uisleep 0.1;
[_objects, blck_cleanupCompositionTimer] spawn blck_fnc_addObjToQue;
diag_log format["_fnc_endMission:: (26) _blck_AllMissionAI = %1",_blck_AllMissionAI];
uisleep 0.1;
[_blck_AllMissionAI,blck_AliveAICleanUpTimer] spawn blck_fnc_addLiveAItoQue;
[["end",_endMsg,_blck_localMissionMarker select 2]] call blck_fnc_messageplayers;
[_blck_localMissionMarker select 1, _markerClass] execVM "debug\missionCompleteMarker.sqf";
[_blck_localMissionMarker select 0] execVM "debug\deleteMarker.sqf";
blck_ActiveMissionCoords = blck_ActiveMissionCoords - [ _coords];
blck_recentMissionCoords pushback [_coords,diag_tickTime];
diag_log format["_fnc_endMission:: (34) _mission = %1",_mission];
[_mission,"inactive",[0,0,0]] call blck_fnc_updateMissionQue;

View File

@ -0,0 +1,232 @@
/*
Generic Mission Spawner
for DBD Clan
By Ghostrider-DBD-
Copyright 2016
Last modified 1/12/17
*/
private ["_crates","_aiGroup","_objects","_groupPatrolRadius","_missionLandscape","_mines","_blck_AllMissionAI","_blck_localMissionMarker","_AI_Vehicles"];
params["_coords","_missionType","_aiDifficultyLevel"];
waitUntil {blck_missionSpawning isEqualTo false};
blck_missionSpawning = true;
diag_log format["[blckeagls] missionSpawner:: Initializing mission: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName];
private["_chanceHeliPatrol","_noPara","_reinforcementLootCounts","_chanceLoot","_heliCrew"];
if (isNil "_chanceReinforcements") then
{
_chanceReinforcements = 0;
_noPara = 0;
_reinforcementLootCounts = [0,0,0,0,0,0];
_chanceHeliPatrol = 0;
_chanceLoot = 0;
};
private["_timeOut","_blck_AllMissionAI"]; // _timeOut is the time in seconds after which a mission is deactivated.
if (isNil "_markerColor") then {_markerColor = "ColorBlack"};
if (isNil "_markerType") then {_markerType = ["mil_box",[]]};
if (isNil "_timeOut") then {_timeOut = -1;};
if (isNil "_noPara") then {_noPara = 0};
if (isNil "_chanceHeliPatrol") then {_chanceHeliPatrol = 0;};
if (isNil "_chanceLoot") then {_chanceLoot = 0};
if (isNil "_heliCrew") then {_heliCrew = 3};
if (isNil "_reinforcementLootCounts") then
{
private["__weap","_mags","_backpacks","_optics","_loadout"];
_weap = 2 + floor(random(4));
_mags = 5 + floor(random(6));
_backpacks = 1 + floor(random(2));
_optics = 1 + floor(random(6));
_loadout = 1 + floor(random(3));
_reinforcementLootCounts = [_weap,_mags,_optics,0,0,_backpacks];
if (blck_debugLevel > 0) then {diag_log "missionSpawner:: default values used for _reinforcementLootCounts";};
}
else
{
if (blck_debugLevel > 0) then {diag_log "missionSpawner:: Mission specific values used for _reinforcementLootCounts";};
};
if (blck_debugLevel > 0) then {
diag_log format["[blckEagle] Mission Reinforcement Parameters: changeReinforcements %1 numAI %2 changePatrol %3 chanceLoot %4",_chanceReinforcements,_noPara,_chanceHeliPatrol,_chanceLoot];
};
private["_useMines","_abortMissionSpawner","_blck_AllMissionAI","_delayTime","_groupPatrolRadius"];
if (isNil "_useMines") then {_useMines = blck_useMines;};
_objects = [];
_mines = [];
_crates = [];
_aiGroup = [];
_missionAIVehicles = [];
_blck_AllMissionAI = [];
_AI_Vehicles = [];
_blck_localMissionMarker = [_missionType,_coords,"","",_markerColor,_markerType];
_delayTime = 1;
_groupPatrolRadius = 50;
_abortMissionSpawner = false;
[_blck_localMissionMarker select 0,"Active",_coords] call blck_fnc_updateMissionQue;
if (blck_labelMapMarkers select 0) then
{
//diag_log "SM1.sqf: labeling map markers *****";
_blck_localMissionMarker set [2, _markerMissionName];
};
if !(blck_preciseMapMarkers) then
{
//diag_log "SM1.sqf: Map marker will be OFFSET from the mission position";
_blck_localMissionMarker set [1,[_coords,75] call blck_fnc_randomPosition];
};
_blck_localMissionMarker set [3,blck_labelMapMarkers select 1]; // Use an arrow labeled with the mission name?
[["start",_startMsg,_blck_localMissionMarker select 2]] call blck_fnc_messageplayers;
[_blck_localMissionMarker] execVM "debug\spawnMarker.sqf";
uiSleep 1;
blck_missionSpawning = false;
if (blck_debugLevel > 0) then {diag_log "missionSpawner:: waiting for player to trigger the mission";};
private _missionStartTime = diag_tickTime;
waitUntil{[_coords,blck_TriggerDistance,blck_MissionTimout] call blck_fnc_missionStartConditionsMet;};
if (((diag_tickTime - _missionStartTime) > blck_MissionTimout)) exitWith
{
//["timeOut",_endMsg,_blck_localMissionMarker select 2] call blck_fnc_messageplayers;
[_blck_localMissionMarker select 0] execVM "debug\deleteMarker.sqf";
[_objects, 1] spawn blck_fnc_cleanupObjects;
[_blck_localMissionMarker select 0,"Completed"] call blck_fnc_updateMissionQue;
if (blck_debugLevel > 0) then
{
diag_log format["[blckeagls] missionSpawner:: Mission Timed Out: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName];
};
};
if (blck_debugLevel > 0) then
{ diag_log format["[blckeagls] missionSpawner:: -- >> Mission tripped by nearby player: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName];
};
if (count _missionLootBoxes > 0) then
{
_crates = [_coords,_missionLootBoxes] call blck_fnc_spawnMissionCrates;
}
else
{
_crates = [_coords,[[selectRandom blck_crateTypes /*"Box_NATO_Wps_F"*/,[0,0,0],_crateLoot,_lootCounts]]] call blck_fnc_spawnMissionCrates;
};
if (blck_debugLevel > 0) then
{
diag_log format["[blckeagls] missionSpawner:: Crates Spawned: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName];
};
uiSleep _delayTime;
private ["_temp"];
if (blck_SmokeAtMissions select 0) then // spawn a fire and smoke near the crate
{
_temp = [_coords,blck_SmokeAtMissions select 1] call blck_fnc_smokeAtCrates;
_objects append _temp;
};
uiSleep _delayTime;
if (_useMines) then
{
_mines = [_coords] call blck_fnc_spawnMines;
uiSleep _delayTime;;
};
if (_missionLandscapeMode isEqualTo "random") then
{
_temp = [_coords,_missionLandscape, 3, 15, 2] call blck_fnc_spawnRandomLandscape;
} else {
_temp = [_coords, floor(random(360)),_missionLandscape,true] call blck_fnc_spawnCompositionObjects;
};
_objects append _temp;
diag_log format["_fnc_missionSpawner::->> mission objects spawned = %1",_objects];
if (blck_debugON) then
{
diag_log format["[blckeagls] missionSpawner:: Landscape spawned: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName];
};
uiSleep _delayTime;;
if ((count _missionLootVehicles) > 0) then // spawn loot vehicles
{
diag_log "[blckEagles] _fnc_missionSpawner:: Spawning Mission Loot Vehicles";
private _vehs = [_missionLootVehicles] call blck_fnc_spawnMissionLootVehicles;
};
uiSleep _delayTime;
diag_log "[blckEagle] _fnc_missionSpawner:: spawning AI";
_blck_AllMissionAI = [_coords,_minNoAI,_maxNoAI,_aiDifficultyLevel,_uniforms,_headGear] call blck_fnc_spawnMissionAI;
diag_log format["[blckeagls] _fnc_missionSpawner (190):-> _blck_AllMissionAI = %1",_blck_AllMissionAI];
if (blck_debugON) then
{
diag_log format["[blckeagls] missionSpawner:: AI Patrols Spawned: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName];
};
uiSleep _delayTime;
private _emp = [];
diag_log format["[blckeagls] _fnc_missionSpawner (197):-> _noEmplacedWeapons = %1",_noEmplacedWeapons];
if (!blck_useStatic && (_noEmplacedWeapons > 0)) then
{
private ["_emplacedGroup","_emplacedPositions"];
_emplacedPositions = [_coords,_count,35,50] call blck_fnc_findPositionsAlongARadius;
//diag_log format["missionSpawner:: _emplacedPositions = %1",_emplacedPositions];
{
_emplacedGroup = [_x,1,1,_aiDifficultyLevel,_coords,1,2,_uniforms,_headGear] call blck_fnc_spawnGroup;
if !(isNull _emplacedGroup) then
{
_blck_AllMissionAI = _blck_AllMissionAI + (units _emplacedGroup);
_emplacedWeapon = [_x,_emplacedGroup,blck_staticWeapons,5,15] call blck_fnc_spawnEmplacedWeapon;
_missionAIVehicles pushback _emplacedWeapon;
uiSleep _delayTime;
};
}forEach _emplacedPositions;
};
if (blck_debugLevel > 0) then {diag_log format["[blckeagls] _fnc_missionSpawner (208):-> _blck_AllMissionAI = %1",_blck_AllMissionAI];};
uiSleep _delayTime;
if (blck_useVehiclePatrols && (_noVehiclePatrols > 0)) then
{
diag_log "[blckEagles] _fnc_missionSpawner:: spawning patrol vehicles";
private _return = [_coords,_noVehiclePatrols,_aiDifficultyLevel,_uniforms,_headGear] call blck_fnc_spawnMissionVehiclePatrols;
if (count _return isEqualTo 2) then
{
_blck_AllMissionAI = _blck_AllMissionAI + (_return select 0);
_AI_Vehicles = _AI_Vehicles + (_return select 1);
};
};
if ((random(1) < _chanceReinforcements)) then
{
diag_log format["[blckeagls] missionSpawner:: calling in reinforcements: _heliCrew = %1",4];
private["_grpPilot","_supplyHeli"];
_grpPilot = createGroup blck_AI_Side;
_grpPara = createGroup blck_AI_Side;
if (!(isNulL _grpPilot) && !(isNull _grpPara)) then
{
//_supplyHeli = [_coords,_grpPilot,_chanceLoot] call blck_fnc_spawnMissionHeli;
//[_coords,_grpPara,_noPara,_aiDifficultyLevel,_chanceLoot,_reinforcementLootCounts,_uniforms,_headgear,_supplyHeli,_grpPilot] spawn blck_fnc_callInReinforcements;
} else { deleteGroup _grpPilot; deleteGroup _grpPara;};
};
if (blck_debugON) then {diag_log "[blckeagls] _fnc_missionSpawner (214) :: waiting for mission completion criterion to be met";
waitUntil{[_crates,_blck_AllMissionAI,_endCondition] call blck_fnc_missionEndConditionsMet;};
if (blck_debugLevel > 0) then
{
diag_log format["[blckeagls] missionSpawner:: Mission completion criteria fulfilled: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName];
};
if (blck_useSignalEnd) then
{
[_crates select 0] spawn blck_fnc_signalEnd;
};
[_mines] spawn blck_fnc_clearMines;
[_objects, blck_cleanupCompositionTimer] call blck_fnc_addObjToQue;
[_blck_AllMissionAI,blck_AliveAICleanUpTime] call blck_fnc_addLiveAItoQue;
[["end",_endMsg,_blck_localMissionMarker select 2]] call blck_fnc_messageplayers;
[_blck_localMissionMarker select 1, _missionType] execVM "debug\missionCompleteMarker.sqf";
[_blck_localMissionMarker select 0] execVM "debug\deleteMarker.sqf";
[_blck_localMissionMarker select 0,"Completed"] call blck_fnc_updateMissionQue;
diag_log format["[blckeagls] missionSpawner:: end of mission: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName];

View File

@ -3,14 +3,27 @@
for DBD Clan
By Ghostrider-DBD-
Copyright 2016
Last modified 1/12/17
Last modified 1/22/17
*/
private ["_crates","_aiGroup","_objects","_groupPatrolRadius","_missionLandscape","_mines","_blck_AllMissionAI","_blck_localMissionMarker","_AI_Vehicles","_timeOut"];
params["_coords","_missionType","_aiDifficultyLevel"];
waitUntil {blck_missionSpawning isEqualTo false};
blck_missionSpawning = true;
diag_log format["[blckeagls] missionSpawner:: Initializing mission: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName];
private ["_crates","_aiGroup","_objects","_groupPatrolRadius","_missionLandscape","_mines","_blck_AllMissionAI","_blck_localMissionMarker","_AI_Vehicles","_timeOut","_aiDifficultyLevel"];
params["_coords","_mission"];
////////
// set all variables needed for the missions
// data is pulled either from the mission description or from the _mission variable passsed as a parameter
// Deal with situations where some of these variables might not be defined as well.
////////
// _mission params[_missionListOrange,_pathOrange,"OrangeMarker","orange",blck_TMin_Orange,blck_TMax_Orange];
_markerClass = _mission select 2;
_aiDifficultyLevel = _mission select 3;
if (blck_debugLevel > 0) then {diag_log format["_fnc_mainThread:: -->> _markerClass = %1",_markerClass];};
[_mission,"active",_coords] call blck_fnc_updateMissionQue;
blck_ActiveMissionCoords pushback _coords;
diag_log format["[blckeagls] missionSpawner (17):: Initializing mission: _cords %1 : _markerClass %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_markerClass,_aiDifficultyLevel,_markerMissionName];
private["_chanceHeliPatrol","_noPara","_reinforcementLootCounts","_chanceLoot","_heliCrew"];
if (isNil "_chanceReinforcements") then
@ -39,14 +52,14 @@ if (isNil "_reinforcementLootCounts") then
_optics = 1 + floor(random(6));
_loadout = 1 + floor(random(3));
_reinforcementLootCounts = [_weap,_mags,_optics,0,0,_backpacks];
if (blck_debugLevel > 0) then {diag_log "missionSpawner:: default values used for _reinforcementLootCounts";};
if (blck_debugLevel > 1) then {diag_log "missionSpawner:: default values used for _reinforcementLootCounts";};
}
else
{
if (blck_debugLevel > 0) then {diag_log "missionSpawner:: Mission specific values used for _reinforcementLootCounts";};
if (blck_debugLevel > 1) then {diag_log "missionSpawner (47):: Mission specific values used for _reinforcementLootCounts";};
};
if (blck_debugLevel > 0) then {
if (blck_debugLevel > 1) then {
diag_log format["[blckEagle] Mission Reinforcement Parameters: changeReinforcements %1 numAI %2 changePatrol %3 chanceLoot %4",_chanceReinforcements,_noPara,_chanceHeliPatrol,_chanceLoot];
};
@ -60,385 +73,220 @@ _aiGroup = [];
_missionAIVehicles = [];
_blck_AllMissionAI = [];
_AI_Vehicles = [];
_blck_localMissionMarker = [_missionType,_coords,"","",_markerColor,_markerType];
_blck_localMissionMarker = [_markerClass,_coords,"","",_markerColor,_markerType];
_delayTime = 1;
_groupPatrolRadius = 50;
if (blck_labelMapMarkers select 0) then
{
//diag_log "SM1.sqf: labeling map markers *****";
//diag_log "labeling map markers *****";
_blck_localMissionMarker set [2, _markerMissionName];
};
if !(blck_preciseMapMarkers) then
{
//diag_log "SM1.sqf: Map marker will be OFFSET from the mission position";
//diag_log "Map marker will be OFFSET from the mission position";
_blck_localMissionMarker set [1,[_coords,75] call blck_fnc_randomPosition];
};
_blck_localMissionMarker set [3,blck_labelMapMarkers select 1]; // Use an arrow labeled with the mission name?
if (blck_debugLevel > 0) then {diag_log "missionSpawner:: (91) message players and spawn a mission marker";};
[["start",_startMsg,_blck_localMissionMarker select 2]] call blck_fnc_messageplayers;
[_blck_localMissionMarker] execVM "debug\spawnMarker.sqf";
if (blck_debugLevel > 0) then {diag_log "missionSpawner:: (94) waiting for player to trigger the mission";};
_fn_playerWithinRange = {
params["_pos"];
private["_return"];
_return = false;
{
if (isPlayer _x and _x distance _pos <= blck_TriggerDistance) then {_return = true};
}forEach allPlayers; // playableunits; changed for Arma 1.66
_return;
};
////////
// All parameters are defined, lets wait until a player is nearby or the mission has timed out
////////
uiSleep 1;
/////////////////////////////
// Everything has been set up for the mission and it is now waiting to be triggered by a nearby player or to time out.
// Lets let other instances of the mission spawner know it is OK to go ahead
////////////////////////////
blck_missionSpawning = false;
diag_log "missionSpawner:: waiting for player to trigger the mission";
private["_wait","_missionStartTime","_playerInRange","_missionTimedOut"];
_missionStartTime = diag_tickTime;
_playerInRange = false;
_missionTimedOut = false;
_wait = true;
if (blck_debugLevel > 0) then {diag_log "missionSpawner:: (105) starting mission trigger loop"};
while {_wait} do
{
if (blck_debugLevel isEqualTo 3) then
//diag_log "missionSpawner:: top of mission trigger loop";
if (blck_debugLevel > 2) exitWith {_playerInRange = true;};
if ([_coords, blck_TriggerDistance] call blck_fnc_playerInRange) exitWith {_playerInRange = true;};
if ([_missionStartTime] call blck_fnc_timedOut) exitWith {_missionTimedOut = true;};
uiSleep 5;
//diag_log format["missionSpawner:: Trigger Loop - blck_debugLevel = %1 and _coords = %2",blck_debugLevel, _coords];
//diag_log format["missionSpawner:: Trigger Loop - players in range = %1",{isPlayer _x && _x distance2D _coords < blck_TriggerDistance} count allPlayers];
//diag_log format["missionSpawner:: Trigger Loop - timeout = %1", [_missionStartTime] call blck_fnc_timedOut];
};
if (_missionTimedOut) exitWith
{
// Deal with the case in which the mission timed out.
//["timeOut",_endMsg,_blck_localMissionMarker select 2] call blck_fnc_messageplayers;
blck_ActiveMissionCoords = blck_ActiveMissionCoords - [ _coords];
[_mission,"inactive",[0,0,0]] call blck_fnc_updateMissionQue;
[_blck_localMissionMarker select 0] call compile preprocessfilelinenumbers "debug\deleteMarker.sqf";
_blck_localMissionMarker set [1,[0,0,0]];
_blck_localMissionMarker set [2,""];
[_objects, 0.1] spawn blck_fnc_cleanupObjects;
if (blck_debugLevel > 0) then
{
_wait = false;
_playerInRange = true;
} else {
if ([_coords] call _fn_playerWithinRange) then
{
_wait = false;
_playerInRange = true;
} else
{
if ((diag_tickTime - _missionStartTime) > blck_MissionTimout) then
{
_wait = false;
_missionTimedOut = true;
};
};
uiSleep 1;
diag_log format["[blckeagls] missionSpawner:: (105) Mission Timed Out: _cords %1 : _markerClass %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_markerClass,_aiDifficultyLevel,_markerMissionName];
};
};
//waitUntil{ { (isPlayer _x && _x distance _coords <= blck_TriggerDistance /*&& vehicle _x == _x*/) || ([_missionStartTime] call _fn_timedOut) } count playableunits > 0 };
////////
// Spawn the mission objects, loot chest, and AI
////////
if (blck_debugLevel > 0) then
{
diag_log format["[blckeagls] missionSpawner:: (112) -- >> Mission tripped: _cords %1 : _markerClass %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_markerClass,_aiDifficultyLevel,_markerMissionName];
};
if (count _missionLootBoxes > 0) then
{
_crates = [_coords,_missionCfg select 2] call blck_fnc_spawnMissionCrates;
}
else
{
_crates = [_coords,[[selectRandom blck_crateTypes,[0,0,0],_crateLoot,_lootCounts]]] call blck_fnc_spawnMissionCrates;
};
// un-comment this if you want crates cleaned up when the rest of the mission objects are removed.
//_objects append _crates;
if (blck_debugLevel > 0) then
{
diag_log format["[blckeagls] missionSpawner:: (131) Crates Spawned: _cords %1 : _markerClass %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_markerClass,_aiDifficultyLevel,_markerMissionName];
};
private ["_temp"];
if (blck_SmokeAtMissions select 0) then // spawn a fire and smoke near the crate
{
_temp = [_coords,blck_SmokeAtMissions select 1] call blck_fnc_smokeAtCrates;
if (typeName _temp isEqualTo "ARRAY") then
{
_objects append _temp;
};
};
uiSleep _delayTime;
if (_useMines) then
{
_mines = [_coords] call blck_fnc_spawnMines;
uiSleep _delayTime;;
};
uiSleep _delayTime;
_temp = [];
if (_missionLandscapeMode isEqualTo "random") then
{
_temp = [_coords,_missionLandscape, 3, 15, 2] call blck_fnc_spawnRandomLandscape;
} else {
_temp = [_coords, floor(random(360)),_missionLandscape,true] call blck_fnc_spawnCompositionObjects;
};
if (typeName _temp isEqualTo "ARRAY") then
{
_objects append _temp;
};
//diag_log format["_fnc_missionSpawner:: (181)->> _objects = %1",_objects];
if (blck_debugON) then
{
diag_log format["missionSpawner:: Mission Triggerred contition playerInRange %1 and timout = %2",_playerInRange, _missionTimedOut];
diag_log format["[blckeagls] missionSpawner:: (166) Landscape spawned: _cords %1 : _markerClass %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_markerClass,_aiDifficultyLevel,_markerMissionName];
};
if (!_playerInRange && _missionTimedOut) exitWith
uiSleep _delayTime;;
[_missionLootVehicles] call blck_fnc_spawnMissionLootVehicles;
uiSleep _delayTime;
private ["_infantry"];
_infantry = [_coords, _minNoAI,_maxNoAI,_aiDifficultyLevel,_uniforms,_headGear] call blck_fnc_spawnMissionAI;
//diag_log format["missionSpawner:: (201) -> _infantry = %1",_infantry];
if (typeName _infantry isEqualto "ARRAY") then
{
//["timeOut",_endMsg,_blck_localMissionMarker select 2] call blck_fnc_messageplayers;
[_blck_localMissionMarker select 0] execVM "debug\deleteMarker.sqf";
_blck_localMissionMarker set [1,[0,0,0]];
_blck_localMissionMarker set [2,""];
[_objects, 1] spawn blck_fnc_cleanupObjects;
if (blck_debugON) then
{
diag_log format["[blckeagls] missionSpawner:: Mission Timed Out: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName];
};
_blck_AllMissionAI append _infantry;
};
if (_playerInRange) then
uiSleep _delayTime;
if (blck_debugON) then
{
if (blck_debugON) then
{ diag_log format["[blckeagls] missionSpawner:: -- >> Mission tripped by nearby player: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName];
};
if (count _missionLootBoxes > 0) then
{
_crates = [_coords,_missionCfg select 2/* array of crates*/] call blck_fnc_spawnMissionCrates;
}
else
{
_crates = [_coords,[[selectRandom blck_crateTypes /*"Box_NATO_Wps_F"*/,[0,0,0],_crateLoot,_lootCounts]]] call blck_fnc_spawnMissionCrates;
};
//_objects append _crates;
if (blck_debugON) then
{
diag_log format["[blckeagls] missionSpawner:: Crates Spawned: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName];
};
uiSleep _delayTime;
if (blck_SmokeAtMissions select 0) then // spawn a fire and smoke near the crate
{
private ["_temp"];
_temp = [_coords,blck_SmokeAtMissions select 1] call blck_fnc_smokeAtCrates;
_objects append _temp;
_temp = nil;
};
uiSleep _delayTime;
if (_useMines) then
{
_mines = [_coords] call blck_fnc_spawnMines;
//waitUntil{!(_mines isEqualTo [];);
uiSleep _delayTime;;
};
uiSleep _delayTime;
_obj = [];
if (_missionLandscapeMode isEqualTo "random") then
{
_obj = [_coords,_missionLandscape, 3, 15, 2] call blck_fnc_spawnRandomLandscape;
} else {
_obj = [_coords, floor(random(360)),_missionLandscape,true] call blck_fnc_spawnCompositionObjects;
};
//diag_log format["_fnc_missionSpawner::->> _obj = %1",_obj];
_objects append _obj;
//diag_log format["_fnc_missionSpawner::->> _objects = %1",_objects];
_obj= nil;
if (blck_debugON) then
{
diag_log format["[blckeagls] missionSpawner:: Landscape spawned: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName];
};
uiSleep _delayTime;;
if ((count _missionLootVehicles) > 0) then // spawn loot vehicles
{
{
//diag_log format["spawnMissionCVehicles.sqf _x = %1",_x];
_offset = _x select 1; // offset relative to _coords at which to spawn the vehicle
_pos = [(_coords select 0)+(_offset select 0),(_coords select 1) + (_offset select 1),(_coords select 2)+(_offset select 2)];
_veh = [_x select 0 /* vehicle class name*/, _pos] call blck_fnc_spawnVehicle;
_vehs pushback _veh;
[_veh,_x select 2 /*loot array*/, _x select 3 /*array of values specifying number of items of each loot type to load*/] call blck_fnc_fillBoxes;
}forEach _missionLootVehicles;
};
uiSleep _delayTime;
if (blck_useStatic && (_noEmplacedWeapons > 0)) then
{
private["_static","_count"];
if ( count (_missionEmplacedWeapons) > 0 ) then
{
_static = _missionCfg select 4 select 1;
_count = _missionCfg select 4 select 0;
}
else
{
_static = blck_staticWeapons;
_count = _noEmplacedWeapons;
};
private ["_emplacedGroup","_emplacedPositions"];
_emplacedPositions = [_coords,_count,35,50] call blck_fnc_findPositionsAlongARadius;
//diag_log format["missionSpawner:: _emplacedPositions = %1",_emplacedPositions];
{
_emplacedGroup = [_x,1,1,_aiDifficultyLevel,_coords,1,2,_uniforms,_headGear] call blck_fnc_spawnGroup;
//_emplacedUnits = units _emplacedGroup;
_blck_AllMissionAI = _blck_AllMissionAI + (units _emplacedGroup);
_emplacedWeapon = [_x,_emplacedGroup,blck_staticWeapons,5,15] call blck_fnc_spawnEmplacedWeapon;
_missionAIVehicles pushback _emplacedWeapon;
uiSleep _delayTime;
}forEach _emplacedPositions;
//diag_log format["missionSpawner:: emplaced weapons data: _AI_Vehicles %1 _blck_AllMissionAI %1",_AI_Vehicles,_blck_AllMissionAI];
if (blck_debugON) then
{
diag_log format["[blckeagls] missionSpawner:: Static Weapons Spawned: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName];
};
};
uiSleep _delayTime;
//diag_log format["_fnc_missionSpawner:: after adding any static weapons, _blck_AllMissionAI is %1",_blck_AllMissionAI];
//diag_log format["_fnc_missionSpawner:: after adding any vehicle patrols, _blck_AllMissionAI is %1",_blck_AllMissionAI];
//diag_log format["missionSpawner:: _noAIGroups = %1; spawning AI Groups now",_noAIGroups];
uiSleep _delayTime;
private["_unitsToSpawn","_unitsPerGroup","_ResidualUnits","_newGroup"];
_unitsToSpawn = round(_minNoAI + round(random(_maxNoAI - _minNoAI)));
_unitsPerGroup = floor(_unitsToSpawn/_noAIGroups);
_ResidualUnits = _unitsToSpawn - (_unitsPerGroup * _noAIGroups);
//diag_log format["missionSpawner:: _unitsToSpawn %1 ; _unitsPerGroup %2 _ResidualUnits %3",_unitsToSpawn,_unitsPerGroup,_ResidualUnits];
switch (_noAIGroups) do
{
case 1: { // spawn the group near the mission center
//params["_pos", ["_numai1",5], ["_numai2",10], ["_skillLevel","red"], "_center", ["_minDist",20], ["_maxDist",35], ["_uniforms",blck_SkinList], ["_headGear",blck_headgear] ];
_newGroup = [_coords,_unitsToSpawn,_unitsToSpawn,_aiDifficultyLevel,_coords,3,18,_uniforms,_headGear] call blck_fnc_spawnGroup;
_newAI = units _newGroup;
_blck_AllMissionAI = _blck_AllMissionAI + _newAI;
//diag_log format["missionSpawner: Spawning Groups: _noAIGroups=1 _newGroup=%1 _newAI = %2",_newGroup, _newAI];
};
case 2: {
//diag_log format["missionSpawner: Spawning Groups: _noAIGroups=2"]; // spawn groups on either side of the mission area
_groupLocations = [_coords,_noAIGroups,15,30] call blck_fnc_findPositionsAlongARadius;
{
private["_adjusttedGroupSize"];
if (_ResidualUnits > 0) then
{
_adjusttedGroupSize = _unitsPerGroup + _ResidualUnits;
_ResidualUnits = 0;
} else {
_adjusttedGroupSize = _unitsPerGroup;
};
_newGroup = [_x,_adjusttedGroupSize,_adjusttedGroupSize,_aiDifficultyLevel,_coords,1,12,_uniforms,_headGear] call blck_fnc_spawnGroup;
_newAI = units _newGroup;
_blck_AllMissionAI = _blck_AllMissionAI + _newAI;
//diag_log format["missionSpawner: Spawning 2 Groups: _newGroup=%1 _newAI = %2",_newGroup, _newAI];
}forEach _groupLocations;
};
case 3: { // spawn one group near the center of the mission and the rest on the perimeter
//diag_log format["missionSpawner: Spawning Groups: _noAIGroups=3"];
_newGroup = [_coords,_unitsPerGroup + _ResidualUnits,_unitsPerGroup + _ResidualUnits,_aiDifficultyLevel,_coords,1,12,_uniforms,_headGear] call blck_fnc_spawnGroup;
_newAI = units _newGroup;
_blck_AllMissionAI = _blck_AllMissionAI + _newAI;
//diag_log format["missionSpawner: Spawning Groups: _noAIGroups=3 _newGroup=%1 _newAI = %2",_newGroup, _newAI];
_groupLocations = [_coords,2,20,35] call blck_fnc_findPositionsAlongARadius;
{
_newGroup = [_x,_unitsPerGroup,_unitsPerGroup,_aiDifficultyLevel,_coords,1,12,_uniforms,_headGear] call blck_fnc_spawnGroup;
_newAI = units _newGroup;
_blck_AllMissionAI = _blck_AllMissionAI + _newAI;
//diag_log format["missionSpawner: Spawning 2 Groups:_newGroup=%1 _newAI = %2",_newGroup, _newAI];
}forEach _groupLocations;
};
default { // spawn one group near the center of the mission and the rest on the perimeter
//diag_log format["missionSpawner: Spawning Groups: _noAIGroups=default"];
_newGroup = [_coords,_unitsPerGroup + _ResidualUnits,_unitsPerGroup + _ResidualUnits,_aiDifficultyLevel,_coords,1,12,_uniforms,_headGear] call blck_fnc_spawnGroup;
_newAI = units _newGroup;
_blck_AllMissionAI = _blck_AllMissionAI + _newAI;
//diag_log format["missionSpawner: Spawning Groups: _noAIGroups=%3 _newGroup=%1 _newAI = %2",_newGroup, _newAI,_noAIGroups];
_groupLocations = [_coords,(_noAIGroups - 1),20,40] call blck_fnc_findPositionsAlongARadius;
{
_newGroup = [_x,_unitsPerGroup,_unitsPerGroup,_aiDifficultyLevel,_coords,1,12,_uniforms,_headGear] call blck_fnc_spawnGroup;
_newAI = units _newGroup;
_blck_AllMissionAI = _blck_AllMissionAI + _newAI;
//diag_log format["missionSpawner: Spawning %3 Groups: _newGroup=%1 _newAI = %2",_newGroup, _newAI,_noAIGroups];
}forEach _groupLocations;
};
};
uiSleep _delayTime;
if (blck_debugON) then
{
diag_log format["[blckeagls] missionSpawner:: AI Patrols Spawned: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName];
};
if ((random(1) < _chanceReinforcements)) then
{
_weaponList = blck_WeaponList_Red;
switch (_aiDifficultyLevel) do {
case "blue": {_weaponList = blck_WeaponList_Blue;};
case "red": {_weaponList = blck_WeaponList_Red;};
case "green": {_weaponList = blck_WeaponList_Green;};
case "orange": {_weaponList = blck_WeaponList_Orange;};
default {_weaponList = blck_WeaponList_Blue;};
};
//diag_log format["missionSpawner:: weaponList = %1",_weaponList];
private["_grpReinforcements"];
_grpReinforcements = grpNull;
diag_log format["[blckeagls] missionSpawner:: calling in reinforcements: Current mission: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName];
[] spawn {
//[_coords,_noPara,_aiDifficultyLevel,_chanceLoot,_reinforcementLootCounts,_weaponList,_uniforms,_headgear,_chanceHeliPatrol] call blck_fnc_Reinforcements;
//waitUntil {_grpReinforcements != grpNull};
//diag_log format["[blckeagls] missionSpawner::reinforcement spawner started: Current mission: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName];
};
if !(_grpReinforcements isEqualTo grpNull) then
{
_blck_AllMissionAI = _blck_AllMissionAI + (units _grpReinforcements);
//diag_log format["missionSpawner:: _grpReinforcements = %1",_grpReinforcements];
};
};
if (blck_useVehiclePatrols && (_noVehiclePatrols > 0)) then
{
private["_vehGroup","_patrolVehicle","_vehiclePatrolSpawns"];
_vehiclePatrolSpawns= [_coords,_noVehiclePatrols,45,60] call blck_fnc_findPositionsAlongARadius;
//diag_log format["missionSpawner:: _vehiclePatrolSpawns = %1",_vehiclePatrolSpawns];
//for "_i" from 1 to _noVehiclePatrols do
{
_vehGroup = [_x,3,3,_aiDifficultyLevel,_coords,1,2,_uniforms,_headGear] call blck_fnc_spawnGroup;
//diag_log format["missionSpawner:: group for AI Patrol vehicle spawn: group is %1 with units of %2",_vehGroup, units _vehGroup];
_blck_AllMissionAI = _blck_AllMissionAI + (units _vehGroup);
_randomVehicle = blck_AIPatrolVehicles call BIS_fnc_selectRandom;
//diag_log format["missionSpawner:: vehicle selected is %1", _randomVehicle];
_patrolVehicle = [_coords,_x,_randomVehicle,(_x distance _coords) -5,(_x distance _coords) + 5,_vehGroup] call blck_fnc_spawnVehiclePatrol;
//diag_log format["missionSpawner:: patrol vehicle spawned was %1",_patrolVehicle];
_vehGroup setVariable["groupVehicle",_patrolVehicle,true];
//uiSleep _delayTime;
_AI_Vehicles pushback _patrolVehicle;
}forEach _vehiclePatrolSpawns;
//diag_log format["missionSpawner:: vehicle patrols data: _AI_Vehicles %1 _blck_AllMissionAI %1",_AI_Vehicles,_blck_AllMissionAI];
uiSleep _delayTime;
if (blck_debugON) then
{
diag_log format["[blckeagls] missionSpawner:: Vehicle Patrols Spawned: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName];
};
};
// Trigger for mission end
//diag_log format["[blckeagls] mission Spawner _endCondition = %1",_endCondition];
private["_missionComplete"];
_missionComplete = -1;
_endIfPlayerNear = false;
_endIfAIKilled = false;
_startTime = diag_tickTime;
_missionTimedOut = false;
switch (_endCondition) do
{
case "playerNear": {_endIfPlayerNear = true;};
case "allUnitsKilled": {_endIfAIKilled = true;};
case "allKilledOrPlayerNear": {_endIfPlayerNear = true;_endIfAIKilled = true;};
};
//diag_log format["missionSpawner :: _endIfPlayerNear = %1 _endIfAIKilled= %2",_endIfPlayerNear,_endIfAIKilled];
private["_locations"];
_locations = [_coords] + _crates;
//diag_log format["missionSpawner:: Waiting for player to satisfy mission end criteria of _endIfPlayerNear %1 with _endIfAIKilled %2",_endIfPlayerNear,_endIfAIKilled];
while {_missionComplete isEqualTo -1} do
{
if (blck_debugLevel isEqualTo 3) then
{
uiSleep 120;
_missionComplete = 1;
} else {
if (_endIfPlayerNear) then {
if ( { (isPlayer _x) && ([_x,_locations,20] call blck_fnc_objectInRange) && (vehicle _x == _x) } count allPlayers > 0) then {
_missionComplete = 1;
};
};
//diag_log format["missionSpawner:: count alive _blck_AllMissionAI = %1",{alive _x} count _blck_AllMissionAI];
if (_endIfAIKilled) then {
if (({alive _x} count _blck_AllMissionAI) < 1 ) then {
_missionComplete = 1;
//diag_log format["missionSpawner:: _blck_AllMissionAI = %1","testing case _endIfAIKilled"];
};
};
uiSleep 2;
};
};
if (blck_debugON) then
{
diag_log format["[blckeagls] missionSpawner:: Mission completion criteria fulfilled: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName];
};
if (blck_useSignalEnd) then
{
//diag_log format["**** Minor\SM1.sqf:: _crate = %1",_crates select 0];
[_crates select 0] spawn blck_fnc_signalEnd;
if (blck_debugON) then
{
diag_log format["[blckeagls] missionSpawner:: SignalEnd called: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName];
};
};
[_mines] spawn blck_fnc_clearMines;
[_objects, blck_cleanupCompositionTimer] call blck_fnc_addObjToQue;
[_blck_AllMissionAI,blck_AliveAICleanUpTime] call blck_fnc_addLiveAItoQue;
[["end",_endMsg,_blck_localMissionMarker select 2]] call blck_fnc_messageplayers;
[_blck_localMissionMarker select 1, _missionType] execVM "debug\missionCompleteMarker.sqf";
[_blck_localMissionMarker select 0] execVM "debug\deleteMarker.sqf";
//[_blck_localMissionMarker select 0,"Completed"] call blck_fnc_updateMissionQue;
diag_log format["[blckeagls] missionSpawner:: end of mission: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName];
diag_log format["[blckeagls] missionSpawner:: (210) AI Patrols Spawned: _cords %1 : _markerClass %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_markerClass,_aiDifficultyLevel,_markerMissionName];
};
uisleep _delayTime;
if (blck_useVehiclePatrols && (_noVehiclePatrols > 0)) then
{
private["_veh"];
uiSleep 1;
_veh = [_coords,_noVehiclePatrols,_aiDifficultyLevel,_uniforms,_headGear,_markerClass] call blck_fnc_spawnMissionVehiclePatrols;
//diag_log format["missionSpawner :: (219) _veh = %1",_veh];
_objects append (_veh select 0);
_blck_AllMissionAI append (_veh select 1);
uiSleep _delayTime;
if (blck_debugLevel > 0) then
{
diag_log format["[blckeagls] missionSpawner:: (225) Vehicle Patrols Spawned: _cords %1 : _markerClass %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_markerClass,_aiDifficultyLevel,_markerMissionName];
};
};
uiSleep _delayTime;
private ["_temp"];
if (blck_debugLevel > 0) then {diag_log format["missionSpawner:: (213) preparing to spawn emplaced weapons for _markerClass %3:: blck_useStatic = %1 and _noEmplacedWeapons = %2",blck_useStatic,_noEmplacedWeapons,_markerClass];};
if (blck_useStatic && (_noEmplacedWeapons > 0)) then
{
_temp = [_missionEmplacedWeapons,_noEmplacedWeapons,_aiDifficultyLevel,_coords,_uniforms,_headGear] call blck_fnc_spawnEmplacedWeaponArray;
//diag_log format ["missionSpawner:: (246) value returned for _temp = %1",_temp];
_objects append (_temp select 0);
_blck_AllMissionAI append (_temp select 1);
};
if ((random(1) < _chanceReinforcements)) then
{
_weaponList = [_aiDifficultyLevel] call blck_fnc_selectAILoadout;
private["_grpReinforcements"];
_grpReinforcements = grpNull;
//diag_log format["[blckeagls] missionSpawner:: calling in reinforcements: Current mission: _cords %1 : _markerClass %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_markerClass,_aiDifficultyLevel,_markerMissionName];
[] spawn {
//[_coords,_noPara,_aiDifficultyLevel,_chanceLoot,_reinforcementLootCounts,_weaponList,_uniforms,_headgear,_chanceHeliPatrol] call blck_fnc_Reinforcements;
//waitUntil {_grpReinforcements != grpNull};
//diag_log format["[blckeagls] missionSpawner::reinforcement spawner started: Current mission: _cords %1 : _markerClass %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_markerClass,_aiDifficultyLevel,_markerMissionName];
};
if !(_grpReinforcements isEqualTo grpNull) then
{
_blck_AllMissionAI = _blck_AllMissionAI + (units _grpReinforcements);
//diag_log format["missionSpawner:: _grpReinforcements = %1",_grpReinforcements];
};
};
// Trigger for mission end
//diag_log format["[blckeagls] mission Spawner _endCondition = %1",_endCondition];
private["_missionComplete","_endIfPlayerNear","_endIfAIKilled"];
_missionComplete = -1;
_startTime = diag_tickTime;
switch (_endCondition) do
{
case "playerNear": {_endIfPlayerNear = true;_endIfAIKilled = false;};
case "allUnitsKilled": {_endIfPlayerNear = false;_endIfAIKilled = true;};
case "allKilledOrPlayerNear": {_endIfPlayerNear = true;_endIfAIKilled = true;};
};
//diag_log format["missionSpawner :: (269) _endIfPlayerNear = %1 _endIfAIKilled= %2",_endIfPlayerNear,_endIfAIKilled];
private["_locations"];
_locations = [_coords] + _crates;
//diag_log format["missionSpawner:: Waiting for player to satisfy mission end criteria of _endIfPlayerNear %1 with _endIfAIKilled %2",_endIfPlayerNear,_endIfAIKilled];
while {_missionComplete isEqualTo -1} do
{
if (blck_debugLevel isEqualTo 3) exitWith {uiSleep 120};
if ((_endIfPlayerNear) && [_coords,20] call blck_fnc_playerInRange) exitWith {};
if ((_endIfAIKilled) && ({alive _x} count _blck_AllMissionAI) < 1 ) exitWith {};
//diag_log format["missionSpawner:: (283) missionCompleteLoop - > players near = %1 and ai alive = %2",[_coords,20] call blck_fnc_playerInRange, {alive _x} count _blck_AllMissionAI];
uiSleep 2;
};
if (blck_debugLevel > 1) then
{
diag_log format["[blckeagls] missionSpawner:: (288) Mission completion criteria fulfilled: _cords %1 : _markerClass %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_markerClass,_aiDifficultyLevel,_markerMissionName];
};
[_mines,_objects,_blck_AllMissionAI,_endMsg,_blck_localMissionMarker,_coords,_mission] call blck_fnc_endMission;
diag_log format["[blckeagls] missionSpawner:: (292)end of mission: _cords %1 : _markerClass %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_markerClass,_aiDifficultyLevel,_markerMissionName];

View File

@ -0,0 +1,11 @@
/*
[_blck_localMissionMarker, _coords, _objects] call blck_fnc_missionTimedOut;
*/
params["_blck_localMissionMarker", "_coords", "_objects"];
//["timeOut",_endMsg,_blck_localMissionMarker select 2] call blck_fnc_messageplayers;
[_blck_localMissionMarker select 0] execVM "debug\deleteMarker.sqf";
_blck_localMissionMarker set [1,[0,0,0]];
_blck_localMissionMarker set [2,""];
blck_ActiveMissionCoords = blck_ActiveMissionCoords - [ _coords];
[_objects, 1] spawn blck_fnc_cleanupObjects;

View File

@ -0,0 +1,38 @@
/*
test if either of two conditions is true:
player within a specific range of the coordinates
mission has timed out
By Ghostrider-DbD-
1/21/17
*/
params["_coords"];
private["_result"];
#define GMS_playerInRange 1
#define GMS_missionTimeOut 2
_result = 0;
if (blck_debugLevel > 2) then
{
_result = GMS_playerInRange;
diag_log format["_fnc_missionTriggeredConditionsMet:: -> Trigger conditions met with blck_debugLevel > 2 and _result set to %1",_result];
} else {
if ({ (isPlayer _x) && (_x distance _coords < blck_TriggerDistance) } count allPlayers > 0) then
{
_result = GMS_playerInRange;
diag_log format["_fnc_missionTriggeredConditionsMet:: -> Trigger conditions met with player in range and _result set to %1",_result];
} else
{
if ((diag_tickTime - _missionStartTime) > blck_MissionTimout) then
{
_result = GMS_missionTimeOut;
diag_log format["_fnc_missionTriggeredConditionsMet:: -> Trigger conditions met with mission timed out and _result set to %1",_result];
};
};
};
if (blck_debugLevel > 0) then {diag_log format["_fnc_missionTriggeredConditionsMet:: _result returned = %1 at time %2:",_result,_diag_tickTime];
_result

View File

@ -4,7 +4,7 @@
for DBD Clan
By Ghostrider-DBD-
Copyright 2016
Last modified 1/12/2017
Last modified 1/22/2017
*/
/////////////////////////////////////////////////////
@ -12,12 +12,12 @@
params["_obj1","_objList","_minDist"];
//_obj1 : player or other object
// _objList : array of objects
//_minDist : distance below which the function would return true;
//_minDist : distance within which the function would return true;
_result = false;
//diag_log format["playerInRange.sqf: _obj1 = %1, _objList = %2 _minDist = %3",_obj1,_objList,_minDist];
{
if ((_x distance _obj1) < _minDist) exitWith {_result = true;};
if ((_x distance2D _obj1) < _minDist) exitWith {_result = true;};
} forEach _objList;
_result

View File

@ -11,10 +11,9 @@
private ["_result"];
params["_pos","_dist"];
diag_log format["_fnc_playerInRange:: -> _pos = %1 and _dist = %2",_pos,_dist];
uiSleep 5;
_result = false;
{
if ((_x distance _pos) < _dist) exitWith {_result = true;};
if ((_x distance2D _pos) < _dist) exitWith {_result = true;};
} forEach allPlayers;
_result

View File

@ -2,11 +2,10 @@
Spawn objects from an array using offsects from a central location.
The code provided by M3Editor EDEN has been addapted to add checks for vehicles, should they be present.
Returns an array of spawned objects.
version of 11/9/16
version of 1/13/17
*/
//diag_log format["_fnc_spawnBaseObjects: _this = %1",_this];
params["_center","_azi","_objects","_setVector"];
//diag_log format["_fnc_spawnBaseObjects: _objs = %1",_objects];
private ["_newObjs"];
@ -23,21 +22,7 @@ _newObjs = [];
// Lock any vehicles placed as part of the mission landscape. Note that vehicles that can be taken by players can be added via the mission template.
if ( (typeOf _obj) isKindOf "LandVehicle" || (typeOf _obj) isKindOf "Air" || (typeOf _obj) isKindOf "Sea") then
{
//diag_log format["_fnc_spawnBaseObjects:: Locking vehicle of type %1",typeOf _obj];
//_obj = _x select 0;
_obj setVehicleLock "LOCKEDPLAYER";
_obj addEventHandler ["GetIn",{ // forces player to be ejected if he/she tries to enter the vehicle
private ["_theUnit"];
_theUnit = _this select 2;
_theUnit action ["Eject", vehicle _theUnit];
hint "Use of this vehicle is forbidden";
}];
clearItemCargoGlobal _obj;
clearWeaponCargoGlobal _obj;
clearMagazineCargoGlobal _obj;
clearBackpackCargoGlobal _obj;
[_obj] call blck_fnc_configureMissionVehicle;
};
} forEach _objects;
//diag_log format["_fnc_spawnBaseObjects _newObjs = %1",_newObjs];
_newObjs

View File

@ -20,8 +20,5 @@ _crate setVariable ["LAST_CHECK", 100000];
_crate setPosATL [_px, _py, 0.5];
_crate allowDamage false;
_crate enableRopeAttach true;
clearWeaponCargoGlobal _crate;
clearMagazineCargoGlobal _crate;
clearBackpackCargoGlobal _crate;
clearItemCargoGlobal _crate;
[_crate] call blck_fnc_emptyObject;
_crate;

View File

@ -0,0 +1,40 @@
/*
[_missionEmplacedWeapons,_noEmplacedWeapons,_aiDifficultyLevel,_coords,_uniforms,_headGear] call blck_fnc_spawnEmplacedWeaponArray;
*/
params["_missionEmplacedWeapons","_noEmplacedWeapons","_aiDifficultyLevel","_coords","_uniforms","_headGear"];
private["_return","_emplacedWeps","_emplacedAI","_wep","_units","_gunner"];
_emplacedWeps = [];
_emplacedAI = [];
_units = [];
//diag_log "_fnc_spawnEmplacedWeaponArray start";
// Define _missionEmplacedWeapons if not already configured.
if (count _missionEmplacedWeapons < 1) then
{
_missionEmplacedWeapons = [_coords,_noEmplacedWeapons,35,50] call blck_fnc_findPositionsAlongARadius;
};
//diag_log format["_fnc_spawnEmplacedWeaponArray:: (18) _missionEmplacedWeapons = %1", _missionEmplacedWeapons];
{
_empGroup = [_x,1,1,_aiDifficultyLevel,_coords,1,2,_uniforms,_headGear] call blck_fnc_spawnGroup;
//diag_log format["_fnc_spawnEmplacedWeaponArray:: typeName _empGroup = %1 and _empGroup = %2",typeName _empGroup, _empGroup];
// params["_vehType","_pos",["_clearInventory",true]];
_wep = [selectRandom blck_staticWeapons,[0,0,0],false] call blck_fnc_spawnVehicle;
//diag_log format["_fnc_spawnEmplacedWeaponArray (23) spawnVehicle returned value of _wep = %1",_wep];
_wep setVariable["DBD_vehType","emplaced"];
_wep setPosATL _x;
[_wep,false] call blck_fnc_configureMissionVehicle;
_emplacedWeps pushback _wep;
blck_missionVehicles pushback _wep;
_units = units _empGroup;
_gunner = _units select 0;
_gunner moveingunner _wep;
_emplacedAI append (units _empGroup);
//diag_log format["_fnc_spawnEmplacedWeaponArray:: position of emplaced weapon = %1 and position of _x is %2",getPos _wep, _x];
//diag_log format["_fnc_spawnEmplacedWeaponArray:: _gunner = %1 and crew _wep = %2",_gunner, crew _wep];
} forEach _missionEmplacedWeapons;
_return = [_emplacedWeps,_emplacedAI];
//diag_log format["_fnc_spawnEmplacedWeaponArray:: returning with _return = _emplacedWeps = %1",_return];
_return

View File

@ -3,59 +3,46 @@
[_missionEmplacedWeapons,_noEmplacedWeapons,_aiDifficultyLevel,_coords,_uniforms,_headGear] call blck_fnc_spawnMissionEmplacedWeapons;
*/
// [_missionEmplacedWeapons,_noEmplacedWeapons,_aiDifficultyLevel,_coords,_uniforms,_headGear] call blck_fnc_spawnMissionEmplacedWeapons;
params["_missionEmplacedWeapons","_noEmplacedWeapons","_aiDifficultyLevel","_coords","_uniforms","_headGear"];
diag_log format["[blckeagls] _fnc_spawnMissionEmplacedWeapons(9):: - > _noEmplacedWeapons = %1",_noEmplacedWeapons];
private ["_emplacedGroup","_emplacedPositions","_missionGroups","_missionAI","_missionStatics","_false","_return","_count"];
_missionGroups = [];
_missionAI = [];
_missionStatics = [];
_return = [];
diag_log format["[blckeagls] _fnc_spawnMissionEmplacedWeapons(15):: - > _noEmplacedWeapons = %1",_noEmplacedWeapons];
if (count _missionEmplacedWeapons > 0) then
params["_missionEmplacedWeapons","_noEmplacedWeapons","_aiDifficultyLevel","_coords","_uniforms","_headGear",["_missionType","unspecified"]];
private ["_emplacedGroup","_emplacedAI","_precise","_pos","_emplaced","_emp","_gunner","_staticWeap"];
_emplacedAI = [];
_staticWeap = [];
if (blck_debugLevel > 0) then {diag_log format["[blckeagls] _fnc_spawnMissionEmplacedWeapons(10):: - >_missionEmplacedWeapons = %2 and _noEmplacedWeapons = %1",_noEmplacedWeapons,_missionEmplacedWeapons];};
if ( count _missionEmplacedWeapons isEqualTo 0 ) then
{
{
diag_log format["[blckeagls] _fnc_spawnMissionEmplacedWeapons (19):: - > _spawning from _missionEmplacedWeapons %1",_missionEmplacedWeapons];
_emplacedGroup = [_x,1,1,_aiDifficultyLevel,_coords,0,0.1,_uniforms,_headGear] call blck_fnc_spawnGroup;
diag_log format["[blckeagls] _fnc_spawnMissionEmplacedWeapons (21):: - > _spawned group %1",_emplacedGroup];
if !(isNull _emplacedGroup) then
{
_missionGroups pushback _emplacedGroup;
{_x allowDamage false;} forEach units _emplacedGroup;
_emplacedWeapon = [_x,_emplacedGroup,blck_staticWeapons,5,15] call blck_fnc_spawnEmplacedWeapon;
_emplacedWeapon setPosATL _x;
_missionStatics pushback _missionStatics;
uiSleep _delayTime;
{_x allowDamage true;} forEach units _emplacedGroup;
};
} forEach _missionEmplacedWeapons;
} else {
_emplacedPositions = [_coords,_count,35,50] call blck_fnc_findPositionsAlongARadius;
{
diag_log format["[blckeagls] _fnc_spawnMissionEmplacedWeapons (36):: - > _noEmplacedWeapons = %1",_noEmplacedWeapons];
_emplacedGroup = [_x,1,1,_aiDifficultyLevel,_coords,1,2,_uniforms,_headGear] call blck_fnc_spawnGroup;
diag_log format["[blckeagls] _fnc_spawnMissionEmplacedWeapons (38):: - > _spawned group %1",_emplacedGroup];
if !(isNull _emplacedGroup) then
{
_missionGroups pushback _emplacedGroup;
_emplacedWeapon = [_x,_emplacedGroup,blck_staticWeapons,5,15] call blck_fnc_spawnEmplacedWeapon;
_missionStatics pushback _missionStatics;
uiSleep _delayTime;
};
}forEach _emplacedPositions;
_missionEmplacedWeapons = [_coords,_noEmplacedWeapons,35,50] call blck_fnc_findPositionsAlongARadius;
_precise = false;
if (blck_debugLevel > 1) then {diag_log "_fnc_spawnMissionEmplacedWeapons:: -->> no spawn points specified, using spawns along a radius";
};
diag_log format["_fnc_spawnMissionEmplacedWeapons:: (19) _missionType = %2 _missionEmplacedWeapons updated to %1",_missionEmplacedWeapons,_missionType];
{
if !(isNull _x) then {_missionAI pushback (units _x);
}forEach _missionGroups;
diag_log format["_fnc_spawnMissionEmplacedWeapons:: (21) spawning group to man emplaced weapon"];
_emplacedGroup = [_x,1,1,_aiDifficultyLevel,[0,0,0],1,2,_uniforms,_headGear] call blck_fnc_spawnGroup;
diag_log format["_fnc_spawnMissionEmplacedWeapons:: (23) group spawned = %1",_emplacedGroup];
_emplacedAI append (units _emplacedGroup);
diag_log format["_fnc_spawnMissionEmplacedWeapons:: (24) _emplacedAI updated to = %1",_emplacedAI];
if ( (count _missionAI) < 1) then
{
{deleteVehicle _x} forEach _missionStatics;
}
else
{
_return = [_missionAI,_missionStatics];
};
diag_log format["_fnc_spawnMissionEmplacedWeapons:: (26) spawning emplaced weapon"];
if (_precise) then
{
_pos = _x;
} else {
_pos = [_x,5,10,0,0,20,0] call BIS_fnc_findSafePos;
};
_emp = [selectRandom blck_staticWeapons,_pos,false] call blck_fnc_spawnVehicle;
diag_log format["_fnc_spawnMissionEmplacedWeapons (33) spawnVehicle returned value of _emp = %1",_emp];
_emp setVariable["DBD_vehType","emplaced"];
_emp setPosATL _pos;
[_emp,false] call blck_fnc_configureMissionVehicle;
_gunner = (units _emplacedGroup) select 0;
_gunner moveingunner _emp;
_staticWeap pushback _emp;
diag_log format["_fnc_spawnMissionEmplacedWeapons:: (28) emplaced weapon _wep = %1",_wep];
}forEach _missionEmplacedWeapons;
_return;
_emplaced = [_staticWeap, _emplacedAI];
_emplaced

View File

@ -1,46 +1,30 @@
/*
[_coords,_noVehiclePatrols,_aiDifficultyLevel,_uniforms,_headGear] call _fnc_spawnMissionVehiclePatrols
[_coords,_noVehiclePatrols,_aiDifficultyLevel,_uniforms,_headGear] call blck_fnc_spawnMissionVehiclePatrols
by Ghostrider-DbD-
1/9/17
1/22/17
returns [] if no groups could be created
returns [_AI_Vehicles,_missionAI] otherwise;
*/
params["_coords","_noVehiclePatrols","_aiDifficultyLevel","_uniforms","_headGear"];
private["_vehGroup","_patrolVehicle","_vehiclePatrolSpawns","_missionAI","_missiongroups","_AI_Vehicles","_abort","_vehiclePatrolSpawns","_randomVehicle","_return"];
params["_coords","_noVehiclePatrols","_aiDifficultyLevel","_uniforms","_headGear",["_missionType","unspecified"]];
private["_vehGroup","_patrolVehicle","_vehiclePatrolSpawns","_missionAI","_missiongroups","_vehicles","_return","_vehiclePatrolSpawns","_randomVehicle","_return"];
_vehicles = [];
_missionAI = [];
_missiongroups = [];
_AI_Vehicles = [];
_return = [];
_abort = false;
_vehiclePatrolSpawns= [_coords,_noVehiclePatrols,45,60] call blck_fnc_findPositionsAlongARadius;
{
_vehGroup = [_x,3,3,_aiDifficultyLevel,_coords,1,2,_uniforms,_headGear] call blck_fnc_spawnGroup;
if (isNull _vehGroup) exitWith {_abort = true;};
_missiongroups pushback _vehGroup;
_randomVehicle = blck_AIPatrolVehicles call BIS_fnc_selectRandom;
_patrolVehicle = [_coords,_x,_randomVehicle,(_x distance _coords) -5,(_x distance _coords) + 5,_vehGroup] call blck_fnc_spawnVehiclePatrol;
_vehGroup setVariable["groupVehicle",_patrolVehicle,true];
_AI_Vehicles pushback _patrolVehicle;
//if (isNull _vehGroup) exitWith {_abort = true;};
if (blck_debugLevel > 0) then {diag_log format["_fnc_spawnMissionVehiclePatrols:: -> _missionType = %3 _vehGroup = %1 and units _vehGroup = %2",_vehGroup, units _vehGroup,_missionType];};
if (typename (units _vehGroup) isEqualTo "ARRAY") then
{
_randomVehicle = selectRandom blck_AIPatrolVehicles;
_patrolVehicle = [_coords,_x,_randomVehicle,(_x distance _coords) -5,(_x distance _coords) + 5,_vehGroup] call blck_fnc_spawnVehiclePatrol;
//diag_log format["_fnc_spawnMissionVehiclePatrols:: - > patrol vehicle spawned was %1 with type of %2",_patrolVehicle,_randomVehicle];
_vehicles pushback _patrolVehicle;
_missionAI append units _vehGroup;
//diag_log format["_fnc_spawnMissionVehiclePatrols:: -- > _vehicles updated to %1",_vehicles];
};
}forEach _vehiclePatrolSpawns;
if (blck_debugLevel > 1) then
{
diag_log format["[blckeagls] missionSpawner:: Vehicle Patrols Spawned: _cords %1 : _missionType %2 : _aiDifficultyLevel %3 _markerMissionName %4",_coords,_missionType,_aiDifficultyLevel,_markerMissionName];
};
if (_abort) then
{
{deleteVehicle _x} forEach _AI_Vehicles;
{
{deleteVehicle _x} forEach (units _x);
deleteGroup _x;
} forEach _missiongroups;
};
if !(_abort) then
{
{
_missionAI append (units _x);
}forEach _missiongroups;
_return = [_missionAI,_AI_Vehicles];
};
blck_missionVehicles append _vehicles;
_return = [_vehicles,_missionAI];
_return;
_return

View File

@ -1,7 +1,7 @@
/*
spawn a group of objects in random locations aligned with the radial from the center of the region to the object.
By Ghostrider-DbD-
Last modified 9-5-2016
Last modified 1/22/17
copyright 2016
*/
@ -24,5 +24,5 @@ _objects = [];
_objects pushback _wreck;
sleep 0.1;
} forEach _missionLandscape;
diag_log format["_fnc_spawnRandomLandscape::-->> _objects = %1",_objects];
if (blck_debugLevel > 2) then {diag_log format["_fnc_spawnRandomLandscape::-->> _objects = %1",_objects];};
_objects

View File

@ -2,32 +2,32 @@
Update the parameters for a mission in the list of missions running at that time.
Call with the name of the marker associated with the mission and either "Active" or "Completed"
by Ghostrider-DbD-
Last modified 1-12-17
Last modified 1-22-17
*/
params["_mission","_status",["_coords",[0,0,0]] ];
if (blck_debugON) then {diag_log format["_fnc_updateMissionQue :: _mission = %1 | _status = %2 | _coords = %3",_mission,_status,_coords];};
{
if (_mission isEqualTo (_x select 2)) exitWith
{
private _element = _x;
if (blck_debugON) then {diag_log format ["_fnc_updateMissionQue :: blck_pendingMissions began as %1",blck_pendingMissions];};
blck_pendingMissions set[_forEachIndex, -1];
blck_pendingMissions = blck_pendingMissions - [-1];
if (blck_debugON) then {diag_log format ["_fnc_updateMissionQue :: blck_pendingMissions after deleteing element = %1 resulted in %2",_element,blck_pendingMissions];};
if (toLower(_status) isEqualTo "active") then {
_element set[6, -1];
_element set[7,_coords];
};
if (toLower(_status) isEqualTo "completed") then
{
private _waitTime = (_element select 4) + random((_element select 5) - (_element select 4));
_element set[6, _waitTime];
_element set [7,[0,0,0]];
};
if (blck_debugON) then {diag_log format["_fnc_updateMissionQue:: -- >> _element updated to %1",_x,_element];};
blck_pendingMissions pushback _element;
if (blck_debugON) then {diag_log format ["_fnc_updateMissionQue :: blck_pendingMissions updated to %1",blck_pendingMissions];};
};
}forEach blck_pendingMissions;
private["_index","_element","_waitTime"];
_index = blck_pendingMissions find _mission;
if (_index > -1) then
{
if (blck_debuglevel > 0) then {diag_log format ["_fnc_updateMissionQue :: blck_pendingMissions began as %1",blck_pendingMissions];};
_element = blck_pendingMissions select _index;
if (blck_debuglevel > 0) then {diag_log format["_fnc_updateMissionQue:: -- >> _element before update = %1",_element];};
if (toLower(_status) isEqualTo "active") then {
_element set[6, -1];
_element set[7,_coords];
};
if (toLower(_status) isEqualTo "inactive") then
{
_waitTime = (_element select 4) + random((_element select 5) - (_element select 4));
_element set[6, diag_tickTime + _waitTime];
_element set [7,[0,0,0]];
};
if (blck_debuglevel > 0) then {diag_log format["_fnc_updateMissionQue:: -- >> _element after update = %1",_element];};
blck_pendingMissions set [_index, _element];
if (blck_debuglevel > 0) then {diag_log format ["_fnc_updateMissionQue :: blck_pendingMissions after update = %1",blck_pendingMissions];};
};

View File

@ -0,0 +1,5 @@
#define GMS_playerInRange 1
#define GMS_missionTimeOut 2
#defin GMS_delayTime 0.1

View File

@ -0,0 +1,23 @@
//////////////////////////////////////////////////////
// Test whether one object (e.g., a player) is within a certain range of any of an array of other objects
/*
for DBD Clan
By Ghostrider-DBD-
Copyright 2016
Last modified 1/22/2017
*/
/////////////////////////////////////////////////////
private ["_result"];
params["_obj1","_objList","_minDist"];
//_obj1 : player or other object
// _objList : array of objects
//_minDist : distance within which the function would return true;
_result = false;
{
if ((_x distance2D _obj1) < _minDist) exitWith {_result = true;};
} forEach _objList;
diag_log format["objectInRange.sqf: _obj1 = %1, _objList = %2 _minDist = %3 _result = %4",_obj1,_objList,_minDist,_result];
_result

View File

@ -0,0 +1,48 @@
/*
[_missionEmplacedWeapons,_noEmplacedWeapons,_aiDifficultyLevel,_coords,_uniforms,_headGear] call blck_fnc_spawnMissionEmplacedWeapons;
*/
params["_missionEmplacedWeapons","_noEmplacedWeapons","_aiDifficultyLevel","_coords","_uniforms","_headGear",["_missionType","unspecified"]];
private ["_emplacedGroup","_emplacedAI","_precise","_pos","_emplaced","_emp","_gunner","_staticWeap"];
_emplacedAI = [];
_staticWeap = [];
if (blck_debugLevel > 0) then {diag_log format["[blckeagls] _fnc_spawnMissionEmplacedWeapons(10):: - >_missionEmplacedWeapons = %2 and _noEmplacedWeapons = %1",_noEmplacedWeapons,_missionEmplacedWeapons];};
if ( count _missionEmplacedWeapons isEqualTo 0 ) then
{
_missionEmplacedWeapons = [_coords,_noEmplacedWeapons,35,50] call blck_fnc_findPositionsAlongARadius;
_precise = false;
if (blck_debugLevel > 1) then {diag_log "_fnc_spawnMissionEmplacedWeapons:: -->> no spawn points specified, using spawns along a radius";
};
diag_log format["_fnc_spawnMissionEmplacedWeapons:: (19) _missionType = %2 _missionEmplacedWeapons updated to %1",_missionEmplacedWeapons,_missionType];
{
diag_log format["_fnc_spawnMissionEmplacedWeapons:: (21) spawning group to man emplaced weapon"];
_emplacedGroup = [_x,1,1,_aiDifficultyLevel,[0,0,0],1,2,_uniforms,_headGear] call blck_fnc_spawnGroup;
diag_log format["_fnc_spawnMissionEmplacedWeapons:: (23) group spawned = %1",_emplacedGroup];
_emplacedAI append (units _emplacedGroup);
diag_log format["_fnc_spawnMissionEmplacedWeapons:: (24) _emplacedAI updated to = %1",_emplacedAI];
diag_log format["_fnc_spawnMissionEmplacedWeapons:: (26) spawning emplaced weapon"];
if (_precise) then
{
_pos = _x;
} else {
_pos = [_x,5,10,0,0,20,0] call BIS_fnc_findSafePos;
};
_emp = [selectRandom blck_staticWeapons,_pos,false] call blck_fnc_spawnVehicle;
diag_log format["_fnc_spawnMissionEmplacedWeapons (33) spawnVehicle returned value of _emp = %1",_emp];
_emp setVariable["DBD_vehType","emplaced"];
_emp setPosATL _pos;
[_emp,false] call blck_fnc_configureMissionVehicle;
_gunner = (units _emplacedGroup) select 0;
_gunner moveingunner _emp;
_staticWeap pushback _emp;
diag_log format["_fnc_spawnMissionEmplacedWeapons:: (28) emplaced weapon _wep = %1",_wep];
}forEach _missionEmplacedWeapons;
_emplaced = [_staticWeap, _emplacedAI];
_emplaced

View File

@ -0,0 +1,21 @@
/*
unit: Object - Object the event handler is assigned to.
selectionName: String - Name of the selection where the unit was damaged. "" for over-all structural damage, "?" for unknown selections.
damage: Number - Resulting level of damage for the selection.
source: Object - The source unit that caused the damage.
projectile: String - Classname of the projectile that caused inflicted the damage. ("" for unknown, such as falling damage.)
(Since Arma 3 v 1.49.131802)
hitPartIndex: Number - Hit part index of the hit point, -1 otherwise.
*/
private ["_unit","_killer","_group","_deleteAI_At"];
_unit = _this select 0;
_source = _this select 3;
if (isPlayer _source) then {
[_unit,_source] call GRMS_fnc_alertGroup;
};

View File

@ -0,0 +1,23 @@
/*
https://community.bistudio.com/wiki/Arma_3:_Event_Handlers/Reloaded
The EH returns array in _this variable of the following format [entity, weapon, muzzle, newMagazine, (oldMagazine)], where:
entity: Object - unit or vehicle to which EH is assigned
weapon: String - weapon that got reloaded
muzzle: String - weapons muzzle that got reloaded
newMagazine: Array - new magazine info in format [magazineClass, ammoCount, magazineID, magazineCreator], where:
magazineClass: String - class name of the magazine
ammoCount: Number - amount of ammo in magazine
magazineID: Number - global magazine id
magazineCreator: Number - owner of the magazine creator
*/
private ["_unit","_mag"];
_unit = _this select 0;
_mag = _this select 3 select 0;
if (blck_debugLevel > 2) then {diag_log format["_EH_unitWeaponReloaded:: unit %1 reloaded weapon %2 with magazine %3",_unit,_this select 1,_mag];
if (blck_debugLevel > 2) then (diag_log format["_EH_unitWeaponReloaded:: one magazine of type %1 added to inventory of unit %2",_mag,_unit];
_unit addMagazine _mag;

View File

@ -13,7 +13,7 @@ _intelligence = _unit getVariable ["intelligence",1];
if (_alertDist > 0) then {
//diag_log format["+----+ alerting units close to %1",_unit];
{
if (((position _x) distance (position _unit)) <= _alertDist) then {
if (((position _x) distance2D (position _unit)) <= _alertDist) then {
_x reveal [_killer, _intelligence];
//diag_log "Killer revealed";
}

View File

@ -1,44 +1,14 @@
/*
Delete alive AI.
Now called from the main thread which tracks the time elapsed so that we no longer need to wait a proscribed period of time (see changes on lines 9 and 12)
Now called from the main thread which tracks the time elapsed so that we no longer spawn a wait timer for each completed mission.
by Ghostrider
Last updated 10/22/16
Last updated 1/22/17
*/
private["_ai","_veh"];
params["_aiList"];
//diag_log format["_fnc_cleanupAliveAI:: called with blck_AICleanUpTimer = %1 and count of alive AI = %2",0, count _aiList];
{
//diag_log format["cleanupAliveAI:: for unit _x, alive = %1, GMS_DiedAt = %2",(alive _x), _x getVariable["GMS_DiedAt", -1]];
if ( alive _x && (_x getVariable["GMS_DiedAt", -1] < 0)) then { // The unit has not been processed by a kill handler. This double test is probably not needed.
_ai = _x;
if ( vehicle _ai != _ai) then // the AI is in a vehicle of some sort so lets be sure to delete it
{
_veh = vehicle _ai;
//diag_log format["cleanupAliveAI:: deleting vehicle %1",_veh];
_veh setDamage 1;
deleteVehicle _veh;
};
//diag_log format["_fnc_cleanupAliveAI:: _x is %4, typeOf _x %1 typeOf vehicle _x %2, blck_vehicle %3", (typeOf _x), (typeOf (vehicle _x)),_veh,_x];
{
_ai removeAllEventHandlers _x;
}forEach ["Killed","Fired","HandleDamage","HandleHeal","FiredNear"];
{
deleteVehicle _x;
}forEach nearestObjects [getPos _ai,["WeaponHolderSimulated","GroundWeapoonHolder"],3];
//_group = group _ai;
[_ai] joinSilent grpNull;
if (count units group _ai < 1) then
{
deletegroup group _ai;
};
deleteVehicle _ai;
};
//if (blck_debugLevel > 2) then {diag_log format["_fnc_cleanupAliveAI:: -> deleteing AI Unit %1",_x];};
[_x] call blck_fnc_deleteAI;
}forEach _aiList;
diag_log format["_fnc_cleanupAliveAI:: AI Cleanup Completed"];

View File

@ -1,28 +1,20 @@
/*
Delete Dead AI and nearby weapons after an appropriate period.
by Ghostrider
Last updated 10/22/16
Last updated 1/13/17
*/
private["_aiList","_ai"];
//diag_log format["_fnc_cleanupDeadAI Called"];
_aiList = blck_deadAI;
_aiList = +blck_deadAI;
{
// As written, this ignores any bodies that do not have GMS_DiedAt defined.
if ( (_x getVariable ["GMS_DiedAt",0]) > 0 ) then
if ( diag_tickTime > _x getVariable ["blck_cleanupAt",0] ) then // DBD_DeleteAITimer
{
if ( diag_tickTime > ((_x getVariable ["GMS_DiedAt",0]) + blck_bodyCleanUpTimer) ) then // DBD_DeleteAITimer
_ai = _x;
{
_ai = _x;
{
deleteVehicle _x;
}forEach nearestObjects [getPos _x,["WeaponHolder"],3];
uiSleep 0.1;
//diag_log ["deleting AI %2 at _pos %1",getPos _ai,_ai];
blck_deadAI = blck_deadAI - [_ai];
deleteVehicle _ai;
};
deleteVehicle _x;
}forEach nearestObjects [getPos _ai,["WeaponHolderSimulated","GroundWeapoonHolder"],3];
blck_deadAI = blck_deadAI - [_ai];
deleteVehicle _ai;
};
} forEach _aiList;

View File

@ -0,0 +1,22 @@
/*
Delete a unit.
by Ghostrider
Last updated 1/22/17
*/
private["_ai","_group"];
params["_unit"];
//if (blck_debugLevel > 2) then {diag_log format["_fnc_deleteAI::-> deleting unit = %1",_unit];};
{
_unit removeAllEventHandlers _x;
}forEach ["Killed","Fired","HandleDamage","HandleHeal","FiredNear"];
private _group = (group _unit);
[_unit] joinSilent grpNull;
deleteVehicle _unit;
if (count units _group isEqualTo 0) then
{
deletegroup _group;
};

View File

@ -1,6 +1,6 @@
/*
Handle AI Deaths
Last Modified 1/4/17
Last Modified 1/13/17
By Ghostrider-DBD-
Copyright 2016
*/
@ -8,8 +8,7 @@
private["_group","_isLegal","_weapon","_lastkill","_kills","_message","_killstreakMsg"];
params["_unit","_killer","_isLegal"];
//diag_log format["#- processAIKill.sqf -# called for unit %1",_unit];
_unit setVariable ["GMS_DiedAt", (diag_tickTime),true];
_unit setVariable ["blck_cleanupAt", (diag_tickTime) + blck_bodyCleanUpTimer, true];
blck_deadAI pushback _unit;
_group = group _unit;

View File

@ -1,6 +1,6 @@
/*
by Ghostrider
1-4-17
1-22-17
*/
private["_missionType","_wasRunover","_launcher","_legal"];
@ -11,17 +11,19 @@ _legal = true;
_fn_targetVehicle = { // force AI to fire on the vehicle with launchers if equiped
params["_vk","_unit"];
private
{
if (((position _x) distance (position _unit)) <= 350) then
{
_x reveal [_vk, 4];
_x dowatch _vk;
_x doTarget _vk;
if (_launcher != "") then
if (_unit getVariable ["Launcher",""] != "") then
{
_x selectWeapon (secondaryWeapon _unit);
_x fireAtTarget [_vk,_launcher];
_x fireAtTarget [_vk,_unit getVariable ["Launcher"]];
} else {
_x doTarget _vk;
_x doFire _vk;
};
};
@ -31,7 +33,6 @@ _fn_targetVehicle = { // force AI to fire on the vehicle with launchers if equi
_fn_applyVehicleDamage = { // apply a bit of damage
private["_vd"];
params["_vk"];
//_vk = _this select 0;
_vd = getDammage _vk;
_vk setDamage (_vd + blck_RunGearDamage);
};
@ -46,7 +47,6 @@ _fn_msgIED = {
params["_killer"];
diag_log format["fn_msgIED:: -- >> msg = %1 and owner _killer = %2",blck_Message, (owner _killer)];
[["IED","",0,0],[_killer]] call blck_fnc_MessagePlayers;
//(owner _killer) publicVariableClient "blck_Message";
};
if (typeOf _killer != typeOf (vehicle _killer)) then // AI was killed by a vehicle

View File

@ -1,9 +1,9 @@
/*
by Ghostrider
11-11-16
1-22-17
*/
private["_launcher","_launcherRounds","_objects","_weapons","_container"];
private["_launcher","_launcherRounds"];
params["_unit"]; // = _this select 0;
_launcher = _unit getVariable ["Launcher",""];
_unit removeWeapon _Launcher;

View File

@ -3,13 +3,13 @@
calculate a reward player for AI Kills in crypto.
Code fragment adapted from VEMF
call as [_unit,_killer] call blck_fnc_rewardKiller;
Last modified 1/4/17
Last modified 1/22/17
*/
params["_unit","_killer","_kills"];
//diag_log format["rewardKiller:: _unit = %1 and _killer %2",_unit,_killer];
private["_modType","_reward"];
private["_modType","_reward","_maxReward","_dist","_killstreakReward","_distanceBonus","_newKillerScore","_newKillerFrags","_money"];
_modType = call blck_fnc_getModType;
//diag_log format["[blckeagles] rewardKiller:: - _modType = %1",_modType];
@ -69,4 +69,4 @@ if (_modType isEqualTo "Exile") then
[["showScore",[50,_distanceBonus,_kills]], [_killer]] call blck_fnc_messageplayers;
};
};
//_reward

View File

@ -2,16 +2,13 @@
Original Code by blckeagls
Modified by Ghostrider
Logic for adding AI Ammo, GL Shells and Attachments addapted from that by Buttface (A3XAI).
Infinite Ammo fix by Narines.
Code to delete dead AI bodies moved to AIKilled.sqf
Everything having to do with spawning and configuring an AI should happen here
Last Modified 11/12/16
Last Modified 1/22/17
*/
//Defines private variables so they don't interfere with other scripts
private ["_pos","_i","_weap","_ammo","_other","_skin","_aiGroup","_ai1","_magazines","_players","_owner","_ownerOnline","_nearEntities","_skillLevel","_aiSkills","_specialItems",
"_Launcher","_launcherRound","_vest","_index","_WeaponAttachments","_Meats","_Drink","_Food","_aiConsumableItems","_weaponList","_ammoChoices","_attachment","_attachments",
"_headGear","_uniforms","_pistols","_specialItems","_noItems"];
private ["_i","_weap","_skin","_ai1","_skillLevel","_aiSkills",
"_launcherRound","_index","_ammoChoices"];
params["_pos","_weaponList","_aiGroup",["_skillLevel","red"],["_Launcher","none"],["_uniforms", blck_SkinList],["_headGear",blck_headgear],["_underwater",false]];
//_pos = _this select 0; // Position at which to spawn AI
@ -25,7 +22,7 @@ params["_pos","_weaponList","_aiGroup",["_skillLevel","red"],["_Launcher","none"
if (isNull _aiGroup) exitWith {diag_log "[blckeagls] ERROR CONDITION:-->> NULL-GROUP Provided to _fnc_spawnUnit"};
_ai1 = ObjNull;
_modType = call blck_fnc_getModType;
private _modType = call blck_fnc_getModType;
if (_modType isEqualTo "Epoch") then
{
"I_Soldier_EPOCH" createUnit [_pos, _aiGroup, "_ai1 = this", 0.7, "COLONEL"];
@ -53,8 +50,7 @@ _skin = "";
_counter = 1;
while {_skin isEqualTo "" && _counter < 10} do
{
_skin = selectRandom _uniforms; // call BIS_fnc_selectRandom;
//_ai1 forceAddUniform _skin;
_skin = selectRandom _uniforms;
_ai1 forceAddUniform _skin;
_skin = uniform _ai1;
//diag_log format["_fnc_spawnUnit::-->> for unit _ai1 % uniform is %2",_ai1, uniform _ai1];
@ -81,7 +77,6 @@ if (_modType isEqualTo "Epoch") then
_ai1 addHeadgear (selectRandom _headGear);
// Add a vest to AI for storage
//_vest = selectRandom blck_vests; // call BIS_fnc_selectRandom;
_ai1 addVest selectRandom blck_vests;
if ( random (1) < blck_chanceBackpack) then
@ -91,28 +86,22 @@ if ( random (1) < blck_chanceBackpack) then
};
_weap = selectRandom _weaponList;
private["_optics","_pointers","_muzzles","_underbarrel","_legalOptics"];
_ai1 addWeaponGlobal _weap;
_ammoChoices = getArray (configFile >> "CfgWeapons" >> _weap >> "magazines");
//_muzzles = getArray (configFile >> "CfgWeapons" >> _weap >> "muzzles");
_optics = getArray (configfile >> "CfgWeapons" >> _weap >> "WeaponSlotsInfo" >> "CowsSlot" >> "compatibleItems");
_pointers = getArray (configFile >> "CfgWeapons" >> _weap >> "WeaponSlotsInfo" >> "PointerSlot" >> "compatibleItems");
_muzzles = getArray (configFile >> "CfgWeapons" >> _weap >> "WeaponSlotsInfo" >> "MuzzleSlot" >> "compatibleItems");
_underbarrel = getArray (configFile >> "CfgWeapons" >> _weap >> "WeaponSlotsInfo" >> "UnderBarrelSlot" >> "compatibleItems");
_legalOptics = [];
{
if !(_x in blck_blacklistedOptics) then {_legalOptics pushback _x};
}forEach _optics;
_ammo = selectRandom _ammoChoices;
//diag_log format["[spawnUnit.sqf] _ammo returned as %1",_ammo];
for "_i" from 2 to (floor(random 3)) do {
_ai1 addMagazine _ammo;
};
//if (random 1 < 0.3) then {_unit addPrimaryWeaponItem (selectRandom _muzzles)};
_ai1 addPrimaryWeaponItem (selectRandom _legalOptics);
_ai1 addPrimaryWeaponItem (selectRandom _pointers);
_ai1 addPrimaryWeaponItem (selectRandom _muzzles);
_ai1 addPrimaryWeaponItem (selectRandom _underbarrel);
_legalOptics = _optics - blck_blacklistedOptics;
_ai1 addMagazines [selectRandom _ammoChoices, 3];
if (random 1 < 0.4) then {_ai1 addPrimaryWeaponItem (selectRandom _muzzles)};
if (random 1 < 0.4) then {_ai1 addPrimaryWeaponItem (selectRandom _legalOptics);};
if (random 1 < 0.4) then {_ai1 addPrimaryWeaponItem (selectRandom _pointers);};
if (random 1 < 0.4) then {_ai1 addPrimaryWeaponItem (selectRandom _muzzles);};
if (random 1 < 0.4) then {_ai1 addPrimaryWeaponItem (selectRandom _underbarrel);};
if ((count(getArray (configFile >> "cfgWeapons" >> _weap >> "muzzles"))) > 1) then {
_ai1 addMagazine "1Rnd_HE_Grenade_shell";
};
@ -121,11 +110,10 @@ _weap = selectRandom blck_Pistols;
//diag_log format["[spawnUnit.sqf] _weap os %1",_weap];
_ai1 addWeaponGlobal _weap;
_ammoChoices = getArray (configFile >> "CfgWeapons" >> _weap >> "magazines");
_ai1 addMagazine selectRandom _ammoChoices;
_ai1 addMagazines [selectRandom _ammoChoices, 2];
//add random items to AI. _other = ["ITEM","COUNT"]
for "_i" from 1 to (1+floor(random(3))) do {
_i = _i + 1;
_ai1 addItem (selectRandom blck_ConsumableItems);
};
@ -160,7 +148,8 @@ else
};
// Infinite ammo
_ai1 addeventhandler ["fired", {(_this select 0) setvehicleammo 1;}];
//_ai1 addeventhandler ["fired", {(_this select 0) setvehicleammo 1;}];
_ai1 addEventHandler ["reloaded", {_this call compile preprocessfilelinenumbers blck_EH_unitWeaponReloaded;}];
_ai1 addEventHandler ["killed",{ [(_this select 0), (_this select 1)] call compile preprocessfilelinenumbers blck_EH_AIKilled;}]; // changed to reduce number of concurrent threads, but also works as spawn blck_AIKilled; }];
//_ai addEventHandler ["HandleDamage",{ [(_this select 0), (_this select 1)] execVM blck_EH_AIHandleDamage;}];

View File

@ -1,22 +1,22 @@
// Configures a mission vehicle
// by Ghostrider-DBD-
// Last Updated 10/25/16
// Last Updated 1/22/17
params["_veh"];
clearWeaponCargoGlobal _veh;
clearMagazineCargoGlobal _veh;
clearBackpackCargoGlobal _veh;
clearItemCargoGlobal _veh;
params["_veh",["_clearInventory",true]];
private["_unit"];
if (_clearInventory) then
{
[_veh] call blck_fnc_emptyObject;
};
_veh setVehicleLock "LOCKEDPLAYER";
_veh addEventHandler ["GetIn",{
_veh addEventHandler ["GetIn",{ // Note: only fires when vehicle is local to player
private["_unit","_veh"];
_unit = _this select 2;
_veh = _this select 0;
if (isPlayer _unit) then
{
_unit action ["eject",_veh];
cutText ["You are not allowed to enter that vehicle at this time","PLAIN DOWN"];
titleText ["You are not allowed to enter that vehicle at this time","PLAIN DOWN"];
};
}];

View File

@ -1,11 +1,11 @@
// =========================================================================================================
// blckeagls mission system
// Author: Ghostrider-DBD-
// Last modified 9-3-16
// Last modified 1-22-17
// ------------------------------------------------------------------------------------------------------------
// Unused at present, reserved for the future
private ["_ai_veh","_ai_veh_hitsource","_ai_veh_type","_ai_veh_name","_ai_veh_side","_ai_veh_group_side","_ai_veh_hitsource_group_side","_ai_veh_hitsource_type","_ai_veh_hitsource_name","_ai_veh_hitsource_side"];
private ["_ai_veh","_ai_veh_type","_ai_veh_name"];
//diag_log "Vehicle Decommisioning handler activated";
params["_ai_veh"];

View File

@ -0,0 +1,9 @@
/*
by Ghostrider-Dbd-
1/13/17
*/
params["_vehicle"];
{
_vehicle removeAllEventHandlers _x;
}forEach ["GetIn","GetOut","Killed","Fired","HandleDamage","HandleHeal","FiredNear"];
deleteVehicle _vehicle;

View File

@ -0,0 +1,29 @@
// Spawns an emplaced weapons, man's it, and saves it to an array of monitored vehicles.
// by Ghostrider-DBD-
// Last Updated 1-22-17
// ["_pos","_emplacedGroup","_emplacedTypes",["_minDist",20],["_maxDist",35],["_precise",false] ] call blck_fnc_spawnEmplacedWeapon;
private["_emplaced","_safepos","_emp","_gunner"];
params["_pos","_emplacedGroup","_emplacedTypes",["_minDist",20],["_maxDist",35],["_precise",false], ["_missionType","undefined" ]];
if (isNull _emplacedGroup) exitWith {diag_log "[blckeagls] ERROR CONDITION:-->> NULL-GROUP Provided to _fnc_spawnEmplaced"; objNull;};
diag_log "params[_pos,_emplacedGroup,_emplacedTypes,_minDist,_maxDist,_precise,_missionType]";
diag_log format["_fnc_spawnEmplacedGroup:: -- >> _this = %1",_this];
if !(_precise) then
{
_safepos = [_pos,_minDist,_maxDist,0,0,20,0] call BIS_fnc_findSafePos;
};
_emplaced = selectRandom _emplacedTypes;
diag_log format["_fnc_spawnEmplacedWeapon:: (14) weapon %1 selected from selection of %2",_emplaced,_emplacedTypes];
diag_log format["_fnc_spawnEmplacedWeapon:: (15) weapon magazine cargo is %1", magazinesAmmo _emplaced];
// params["_vehType","_pos",["_clearInventory",true]];
_emp = [_emplaced,_safepos,false] call blck_fnc_spawnVehicle;
_emp setVariable["DBD_vehType","emplaced"];
diag_log format["_fnc_spawnEmplacedWeapon:: (17) weapon _%1 spawned at %2 using weapon type %3",_emp,_safepos,_emplaced];
if (_precise) then {_emp setPosATL _pos];
_gunner = (units _emplacedGroup) select 0;
_gunner moveingunner _emp;
waitUntil { count crew _emp > 0};
blck_missionVehicles pushback _emp;
if (blck_debugLevel > 1) then {diag_log format["spawnEmplaced.sqf: (24) _missionType %3 || Emplaced weapon %1 spawned at position %2",_emp,getPosATL _emp,_missionType];
_emp

View File

@ -2,23 +2,25 @@
Spawn a vehicle and protect it against cleanup by Epoch
Returns the object (vehicle) created.
By Ghostrider-DBD-
Last modified 10-24-16
Last modified 1-22-17
*/
private["_veh","_modType"];
params["_vehType","_pos"];
params["_vehType","_pos",["_clearInventory",true]];
//_vehType = _this select 0; // type of vehicle to be spawned
//_pos = _this select 1; // position at which vehicle is to be spawned
//diag_log format["spawnVehicle.sqf: _this = %1",_this];
if (blck_debugLevel > 2) then {diag_log format["spawnVehicle.sqf: _this = %1",_this];};
_veh = createVehicle[_vehType, _pos, [], 0, "NONE"];
_modType = call blck_fnc_getModType;
if (_modType isEqualTo "Epoch") then
{
//_veh call EPOCH_server_vehicleInit;
_veh call EPOCH_server_setVToken;
diag_log format["_fnc_spawnVehicle:: (20) EPOCH_server_setVToken performed for vehicle %1",_veh];
};
[_veh] call blck_fnc_configureMissionVehicle;
// params["_veh",["_clearInventory",true]];
[_veh,_clearInventory] call blck_fnc_configureMissionVehicle;
diag_log format["spawnVehicle:: returning parameter _veh = %1",_veh];
_veh

View File

@ -1,11 +1,10 @@
//////////////////////////////////////
// spawn a vehicle, fill it with AI, and give it waypoints around the perimeter of the mission area
// Returns an array _units that contains a list of the units that were spawned and placed in the vehicle
/*
By Ghostrider-DBD-
Copyright 2016
Last updated 8-14-16
spawns a vehicle of _vehType and mans it with units in _group.
returns _veh, the vehicle spawned.
*/
private["_vehType","_safepos","_veh"];
@ -21,7 +20,7 @@ diag_log format["_fnc_spawnVehiclePatrol::->> _group = %1",_group];
_safepos = [_pos,0,25,0,0,20,0] call BIS_fnc_findSafePos;
_veh = [_vehType,_safepos] call blck_fnc_spawnVehicle;
//diag_log format["spawnVehiclePatrols:: vehicle spawned is %1 of typeof %2",_veh, typeOf _veh];
diag_log format["spawnVehiclePatrol:: vehicle spawned is %1 of typeof %2",_veh, typeOf _veh];
private["_unitNumber"];
_unitNumber = 0;
@ -40,7 +39,7 @@ while {(count (waypoints _group)) > 0} do
{
deleteWaypoint ((waypoints _group) select 0);
};
//diag_log format["spawnVehiclePatrols:: vehicle spawned was %1",_veh];
_count = 5;
_start = _center getDir _pos;
_angle = _start;
@ -58,7 +57,5 @@ for "_i" from 1 to _count do
};
_wp = _group addWaypoint [_pos, 25];
_wp setWaypointType "CYCLE";
waitUntil { count crew _veh > 0};
blck_missionVehicles pushback _veh;
_veh

View File

@ -5,62 +5,82 @@
By Ghostrider-DBD-
Copyright 2016
Last updated 1-17-17
Last updated 1-22-17
*/
private _vehList = blck_missionVehicles;
private ["_veh","_vehList"];
_vehList = blck_missionVehicles;
if (blck_debugLevel > 1) then {diag_log format["_fnc_vehicleMonitor:: function called with blck_missionVehicles = %1",_vehList];};
{
private ["_veh"];
_veh = _x;
if (_veh getVariable["blck_DeleteAt",0] > 0) then
{
if (diag_tickTime > (_veh getVariable["blck_DeleteAt",0])) then
{
[_veh] call blck_deleteVehicle;
blck_missionVehicles = blck_missionVehicles - [_veh];
};
};
if ({alive _x} count crew _veh < 1) then
{
if (_veh getVariable["DBD_vehType","none"] isEqualTo "emplaced") then
{
[_veh] spawn {uiSleep 1;(_this select 0) setDamage 1;};
blck_missionVehicles = blck_missionVehicles - [_veh];
if (blck_debugOn) then{
diag_log format["_fnc_vehicleMonitor:: deleting emplaced weapon %1",_veh];
if (blck_debugLevel > 2) then
{
diag_log format["_fnc_vehicleMonitor:: case of destroyed where vehicle = %1",_veh];
};
_veh setDamage 1;
_veh setVariable["blck_DeleteAt",diag_tickTime + 60];
}else {
if (blck_killEmptyAIVehicles) then
{
blck_missionVehicles = blck_missionVehicles - [_veh];
[_veh] spawn {
params["_v"];
//diag_log format["vehicleMonitor.sqf:: case of patrol vehicle: _veh %1 is about to be killed with getAllHitPointsDamage = %2",_v, (getAllHitPointsDamage _v)];
uiSleep 20;
{
_v setHitPointDamage [_x, 1];
//diag_log format["vehicleMonitor: hitpart %1 for vehicle %1 set to 1",_x,_v];
} forEach ["HitLFWheel","HitLF2Wheel","HitRFWheel","HitRF2Wheel","HitEngine","HitLBWheel","HitLMWheel","HitRBWheel","HitRMWheel","HitTurret","HitGun","HitTurret","HitGun","HitTurret","HitGun","HitTurret","HitGun"];
if (blck_debugLevel isEqualTo 3) then
{
diag_log format["_fnc_vehicleMonitor:: damage applied to a patrol vehicle -- >> current damage for vehicle %1 is = %2",_v, (getAllHitPointsDamage _v)];
};
[_v] spawn { // spawn this so we don't hold up the rest the evaluations and cleanup needed.
private _v = _this select 0;
uiSleep 60;
if (blck_debugOn) then {
diag_log format["_fnc_vehicleMonitor:: case of patrol vehicle:deleting vehicle _veh",_v];
};
deleteVehicle _v;
};
};
if (blck_debugLevel > ) then
{
diag_log format["_fnc_vehicleMonitor:: case of patrol vehicle destroyed where vehicle = %1",_veh];
};
{
_veh setHitPointDamage [_x, 1];
} forEach ["HitLFWheel","HitLF2Wheel","HitRFWheel","HitRF2Wheel","HitEngine","HitLBWheel","HitLMWheel","HitRBWheel","HitRMWheel","HitTurret","HitGun","HitTurret","HitGun","HitTurret","HitGun","HitTurret","HitGun"];
_veh setVariable["blck_DeleteAt",diag_tickTime + 60];
} else {
//diag_log format["vehicleMonitor.sqf: make vehicle available to players; stripping eventHandlers from_veh %1",_veh];
blck_missionVehicles = blck_missionVehicles - [_veh];
_veh removealleventhandlers "GetIn";
_veh removealleventhandlers "GetOut";
_veh setVehicleLock "UNLOCKED" ;
if (blck_debugOn) then
_veh setVariable["releasedToPlayers",true];
[_veh] call blck_fnc_emptyObject;
if (blck_debugLevel > ) then
{
diag_log format["_fnc_vehicleMonitor:: case of patrol vehicle released to players where vehicle = %1",_veh];
};
};
};
} else {
_veh setVehicleAmmo 1;
_veh setFuel 1;
private ["_crew","_mag","_allMags","_cnt"];
//_veh setVehicleAmmo 1;
//_veh setFuel 1;
// https://community.bistudio.com/wiki/fullCrew
// 0 1 2 3 4
// returns Array - format [[<Object>unit,<String>role,<Number>cargoIndex,<Array>turretPath,<Boolean>personTurret], ...]
//diag_log format["_fnc_vehicleMonitor:: (65) _veh = %1",_veh];
_crew = fullCrew _veh;
//diag_log format["_fnc_vehicleMonitor:: (67) _crew = %1",_crew];
{
//diag_log format ["_fnc_vehicleMonitor:: (69) _x = %1",_x];
_mag = _veh currentMagazineTurret (_x select 3);
if (count _mag > 0) then
{
//diag_log format["_fnc_vehicleMonitor:: (71) _mag is typeName %1", typeName _mag];
//diag_log format ["_fnc_vehicleMonitor:: (71) length _mag = %2 and _mag = %1",_mag,count _mag];
_allMags = magazinesAmmo _veh;
//diag_log format["_fnc_vehicleMonitor:: (71) _allMags = %1",_allMags];
_cnt = ( {_mag isEqualTo (_x select 0)}count _allMags);
//diag_log format["_fnc_vehicleMonitor:: (75) _cnt = %1",_cnt];
if (_cnt < 2) then {_veh addMagazineCargo [_mag,2]};
};
} forEach _crew;
};
}forEach _vehList;

View File

@ -17,21 +17,20 @@ blck_fnc_monitorHC = compileFinal preprocessFileLineNumbers "\q\addons\custom_s
blck_fnc_timeAcceleration = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\TimeAccel\GMS_fnc_Time.sqf";
blck_fnc_getModType = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Functions\GMS_fnc_getModType.sqf"; // Test if Epoch or Exile is loaded
blck_fnc_groupsOnAISide = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Functions\GMS_fnc_GroupsOnAISide.sqf"; // Returns the number of groups on the side used by AI
//blck_fnc_deleteFromArray = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Functions\GMS_fnc_deleteFromArray.sqf";
blck_fnc_emptyObject = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Functions\GMS_fnc_emptyObject.sqf";
blck_fnc_playerInRange = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Functions\GMS_fnc_playerInRange.sqf";
// Player-related functions
blck_fnc_rewardKiller = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Units\GMS_fnc_rewardKiller.sqf";
blck_fnc_MessagePlayers = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Functions\GMS_fnc_AIM.sqf"; // Send messages to players regarding Missions
//blck_fnc_sendRewardMessage = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Functions\GMS_fnc_sendRewardMessage.sqf";
// Mission-related functions
blck_fnc_missionStartConditionsMet = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_missionStartConditionsMet.sqf";
blck_fnc_selectAILoadout = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_selectAILoadout.sqf";
blck_fnc_addMissionToQue = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_addMissionToQue.sqf"; //
blck_fnc_updateMissionQue = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_updateMissionQue.sqf"; //
blck_fnc_addLiveAItoQue = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_addLiveAItoQue.sqf";
blck_fnc_addObjToQue = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_addObjToQue.sqf"; //
blck_fnc_objectInRange = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_objectInRange.sqf";
//blck_fnc_objectInRange = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_objectInRange.sqf";
blck_fnc_missionTimer = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_missionTimer.sqf";
blck_fnc_spawnCrate = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_spawnCrate.sqf"; // Simply spawns a crate of a specified type at a specific position.
blck_fnc_spawnMissionCrates = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_spawnMissionCrates.sqf";
@ -40,6 +39,7 @@ blck_fnc_spawnCompositionObjects = compileFinal preprocessFileLineNumbers "\q\a
blck_fnc_spawnRandomLandscape = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_spawnRandomLandscape.sqf";
blck_fnc_spawnMissionVehiclePatrols = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_spawnMissionVehiclePatrols.sqf";
blck_fnc_spawnMissionEmplacedWeapons = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_spawnMissionEmplacedWeapons.sqf";
blck_fnc_spawnEmplacedWeaponArray = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_spawnEmplacedWeaponArray.sqf";
blck_fnc_spawnMissionAI = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_spawnMissionAI.sqf";
blck_fnc_spawnMissionLootVehicles = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_spawnMissionLootVehicles.sqf";
blck_fnc_spawnMissionHeli = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_spawnMissionHeli.sqf";
@ -48,11 +48,9 @@ blck_fnc_loadLootItemsFromArray = compileFinal preprocessFileLineNumbers "\q\add
blck_fnc_fillBoxes = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_fillBoxes.sqf"; // Adds items to an object according to passed parameters. See the script for details.
blck_fnc_smokeAtCrates = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_smokeAtCrates.sqf"; // Spawns a wreck and adds smoke to it
blck_fnc_spawnMines = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_spawnMines.sqf"; // Deploys mines at random locations around the mission center
blck_fnc_abortMission = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_spawnMines.sqf";
blck_fnc_missionEndConditionsMet = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_missionEndConditionsMet.sqf";
blck_fnc_clearMines = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_clearMines.sqf"; // clears mines in an array passed as a parameter
blck_fnc_signalEnd = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_signalEnd.sqf"; // deploy smoke grenades at loot crates at the end of the mission.
blck_fnc_missionEnd = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_missionEnd.sqf";
blck_fnc_endMission = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Missions\GMS_fnc_endMission.sqf";
// Reinforcement-related functions
blck_fnc_callInReinforcements = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Reinforcements\GMS_fnc_callInReinforcements.sqf";
@ -69,26 +67,29 @@ blck_fnc_setupWaypoints = compileFinal preprocessFileLineNumbers "\q\addons\cus
blck_fnc_cleanEmptyGroups = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Functions\GMS_fnc_cleanEmptyGroups.sqf"; // GMS_fnc_cleanEmptyGroups
// Functions specific to vehicles, whether wheeled or static
blck_fnc_spawnEmplacedWeapon = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Vehicles\GMS_fnc_spawnEmplaced.sqf"; // Self-evident
blck_fnc_spawnVehicle = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Vehicles\GMS_fnc_spawnVehicle.sqf"; // Spawn a temporary vehicle of a specified type at a specific position
blck_fnc_spawnVehiclePatrol = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Vehicles\GMS_fnc_spawnVehiclePatrol.sqf"; // Spawn an AI vehicle control and have it patrol the mission perimeter
//blck_fnc_spawnEmplacedWeapon = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Vehicles\GMS_fnc_spawnEmplacedWeapon.sqf";
blck_fnc_spawnVehicle = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Vehicles\GMS_fnc_spawnVehicle.sqf";
blck_fnc_spawnVehiclePatrol = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Vehicles\GMS_fnc_spawnVehiclePatrol.sqf";
blck_fnc_protectVehicle = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Vehicles\GMS_fnc_protectVehicle.sqf";
blck_fnc_configureMissionVehicle = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Vehicles\GMS_fnc_configureMissionVehicle.sqf";
blck_fnc_vehicleMonitor = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Vehicles\GMS_fnc_vehicleMonitor.sqf"; // Checks for vehicles for which all AI are dead and handles any changes needed when this is true.
blck_fnc_vehicleMonitor = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Vehicles\GMS_fnc_vehicleMonitor.sqf";
//blck_fnc_deleteVehicle = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Vehicles\GMS_fnc_deleteVehicle.sqf";
// functions to support Units
blck_fnc_removeGear = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Units\GMS_fnc_removeGear.sqf"; // Strip an AI unit of all gear.
blck_fnc_spawnAI = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Units\GMS_fnc_spawnUnit.sqf"; // spawn individual AI
blck_EH_AIKilled = "\q\addons\custom_server\Compiles\Units\GMS_EH_AIKilled.sqf"; // Event handler to process AI deaths
blck_EH_unitWeaponReloaded = "\q\addons\custom_server\Compiles\Units\GMS_EH_unitWeaponReloaded.sqf";
//blck_EH_AIHandleDamage = "\q\addons\custom_server\Compiles\Units\GMS_EH_AIHandleDamage.sqf"; // GRMS_EH_AIHandleDamage
blck_fnc_processAIKill = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Units\GMS_fnc_processAIKill.sqf";
blck_fnc_removeLaunchers = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Units\GMS_fnc_removeLaunchers.sqf";
blck_fnc_removeNVG = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Units\GMS_fnc_removeNVG.sqf";
blck_fnc_alertNearbyUnits = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Units\GMS_fnc_alertNearbyUnits.sqf";
blck_fnc_processIlleagalAIKills = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Units\GMS_fnc_processIlleagalAIKills.sqf";
GMS_fnc_cleanupDeadAI = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Units\GMS_fnc_cleanupDeadAI.sqf"; // handles deletion of AI bodies and gear when it is time.
blck_fnc_cleanupDeadAI = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Units\GMS_fnc_cleanupDeadAI.sqf"; // handles deletion of AI bodies and gear when it is time.
blck_fnc_setSkill = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Units\GMS_fnc_setSkill.sqf";
blck_fnc_cleanupAliveAI = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Units\GMS_fnc_cleanupAliveAI.sqf";
blck_fnc_deleteAI = compileFinal preprocessFileLineNumbers "\q\addons\custom_server\Compiles\Units\GMS_fnc_deleteAI.sqf";
diag_log "[blckeagls] Functions Loaded";
blck_functionsCompiled = true;

View File

@ -31,6 +31,6 @@ DBD_HeliCrashSites = [];
// radius within whih missions are triggered. The trigger causes the crate and AI to spawn.
blck_TriggerDistance = 1000;
blck_mainThreadUpdateInterval = 60;
blck_missionSpawning = false;
//blck_missionSpawning = false;
diag_log "[blckeagls] Variables Loaded";
blck_variablesLoaded = true;

View File

@ -159,7 +159,7 @@ Last modified 8/1/15
blck_bodyCleanUpTimer = 1200; // time in seconds after which dead AI bodies are deleted
// Each time an AI is killed, the location of the killer will be revealed to all AI within this range of the killed AI, set to -1 to disable
// values are ordered as follows [blue, red, green, orange];
blck_AliveAICleanUpTime = 900; // Time after mission completion at which any remaining live AI are deleted.
blck_AliveAICleanUpTimer = 900; // Time after mission completion at which any remaining live AI are deleted.
blck_cleanupCompositionTimer = 1200;
blck_AIAlertDistance = [250,325,450,500];
//blck_AIAlertDistance = [150,225,400,500];

View File

@ -157,7 +157,7 @@ Last modified 8/1/15
blck_bodyCleanUpTimer = 1200; // time in seconds after which dead AI bodies are deleted
// Each time an AI is killed, the location of the killer will be revealed to all AI within this range of the killed AI, set to -1 to disable
// values are ordered as follows [blue, red, green, orange];
blck_AliveAICleanUpTime = 900; // Time after mission completion at which any remaining live AI are deleted.
blck_AliveAICleanUpTimer = 900; // Time after mission completion at which any remaining live AI are deleted.
blck_cleanupCompositionTimer = 1200;
blck_AIAlertDistance = [150,225,250,300];
//blck_AIAlertDistance = [150,225,400,500];

View File

@ -24,19 +24,19 @@ if (blck_debugON) then
// Used primarily for debugging.
diag_log "[blckeagls] Debug seting is ON, Custom configurations used";
blck_mainThreadUpdateInterval = 10;
//blck_mainThreadUpdateInterval = 10;
blck_enableOrangeMissions = -1;
blck_enableGreenMissions = -1;
blck_enableRedMissions = 1;
blck_enableRedMissions = -1;
blck_enableBlueMissions = 1;
blck_cleanupCompositionTimer = 10; // Time after mission completion at which items in the composition are deleted.
blck_AliveAICleanUpTime = 10; // Time after mission completion at which any remaining live AI are deleted.
blck_AliveAICleanUpTimer = 10; // Time after mission completion at which any remaining live AI are deleted.
blck_bodyCleanUpTimer = 10;
blck_SpawnEmplaced_Orange = 4; // Number of static weapons at Orange Missions
blck_SpawnEmplaced_Green = 3; // Number of static weapons at Green Missions
blck_SpawnEmplaced_Orange = 0; // Number of static weapons at Orange Missions
blck_SpawnEmplaced_Green = 0; // Number of static weapons at Green Missions
blck_SpawnEmplaced_Blue = 1; // Number of static weapons at Blue Missions
blck_SpawnEmplaced_Red = 2;
@ -59,16 +59,17 @@ if (blck_debugON) then
blck_TMax_Green = 38;
blck_TMax_Orange = 31;
blck_reinforceBlue = [0.999, 2, 0.001];
//blck_MissionTimout = 120; // 40 min
//blck_reinforceBlue = [0.999, 2, 0.001];
//blck_MissionTimout = 60; // 40 min
blck_SkillsBlue = [
["aimingAccuracy",0.01],
["aimingShake",0.01],
["aimingSpeed",0.01],
["endurance",0.01],
["spotDistance",0.01],
["spotTime",0.01],
["courage",0.01],
["aimingAccuracy",0.1],
["aimingShake",0.3],
["aimingSpeed",0.5],
["endurance",0.5],
["spotDistance",0.7],
["spotTime",0.7],
["courage",0.7],
["reloadSpeed",0.80],
["commanding",0.8],
["general",1.00]

View File

@ -0,0 +1,9 @@
Known issues
1. Missions sometimes are not triggered by players.
2. Missions are sometimes not completed even when completion criteria are met.
3. Infinite ammo is not working for at least some weapons. Probable cause is the arma engine as server logs show multiple errors related to weapons not being found.
This impacts both vehicle-mounted weapons and AI weapons.
4. Emplaced weapons are not spawning correctly.

View File

@ -1,9 +1,36 @@
/*
blck Mission system by Ghostrider-DBD-
Loosely based on the AI mission system by blckeagls ver 2.0.2
Contributions by Narines: bug fixes, testing, 'fired' event handler
Contributions by Narines: bug fixes, testing, infinite ammo fix.
Ideas or code from that by Vampire and KiloSwiss have been used for certain functions.
1/22/17 Version 6.54 build 32
Changed code to test for conditions that trigger to spawn mission objects and AI completely
Rewrote the code for spawning emplaced weapons from scratch.
1/22/17 Version 6.54 build 30
Fixed an error in how the waitTime till a mission was respawned after being updated to inactive status.
Added additional reporting as to the mission type for which AI, statics and vehicle patrols are being spawned.
Continued switching from blck_debugOn to blck_debugLevel.
Continued work to move much of the code from GMS_fnc_missionSpawner to precompiled functions.
- tested and working for all but the emplaced weapons module.
Removed old code that had been commented out from GMS_missionSpawner.
deactivated the 'fired' event handler
added an 'reloaded' event handler to units that adds a magazin of the type used to reload the weapon to prevent units running out of ammo. this also provides a break in firing and is more realistic.
Added a check to GMS_fnc_vehicleMonitor that addes ammo to vehicle cargo when stores are low. Removed the infinite ammo script for static and vehicle weapons, again for greater realism.
Increased number of rounds of ammo added to AI units for primary and secondary weapons.
Tweaked code in GMS_fnc_spawnUnit to increase efficiency.
Attempted a fix for occaisional issues with missions not triggering or ending by changing from distance to distance2D.
Tweaked code for deleting dead AI to also delete any weapons containers nearby.
Checked throughout for potential scope issues; ensured all private variables were declared as such.
Changed the method by which mission patrol vehicles and static weapons are deleted at the end of a mission.
1/21/17 Build 29.
Went back to the timerless system for spawning missions.
Improved code for updating the array of pending/active missions
GMS_fnc_updateMissionQue.sqf re-written to take greater advantage of existing array commands: set and find.
Ensured that the array used to store the location(s) of active or recent missions is properly updated.
1/13/17 Version 6.54 Build 27
Rerverted back to the code that spawned a single instance of each mission until I can debug certain issues.

View File

@ -94,23 +94,23 @@ blck_spawnStaticLootCrates = nil;
//Start the mission timers
if (blck_enableOrangeMissions > 0) then
{
[_missionListOrange,_pathOrange,"OrangeMarker","orange",blck_TMin_Orange,blck_TMax_Orange] spawn blck_fnc_missionTimer;//Starts major mission system (Orange Map Markers)
//[_missionListOrange,_pathOrange,"OrangeMarker","orange",blck_TMin_Orange,blck_TMax_Orange,blck_enableOrangeMissions] call blck_fnc_addMissionToQue;
//[_missionListOrange,_pathOrange,"OrangeMarker","orange",blck_TMin_Orange,blck_TMax_Orange] spawn blck_fnc_missionTimer;//Starts major mission system (Orange Map Markers)
[_missionListOrange,_pathOrange,"OrangeMarker","orange",blck_TMin_Orange,blck_TMax_Orange,blck_enableOrangeMissions] call blck_fnc_addMissionToQue;
};
if (blck_enableGreenMissions > 0) then
{
[_missionListGreen,_pathGreen,"GreenMarker","green",blck_TMin_Green,blck_TMax_Green] spawn blck_fnc_missionTimer;//Starts major mission system 2 (Green Map Markers)
//[_missionListGreen,_pathGreen,"GreenMarker","green",blck_TMin_Green,blck_TMax_Green,blck_enableGreenMissions] call blck_fnc_addMissionToQue;
//[_missionListGreen,_pathGreen,"GreenMarker","green",blck_TMin_Green,blck_TMax_Green] spawn blck_fnc_missionTimer;//Starts major mission system 2 (Green Map Markers)
[_missionListGreen,_pathGreen,"GreenMarker","green",blck_TMin_Green,blck_TMax_Green,blck_enableGreenMissions] call blck_fnc_addMissionToQue;
};
if (blck_enableRedMissions > 0) then
{
[_missionListRed,_pathRed,"RedMarker","red",blck_TMin_Red,blck_TMax_Red] spawn blck_fnc_missionTimer;//Starts minor mission system (Red Map Markers)//Starts minor mission system 2 (Red Map Markers)
//[_missionListRed,_pathRed,"RedMarker","red",blck_TMin_Red,blck_TMax_Red,blck_enableRedMissions] call blck_fnc_addMissionToQue;
//[_missionListRed,_pathRed,"RedMarker","red",blck_TMin_Red,blck_TMax_Red] spawn blck_fnc_missionTimer;//Starts minor mission system (Red Map Markers)//Starts minor mission system 2 (Red Map Markers)
[_missionListRed,_pathRed,"RedMarker","red",blck_TMin_Red,blck_TMax_Red,blck_enableRedMissions] call blck_fnc_addMissionToQue;
};
if (blck_enableBlueMissions > 0) then
{
[_missionListBlue,_pathBlue,"BlueMarker","blue",blck_TMin_Blue,blck_TMax_Blue] spawn blck_fnc_missionTimer;//Starts minor mission system (Blue Map Markers)
//[_missionListBlue,_pathBlue,"BlueMarker","blue",blck_TMin_Blue,blck_TMax_Blue,blck_enableBlueMissions] call blck_fnc_addMissionToQue;
//[_missionListBlue,_pathBlue,"BlueMarker","blue",blck_TMin_Blue,blck_TMax_Blue] spawn blck_fnc_missionTimer;//Starts minor mission system (Blue Map Markers)
[_missionListBlue,_pathBlue,"BlueMarker","blue",blck_TMin_Blue,blck_TMax_Blue,blck_enableBlueMissions] call blck_fnc_addMissionToQue;
};
// start the main thread for the mission system which monitors missions running and stuff to be cleaned up

View File

@ -1,3 +1,4 @@
private ["_version","_versionDate"];
_blck_version = "6.54 Build 28";
_blck_versionDate = "1-13-17 10:00 PM";
_blck_version = "6.54 Build 32";
_blck_versionDate = "1-22-17 8:00 PM";

View File

@ -1,9 +1,49 @@
/*
blck Mission system by Ghostrider-DBD-
Loosely based on the AI mission system by blckeagls ver 2.0.2
Contributions by Narines: bug fixes, testing, 'fired' event handler
Contributions by Narines: bug fixes, testing, infinite ammo fix.
Ideas or code from that by Vampire and KiloSwiss have been used for certain functions.
1/22/17 Version 6.54 build 32
Changed code to test for conditions that trigger to spawn mission objects and AI completely
Rewrote the code for spawning emplaced weapons from scratch.
Fixed an error in how the waitTime till a mission was respawned after being updated to inactive status.
Added additional reporting as to the mission type for which AI, statics and vehicle patrols are being spawned.
Continued switching from blck_debugOn to blck_debugLevel.
Continued work to move much of the code from GMS_fnc_missionSpawner to precompiled functions.
- tested and working for all but the emplaced weapons module.
Removed old code that had been commented out from GMS_missionSpawner.
deactivated the 'fired' event handler
added an 'reloaded' event handler to units that adds a magazin of the type used to reload the weapon to prevent units running out of ammo. this also provides a break in firing and is more realistic.
Added a check to GMS_fnc_vehicleMonitor that addes ammo to vehicle cargo when stores are low. Removed the infinite ammo script for static and vehicle weapons, again for greater realism.
Increased number of rounds of ammo added to AI units for primary and secondary weapons.
Tweaked code in GMS_fnc_spawnUnit to increase efficiency.
Attempted a fix for occaisional issues with missions not triggering or ending by changing from distance to distance2D.
Tweaked code for deleting dead AI to also delete any weapons containers nearby.
Checked throughout for potential scope issues; ensured all private variables were declared as such.
Changed the method by which mission patrol vehicles and static weapons are deleted at the end of a mission.
1/21/17 Build 29.
Went back to the timerless system for spawning missions.
Improved code for updating the array of pending/active missions
GMS_fnc_updateMissionQue.sqf re-written to take greater advantage of existing array commands: set and find.
Ensured that the array used to store the location(s) of active or recent missions is properly updated.
1/13/17 Version 6.54 Build 27
Rerverted back to the code that spawned a single instance of each mission until I can debug certain issues.
1/7/17 Version 6.53 Build 24
Added a setting blck_baseSkill = 0.7; // This defines the base skil of AI. Increase it to make AI more challenging.
Tweaked AI difficulty settings to make missions more difficult.
changed - GMS_EH_unitKilled - the event handler now uses precompiled rather than compiled on the fly code.
changed - several other minor performance tweaks were made server side.
changed - small changes were made the the loop in blck_client.sqf
Tweaked debugging information to reduced unnecessary logging when not in debug-mode.
Disabled the loop sending server fps client-side
fixed - GMS_fnc_updateMissionQue was not correctly updating mission information after mission completion.
fixed - GMS_fnc_mainThread was not deleted old AI and Vehicles from the arrays used to capture them after mission completion.
changed - calls to GMS_fnc_vehicleMonitor were moved inside the main loop.
1/3/17 Version 6.51 Build 23
Moved configuration for the client from debug\blckclient.sqf to debug\blckconfig.sqf.
Added a setting blck_useKillMessages = true/false; (line 60 of the config. when true, kill messages will be send to all players when a player kills an AI. The style of the message is controlled client-side (debug\blck_config.sqf)