mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
73a7dbdc1e
- Add stackable wound handler system for easy 3rd party extensibility and overriding of default wound handler. - Change mapping from wound type -> damage types, to damage type -> wound types. Improves the semantics and makes configuration easier to reason about. - Allow damage types to influence wound properties (bleed, size, etc.) with configurable variance parameters. - Allow configuration of wound type variance per damage type. Enabling more logically driven variance for sensible but still varied end results. - Improve handling of non-selection-specific damage events. The wound handler now receives all incoming damages and may apply damage to multiple selections (previously only ever one) if the damage type is not configured to be selection specific (with new config property `selectionSpecific`). - Add debug script for testing explosion damage events at varied ranges. - Add custom fire wound handler.
70 lines
2.8 KiB
Plaintext
70 lines
2.8 KiB
Plaintext
#include "script_component.hpp"
|
|
/*
|
|
* Author: commy2, PabstMirror
|
|
* 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;
|
|
|
|
if (EGVAR(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 (EGVAR(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
|
|
private _hasLegSplint = (_fractures select 4) == -1 || {(_fractures select 5) == -1};
|
|
if (EGVAR(medical,fractures) == 2) then {
|
|
[_unit, "blockSprint", QEGVAR(medical,fracture), _hasLegSplint] call EFUNC(common,statusEffect_set);
|
|
} else {
|
|
[_unit, "forceWalk", QEGVAR(medical,fracture), _hasLegSplint] call EFUNC(common,statusEffect_set);
|
|
};
|
|
|
|
if ((_fractures select 2) == -1) then { _aimFracture = _aimFracture + 2; };
|
|
if ((_fractures select 3) == -1) then { _aimFracture = _aimFracture + 2; };
|
|
};
|
|
_unit setVariable [QGVAR(aimFracture), _aimFracture, false]; // local only var, used in ace_medical's postInit to set ACE_setCustomAimCoef
|
|
};
|
|
|
|
if (!_isLimping && {EGVAR(medical,limping) > 0}) then {
|
|
private _woundsToCheck = GET_OPEN_WOUNDS(_unit);
|
|
if (EGVAR(medical,limping) == 2) then {
|
|
_woundsToCheck = _woundsToCheck + GET_BANDAGED_WOUNDS(_unit); // do not append
|
|
};
|
|
{
|
|
_x params ["_xClassID", "_xBodyPartN", "_xAmountOf", "", "_xDamage"];
|
|
if ((_xBodyPartN > 3) && {_xAmountOf > 0} && {_xDamage > LIMPING_DAMAGE_THRESHOLD} && {
|
|
(EGVAR(medical_damage,woundDetails) get (_xClassID / 10)) select 3}) exitWith { // select _causeLimping from woundDetails
|
|
TRACE_1("limping because of wound",_x);
|
|
_isLimping = true;
|
|
};
|
|
} forEach _woundsToCheck;
|
|
};
|
|
_unit setVariable [QEGVAR(medical,isLimping), _isLimping, true];
|
|
|
|
// refresh
|
|
private _isDamaged = _unit getHitPointDamage "HitLegs" >= DAMAGED_MIN_THRESHOLD && {_unit getHitPointDamage "HitLegs" != LIMPING_MIN_DAMAGE};
|
|
|
|
[_unit, "Legs", _isDamaged] call FUNC(damageBodyPart);
|