Compare commits
24 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
a2c3a5ab1c
|
|||
|
a4a8303e08
|
|||
|
|
db7bdf1ecd | ||
|
|
0f8783ffa9 | ||
|
|
fac86f18f0 | ||
|
|
87b6f359c1 | ||
|
|
cbd8b5963e | ||
|
|
09ee014912 | ||
|
|
5b482b022f | ||
|
|
8afe420527 | ||
| ff98546907 | |||
| 5a1e6dd1a1 | |||
|
|
0524af05b9 | ||
|
|
023550743d | ||
|
|
ab28ed4e50 | ||
|
|
8794dc226d | ||
|
|
2bfaaacfc6 | ||
| 8a4f161df9 | |||
| cc5b8bbf45 | |||
|
eb4959a2ba
|
|||
|
643a7f212b
|
|||
|
|
32dda56f69 | ||
|
|
90f3caf1f9 | ||
|
|
e7af2f115e |
18
AJ_CBRN_V2/CfgFunctions.hpp
Normal file
18
AJ_CBRN_V2/CfgFunctions.hpp
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
class AJDJ
|
||||||
|
{
|
||||||
|
class CBRN
|
||||||
|
{
|
||||||
|
file = "AJ_CBRN_V2\functions";
|
||||||
|
class zenModules{ postInit = 1; };
|
||||||
|
class createArea{};
|
||||||
|
class chemicalParticleLoop{};
|
||||||
|
class chemicalDamage{};
|
||||||
|
class getProtectionLevel{};
|
||||||
|
class equipMask{};
|
||||||
|
class chemicalInitClient{};
|
||||||
|
class chemicalDetector{};
|
||||||
|
class unconAlarm{};
|
||||||
|
class chemicalAlarm{};
|
||||||
|
class deleteArea{};
|
||||||
|
};
|
||||||
|
};
|
||||||
13
AJ_CBRN_V2/CfgSounds.hpp
Normal file
13
AJ_CBRN_V2/CfgSounds.hpp
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
|
||||||
|
class chemical_alarm
|
||||||
|
{
|
||||||
|
name = "chemical_alarm";
|
||||||
|
sound[] = {"AJ_CBRN_V2\sounds\AJ_warning_2.ogg", 0.9, 1, 3}; //directory, volume, pitch, range
|
||||||
|
titles[]={};
|
||||||
|
};
|
||||||
|
class uncon_alarm
|
||||||
|
{
|
||||||
|
name = "uncon_alarm";
|
||||||
|
sound[] = {"AJ_CBRN_V2\sounds\AJ_warning_1.ogg", 0.9, 1, 5}; //directory, volume, pitch, range
|
||||||
|
titles[]={};
|
||||||
|
};
|
||||||
2
AJ_CBRN_V2/config.hpp
Normal file
2
AJ_CBRN_V2/config.hpp
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
#include "CfgFunctions.hpp"
|
||||||
|
#include "CfgSounds.hpp"
|
||||||
12
AJ_CBRN_V2/functions/fn_chemicalAlarm.sqf
Normal file
12
AJ_CBRN_V2/functions/fn_chemicalAlarm.sqf
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
//chemical detector audible warning of lethal levels of contamianation
|
||||||
|
//gets triggered when activating chemical trigger
|
||||||
|
//turns off when exiting the chemical trigger
|
||||||
|
|
||||||
|
while { true } do {
|
||||||
|
|
||||||
|
if ("ChemicalDetector_01_watch_F" in (assignedItems player)) then {
|
||||||
|
// play the sound
|
||||||
|
playSound "chemical_alarm";
|
||||||
|
};
|
||||||
|
sleep 5;
|
||||||
|
};
|
||||||
39
AJ_CBRN_V2/functions/fn_chemicalDamage.sqf
Normal file
39
AJ_CBRN_V2/functions/fn_chemicalDamage.sqf
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
if (!hasInterface) exitWith {};
|
||||||
|
waitUntil {
|
||||||
|
!isNull player
|
||||||
|
};
|
||||||
|
|
||||||
|
params ["_trg"];
|
||||||
|
|
||||||
|
// start the alarm audio script (includes checking for device)
|
||||||
|
private _alarmHandle = ([] spawn AJDJ_fnc_chemicalAlarm);
|
||||||
|
|
||||||
|
// main loop for doing hurty things when in chemical area
|
||||||
|
while { player inArea _trg } do {
|
||||||
|
// check for player protection level
|
||||||
|
private _protectionLevel = call AJDJ_fnc_getProtectionLevel;
|
||||||
|
|
||||||
|
//if the player does not have full protection
|
||||||
|
if !(_protectionLevel == 2) then {
|
||||||
|
//if the player does not have mask protection
|
||||||
|
if (_protectionLevel == 1) then {
|
||||||
|
|
||||||
|
sleep 5.0;
|
||||||
|
|
||||||
|
_limbSelection = selectRandom ["body", "head", "hand_r", "hand_l", "leg_r", "leg_l"];
|
||||||
|
[player, 0.2, _limbSelection, "vehiclecrash"] call ace_medical_fnc_addDamageToUnit;
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// deal the damage
|
||||||
|
_limbSelection = selectRandom ["body", "head", "hand_r", "hand_l", "leg_r", "leg_l"];
|
||||||
|
[player, 0.2, _limbSelection, "vehiclecrash"] call ace_medical_fnc_addDamageToUnit;
|
||||||
|
|
||||||
|
// deal it again for extra speedy killing
|
||||||
|
_limbSelection = selectRandom ["body", "head", "hand_r", "hand_l", "leg_r", "leg_l"];
|
||||||
|
[player, 0.2, _limbSelection, "vehiclecrash"] call ace_medical_fnc_addDamageToUnit;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
sleep 5;
|
||||||
|
};
|
||||||
|
|
||||||
|
terminate _alarmHandle;
|
||||||
80
AJ_CBRN_V2/functions/fn_chemicalDetector.sqf
Normal file
80
AJ_CBRN_V2/functions/fn_chemicalDetector.sqf
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
Chemical Detector script by Ajdj100
|
||||||
|
Version 1.0.0
|
||||||
|
|
||||||
|
Adds functionality to the chemical detector
|
||||||
|
|
||||||
|
call this script from initPlayerLocal.sqf (example on line 16).
|
||||||
|
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
0: Array of objects - the sources of contamination. (Required)
|
||||||
|
1: Number - the radius of contamination around the source object(s) in meters. (optional, defaults to 50m)
|
||||||
|
|
||||||
|
|
||||||
|
initPlayerLocal.sqf Example:
|
||||||
|
chemDetector = [[Chemical1], 250] execVM "chemicalDetector.sqf"; (Creates a contamination zone 250m around the location of the Chemical1 object)
|
||||||
|
*/
|
||||||
|
|
||||||
|
// if not a real gamer, exit
|
||||||
|
if (!hasInterface) exitWith {};
|
||||||
|
waitUntil {
|
||||||
|
!isNull player;
|
||||||
|
};
|
||||||
|
|
||||||
|
while { true } do {
|
||||||
|
// get all chemical areas
|
||||||
|
private _sources =+ (missionNamespace getVariable ["chemicalSources", []]);
|
||||||
|
|
||||||
|
// if there are chemical sources present, and the player has a chemical detector
|
||||||
|
if (!(_sources isEqualTo []) && ("ChemicalDetector_01_watch_F" in (assignedItems player))) then {
|
||||||
|
// sort based on distance to chemical source, including radius of chemical
|
||||||
|
private _sortedSources =+ [_sources, [], {
|
||||||
|
(_x distance player) - (_x getVariable "radius")
|
||||||
|
}] call BIS_fnc_sortBy;
|
||||||
|
|
||||||
|
// selects nearest source of chemical
|
||||||
|
private _source = (_sortedSources select 0);
|
||||||
|
|
||||||
|
// global threat variable (for use in audio functions)
|
||||||
|
private _threat = (10 - ((player distance _source) - (_source getVariable "radius")))/3 min 9.99 max 0 toFixed 2;
|
||||||
|
|
||||||
|
// do some stuff for the display
|
||||||
|
"ChemicalDetector" cutRsc ["RscWeaponChemicalDetector", "PLAIN", 1, false];
|
||||||
|
|
||||||
|
private _ui = uiNamespace getVariable "RscWeaponChemicalDetector";
|
||||||
|
if !(isNull _ui) then {
|
||||||
|
private _obj = _ui displayCtrl 101;
|
||||||
|
_obj ctrlAnimateModel ["Threat_Level_Source", parseNumber _threat, true];
|
||||||
|
};
|
||||||
|
|
||||||
|
// if the player is in a chemical zone
|
||||||
|
if ((parseNumber _threat) > 3) then {
|
||||||
|
// if the player is knocked out
|
||||||
|
if ((player getVariable "ACE_isUnconscious")) then {
|
||||||
|
//wait 20 seconds to detect uncon
|
||||||
|
sleep 20;
|
||||||
|
// loop until the player wakes up
|
||||||
|
// if !(player getVariable "ACE_isUnconscious") exitWith {
|
||||||
|
// systemChat "DEBUG unit woke up before alarm";
|
||||||
|
// };
|
||||||
|
waitUntil {
|
||||||
|
sleep 1;
|
||||||
|
[player] remoteExecCall ["AJDJ_fnc_unconAlarm", 0]; //THIS HAS A BUG, IT WONT TURN OFF AFTER ESCAPING THE GAS.
|
||||||
|
!(player getVariable "ACE_isUnconscious"); //THIS NEEDS TO BE SPAWNED AS A SEPERATE
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
} else { //default for if there are no chemical sources present
|
||||||
|
|
||||||
|
"ChemicalDetector" cutRsc ["RscWeaponChemicalDetector", "PLAIN", 1, false];
|
||||||
|
|
||||||
|
private _ui = uiNamespace getVariable "RscWeaponChemicalDetector";
|
||||||
|
if !(isNull _ui) then {
|
||||||
|
private _obj = _ui displayCtrl 101;
|
||||||
|
_obj ctrlAnimateModel ["Threat_Level_Source", 0.00, true];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
sleep 0.5;
|
||||||
|
};
|
||||||
17
AJ_CBRN_V2/functions/fn_chemicalInitClient.sqf
Normal file
17
AJ_CBRN_V2/functions/fn_chemicalInitClient.sqf
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/*
|
||||||
|
CBRN Script client side initialization Ajdj100
|
||||||
|
Version 0.1.0
|
||||||
|
|
||||||
|
Adds functionality to a few things for the client
|
||||||
|
Call this script from initPlayerLocal.sqf (example on line 10).
|
||||||
|
|
||||||
|
initPlayerLocal.sqf Example:
|
||||||
|
|
||||||
|
call AJDJ_fnc_chemicalInitClient;
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
aceMask = ["EquipMask","Put on Gas Mask","",{call AJDJ_fnc_equipMask},{true}] call ace_interact_menu_fnc_createAction;
|
||||||
|
[player, 1, ["ACE_SelfActions", "ACE_Equipment"], aceMask] call ace_interact_menu_fnc_addActionToObject;
|
||||||
|
|
||||||
|
call AJDJ_fnc_chemicalDetector;
|
||||||
58
AJ_CBRN_V2/functions/fn_chemicalParticleLoop.sqf
Normal file
58
AJ_CBRN_V2/functions/fn_chemicalParticleLoop.sqf
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
spawns the visible component of the chemical area
|
||||||
|
|
||||||
|
returns the particle source for use in deletion
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!hasInterface) exitWith {};
|
||||||
|
|
||||||
|
params ["_location", "_radius"];
|
||||||
|
|
||||||
|
_location set [2, 0];
|
||||||
|
|
||||||
|
private _pSource = ("#particlesource" createVehicleLocal _location);
|
||||||
|
_pSource setParticleParams
|
||||||
|
[
|
||||||
|
["\A3\data_f\ParticleEffects\Universal\Universal", 16, 12, 0, 8],
|
||||||
|
"", "Billboard", 1, 10, // animationName, type, timerPeriod, lifeTime
|
||||||
|
[0,0,-1000], // position relative to referenceObject
|
||||||
|
[0, 0, 0], // velocity
|
||||||
|
0, 0.005, 0.003925, 0.1, [5, 5], // rotation, weight, volume, rubbing, size
|
||||||
|
[[0.6, 0.6, 0.2, 0], [0.6, 0.6, 0.2, 0.7], [0.6, 0.6, 0.2, 0]], // colors
|
||||||
|
[1], // animationPhase
|
||||||
|
0, 0, // randomDirectionPeriod, randomDirectionIntensity
|
||||||
|
"", "", // onTimer, beforeDestroy
|
||||||
|
_pSource, // referenceObject
|
||||||
|
0, false, // angle, bounces
|
||||||
|
-1, [], // bounceOnSurface, emissiveColor
|
||||||
|
[0, 1, 0]// vectorDir - CANNOT be [0, 0, 0]
|
||||||
|
];
|
||||||
|
|
||||||
|
_pSource setDropInterval (0.5/_radius);
|
||||||
|
_pSource setParticleCircle [(_radius/2), [0,1,0]];
|
||||||
|
/*
|
||||||
|
lifeTime,
|
||||||
|
position,
|
||||||
|
moveVelocity,
|
||||||
|
rotationVelocity,
|
||||||
|
size,
|
||||||
|
color,
|
||||||
|
directionPeriod,
|
||||||
|
directionIntensity,
|
||||||
|
angle,
|
||||||
|
bounceOnSurface
|
||||||
|
*/
|
||||||
|
_pSource setParticleRandom
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
[(_radius/2), (_radius/2), 1],
|
||||||
|
[0, 0, 0.5],
|
||||||
|
4,
|
||||||
|
1,
|
||||||
|
[0, 0, 0, 0],
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
];
|
||||||
|
|
||||||
|
//return the particle source
|
||||||
|
_pSource;
|
||||||
44
AJ_CBRN_V2/functions/fn_createArea.sqf
Normal file
44
AJ_CBRN_V2/functions/fn_createArea.sqf
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
creates a new contamination area
|
||||||
|
|
||||||
|
Params:
|
||||||
|
0: Position array OR Object - The source of the contamination
|
||||||
|
1: Radius - the radius of contamination around the object
|
||||||
|
|
||||||
|
Location can be either a position array [x,y,z] or an object
|
||||||
|
[location, radius] call AJDJ_fnc_createArea;
|
||||||
|
*/
|
||||||
|
|
||||||
|
params ["_location", "_radius"];
|
||||||
|
|
||||||
|
//init temp for emitter object
|
||||||
|
private _emitterObject = _location;
|
||||||
|
|
||||||
|
if ("OBJECT" isEqualTo typeName _location) then {
|
||||||
|
_location = getPos _location;
|
||||||
|
} else {
|
||||||
|
_emitterObject = ("Land_GarbageBarrel_02_F" createVehicle _location);
|
||||||
|
};
|
||||||
|
|
||||||
|
//create trigger to control area
|
||||||
|
private _trg = createTrigger ["EmptyDetector", _location, false];
|
||||||
|
_trg setTriggerArea [_radius, _radius, 0, false, (_radius/2)];
|
||||||
|
_trg setTriggerActivation ["ANYPLAYER", "PRESENT", true];
|
||||||
|
_trg setTriggerStatements ["this", "[thisTrigger] spawn AJDJ_fnc_chemicalDamage", ""];
|
||||||
|
|
||||||
|
//start loop for particle effects
|
||||||
|
private _pSource = [_location, _radius, _emitterObject] call AJDJ_fnc_chemicalParticleLoop;
|
||||||
|
|
||||||
|
|
||||||
|
//bind variables
|
||||||
|
_trg setVariable ["pSource", _pSource]; //particle source
|
||||||
|
_trg setVariable ["radius", _radius]; //area of effect (for chemical detector use);
|
||||||
|
|
||||||
|
systemChat str _emitterObject;
|
||||||
|
//store trigger in barrel for deletion
|
||||||
|
_emitterObject setVariable ["trigger", _trg];
|
||||||
|
|
||||||
|
|
||||||
|
private _sources =+ (missionNamespace getVariable ["chemicalSources", []]);
|
||||||
|
_sources pushBack _trg;
|
||||||
|
missionNamespace setVariable ["chemicalSources", _sources];
|
||||||
18
AJ_CBRN_V2/functions/fn_deleteArea.sqf
Normal file
18
AJ_CBRN_V2/functions/fn_deleteArea.sqf
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
params["_target"];
|
||||||
|
|
||||||
|
if (_target isEqualTo objNull) exitWith {};
|
||||||
|
|
||||||
|
private _trg = (_target getVariable "trigger");
|
||||||
|
|
||||||
|
private _sources =+ (missionNamespace getVariable ["chemicalSources", []]);
|
||||||
|
_sources deleteAt (_sources find _trg);
|
||||||
|
missionNamespace setVariable ["chemicalSources", _sources];
|
||||||
|
|
||||||
|
// delete the particle emitter
|
||||||
|
deleteVehicle (_trg getVariable "pSource");
|
||||||
|
|
||||||
|
// set the trigger area to 0 (removes the area of effect)
|
||||||
|
// _trg setTriggerArea [0, 0, 0, false, 0];
|
||||||
|
|
||||||
|
deleteVehicle _trg;
|
||||||
|
deleteVehicle _target;
|
||||||
43
AJ_CBRN_V2/functions/fn_equipMask.sqf
Normal file
43
AJ_CBRN_V2/functions/fn_equipMask.sqf
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
Gasmask equipping script by Ajdj100
|
||||||
|
Version 0.1.0
|
||||||
|
|
||||||
|
Script to allow players to equip gasmasks via ACE self interact if they are holding one in their inventory.
|
||||||
|
|
||||||
|
PASTE THE FOLLOWING INTO initPlayerLocal.sqf TO INITIALIZE:
|
||||||
|
|
||||||
|
aceMask = ["EquipMask","Put on Gas Mask","",{execVM "scripts\aceGasmask.sqf"},{true}] call ace_interact_menu_fnc_createAction;
|
||||||
|
[player, 1, ["ACE_SelfActions", "ACE_Equipment"], aceMask] call ace_interact_menu_fnc_addActionToObject;
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
//if not a player, exit
|
||||||
|
if (!hasInterface) exitwith {};
|
||||||
|
|
||||||
|
// init lists of masks
|
||||||
|
private _allowedGoggles = [
|
||||||
|
"G_AirPurifyingRespirator_01_F",
|
||||||
|
"G_AirPurifyingRespirator_02_black_F",
|
||||||
|
"G_AirPurifyingRespirator_02_olive_F",
|
||||||
|
"G_AirPurifyingRespirator_02_sand_F"
|
||||||
|
];
|
||||||
|
|
||||||
|
private _items = items player;
|
||||||
|
|
||||||
|
private _availableGoggles = (_items arrayIntersect _allowedGoggles);
|
||||||
|
|
||||||
|
//if the player has a gasmask in their inventory
|
||||||
|
if !(_availableGoggles isEqualTo []) then {
|
||||||
|
|
||||||
|
//temporarily stores faceware
|
||||||
|
private _tempGoggles = goggles player;
|
||||||
|
|
||||||
|
//Swaps mask with current facewear
|
||||||
|
player addGoggles (_availableGoggles select 0);
|
||||||
|
player removeItem (_availableGoggles select 0);
|
||||||
|
player addItem _tempGoggles;
|
||||||
|
|
||||||
|
hint "Added mask"; //debug message
|
||||||
|
} else {
|
||||||
|
hint "No mask in inventory"
|
||||||
|
};
|
||||||
51
AJ_CBRN_V2/functions/fn_getProtectionLevel.sqf
Normal file
51
AJ_CBRN_V2/functions/fn_getProtectionLevel.sqf
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
returns protection level of local player
|
||||||
|
*/
|
||||||
|
|
||||||
|
// init lists of protective equiptment
|
||||||
|
private _allowedGoggles = [
|
||||||
|
"G_AirPurifyingRespirator_01_F",
|
||||||
|
"G_AirPurifyingRespirator_02_black_F",
|
||||||
|
"G_AirPurifyingRespirator_02_olive_F",
|
||||||
|
"G_AirPurifyingRespirator_02_sand_F",
|
||||||
|
"G_RegulatorMask_F"
|
||||||
|
];
|
||||||
|
private _allowedUniforms = [
|
||||||
|
"U_B_CBRN_Suit_01_MTP_F",
|
||||||
|
"U_B_CBRN_Suit_01_Tropic_F",
|
||||||
|
"U_B_CBRN_Suit_01_Blue_F",
|
||||||
|
"U_B_CBRN_Suit_01_White_F",
|
||||||
|
"U_B_CBRN_Suit_01_Wdl_F",
|
||||||
|
"U_I_CBRN_Suit_01_AAF_F",
|
||||||
|
"U_I_E_CBRN_Suit_01_EAF_F"
|
||||||
|
];
|
||||||
|
private _allowedVehicles = [
|
||||||
|
"rhsusf_m1a2sep1wd_usarmy",
|
||||||
|
"rhsusf_m1a2sep1tuskiwd_usarmy",
|
||||||
|
"rhsusf_m1a2sep1tuskiiwd_usarmy",
|
||||||
|
"rhsusf_m1a2sep2wd_usarmy",
|
||||||
|
"RHS_M2A3_BUSKIII_wd",
|
||||||
|
"B_APC_Wheeled_01_cannon_F"
|
||||||
|
];
|
||||||
|
|
||||||
|
//init protection level variable
|
||||||
|
private _protectionLevel = 0;
|
||||||
|
|
||||||
|
// if they are wearing a mask
|
||||||
|
if (goggles player in _allowedGoggles) then {
|
||||||
|
// if they are wearing the suit
|
||||||
|
if (uniform player in _allowedUniforms) then {
|
||||||
|
_protectionLevel = 2;
|
||||||
|
} else {
|
||||||
|
_protectionLevel = 1;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// if the player is in a protected vehicle
|
||||||
|
if (typeOf objectParent player in _allowedVehicles) then {
|
||||||
|
_protectionLevel = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
//return
|
||||||
|
_protectionLevel;
|
||||||
8
AJ_CBRN_V2/functions/fn_unconAlarm.sqf
Normal file
8
AJ_CBRN_V2/functions/fn_unconAlarm.sqf
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
/*
|
||||||
|
Script to handle the audio alert for going unconsious in gas
|
||||||
|
By Ajdj100
|
||||||
|
|
||||||
|
version 0.1.0
|
||||||
|
*/
|
||||||
|
params ["_unit"];
|
||||||
|
_unit say3D "uncon_alarm";
|
||||||
27
AJ_CBRN_V2/functions/fn_zenModules.sqf
Normal file
27
AJ_CBRN_V2/functions/fn_zenModules.sqf
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
["CBRN", "Create Chemical Area",
|
||||||
|
{
|
||||||
|
params ["_position", "_attachedObj"];
|
||||||
|
|
||||||
|
["Chemical Area Option",
|
||||||
|
[[ "SLIDER:RADIUS", "Radius", [0, 500, 50, 0, _position, [1,0,0,1]]]],
|
||||||
|
{
|
||||||
|
params ["_dialog", "_args"];
|
||||||
|
_args params ["_position"];
|
||||||
|
_dialog params ["_radius"];
|
||||||
|
|
||||||
|
[_position, _radius] remoteExec ["AJDJ_fnc_createArea", 0, true];
|
||||||
|
},
|
||||||
|
{},
|
||||||
|
[_position, _attachedObj]
|
||||||
|
] call zen_dialog_fnc_create;
|
||||||
|
}
|
||||||
|
] call zen_custom_modules_fnc_register;
|
||||||
|
|
||||||
|
|
||||||
|
["CBRN", "Delete Chemical Area",
|
||||||
|
{
|
||||||
|
params ["_position", "_attachedObj"];
|
||||||
|
|
||||||
|
[_attachedObj] remoteExec ["AJDJ_fnc_deleteArea", 0, true];
|
||||||
|
}
|
||||||
|
] call zen_custom_modules_fnc_register;
|
||||||
43
AJ_CBRN_V2/readme.md
Normal file
43
AJ_CBRN_V2/readme.md
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
### How to add to mission:
|
||||||
|
|
||||||
|
Drag the AJ_CBRN_V2 folder into your mission folder and add the following line into class CfgFunctions in description.ext:
|
||||||
|
|
||||||
|
#include "AJ_CBRN_V2\CfgFunctions.hpp"
|
||||||
|
|
||||||
|
Add the following line into CfgSounds in description.ext:
|
||||||
|
|
||||||
|
#include "AJ_CBRN_V2\CfgSounds.hpp"
|
||||||
|
|
||||||
|
lastly, add the following line to initPlayerLocal.sqf:
|
||||||
|
|
||||||
|
call AJDJ_fnc_chemicalInitClient;
|
||||||
|
|
||||||
|
|
||||||
|
### How to use:
|
||||||
|
|
||||||
|
to create and delete a chemical area in zeus, use the modules under the CBRN tab.
|
||||||
|
|
||||||
|
to create a chemical area in editor or through script, use the following line:
|
||||||
|
|
||||||
|
[location, radius] call AJDJ_fnc_createArea;
|
||||||
|
|
||||||
|
location can be either an object, or an array of coordinates. Examples below:
|
||||||
|
|
||||||
|
[myObject, 40] call AJDJ_fnc_createArea;
|
||||||
|
|
||||||
|
[[6113.79,8642.26,0], 10] call AJDJ_fnc_createArea;
|
||||||
|
|
||||||
|
to delete an area through script, use the following line:
|
||||||
|
|
||||||
|
[object] call ["AJDJ_fnc_deleteArea", 0, true];
|
||||||
|
|
||||||
|
|
||||||
|
[IMPORTANT] note that these must be executed globally to function correctly. When using the init field of an object, it will automatically run globally
|
||||||
|
If you are working in an sqf, you will have to use remoteExec
|
||||||
|
|
||||||
|
|
||||||
|
currently all the CBRN equiptment from the contact DLC is supported. It is possible to add your own gear to this, but it involves editing a number of
|
||||||
|
arrays across a number of sqf's. In future I will make it easier to customize what gear provides protection.
|
||||||
|
|
||||||
|
|
||||||
|
Please reach out to me if you have any issues or suggestions at @ajdj100 on discord.
|
||||||
BIN
AJ_CBRN_V2/sounds/AJ_Warning_1.ogg
Normal file
BIN
AJ_CBRN_V2/sounds/AJ_Warning_1.ogg
Normal file
Binary file not shown.
BIN
AJ_CBRN_V2/sounds/AJ_Warning_2.ogg
Normal file
BIN
AJ_CBRN_V2/sounds/AJ_Warning_2.ogg
Normal file
Binary file not shown.
24
CHANGELOG.md
24
CHANGELOG.md
@@ -4,6 +4,30 @@ All notable changes to this project will be documented in this file.
|
|||||||
|
|
||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project badly attempts [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project badly attempts [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [4.1.2] - 2024-04-25
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Fix internal versioning
|
||||||
|
- Swap resupply box 5.56 magazines due to mod conflict
|
||||||
|
- Group deletion handler now properly processes empty groups and logs errors
|
||||||
|
|
||||||
|
## [4.1.1] - 2024-04-19
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Function to remove lightning bolt from zeus
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Alpha Callsign
|
||||||
|
- Allowed Equipment Definitions
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Custom tire patch code
|
||||||
|
- Extraneous server performance calculation broadcast to all clients
|
||||||
|
|
||||||
## [4.1.0] - 2024-03-01
|
## [4.1.0] - 2024-03-01
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
#define COMMAND_CALLSIGN SPARTAN
|
#define COMMAND_CALLSIGN SPARTAN
|
||||||
#define RRC_CALLSIGN TIGER
|
#define RRC_CALLSIGN TIGER
|
||||||
#define MEDIC_CALLSIGN LIFELINE
|
#define MEDIC_CALLSIGN LIFELINE
|
||||||
#define ALPHA_CALLSIGN BLACKJACK
|
#define ALPHA_CALLSIGN ROGUE
|
||||||
#define ECHO_CALLSIGN FIREBRAND
|
#define ECHO_CALLSIGN FIREBRAND
|
||||||
#define WPN_CALLSIGN BLACKFOOT
|
#define WPN_CALLSIGN BLACKFOOT
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class DisallowedEquipment {
|
|||||||
items[] = {
|
items[] = {
|
||||||
"17BN_ANPVS14", // NVG AN/PVS-14
|
"17BN_ANPVS14", // NVG AN/PVS-14
|
||||||
"ej_PVS15D", // NVG AN/PVS-15
|
"ej_PVS15D", // NVG AN/PVS-15
|
||||||
"ej_VPS15", // NVG AN/PVS-15
|
"ej_PVS15", // NVG AN/PVS-15
|
||||||
"LMG_Mk200_black_F", //Mk200 Series
|
"LMG_Mk200_black_F", //Mk200 Series
|
||||||
"LMG_Mk200_F", //Mk200 Series
|
"LMG_Mk200_F", //Mk200 Series
|
||||||
"rhs_weap_g36c", // G36 Series
|
"rhs_weap_g36c", // G36 Series
|
||||||
@@ -34,11 +34,6 @@ class DisallowedEquipment {
|
|||||||
"rhs_weap_m14_wd", // M14 Series
|
"rhs_weap_m14_wd", // M14 Series
|
||||||
"rhs_weap_m14_weap_m14ebrri", // M14 Series
|
"rhs_weap_m14_weap_m14ebrri", // M14 Series
|
||||||
"rhs_weap_m14", // M14 Series
|
"rhs_weap_m14", // M14 Series
|
||||||
"rhs_weap_m16a4_carryhandle_M203", // M16 Series
|
|
||||||
"rhs_weap_m16a4_carryhandle", // M16 Series
|
|
||||||
"rhs_weap_m16a4_imod_M203", // M16 Series
|
|
||||||
"rhs_weap_m16a4_imod", // M16 Series
|
|
||||||
"rhs_weap_m16a4", // M16 Series
|
|
||||||
"rhs_weap_m27iar_grip", // M27 Series
|
"rhs_weap_m27iar_grip", // M27 Series
|
||||||
"rhs_weap_m27iar", // M27 Series
|
"rhs_weap_m27iar", // M27 Series
|
||||||
"rhsusf_ANPVS_14", // NVG AN/PVS-14
|
"rhsusf_ANPVS_14", // NVG AN/PVS-14
|
||||||
@@ -100,12 +95,6 @@ class DisallowedEquipment {
|
|||||||
"UK3CB_M14DMR_Railed_BLK", // M14 Series
|
"UK3CB_M14DMR_Railed_BLK", // M14 Series
|
||||||
"UK3CB_M14DMR_Railed", // M14 Series
|
"UK3CB_M14DMR_Railed", // M14 Series
|
||||||
"UK3CB_M14DMR", // M14 Series
|
"UK3CB_M14DMR", // M14 Series
|
||||||
"UK3CB_M16_Carbine", // M16 Series
|
|
||||||
"UK3CB_M16A1_LSW", // M16 Series
|
|
||||||
"UK3CB_M16A1", // M16 Series
|
|
||||||
"UK3CB_M16A2_UGL", // M16 Series
|
|
||||||
"UK3CB_M16A2", // M16 Series
|
|
||||||
"UK3CB_M16A3", // M16 Series
|
|
||||||
"USP_PVS_14", // NVG AN/PVS-14
|
"USP_PVS_14", // NVG AN/PVS-14
|
||||||
"USP_PVS_15" // NVG AN/PVS-15
|
"USP_PVS_15" // NVG AN/PVS-15
|
||||||
};
|
};
|
||||||
@@ -132,10 +121,9 @@ class DisallowedEquipment {
|
|||||||
"optic_lrps_tna_F", //Nightforce Series Optic
|
"optic_lrps_tna_F", //Nightforce Series Optic
|
||||||
"optic_lrps", //Nightforce Series Optic
|
"optic_lrps", //Nightforce Series Optic
|
||||||
"optic_Nightstalker", // Thermal Optic
|
"optic_Nightstalker", // Thermal Optic
|
||||||
"optic_tws_mg", // Thermal Optic
|
|
||||||
"optic_tws", // Thermal Optic
|
|
||||||
"rhsusf_acc_anpas13gv1", // Thermal Optic
|
"rhsusf_acc_anpas13gv1", // Thermal Optic
|
||||||
"rhsusf_acc_anpvs27", // Thermal Optic
|
"rhsusf_acc_anpvs27", // Thermal Optic
|
||||||
|
"optic_tws_mg", // Thermal Optic
|
||||||
"Tier1_ANPVS10_Tan", // Thermal Optic
|
"Tier1_ANPVS10_Tan", // Thermal Optic
|
||||||
"Tier1_ATACR18_ADM_Black_Vanilla", //Nightforce Series Optic
|
"Tier1_ATACR18_ADM_Black_Vanilla", //Nightforce Series Optic
|
||||||
"Tier1_ATACR18_ADM_Black", //Nightforce Series Optic
|
"Tier1_ATACR18_ADM_Black", //Nightforce Series Optic
|
||||||
@@ -160,6 +148,7 @@ class DisallowedEquipment {
|
|||||||
label = "TABBED WEAPON";
|
label = "TABBED WEAPON";
|
||||||
description = "Items that are allowed for individuals with Ranger Tab.";
|
description = "Items that are allowed for individuals with Ranger Tab.";
|
||||||
items[] = {
|
items[] = {
|
||||||
|
"optic_tws", // Thermal Optic
|
||||||
"arifle_MX_black_F", // MX Series
|
"arifle_MX_black_F", // MX Series
|
||||||
"arifle_MX_F", // MX Series
|
"arifle_MX_F", // MX Series
|
||||||
"arifle_MX_GL_black_F", // MX 3GL Series
|
"arifle_MX_GL_black_F", // MX 3GL Series
|
||||||
@@ -208,7 +197,90 @@ class DisallowedEquipment {
|
|||||||
"Tier1_SR25_ec_tan", // SR-25 Series
|
"Tier1_SR25_ec_tan", // SR-25 Series
|
||||||
"Tier1_SR25_ec", // SR-25 Series
|
"Tier1_SR25_ec", // SR-25 Series
|
||||||
"Tier1_SR25_tan", // SR-25 Series
|
"Tier1_SR25_tan", // SR-25 Series
|
||||||
"Tier1_SR25" // SR-25 Series
|
"Tier1_SR25", // SR-25 Series
|
||||||
|
"rhsusf_weap_MP7A2", //MP7 Series
|
||||||
|
"rhsusf_weap_MP7A2_aor1", //MP7 Series
|
||||||
|
"rhsusf_weap_MP7A2_desert", //MP7 Series
|
||||||
|
"rhsusf_weap_MP7A2_folded", //MP7 Series
|
||||||
|
"rhsusf_weap_MP7A2_folded_aor1", //MP7 Series
|
||||||
|
"rhsusf_weap_MP7A2_folded_winter", //MP7 Series
|
||||||
|
"rhsusf_weap_MP7A2_folded_desert", //MP7 Series
|
||||||
|
"rhsusf_weap_MP7A2_winter", //MP7 Series
|
||||||
|
"UK3CB_MP510", //MP5 Series
|
||||||
|
"UK3CB_MP5A2", //MP5 Series
|
||||||
|
"UK3CB_MP5A3", //MP5 Series
|
||||||
|
"UK3CB_MP5A4", //MP5 Series
|
||||||
|
"UK3CB_MP5K", //MP5 Series
|
||||||
|
"UK3CB_MP5K_PDW", //MP5 Series
|
||||||
|
"UK3CB_MP5N", //MP5 Series
|
||||||
|
"UK3CB_MP5N_UGL", //MP5 Series
|
||||||
|
"UK3CB_MP5SD5", //MP5 Series
|
||||||
|
"UK3CB_MP5SD6", //MP5 Series
|
||||||
|
"SMG_03C_black", //P90 Series
|
||||||
|
"SMG_03C_camo", //P90 Series
|
||||||
|
"SMG_03C_hex", //P90 Series
|
||||||
|
"SMG_03C_khaki", //P90 Series
|
||||||
|
"SMG_03C_TR_black", //P90 Series
|
||||||
|
"SMG_03C_TR_camo", //P90 Series
|
||||||
|
"SMG_03C_TR_hex", //P90 Series
|
||||||
|
"SMG_03C_TR_khaki", //P90 Series
|
||||||
|
"UK3CB_P90C_black", //P90 Series
|
||||||
|
"UK3CB_P90C_camo", //P90 Series
|
||||||
|
"UK3CB_P90C_hex", //P90 Series
|
||||||
|
"UK3CB_P90C_khaki", //P90 Series
|
||||||
|
"UK3CB_P90C_TR_black", //P90 Series
|
||||||
|
"UK3CB_P90C_TR_camo", //P90 Series
|
||||||
|
"UK3CB_P90C_TR_hex", //P90 Series
|
||||||
|
"UK3CB_P90C_TR_khaki", //P90 Series
|
||||||
|
"UK3CB_P90_black", //P90 Series
|
||||||
|
"UK3CB_P90_camo", //P90 Series
|
||||||
|
"UK3CB_P90_hex", //P90 Series
|
||||||
|
"UK3CB_P90_khaki", //P90 Series
|
||||||
|
"UK3CB_P90_TR_black", //P90 Series
|
||||||
|
"UK3CB_P90_TR_camo", //P90 Series
|
||||||
|
"UK3CB_P90_TR_hex", //P90 Series
|
||||||
|
"UK3CB_P90_TR_khaki", //P90 Series
|
||||||
|
"UK3CB_M16_Carbine", //M16 Series
|
||||||
|
"UK3CB_M16_Carbine_eotech_552", //M16 Series
|
||||||
|
"UK3CB_M16_Carbine_sup", //M16 Series
|
||||||
|
"UK3CB_M16A1", //M16 Series
|
||||||
|
"UK3CB_M16A1_LSW", //M16 Series
|
||||||
|
"UK3CB_M16A2", //M16 Series
|
||||||
|
"UK3CB_M16A2_sup", //M16 Series
|
||||||
|
"UK3CB_M16A2_UGL", //M16 Series
|
||||||
|
"UK3CB_M16A2_UGL_eotech_552", //M16 Series
|
||||||
|
"UK3CB_M16A2_UGL_sup", //M16 Series
|
||||||
|
"UK3CB_M16A3", //M16 Series
|
||||||
|
"UK3CB_M16A3_eotech_552", //M16 Series
|
||||||
|
"UK3CB_M16A3_eotech_552_sup", //M16 Series
|
||||||
|
"UK3CB_M16A3_sup", //M16 Series
|
||||||
|
"UK3CB_M16A3_UGL", //M16 Series
|
||||||
|
"rhs_weap_m16a4", //M16 Series
|
||||||
|
"rhs_weap_m16a4_grip", //M16 Series
|
||||||
|
"rhs_weap_m16a4_grip_acog", //M16 Series
|
||||||
|
"rhs_weap_m16a4_grip2", //M16 Series
|
||||||
|
"rhs_weap_m16a4_grip3", //M16 Series
|
||||||
|
"rhs_weap_m16a4_bipod", //M16 Series
|
||||||
|
"rhs_weap_m16a4_acog_usmc", //M16 Series
|
||||||
|
"rhs_weap_m16a4_carryhandle", //M16 Series
|
||||||
|
"rhs_weap_m16a4_carryhandle_bipod", //M16 Series
|
||||||
|
"rhs_weap_m16a4_carryhandle_grip", //M16 Series
|
||||||
|
"rhs_weap_m16a4_carryhandle_M203", //M16 Series
|
||||||
|
"rhs_weap_m16a4_carryhandle_M203_grip", //M16 Series
|
||||||
|
"rhs_weap_m16a4_m203_acog_usmc", //M16 Series
|
||||||
|
"uk3cb_weap_m16a4_m203s_eotech_552_anpeq15_sup", //M16 Series
|
||||||
|
"rhs_weap_m16a4_imod", //M16 Series
|
||||||
|
"rhs_weap_m16a4_imod_grip", //M16 Series
|
||||||
|
"rhs_weap_m16a4_imod_grip2", //M16 Series
|
||||||
|
"rhs_weap_m16a4_imod_grip3", //M16 Series
|
||||||
|
"rhs_weap_m16a4_imod_M203", //M16 Series
|
||||||
|
"rhs_weap_m16a4_imod_M203_grip", //M16 Series
|
||||||
|
"rhs_weap_m16a4_carryhandle_grip2", //M16 Series
|
||||||
|
"rhs_weap_m16a4_carryhandle_grip3", //M16 Series
|
||||||
|
"rhs_weap_m16a4_grip_acog_usmc", //M16 Series
|
||||||
|
"rhs_weap_m16a4_grip_acog2_usmc", //M16 Series
|
||||||
|
"rhs_weap_m32", //M32/MGL Series
|
||||||
|
"rhs_weap_m32_usmc" //M32/MGL Series
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ class SupplyCrates {
|
|||||||
{"1Rnd_SmokeRed_Grenade_shell",24},
|
{"1Rnd_SmokeRed_Grenade_shell",24},
|
||||||
{"1Rnd_SmokeGreen_Grenade_shell",24},
|
{"1Rnd_SmokeGreen_Grenade_shell",24},
|
||||||
{"1Rnd_SmokeYellow_Grenade_shell",12},
|
{"1Rnd_SmokeYellow_Grenade_shell",12},
|
||||||
{"Tier1_30Rnd_556x45_M856A1_EMag",25},
|
{"rhs_mag_30Rnd_556x45_M855A1_Stanag",25},
|
||||||
{"ACE_30Rnd_556x45_Stanag_M995_AP_mag",75},
|
{"ACE_30Rnd_556x45_Stanag_M995_AP_mag",75},
|
||||||
{"SMA_30Rnd_762x35_BLK_EPR",25},
|
{"SMA_30Rnd_762x35_BLK_EPR",25},
|
||||||
{"SMA_20Rnd_762x51mm_M80A1_EPR",25},
|
{"SMA_20Rnd_762x51mm_M80A1_EPR",25},
|
||||||
@@ -57,7 +57,7 @@ class SupplyCrates {
|
|||||||
{"MRAWS_HEAT_F",35},
|
{"MRAWS_HEAT_F",35},
|
||||||
{"MRAWS_HE_F",15},
|
{"MRAWS_HE_F",15},
|
||||||
{"Tier1_250Rnd_762x51_Belt_M993_AP",50},
|
{"Tier1_250Rnd_762x51_Belt_M993_AP",50},
|
||||||
{"Tier1_30Rnd_556x45_M856A1_EMag",25},
|
{"rhs_mag_30Rnd_556x45_M855A1_Stanag",25},
|
||||||
{"ACE_30Rnd_556x45_Stanag_M995_AP_mag",50},
|
{"ACE_30Rnd_556x45_Stanag_M995_AP_mag",50},
|
||||||
{"Titan_AA",10},
|
{"Titan_AA",10},
|
||||||
{"Titan_AT",10},
|
{"Titan_AT",10},
|
||||||
|
|||||||
@@ -94,6 +94,11 @@ class Params {};
|
|||||||
class CfgFunctions {
|
class CfgFunctions {
|
||||||
#include "framework\CfgFunctions.hpp"
|
#include "framework\CfgFunctions.hpp"
|
||||||
#include "custom_scripts.hpp"
|
#include "custom_scripts.hpp"
|
||||||
|
#include "AJ_CBRN_V2\CfgFunctions.hpp"
|
||||||
|
};
|
||||||
|
|
||||||
|
class CfgSounds {
|
||||||
|
#include "AJ_CBRN_V2\CfgSounds.hpp"
|
||||||
};
|
};
|
||||||
|
|
||||||
class CfgLeaflets {
|
class CfgLeaflets {
|
||||||
|
|||||||
@@ -120,6 +120,7 @@ class DOUBLES(PREFIX,performance) {
|
|||||||
class addServerStatsPFH {};
|
class addServerStatsPFH {};
|
||||||
class calculateServerStats {};
|
class calculateServerStats {};
|
||||||
class addEmptyGroupCleanupPFH {};
|
class addEmptyGroupCleanupPFH {};
|
||||||
|
class addDeadUnitCleanupPFH {};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -29,39 +29,6 @@ _unflip =
|
|||||||
["LandVehicle", 0, ["ACE_MainActions"], _unflip, true] call ace_interact_menu_fnc_addActionToClass;
|
["LandVehicle", 0, ["ACE_MainActions"], _unflip, true] call ace_interact_menu_fnc_addActionToClass;
|
||||||
|
|
||||||
|
|
||||||
_patchTire =
|
|
||||||
[
|
|
||||||
"patchTire",
|
|
||||||
"Patch Tire",
|
|
||||||
"\a3\ui_f\data\IGUI\Cfg\Actions\repair_ca.paa",
|
|
||||||
{
|
|
||||||
[_player, "AinvPknlMstpSnonWnonDr_medic5", 0] call ace_common_fnc_doAnimation;
|
|
||||||
|
|
||||||
[
|
|
||||||
30,
|
|
||||||
[_player, _target],
|
|
||||||
{
|
|
||||||
params ["_args"];
|
|
||||||
_args params ["_player", "_target"];
|
|
||||||
hint "Tire Patched";
|
|
||||||
_target setDamage 0.2;
|
|
||||||
_target setVariable["milsim_ace_repair_wheel_canPatch", false];
|
|
||||||
},
|
|
||||||
{
|
|
||||||
params ["_args"];
|
|
||||||
_args params ["_player", "_target"];
|
|
||||||
hint "Stopped repair";
|
|
||||||
[_player, "", 0] call ace_common_fnc_doAnimation;
|
|
||||||
},
|
|
||||||
"Patching"
|
|
||||||
] call ace_common_fnc_progressBar
|
|
||||||
},
|
|
||||||
{ ( alive _target ) && ( [_player, "ToolKit"] call ace_common_fnc_hasItem ) && ( damage _target > 0.2 ) && ( _target getVariable["milsim_ace_repair_wheel_canPatch", true] ) }
|
|
||||||
] call ace_interact_menu_fnc_createAction;
|
|
||||||
|
|
||||||
["ACE_Wheel", 0, ["ACE_MainActions"], _patchTire, true] call ace_interact_menu_fnc_addActionToClass;
|
|
||||||
|
|
||||||
|
|
||||||
diag_log text "[MILSIM] (client) vehicle actions bound";
|
diag_log text "[MILSIM] (client) vehicle actions bound";
|
||||||
|
|
||||||
nil;
|
nil;
|
||||||
@@ -14,6 +14,30 @@ call EFUNC(common,logMissionInfo);
|
|||||||
call EFUNC(fbcb2_assets,initServer);
|
call EFUNC(fbcb2_assets,initServer);
|
||||||
call EFUNC(reinsert,initServer);
|
call EFUNC(reinsert,initServer);
|
||||||
|
|
||||||
|
// globally disable zeus lightning bolt functionality
|
||||||
|
_curators = allMissionObjects "ModuleCurator_F";
|
||||||
|
{
|
||||||
|
_x removeCuratorAddons ["CuratorOnly_Modules_F_Curator_Lightning"];
|
||||||
|
_x removeCuratorAddons ["A3_Modules_F_Curator_Lightning"];
|
||||||
|
} foreach _curators;
|
||||||
|
|
||||||
|
// add dead unit time marking for custom garbage cleanup function
|
||||||
|
addMissionEventHandler ["EntityKilled", {
|
||||||
|
params ["_unit", "_killer", "_instigator", "_useEffects"];
|
||||||
|
|
||||||
|
if not (_unit isKindOf "CAManBase") exitWith {};
|
||||||
|
|
||||||
|
if not (isInRemainsCollector _unit) exitWith {};
|
||||||
|
|
||||||
|
// format["%1 from group %2 died at %3", _unit, group _unit, [datetime] call BIS_fnc_timeToString] remoteExec ["systemChat"];
|
||||||
|
_unit setVariable["milsim_death_time", time];
|
||||||
|
// _unit addEventHandler ["Deleted", {
|
||||||
|
// params ["_entity"];
|
||||||
|
// isGC = _entity getVariable["milsim_garbage_collected", false];
|
||||||
|
// format["%1 from was deleted by custom gc: %2", _entity, str isGC ] remoteExec ["systemChat"];
|
||||||
|
// }];
|
||||||
|
}];
|
||||||
|
|
||||||
// declare init complete to other modules
|
// declare init complete to other modules
|
||||||
missionNamespace setVariable [QGVARMAIN(complete), true, true];
|
missionNamespace setVariable [QGVARMAIN(complete), true, true];
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
#include "..\script_component.hpp"
|
#include "..\script_component.hpp"
|
||||||
|
|
||||||
|
//---------------------
|
||||||
|
// Garbage Collection
|
||||||
|
//---------------------
|
||||||
|
|
||||||
[
|
[
|
||||||
QGVAR(emptyGroupCleanup_enable),
|
QGVAR(emptyGroupCleanup_enable),
|
||||||
"CHECKBOX",
|
"CHECKBOX",
|
||||||
@@ -22,6 +26,28 @@
|
|||||||
}
|
}
|
||||||
] call CBA_fnc_addSetting;
|
] call CBA_fnc_addSetting;
|
||||||
|
|
||||||
|
[
|
||||||
|
QGVAR(deadUnitCleanup_enable),
|
||||||
|
"CHECKBOX",
|
||||||
|
"Dead Unit Cleanup Enabled",
|
||||||
|
[QUOTE(SETTINGS_GROUP_NAME), QUOTE(COMPONENT_BEAUTIFIED)],
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
{
|
||||||
|
params ["_value"];
|
||||||
|
[
|
||||||
|
QGVAR(deadUnitCleanup_enable),
|
||||||
|
_value
|
||||||
|
] call EFUNC(common,logSettingChanged);
|
||||||
|
|
||||||
|
if (!isNull (missionNamespace getVariable [QGVAR(deadUnitCleanupPFH), locationNull])) then {
|
||||||
|
deleteLocation GVAR(deadUnitCleanupPFH);
|
||||||
|
};
|
||||||
|
|
||||||
|
call FUNC(addDeadUnitCleanupPFH);
|
||||||
|
}
|
||||||
|
] call CBA_fnc_addSetting;
|
||||||
|
|
||||||
//---------------------
|
//---------------------
|
||||||
// Server CPS
|
// Server CPS
|
||||||
//---------------------
|
//---------------------
|
||||||
|
|||||||
55
framework/performance/functions/fn_addDeadUnitCleanupPFH.sqf
Normal file
55
framework/performance/functions/fn_addDeadUnitCleanupPFH.sqf
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
#include "..\script_component.hpp"
|
||||||
|
|
||||||
|
[
|
||||||
|
LEVEL_INFO,
|
||||||
|
QUOTE(COMPONENT),
|
||||||
|
"Initializing dead unit deletion PFH",
|
||||||
|
[]
|
||||||
|
] call EFUNC(common,log);
|
||||||
|
|
||||||
|
GVAR(deadUnitCleanupPFH) = [
|
||||||
|
{
|
||||||
|
_maxTime = getMissionConfigValue ["corpseRemovalMaxTime", 300] * 1.5;
|
||||||
|
_maxDead = getMissionConfigValue ["corpseLimit", 80];
|
||||||
|
|
||||||
|
// _dead = allDead select { (_x isKindOf "CAManBase") and ( ( (time - (_x getVariable ["milsim_death_time", time] ) ) > (_maxTime * 1.5) ) ) };
|
||||||
|
// _dead = _dead apply { [ (time - (_x getVariable ["milsim_death_time", time] ) ), _x ] };
|
||||||
|
|
||||||
|
_dead = [];
|
||||||
|
{
|
||||||
|
if not (_x isKindOf "CAManBase") then { continue };
|
||||||
|
if not (isInRemainsCollector _x) then { continue };
|
||||||
|
_dead pushBack [time - (_x getVariable ["milsim_death_time", time] ), _x];
|
||||||
|
} forEach allDead;
|
||||||
|
|
||||||
|
_dead sort false;
|
||||||
|
_toDelete = 0 max ( (count _dead ) - _maxDead );
|
||||||
|
_dead = _dead select [0, _toDelete];
|
||||||
|
{
|
||||||
|
_unit = _x#1;
|
||||||
|
// _unit setVariable ["milsim_garbage_collected", true];
|
||||||
|
deleteVehicle (_unit);
|
||||||
|
} foreach _dead;
|
||||||
|
},
|
||||||
|
180,
|
||||||
|
[],
|
||||||
|
{ // on creation
|
||||||
|
[
|
||||||
|
LEVEL_INFO,
|
||||||
|
QUOTE(COMPONENT),
|
||||||
|
"dead unit deletion PFH loaded",
|
||||||
|
[]
|
||||||
|
] call EFUNC(common,log);
|
||||||
|
},
|
||||||
|
{ // on deletion
|
||||||
|
[
|
||||||
|
LEVEL_INFO,
|
||||||
|
QUOTE(COMPONENT),
|
||||||
|
"dead unit deletion PFH unloaded",
|
||||||
|
[]
|
||||||
|
] call EFUNC(common,log);
|
||||||
|
},
|
||||||
|
{ (missionNamespace getVariable [QGVAR(deadUnitCleanup_enable), false]) },
|
||||||
|
{ false },
|
||||||
|
[]
|
||||||
|
] call CBA_fnc_createPerFrameHandlerObject;
|
||||||
@@ -10,9 +10,39 @@
|
|||||||
GVAR(emptyGroupCleanupPFH) = [
|
GVAR(emptyGroupCleanupPFH) = [
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
if (local _x) then {
|
|
||||||
if ((count units _x) == 0) then {
|
if ((count units _x) == 0) then {
|
||||||
|
if (local _x) then {
|
||||||
|
[
|
||||||
|
LEVEL_INFO,
|
||||||
|
QUOTE(COMPONENT),
|
||||||
|
"DELETING EMPTY GROUP",
|
||||||
|
[
|
||||||
|
["groupId", groupId _x],
|
||||||
|
["netId", netId _x]
|
||||||
|
]
|
||||||
|
] call EFUNC(common,log);
|
||||||
deleteGroup _x;
|
deleteGroup _x;
|
||||||
|
} else {
|
||||||
|
if (isServer) then {
|
||||||
|
[
|
||||||
|
LEVEL_INFO,
|
||||||
|
QUOTE(COMPONENT),
|
||||||
|
"NON LOCAL EMPTY GROUP",
|
||||||
|
[
|
||||||
|
["groupId", groupId _x],
|
||||||
|
["groupOwner", groupOwner _x]
|
||||||
|
]
|
||||||
|
] call EFUNC(common,log);
|
||||||
|
} else {
|
||||||
|
[
|
||||||
|
LEVEL_INFO,
|
||||||
|
QUOTE(COMPONENT),
|
||||||
|
"EMPTY REMOTE GROUP",
|
||||||
|
[
|
||||||
|
["groupId", groupId _x]
|
||||||
|
]
|
||||||
|
] call EFUNC(common,log);
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
} forEach allGroups;
|
} forEach allGroups;
|
||||||
@@ -39,6 +69,3 @@ GVAR(emptyGroupCleanupPFH) = [
|
|||||||
{ not (missionNamespace getVariable [QGVAR(emptyGroupCleanup_enable), false]) },
|
{ not (missionNamespace getVariable [QGVAR(emptyGroupCleanup_enable), false]) },
|
||||||
[]
|
[]
|
||||||
] call CBA_fnc_createPerFrameHandlerObject;
|
] call CBA_fnc_createPerFrameHandlerObject;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
// log to RPT
|
// log to RPT
|
||||||
[
|
[
|
||||||
|
|
||||||
{_this call EFUNC(common,log);},
|
{_this remoteExec [QEFUNC(common,log), 2]},
|
||||||
[
|
[
|
||||||
LEVEL_INFO,
|
LEVEL_INFO,
|
||||||
QUOTE(COMPONENT),
|
QUOTE(COMPONENT),
|
||||||
|
|||||||
@@ -12,7 +12,6 @@
|
|||||||
|
|
||||||
private _rawCPS = _counter / (diag_frameNo - _frameNo);
|
private _rawCPS = _counter / (diag_frameNo - _frameNo);
|
||||||
missionNamespace setVariable [QGVAR(server_raw_cps), _rawCPS];
|
missionNamespace setVariable [QGVAR(server_raw_cps), _rawCPS];
|
||||||
publicVariable QGVAR(server_raw_cps);
|
|
||||||
|
|
||||||
// with suspension
|
// with suspension
|
||||||
private _counter = 0;
|
private _counter = 0;
|
||||||
@@ -26,7 +25,6 @@
|
|||||||
|
|
||||||
private _serverCPS = _counter / (diag_frameNo - _frameNo);
|
private _serverCPS = _counter / (diag_frameNo - _frameNo);
|
||||||
missionNamespace setVariable [QGVAR(server_cps), _counter / (diag_frameNo - _frameNo)];
|
missionNamespace setVariable [QGVAR(server_cps), _counter / (diag_frameNo - _frameNo)];
|
||||||
publicVariable QGVAR(server_cps);
|
|
||||||
|
|
||||||
// log to RPT
|
// log to RPT
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -162,7 +162,7 @@ if (isNil "_items") exitWith {
|
|||||||
[_box,1] call ace_cargo_fnc_setSize;
|
[_box,1] call ace_cargo_fnc_setSize;
|
||||||
|
|
||||||
// ignore weight restrictions for carry/drag
|
// ignore weight restrictions for carry/drag
|
||||||
_box setVariable ["ace_ignoreWeightCarry", true, true];
|
_box setVariable ["ace_dragging_ignoreWeightCarry", true, true];
|
||||||
|
|
||||||
// Return the box
|
// Return the box
|
||||||
_box;
|
_box;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#define MAJOR 4
|
#define MAJOR 4
|
||||||
#define MINOR 0
|
#define MINOR 1
|
||||||
#define PATCHLVL 0
|
#define PATCHLVL 2
|
||||||
#define BUILD 0
|
#define BUILD 0
|
||||||
|
|||||||
Reference in New Issue
Block a user