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.
86 lines
3.8 KiB
Plaintext
86 lines
3.8 KiB
Plaintext
#include "script_component.hpp"
|
|
|
|
ADDON = false;
|
|
|
|
PREP_RECOMPILE_START;
|
|
#include "XEH_PREP.hpp"
|
|
PREP_RECOMPILE_END;
|
|
|
|
#include "initSettings.sqf"
|
|
|
|
// Define "Constants" variables (both are macros defined in script_macros_medical.hpp, look there for actual variable names)
|
|
if (isNil QUOTE(HEAD_DAMAGE_THRESHOLD)) then {HEAD_DAMAGE_THRESHOLD = HEAD_DAMAGE_THRESHOLD_DEFAULT};
|
|
if (isNil QUOTE(ORGAN_DAMAGE_THRESHOLD)) then {ORGAN_DAMAGE_THRESHOLD = ORGAN_DAMAGE_THRESHOLD_DEFAULT};
|
|
if (isNil QUOTE(HEART_HIT_CHANCE)) then {HEART_HIT_CHANCE = HEART_HIT_CHANCE_DEFAULT};
|
|
if (isNil QUOTE(PENETRATION_THRESHOLD)) then {PENETRATION_THRESHOLD = PENETRATION_THRESHOLD_DEFAULT};
|
|
if (isNil QUOTE(BLOOD_LOSS_KNOCK_OUT_THRESHOLD)) then {BLOOD_LOSS_KNOCK_OUT_THRESHOLD = BLOOD_LOSS_KNOCK_OUT_THRESHOLD_DEFAULT};
|
|
if (isNil QUOTE(PAIN_UNCONSCIOUS)) then {PAIN_UNCONSCIOUS = PAIN_UNCONSCIOUS_DEFAULT};
|
|
if (isNil QUOTE(PAIN_FADE_TIME)) then {PAIN_FADE_TIME = PAIN_FADE_TIME_DEFAULT};
|
|
if (isNil QUOTE(LIMPING_DAMAGE_THRESHOLD)) then {LIMPING_DAMAGE_THRESHOLD = LIMPING_DAMAGE_THRESHOLD_DEFAULT};
|
|
if (isNil QUOTE(FRACTURE_DAMAGE_THRESHOLD)) then {FRACTURE_DAMAGE_THRESHOLD = FRACTURE_DAMAGE_THRESHOLD_DEFAULT};
|
|
// Derive the alternate fatal damage coefficents
|
|
if (isNil QUOTE(FATAL_SUM_DAMAGE_WEIBULL_K) || isNil QUOTE(FATAL_SUM_DAMAGE_WEIBULL_L)) then {
|
|
private _x1 = 0.5;
|
|
private _y1 = 0.1;
|
|
private _x2 = 0.8;
|
|
private _y2 = 0.9;
|
|
private _b1 = -ln (1-_y1);
|
|
private _b2 = -ln (1-_y2);
|
|
FATAL_SUM_DAMAGE_WEIBULL_K = ln(_b1/_b2) / ln(_x1/_x2);
|
|
FATAL_SUM_DAMAGE_WEIBULL_L = _x1 / _b1^(1/FATAL_SUM_DAMAGE_WEIBULL_K);
|
|
};
|
|
|
|
// Cache for armor values of equipped items (vests etc)
|
|
GVAR(armorCache) = createHashMap;
|
|
|
|
// Hack for #3168 (units in static weapons do not take any damage):
|
|
// Doing a manual pre-load with a small distance seems to fix the LOD problems
|
|
// with handle damage not returning full results.
|
|
GVAR(fixedStatics) = [];
|
|
|
|
GVAR(animations) = [] call CBA_fnc_createNamespace;
|
|
GVAR(animations) setVariable [QUNCON_ANIM(faceUp), [QUNCON_ANIM(2),QUNCON_ANIM(2_1),QUNCON_ANIM(7_1),QUNCON_ANIM(8_1),QUNCON_ANIM(5_1),QUNCON_ANIM(6_1)]];
|
|
GVAR(animations) setVariable [QUNCON_ANIM(faceDown), [QUNCON_ANIM(1),QUNCON_ANIM(3),QUNCON_ANIM(4),"unconscious",QUNCON_ANIM(9),QUNCON_ANIM(3_1),QUNCON_ANIM(4_1)]];
|
|
GVAR(animations) setVariable [QUNCON_ANIM(faceLeft), [QUNCON_ANIM(7),QUNCON_ANIM(8),QUNCON_ANIM(1_1),QUNCON_ANIM(7_1),QUNCON_ANIM(8_1)]];
|
|
GVAR(animations) setVariable [QUNCON_ANIM(faceRight), [QUNCON_ANIM(5),QUNCON_ANIM(6),QUNCON_ANIM(10),QUNCON_ANIM(5_1),QUNCON_ANIM(6_1)]];
|
|
|
|
private _fnc_fixStatic = {
|
|
params ["_vehicle"];
|
|
private _type = typeOf _vehicle;
|
|
|
|
if !(_type in GVAR(fixedStatics)) then {
|
|
GVAR(fixedStatics) pushBack _type;
|
|
PRELOAD_CLASS(_type);
|
|
};
|
|
};
|
|
|
|
["StaticWeapon", "init", _fnc_fixStatic] call CBA_fnc_addClassEventHandler;
|
|
["Car", "init", _fnc_fixStatic] call CBA_fnc_addClassEventHandler;
|
|
|
|
addMissionEventHandler ["Loaded", {
|
|
{
|
|
PRELOAD_CLASS(_x);
|
|
} forEach GVAR(fixedStatics);
|
|
}];
|
|
|
|
["ace_unconscious", {
|
|
params ["_unit", "_active"];
|
|
if (_active) then {
|
|
// Use object reference to indicate the waitUnit is already running (this prevents issues with respawning units keeping SetVars)
|
|
if ((_unit getVariable [QGVAR(waitForAnim), objNull]) == _unit) exitWith {};
|
|
_unit setVariable [QGVAR(waitForAnim), _unit];
|
|
[{(animationState _this) find QUNCON_ANIM(face) != -1}, {
|
|
[_this, animationState _this] call FUNC(applyAnimAfterRagdoll);
|
|
}, _unit, 20] call CBA_fnc_waitUntilAndExecute;
|
|
} else {
|
|
_unit setVariable [QGVAR(waitForAnim), nil];
|
|
if (local _unit) then {
|
|
[_unit, _active] call FUNC(setUnconsciousAnim);
|
|
};
|
|
};
|
|
}] call CBA_fnc_addEventhandler;
|
|
|
|
[] call FUNC(disableThirdParty);
|
|
|
|
ADDON = true;
|