diff --git a/addons/repair/XEH_PREP.hpp b/addons/repair/XEH_PREP.hpp index ea9e40a4e71..186ec0b310f 100644 --- a/addons/repair/XEH_PREP.hpp +++ b/addons/repair/XEH_PREP.hpp @@ -21,7 +21,7 @@ PREP(fullRepairProgress); PREP(getClaimObjects); PREP(getFullRepairTime); PREP(getHitPointString); -PREP(getHitPointsToIgnore); +PREP(getSelectionsToIgnore); PREP(getPatchWheelTime); PREP(getPostRepairDamage); PREP(getRepairItems); diff --git a/addons/repair/functions/fnc_addRepairActions.sqf b/addons/repair/functions/fnc_addRepairActions.sqf index 19191c9c49b..d99c264123c 100644 --- a/addons/repair/functions/fnc_addRepairActions.sqf +++ b/addons/repair/functions/fnc_addRepairActions.sqf @@ -29,8 +29,8 @@ TRACE_2("addRepairActions", _vehicle,_type); private _initializedClasses = GETMVAR(GVAR(initializedClasses),[]); if (_type in _initializedClasses) exitWith {}; -// get hitPoints to ignore -private _hitPointsToIgnore = [_vehicle] call FUNC(getHitPointsToIgnore); +// get selections to ignore +private _selectionsToIgnore = _vehicle call FUNC(getSelectionsToIgnore); // get all hitpoints and selections (getAllHitPointsDamage _vehicle) params [["_hitPoints", []], ["_hitSelections", []]]; // Since 1.82 these are all lower case @@ -41,7 +41,6 @@ private _hitPointsToIgnore = [_vehicle] call FUNC(getHitPointsToIgnore); private _hitPointsAddedNames = []; private _hitPointsAddedStrings = []; private _hitPointsAddedAmount = []; -private _processedSelections = []; private _icon = ["a3\ui_f\data\igui\cfg\actions\repair_ca.paa", "#FFFFFF"]; private _vehCfg = configOf _vehicle; @@ -53,10 +52,14 @@ private _turretPaths = ((fullCrew [_vehicle, "gunner", true]) + (fullCrew [_vehi { private _selection = _x; private _hitpoint = toLower (_hitPoints select _forEachIndex); - if (_selection in _wheelHitSelections) then { - // Wheels should always be unique - if (_selection in _processedSelections) exitWith {TRACE_3("Duplicate Wheel",_hitpoint,_forEachIndex,_selection);}; + // Skip ignored selections + if (_forEachIndex in _selectionsToIgnore) then { + TRACE_3("Skipping ignored hitpoint",_hitpoint,_forEachIndex,_selection); + continue + }; + + if (_selection in _wheelHitSelections) then { private _position = compile format ["_target selectionPosition ['%1', 'HitPoints', 'AveragePoint'];", _selection]; TRACE_3("Adding Wheel Actions",_hitpoint,_forEachIndex,_selection); @@ -90,14 +93,7 @@ private _turretPaths = ((fullCrew [_vehicle, "gunner", true]) + (fullCrew [_vehi private _statement = {[_this select 1, _this select 0, _this select 2 select 0, "PatchWheel"] call DFUNC(repair)}; private _action = [_name, _text, _patchIcon, _statement, _condition, {}, [_hitpoint], _position, 2] call EFUNC(interact_menu,createAction); [_type, 0, [_root], _action] call EFUNC(interact_menu,addActionToClass); - - _processedSelections pushBack _selection; } else { - // Skip ignored hitpoints - if (_hitpoint in _hitPointsToIgnore) exitWith { - TRACE_3("Skipping ignored hitpoint",_hitpoint,_forEachIndex,_selection); - }; - // Some hitpoints do not have a selection but do have an armorComponent value (seems to mainly be RHS) // Ref https://community.bistudio.com/wiki/Arma_3_Damage_Enhancement // this code won't support identically named hitpoints (e.g. commander turret: Duplicate HitPoint name 'HitTurret') @@ -156,8 +152,6 @@ private _turretPaths = ((fullCrew [_vehicle, "gunner", true]) + (fullCrew [_vehi _hitPointsAddedAmount = _trackArray select 2; if (_hitpoint in TRACK_HITPOINTS) then { - // Tracks should always be unique - if (_selection in _processedSelections) exitWith {TRACE_3("Duplicate Track",_hitpoint,_forEachIndex,_selection);}; _position = compile format ["private _return = _target selectionPosition ['%1', 'HitPoints']; _return set [1, 0]; _return", _selection]; TRACE_4("Adding RepairTrack",_hitpoint,_forEachIndex,_selection,_text); private _condition = {[_this select 1, _this select 0, _this select 2 select 0, "RepairTrack"] call DFUNC(canRepair)}; @@ -176,8 +170,6 @@ private _turretPaths = ((fullCrew [_vehicle, "gunner", true]) + (fullCrew [_vehi [_type, 0, [], _action] call EFUNC(interact_menu,addActionToClass); }; }; - - _processedSelections pushBack _selection; }; } forEach _hitSelections; diff --git a/addons/repair/functions/fnc_fullRepairProgress.sqf b/addons/repair/functions/fnc_fullRepairProgress.sqf index b5b11b4d9b6..b021c492c06 100644 --- a/addons/repair/functions/fnc_fullRepairProgress.sqf +++ b/addons/repair/functions/fnc_fullRepairProgress.sqf @@ -32,11 +32,10 @@ if (_totalTime - _elapsedTime > ([_engineer, _vehicle] call FUNC(getFullRepairTi private _allHitPointsDamage = getAllHitPointsDamage _vehicle; _allHitPointsDamage params ["_hitPoints", "", "_damageValues"]; -private _hitPointsToIgnore = [_vehicle] call FUNC(getHitPointsToIgnore); +private _selectionsToIgnore = _vehicle call FUNC(getSelectionsToIgnore); private _firstDamagedIndex = { - private _hitPoint = _hitPoints select _forEachIndex; - if (_x > 0 && {!(_hitPoint in _hitPointsToIgnore)}) exitWith {_forEachIndex}; + if (_x > 0 && {!(_forEachIndex in _selectionsToIgnore)}) exitWith {_forEachIndex}; -1 } forEach _damageValues; diff --git a/addons/repair/functions/fnc_getFullRepairTime.sqf b/addons/repair/functions/fnc_getFullRepairTime.sqf index 4c55ab940aa..a570685328f 100644 --- a/addons/repair/functions/fnc_getFullRepairTime.sqf +++ b/addons/repair/functions/fnc_getFullRepairTime.sqf @@ -21,14 +21,13 @@ params ["_engineer", "_vehicle"]; private _allHitPointsDamage = getAllHitPointsDamage _vehicle; _allHitPointsDamage params ["_hitPoints", "", "_damageValues"]; -private _hitPointsToIgnore = [_vehicle] call FUNC(getHitPointsToIgnore); +private _selectionsToIgnore = _vehicle call FUNC(getSelectionsToIgnore); private _repairsNeeded = 0; private _doExtraRepair = false; { if (_x <= 0) then {continue}; // skip hitpoints that don't need repairs - private _hitPoint = _hitPoints select _forEachIndex; - if (_hitPoint in _hitPointsToIgnore) then { // only add extra repair for ignore hitpoints if they're damaged + if (_forEachIndex in _selectionsToIgnore) then { // only add extra repair for ignore hitpoints if they're damaged _doExtraRepair = true; continue }; diff --git a/addons/repair/functions/fnc_getHitPointsToIgnore.sqf b/addons/repair/functions/fnc_getSelectionsToIgnore.sqf similarity index 78% rename from addons/repair/functions/fnc_getHitPointsToIgnore.sqf rename to addons/repair/functions/fnc_getSelectionsToIgnore.sqf index 0db46db76f1..d455950a3bd 100644 --- a/addons/repair/functions/fnc_getHitPointsToIgnore.sqf +++ b/addons/repair/functions/fnc_getSelectionsToIgnore.sqf @@ -10,7 +10,7 @@ * HitPoints to ignore * * Example: - * [vehicle] call ace_repair_fnc_getHitpointsToIgnore + * [vehicle] call ace_repair_fnc_getSelectionsToIgnore * * Public: No */ @@ -18,7 +18,7 @@ params ["_vehicle"]; private _type = typeOf _vehicle; -TRACE_2("getHitPointsToIgnore",_vehicle,_type); +TRACE_2("getSelectionsToIgnore",_vehicle,_type); private _initializedClasses = missionNamespace getVariable [QGVAR(hitPointsToIgnoreInitializedClasses), createHashMap]; if (_type in _initializedClasses) exitWith {_initializedClasses get _type}; @@ -30,7 +30,7 @@ private _turretPaths = ((fullCrew [_vehicle, "gunner", true]) + (fullCrew [_vehi // get hitpoints of wheels with their selections ([_vehicle] call FUNC(getWheelHitPointsWithSelections)) params ["_wheelHitPoints", "_wheelHitSelections"]; -private _hitPointsToIgnore = [""]; // always ignore empty hitpoints +private _indexesToIgnore = []; private _processedSelections = []; { @@ -39,6 +39,7 @@ private _processedSelections = []; private _isWheelOrTrack = _selection in _wheelHitSelections || {_hitpoint in _wheelHitPoints} || {_hitpoint in TRACK_HITPOINTS}; if (_hitpoint isEqualTo "") then { // skip empty hitpoint + _indexesToIgnore pushBack _forEachIndex; continue }; @@ -47,7 +48,7 @@ private _processedSelections = []; /*#ifdef DEBUG_MODE_FULL systemChat format ["Skipping duplicate wheel, hitpoint %1, index %2, selection %3", _hitpoint, _forEachIndex, _selection]; #endif*/ - _hitPointsToIgnore pushBackUnique _hitpoint; + _indexesToIgnore pushBack _forEachIndex; _processedSelections pushBack _selection; continue }; @@ -57,7 +58,7 @@ private _processedSelections = []; /*#ifdef DEBUG_MODE_FULL systemChat format ["Skipping glass, hitpoint %1, index %2, selection %3", _hitpoint, _forEachIndex, _selection]; #endif*/ - _hitPointsToIgnore pushBackUnique _hitpoint; + _indexesToIgnore pushBack _forEachIndex; _processedSelections pushBack _selection; continue }; @@ -67,7 +68,7 @@ private _processedSelections = []; /*#ifdef DEBUG_MODE_FULL systemChat format ["Skipping ERA/SLAT, hitpoint %1, index %2, selection %3", _hitpoint, _forEachIndex, _selection]; #endif*/ - _hitPointsToIgnore pushBackUnique _hitpoint; + _indexesToIgnore pushBack _forEachIndex; _processedSelections pushBack _selection; continue }; @@ -79,16 +80,29 @@ private _processedSelections = []; private _hitpointsCfg = "configName _x == _hitpoint" configClasses _turretHitpointCfg; if (_hitpointsCfg isNotEqualTo []) exitWith { TRACE_2("turret hitpoint configFound",_hitpoint,_x); + _hitpointsCfg = _hitpointsCfg # 0; // only do turret hitpoints and stuff linked to visuals - if ((_hitpoint in ["hitturret", "hitgun"]) || {(getNumber (_hitpointsCfg # 0 >> "isGun")) == 1} || {(getNumber (_hitpointsCfg # 0 >> "isTurret")) == 1} || {(getText (_hitpointsCfg # 0 >> "visual")) != ""}) then { - _armorComponent = getText (_hitpointsCfg # 0 >> "armorComponent"); + if ( + (_hitpoint in ["hitturret", "hitgun"]) || + {(getNumber (_hitpointsCfg >> "isGun")) == 1} || + {(getNumber (_hitpointsCfg >> "isTurret")) == 1} || + {(getText (_hitpointsCfg >> "visual")) != ""} + ) then { + _armorComponent = getText (_hitpointsCfg >> "armorComponent"); }; }; } forEach _turretPaths; if (_armorComponent == "") then { private _hitpointsCfg = "configName _x == _hitpoint" configClasses (_vehCfg >> "HitPoints"); - if (_hitpointsCfg isNotEqualTo [] && {(getText (_hitpointsCfg # 0 >> "visual")) != ""}) then { - _armorComponent = getText (_hitpointsCfg # 0 >> "armorComponent"); + if (_hitpointsCfg isNotEqualTo []) then { + _hitpointsCfg = _hitpointsCfg # 0; + if ( + (getNumber (_hitpointsCfg >> "isGun")) == 1 || + {(getNumber (_hitpointsCfg >> "isTurret")) == 1} || + {(getText (_hitpointsCfg >> "visual")) != ""} + ) then { + _armorComponent = getText (_hitpointsCfg >> "armorComponent"); + }; }; }; }; @@ -98,7 +112,7 @@ private _processedSelections = []; /*#ifdef DEBUG_MODE_FULL systemChat format ["Skipping no selection OR armor component, hitpoint %1, index %2, selection %3", _hitpoint, _forEachIndex, _selection]; #endif*/ - _hitPointsToIgnore pushBackUnique _hitpoint; + _indexesToIgnore pushBack _forEachIndex; _processedSelections pushBack _selection; continue }; @@ -115,7 +129,7 @@ private _processedSelections = []; ERROR_1("group: %1",_hitpointGroups # _groupIndex); }; - _hitPointsToIgnore pushBackUnique _hitpoint; + _indexesToIgnore pushBack _forEachIndex; _processedSelections pushBack _selection; continue }; @@ -125,7 +139,7 @@ private _processedSelections = []; /*#ifdef DEBUG_MODE_FULL systemChat format ["Skipping child hitpoint, hitpoint %1, index %2, selection %3", _hitpoint, _forEachIndex, _selection]; #endif*/ - _hitPointsToIgnore pushBackUnique _hitpoint; + _indexesToIgnore pushBack _forEachIndex; _processedSelections pushBack _selection; continue }; @@ -133,7 +147,7 @@ private _processedSelections = []; _processedSelections pushBack _selection; } forEach _hitSelections; -_initializedClasses set [_type, _hitPointsToIgnore]; +_initializedClasses set [_type, _indexesToIgnore]; missionNamespace setVariable [QGVAR(hitPointsToIgnoreInitializedClasses), _initializedClasses]; -_hitPointsToIgnore +_indexesToIgnore