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
|
Private ['_airCoef','_artCoef','_cts','_distanceMin','_heaCoef','_i','_ligCoef','_name','_nearIsDP','_nearIsRT','_nearIsSP','_repairRange','_repTime','_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;
_repTime = 'WFBE_SUPPORTREPAIRTIME' 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.4;
_artCoef = 1.8;
_heaCoef = 1.6;
_ligCoef = 1.4;
};
if (_nearIsDP) then {
_airCoef = 1.9;
_artCoef = 1.5;
_heaCoef = 1.3;
_ligCoef = 1.1;
};
if (_nearIsSP) then {
_airCoef = 1.4;
_artCoef = 1;
_heaCoef = 0.8;
_ligCoef = 0.6;
};
//--- Class Malus.
if (_veh isKindOf 'Air') then {_repTime = round(_repTime * (_airCoef + getDammage _veh))};
if (_veh isKindOf 'StaticWeapon') then {_repTime = round(_repTime * (_artCoef + getDammage _veh))};
if (_veh isKindOf 'Tank') then {_repTime = round(_repTime * (_heaCoef + getDammage _veh))};
if (_veh isKindOf 'Car' || _veh isKindOf 'Motorcycle') then {_repTime = round(_repTime * (_ligCoef + getDammage _veh))};
//--- Inform the player.
hint parseText(Format[localize "STR_WF_INFO_Repairing",_name,_repTime]);
//--- 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_Repair_Failed",_name])};
if (_i >= _repTime) exitWith {hint parseText(Format[localize "STR_WF_INFO_Repair_Success",_name])};
};
//--- Fix the damages?
if (_cts != 0) then {
_veh setDammage 0;
};
|