ACE3/addons/medical/functions/fnc_handleDamage.sqf

77 lines
2.3 KiB
Plaintext
Raw Normal View History

2015-02-03 19:09:25 +00:00
/*
* Author: KoffeinFlummi, Glowbal
2015-02-03 19:09:25 +00:00
* Main HandleDamage EH function.
*
2015-02-03 19:09:25 +00:00
* Arguments:
* 0: Unit That Was Hit <OBJECT>
* 1: Name Of Hit Selection <STRING>
* 2: Amount Of Damage <NUMBER>
* 3: Shooter <OBJECT>
* 4: Projectile <OBJECT/STRING>
*
* Return Value:
* Damage To Be Inflicted <NUMBER>
*
* Public: No
*/
#include "script_component.hpp"
private ["_unit", "_selection", "_damage", "_shooter", "_projectile", "_damageReturn", "_hitPoints", "_typeOfDamage"];
2015-02-06 12:47:17 +00:00
_unit = _this select 0;
_selection = _this select 1;
_damage = _this select 2;
_shooter = _this select 3;
_projectile = _this select 4;
2015-02-06 12:47:17 +00:00
if !(local _unit) exitWith {nil};
if !([_unit] call FUNC(hasMedicalEnabled)) exitwith {systemChat format["Has no medical enabled: %1", _unit];};
2015-02-21 23:49:38 +00:00
2015-02-06 12:47:17 +00:00
if (typeName _projectile == "OBJECT") then {
_projectile = typeOf _projectile;
_this set [4, _projectile];
};
2015-02-06 12:47:17 +00:00
// If the damage is being weird, we just tell it to fuck off.
_hitSelections = ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"];
if !(_selection in (_hitSelections + [""])) exitWith {0};
_damageReturn = _damage;
2015-02-03 19:14:34 +00:00
_damageReturn = (_this select 2);
if (GVAR(level) == 0) then {
_damageReturn = (_this + [_damageReturn]) call FUNC(handleDamage_basic);
2015-02-03 19:09:25 +00:00
};
2015-02-06 12:47:17 +00:00
if (_damageReturn < 0.01) exitWith {0};
if (GVAR(level) >= 1) then {
2015-02-28 18:28:05 +00:00
[_unit, _selectionName, _damage, _source, _projectile, _damageReturn] call FUNC(handleDamage_caching);
2015-02-28 18:28:05 +00:00
if (_damageReturn > 0.9) then {
_hitPoints = ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"];
_newDamage = _damage - (damage _unit);
if (_selectionName in _hitSelections) then {
_newDamage = _damage - (_unit getHitPointDamage (_hitPoints select (_hitSelections find _selectionName)));
};
if ([_unit, [_selectionName] call FUNC(selectionNameToNumber), _newDamage] call FUNC(determineIfFatal)) then {
if ([_unit] call FUNC(setDead)) then {
_damageReturn = 1;
};
} else {
_damageReturn = 0.89;
};
2015-02-28 18:28:05 +00:00
};
};
if (_unit getVariable [QGVAR(preventDeath), false] && {_damageReturn >= 0.9} && {_selection in ["", "head", "body"]}) exitWith {
2015-02-10 12:33:40 +00:00
if (vehicle _unit != _unit and {damage _vehicle >= 1}) then {
// @todo
// [_unit] call FUNC(unload);
};
0.89
};
2015-02-03 19:09:25 +00:00
_damageReturn