123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- /*
- File: clean.sqf
- Author:
- Quiksilver
- Last modified:
- 10/12/2014 ArmA 1.36 by Quiksilver
- Description:
- Maintain healthy quantity of some mission objects created during scenarios, including some created by the engine.
- - Dead bodies
- - Dead vehicles
- - Craters
- - Weapon holders (ground garbage)
- - Mines
- - Static weapons
- - Ruins
- - Orphaned MP Triggers http://feedback.arma3.com/view.php?id=19231
- - Empty Groups
- * Ruins can be excluded by setPos [0,0,0] on them, this script will not touch them in that case. Could be done for JIP/locality reasons, since Ruins can be fiddly with JIP.
- * Note: Please do not place any triggers at nullPos [0,0,0]. This script by default removes all triggers at nullPos.
- Instructions:
- ExecVM from initServer.sqf or init.sqf in your mission directory.
- [] execVM "clean.sqf"; // If you put the file in mission directory
- [] execVM "scripts\clean.sqf"; // If you put the file in a folder, in this case called "scripts"
- _________________________________________________________________________*/
- sleep 15;
- private ["_isHidden","_checkPlayerCount","_checkFrequencyDefault","_checkFrequencyAccelerated","_playerThreshold","_deadMenLimit","_deadMenDistCheck","_deadMenDist","_deadVehiclesLimit","_deadVehicleDistCheck","_deadVehicleDist","_craterLimit","_craterDistCheck","_craterDist","_ruins","_ruinsLimit","_ruinsDistCheck","_ruinsDist","_weaponHolderLimit","_weaponHolderDistCheck","_weaponHolderDist","_minesLimit","_minesDistCheck","_minesDist","_staticsLimit","_staticsDistCheck","_staticsDist","_orphanedTriggers","_emptyGroups"];
- //==================== HIDDEN-FROM-PLAYERS FUNCTION
- _isHidden = compileFinal "
- private [""_c""];
- _c = FALSE;
- if (({(((_this select 0) distance _x) < (_this select 1))} count (_this select 2)) isEqualTo 0) then {
- _c = TRUE;
- };
- _c;
- ";
- //================================================================ CONFIG
- deleteManagerPublic = TRUE; // To terminate script via debug console
- _checkPlayerCount = TRUE; // dynamic sleep. Set TRUE to have sleep automatically adjust based on # of players.
- _checkFrequencyDefault = 180; // sleep default
- _checkFrequencyAccelerated = 60; // sleep accelerated
- _playerThreshold = 20; // How many players before accelerated cycle kicks in?
- _deadMenLimit = 50; // Bodies. Set -1 to disable.
- _deadMenDistCheck = TRUE; // TRUE to delete any bodies that are far from players.
- _deadMenDist = 2000; // Distance (meters) from players that bodies are not deleted if below max.
- _deadVehiclesLimit = 20; // Wrecks. Set -1 to disable.
- _deadVehicleDistCheck = TRUE; // TRUE to delete any destroyed vehicles that are far from players.
- _deadVehicleDist = 2000; // Distance (meters) from players that destroyed vehicles are not deleted if below max.
- _craterLimit = 20; // Craters. Set -1 to disable.
- _craterDistCheck = TRUE; // TRUE to delete any craters that are far from players.
- _craterDist = 2000; // Distance (meters) from players that craters are not deleted if below max.
- _weaponHolderLimit = 50; // Weapon Holders. Set -1 to disable.
- _weaponHolderDistCheck = TRUE; // TRUE to delete any weapon holders that are far from players.
- _weaponHolderDist = 500; // Distance (meters) from players that ground garbage is not deleted if below max.
- _minesLimit = -1; // Land mines. Set -1 to disable.
- _minesDistCheck = TRUE; // TRUE to delete any mines that are far from ANY UNIT (not just players).
- _minesDist = 3000; // Distance (meters) from players that land mines are not deleted if below max.
- _staticsLimit = -1; // Static weapons. Set -1 to disable.
- _staticsDistCheck = TRUE; // TRUE to delete any static weapon that is far from ANY UNIT (not just players.
- _staticsDist = 3000; // Distance (meters) from players that static weapons are not deleted if below max.
- _ruinsLimit = 20; // Ruins. Set -1 to disable.
- _ruinsDistCheck = TRUE; // TRUE to delete any ruins that are far from players.
- _ruinsDist = 3000; // Distance (meters) from players that ruins are not deleted if below max.
- _orphanedTriggers = TRUE; // Clean orphaned triggers in MP.
- _emptyGroups = TRUE; // Set FALSE to not delete empty groups.
- //================================================================ LOOP
- while {deleteManagerPublic} do {
- //================================= DEAD MEN
- if (!(_deadMenLimit isEqualTo -1)) then {
- if ((count allDeadMen) > _deadMenLimit) then {
- while {(((count allDeadMen) - _deadMenLimit) > 0)} do {
- detach (allDeadMen select 0);
- deleteVehicle (allDeadMen select 0);
- sleep 0.5;
- };
- } else {
- if (_deadMenDistCheck) then {
- {
- if ([_x,_deadMenDist,(playableUnits + switchableUnits)] call _isHidden) then {
- detach _x;
- deleteVehicle _x;
- };
- } count allDeadMen;
- };
- };
- };
- sleep 1;
- //================================= VEHICLES
- if (!(_deadVehiclesLimit isEqualTo -1)) then {
- if ((count (allDead - allDeadMen)) > _deadVehiclesLimit) then {
- while {(((count (allDead - allDeadMen)) - _deadVehiclesLimit) > 0)} do {
- deleteVehicle ((allDead - allDeadMen) select 0);
- sleep 0.5;
- };
- } else {
- if (_deadVehicleDistCheck) then {
- {
- if ([_x,_deadVehicleDist,(playableUnits + switchableUnits)] call _isHidden) then {
- deleteVehicle _x;
- };
- } count (allDead - allDeadMen);
- };
- };
- };
- sleep 1;
- //================================= CRATERS
- if (!(_craterLimit isEqualTo -1)) then {
- if ((count (allMissionObjects "CraterLong")) > _craterLimit) then {
- while {(((count (allMissionObjects "CraterLong")) - _craterLimit) > 0)} do {
- deleteVehicle ((allMissionObjects "CraterLong") select 0);
- sleep 0.5;
- };
- } else {
- if (_craterDistCheck) then {
- {
- if ([_x,_craterDist,(playableUnits + switchableUnits)] call _isHidden) then {
- deleteVehicle _x;
- };
- } count (allMissionObjects "CraterLong");
- };
- };
- };
- sleep 1;
- //================================= WEAPON HOLDERS
- if (!(_weaponHolderLimit isEqualTo -1)) then {
- if ((count (allMissionObjects "WeaponHolder")) > _weaponHolderLimit) then {
- while {(((count (allMissionObjects "WeaponHolder")) - _weaponHolderLimit) > 0)} do {
- deleteVehicle ((allMissionObjects "WeaponHolder") select 0);
- sleep 0.5;
- };
- } else {
- if (_weaponHolderDistCheck) then {
- {
- if ([_x,_weaponHolderDist,(playableUnits + switchableUnits)] call _isHidden) then {
- deleteVehicle _x;
- };
- } count (allMissionObjects "WeaponHolder");
- };
- };
- };
- sleep 1;
- //================================= MINES
- if (!(_minesLimit isEqualTo -1)) then {
- if ((count allMines) > _minesLimit) then {
- while {(((count allMines) - _minesLimit) > 0)} do {
- deleteVehicle (allMines select 0);
- sleep 0.5;
- };
- } else {
- if (_minesDistCheck) then {
- {
- if ([_x,_minesDist,allUnits] call _isHidden) then {
- deleteVehicle _x;
- };
- } count allMines;
- };
- };
- };
- sleep 1;
- //================================= STATIC WEAPONS
- if (!(_staticsLimit isEqualTo -1)) then {
- if ((count (allMissionObjects "StaticWeapon")) > _staticsLimit) then {
- while {(((count (allMissionObjects "StaticWeapon")) - _staticsLimit) > 0)} do {
- deleteVehicle ((allMissionObjects "StaticWeapon") select 0);
- sleep 0.5;
- };
- } else {
- if (_staticsDistCheck) then {
- {
- if ([_x,_staticsDist,allUnits] call _isHidden) then {
- deleteVehicle _x;
- };
- } count (allMissionObjects "StaticWeapon");
- };
- };
- };
- sleep 1;
- //================================= RUINS
- if (!(_ruinsLimit isEqualTo -1)) then {
- _ruins = [];
- {
- if ((_x distance [0,0,0]) > 100) then {
- 0 = _ruins pushBack _x;
- sleep 0.1;
- };
- } count (allMissionObjects "Ruins");
- if ((count _ruins) > _ruinsLimit) then {
- while {(((count _ruins) - _ruinsLimit) > 0)} do {
- _ruins resize (count _ruins - 1);
- deleteVehicle (_ruins select 0);
- sleep 0.5;
- };
- } else {
- if (_ruinsDistCheck) then {
- {
- if ([_x,_ruinsDist,(playableUnits + switchableUnits)] call _isHidden) then {
- deleteVehicle _x;
- };
- } count (allMissionObjects "Ruins");
- };
- };
- };
- sleep 1;
- //================================= ORPHANED MP TRIGGERS.
- if (_orphanedTriggers) then {
- {
- if ((_x distance [0,0,0]) < 1) then {
- deleteVehicle _x;
- };
- } count (allMissionObjects "EmptyDetector");
- };
- sleep 1;
- //================================= EMPTY GROUPS
- if (_emptyGroups) then {
- {
- if ((count units _x) isEqualTo 0) then {
- deleteGroup _x;
- };
- } count allGroups;
- };
- sleep 1;
- //================================= SLEEP
- if (_checkPlayerCount) then {
- if ((count (playableUnits + switchableUnits)) >= _playerThreshold) then {
- sleep _checkFrequencyAccelerated;
- } else {
- sleep _checkFrequencyDefault;
- };
- } else {
- sleep _checkFrequencyDefault;
- };
- };
|