mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
120 lines
3.5 KiB
Plaintext
120 lines
3.5 KiB
Plaintext
/*
|
|
* Author: KoffeinFlummi
|
|
*
|
|
* Handles all incoming damage for vehicles.
|
|
*
|
|
* Arguments:
|
|
* HandleDamage EH
|
|
*
|
|
* Return Value:
|
|
* Damage to be inflicted.
|
|
*/
|
|
|
|
_vehicle = _this select 0;
|
|
_selectionName = _this select 1;
|
|
_damage = _this select 2;
|
|
_source = _this select 3;
|
|
_projectile = _this select 4;
|
|
|
|
if (typeName _projectile == "OBJECT") then {
|
|
_projectile = typeOf _projectile;
|
|
};
|
|
|
|
// It's already dead, who cares?
|
|
if (damage _vehicle >= 1) exitWith {};
|
|
|
|
// Find out what hitpoint the selection belongs to.
|
|
_hitpoint = [_vehicle, _selectionName] call AGM_Armour_fnc_getHitPointBySelection;
|
|
|
|
// Determine type of vehicle and whether the selection is critical.
|
|
_type = "";
|
|
_critical = True;
|
|
if (_vehicle isKindOf "Car_F") then {
|
|
if (_vehicle isKindOf "Wheeled_APC_F") then {
|
|
_type = "tank";
|
|
} else {
|
|
_type = "car";
|
|
};
|
|
_critical = _hitpoint in ["HitHull", "HitFuel", ""];
|
|
};
|
|
if (_vehicle isKindOf "Tank_F") then {
|
|
_type = "tank";
|
|
_critical = _hitpoint in ["HitHull", ""];
|
|
};
|
|
if (_vehicle isKindOf "Helicopter") then {
|
|
_type = "heli";
|
|
_critical = _hitpoint in ["HitHull", ""];
|
|
};
|
|
if (_vehicle isKindOf "Plane") then {
|
|
_type = "plane";
|
|
_critical = _hitpoint in ["HitHull", ""];
|
|
};
|
|
if (_vehicle isKindOf "Ship_F") then {
|
|
_type = "ship";
|
|
_critical = _hitpoint in ["HitHull", ""];
|
|
};
|
|
if (_vehicle isKindOf "StaticWeapon") then {
|
|
_type = "static";
|
|
_critical = _hitpoint in ["HitHull", ""];
|
|
};
|
|
|
|
// Are we doing anything with this type of vehicle?
|
|
if !(_type in ["tank", "car"]) exitWith {};
|
|
|
|
// Change in damage
|
|
_newDamage = _damage - (_vehicle getHit _selectionName);
|
|
|
|
// Prevent total destruction of car unless round used is explosive
|
|
if (_type == "car") exitWith {
|
|
if (!_critical or (getNumber (configFile >> "CfgAmmo" >> _projectile >> "explosive") > 0.5)) then {
|
|
if (!(_vehicle getVariable ["AGM_Armour_isEngineSmoking", False]) and _hitpoint == "HitEngine" and _damage > 0.9) then {
|
|
_vehicle setVariable ["AGM_Armour_isEngineSmoking", True, True];
|
|
_pos = [
|
|
0,
|
|
(((boundingBoxReal _vehicle) select 1) select 1) - 4,
|
|
(((boundingBoxReal _vehicle) select 0) select 2) + 2
|
|
];
|
|
_smoke = "#particlesource" createVehicle [0,0,0];
|
|
_smoke setParticleClass "ObjectDestructionSmoke1_2Smallx";
|
|
_smoke attachTo [_vehicle, _pos];
|
|
[_vehicle, _smoke] spawn {
|
|
_vehicle = _this select 0;
|
|
_smoke = _this select 1;
|
|
_time = time;
|
|
waitUntil {sleep 5; isNull _vehicle or !(alive _vehicle) or ((_vehicle getHitPointDamage "HitEngine") < 0.9) or (_time + 240 < time)};
|
|
deleteVehicle _smoke;
|
|
};
|
|
};
|
|
_damage
|
|
} else {
|
|
_damage min 0.89
|
|
};
|
|
};
|
|
|
|
// Prevent total destruction of tank unless ammo storage is hit
|
|
if (_type == "tank") exitWith {
|
|
|
|
// Determine ammo storage location
|
|
_target = getText (configFile >> "CfgVehicles" >> typeOf _vehicle >> "AGM_Armour_AmmoLocation");
|
|
|
|
// Ammo was hit, high chance for cook-off
|
|
if (_hitpoint == _target and _damage > 0.5 and random 1 > 0.3) then {
|
|
[_vehicle] call AGM_Armour_fnc_cookOff;
|
|
};
|
|
|
|
// Ammo wasn't hit, slim chance for cook-off (only for high-damage weapons)
|
|
if (_hitpoint != target and _hitpoint in ["HitBody", "HitTurret", ""] and _newDamage > (0.6 + random 0.3)) then {
|
|
[_vehicle] call AGM_Armour_fnc_cookOff;
|
|
};
|
|
|
|
// Prevent destruction, let cook-off handle it if necessary
|
|
if (_critical) then {
|
|
_damage min 0.89
|
|
} else {
|
|
_damage
|
|
};
|
|
};
|
|
|
|
// this shouldn't happen, but who knows
|
|
_damage
|