Epoch_Server/Server/@A3EAI/addons/a3eai/scripts/dynamicSpawn_manager.sqf

141 lines
7.8 KiB
Plaintext

#include "\A3EAI\globaldefines.hpp"
if (A3EAI_debugLevel > 0) then {diag_log "Starting A3EAI Dynamic Spawn Manager in 1 minute.";};
uiSleep 60;
//uiSleep 30; //FOR DEBUGGING
if (A3EAI_debugLevel > 0) then {diag_log "A3EAI V3 Dynamic Spawn Manager started.";};
//Spawn manager database variables
_playerUID_DB = []; //Database of all collected playerUIDs
_lastSpawned_DB = []; //Database of timestamps for each corresponding playerUID
_lastOnline_DB = []; //Database of last online checks
while {true} do {
if (({alive _x} count allPlayers) > 0) then {
_allPlayers = []; //Do not edit
_currentTime = diag_tickTime;
{
if ((isPlayer _x) && {((typeOf _x) in [PLAYER_UNITS])}) then {
_playerUID = getPlayerUID _x;
if !((_playerUID select [0,2]) isEqualTo "HC") then {
_playerIndex = _playerUID_DB find _playerUID;
if (_playerIndex > -1) then {
_lastSpawned = _lastSpawned_DB select _playerIndex;
_timePassed = (_currentTime - _lastSpawned);
if (_timePassed > A3EAI_timePerDynamicSpawn) then {
if ((_currentTime - (_lastOnline_DB select _playerIndex)) < A3EAI_purgeLastDynamicSpawnTime) then {
_allPlayers pushBack _x;
//diag_log format ["DEBUG: Player %1 added to current cycle dynamic spawn list.",_x];
};
_lastOnline_DB set [_playerIndex,_currentTime];
} else {
if (_playerUID in A3EAI_failedDynamicSpawns) then {
_allPlayers pushBack _x;
//diag_log format ["DEBUG: Player %1 added to current cycle dynamic spawn list.",_x];
A3EAI_failedDynamicSpawns = A3EAI_failedDynamicSpawns - [_playerUID];
};
};
} else {
_playerUID_DB pushBack _playerUID;
_lastSpawned_DB pushBack _currentTime - DYNSPAWNMGR_SLEEP_DELAY;
_lastOnline_DB pushBack _currentTime;
if (A3EAI_debugLevel > 1) then {diag_log format ["A3EAI Debug:: Player %1 added to dynamic spawn playerUID database.",_x];};
};
//diag_log format ["DEBUG: Found a player at %1 (%2).",mapGridPosition _x,name _x];
};
};
uiSleep 0.05;
} forEach allPlayers;
_activeDynamicSpawns = (count A3EAI_dynTriggerArray);
_playerCount = (count _allPlayers);
_maxSpawnsPossible = (_playerCount min A3EAI_maxDynamicSpawns); //Can't have more spawns than players (doesn't count current number of dynamic spawns)
if (A3EAI_debugLevel > 1) then {diag_log format ["A3EAI Debug: Preparing to create %1 dynamic spawns (Players: %2, Dynamic Spawns: %3).",(_maxSpawnsPossible - _activeDynamicSpawns),_playerCount,_activeDynamicSpawns];};
while {_allPlayers = _allPlayers - [objNull]; (((_maxSpawnsPossible - _activeDynamicSpawns) > 0) && {!(_allPlayers isEqualTo [])})} do { //_spawns: Have we created enough spawns? _allPlayers: Are there enough players to create spawns for?
_time = diag_tickTime;
_player = _allPlayers call A3EAI_selectRandom;
_playerUID = (getPlayerUID _player);
if (alive _player) then {
_playername = name _player;
_index = _playerUID_DB find _playerUID;
_playerPos = getPosATL _player;
_spawnParams = _playerPos call A3EAI_getSpawnParams;
_spawnChance = _spawnParams select 3;
_chanceModifier = 1.00;
call {
if (_spawnChance isEqualTo 0) exitWith {};
if ((vehicle _player) isKindOf "Air") exitWith {
_spawnChance = 0;
if (A3EAI_debugLevel > 1) then {diag_log format ["A3EAI Debug: Player %1 is in Air vehicle. Dynamic spawn chance set to 0.",_player];};
};
if (({if (_playerPos in _x) exitWith {1}} count (nearestLocations [_playerPos,[BLACKLIST_OBJECT_GENERAL,BLACKLIST_OBJECT_DYNAMIC],1500])) > 0) exitWith {
_spawnChance = 0;
if (A3EAI_debugLevel > 1) then {diag_log format ["A3EAI Debug: Player %1 is in blacklisted area. Dynamic spawn chance set to 0.",_player];};
};
if !((_playerPos nearObjects [PLOTPOLE_OBJECT,PLOTPOLE_RADIUS]) isEqualTo []) exitWith {
_spawnChance = 0;
if (A3EAI_debugLevel > 1) then {diag_log format ["A3EAI Debug: Player %1 is near pole object. Dynamic spawn chance set to 0.",_player];};
};
if (currentWeapon _player isEqualTo "") then {
_chanceModifier = _chanceModifier + DYNAMIC_CHANCE_ADJUST_UNARMED;
if (A3EAI_debugLevel > 1) then {diag_log format ["A3EAI Debug: Player %1 is unarmed. Probability modifier set to %2.",_player,_chanceModifier];};
};
if ((damage _player) > DYNAMIC_WEAK_PLAYER_HEALTH) then {
_chanceModifier = _chanceModifier + DYNAMIC_CHANCE_ADJUST_WEAKENED;
if (A3EAI_debugLevel > 1) then {diag_log format ["A3EAI Debug: Player %1 is weakened. Probability modifier set to %2.",_player,_chanceModifier];};
};
if !((_playerPos nearObjects [LOOT_HOLDER_CLASS,DYNAMIC_LOOTING_DISTANCE]) isEqualTo []) then {
_chanceModifier = _chanceModifier + DYNAMIC_CHANCE_ADJUST_LOOTING;
if (A3EAI_debugLevel > 1) then {diag_log format ["A3EAI Debug: Player %1 is looting. Probability modifier set to %2.",_player,_chanceModifier];};
};
if (_chanceModifier < 0) then {_chanceModifier = 0;};
if (A3EAI_debugLevel > 1) then {diag_log format ["A3EAI Debug: Dynamic spawn probabilities for %1: Base: %2, Modifier: %3, A3EAI_spawnChanceMultiplier: %4",_player,_spawnChance,_chanceModifier,A3EAI_spawnChanceMultiplier];};
_spawnChance = (_spawnChance * _chanceModifier * A3EAI_spawnChanceMultiplier);
};
if (_spawnChance call A3EAI_chance) then {
_lastSpawned_DB set [_index,diag_tickTime];
_trigger = createTrigger [TRIGGER_OBJECT,_playerPos,false];
_location = [_playerPos,TEMP_BLACKLIST_AREA_DYNAMIC_SIZE] call A3EAI_createBlackListAreaDynamic;
_trigger setVariable ["triggerLocation",_location];
_trigger setTriggerArea [TRIGGER_SIZE_SMALL,TRIGGER_SIZE_SMALL,0,false];
_trigger setTriggerActivation ["ANY", "PRESENT", true];
_trigger setTriggerTimeout [TRIGGER_TIMEOUT_DYNAMIC, true];
_trigger setTriggerText (format ["Dynamic Spawn (Triggered by: %1)",_playername]);
_trigger setVariable ["targetplayer",_player];
_trigger setVariable ["targetplayerUID",_playerUID];
_trigger setTriggerStatements ["{if (isPlayer _x) exitWith {1}} count thisList != 0;","", "[thisTrigger] spawn A3EAI_despawn_dynamic;"];
if (A3EAI_enableDebugMarkers) then {
_nul = _trigger spawn {
_marker = str(_this);
if (_marker in allMapMarkers) then {deleteMarker _marker};
_marker = createMarker[_marker,(getPosASL _this)];
_marker setMarkerShape "ELLIPSE";
_marker setMarkerType "Flag";
_marker setMarkerBrush "SOLID";
_marker setMarkerSize [600, 600];
_marker setMarkerAlpha 0;
};
};
0 = [PATROL_DIST_DYNAMIC,_trigger,_spawnParams select 0,_spawnParams select 1,_spawnParams select 2] call A3EAI_spawnUnits_dynamic;
if (A3EAI_debugLevel > 0) then {diag_log format ["A3EAI Debug: Created dynamic trigger at %1 with params %2. Triggered by player: %3.",(mapGridPosition _trigger),_spawnParams,_playername];};
} else {
if (A3EAI_debugLevel > 1) then {diag_log format ["A3EAI Debug: Dynamic spawn probability check failed for player %1 (Probability: %2).",_playername,_spawnChance];};
};
} else {
if (A3EAI_debugLevel > 1) then {diag_log format ["A3EAI Debug: Cancel dynamic spawn check for player %1 (Reason: Player not in suitable state).",_player]};
};
_allPlayers = _allPlayers - [_player];
_activeDynamicSpawns = _activeDynamicSpawns + 1;
if (A3EAI_debugLevel > 1) then {diag_log format ["A3EAI Debug: Processed a spawning probability check in %1 seconds.",diag_tickTime - _time]};
uiSleep 5;
};
} else {
if (A3EAI_debugLevel > 1) then {diag_log "A3EAI Debug: No players online. Dynamic spawn manager is entering waiting state.";};
};
if (A3EAI_debugLevel > 1) then {diag_log format ["A3EAI Debug: Dynamic spawn manager is sleeping for %1 seconds.",DYNSPAWNMGR_SLEEP_DELAY];};
uiSleep DYNSPAWNMGR_SLEEP_DELAY;
};