diff --git a/addons/field_rations/CfgWeapons.hpp b/addons/field_rations/CfgWeapons.hpp
index 760d41290f..b100ba4e90 100644
--- a/addons/field_rations/CfgWeapons.hpp
+++ b/addons/field_rations/CfgWeapons.hpp
@@ -40,6 +40,7 @@ class CfgWeapons {
XGVAR(replacementItem) = "ACE_WaterBottle_Half";
XGVAR(consumeAnims)[] = {QGVAR(drinkStand), QGVAR(drinkCrouch), QGVAR(drinkProne)};
XGVAR(consumeSounds)[] = {QGVAR(drink1), QGVAR(drink1), QGVAR(drink2)};
+ ACE_isFieldRationItem = 1;
};
class ACE_WaterBottle_Half: ACE_WaterBottle {
@@ -87,6 +88,7 @@ class CfgWeapons {
XGVAR(replacementItem) = "ACE_Canteen_Half";
XGVAR(consumeAnims)[] = {QGVAR(drinkStand), QGVAR(drinkCrouch), QGVAR(drinkProne)};
XGVAR(consumeSounds)[] = {QGVAR(drink1), QGVAR(drink1), QGVAR(drink2)};
+ ACE_isFieldRationItem = 1;
};
class ACE_Canteen_Half: ACE_Canteen {
@@ -132,6 +134,7 @@ class CfgWeapons {
XGVAR(consumeText) = CSTRING(DrinkingX);
XGVAR(consumeAnims)[] = {QGVAR(drinkStandCan), QGVAR(drinkCrouchCan), QGVAR(drinkProneCan)};
XGVAR(consumeSounds)[] = {QGVAR(drinkCan1), QGVAR(drinkCan1), QGVAR(drinkCan2)};
+ ACE_isFieldRationItem = 1;
};
class ACE_Can_Franta: ACE_Can_Spirit {
@@ -164,6 +167,7 @@ class CfgWeapons {
XGVAR(consumeTime) = 10;
XGVAR(hungerSatiated) = 20;
XGVAR(consumeText) = CSTRING(EatingX);
+ ACE_isFieldRationItem = 1;
};
class ACE_MRE_BeefStew: ACE_MRE_LambCurry {
@@ -225,7 +229,7 @@ class CfgWeapons {
model = QPATHTOF(data\mre_human.p3d);
picture = QPATHTOF(ui\item_mre_human_co.paa);
};
-
+
// - Misc Food ------------------------------------------------------------
class ACE_Sunflower_Seeds: ACE_ItemCore {
author = ECSTRING(common,ACETeam);
@@ -240,5 +244,6 @@ class CfgWeapons {
XGVAR(consumeTime) = 10;
XGVAR(hungerSatiated) = 10;
XGVAR(consumeText) = CSTRING(EatingX);
+ ACE_isFieldRationItem = 1;
};
};
diff --git a/addons/field_rations/XEH_PREP.hpp b/addons/field_rations/XEH_PREP.hpp
index 68833a495b..2035345f47 100644
--- a/addons/field_rations/XEH_PREP.hpp
+++ b/addons/field_rations/XEH_PREP.hpp
@@ -14,5 +14,6 @@ ACEX_PREP(handleEffects);
ACEX_PREP(handleHUD);
ACEX_PREP(handleRespawn);
ACEX_PREP(refillItem);
+ACEX_PREP(scanFieldRations);
ACEX_PREP(setRemainingWater);
ACEX_PREP(update);
diff --git a/addons/field_rations/XEH_preInit.sqf b/addons/field_rations/XEH_preInit.sqf
index c4efb567ed..ede921483e 100644
--- a/addons/field_rations/XEH_preInit.sqf
+++ b/addons/field_rations/XEH_preInit.sqf
@@ -8,6 +8,8 @@ PREP_RECOMPILE_END;
#include "initSettings.sqf"
+#define ARSENAL_CATEGORY_ICON QPATHTOF(ui\icon_survival.paa)
+
// Init arrays of status modifiers
GVAR(thirstModifiers) = [];
GVAR(hungerModifiers) = [];
@@ -18,4 +20,9 @@ GVAR(waterSourceP3Ds) = _cache select 0;
// List of refill action offsets corresponding to the p3ds in the array above
GVAR(waterSourceOffsets) = _cache select 1;
+// Custom Arsenal Tab
+if (["ace_arsenal"] call EFUNC(common,isModLoaded)) then {
+ [keys FIELD_RATIONS_ITEMS, LLSTRING(DisplayName), ARSENAL_CATEGORY_ICON] call EFUNC(arsenal,addRightPanelButton);
+};
+
ADDON = true;
diff --git a/addons/field_rations/XEH_preStart.sqf b/addons/field_rations/XEH_preStart.sqf
index eec59ff8f7..88109cf9ee 100644
--- a/addons/field_rations/XEH_preStart.sqf
+++ b/addons/field_rations/XEH_preStart.sqf
@@ -30,3 +30,5 @@ private _waterSourceOffsets = [
uiNamespace setVariable [QGVAR(cacheP3Ds), compileFinal str [_waterSourceP3Ds, _waterSourceOffsets]];
TRACE_1("compiled",count _waterSourceP3Ds);
+
+call FUNC(scanFieldRations);
diff --git a/addons/field_rations/functions/fnc_scanFieldRations.sqf b/addons/field_rations/functions/fnc_scanFieldRations.sqf
new file mode 100644
index 0000000000..395b3ba45b
--- /dev/null
+++ b/addons/field_rations/functions/fnc_scanFieldRations.sqf
@@ -0,0 +1,34 @@
+#include "script_component.hpp"
+/*
+ * Author: Salluci
+ * Caches all item classnames used as field rations, their thirst/hunger values, and whether they are treated as magazines
+ *
+ * Arguments:
+ * None
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * call acex_field_rations_fnc_scanFieldRations
+ *
+ * Public: No
+ */
+
+private _list = createHashMap;
+private _cfgWeapons = configFile >> "CfgWeapons";
+private _cfgMagazines = configFile >> "CfgMagazines";
+
+private _fnc_isFieldRationItem = toString {
+ (getNumber (_x >> "ACE_isFieldRationItem") isEqualTo 1) || {(getNumber (_x >> QXGVAR(thirstQuenched))) > 0} || {(getNumber (_x >> QXGVAR(hungerSatiated))) > 0} || {(getText (_x >> QXGVAR(refillItem))) isNotEqualTo ""}
+};
+
+{
+ _list set [configName _x, ""];
+} forEach (_fnc_isFieldRationItem configClasses _cfgWeapons);
+
+{
+ _list set [configName _x, ""];
+} forEach (_fnc_isFieldRationItem configClasses _cfgMagazines);
+
+uiNamespace setVariable [QXGVAR(fieldRationItems), compileFinal str _list];
diff --git a/addons/field_rations/script_component.hpp b/addons/field_rations/script_component.hpp
index 9811493029..bcde75fe9c 100644
--- a/addons/field_rations/script_component.hpp
+++ b/addons/field_rations/script_component.hpp
@@ -33,3 +33,5 @@
#define IDC_DRAINING_HUD_THIRST_ICON 7750
#define IDC_DRAINING_HUD_HUNGER_GROUP 7840
#define IDC_DRAINING_HUD_HUNGER_ICON 7850
+
+#define FIELD_RATIONS_ITEMS (createHashMapFromArray (call (uiNamespace getVariable [QXGVAR(fieldRationItems), {createHashMap}])))
diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml
index c76c312f89..4be9a4029f 100644
--- a/addons/medical/stringtable.xml
+++ b/addons/medical/stringtable.xml
@@ -65,7 +65,7 @@
에피네프린 사용 시 추가 회복 확률
- Increases how often spontaneous wake up checks happen when patient has Epinephrine in their system.
+ When an unconscious patient has Epinephrine in their system, the time between spontaneous wake up checks is divided by this value.
患者がアドレナリンを投与されると自発的に覚醒する確率を上昇させます。
增加因病患的循環系統裡面的腎上腺素自我甦醒的機率。
增加因病患的循环系统里面的肾上腺素自我苏醒的机率。
diff --git a/addons/medical_treatment/CfgWeapons.hpp b/addons/medical_treatment/CfgWeapons.hpp
index fed3184a59..e285697cc1 100644
--- a/addons/medical_treatment/CfgWeapons.hpp
+++ b/addons/medical_treatment/CfgWeapons.hpp
@@ -8,12 +8,14 @@ class CfgWeapons {
class FirstAidKit: ItemCore {
type = 0;
+ ACE_isMedicalItem = 1;
class ItemInfo: InventoryFirstAidKitItem_Base_F {
mass = 4;
};
};
class Medikit: ItemCore {
type = 0;
+ ACE_isMedicalItem = 1;
class ItemInfo: MedikitItem {
mass = 60;
};
@@ -27,6 +29,7 @@ class CfgWeapons {
displayName = CSTRING(Bandage_Basic_Display);
descriptionShort = CSTRING(Bandage_Basic_Desc_Short);
descriptionUse = CSTRING(Bandage_Basic_Desc_Use);
+ ACE_isMedicalItem = 1;
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 1;
};
@@ -39,6 +42,7 @@ class CfgWeapons {
model = QPATHTOF(data\packingbandage.p3d);
descriptionShort = CSTRING(Packing_Bandage_Desc_Short);
descriptionUse = CSTRING(Packing_Bandage_Desc_Use);
+ ACE_isMedicalItem = 1;
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 1;
};
@@ -51,6 +55,7 @@ class CfgWeapons {
model = "\A3\Structures_F_EPA\Items\Medical\Bandage_F.p3d";
descriptionShort = CSTRING(Bandage_Elastic_Desc_Short);
descriptionUse = CSTRING(Bandage_Elastic_Desc_Use);
+ ACE_isMedicalItem = 1;
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 1;
};
@@ -63,6 +68,7 @@ class CfgWeapons {
model = QPATHTOF(data\tourniquet.p3d);
descriptionShort = CSTRING(Tourniquet_Desc_Short);
descriptionUse = CSTRING(Tourniquet_Desc_Use);
+ ACE_isMedicalItem = 1;
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 1;
};
@@ -74,6 +80,7 @@ class CfgWeapons {
picture = QPATHTOF(ui\splint_ca.paa);
model = QPATHTOF(data\splint.p3d);
descriptionShort = CSTRING(splint_Desc_Short);
+ ACE_isMedicalItem = 1;
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 2;
};
@@ -86,6 +93,7 @@ class CfgWeapons {
model = QPATHTOF(data\morphine.p3d);
descriptionShort = CSTRING(Morphine_Desc_Short);
descriptionUse = CSTRING(Morphine_Desc_Use);
+ ACE_isMedicalItem = 1;
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 1;
};
@@ -98,6 +106,7 @@ class CfgWeapons {
model = QPATHTOF(data\adenosine.p3d);
descriptionShort = CSTRING(adenosine_Desc_Short);
descriptionUse = CSTRING(adenosine_Desc_Use);
+ ACE_isMedicalItem = 1;
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 1;
};
@@ -110,6 +119,7 @@ class CfgWeapons {
model = QPATHTOF(data\atropine.p3d);
descriptionShort = CSTRING(Atropine_Desc_Short);
descriptionUse = CSTRING(Atropine_Desc_Use);
+ ACE_isMedicalItem = 1;
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 1;
};
@@ -122,6 +132,7 @@ class CfgWeapons {
model = QPATHTOF(data\epinephrine.p3d);
descriptionShort = CSTRING(Epinephrine_Desc_Short);
descriptionUse = CSTRING(Epinephrine_Desc_Use);
+ ACE_isMedicalItem = 1;
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 1;
};
@@ -137,6 +148,7 @@ class CfgWeapons {
picture = QPATHTOF(ui\plasmaIV_ca.paa);
descriptionShort = CSTRING(Plasma_IV_Desc_Short);
descriptionUse = CSTRING(Plasma_IV_Desc_Use);
+ ACE_isMedicalItem = 1;
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 10;
};
@@ -167,6 +179,7 @@ class CfgWeapons {
hiddenSelectionsTextures[] = {QPATHTOF(data\IVBag_blood_1000ml_ca.paa)};
descriptionShort = CSTRING(Blood_IV_Desc_Short);
descriptionUse = CSTRING(Blood_IV_Desc_Use);
+ ACE_isMedicalItem = 1;
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 10;
};
@@ -197,6 +210,7 @@ class CfgWeapons {
picture = QPATHTOF(ui\salineIV_ca.paa);
descriptionShort = CSTRING(Saline_IV_Desc_Short);
descriptionUse = CSTRING(Saline_IV_Desc_Use);
+ ACE_isMedicalItem = 1;
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 10;
};
@@ -225,6 +239,7 @@ class CfgWeapons {
picture = QPATHTOF(ui\quickclot_ca.paa);
descriptionShort = CSTRING(QuikClot_Desc_Short);
descriptionUse = CSTRING(QuikClot_Desc_Use);
+ ACE_isMedicalItem = 1;
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 1;
};
@@ -236,6 +251,7 @@ class CfgWeapons {
picture = QPATHTOF(ui\personal_aid_kit_ca.paa);
descriptionShort = CSTRING(Aid_Kit_Desc_Short);
descriptionUse = CSTRING(Aid_Kit_Desc_Use);
+ ACE_isMedicalItem = 1;
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 10;
};
@@ -248,6 +264,7 @@ class CfgWeapons {
picture = QPATHTOF(ui\surgicalKit_ca.paa);
descriptionShort = CSTRING(SurgicalKit_Desc_Short);
descriptionUse = CSTRING(SurgicalKit_Desc_Use);
+ ACE_isMedicalItem = 1;
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 15;
};
@@ -260,6 +277,7 @@ class CfgWeapons {
picture = QPATHTOF(ui\suture_ca.paa);
descriptionShort = CSTRING(Suture_Desc_Short);
descriptionUse = CSTRING(Suture_Desc_Use);
+ ACE_isMedicalItem = 1;
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 1;
};
@@ -272,6 +290,7 @@ class CfgWeapons {
picture = QPATHTOF(ui\bodybag_ca.paa);
descriptionShort = CSTRING(Bodybag_Desc_Short);
descriptionUse = CSTRING(Bodybag_Desc_Use);
+ ACE_isMedicalItem = 1;
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 7;
};
diff --git a/addons/medical_treatment/XEH_PREP.hpp b/addons/medical_treatment/XEH_PREP.hpp
index be64563857..ab128aa49c 100644
--- a/addons/medical_treatment/XEH_PREP.hpp
+++ b/addons/medical_treatment/XEH_PREP.hpp
@@ -48,6 +48,7 @@ PREP(medicationLocal);
PREP(onMedicationUsage);
PREP(placeInBodyBag);
PREP(removeBody);
+PREP(scanMedicalItems);
PREP(setTriageStatus);
PREP(splint);
PREP(splintLocal);
diff --git a/addons/medical_treatment/XEH_preInit.sqf b/addons/medical_treatment/XEH_preInit.sqf
index dfb6bf6518..30bf875291 100644
--- a/addons/medical_treatment/XEH_preInit.sqf
+++ b/addons/medical_treatment/XEH_preInit.sqf
@@ -8,6 +8,8 @@ PREP_RECOMPILE_END;
#include "initSettings.sqf"
+#define ARSENAL_CATEGORY_ICON (["\A3\ui_f\data\igui\cfg\actions\heal_ca.paa", QPATHTOEF(medical_gui,data\categories\bandage_fracture.paa)] select (["ace_medical_gui"] call EFUNC(common,isModLoaded)))
+
// config to determine animation acceleration coefficient
// adjusting these is trail and error
// if the animation is cut of ingame, increase these values
@@ -44,4 +46,9 @@ GVAR(facilityClasses) = [];
} forEach getArray _x;
} forEach configProperties [configFile >> QEGVAR(medical,facilities), "isArray _x"];
+// Custom Arsenal tab
+if (["ace_arsenal"] call EFUNC(common,isModLoaded)) then {
+ [MEDICAL_TREATMENT_ITEMS, LELSTRING(medical,Category), ARSENAL_CATEGORY_ICON] call EFUNC(arsenal,addRightPanelButton);
+};
+
ADDON = true;
diff --git a/addons/medical_treatment/XEH_preStart.sqf b/addons/medical_treatment/XEH_preStart.sqf
index 022888575e..27f8f2d9c2 100644
--- a/addons/medical_treatment/XEH_preStart.sqf
+++ b/addons/medical_treatment/XEH_preStart.sqf
@@ -1,3 +1,5 @@
#include "script_component.hpp"
#include "XEH_PREP.hpp"
+
+call FUNC(scanMedicalItems)
diff --git a/addons/medical_treatment/functions/fnc_scanMedicalItems.sqf b/addons/medical_treatment/functions/fnc_scanMedicalItems.sqf
new file mode 100644
index 0000000000..17b2456c42
--- /dev/null
+++ b/addons/medical_treatment/functions/fnc_scanMedicalItems.sqf
@@ -0,0 +1,34 @@
+#include "script_component.hpp"
+/*
+ * Author: Salluci
+ * Caches all item classnames used in ACE_Medical_Treatment_Actions
+ *
+ * Arguments:
+ * None
+ *
+ * Return Value:
+ * None
+ *
+ * Example:
+ * call ace_medical_treatment_fnc_scanMedicalItems
+ *
+ * Public: No
+ */
+
+private _list = [];
+private _cfgActions = configFile >> QGVAR(actions);
+
+private _fnc_isMedicalItem = toString {
+ getNumber (_x >> "ACE_isMedicalItem") isEqualTo 1
+};
+
+// get items in ACE_Medical_Treament_Actions, fallback for items without API config property
+{
+ _list append (getArray (_x >> "items"));
+} forEach ("true" configClasses _cfgActions);
+
+{
+ _list pushBack (configName _x);
+} forEach (_fnc_isMedicalItem configClasses (configFile >> "CfgWeapons"));
+
+uiNamespace setVariable [QGVAR(treatmentItems), compileFinal str (_list arrayIntersect _list)]
diff --git a/addons/medical_treatment/script_component.hpp b/addons/medical_treatment/script_component.hpp
index 682e8a471c..36173d4ac1 100644
--- a/addons/medical_treatment/script_component.hpp
+++ b/addons/medical_treatment/script_component.hpp
@@ -54,3 +54,5 @@
// Animations that would be played faster than this are instead skipped. (= Progress bar too quick for animation).
#define ANIMATION_SPEED_MAX_COEFFICIENT 2.5
+
+#define MEDICAL_TREATMENT_ITEMS (call (uiNamespace getVariable [QGVAR(treatmentItems), {[]}]))
diff --git a/addons/repair/ACE_Repair.hpp b/addons/repair/ACE_Repair.hpp
index ae436791ad..344c509b2f 100644
--- a/addons/repair/ACE_Repair.hpp
+++ b/addons/repair/ACE_Repair.hpp
@@ -3,10 +3,11 @@ class ACE_Repair {
class ReplaceWheel {
displayName = CSTRING(ReplaceWheel);
displayNameProgress = CSTRING(ReplacingWheel);
+ forceDisplayName = 0;
repairLocations[] = {"All"};
requiredEngineer = QGVAR(engineerSetting_Wheel);
- repairingTime = 10;
+ repairingTime = QGVAR(wheelChangeTime);
repairingTimeSelfCoef = 1;
items = QGVAR(wheelRepairRequiredItems);
condition = QFUNC(canReplaceWheel);
@@ -21,6 +22,7 @@ class ACE_Repair {
animationCallerProne = "Acts_carFixingWheel";
animationCallerSelf = "Acts_carFixingWheel";
animationCallerSelfProne = "Acts_carFixingWheel";
+ loopAnimation = 0;
litter[] = {};
};
class RemoveWheel: ReplaceWheel {
@@ -46,7 +48,7 @@ class ACE_Repair {
displayNameProgress = CSTRING(RepairingHitPoint);
condition = QFUNC(canMiscRepair);
requiredEngineer = QGVAR(engineerSetting_Repair);
- repairingTime = 15;
+ repairingTime = QGVAR(miscRepairTime);
callbackSuccess = QFUNC(doRepair);
items = QGVAR(miscRepairRequiredItems);
itemConsumed = QGVAR(consumeItem_ToolKit);
@@ -80,11 +82,14 @@ class ACE_Repair {
class FullRepair: MiscRepair {
displayName = CSTRING(fullRepair);
displayNameProgress = CSTRING(fullyRepairing);
+ forceDisplayName = 1;
+ loopAnimation = 1;
requiredEngineer = QGVAR(engineerSetting_fullRepair);
repairLocations[] = {QGVAR(fullRepairLocation)};
- repairingTime = 30;
- condition = "-1 != ((getAllHitPointsDamage _target param [2,[]]) findIf {_x > 0})";
+ repairingTime = QFUNC(getFullRepairTime);
+ condition = "((getAllHitPointsDamage _target) select 2) findIf {_x > 0} != -1";
callbackSuccess = QFUNC(doFullRepair);
+ callbackProgress = QFUNC(fullRepairProgress);
items = QGVAR(fullRepairRequiredItems);
itemConsumed = QGVAR(consumeItem_ToolKit);
};
diff --git a/addons/repair/XEH_PREP.hpp b/addons/repair/XEH_PREP.hpp
index 7c82632f87..ea9e40a4e7 100644
--- a/addons/repair/XEH_PREP.hpp
+++ b/addons/repair/XEH_PREP.hpp
@@ -17,8 +17,11 @@ PREP(doRepair);
PREP(doRepairTrack);
PREP(doReplaceTrack);
PREP(doReplaceWheel);
+PREP(fullRepairProgress);
PREP(getClaimObjects);
+PREP(getFullRepairTime);
PREP(getHitPointString);
+PREP(getHitPointsToIgnore);
PREP(getPatchWheelTime);
PREP(getPostRepairDamage);
PREP(getRepairItems);
diff --git a/addons/repair/functions/fnc_addRepairActions.sqf b/addons/repair/functions/fnc_addRepairActions.sqf
index f78863985d..20607ca940 100644
--- a/addons/repair/functions/fnc_addRepairActions.sqf
+++ b/addons/repair/functions/fnc_addRepairActions.sqf
@@ -25,6 +25,9 @@ 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 all hitpoints and selections
(getAllHitPointsDamage _vehicle) params [["_hitPoints", []], ["_hitSelections", []]]; // Since 1.82 these are all lower case
@@ -40,8 +43,6 @@ private _icon = ["a3\ui_f\data\igui\cfg\actions\repair_ca.paa", "#FFFFFF"];
private _vehCfg = configOf _vehicle;
// Custom position can be defined via config for associated hitpoint
private _hitpointPositions = getArray (_vehCfg >> QGVAR(hitpointPositions));
-// Associated hitpoints can be grouped via config to produce a single repair action
-private _hitpointGroups = getArray (_vehCfg >> QGVAR(hitpointGroups));
// Get turret paths
private _turretPaths = ((fullCrew [_vehicle, "gunner", true]) + (fullCrew [_vehicle, "commander", true])) apply {_x # 3};
@@ -88,59 +89,32 @@ private _turretPaths = ((fullCrew [_vehicle, "gunner", true]) + (fullCrew [_vehi
_processedSelections pushBack _selection;
} else {
- // Empty hitpoints don't contain enough information
- if (_hitpoint isEqualTo "") exitWith { TRACE_3("Skipping Empty Hit",_hitpoint,_forEachIndex,_selection); };
- // Ignore glass hitpoints
- if ((_hitpoint find "glass") != -1) exitWith { TRACE_3("Skipping Glass",_hitpoint,_forEachIndex,_selection); };
- // Ignore hitpoints starting with # (seems to be lights)
- if ((_hitpoint select [0,1]) == "#") exitWith { TRACE_3("Skipping # hit",_hitpoint,_forEachIndex,_selection); };
- // Ignore ERA/Slat armor (vanilla uses hitera_/hitslat_, pre-1.82 RHS uses era_)
- // ToDo: see how community utilizes new armor system, could also check getText (_hitpointConfig >> "simulation")
- if (((_hitpoint select [0,7]) == "hitera_") || {(_hitpoint select [0,8]) == "hitslat_"} || {(_hitpoint select [0,4]) == "era_"}) exitWith { TRACE_3("Skipping ERA/SLAT",_hitpoint,_forEachIndex,_selection); };
+ // 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')
private _armorComponent = "";
if (_selection == "") then {
- {
- private _turretHitpointCfg = ([_vehCfg, _x] call CBA_fnc_getTurret) >> "HitPoints";
- private _hitpointsCfg = "configName _x == _hitpoint" configClasses _turretHitpointCfg;
- if (_hitpointsCfg isNotEqualTo []) exitWith {
- TRACE_2("turret hitpoint configFound",_hitpoint,_x);
- // only do turret hitpoints or stuff linked to visuals for now or we apparently get some weird stuff
- if ((_hitpoint in ["hitturret", "hitgun"]) || {(getNumber (_hitpointsCfg # 0 >> "isGun")) == 1} || {(getNumber (_hitpointsCfg # 0 >> "isTurret")) == 1} || {(getText (_hitpointsCfg # 0 >> "visual")) != ""}) then {
+ private _hitpointsCfg = "configName _x == _hitpoint" configClasses (_vehCfg >> "HitPoints");
+ if (_hitpointsCfg isNotEqualTo []) then {
+ _armorComponent = getText (_hitpointsCfg # 0 >> "armorComponent");
+ };
+ if (_armorComponent == "") then {
+ {
+ private _turretHitpointCfg = ([_vehCfg, _x] call CBA_fnc_getTurret) >> "HitPoints";
+ private _hitpointsCfg = "configName _x == _hitpoint" configClasses _turretHitpointCfg;
+ if (_hitpointsCfg isNotEqualTo []) exitWith {
+ TRACE_2("turret hitpoint configFound",_hitpoint,_x);
_armorComponent = getText (_hitpointsCfg # 0 >> "armorComponent");
};
- };
- } forEach _turretPaths;
- if (_armorComponent == "") then {
- private _hitpointsCfg = "configName _x == _hitpoint" configClasses (_vehCfg >> "HitPoints");
- if ((getText (_hitpointsCfg # 0 >> "visual")) != "") then {
- _armorComponent = getText (_hitpointsCfg # 0 >> "armorComponent");
- };
+ } forEach _turretPaths;
};
if (_armorComponent != "") then { INFO_3("%1: %2 no selection: using armorComponent %3",_type,_hitpoint,_armorComponent); };
};
- if ((_selection == "") && {_armorComponent == ""}) exitWith { TRACE_3("Skipping no selection OR armor component",_hitpoint,_forEachIndex,_selection); };
-
-
- //Depends hitpoints shouldn't be modified directly (will be normalized)
- // Biki: Clearing 'depends' in case of inheritance cannot be an empty string (rpt warnings), but rather a "0" value.
- if (!((getText (_vehCfg >> "HitPoints" >> _hitpoint >> "depends")) in ["", "0"])) exitWith {
- TRACE_3("Skip Depends",_hitpoint,_forEachIndex,_selection);
- };
-
- private _childHitPoint = false;
- {
- {
- if (_hitpoint == _x) exitWith {
- _childHitPoint = true;
- };
- } forEach (_x select 1);
- } forEach _hitpointGroups;
- // If the current selection is associated with a child hitpoint, then skip
- if (_childHitPoint) exitWith { TRACE_3("childHitpoint",_hitpoint,_forEachIndex,_selection); };
// Find the action position
private _position = compile format ["_target selectionPosition ['%1', 'HitPoints'];", _selection];
diff --git a/addons/repair/functions/fnc_doRepair.sqf b/addons/repair/functions/fnc_doRepair.sqf
index 1b6f497d8e..2874eaf2f8 100644
--- a/addons/repair/functions/fnc_doRepair.sqf
+++ b/addons/repair/functions/fnc_doRepair.sqf
@@ -7,6 +7,7 @@
* 0: Unit that does the repairing
+
+ Full Repair Time Coefficient
+
+
+ Modifies how long it takes to perform a Full Repair.\nThe repair time is based on based on the amount of repairs needed for each part, including those normally inaccessible.
+
Boost engineer training when in repair vehicles or facilities. Untrained becomes engineer, engineer becomes advanced engineer.
Améliore les compétences en ingénierie des unités en fonction du lieu où elles se trouvent ; notamment dans les véhicules de réparation ou les ateliers.\nUn soldat non formé devient ingénieur, un ingénieur devient ingénieur avancé.
@@ -1285,7 +1291,7 @@
維修門檻
- What is the maximum damage that can be repaired with a toolkit?
+ Maximum damage to which a part can be repaired with a toolkit.\n0% means all damage can be repaired.
Der maximale Schaden, der von einem Reperatursatz behoben werden kann?
Jaki jest maksymalny poziom uszkodzeń jaki może zostać naprawiony przy pomocy narzędzi?
Qual é o dano máximo que pode ser reparado com um kit de ferramentas?
@@ -1315,7 +1321,7 @@
維修門檻 (工兵)
- What is the maximum damage that can be repaired by an engineer?
+ Maximum damage to which a part can be repaired by an engineer above the minimum level required for the repair.\n0% means all damage can be repaired.
Der maximale Schaden, der von einem Pionier behoben werden kann?
Jaki jest maksymalny poziom uszkodzeń jaki może zostać naprawiony przez mechanika?
Qual é o dano máximo que pode ser reparado com um engenheiro?
@@ -1860,7 +1866,7 @@
選擇的備件數量
- Wheel Repair Requirements
+ Wheel Change Requirements
Bedingungen für die Reifenreperatur
Wym. naprawy kół
Requisitos de reparación de ruedas
@@ -2062,6 +2068,18 @@
Apagar el motor automáticamente al efectuar una reparación
수리 시 엔진을 자동으로 끕니다.
+
+ Part Repair Time
+
+
+ Time in seconds to complete a repair.
+
+
+ Wheel Change Time
+
+
+ Time in seconds to remove or change a wheel.
+
Patch Wheel
Radflicken
@@ -2071,16 +2089,16 @@
Radflicken...
- Patch wheel time
+ Wheel Patch Time
Time it takes to patch a wheel by 5%.
- Patch wheel maximum repair
+ Patch Wheel Threshold
- Maximum level a wheel can be patched.
+ Maximum level to which a wheel can be patched.
Wheel Patch Location
diff --git a/docs/wiki/framework/field-rations-framework.md b/docs/wiki/framework/field-rations-framework.md
index 54d2b22e90..bc433e7d52 100644
--- a/docs/wiki/framework/field-rations-framework.md
+++ b/docs/wiki/framework/field-rations-framework.md
@@ -28,6 +28,7 @@ Config Name | Type | Description
`acex_field_rations_refillItem` | String | Makes an item refillable, class name of item added when refilled (OPTIONAL)
`acex_field_rations_refillAmount` | Number | Amount of water required to refill item (OPTIONAL)
`acex_field_rations_refillTime` | Number | Time required to refill item (in seconds) (OPTIONAL)
+`ACE_isFieldRationItem` | Number | Force adds the item to the ACE Field Rations category in ACE Arsenal (OPTIONAL)
_* Value range is 0 to 100 and can be modified by the corresponding coefficient setting._
diff --git a/docs/wiki/framework/medical-treatment-framework.md b/docs/wiki/framework/medical-treatment-framework.md
index a3f5d04de1..adb9cd485d 100644
--- a/docs/wiki/framework/medical-treatment-framework.md
+++ b/docs/wiki/framework/medical-treatment-framework.md
@@ -38,3 +38,21 @@ class CfgVehicles {
};
};
```
+### 1.3 Treatment Items
+
+Items in `CfgWeapons` with `ACE_isMedicalItem` property will be added to the ACE Medical category in the ACE Arsenal.
+```cpp
+class CfgWeapons {
+ class MyMedicalItem {
+ ACE_isMedicalItem = 1;
+ };
+};
+```
+Required items in `ACE_Medical_Treatment_Actions` will also be added as a fallback.
+```cpp
+class ACE_Medical_Treatment_Actions {
+ class MyCustomTreatment {
+ items[] = {"MyMedicalItem"};
+ };
+};
+```