ACE3/addons/repair/functions/fnc_setHitPointDamage.sqf

80 lines
1.9 KiB
Plaintext

/*
* Author: commy2
*
* Set the hitpoint damage and change the structural damage acordingly. Requires local vehicle.
*
* Arguments:
* 0: vehicle
* 1: hitpoint
* 2: damage
*
* Return Value:
* NONE
*/
#include "script_component.hpp"
private ["_vehicle", "_hitPoint", "_hitPointDamage"];
_vehicle = _this select 0;
_hitPoint = _this select 1;
_hitPointDamage = _this select 2;
// can't execute all commands if the vehicle isn't local. exit here.
if !(local _vehicle) exitWith {};
// get all valid hitpoints
private "_hitPoints";
_hitPoints = [_vehicle] call EFUNC(common,getHitpoints);
// exit if the hitpoint is not valid
if !(_hitPoint in _hitPoints) exitWith {};
// save array with damage values of all hitpoints
private "_hitPointDamages";
_hitPointDamages = [];
{
_hitPointDamages set [_forEachIndex, _vehicle getHitPointDamage _x];
} forEach _hitPoints;
// save structural damage and sum of hitpoint damages
private ["_damageOld", "_hitPointDamageSumOld"];
_damageOld = damage _vehicle;
_hitPointDamageSumOld = 0;
{
_hitPointDamageSumOld = _hitPointDamageSumOld + _x;
} forEach _hitPointDamages;
// set new damage in array
_hitPointDamages set [_hitPoints find _hitPoint, _hitPointDamage];
// save sum of new hitpoint damages
private "_hitPointDamageSumNew";
_hitPointDamageSumNew = 0;
{
_hitPointDamageSumNew = _hitPointDamageSumNew + _x;
} forEach _hitPointDamages;
// calculate new strctural damage
private "_damageNew";
_damageNew = _hitPointDamageSumNew / count _hitPoints;
if (_hitPointDamageSumOld > 0) then {
_damageNew = _damageOld * (_hitPointDamageSumNew / _hitPointDamageSumOld);
};
// set new structural damage value
_vehicle setDamage _damageNew;
// set the new damage for that hit point
{
_vehicle setHitPointDamage [_x, _hitPointDamages select _forEachIndex];
} forEach _hitPoints;
// normalize hitpoints
[_vehicle] call FUNC(normalizeHitPoints);