Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Misc - Add tourniquet side effects #446

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions addons/misc/CfgFunctions.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,14 @@ class CfgFunctions {
};
};
};
class overwrite_ace_medical_engine {
tag = "ace_medical_engine";
class ace_medical_engine {
class updateDamageEffects {
file = QPATHTOF(functions\fnc_updateDamageEffects.sqf);
};
};
};
class overwrite_medical_treatment {
tag = "ace_medical_treatment";
class ace_medical_treatment {
Expand Down
2 changes: 2 additions & 0 deletions addons/misc/XEH_PREP.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ PREP(getMagazineAmmoCounts);
PREP(getUniqueItems);
PREP(groupID);
PREP(handleRespawn);
PREP(handleTourniquetEffects);
PREP(handleUnconscious);
PREP(hasItem);
PREP(hasStableVitals);
Expand All @@ -50,4 +51,5 @@ PREP(treatmentIV);
PREP(treatmentSuccess);
PREP(unloadAndCarryPatient);
PREP(unSlingArmband);
PREP(updateDamageEffects);
PREP(useItem);
18 changes: 17 additions & 1 deletion addons/misc/XEH_postInit.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,20 @@ if (GVAR(incompatibilityWarning)) then {
[_carrier, _target] call ACEFUNC(dragging,dropObject_carry);
}] call CBA_fnc_addEventHandler;

call FUNC(FAK_updateContents);
call FUNC(FAK_updateContents);

[QACEGVAR(medical_treatment,tourniquetLocal), LINKFUNC(handleTourniquetEffects)] call CBA_fnc_addEventHandler;

["baseline", {
private _activeTourniquets = GET_TOURNIQUETS(ACE_player);
if (GVAR(tourniquetEffects_Enable)) then {
((_activeTourniquets select 2) + (_activeTourniquets select 3) min 1)
} else {0};
}, QUOTE(ADDON)] call ACEFUNC(common,addSwayFactor);

["multiplier", {
private _activeTourniquets = GET_TOURNIQUETS(ACE_player);
if (ACE_player getVariable [QGVAR(Tourniquet_ArmNecrosis), 0] > 0) then {
(ACE_player getVariable [QGVAR(Tourniquet_ArmNecrosis), 0]) / 10
} else {0};
}, QUOTE(ADDON)] call ACEFUNC(common,addSwayFactor);
31 changes: 29 additions & 2 deletions addons/misc/XEH_preInit.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ PREP_RECOMPILE_END;
QGVAR(treatmentTimeDetachTourniquet),
"SLIDER",
[LLSTRING(SETTING_treatmentTimeDetachTourniquet)],
[CBA_SETTINGS_CAT, ELSTRING(GUI,SubCategory_Basic)],
[CBA_SETTINGS_CAT, LSTRING(SubCategory_Tourniquet)],
[1, 60, 7, 1],
true
] call CBA_Settings_fnc_init;
Expand All @@ -41,11 +41,38 @@ PREP_RECOMPILE_END;
QGVAR(neckTourniquet),
"CHECKBOX",
[LLSTRING(neckTourniquetDescription)],
[CBA_SETTINGS_CAT, ELSTRING(GUI,SubCategory_Basic)],
[CBA_SETTINGS_CAT, LSTRING(SubCategory_Tourniquet)],
[false],
true
] call CBA_Settings_fnc_init;

[
QGVAR(tourniquetEffects_Enable),
"CHECKBOX",
[LLSTRING(SETTING_tourniquetEffects_Enable)],
[CBA_SETTINGS_CAT, LSTRING(SubCategory_Tourniquet)],
[true],
true
] call CBA_Settings_fnc_init;

[
QGVAR(tourniquetEffects_PositiveMultiplier),
"SLIDER",
[LLSTRING(SETTING_tourniquetEffects_PositiveMultiplier)],
[CBA_SETTINGS_CAT, LSTRING(SubCategory_Tourniquet)],
[0.1, 10, 1, 1],
true
] call CBA_Settings_fnc_init;

[
QGVAR(tourniquetEffects_NegativeMultiplier),
"SLIDER",
[LLSTRING(SETTING_tourniquetEffects_NegativeMultiplier)],
[CBA_SETTINGS_CAT, LSTRING(SubCategory_Tourniquet)],
[0.1, 10, 1, 1],
true
] call CBA_Settings_fnc_init;


