1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
Private ['_airCoef','_artCoef','_cts','_distanceMin','_heaCoef','_healTime','_i','_ligCoef','_name','_nearIsDP','_nearIsRT','_nearIsSP','_repairRange','_spType','_supportRange','_supports','_typeRepair','_veh'];
_veh = _this select 0;
_supports = _this select 1;
_typeRepair = _this select 2;
_spType = _this select 3;
_supportRange = 'WFBE_SUPPORTRANGE' Call GetNamespace;
_repairRange = 'WFBE_REPAIRTRUCKRANGE' Call GetNamespace;
//--- Retrieve Informations.
_name = [typeOf _veh, 'displayName'] Call GetConfigInfo;
_healTime = 'WFBE_SUPPORTHEALTIME' Call GetNamespace;
//--- SP?
_nearIsSP = false;
_nearIsDP = false;
_nearIsRT = false;
{
if ((typeOf _x) == _spType) then {_nearIsSP = true};
if ((typeOf _x) in WFDEPOT) then {_nearIsDP = true};
if ((typeOf _x) in _typeRepair) then {_nearIsRT = true};
} forEach _supports;
//--- Coefficient Vary depending on the support type.
_airCoef = 1;
_artCoef = 1;
_heaCoef = 1;
_ligCoef = 1;
if (_nearIsRT) then {
_airCoef = 2.8;
_artCoef = 2.4;
_heaCoef = 2.2;
_ligCoef = 2.0;
};
if (_nearIsDP) then {
_airCoef = 2.3;
_artCoef = 2.1;
_heaCoef = 1.9;
_ligCoef = 1.7;
};
if (_nearIsSP) then {
_airCoef = 1.8;
_artCoef = 1.6;
_heaCoef = 1.4;
_ligCoef = 1.2;
};
//--- Class Malus.
if (_veh isKindOf 'Air') then {_healTime = round(_healTime * (_airCoef + getDammage _veh))};
if (_veh isKindOf 'StaticWeapon') then {_healTime = round(_healTime * (_artCoef + getDammage _veh))};
if (_veh isKindOf 'Tank') then {_healTime = round(_healTime * (_heaCoef + getDammage _veh))};
if (_veh isKindOf 'Car' || _veh isKindOf 'Motorcycle') then {_healTime = round(_healTime * (_ligCoef + getDammage _veh))};
//--- Inform the player.
hint parseText(Format[localize "STR_WF_INFO_Healing",_name,_healTime]);
//--- Make sure that we still have something as a support.
_cts = 0;
_i = 0;
while {true} do {
sleep 1;
//--- Check the distance & alive.
_cts = 0;
{
_distanceMin = if ((typeOf _x) in _typeRepair) then {_repairRange} else {_supportRange};
if ((alive _x) && ((_veh distance _x) < _distanceMin)) then {_cts = _cts + 1};
} forEach _supports;
_i = _i + 1;
if (_cts == 0 || !(alive _veh) || (getPos _veh) select 2 > 2) exitWith {hint parseText(Format[localize "STR_WF_INFO_Heal_Failed",_name])};
if (_i >= _healTime) exitWith {hint parseText(Format[localize "STR_WF_INFO_Heal_Success",_name])};
};
//--- Heal the damages?
if (_cts != 0) then {
if (_veh isKindOf "Man") then {
_veh setDammage 0;
if (paramAceWounds) then
{
_veh call ace_sys_wounds_fnc_RemoveBleed;
_veh call ace_sys_wounds_fnc_RemovePain;
_vel call ace_sys_wounds_fnc_RemoveUncon;
};
} else {
_crews = crew _veh;
if (count _crews > 0) then {
{
_x setDammage 0;
if (paramAceWounds) then
{
_x call ace_sys_wounds_fnc_RemoveBleed;
_x call ace_sys_wounds_fnc_RemovePain;
_x call ace_sys_wounds_fnc_RemoveUncon;
};
} forEach _crews
};
};
};
|