//Incompatibility Warning with other addons
[
Expand Down
6 changes: 6 additions & 0 deletions addons/misc/functions/fnc_fullHealLocal.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,12 @@ _unit setVariable [QEGVAR(surgery,lidocaine), false, true];
_unit setVariable [QEGVAR(surgery,etomidate), false, true];
_unit setVariable [QEGVAR(surgery,sedated), false, true];

// KAT Misc
_unit setVariable [QGVAR(Tourniquet_ArmNecrosis), 0];
_unit setVariable [QGVAR(Tourniquet_LegNecrosis), 0];
_unit setVariable [QGVAR(Tourniquet_PFH), -1];
_unit setVariable [QGVAR(Tourniquet_LegNecrosis_Threshold), 0, true];

// Damage storage
_unit setVariable [QACEGVAR(medical,bodyPartDamage), [0,0,0,0,0,0], true];

Expand Down
5 changes: 5 additions & 0 deletions addons/misc/functions/fnc_handleRespawn.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,11 @@ _unit setVariable [QEGVAR(misc,isRightArmFree), true, true];
_unit setVariable [QEGVAR(misc,isLeftLegFree), true, true];
_unit setVariable [QEGVAR(misc,isRightLegFree), true, true];

_unit setVariable [QGVAR(Tourniquet_ArmNecrosis), 0];
_unit setVariable [QGVAR(Tourniquet_LegNecrosis), 0];
_unit setVariable [QGVAR(Tourniquet_PFH), -1];
_unit setVariable [QGVAR(Tourniquet_LegNecrosis_Threshold), 0, true];

// KAT Pharmacy

_unit setVariable [QEGVAR(pharma,alphaAction), 1, true];
Expand Down
89 changes: 89 additions & 0 deletions addons/misc/functions/fnc_handleTourniquetEffects.sqf
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
#include "..\script_component.hpp"
/*
* Author: Blue
* Handle effects for when tourniquet is applied for prolonged time
*
* Arguments:
* 0: Unit <OBJECT>
*
* Return Value:
* None
*
* Example:
* [player] call kat_misc_fnc_handleTourniquetEffects;
*
* Public: No
*/

params ["_unit"];

if (_unit getVariable [QGVAR(Tourniquet_PFH), -1] != -1 || !(GVAR(tourniquetEffects_Enable))) exitWith {};
_unit setVariable [QGVAR(Tourniquet_LegNecrosis_Threshold), 0, true];

private _handleLegEffects = {
params ["_unit", "_threshold"];

if (_unit getVariable [QGVAR(Tourniquet_LegNecrosis_Threshold), 0] != _threshold) then {
_unit setVariable [QGVAR(Tourniquet_LegNecrosis_Threshold), _threshold, true];
[_unit] call FUNC(updateDamageEffects);
};
};

private _tourniquetPFH = [{
params ["_args", "_idPFH"];
_args params ["_unit", "_handleLegEffects"];

private _tourniquet_ArmNecrosis = _unit getVariable [QGVAR(Tourniquet_ArmNecrosis), 0];
private _tourniquet_LegNecrosis = _unit getVariable [QGVAR(Tourniquet_LegNecrosis), 0];

private _activeTourniquets = GET_TOURNIQUETS(_unit);
private _armTourniquets = (_activeTourniquets select 2) + (_activeTourniquets select 3);
private _legTourniquets = (_activeTourniquets select 4) + (_activeTourniquets select 5);

if (_armTourniquets > 1) then {
_tourniquet_ArmNecrosis = _tourniquet_ArmNecrosis + (0.16 * GVAR(tourniquetEffects_PositiveMultiplier));
if (_tourniquet_ArmNecrosis >= 100) then {
_tourniquet_ArmNecrosis = 100;
};
} else {
_tourniquet_ArmNecrosis = _tourniquet_ArmNecrosis - (0.32 * GVAR(tourniquetEffects_NegativeMultiplier));

if (_tourniquet_ArmNecrosis <= 0) then {
_tourniquet_ArmNecrosis = 0;
};
};

if (_legTourniquets > 1) then {
_tourniquet_LegNecrosis = _tourniquet_LegNecrosis + (0.16 * GVAR(tourniquetEffects_PositiveMultiplier));

if (_tourniquet_LegNecrosis >= 100) then {
_tourniquet_LegNecrosis = 100;
};
} else {
_tourniquet_LegNecrosis = _tourniquet_LegNecrosis - (0.32 * GVAR(tourniquetEffects_NegativeMultiplier));

if (_tourniquet_LegNecrosis <= 0) then {
_tourniquet_LegNecrosis = 0;
};
};

switch (true) do {
case (_tourniquet_LegNecrosis > 20 && _tourniquet_LegNecrosis < 60): {[_unit, 20] call _handleLegEffects;};
case (_tourniquet_LegNecrosis > 60 && _tourniquet_LegNecrosis < 90): {[_unit, 60] call _handleLegEffects;};
case (_tourniquet_LegNecrosis > 90): {[_unit, 90] call _handleLegEffects;};
default {[_unit, 0] call _handleLegEffects;};
};

if ((_tourniquet_ArmNecrosis + _tourniquet_LegNecrosis <= 0 && _armTourniquets + _legTourniquets == 0) || !(alive _unit)) exitWith {
_unit setVariable [QGVAR(Tourniquet_ArmNecrosis), 0];
_unit setVariable [QGVAR(Tourniquet_LegNecrosis), 0];
_unit setVariable [QGVAR(Tourniquet_LegNecrosis_Threshold), 0, true];
_unit setVariable [QGVAR(Tourniquet_PFH), -1];
[_idPFH] call CBA_fnc_removePerFrameHandler;
};

_unit setVariable [QGVAR(Tourniquet_ArmNecrosis), _tourniquet_ArmNecrosis];
_unit setVariable [QGVAR(Tourniquet_LegNecrosis), _tourniquet_LegNecrosis];
}, 1, [_unit, _handleLegEffects]] call CBA_fnc_addPerFrameHandler;

_unit setVariable [QGVAR(Tourniquet_PFH), _tourniquetPFH];
102 changes: 102 additions & 0 deletions addons/misc/functions/fnc_updateDamageEffects.sqf
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
#include "..\script_component.hpp"
/*
* Author: commy2, PabstMirror
* Modified: Blue
* Updates damage effects for limping and fractures.
*
* Arguments:
* 0: Unit <OBJECT>
*
* Return Value:
* None
*
* Example:
* [player] call ace_medical_engine_fnc_updateDamageEffects
*
* Public: No
*/

params [["_unit", objNull, [objNull]]];

if (!local _unit) exitWith { ERROR_2("updateDamageEffects: Unit not local or null [%1:%2]",_unit,typeOf _unit); };

private _isLimping = false;
private _hasLegSplint = false;
private _noSprint = false;
private _noJog = false;

if (ACEGVAR(medical,fractures) > 0) then {
private _fractures = GET_FRACTURES(_unit);
TRACE_1("",_fractures);
if (((_fractures select 4) == 1) || {(_fractures select 5) == 1}) then {
TRACE_1("limping because of fracture",_fractures);
_isLimping = true;
};
private _aimFracture = 0;
if ((_fractures select 2) == 1) then { _aimFracture = _aimFracture + 4; };
if ((_fractures select 3) == 1) then { _aimFracture = _aimFracture + 4; };

if (ACEGVAR(medical,fractures) in [2, 3]) then { // the limp with a splint will still cause effects
// Block sprint / force walking based on fracture setting and leg splint status
_hasLegSplint = (_fractures select 4) == -1 || {(_fractures select 5) == -1};
if (ACEGVAR(medical,fractures) == 2) then {
_noSprint = _hasLegSplint;
} else {
_noJog = _hasLegSplint;
};

if ((_fractures select 2) == -1) then { _aimFracture = _aimFracture + 2; };
if ((_fractures select 3) == -1) then { _aimFracture = _aimFracture + 2; };
};
_unit setVariable [QACEGVAR(medical_engine,aimFracture), _aimFracture, false]; // local only var, used in ace_medical's postInit to set ACE_setCustomAimCoef
};

if (!_isLimping && {ACEGVAR(medical,limping) > 0}) then {
private _openWounds = GET_OPEN_WOUNDS(_unit);

// Want a copy of combined arrays to prevent wound mixing
private _legWounds = (_openWounds getOrDefault ["leftleg", []])
+ (_openWounds getOrDefault ["rightleg", []]);

if (ACEGVAR(medical,limping) == 2) then {
private _bandagedWounds = GET_BANDAGED_WOUNDS(_unit);
_legWounds = _legWounds
+ (_bandagedWounds getOrDefault ["leftleg", []])
+ (_bandagedWounds getOrDefault ["rightleg", []]);
};

{
_x params ["_xClassID", "_xAmountOf", "", "_xDamage"];
if (
(_xAmountOf > 0)
&& {_xDamage > LIMPING_DAMAGE_THRESHOLD_DEFAULT}
// select _causeLimping from woundDetails
&& {(ACEGVAR(medical_damage,woundDetails) get (_xClassID / 10)) select 3}
) exitWith {
TRACE_1("limping because of wound",_x);
_isLimping = true;
};
} forEach _legWounds;
};

if (_unit getVariable [QGVAR(Tourniquet_LegNecrosis_Threshold), 0] >= 20) then {
_noSprint = true;
};

if (_unit getVariable [QGVAR(Tourniquet_LegNecrosis_Threshold), 0] >= 60) then {
_noJog = true;
};

if (_unit getVariable [QGVAR(Tourniquet_LegNecrosis_Threshold), 0] >= 90) then {
_isLimping = true;
};

[_unit, "blockSprint", QACEGVAR(medical,fracture), _noSprint] call ACEFUNC(common,statusEffect_set);
[_unit, "forceWalk", QACEGVAR(medical,fracture), _noJog] call ACEFUNC(common,statusEffect_set);

_unit setVariable [QACEGVAR(medical,isLimping), _isLimping, true];

// refresh
private _isDamaged = _unit getHitPointDamage "HitLegs" >= DAMAGED_MIN_THRESHOLD && {_unit getHitPointDamage "HitLegs" != LIMPING_MIN_DAMAGE};

[_unit, "Legs", _isDamaged] call ACEFUNC(medical_engine,damageBodyPart);
3 changes: 3 additions & 0 deletions addons/misc/script_component.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,6 @@
#include "\x\kat\addons\main\script_macros.hpp"

#define MEDICAL_TREATMENT_ITEMS (call (uiNamespace getVariable [QACEGVAR(medical_treatment,treatmentItems), {[]}]))

#define DAMAGED_MIN_THRESHOLD 0.45
#define LIMPING_MIN_DAMAGE 0.5
12 changes: 12 additions & 0 deletions addons/misc/stringtable.xml
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,18 @@
<Spanish>[ADVERTENCIA DE KAM] Addon(s) incompatibles que podrían afectar negativamente el funcionamiento del mod fueron detectados. El equipo de desarollo de KAT - Advanced Medical REWRITE recomienda fuertemente remover estos addons. %1</Spanish>
<Portuguese>[AVISO DO KAM] Detectados addons incompatíveis que podem afetar negativamente a funcionalidade correta. KAT - A equipe de desenvolvimento do Advanced Medical REWRITE recomenda fortemente a remoção destes complementos: %1</Portuguese>
</Key>
<Key ID="STR_KAT_Misc_SubCategory_Tourniquet">
<English>Tourniquet Settings</English>
</Key>
<Key ID="STR_KAT_Misc_SETTING_tourniquetEffects_Enable">
<English>Enable tourniquet effects</English>
</Key>
<Key ID="STR_KAT_Misc_SETTING_tourniquetEffects_PositiveMultiplier">
<English>Tourniquet effects positive multiplier</English>
</Key>
<Key ID="STR_KAT_Misc_SETTING_tourniquetEffects_NegativeMultiplier">
<English>Tourniquet effects negative multiplier</English>
</Key>
<Key ID="STR_KAT_Misc_SETTING_treatmentTimeDetachTourniquet">
<English>Time to take off tourniquet</English>
<Spanish>Tiempo para retirar un torniquete</Spanish>
Expand Down
1 change: 1 addition & 0 deletions addons/pharma/XEH_PREP.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ PREP(fluid);
PREP(fluidLocal);
PREP(getBloodLoss);
PREP(getBloodVolumeChange);
PREP(tourniquetRemove);
PREP(init);
PREP(inspectCatheter);
PREP(medication);
Expand Down
Loading