From 2fe1c13117e982ced86baf826497ae3641b9f694 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Tue, 5 Nov 2024 01:14:07 +0100 Subject: [PATCH 001/305] Docs - Fixed Typo https://github.com/acemod/ACE3/blob/1e404cf85b2af8ad575c5f053fe0205e9ffa2470/addons/repair/functions/fnc_isEngineer.sqf This function is public api, this here should be too --- addons/medical_treatment/functions/fnc_isMedic.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical_treatment/functions/fnc_isMedic.sqf b/addons/medical_treatment/functions/fnc_isMedic.sqf index 7e1360e5ede..3b2a0cb59e6 100644 --- a/addons/medical_treatment/functions/fnc_isMedic.sqf +++ b/addons/medical_treatment/functions/fnc_isMedic.sqf @@ -14,7 +14,7 @@ * Example: * [player] call ace_medical_treatment_fnc_isMedic * - * Public: No + * Public: Yes */ params ["_unit", ["_medicN", 1]]; From d4c91a584403d6e01220f8e14bd79f70b78746c6 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Fri, 8 Nov 2024 00:05:32 +0100 Subject: [PATCH 002/305] Revert "Docs - Fixed Typo" This reverts commit ed96e360d0324f13d6ef4627e1115037afa365cf. --- addons/medical_treatment/functions/fnc_isMedic.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical_treatment/functions/fnc_isMedic.sqf b/addons/medical_treatment/functions/fnc_isMedic.sqf index 3b2a0cb59e6..7e1360e5ede 100644 --- a/addons/medical_treatment/functions/fnc_isMedic.sqf +++ b/addons/medical_treatment/functions/fnc_isMedic.sqf @@ -14,7 +14,7 @@ * Example: * [player] call ace_medical_treatment_fnc_isMedic * - * Public: Yes + * Public: No */ params ["_unit", ["_medicN", 1]]; From 612bfd0cbff1f04edf35e8626cf67a5a7018ac92 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 27 Dec 2024 02:06:47 +0100 Subject: [PATCH 003/305] init --- addons/wardrobe/$PBOPREFIX$ | 1 + addons/wardrobe/Baseclass.hpp | 39 +++++ addons/wardrobe/CfgFunctions.hpp | 69 +++++++++ addons/wardrobe/CfgVehicles.hpp | 17 +++ addons/wardrobe/TODO/gm/$PBOPREFIX$ | 1 + addons/wardrobe/TODO/gm/CfgWardrobe.hpp | 17 +++ addons/wardrobe/TODO/gm/Helmets.hpp | 14 ++ addons/wardrobe/TODO/gm/Uniforms.hpp | 82 +++++++++++ addons/wardrobe/TODO/gm/config.cpp | 35 +++++ addons/wardrobe/TODO/gm/notes.md | 4 + addons/wardrobe/TODO/gm/script_component.hpp | 9 ++ addons/wardrobe/TODO/rf/$PBOPREFIX$ | 1 + addons/wardrobe/TODO/rf/CfgWardrobe.hpp | 21 +++ addons/wardrobe/TODO/rf/Helmets.hpp | 24 +++ addons/wardrobe/TODO/rf/Uniforms.hpp | 23 +++ addons/wardrobe/TODO/rf/config.cpp | 35 +++++ addons/wardrobe/TODO/rf/notes.md | 4 + addons/wardrobe/TODO/rf/script_component.hpp | 9 ++ addons/wardrobe/TODO/vanilla/$PBOPREFIX$ | 1 + addons/wardrobe/TODO/vanilla/CfgWardrobe.hpp | 10 ++ addons/wardrobe/TODO/vanilla/Uniforms.hpp | 23 +++ addons/wardrobe/TODO/vanilla/config.cpp | 35 +++++ .../TODO/vanilla/script_component.hpp | 9 ++ addons/wardrobe/TODO/vn/$PBOPREFIX$ | 1 + addons/wardrobe/TODO/vn/Booniehats.hpp | 45 ++++++ addons/wardrobe/TODO/vn/CfgWardrobe.hpp | 20 +++ addons/wardrobe/TODO/vn/Pilothelmets.hpp | 47 ++++++ addons/wardrobe/TODO/vn/Uniforms_B.hpp | 63 ++++++++ addons/wardrobe/TODO/vn/Uniforms_O.hpp | 85 +++++++++++ addons/wardrobe/TODO/vn/config.cpp | 35 +++++ addons/wardrobe/TODO/vn/notes.md | 4 + addons/wardrobe/TODO/vn/script_component.hpp | 8 + .../TODO/vn/vn_uniform_fix/Uniforms.hpp | 21 +++ .../TODO/vn/vn_uniform_fix/config.cpp | 38 +++++ .../vn/vn_uniform_fix/script_component.hpp | 9 ++ addons/wardrobe/TODO/ws/$PBOPREFIX$ | 1 + addons/wardrobe/TODO/ws/CfgWardrobe.hpp | 12 ++ addons/wardrobe/TODO/ws/Turbans.hpp | 34 +++++ addons/wardrobe/TODO/ws/config.cpp | 35 +++++ addons/wardrobe/TODO/ws/notes.md | 4 + addons/wardrobe/TODO/ws/script_component.hpp | 9 ++ addons/wardrobe/XEH/CfgXEH.hpp | 6 + addons/wardrobe/XEH/XEH_preInit.sqf | 39 +++++ addons/wardrobe/config.cpp | 40 +++++ .../ace_intel/fn_getIndexFromMagID.sqf | 24 +++ .../functions/ace_intel/fn_getMagIDs.sqf | 26 ++++ .../ace_intel/fn_setIndexForMagID.sqf | 25 ++++ .../functions/action/fn_addActions.sqf | 49 ++++++ .../action/fn_addActions_children.sqf | 51 +++++++ .../action/fn_addActions_condition.sqf | 20 +++ .../functions/action/fn_getAction_Icon.sqf | 22 +++ .../functions/action/fn_getAction_Name.sqf | 22 +++ .../functions/cache/fn_cache_clear.sqf | 26 ++++ .../wardrobe/functions/cache/fn_cache_db.sqf | 27 ++++ .../wardrobe/functions/cache/fn_cache_get.sqf | 24 +++ .../wardrobe/functions/cache/fn_cache_set.sqf | 26 ++++ addons/wardrobe/functions/fn_checkItem.sqf | 25 ++++ addons/wardrobe/functions/fn_clearOnClose.sqf | 39 +++++ .../functions/fn_getCfgDataRandom.sqf | 25 ++++ addons/wardrobe/functions/fn_postInit.sqf | 18 +++ addons/wardrobe/functions/fn_say3d.sqf | 35 +++++ .../functions/getItems/fn_getItems_all.sqf | 30 ++++ .../getItems/fn_getItems_modifiable_all.sqf | 35 +++++ .../fn_getItems_modifiable_current.sqf | 36 +++++ .../wardrobe/functions/replace/fn_replace.sqf | 81 ++++++++++ .../functions/replace/fn_replace_facewear.sqf | 23 +++ .../functions/replace/fn_replace_headgear.sqf | 23 +++ .../functions/replace/fn_replace_uniform.sqf | 54 +++++++ addons/wardrobe/script_component.hpp | 18 +++ addons/wardrobe/script_macros_zrn.hpp | 139 ++++++++++++++++++ addons/wardrobe/stringtable.xml | 63 ++++++++ 71 files changed, 2025 insertions(+) create mode 100644 addons/wardrobe/$PBOPREFIX$ create mode 100644 addons/wardrobe/Baseclass.hpp create mode 100644 addons/wardrobe/CfgFunctions.hpp create mode 100644 addons/wardrobe/CfgVehicles.hpp create mode 100644 addons/wardrobe/TODO/gm/$PBOPREFIX$ create mode 100644 addons/wardrobe/TODO/gm/CfgWardrobe.hpp create mode 100644 addons/wardrobe/TODO/gm/Helmets.hpp create mode 100644 addons/wardrobe/TODO/gm/Uniforms.hpp create mode 100644 addons/wardrobe/TODO/gm/config.cpp create mode 100644 addons/wardrobe/TODO/gm/notes.md create mode 100644 addons/wardrobe/TODO/gm/script_component.hpp create mode 100644 addons/wardrobe/TODO/rf/$PBOPREFIX$ create mode 100644 addons/wardrobe/TODO/rf/CfgWardrobe.hpp create mode 100644 addons/wardrobe/TODO/rf/Helmets.hpp create mode 100644 addons/wardrobe/TODO/rf/Uniforms.hpp create mode 100644 addons/wardrobe/TODO/rf/config.cpp create mode 100644 addons/wardrobe/TODO/rf/notes.md create mode 100644 addons/wardrobe/TODO/rf/script_component.hpp create mode 100644 addons/wardrobe/TODO/vanilla/$PBOPREFIX$ create mode 100644 addons/wardrobe/TODO/vanilla/CfgWardrobe.hpp create mode 100644 addons/wardrobe/TODO/vanilla/Uniforms.hpp create mode 100644 addons/wardrobe/TODO/vanilla/config.cpp create mode 100644 addons/wardrobe/TODO/vanilla/script_component.hpp create mode 100644 addons/wardrobe/TODO/vn/$PBOPREFIX$ create mode 100644 addons/wardrobe/TODO/vn/Booniehats.hpp create mode 100644 addons/wardrobe/TODO/vn/CfgWardrobe.hpp create mode 100644 addons/wardrobe/TODO/vn/Pilothelmets.hpp create mode 100644 addons/wardrobe/TODO/vn/Uniforms_B.hpp create mode 100644 addons/wardrobe/TODO/vn/Uniforms_O.hpp create mode 100644 addons/wardrobe/TODO/vn/config.cpp create mode 100644 addons/wardrobe/TODO/vn/notes.md create mode 100644 addons/wardrobe/TODO/vn/script_component.hpp create mode 100644 addons/wardrobe/TODO/vn/vn_uniform_fix/Uniforms.hpp create mode 100644 addons/wardrobe/TODO/vn/vn_uniform_fix/config.cpp create mode 100644 addons/wardrobe/TODO/vn/vn_uniform_fix/script_component.hpp create mode 100644 addons/wardrobe/TODO/ws/$PBOPREFIX$ create mode 100644 addons/wardrobe/TODO/ws/CfgWardrobe.hpp create mode 100644 addons/wardrobe/TODO/ws/Turbans.hpp create mode 100644 addons/wardrobe/TODO/ws/config.cpp create mode 100644 addons/wardrobe/TODO/ws/notes.md create mode 100644 addons/wardrobe/TODO/ws/script_component.hpp create mode 100644 addons/wardrobe/XEH/CfgXEH.hpp create mode 100644 addons/wardrobe/XEH/XEH_preInit.sqf create mode 100644 addons/wardrobe/config.cpp create mode 100644 addons/wardrobe/functions/ace_intel/fn_getIndexFromMagID.sqf create mode 100644 addons/wardrobe/functions/ace_intel/fn_getMagIDs.sqf create mode 100644 addons/wardrobe/functions/ace_intel/fn_setIndexForMagID.sqf create mode 100644 addons/wardrobe/functions/action/fn_addActions.sqf create mode 100644 addons/wardrobe/functions/action/fn_addActions_children.sqf create mode 100644 addons/wardrobe/functions/action/fn_addActions_condition.sqf create mode 100644 addons/wardrobe/functions/action/fn_getAction_Icon.sqf create mode 100644 addons/wardrobe/functions/action/fn_getAction_Name.sqf create mode 100644 addons/wardrobe/functions/cache/fn_cache_clear.sqf create mode 100644 addons/wardrobe/functions/cache/fn_cache_db.sqf create mode 100644 addons/wardrobe/functions/cache/fn_cache_get.sqf create mode 100644 addons/wardrobe/functions/cache/fn_cache_set.sqf create mode 100644 addons/wardrobe/functions/fn_checkItem.sqf create mode 100644 addons/wardrobe/functions/fn_clearOnClose.sqf create mode 100644 addons/wardrobe/functions/fn_getCfgDataRandom.sqf create mode 100644 addons/wardrobe/functions/fn_postInit.sqf create mode 100644 addons/wardrobe/functions/fn_say3d.sqf create mode 100644 addons/wardrobe/functions/getItems/fn_getItems_all.sqf create mode 100644 addons/wardrobe/functions/getItems/fn_getItems_modifiable_all.sqf create mode 100644 addons/wardrobe/functions/getItems/fn_getItems_modifiable_current.sqf create mode 100644 addons/wardrobe/functions/replace/fn_replace.sqf create mode 100644 addons/wardrobe/functions/replace/fn_replace_facewear.sqf create mode 100644 addons/wardrobe/functions/replace/fn_replace_headgear.sqf create mode 100644 addons/wardrobe/functions/replace/fn_replace_uniform.sqf create mode 100644 addons/wardrobe/script_component.hpp create mode 100644 addons/wardrobe/script_macros_zrn.hpp create mode 100644 addons/wardrobe/stringtable.xml diff --git a/addons/wardrobe/$PBOPREFIX$ b/addons/wardrobe/$PBOPREFIX$ new file mode 100644 index 00000000000..a04885ddda0 --- /dev/null +++ b/addons/wardrobe/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\wardrobe diff --git a/addons/wardrobe/Baseclass.hpp b/addons/wardrobe/Baseclass.hpp new file mode 100644 index 00000000000..7e4efe5649c --- /dev/null +++ b/addons/wardrobe/Baseclass.hpp @@ -0,0 +1,39 @@ +class GVAR(base) +{ + modifiableTo[] = {""}; + + // WIP + modifiableToWithDependency = ""; + dependency = ""; + + // Supports Multiple Sounds, will pick one by random. + sound[] = {"click"}; // I need a better default Sound + sound_timing = 1; // [0..1] 0 at the start of the action, 0.5 half way during the duration of the action - always, if completed or not. 1 at the end, only when completed. + + // Gesture + gesture = "Gear"; + + // These will be read from the Target Class, so for example, the uniformclass with the rolled up sleaves, it should say "Roll Up Sleves" + alternativePicture = ""; + alternativeDisplayName = ""; + + duration = 1; // Minimum Value: 1 - Anything above will produce a progressbar. +}; + +// Common Base Class for Uniforms with Sleeves Up/Down Variants +class GVAR(base_U_sleeves_up) : GVAR(base) { alternativeDisplayName = CSTRING(sleevesUp); }; +class GVAR(base_U_sleeves_down) : GVAR(base) { alternativeDisplayName = CSTRING(sleevesDown); }; + +// Common Base Class for Uniforms with Sleeves Up/Down Variants +class GVAR(base_U_gloves_on) : GVAR(base) { alternativeDisplayName = CSTRING(glovesOn); }; +class GVAR(base_U_gloves_off) : GVAR(base) { alternativeDisplayName = CSTRING(glovesOff); }; + + +// Common Base Class for Uniforms who are open/closed in the front +class GVAR(base_U_jacket_open) : GVAR(base) { alternativeDisplayName = CSTRING(jacketOpen); }; +class GVAR(base_U_jacket_closed) : GVAR(base) { alternativeDisplayName = CSTRING(jacketClose); }; + + +// Common Base Class for Helmets with a Visor that can be flipped up or down +class GVAR(base_H_visor_up) : GVAR(base) { gesture ="gestureNod"; sound[] = {""}; soundEnd[] = {"click"}; alternativeDisplayName = CSTRING(visorUp); }; +class GVAR(base_H_visor_down) : GVAR(base) { gesture ="gestureNod"; sound[] = {""}; soundEnd[] = {"click"}; alternativeDisplayName = CSTRING(visorDown); }; \ No newline at end of file diff --git a/addons/wardrobe/CfgFunctions.hpp b/addons/wardrobe/CfgFunctions.hpp new file mode 100644 index 00000000000..926a5696fa4 --- /dev/null +++ b/addons/wardrobe/CfgFunctions.hpp @@ -0,0 +1,69 @@ +class CfgFunctions +{ + class ADDON + { + class COMPONENT + { + file = PATH_TO_FUNC; + + class postInit { postInit = 1; }; + class say3d {}; + + class clearOnClose {}; + class checkItem {}; + class getCfgDataRandom {}; + + }; + + class ace_intel + { + file = PATH_TO_FUNC_SUB(ace_intel); + class getMagIDs {}; + class getIndexFromMagID {}; + class setIndexForMagID {}; + }; + + class getItems + { + file = PATH_TO_FUNC_SUB(getItems); + class getItems_all {}; + class getItems_modifiable_all {}; + class getItems_modifiable_current {}; + + }; + + class replace + { + file = PATH_TO_FUNC_SUB(replace); + + class replace {}; + class replace_headgear {}; + class replace_facewear {}; + class replace_uniform {}; + }; + + class action + { + file = PATH_TO_FUNC_SUB(action); + + class addActions {}; + class addActions_condition {}; + class addActions_children {}; + + class getAction_Name {}; + class getAction_Icon {}; + }; + + class cache + { + file = PATH_TO_FUNC_SUB(cache); + + class cache_db {}; + + class cache_get {}; + class cache_set {}; + + class cache_clear {}; + }; + }; +}; \ No newline at end of file diff --git a/addons/wardrobe/CfgVehicles.hpp b/addons/wardrobe/CfgVehicles.hpp new file mode 100644 index 00000000000..5dbee3c34d4 --- /dev/null +++ b/addons/wardrobe/CfgVehicles.hpp @@ -0,0 +1,17 @@ +class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_Equipment { + class ADDON { + displayName = CSTRING(actionTitle); // Text shown to user + icon = ""; + condition = Q([_player] call FUNC(addActions_condition)); + statement = ""; + insertChildren = Q([_player] call FUNC(addActions)); + exceptions[] = {"isNotSwimming","isNotSitting"}; + }; + }; + }; + }; +}; diff --git a/addons/wardrobe/TODO/gm/$PBOPREFIX$ b/addons/wardrobe/TODO/gm/$PBOPREFIX$ new file mode 100644 index 00000000000..e4a1b10ddc6 --- /dev/null +++ b/addons/wardrobe/TODO/gm/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\gm \ No newline at end of file diff --git a/addons/wardrobe/TODO/gm/CfgWardrobe.hpp b/addons/wardrobe/TODO/gm/CfgWardrobe.hpp new file mode 100644 index 00000000000..678f456585d --- /dev/null +++ b/addons/wardrobe/TODO/gm/CfgWardrobe.hpp @@ -0,0 +1,17 @@ +class EGVAR(wardrobe,base); + +class EGVAR(wardrobe,base_H_visor_up); +class EGVAR(wardrobe,base_H_visor_down); + +class EGVAR(wardrobe,base_U_sleeves_up); +class EGVAR(wardrobe,base_U_sleeves_down); + +class EGVAR(wardrobe,base_U_gloves_on); +class EGVAR(wardrobe,base_U_gloves_off); + +class CfgWeapons +{ + #include "Helmets.hpp" + #include "Uniforms.hpp" +}; + diff --git a/addons/wardrobe/TODO/gm/Helmets.hpp b/addons/wardrobe/TODO/gm/Helmets.hpp new file mode 100644 index 00000000000..1d8a7e52f32 --- /dev/null +++ b/addons/wardrobe/TODO/gm/Helmets.hpp @@ -0,0 +1,14 @@ +// CfgWeapons + +// Base Classes +class gm_ge_headgear_psh77_cover_down_base; +class gm_ge_headgear_psh77_cover_up_base; +class gm_ge_headgear_psh77_down_base; +class gm_ge_headgear_psh77_up_base; + +class gm_ge_bgs_headgear_psh77_cover_down_smp : gm_ge_headgear_psh77_cover_down_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_up_smp" }; }; }; +class gm_ge_bgs_headgear_psh77_cover_up_smp : gm_ge_headgear_psh77_cover_up_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_down_smp" }; }; }; +class gm_ge_bgs_headgear_psh77_cover_down_str : gm_ge_headgear_psh77_cover_down_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_up_str" }; }; }; +class gm_ge_bgs_headgear_psh77_cover_up_str : gm_ge_headgear_psh77_cover_up_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_down_str" }; }; }; +class gm_ge_headgear_psh77_down_oli : gm_ge_headgear_psh77_down_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { "gm_ge_headgear_psh77_up_oli" }; }; }; +class gm_ge_headgear_psh77_up_oli : gm_ge_headgear_psh77_up_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { "gm_ge_headgear_psh77_down_oli" }; }; }; \ No newline at end of file diff --git a/addons/wardrobe/TODO/gm/Uniforms.hpp b/addons/wardrobe/TODO/gm/Uniforms.hpp new file mode 100644 index 00000000000..9d55165814c --- /dev/null +++ b/addons/wardrobe/TODO/gm/Uniforms.hpp @@ -0,0 +1,82 @@ +// CfgWeapons + +// Sleves + +class gm_ge_bgs_uniform_special_80_base; +class gm_ge_bgs_uniform_special_rolled_80_base; + +class gm_ge_bgs_uniform_special_80_grn : gm_ge_bgs_uniform_special_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_bgs_uniform_special_rolled_80_grn) }; }; }; +class gm_ge_bgs_uniform_special_rolled_80_grn : gm_ge_bgs_uniform_special_rolled_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_bgs_uniform_special_80_grn) }; }; }; + +class gm_ge_bgs_uniform_special_80_blk : gm_ge_bgs_uniform_special_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_bgs_uniform_special_rolled_80_blk) }; }; }; +class gm_ge_bgs_uniform_special_rolled_80_blk : gm_ge_bgs_uniform_special_rolled_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_bgs_uniform_special_80_blk) }; }; }; + + +class gm_ge_army_uniform_pilot_base; +class gm_ge_army_uniform_pilot_rolled_base; + +class gm_ge_army_uniform_pilot_sar : gm_ge_army_uniform_pilot_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_army_uniform_pilot_rolled_sar) }; }; }; +class gm_ge_army_uniform_pilot_rolled_sar : gm_ge_army_uniform_pilot_rolled_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_army_uniform_pilot_sar) }; }; }; + +class gm_ge_army_uniform_pilot_oli : gm_ge_army_uniform_pilot_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_army_uniform_pilot_oli) }; }; }; +class gm_ge_army_uniform_pilot_rolled_oli : gm_ge_army_uniform_pilot_rolled_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_army_uniform_pilot_rolled_oli) }; }; }; + +class gm_ge_pol_uniform_pilot_grn : gm_ge_army_uniform_pilot_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_pol_uniform_pilot_rolled_grn) }; }; }; +class gm_ge_pol_uniform_pilot_rolled_grn : gm_ge_army_uniform_pilot_rolled_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_pol_uniform_pilot_grn) }; }; }; + +class gm_ge_uniform_pilot_commando_base; +class gm_ge_uniform_pilot_commando_rolled_base; + +class gm_ge_uniform_pilot_commando_oli : gm_ge_uniform_pilot_commando_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_rolled_oli) }; }; }; +class gm_ge_uniform_pilot_commando_rolled_oli : gm_ge_uniform_pilot_commando_rolled_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_oli) }; }; }; + +class gm_ge_uniform_pilot_commando_gry : gm_ge_uniform_pilot_commando_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_rolled_gry) }; }; }; +class gm_ge_uniform_pilot_commando_rolled_gry : gm_ge_uniform_pilot_commando_rolled_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_gry) }; }; }; + +class gm_ge_uniform_pilot_commando_blk : gm_ge_uniform_pilot_commando_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_rolled_blk) }; }; }; +class gm_ge_uniform_pilot_commando_rolled_blk : gm_ge_uniform_pilot_commando_rolled_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_blk) }; }; }; + +class gm_pl_uniform_soldier_80_base; + +class gm_pl_army_uniform_soldier_80_frog : gm_pl_uniform_soldier_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_pl_army_uniform_soldier_rolled_80_frog) }; }; }; +class gm_pl_army_uniform_soldier_rolled_80_frog : gm_pl_uniform_soldier_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_pl_army_uniform_soldier_80_frog) }; }; }; + +class gm_pl_army_uniform_soldier_80_moro : gm_pl_uniform_soldier_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_pl_army_uniform_soldier_rolled_80_moro) }; }; }; +class gm_pl_army_uniform_soldier_rolled_80_moro : gm_pl_uniform_soldier_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_pl_army_uniform_soldier_80_moro) }; }; }; + + +class gm_ge_uniform_soldier_90_base; + +class gm_ge_uniform_soldier_90_trp : gm_ge_uniform_soldier_90_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_soldier_rolled_90_trp) }; }; }; +class gm_ge_uniform_soldier_rolled_90_trp : gm_ge_uniform_soldier_90_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_soldier_90_trp) }; }; }; + +class gm_ge_uniform_soldier_90_flk : gm_ge_uniform_soldier_90_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_soldier_rolled_90_flk) }; }; }; +class gm_ge_uniform_soldier_rolled_90_flk : gm_ge_uniform_soldier_90_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_soldier_90_flk) }; }; }; + + + + +// Gloves + +class gm_gc_uniform_soldier_80_base; +class gm_gc_army_uniform_soldier_gloves_80_str : gm_gc_uniform_soldier_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_gloves_on) { modifiableTo[] = { Q(gm_gc_army_uniform_soldier_80_str) }; }; }; +class gm_gc_army_uniform_soldier_80_str : gm_gc_uniform_soldier_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_gloves_off) { modifiableTo[] = { Q(gm_gc_army_uniform_soldier_gloves_80_str) }; }; }; + +class gm_ge_uniform_soldier_80_base; +class gm_ge_army_uniform_soldier_gloves_80_ols : gm_ge_uniform_soldier_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_gloves_on) { modifiableTo[] = { Q(gm_ge_army_uniform_soldier_80_ols) }; }; }; +class gm_ge_army_uniform_soldier_80_ols : gm_ge_uniform_soldier_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_gloves_off) { modifiableTo[] = { Q(gm_ge_army_uniform_soldier_gloves_80_ols) }; }; }; + + +// Mixed case -> Base Interaction +class gm_ge_army_uniform_soldier_bdu_80_wdl; +class gm_ge_army_uniform_soldier_bdu_rolled_80_wdl; + +class gm_xx_uniform_soldier_bdu_80_wdl : gm_ge_army_uniform_soldier_bdu_80_wdl { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_gloves_on) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_rolled_80_wdl), Q(gm_xx_uniform_soldier_bdu_nogloves_80_wdl) }; }; }; +class gm_xx_uniform_soldier_bdu_rolled_80_wdl : gm_ge_army_uniform_soldier_bdu_rolled_80_wdl { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_wdl), Q(gm_xx_uniform_soldier_bdu_nogloves_80_wdl) }; }; }; +class gm_xx_uniform_soldier_bdu_nogloves_80_wdl : gm_ge_army_uniform_soldier_bdu_80_wdl { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_wdl), Q(gm_xx_uniform_soldier_bdu_rolled_80_wdl) }; }; }; + +class gm_xx_uniform_soldier_bdu_80_oli : gm_ge_army_uniform_soldier_bdu_80_wdl { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_gloves_on) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_rolled_80_oli), Q(gm_xx_uniform_soldier_bdu_nogloves_80_oli) }; }; }; +class gm_xx_uniform_soldier_bdu_rolled_80_oli : gm_ge_army_uniform_soldier_bdu_rolled_80_wdl { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_oli), Q(gm_xx_uniform_soldier_bdu_nogloves_80_oli) }; }; }; +class gm_xx_uniform_soldier_bdu_nogloves_80_oli : gm_ge_army_uniform_soldier_bdu_80_wdl { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_oli), Q(gm_xx_uniform_soldier_bdu_rolled_80_oli) }; }; }; + + diff --git a/addons/wardrobe/TODO/gm/config.cpp b/addons/wardrobe/TODO/gm/config.cpp new file mode 100644 index 00000000000..fff8caaa821 --- /dev/null +++ b/addons/wardrobe/TODO/gm/config.cpp @@ -0,0 +1,35 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + + // Meta information for editor + name = ADDON_NAME; + author = "$STR_mod_author"; + authors[] = {"OverlordZorn [CVO]"}; + + url = "$STR_mod_URL"; + + VERSION_CONFIG; + + // Addon Specific Information + // Minimum compatible version. When the game's version is lower, pop-up warning will appear when launching the game. + requiredVersion = 2.02; + + // Required addons, used for setting load order. + // When any of the addons is missing, pop-up warning will appear when launching the game. + requiredAddons[] = {QPVAR(main),"cba_main", "gm_core"}; + + // Optional. If this is 1, if any of requiredAddons[] entry is missing in your game the entire config will be ignored and return no error (but in rpt) so useful to make a compat Mod (Since Arma 3 2.14) + skipWhenMissingDependencies = 1; + + // List of objects (CfgVehicles classes) contained in the addon. Important also for Zeus content (units and groups) + units[] = {}; + + // List of weapons (CfgWeapons classes) contained in the addon. + weapons[] = {}; + + }; +}; + +#include "CfgWardrobe.hpp" \ No newline at end of file diff --git a/addons/wardrobe/TODO/gm/notes.md b/addons/wardrobe/TODO/gm/notes.md new file mode 100644 index 00000000000..0021f2a4fad --- /dev/null +++ b/addons/wardrobe/TODO/gm/notes.md @@ -0,0 +1,4 @@ +lxWS_H_turban_01_black +lxWS_H_turban_02_black +lxWS_H_turban_03_black +lxWS_H_turban_04_black \ No newline at end of file diff --git a/addons/wardrobe/TODO/gm/script_component.hpp b/addons/wardrobe/TODO/gm/script_component.hpp new file mode 100644 index 00000000000..e823f5b7dfe --- /dev/null +++ b/addons/wardrobe/TODO/gm/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT ws + + +// This is being used for the Addon's Name and can be "My Addon Template Framework" +#define COMPONENT_BEAUTIFIED Compatibility for Western Sahara + + +#include "\z\ace\addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/wardrobe/TODO/rf/$PBOPREFIX$ b/addons/wardrobe/TODO/rf/$PBOPREFIX$ new file mode 100644 index 00000000000..fa13eec9733 --- /dev/null +++ b/addons/wardrobe/TODO/rf/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\rf \ No newline at end of file diff --git a/addons/wardrobe/TODO/rf/CfgWardrobe.hpp b/addons/wardrobe/TODO/rf/CfgWardrobe.hpp new file mode 100644 index 00000000000..7973d34ce81 --- /dev/null +++ b/addons/wardrobe/TODO/rf/CfgWardrobe.hpp @@ -0,0 +1,21 @@ +class EGVAR(wardrobe,base); +class EGVAR(wardrobe,base_U_sleeves_up); +class EGVAR(wardrobe,base_U_sleeves_down); +class EGVAR(wardrobe,base_U_jacket_open); +class EGVAR(wardrobe,base_U_jacket_closed); +class EGVAR(wardrobe,base_H_visor_up); +class EGVAR(wardrobe,base_H_visor_down); + +class CfgWeapons +{ + #include "Helmets.hpp" + #include "Uniforms.hpp" + + + // Cap (Ion) Forward and Reversed + class lxWS_H_CapB_rvs_blk; + class lxWS_H_CapB_rvs_blk_ION: lxWS_H_CapB_rvs_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "H_Cap_headphones_ion_lxws" }; }; }; + class H_Cap_headphones_ion_lxws: lxWS_H_CapB_rvs_blk_ION { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "lxWS_H_CapB_rvs_blk_ION" }; }; }; +}; + + diff --git a/addons/wardrobe/TODO/rf/Helmets.hpp b/addons/wardrobe/TODO/rf/Helmets.hpp new file mode 100644 index 00000000000..111db01f951 --- /dev/null +++ b/addons/wardrobe/TODO/rf/Helmets.hpp @@ -0,0 +1,24 @@ +// CfgWeapons + +// Macros +#define CN(color) H_HelmetHeavy_##color##_RF +#define CN_VU(color) H_HelmetHeavy_VisorUp_##color##_RF + + +#define HELMET_VARIANT(color)\ +class CN(color): H_HelmetHeavy_Black_RF { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { Q(CN_VU(color)) }; }; };\ +class CN_VU(color): H_HelmetHeavy_VisorUp_Black_RF { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { Q(CN(color)) }; }; };\ + + +// Base Classes +class H_HelmetAggressor_F; + +class H_HelmetHeavy_Black_RF : H_HelmetAggressor_F { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { "H_HelmetHeavy_VisorUp_Black_RF" }; }; }; +class H_HelmetHeavy_VisorUp_Black_RF : H_HelmetHeavy_Black_RF { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { "H_HelmetHeavy_Black_RF" }; }; }; + +// Variants +HELMET_VARIANT(Hex) +HELMET_VARIANT(GHex) +HELMET_VARIANT(Sand) +HELMET_VARIANT(Olive) +HELMET_VARIANT(White) \ No newline at end of file diff --git a/addons/wardrobe/TODO/rf/Uniforms.hpp b/addons/wardrobe/TODO/rf/Uniforms.hpp new file mode 100644 index 00000000000..a00636efc1d --- /dev/null +++ b/addons/wardrobe/TODO/rf/Uniforms.hpp @@ -0,0 +1,23 @@ +// CfgWeapons + +class Uniform_Base; + +// Macros +#define UNIFORM_BASE(class1,class2)\ +class class1: Uniform_Base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(class2) }; }; };\ +class class2: Uniform_Base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(class1) }; }; };\ + +// Simple Variants +UNIFORM_BASE(U_C_FirefighterFatigues_RF,U_C_FirefighterFatigues_RolledUp_RF) +UNIFORM_BASE(U_BG_Guerrilla_6_1,U_BG_Guerrilla_RF) + + +// Pilot Jackets +class U_C_PilotJacket_black_RF : Uniform_Base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { Q(U_C_PilotJacket_open_black_RF) }; }; }; +class U_C_PilotJacket_open_black_RF : U_C_PilotJacket_black_RF { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { Q(U_C_PilotJacket_black_RF) }; }; }; + +class U_C_PilotJacket_brown_RF : U_C_PilotJacket_black_RF { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { Q(U_C_PilotJacket_open_brown_RF) }; }; }; +class U_C_PilotJacket_open_brown_RF : U_C_PilotJacket_brown_RF { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { Q(U_C_PilotJacket_brown_RF) }; }; }; + +class U_C_PilotJacket_lbrown_RF : U_C_PilotJacket_black_RF { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { Q(U_C_PilotJacket_open_lbrown_RF) }; }; }; +class U_C_PilotJacket_open_lbrown_RF : U_C_PilotJacket_lbrown_RF { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { Q(U_C_PilotJacket_lbrown_RF) }; }; }; diff --git a/addons/wardrobe/TODO/rf/config.cpp b/addons/wardrobe/TODO/rf/config.cpp new file mode 100644 index 00000000000..511bd1d8a81 --- /dev/null +++ b/addons/wardrobe/TODO/rf/config.cpp @@ -0,0 +1,35 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + + // Meta information for editor + name = ADDON_NAME; + author = "$STR_mod_author"; + authors[] = {"OverlordZorn [CVO]"}; + + url = "$STR_mod_URL"; + + VERSION_CONFIG; + + // Addon Specific Information + // Minimum compatible version. When the game's version is lower, pop-up warning will appear when launching the game. + requiredVersion = 2.02; + + // Required addons, used for setting load order. + // When any of the addons is missing, pop-up warning will appear when launching the game. + requiredAddons[] = {QPVAR(main),"cba_main","RF_Data_Loadorder"}; + + // Optional. If this is 1, if any of requiredAddons[] entry is missing in your game the entire config will be ignored and return no error (but in rpt) so useful to make a compat Mod (Since Arma 3 2.14) + skipWhenMissingDependencies = 1; + + // List of objects (CfgVehicles classes) contained in the addon. Important also for Zeus content (units and groups) + units[] = {}; + + // List of weapons (CfgWeapons classes) contained in the addon. + weapons[] = {}; + + }; +}; + +#include "CfgWardrobe.hpp" \ No newline at end of file diff --git a/addons/wardrobe/TODO/rf/notes.md b/addons/wardrobe/TODO/rf/notes.md new file mode 100644 index 00000000000..0021f2a4fad --- /dev/null +++ b/addons/wardrobe/TODO/rf/notes.md @@ -0,0 +1,4 @@ +lxWS_H_turban_01_black +lxWS_H_turban_02_black +lxWS_H_turban_03_black +lxWS_H_turban_04_black \ No newline at end of file diff --git a/addons/wardrobe/TODO/rf/script_component.hpp b/addons/wardrobe/TODO/rf/script_component.hpp new file mode 100644 index 00000000000..09b545796d9 --- /dev/null +++ b/addons/wardrobe/TODO/rf/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT rf + + +// This is being used for the Addon's Name and can be "My Addon Template Framework" +#define COMPONENT_BEAUTIFIED Compatibility for Reaction Forces + + +#include "\z\ace\addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/wardrobe/TODO/vanilla/$PBOPREFIX$ b/addons/wardrobe/TODO/vanilla/$PBOPREFIX$ new file mode 100644 index 00000000000..c38a70b1dd2 --- /dev/null +++ b/addons/wardrobe/TODO/vanilla/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\vanilla \ No newline at end of file diff --git a/addons/wardrobe/TODO/vanilla/CfgWardrobe.hpp b/addons/wardrobe/TODO/vanilla/CfgWardrobe.hpp new file mode 100644 index 00000000000..c581aff3568 --- /dev/null +++ b/addons/wardrobe/TODO/vanilla/CfgWardrobe.hpp @@ -0,0 +1,10 @@ +class EGVAR(wardrobe,base); +class EGVAR(wardrobe,base_U_sleeves_up); +class EGVAR(wardrobe,base_U_sleeves_down); + + + +class CfgWeapons +{ + #include "Uniforms.hpp" +}; diff --git a/addons/wardrobe/TODO/vanilla/Uniforms.hpp b/addons/wardrobe/TODO/vanilla/Uniforms.hpp new file mode 100644 index 00000000000..e7c46ed163b --- /dev/null +++ b/addons/wardrobe/TODO/vanilla/Uniforms.hpp @@ -0,0 +1,23 @@ +// CfgWeapons +class Uniform_Base; + +// Macros +#define UNIFORM_BASE(class1,class2)\ +class class1: Uniform_Base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(class2) }; }; };\ +class class2: Uniform_Base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(class1) }; }; };\ + + +// Vanilla CTRG Uniform +UNIFORM_BASE(U_B_CTRG_1,U_B_CTRG_3) + +// AAF Fatigues +UNIFORM_BASE(U_I_CombatUniform,U_I_CombatUniform_shortsleeve) + +// APEX CTRG Uniforms +UNIFORM_BASE(U_B_CTRG_Soldier_F,U_B_CTRG_Soldier_3_F) +UNIFORM_BASE(U_B_CTRG_Soldier_Arid_F,U_B_CTRG_Soldier_3_Arid_F) +UNIFORM_BASE(U_B_CTRG_Soldier_urb_1_F,U_B_CTRG_Soldier_urb_3_F) + +// Contact - LDF Fatigues +UNIFORM_BASE(U_I_E_Uniform_01_F,U_I_E_Uniform_01_shortsleeve_F) + diff --git a/addons/wardrobe/TODO/vanilla/config.cpp b/addons/wardrobe/TODO/vanilla/config.cpp new file mode 100644 index 00000000000..d0d31d554ad --- /dev/null +++ b/addons/wardrobe/TODO/vanilla/config.cpp @@ -0,0 +1,35 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + + // Meta information for editor + name = ADDON_NAME; + author = "$STR_mod_author"; + authors[] = {"OverlordZorn [CVO]"}; + + url = "$STR_mod_URL"; + + VERSION_CONFIG; + + // Addon Specific Information + // Minimum compatible version. When the game's version is lower, pop-up warning will appear when launching the game. + requiredVersion = 2.02; + + // Required addons, used for setting load order. + // When any of the addons is missing, pop-up warning will appear when launching the game. + requiredAddons[] = {QPVAR(main),"cba_main"}; + + // Optional. If this is 1, if any of requiredAddons[] entry is missing in your game the entire config will be ignored and return no error (but in rpt) so useful to make a compat Mod (Since Arma 3 2.14) + skipWhenMissingDependencies = 1; + + // List of objects (CfgVehicles classes) contained in the addon. Important also for Zeus content (units and groups) + units[] = {}; + + // List of weapons (CfgWeapons classes) contained in the addon. + weapons[] = {}; + + }; +}; + +#include "CfgWardrobe.hpp" \ No newline at end of file diff --git a/addons/wardrobe/TODO/vanilla/script_component.hpp b/addons/wardrobe/TODO/vanilla/script_component.hpp new file mode 100644 index 00000000000..a67b9d8c2b2 --- /dev/null +++ b/addons/wardrobe/TODO/vanilla/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT vanilla + + +// This is being used for the Addon's Name and can be "My Addon Template Framework" +#define COMPONENT_BEAUTIFIED Compatibility for Vanilla Assets + + +#include "\z\ace\addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/wardrobe/TODO/vn/$PBOPREFIX$ b/addons/wardrobe/TODO/vn/$PBOPREFIX$ new file mode 100644 index 00000000000..2d7e5ca17f8 --- /dev/null +++ b/addons/wardrobe/TODO/vn/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\vn \ No newline at end of file diff --git a/addons/wardrobe/TODO/vn/Booniehats.hpp b/addons/wardrobe/TODO/vn/Booniehats.hpp new file mode 100644 index 00000000000..0cb46ac35c9 --- /dev/null +++ b/addons/wardrobe/TODO/vn/Booniehats.hpp @@ -0,0 +1,45 @@ +// CfgWeapons + +// Variations +// 01 sides up 02 normal 03 front up 04 l side up 05 r side up +// 06-08 anzac +// 09 rebel - not compatible +//Colors +// 01 green 02 tiger 03 black 04 spray 05 tiger green 06 erdl brown 07 leopard 08 erdl +// 09 gray <- Fuck this - inheritance is fucking horrible as fuck. + +// Macros +#define CN(variation,color) vn_b_boonie_##variation##_##color + +// Base Boonie +#define CAMO_BASE 01 +class CN(02,CAMO_BASE) : vn_b_headgear_base { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; }; }; +class CN(01,CAMO_BASE) : CN(02,CAMO_BASE) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; }; }; +class CN(03,CAMO_BASE) : CN(02,CAMO_BASE) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; }; }; +class CN(04,CAMO_BASE) : CN(02,CAMO_BASE) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; }; }; +class CN(05,CAMO_BASE) : CN(02,CAMO_BASE) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)) }; }; }; + + +#define CN_COLORS(CAMO)\ +class CN(02,CAMO) : CN(02,01) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(03,CAMO)), Q(CN(04,CAMO)), Q(CN(05,CAMO)) }; }; };\ +class CN(01,CAMO) : CN(02,CAMO) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(02,CAMO)), Q(CN(03,CAMO)), Q(CN(04,CAMO)), Q(CN(05,CAMO)) }; }; };\ +class CN(03,CAMO) : CN(02,CAMO) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(02,CAMO)), Q(CN(04,CAMO)), Q(CN(05,CAMO)) }; }; };\ +class CN(04,CAMO) : CN(02,CAMO) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(02,CAMO)), Q(CN(03,CAMO)), Q(CN(05,CAMO)) }; }; };\ +class CN(05,CAMO) : CN(02,CAMO) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(02,CAMO)), Q(CN(03,CAMO)), Q(CN(04,CAMO)) }; }; };\ + +CN_COLORS(02) +CN_COLORS(03) +CN_COLORS(04) +CN_COLORS(05) + + +// Base classes in CfgWeapons.hpp +// 06-08 anzac + +#define BOONIE_ANZAC(VAR) +class CN(06,VAR) : CN(02,01) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(07,VAR)), Q(CN(08,VAR)) }; }; }; +class CN(07,VAR) : CN(06,VAR) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(06,VAR)), Q(CN(08,VAR)) }; }; }; +class CN(08,VAR) : CN(06,VAR) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(06,VAR)), Q(CN(07,VAR)) }; }; }; + +BOONIE_ANZAC(01) +BOONIE_ANZAC(02) \ No newline at end of file diff --git a/addons/wardrobe/TODO/vn/CfgWardrobe.hpp b/addons/wardrobe/TODO/vn/CfgWardrobe.hpp new file mode 100644 index 00000000000..79049a426bd --- /dev/null +++ b/addons/wardrobe/TODO/vn/CfgWardrobe.hpp @@ -0,0 +1,20 @@ +class EGVAR(wardrobe,base); + +class EGVAR(wardrobe,base_H_visor_up); +class EGVAR(wardrobe,base_H_visor_down); + +class EGVAR(wardrobe,base_U_sleeves_up); +class EGVAR(wardrobe,base_U_sleeves_down); + +class CfgWeapons +{ + // Base Classes + class vn_b_headgear_base; + class vn_o_headgear_base; + + #include "Pilothelmets.hpp" + #include "Booniehats.hpp" + #include "Uniforms_B.hpp" + #include "Uniforms_O.hpp" +}; + diff --git a/addons/wardrobe/TODO/vn/Pilothelmets.hpp b/addons/wardrobe/TODO/vn/Pilothelmets.hpp new file mode 100644 index 00000000000..d41144eaa0a --- /dev/null +++ b/addons/wardrobe/TODO/vn/Pilothelmets.hpp @@ -0,0 +1,47 @@ +// CfgWeapons + + +// Macros +#define CN01(side,var1,var2) vn_##side##_helmet_##var1##_01_##var2 +#define CN02(side,var1,var2) vn_##side##_helmet_##var1##_02_##var2 + + +#define HELMET_VARIANT(side,var1,var2)\ +class CN01(side,var1,var2) : base_class_up { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { Q(CN02(side,var1,var2)) }; }; };\ +class CN02(side,var1,var2) : base_class_dn { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { Q(CN01(side,var1,var2)) }; }; };\ + + +// Base classes in CfgWeapons.hpp + +// Parent Version aph6 & svh4 +#define base_class_up vn_b_headgear_base +#define base_class_dn vn_b_headgear_base +HELMET_VARIANT(b,aph6,01) +HELMET_VARIANT(b,svh4,01) + +// Child Version aph6 +#undef base_class_up +#undef base_class_dn +#define base_class_up CN01(b,aph6,01) +#define base_class_dn CN02(b,aph6,01) + +HELMET_VARIANT(b,aph6,02) +HELMET_VARIANT(b,aph6,03) +HELMET_VARIANT(b,aph6,04) +HELMET_VARIANT(b,aph6,05) + +// Child Version svh4 +#undef base_class_up +#undef base_class_dn +#define base_class_up CN01(b,svh4,01) +#define base_class_dn CN02(b,svh4,01) + +HELMET_VARIANT(b,svh4,02) +HELMET_VARIANT(b,svh4,03) +HELMET_VARIANT(b,svh4,04) +HELMET_VARIANT(b,svh4,05) +HELMET_VARIANT(b,svh4,06) + +// Special Case zsh3 +class vn_o_helmet_zsh3_01 : vn_o_headgear_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { Q(vn_o_helmet_zsh3_02) }; }; }; +class vn_o_helmet_zsh3_02 : vn_o_helmet_zsh3_01 { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { Q(vn_o_helmet_zsh3_01) }; }; }; diff --git a/addons/wardrobe/TODO/vn/Uniforms_B.hpp b/addons/wardrobe/TODO/vn/Uniforms_B.hpp new file mode 100644 index 00000000000..3e3953b4a29 --- /dev/null +++ b/addons/wardrobe/TODO/vn/Uniforms_B.hpp @@ -0,0 +1,63 @@ +// CfgWeapons + +class vn_b_uniform_base; + +// Macros + + +#define UNIFORM_BASE_B(class1,class2)\ +class class1: vn_b_uniform_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(class2) }; }; };\ +class class2: vn_b_uniform_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(class1) }; }; };\ + +#define B_U(div,var,camo) vn_b_uniform_##div##_##var##_##camo + +#define B_U_PAIR(div,down,up,camo) UNIFORM_BASE_B(B_U(div,down,camo),B_U(div,up,camo)) + + +// Simple Variants +// ACZAC +UNIFORM_BASE_B(vn_b_uniform_aus_01_01,vn_b_uniform_aus_02_01) +UNIFORM_BASE_B(vn_b_uniform_aus_03_01,vn_b_uniform_aus_04_01) +UNIFORM_BASE_B(vn_b_uniform_aus_05_01,vn_b_uniform_aus_06_01) +UNIFORM_BASE_B(vn_b_uniform_aus_07_01,vn_b_uniform_aus_08_01) +UNIFORM_BASE_B(vn_b_uniform_aus_09_01,vn_b_uniform_aus_10_01) + +// NZ +UNIFORM_BASE_B(vn_b_uniform_NZ_01_01,vn_b_uniform_NZ_02_01) +UNIFORM_BASE_B(vn_b_uniform_NZ_03_01,vn_b_uniform_NZ_04_01) +UNIFORM_BASE_B(vn_b_uniform_NZ_05_01,vn_b_uniform_NZ_06_01) + +// SEAL STUFF +UNIFORM_BASE_B(vn_b_uniform_seal_01_01,vn_b_uniform_seal_02_01) +UNIFORM_BASE_B(vn_b_uniform_seal_01_02,vn_b_uniform_seal_02_02) +UNIFORM_BASE_B(vn_b_uniform_seal_01_05,vn_b_uniform_seal_02_05) +UNIFORM_BASE_B(vn_b_uniform_seal_01_06,vn_b_uniform_seal_02_06) +UNIFORM_BASE_B(vn_b_uniform_seal_01_07,vn_b_uniform_seal_02_07) + +// MACV +#define OLIVE_FIELD 01 +#define TIGER 02 +#define TIGER_GREEN 05 +#define ERDL_BROWN 06 +#define OLIVE 07 +#define LEOPARD 08 +#define ERDL 15 +#define LIZARD 16 +#define BDQ 17 +#define FROG 18 + +// macv 05 and 04 have inconsistency between them -> different uniform maxLoad. This likely will cause the player to loose items when the uniform is filled to the brim. Difference is 1lb which translates to 16~17x ace bandages or 1x 1l blood +#define B_U_PAIR_SET(camo)\ +B_U_PAIR(macv,02,03,camo)\ +B_U_PAIR(macv,05,04,camo)\ + +B_U_PAIR_SET(TIGER) +B_U_PAIR_SET(TIGER_GREEN) +B_U_PAIR_SET(ERDL) +B_U_PAIR_SET(ERDL_BROWN) +B_U_PAIR_SET(OLIVE) +B_U_PAIR_SET(OLIVE_FIELD) +B_U_PAIR_SET(LEOPARD) +B_U_PAIR_SET(LIZARD) +B_U_PAIR_SET(BDQ) +B_U_PAIR_SET(FROG) diff --git a/addons/wardrobe/TODO/vn/Uniforms_O.hpp b/addons/wardrobe/TODO/vn/Uniforms_O.hpp new file mode 100644 index 00000000000..0ed331e0da9 --- /dev/null +++ b/addons/wardrobe/TODO/vn/Uniforms_O.hpp @@ -0,0 +1,85 @@ +class vn_o_uniform_base; + +#define UNIFORM_BASE_O(class1,class2)\ +class class1: vn_o_uniform_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(class2) }; }; };\ +class class2: vn_o_uniform_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(class1) }; }; };\ + +// OPFOR + +// NVA Sailors +UNIFORM_BASE_O(vn_o_uniform_nva_navy_01,vn_o_uniform_nva_navy_03) +UNIFORM_BASE_O(vn_o_uniform_nva_navy_02,vn_o_uniform_nva_navy_04) + +// NVA_Army_AA_BB +// brown: 01,02 03,04 | GREEN: 01..12 +#define BROWN 01 +#define BROWN_FIELD 02 +#define GREEN 03 +#define GREEN_FIELD 04 +#define O_U_NVA_ARMY(var,camo) vn_o_uniform_nva_army_##var##_##camo +#define O_U_NVA_ARMY_PAIR(down,up,camo) UNIFORM_BASE_O(O_U_NVA_ARMY(down,camo),O_U_NVA_ARMY(up,camo)) +O_U_NVA_ARMY_PAIR(01,02,BROWN) +O_U_NVA_ARMY_PAIR(03,04,BROWN) +O_U_NVA_ARMY_PAIR(01,02,BROWN_FIELD) +O_U_NVA_ARMY_PAIR(03,04,BROWN_FIELD) + +O_U_NVA_ARMY_PAIR(01,02,GREEN) +O_U_NVA_ARMY_PAIR(03,04,GREEN) +O_U_NVA_ARMY_PAIR(05,06,GREEN) +O_U_NVA_ARMY_PAIR(07,08,GREEN) +O_U_NVA_ARMY_PAIR(09,10,GREEN) +O_U_NVA_ARMY_PAIR(11,12,GREEN) +O_U_NVA_ARMY_PAIR(01,02,GREEN_FIELD) +O_U_NVA_ARMY_PAIR(03,04,GREEN_FIELD) +O_U_NVA_ARMY_PAIR(05,06,GREEN_FIELD) +O_U_NVA_ARMY_PAIR(07,08,GREEN_FIELD) +O_U_NVA_ARMY_PAIR(09,10,GREEN_FIELD) +O_U_NVA_ARMY_PAIR(11,12,GREEN_FIELD) + +// PL ARMY +#define DARK 11 +#define DARK_FIELD 12 +#define LIGHT 13 +#define LIGHT_FIELD 14 +#define O_U_PL_ARMY(var,camo) vn_o_uniform_pl_army_##var##_##camo +#define O_U_PL_ARMY_PAIR(down,up,camo) UNIFORM_BASE_O(O_U_PL_ARMY(down,camo),O_U_PL_ARMY(up,camo)) + +O_U_PL_ARMY_PAIR(01,02,DARK) +O_U_PL_ARMY_PAIR(03,04,DARK) +O_U_PL_ARMY_PAIR(01,02,DARK_FIELD) +O_U_PL_ARMY_PAIR(03,04,DARK_FIELD) +O_U_PL_ARMY_PAIR(01,02,LIGHT) +O_U_PL_ARMY_PAIR(03,04,LIGHT) +O_U_PL_ARMY_PAIR(01,02,LIGHT_FIELD) +O_U_PL_ARMY_PAIR(03,04,LIGHT_FIELD) + + +#define O_U(div,var,camo) vn_o_uniform_##div##_##var##_##camo +#define O_U_PAIR(div,down,up,camo) UNIFORM_BASE_O(O_U(div,down,camo),O_U(div,up,camo)) +// VC MF +#define VC_MF 07 +O_U_PAIR(vc_mf,01,02,VC_MF) +O_U_PAIR(vc_mf,03,04,VC_MF) +O_U_PAIR(vc_mf,09,10,VC_MF) +O_U_PAIR(vc_mf,11,12,VC_MF) + +// VC REG +O_U_PAIR(vc_reg,11,12,08) +O_U_PAIR(vc_reg,11,12,09) +O_U_PAIR(vc_reg,11,12,10) + +// VC BLACK 01 BLACK_WHITE 02 GREY_TAN 03 BLUE 04 WHITE_BLACK 05 BLUE_WHITE 06 BLUE_GREY 07 +O_U_PAIR(vc,01,02,01) +O_U_PAIR(vc,03,04,01) +O_U_PAIR(vc,01,02,02) +O_U_PAIR(vc,03,04,02) +O_U_PAIR(vc,01,02,03) +O_U_PAIR(vc,03,04,03) +O_U_PAIR(vc,01,02,04) +O_U_PAIR(vc,03,04,04) +O_U_PAIR(vc,01,02,05) +O_U_PAIR(vc,03,04,05) +O_U_PAIR(vc,01,02,06) +O_U_PAIR(vc,03,04,06) +O_U_PAIR(vc,01,02,07) +O_U_PAIR(vc,03,04,07) diff --git a/addons/wardrobe/TODO/vn/config.cpp b/addons/wardrobe/TODO/vn/config.cpp new file mode 100644 index 00000000000..fa4640d2f84 --- /dev/null +++ b/addons/wardrobe/TODO/vn/config.cpp @@ -0,0 +1,35 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + + // Meta information for editor + name = ADDON_NAME; + author = "$STR_mod_author"; + authors[] = {"OverlordZorn [CVO]"}; + + url = "$STR_mod_URL"; + + VERSION_CONFIG; + + // Addon Specific Information + // Minimum compatible version. When the game's version is lower, pop-up warning will appear when launching the game. + requiredVersion = 2.02; + + // Required addons, used for setting load order. + // When any of the addons is missing, pop-up warning will appear when launching the game. + requiredAddons[] = {QPVAR(main),"cba_main","vn_data_f"}; + + // Optional. If this is 1, if any of requiredAddons[] entry is missing in your game the entire config will be ignored and return no error (but in rpt) so useful to make a compat Mod (Since Arma 3 2.14) + skipWhenMissingDependencies = 1; + + // List of objects (CfgVehicles classes) contained in the addon. Important also for Zeus content (units and groups) + units[] = {}; + + // List of weapons (CfgWeapons classes) contained in the addon. + weapons[] = {}; + + }; +}; + +#include "CfgWardrobe.hpp" \ No newline at end of file diff --git a/addons/wardrobe/TODO/vn/notes.md b/addons/wardrobe/TODO/vn/notes.md new file mode 100644 index 00000000000..0021f2a4fad --- /dev/null +++ b/addons/wardrobe/TODO/vn/notes.md @@ -0,0 +1,4 @@ +lxWS_H_turban_01_black +lxWS_H_turban_02_black +lxWS_H_turban_03_black +lxWS_H_turban_04_black \ No newline at end of file diff --git a/addons/wardrobe/TODO/vn/script_component.hpp b/addons/wardrobe/TODO/vn/script_component.hpp new file mode 100644 index 00000000000..ec51690e2fc --- /dev/null +++ b/addons/wardrobe/TODO/vn/script_component.hpp @@ -0,0 +1,8 @@ +#define COMPONENT vn + +// This is being used for the Addon's Name and can be "My Addon Template Framework" +#define COMPONENT_BEAUTIFIED Compatibility for SOG:PF + + +#include "\z\ace\addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/wardrobe/TODO/vn/vn_uniform_fix/Uniforms.hpp b/addons/wardrobe/TODO/vn/vn_uniform_fix/Uniforms.hpp new file mode 100644 index 00000000000..fca77bf4987 --- /dev/null +++ b/addons/wardrobe/TODO/vn/vn_uniform_fix/Uniforms.hpp @@ -0,0 +1,21 @@ +class ItemInfo; + +class CfgWeapons +{ + // Importing the parent class for the uniforms we want to change, so we can inherit from it. + class vn_b_uniform_base; + // creating the macro + #define S_70(className)\ + class className : vn_b_uniform_base { class ItemInfo : ItemInfo { containerClass = "Supply70"; }; };\ + + S_70(vn_b_uniform_macv_04_01) + S_70(vn_b_uniform_macv_04_02) + S_70(vn_b_uniform_macv_04_05) + S_70(vn_b_uniform_macv_04_06) + S_70(vn_b_uniform_macv_04_07) + S_70(vn_b_uniform_macv_04_08) + S_70(vn_b_uniform_macv_04_15) + S_70(vn_b_uniform_macv_04_16) + S_70(vn_b_uniform_macv_04_17) + S_70(vn_b_uniform_macv_04_18) +}; \ No newline at end of file diff --git a/addons/wardrobe/TODO/vn/vn_uniform_fix/config.cpp b/addons/wardrobe/TODO/vn/vn_uniform_fix/config.cpp new file mode 100644 index 00000000000..3e183709561 --- /dev/null +++ b/addons/wardrobe/TODO/vn/vn_uniform_fix/config.cpp @@ -0,0 +1,38 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + + // SubAddon Stuff + addonRootClass = QPVAR(vn); + + // Meta information for editor + name = ADDON_NAME; + author = "$STR_mod_author"; + authors[] = {"OverlordZorn [CVO]"}; + + url = "$STR_mod_URL"; + + VERSION_CONFIG; + + // Addon Specific Information + // Minimum compatible version. When the game's version is lower, pop-up warning will appear when launching the game. + requiredVersion = 2.02; + + // Required addons, used for setting load order. + // When any of the addons is missing, pop-up warning will appear when launching the game. + requiredAddons[] = {QPVAR(main),"cba_main","vn_data_f"}; + + // Optional. If this is 1, if any of requiredAddons[] entry is missing in your game the entire config will be ignored and return no error (but in rpt) so useful to make a compat Mod (Since Arma 3 2.14) + skipWhenMissingDependencies = 1; + + // List of objects (CfgVehicles classes) contained in the addon. Important also for Zeus content (units and groups) + units[] = {}; + + // List of weapons (CfgWeapons classes) contained in the addon. + weapons[] = {}; + + }; +}; + +#include "Uniforms.hpp" \ No newline at end of file diff --git a/addons/wardrobe/TODO/vn/vn_uniform_fix/script_component.hpp b/addons/wardrobe/TODO/vn/vn_uniform_fix/script_component.hpp new file mode 100644 index 00000000000..972e84ffaa8 --- /dev/null +++ b/addons/wardrobe/TODO/vn/vn_uniform_fix/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT vn_uniform_fix + + +// This is being used for the Addon's Name and can be "My Addon Template Framework" +#define COMPONENT_BEAUTIFIED Compatibility for SOG:PF - Uniform Fix + + +#include "\z\ace\addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/wardrobe/TODO/ws/$PBOPREFIX$ b/addons/wardrobe/TODO/ws/$PBOPREFIX$ new file mode 100644 index 00000000000..1da69ea8489 --- /dev/null +++ b/addons/wardrobe/TODO/ws/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\ws \ No newline at end of file diff --git a/addons/wardrobe/TODO/ws/CfgWardrobe.hpp b/addons/wardrobe/TODO/ws/CfgWardrobe.hpp new file mode 100644 index 00000000000..5edba25847d --- /dev/null +++ b/addons/wardrobe/TODO/ws/CfgWardrobe.hpp @@ -0,0 +1,12 @@ +class EGVAR(wardrobe,base); + +class CfgWeapons +{ + // Cap (Ion) Forward and Reversed + class lxWS_H_CapB_rvs_blk; + class lxWS_H_CapB_rvs_blk_ION: lxWS_H_CapB_rvs_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "H_Cap_headphones_ion_lxws" }; }; }; + class H_Cap_headphones_ion_lxws: lxWS_H_CapB_rvs_blk_ION { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "lxWS_H_CapB_rvs_blk_ION" }; }; }; + + #include "Turbans.hpp" +}; + diff --git a/addons/wardrobe/TODO/ws/Turbans.hpp b/addons/wardrobe/TODO/ws/Turbans.hpp new file mode 100644 index 00000000000..92db3bc726f --- /dev/null +++ b/addons/wardrobe/TODO/ws/Turbans.hpp @@ -0,0 +1,34 @@ +// CfgWeapons + +// MACROS +#define CN(version,color) lxWS_H_turban_##version##_##color +#define QCN(version,color) Q(CN(version,color)) + +#define COLORGROUP(COLOR)\ +class CN(01,COLOR): lxWS_H_turban_01_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,COLOR), QCN(03,COLOR), QCN(04,COLOR) }; }; };\ +class CN(02,COLOR): lxWS_H_turban_02_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,COLOR), QCN(03,COLOR), QCN(04,COLOR) }; }; };\ +class CN(03,COLOR): lxWS_H_turban_03_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,COLOR), QCN(02,COLOR), QCN(04,COLOR) }; }; };\ +class CN(04,COLOR): lxWS_H_turban_04_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,COLOR), QCN(02,COLOR), QCN(03,COLOR) }; }; };\ + +#define COLORGROUP_SPECIAL(COLOR)\ +class CN(02,COLOR): lxWS_H_turban_02_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(03,COLOR) }; }; };\ +class CN(03,COLOR): lxWS_H_turban_03_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,COLOR) }; }; };\ + +// BASECLASS +class H_Shemag_khk; +class lxWS_H_turban_01_black : H_Shemag_khk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,black), QCN(03,black), QCN(04,black) }; }; }; +class lxWS_H_turban_02_black : lxWS_H_turban_01_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(03,black), QCN(04,black) }; }; }; +class lxWS_H_turban_03_black : lxWS_H_turban_01_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(04,black) }; }; }; +class lxWS_H_turban_04_black : lxWS_H_turban_01_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(03,black) }; }; }; + +// VARIATIONS +COLORGROUP(blue) +COLORGROUP(blue_una) +COLORGROUP(green) +COLORGROUP(red) +COLORGROUP(sand) +COLORGROUP(gray) +COLORGROUP(yellow) + +// Special Variations +COLORGROUP_SPECIAL(green_pattern) \ No newline at end of file diff --git a/addons/wardrobe/TODO/ws/config.cpp b/addons/wardrobe/TODO/ws/config.cpp new file mode 100644 index 00000000000..ee6b5864984 --- /dev/null +++ b/addons/wardrobe/TODO/ws/config.cpp @@ -0,0 +1,35 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + + // Meta information for editor + name = ADDON_NAME; + author = "$STR_mod_author"; + authors[] = {"OverlordZorn [CVO]"}; + + url = "$STR_mod_URL"; + + VERSION_CONFIG; + + // Addon Specific Information + // Minimum compatible version. When the game's version is lower, pop-up warning will appear when launching the game. + requiredVersion = 2.02; + + // Required addons, used for setting load order. + // When any of the addons is missing, pop-up warning will appear when launching the game. + requiredAddons[] = {QPVAR(main),"cba_main","Characters_f_lxWS_headgear"}; + + // Optional. If this is 1, if any of requiredAddons[] entry is missing in your game the entire config will be ignored and return no error (but in rpt) so useful to make a compat Mod (Since Arma 3 2.14) + skipWhenMissingDependencies = 1; + + // List of objects (CfgVehicles classes) contained in the addon. Important also for Zeus content (units and groups) + units[] = {}; + + // List of weapons (CfgWeapons classes) contained in the addon. + weapons[] = {}; + + }; +}; + +#include "CfgWardrobe.hpp" \ No newline at end of file diff --git a/addons/wardrobe/TODO/ws/notes.md b/addons/wardrobe/TODO/ws/notes.md new file mode 100644 index 00000000000..0021f2a4fad --- /dev/null +++ b/addons/wardrobe/TODO/ws/notes.md @@ -0,0 +1,4 @@ +lxWS_H_turban_01_black +lxWS_H_turban_02_black +lxWS_H_turban_03_black +lxWS_H_turban_04_black \ No newline at end of file diff --git a/addons/wardrobe/TODO/ws/script_component.hpp b/addons/wardrobe/TODO/ws/script_component.hpp new file mode 100644 index 00000000000..e823f5b7dfe --- /dev/null +++ b/addons/wardrobe/TODO/ws/script_component.hpp @@ -0,0 +1,9 @@ +#define COMPONENT ws + + +// This is being used for the Addon's Name and can be "My Addon Template Framework" +#define COMPONENT_BEAUTIFIED Compatibility for Western Sahara + + +#include "\z\ace\addons\main\script_mod.hpp" +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/wardrobe/XEH/CfgXEH.hpp b/addons/wardrobe/XEH/CfgXEH.hpp new file mode 100644 index 00000000000..cde9653434e --- /dev/null +++ b/addons/wardrobe/XEH/CfgXEH.hpp @@ -0,0 +1,6 @@ +// No need to change anything here +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH\XEH_preInit)); + }; +}; \ No newline at end of file diff --git a/addons/wardrobe/XEH/XEH_preInit.sqf b/addons/wardrobe/XEH/XEH_preInit.sqf new file mode 100644 index 00000000000..2c6434529da --- /dev/null +++ b/addons/wardrobe/XEH/XEH_preInit.sqf @@ -0,0 +1,39 @@ +#include "../script_component.hpp" + + +/* +here, you put in your CBA Settings so they are available in the editor! + +https://github.com/CBATeam/CBA_A3/wiki/CBA-Settings-System#create-a-custom-setting-for-mission-or-mod + +MACROS Used: +SETLSTRING(test) -> [LSTRING(set_test), LSTRING(set_test_desc)] +SET(test) -> ADDON_set_test +QSET(test) -> "ADDON_set_test" +*/ + +/* +[ + QSET(displayMusic), // _setting - Unique setting name. Matches resulting variable name + "CHECKBOX", // _settingType - Type of setting. Can be "CHECKBOX", "EDITBOX", "LIST", "SLIDER" or "COLOR" + ["Display Music Title","This enables the message of the currently played music title by the CVO Music System"], + // _title - Display name or display name + tooltip (optional, default: same as setting name) + ["CVO", "CVO Music"], // _category - Category for the settings menu + optional sub-category + false, // _valueInfo - Extra properties of the setting depending of _settingType. See examples below + 0, // _isGlobal - 1: all clients share the same setting, 2: setting can't be overwritten (optional, default: 0) + {}, // _script - Script to execute when setting is changed. (optional) + false // _needRestart - Setting will be marked as needing mission restart after being changed. (optional, default false) +] call CBA_fnc_addSetting; +*/ + +[ + QSET(enable), // _setting - Unique setting name. Matches resulting variable name + "CHECKBOX", // _settingType - Type of setting. Can be "CHECKBOX", "EDITBOX", "LIST", "SLIDER" or "COLOR" + SETLSTRING(enable), + // _title - Display name or display name + tooltip (optional, default: same as setting name) + [LSTRING(set_cat_main)], // _category - Category for the settings menu + optional sub-category + true, // _valueInfo - Extra properties of the setting depending of _settingType. See examples below + 1, // _isGlobal - 1: all clients share the same setting, 2: setting can't be overwritten (optional, default: 0) + {}, // _script - Script to execute when setting is changed. (optional) + false // _needRestart - Setting will be marked as needing mission restart after being changed. (optional, default false) +] call CBA_fnc_addSetting; diff --git a/addons/wardrobe/config.cpp b/addons/wardrobe/config.cpp new file mode 100644 index 00000000000..89b33ae3244 --- /dev/null +++ b/addons/wardrobe/config.cpp @@ -0,0 +1,40 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + + // Meta information for editor + name = ADDON_NAME; + author = "$STR_wardrobe_author"; + authors[] = {"OverlordZorn [CVO]"}; + + url = "$STR_mod_URL"; + + VERSION_CONFIG; + + // Addon Specific Information + // Minimum compatible version. When the game's version is lower, pop-up warning will appear when launching the game. + requiredVersion = 2.02; + + // Required addons, used for setting load order. + // When any of the addons is missing, pop-up warning will appear when launching the game. + requiredAddons[] = {QPVAR(main),"cba_main", "ace_interact_menu"}; + + // Optional. If this is 1, if any of requiredAddons[] entry is missing in your game the entire config will be ignored and return no error (but in rpt) so useful to make a compat Mod (Since Arma 3 2.14) + skipWhenMissingDependencies = 1; + + // List of objects (CfgVehicles classes) contained in the addon. Important also for Zeus content (units and groups) + units[] = {}; + + // List of weapons (CfgWeapons classes) contained in the addon. + weapons[] = {}; + + }; +}; + +#include "CfgFunctions.hpp" +#include "XEH\CfgXEH.hpp" + +#include "CfgVehicles.hpp" + +#include "Baseclass.hpp" \ No newline at end of file diff --git a/addons/wardrobe/functions/ace_intel/fn_getIndexFromMagID.sqf b/addons/wardrobe/functions/ace_intel/fn_getIndexFromMagID.sqf new file mode 100644 index 00000000000..ce6b6d66071 --- /dev/null +++ b/addons/wardrobe/functions/ace_intel/fn_getIndexFromMagID.sqf @@ -0,0 +1,24 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* function to return the data index based of the magazine ID +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +params [ + ["_magazineID", "", [""] ] +]; + +if !(_magazineID in allVariables ace_intelItems_intelMap) exitWith { -1 }; + +ace_intelItems_intelMap getVariable _magazineID diff --git a/addons/wardrobe/functions/ace_intel/fn_getMagIDs.sqf b/addons/wardrobe/functions/ace_intel/fn_getMagIDs.sqf new file mode 100644 index 00000000000..eb1df20c373 --- /dev/null +++ b/addons/wardrobe/functions/ace_intel/fn_getMagIDs.sqf @@ -0,0 +1,26 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* function to return the magazine ID's of certain magazines +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +params [ + ["_unit", objNull, [objNull] ], + ["_className", "", [""] ] +]; + +if ( _className == "" || { _unit isEqualTo objNull } ) exitWith {}; + +toFixed 0; +(magazinesAmmoFull _unit) apply { [_x#0, _x#-2, _x#-1] } select { _x#0 == _className } apply { format ["%1/%2", _x#1,_x#2] } \ No newline at end of file diff --git a/addons/wardrobe/functions/ace_intel/fn_setIndexForMagID.sqf b/addons/wardrobe/functions/ace_intel/fn_setIndexForMagID.sqf new file mode 100644 index 00000000000..142f5952031 --- /dev/null +++ b/addons/wardrobe/functions/ace_intel/fn_setIndexForMagID.sqf @@ -0,0 +1,25 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* This function sets the data-index for a magID +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +params [ + ["_magID", "", [""] ], + ["_index", 0, [0] ] +]; + +if (_index == -1) exitWith {}; + +ace_intelItems_intelMap setVariable [_magID, _index, true]; \ No newline at end of file diff --git a/addons/wardrobe/functions/action/fn_addActions.sqf b/addons/wardrobe/functions/action/fn_addActions.sqf new file mode 100644 index 00000000000..c3fc715aa8c --- /dev/null +++ b/addons/wardrobe/functions/action/fn_addActions.sqf @@ -0,0 +1,49 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* This function creates children for every modifiable Item. +* Each Modifiable Item will have its own children in regard of the items it can be changed towards. +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call cvo_fnc_sth +* +* Public: Yes +*/ + +params ["_unit"]; + + +private _modifiableItems = [_unit] call FUNC(getItems_modifiable_current); +diag_log format ['[CVO](debug)(fn_addActions) _modifiableItems: %1', _modifiableItems]; +private _actions = []; + +{ + private _params = [_x]; + private _cfg = [_x] call CBA_fnc_getItemConfig; + + diag_log format ['[CVO](debug)(fn_addActions) _cfg: %1', _cfg]; + + private _aceAction = [ + _x // * 0: Action name + ,getText (_cfg >> "displayName") // * 1: Name of the action shown in the menu + ,getText (_cfg >> "picture") // * 2: Icon "\A3\ui_f\data\igui\cfg\simpleTasks\types\backpack_ca.paa" + ,{} // * 3: Statement + ,{true} // * 4: Condition + ,FUNC(addActions_children) // * 5: Insert children code (Optional) + ,_params // * 6: Action parameters (Optional) + // ,[0,0,0] // * 7: Position (Position array, Position code or Selection Name) , or (Optional) + // ,20 // * 8: Distance (Optional) + // ,[false,false,false,false,false] // * 9: Other parameters [showDisabled,enableInside,canCollapse,runOnHover,doNotCheckLOS] (Optional) + // ,{} // * 10: Modifier function (Optional) + ] call ace_interact_menu_fnc_createAction; + _actions pushBack [_aceAction, [], _target]; + +} forEach _modifiableItems; + +_actions \ No newline at end of file diff --git a/addons/wardrobe/functions/action/fn_addActions_children.sqf b/addons/wardrobe/functions/action/fn_addActions_children.sqf new file mode 100644 index 00000000000..7bc4e5810b6 --- /dev/null +++ b/addons/wardrobe/functions/action/fn_addActions_children.sqf @@ -0,0 +1,51 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* Function to create the sub-children for each modifiable item +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +params ["_target", "_player", "_actionParams"]; + +_actionParams params ["_modifiableItem"]; + +private _cfg_origin = [_modifiableItem] call CBA_fnc_getItemConfig; + +private _newItems = [_cfg_origin >> QPVAR(wardrobe) >> "modifiableTo"] call BIS_fnc_getCfgDataArray; + +private _actions = []; + +{ + private _targetItem = _x; + private _cfg_target = [_targetItem] call CBA_fnc_getItemConfig; + + private _params = [_cfg_origin, _cfg_target]; + + private _aceAction = [ + _targetItem // * 0: Action name + ,[_cfg_target] call FUNC(getAction_Name) // * 1: Name of the action shown in the menu + ,[_cfg_target] call FUNC(getAction_Icon) // * 2: Icon "\A3\ui_f\data\igui\cfg\simpleTasks\types\backpack_ca.paa" + ,FUNC(replace) // * 3: Statement + ,{true} // * 4: Condition + ,{} // * 5: Insert children code (Optional) + ,_params // * 6: Action parameters (Optional) + // ,[0,0,0] // * 7: Position (Position array, Position code or Selection Name) , or (Optional) + // ,20 // * 8: Distance (Optional) + // ,[false,false,false,false,false] // * 9: Other parameters [showDisabled,enableInside,canCollapse,runOnHover,doNotCheckLOS] (Optional) + // ,{} // * 10: Modifier function (Optional) + ] call ace_interact_menu_fnc_createAction; + _actions pushBack [_aceAction, [], _target]; + +} forEach _newItems; + +_actions \ No newline at end of file diff --git a/addons/wardrobe/functions/action/fn_addActions_condition.sqf b/addons/wardrobe/functions/action/fn_addActions_condition.sqf new file mode 100644 index 00000000000..18b47ef6a46 --- /dev/null +++ b/addons/wardrobe/functions/action/fn_addActions_condition.sqf @@ -0,0 +1,20 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* Function to check if the player has an item that can be modified. +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +params ["_player"]; + +missionNamespace getVariable [QSET(enable), false] && { count ([_player] call FUNC(getItems_modifiable_current)) > 0 } \ No newline at end of file diff --git a/addons/wardrobe/functions/action/fn_getAction_Icon.sqf b/addons/wardrobe/functions/action/fn_getAction_Icon.sqf new file mode 100644 index 00000000000..a3119d6957f --- /dev/null +++ b/addons/wardrobe/functions/action/fn_getAction_Icon.sqf @@ -0,0 +1,22 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* This Function checks if the Target Item has an Alternative Picture for the Action, if not, it returns the picture property +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +params [ ["_cfg", configNull, [configNull] ] ]; + +private _altDispIcon = getText (_cfg >> QADDON >> "alternativePicture"); +if (_altDispIcon isEqualTo "") then { getText (_cfg >> "picture") } else { _altDispIcon } + diff --git a/addons/wardrobe/functions/action/fn_getAction_Name.sqf b/addons/wardrobe/functions/action/fn_getAction_Name.sqf new file mode 100644 index 00000000000..afde79c357d --- /dev/null +++ b/addons/wardrobe/functions/action/fn_getAction_Name.sqf @@ -0,0 +1,22 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* This Function checks if the Target Item has an Alternative String for the Action, if not, it returns the displayName property +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +params [ ["_cfg", configNull, [configNull] ] ]; + +private _altDispName = getText (_cfg >> QADDON >> "alternativeDisplayName"); +if (_altDispName isEqualTo "") then { getText (_cfg >> "displayName") } else { _altDispName }; + diff --git a/addons/wardrobe/functions/cache/fn_cache_clear.sqf b/addons/wardrobe/functions/cache/fn_cache_clear.sqf new file mode 100644 index 00000000000..f60461add6a --- /dev/null +++ b/addons/wardrobe/functions/cache/fn_cache_clear.sqf @@ -0,0 +1,26 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* Function to clear an entry from the cache-database. +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + + +// Retrieve hashmap + +params [ ["_key", "", [""]] ]; + +private _map = missionNamespace getVariable [QGVAR(cache), "404"]; +_map deleteAt _key; + +if (count _map == 0) then { missionNamespace setVariable [QGVAR(cache),nil] }; \ No newline at end of file diff --git a/addons/wardrobe/functions/cache/fn_cache_db.sqf b/addons/wardrobe/functions/cache/fn_cache_db.sqf new file mode 100644 index 00000000000..6039c3f3595 --- /dev/null +++ b/addons/wardrobe/functions/cache/fn_cache_db.sqf @@ -0,0 +1,27 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* [Description] +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +// Retrieve hashmap + +private _map = missionNamespace getVariable [QGVAR(cache), "404"]; + +if (_map isEqualTo "404") then { + _map = createHashMap; + missionNamespace setVariable [QGVAR(cache), _map]; +}; + +_map \ No newline at end of file diff --git a/addons/wardrobe/functions/cache/fn_cache_get.sqf b/addons/wardrobe/functions/cache/fn_cache_get.sqf new file mode 100644 index 00000000000..bfa2648f2ff --- /dev/null +++ b/addons/wardrobe/functions/cache/fn_cache_get.sqf @@ -0,0 +1,24 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* function to retrieve a value from the database. returns "404" if not stored or, when provided will execute the alternative code and store said result. +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +params [ [ "_key", "", [""] ], [ "_else", "404", [{}] ] ]; + +if (_else isEqualTo "404") then { + [] call FUNC(cache_db) getOrDefault [_key, "404"]; +} else { + [] call FUNC(cache_db) getOrDefaultCall [_key, _else, true]; +}; diff --git a/addons/wardrobe/functions/cache/fn_cache_set.sqf b/addons/wardrobe/functions/cache/fn_cache_set.sqf new file mode 100644 index 00000000000..7c0f4cf9453 --- /dev/null +++ b/addons/wardrobe/functions/cache/fn_cache_set.sqf @@ -0,0 +1,26 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* Function to store a value into under a key into the addons cache +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +params [ ["_key", "", [""] ], ["_value", "404"] ]; + +private _db = [] call FUNC(cache_db); + +if (_value isEqualTo "404") exitWith { false }; + +_db set [_key, _value]; + +true \ No newline at end of file diff --git a/addons/wardrobe/functions/fn_checkItem.sqf b/addons/wardrobe/functions/fn_checkItem.sqf new file mode 100644 index 00000000000..3ae56ddac07 --- /dev/null +++ b/addons/wardrobe/functions/fn_checkItem.sqf @@ -0,0 +1,25 @@ +#include "../script_component.hpp" + +/* +* Author: Zorn +* function to check if the this item is modifiable - returns boolean +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +params [ + ["_cfg", configNull, [configNull] ] +]; + + +if (isNull _cfg) exitWith {false}; +// Checks if the config has the property without it being inherited(!) +count configProperties [_cfg >> QADDON, Q(configName _x == QQ(modifiableTo)), false] > 0 \ No newline at end of file diff --git a/addons/wardrobe/functions/fn_clearOnClose.sqf b/addons/wardrobe/functions/fn_clearOnClose.sqf new file mode 100644 index 00000000000..6b4669d93f6 --- /dev/null +++ b/addons/wardrobe/functions/fn_clearOnClose.sqf @@ -0,0 +1,39 @@ +#include "../script_component.hpp" + +/* +* Author: Zorn +* Function to request the clearing of the cache on closing of the menu +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ +// Cleanup Cache once the interaction menu is closed + +params [ ["_key", "", [""]] ]; + +private _queue = missionNamespace getVariable [QGVAR(menu_clear_queue), "404"]; + +if (_queue isEqualTo "404") then { + _queue = []; + [ + "ace_interactMenuClosed", + { + if (_this isNotEqualTo [1]) exitWith {}; + + { [_x] call FUNC(cache_clear) } forEach ( missionNamespace getVariable [QGVAR(menu_clear_queue), [] ] ); + + missionNamespace setVariable [QGVAR(menu_clear_queue), nil ]; + [_thisType, _thisId] call CBA_fnc_removeEventHandler; + } + ] call CBA_fnc_addEventHandlerArgs; + missionNamespace setVariable [QGVAR(menu_clear_queue), _queue]; +}; + +_queue pushBackUnique _key; \ No newline at end of file diff --git a/addons/wardrobe/functions/fn_getCfgDataRandom.sqf b/addons/wardrobe/functions/fn_getCfgDataRandom.sqf new file mode 100644 index 00000000000..cc28339a141 --- /dev/null +++ b/addons/wardrobe/functions/fn_getCfgDataRandom.sqf @@ -0,0 +1,25 @@ +#include "../script_component.hpp" + +/* +* Author: Zorn +* This function extracts data from a config property. If it is an Array, it will select a random entry from the array, otherwise it will simply return the provided data. +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call cigs_wardrobe_fnc_getCfgDataRandom +* +* Public: No +*/ + +params [ + [ "_cfg", configNull, [configNull] ] +]; + +if (_cfg isEqualTo configNull) exitWith {nil}; +private _data = [_cfg] call BIS_fnc_getCfgData; +if (_data isEqualType []) then { _data = selectRandom _data }; +_data \ No newline at end of file diff --git a/addons/wardrobe/functions/fn_postInit.sqf b/addons/wardrobe/functions/fn_postInit.sqf new file mode 100644 index 00000000000..b689c089e34 --- /dev/null +++ b/addons/wardrobe/functions/fn_postInit.sqf @@ -0,0 +1,18 @@ +#include "../script_component.hpp" + +/* +* Author: Zorn +* [Description] +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +[ QGVAR(EH_say3d), FUNC(say3d) ] call CBA_fnc_addEventHandler; \ No newline at end of file diff --git a/addons/wardrobe/functions/fn_say3d.sqf b/addons/wardrobe/functions/fn_say3d.sqf new file mode 100644 index 00000000000..7b1fdf9b21d --- /dev/null +++ b/addons/wardrobe/functions/fn_say3d.sqf @@ -0,0 +1,35 @@ +#include "../script_component.hpp" + +/* +* Author: Zorn +* Function to execute say3d globally - triggered as 3cba event. +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +params [ + ["_source", objNull, [objNull] ], + ["_sound", [""], ["", []] ] +]; + +if (_sound isEqualType [] && {_sound#0 == ""} || {_sound isEqualType "" && {_sound == ""}}) exitWith {}; + +_sound params [ +"_className", +["_distance", 100, [0] ], +["_pitch", 0.95 + random 0.1, [0] ], +["_isSpeech", false, [false, 0] ], +["_offSet", 0, [0] ], +["_simSpeedOfSound", false, [false] ] +]; + + +_source say3D [_className, _distance, _pitch, _isSpeech, _offSet, _simSpeedOfSound]; \ No newline at end of file diff --git a/addons/wardrobe/functions/getItems/fn_getItems_all.sqf b/addons/wardrobe/functions/getItems/fn_getItems_all.sqf new file mode 100644 index 00000000000..322a23a609a --- /dev/null +++ b/addons/wardrobe/functions/getItems/fn_getItems_all.sqf @@ -0,0 +1,30 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* Retrieves a list of items on the user - will be cached for the duration of the interaction. +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +params [ + ["_player", objNull, [objNull]] +]; + + +// Cleanup Cache once the interaction menu is closed +["items_all"] call FUNC(clearOnClose); +[ + "items_all", + { + flatten getUnitLoadout _player select { _x isEqualType "" && { _x != ""}}; + } +] call FUNC(cache_get); \ No newline at end of file diff --git a/addons/wardrobe/functions/getItems/fn_getItems_modifiable_all.sqf b/addons/wardrobe/functions/getItems/fn_getItems_modifiable_all.sqf new file mode 100644 index 00000000000..b8427d635ea --- /dev/null +++ b/addons/wardrobe/functions/getItems/fn_getItems_modifiable_all.sqf @@ -0,0 +1,35 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* Function to retrieve modifiable items. Cached Array for the duration of the interaction menu. +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + + +params [ + ["_player", objNull, [objNull]] +]; + +// Cleanup Cache once the interaction menu is closed +["items_modifiable_all"] call FUNC(clearOnClose); +[ + "items_modifiable_all", + { + private _array = []; + { + private _cfg = [_x] call CBA_fnc_getItemConfig; + if ( [_cfg] call FUNC(checkItem) && { count ([_cfg >> QADDON >> "modifiableTo"] call BIS_fnc_getCfgDataArray) > 0 } ) then { _array pushBack _x; }; + } forEach ( [_player] call FUNC(getItems_all) ); + _array + } +] call FUNC(cache_get); \ No newline at end of file diff --git a/addons/wardrobe/functions/getItems/fn_getItems_modifiable_current.sqf b/addons/wardrobe/functions/getItems/fn_getItems_modifiable_current.sqf new file mode 100644 index 00000000000..b3929b2be0a --- /dev/null +++ b/addons/wardrobe/functions/getItems/fn_getItems_modifiable_current.sqf @@ -0,0 +1,36 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* Function to retrieve currently worn, modifiable items. Cached Array for the duration of the interaction menu. +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + + +params [ + ["_player", objNull, [objNull]] +]; + +// Cleanup Cache once the interaction menu is closed +["items_modifiable_current"] call FUNC(clearOnClose); +[ + "items_modifiable_current", + { + private _array = []; + { + private _cfg = [_x] call CBA_fnc_getItemConfig; + if ( [_cfg] call FUNC(checkItem) && { count ([_cfg >> QADDON >> "modifiableTo"] call BIS_fnc_getCfgDataArray) > 0 } ) then { _array pushBack _x; }; + + } forEach ( [headgear _player, goggles _player, uniform _player, vest _player, backpack _player] - [""] ); + _array + } +] call FUNC(cache_get); \ No newline at end of file diff --git a/addons/wardrobe/functions/replace/fn_replace.sqf b/addons/wardrobe/functions/replace/fn_replace.sqf new file mode 100644 index 00000000000..3a9ab735057 --- /dev/null +++ b/addons/wardrobe/functions/replace/fn_replace.sqf @@ -0,0 +1,81 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* function to removes the modifiableItem and replaces it with the target item +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +#define DISTANCE 50 + +params ["_target", "_player", "_actionParams"]; +_actionParams params ["_cfg_origin", "_cfg_tgt"]; + + +[ _player, getText (_cfg_tgt >> Q(ADDON) >> "gesture") ] call ace_common_fnc_doGesture; + +private _typeNumber = getNumber (_cfg_origin >> "ItemInfo" >> "type"); + +private _additionalParams = ""; + +private _replaceCode = switch ( _typeNumber ) do { + case TYPE_GOGGLE: { FUNC(replace_facewear) }; + case TYPE_HEADGEAR: { FUNC(replace_headgear) }; + case TYPE_UNIFORM: { _additionalParams = "UNIFORM"; FUNC(replace_uniform) }; + case TYPE_VEST: { _additionalParams = "VEST"; FUNC(replace_uniform) }; + case TYPE_BACKPACK: { _additionalParams = "BACKPACK"; FUNC(replace_uniform) }; +}; + +private _duration = getNumber (_cfg_tgt>> Q(ADDON) >> "duration") max 1; +// Plays Random Sound At the Beginning +private _sound = [_cfg_tgt >> Q(ADDON) >> "sound"] call FUNC(getCfgDataRandom); +private _sound_timing = getNumber (_cfg_tgt>> Q(ADDON) >> "sound_timing") max 0 min 1; +// TODO - refactor sound playing +if (_sound != "") then { [QGVAR(EH_say3d), [_player, _sound]] call CBA_fnc_globalEvent; }; + + +private _notify_img = getText (_cfg_tgt >> "picture"); +if !(".paa" in _notify_img) then { _notify_img = [_notify_img,"paa"] joinString "." }; + +private _params_notify = [[ _notify_img, 4], [getText (_cfg_tgt >> "displayName")], true ]; +private _params_replace = [_player, _cfg_origin, _cfg_tgt, _additionalParams ]; + +// Dart made a PR to CBA to impove depricated Functions. I plan to use these once cba gets updated. +// [ [ _player ], [ _sound, 50 ] ] call CBA_fnc_globalSay; +private _params_soundEnd = [ QGVAR(EH_say3d), [ _player, [ _cfg_tgt >> Q(ADDON) >> "soundEnd" ] call FUNC(getCfgDataRandom), DISTANCE, 0.95 + random 0.1 ] ]; + +if ( _duration > 1 ) then { + + [ + _duration // * 0: Total Time (in game "time" seconds) + ,[_replaceCode, _params_replace, _params_soundEnd, _params_notify] // * 1: Arguments, passed to condition, fail and finish + // * 2: On Finish: Code called or STRING raised as event. + ,{ + params ["_args", "_elapsedTime", "_totalTime", "_errorCode"]; + _args params ["_replaceCode", "_params_replace", "_params_soundEnd", "_params_notify"]; + + _params_replace call _replaceCode; + _params_notify call CBA_fnc_notify; + _params_soundEnd call CBA_fnc_globalEvent; + + + } + // * 3: On Failure: Code called or STRING raised as event. + ,{} + ,"" // * 4: Localized Title (default: "") + ] call ace_common_fnc_progressBar; + +} else { + [ _replaceCode, _params_replace, 1.0 ] call CBA_fnc_waitAndExecute; + [ CBA_fnc_globalEvent, _params_soundEnd, 1.0 ] call CBA_fnc_waitAndExecute; + [ CBA_fnc_notify, _params_notify, 1.2 ] call CBA_fnc_waitAndExecute; +}; diff --git a/addons/wardrobe/functions/replace/fn_replace_facewear.sqf b/addons/wardrobe/functions/replace/fn_replace_facewear.sqf new file mode 100644 index 00000000000..e245f8a8569 --- /dev/null +++ b/addons/wardrobe/functions/replace/fn_replace_facewear.sqf @@ -0,0 +1,23 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* Function to replace a persons goggles/facewear. +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +ZRN_LOG_MSG_1(init,_this); + +params ["_player", "_cfg_origin", "_cfg_tgt"]; + +removeGoggles _player; +_player addGoggles configName _cfg_tgt; \ No newline at end of file diff --git a/addons/wardrobe/functions/replace/fn_replace_headgear.sqf b/addons/wardrobe/functions/replace/fn_replace_headgear.sqf new file mode 100644 index 00000000000..b33abf195c0 --- /dev/null +++ b/addons/wardrobe/functions/replace/fn_replace_headgear.sqf @@ -0,0 +1,23 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* Function to replace a persons Headgear/Helmet slot. +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +ZRN_LOG_MSG_1(init,_this); + +params ["_player", "_cfg_origin", "_cfg_tgt"]; + +removeHeadgear _player; +_player addHeadgear configName _cfg_tgt; diff --git a/addons/wardrobe/functions/replace/fn_replace_uniform.sqf b/addons/wardrobe/functions/replace/fn_replace_uniform.sqf new file mode 100644 index 00000000000..b7e35a5f569 --- /dev/null +++ b/addons/wardrobe/functions/replace/fn_replace_uniform.sqf @@ -0,0 +1,54 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* Function to replace a persons Uniform while maintaining the content of the uniform. +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +ZRN_LOG_MSG_1(init,_this); + +params ["_player", "_cfg_origin", "_cfg_tgt", "_case"]; + + +toFixed 0; +private _magazineDetails = (magazinesAmmoFull _player) apply { [_x#0, _x#-2, _x#-1] }; +private _loadout = [_player] call CBA_fnc_getLoadout; + + +//// Handle Special Cases - Pre Replace +// ACE Intel Items +private _hasDocument = _magazineDetails findIf { _x#0 == "acex_intelitems_document"} > -1; +private _hasNotepad = _magazineDetails findIf { _x#0 == "acex_intelitems_notepad" } > -1; +private _hasPhoto = _magazineDetails findIf { _x#0 == "acex_intelitems_photo" } > -1; +if (_hasDocument) then { _hasDocument = [_player, "acex_intelitems_document" ] call FUNC(getMagIDs) apply { [_x] call FUNC(getIndexFromMagID) } }; +if (_hasNotepad) then { _hasNotepad = [_player, "acex_intelitems_notepad" ] call FUNC(getMagIDs) apply { [_x] call FUNC(getIndexFromMagID) } }; +if (_hasPhoto) then { _hasPhoto = [_player, "acex_intelitems_photo" ] call FUNC(getMagIDs) apply { [_x] call FUNC(getIndexFromMagID) } }; + + +//// Replace Wearable +// Change Wearable +switch (_case) do { + case "UNIFORM": { _loadout # 0 # 3 set [0, configName _cfg_tgt]; }; + case "VEST": { _loadout # 0 # 4 set [0, configName _cfg_tgt]; }; + case "BACKPACK": { _loadout # 0 # 5 set [0, configName _cfg_tgt]; }; + default { diag_log format ['[CVO](debug)(fn_replace_uniform) Failed! - _case: %1', _case]; }; +}; + +// Apply new Loadout +[_player, _loadout] call CBA_fnc_setLoadout; + +//// Handle Special Cases - Post Replace +// ACE Intel Items +if (_hasDocument isEqualType []) then { { [_x, _hasDocument # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_document" ] call FUNC(getMagIDs) ); }; +if (_hasNotepad isEqualType []) then { { [_x, _hasNotepad # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_notepad" ] call FUNC(getMagIDs) ); }; +if (_hasPhoto isEqualType []) then { { [_x, _hasPhoto # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_photo" ] call FUNC(getMagIDs) ); }; \ No newline at end of file diff --git a/addons/wardrobe/script_component.hpp b/addons/wardrobe/script_component.hpp new file mode 100644 index 00000000000..22f97fade07 --- /dev/null +++ b/addons/wardrobe/script_component.hpp @@ -0,0 +1,18 @@ +#define COMPONENT wardrobe +#define COMPONENT_BEAUTIFIED Wardrobe +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_VOLUME + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_VOLUME + #define DEBUG_SETTINGS DEBUG_SETTINGS_VOLUME +#endif + +#include "\z\ace\addons\main\script_macros.hpp" +#include "\z\ace\addons\wardrobe\script_macros_zrn.hpp" \ No newline at end of file diff --git a/addons/wardrobe/script_macros_zrn.hpp b/addons/wardrobe/script_macros_zrn.hpp new file mode 100644 index 00000000000..90138ec1f7b --- /dev/null +++ b/addons/wardrobe/script_macros_zrn.hpp @@ -0,0 +1,139 @@ +#ifdef __A3_DEBUG__ + #define _ZRN_DEBUG_ +#endif + +// CBA Settings +#define SET(var1) TRIPLES(ADDON,set,var1) +#define QSET(var1) Q(SET(var1)) +#define QQSET(var1) QQ(SET(var1)) +#define ESET(var1,var2) TRIPLES(DOUBLES(PREFIX,var1),SET,var2) +#define QESET(var1,var2) Q(ESET(var1,var2)) +#define QQESET(var1,var2) QQ(ESET(var1,var2)) + +// Stringtable.xml - use LSTRING() instead +// #define XML(var1) TRIPLES(STR,ADDON,var1) +// #define QXML(var1) Q(XML(var1)) +#define SETLSTRING(key) [LSTRING(DOUBLES(set,key)),LSTRING(TRIPLES(set,key,desc))] + +// hashMapObjects +#define OGET(var1) (_self get Q(var1)) +#define OSET(var1,var2) (_self set [Q(var1), var2]) + +// Quotes +#ifndef QUOTE + #define QUOTE(var1) #var1 +#endif +#define QQUOTE(var1) QUOTE(QUOTE(var1)) +#define Q(var1) QUOTE(var1) +#define QQ(var1) QQUOTE(var1) + +#define QADDON Q(ADDON) +#define QPREFIX Q(PREFIX) +#define QCOMPONENT Q(COMPONENT) + +// Prefix Function +#define PFUNC(var1) TRIPLES(PREFIX,fnc,var1) +#define QPFUNC(var1) QUOTE(PFUNC(var1)) +#define QQPFUNC(var1) QUOTE(QPFUNC(var1)) + + +// Prefix Variables +#define PVAR(var1) DOUBLES(PREFIX,var1) +#define QPVAR(var1) QUOTE(PVAR(var1)) +#define QQPVAR(var1) QUOTE(QPVAR(var1)) + +// Component Variables +#define CVAR(var1) DOUBLES(COMPONENT,var1) +#define QCVAR(var1) QUOTE(CVAR(var1)) +#define QQCVAR(var1) QUOTE(QCVAR(var1)) + +// missionNamespace set/get Variables + +#define SETMGVAR(name,value) (missionNamespace setVariable [QGVAR(name),value]) +#define SETMGVAR_PUBLIC(name,value,public) (missionNamespace setVariable [QGVAR(name),value,public]) + +#define GETMGVAR(name,default) (missionNamespace getVariable [QGVAR(name),default]) + +// CfgPatches Stuff +#ifndef PREFIX_BEAUTIFIED + #define PREFIX_BEAUTIFIED PREFIX +#endif +#ifndef COMPONENT_BEAUTIFIED + #define COMPONENT_BEAUTIFIED COMPONENT +#endif + +#define ADDON_NAME Q(PREFIX_BEAUTIFIED - COMPONENT_BEAUTIFIED) + +// Paths +#define PATH_TO_FUNC QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\functions) +#define PATH_TO_FUNC_SUB(var1) QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\functions\var1) +#define PATH_TO_ADDON(var1) QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\var1) +#define PATH_TO_ADDON_2(var1,var2) QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\var1\var2) +#define PATH_TO_ADDON_3(var1,var2,var3) QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\var1\var2\var3) + +#define QPATH_TO_ADDON(var1) QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\var1) +#define QQPATH_TO_ADDON(var1) Q(QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\var1)) + +// Debug +// Doesnt seem to work currently +#ifdef _ZRN_DEBUG_ + #define _DEBUG_POSTINIT_ postInit = 1; + #define _DEBUG_PREINIT_ preInit = 1; +#else + #define _DEBUG_POSTINIT_ postInit = 0; + #define _DEBUG_PREINIT_ preInit = 0; +#endif + + +#define DEBUG_HEADER format [QUOTE([PREFIX][COMPONENT](%1)),_fnc_scriptName] + +#define ZRN_LOG_MSG(MSG) diag_log (DEBUG_HEADER + " " + QUOTE(MSG)) + +#ifdef _ZRN_DEBUG_ + #define ZRN_SCRIPTNAME(var1) private _fnc_scriptName = Q(var1) + + #define ZRN_LOG_MSG_1(MSG,A) diag_log (DEBUG_HEADER + (format [' %1 - A: %2',QUOTE(MSG),RETNIL(A)])) + #define ZRN_LOG_MSG_2(MSG,A,B) diag_log (DEBUG_HEADER + (format [' %1 - A: %2 - B: %3',QUOTE(MSG),RETNIL(A),RETNIL(B)])) + #define ZRN_LOG_MSG_3(MSG,A,B,C) diag_log (DEBUG_HEADER + (format [' %1 - A: %2 - B: %3 - C: %4',QUOTE(MSG),RETNIL(A),RETNIL(B),RETNIL(C)])) + #define ZRN_LOG_MSG_4(MSG,A,B,C,D) diag_log (DEBUG_HEADER + (format [' %1 - A: %2 - B: %3 - C: %4 - D: %5',QUOTE(MSG),RETNIL(A),RETNIL(B),RETNIL(C),RETNIL(D)])) + #define ZRN_LOG_MSG_5(MSG,A,B,C,D,E) diag_log (DEBUG_HEADER + (format [' %1 - A: %2 - B: %3 - C: %4 - D: %5 - E: %6',QUOTE(MSG),RETNIL(A),RETNIL(B),RETNIL(C),RETNIL(D),RETNIL(E)])) + #define ZRN_LOG_MSG_6(MSG,A,B,C,D,E,F) diag_log (DEBUG_HEADER + (format [' %1 - A: %2 - B: %3 - C: %4 - D: %5 - E: %6 - F: %7',QUOTE(MSG),RETNIL(A),RETNIL(B),RETNIL(C),RETNIL(D),RETNIL(E),RETNIL(F)])) + #define ZRN_LOG_MSG_7(MSG,A,B,C,D,E,F,G) diag_log (DEBUG_HEADER + (format [' %1 - A: %2 - B: %3 - C: %4 - D: %5 - E: %6 - F: %7 - H: %8',QUOTE(MSG),RETNIL(A),RETNIL(B),RETNIL(C),RETNIL(D),RETNIL(E),RETNIL(F),RETNIL(G)])) + #define ZRN_LOG_MSG_8(MSG,A,B,C,D,E,F,G,H) diag_log (DEBUG_HEADER + (format [' %1 - A: %2 - B: %3 - C: %4 - D: %5 - E: %6 - F: %7 - H: %8 - I: %9',QUOTE(MSG),RETNIL(A),RETNIL(B),RETNIL(C),RETNIL(D),RETNIL(E),RETNIL(F),RETNIL(G),RETNIL(H)])) + + #define ZRN_LOG_1(A) diag_log (DEBUG_HEADER + (format [' A: %1',RETNIL(A)])) + #define ZRN_LOG_2(A,B) diag_log (DEBUG_HEADER + (format [' A: %1 - B: %2',RETNIL(A),RETNIL(B)])) + #define ZRN_LOG_3(A,B,C) diag_log (DEBUG_HEADER + (format [' A: %1 - B: %2 - C: %3',RETNIL(A),RETNIL(B),RETNIL(C)])) + #define ZRN_LOG_4(A,B,C,D) diag_log (DEBUG_HEADER + (format [' A: %1 - B: %2 - C: %3 - D: %4',RETNIL(A),RETNIL(B),RETNIL(C),RETNIL(D)])) + #define ZRN_LOG_5(A,B,C,D,E) diag_log (DEBUG_HEADER + (format [' A: %1 - B: %2 - C: %3 - D: %4 - E: %5',RETNIL(A),RETNIL(B),RETNIL(C),RETNIL(D),RETNIL(E)])) + #define ZRN_LOG_6(A,B,C,D,E,F) diag_log (DEBUG_HEADER + (format [' A: %1 - B: %2 - C: %3 - D: %4 - E: %5 - F: %6',RETNIL(A),RETNIL(B),RETNIL(C),RETNIL(D),RETNIL(E),RETNIL(F)])) + #define ZRN_LOG_7(A,B,C,D,E,F,G) diag_log (DEBUG_HEADER + (format [' A: %1 - B: %2 - C: %3 - D: %4 - E: %5 - F: %6 - H: %7',RETNIL(A),RETNIL(B),RETNIL(C),RETNIL(D),RETNIL(E),RETNIL(F),RETNIL(G)])) + #define ZRN_LOG_8(A,B,C,D,E,F,G,H) diag_log (DEBUG_HEADER + (format [' A: %1 - B: %2 - C: %3 - D: %4 - E: %5 - F: %6 - H: %7 - I: %8',RETNIL(A),RETNIL(B),RETNIL(C),RETNIL(D),RETNIL(E),RETNIL(F),RETNIL(G),RETNIL(H)])) + + #define ZRN_LOG_HMO(var1) { if ('#' in _x || 'Meth' in _x) then {continue}; diag_log (DEBUG_HEADER + (format [' %3 - %1 - %2', _x, _y, Q(MSG)])) } forEach var1; + #define ZRN_LOG_MSG_HMO(MSG,var1) { if ('#' in _x || 'Meth' in _x) then {continue}; diag_log (DEBUG_HEADER + (format [' %3 - %1 - %2', _x, _y, Q(MSG)])) } forEach var1; + +#else + #define ZRN_SCRIPTNAME(var1) + + #define ZRN_LOG_MSG_1(MSG,A) + #define ZRN_LOG_MSG_2(MSG,A,B) + #define ZRN_LOG_MSG_3(MSG,A,B,C) + #define ZRN_LOG_MSG_4(MSG,A,B,C,D) + #define ZRN_LOG_MSG_5(MSG,A,B,C,D,E) + #define ZRN_LOG_MSG_6(MSG,A,B,C,D,E,F) + #define ZRN_LOG_MSG_7(MSG,A,B,C,D,E,F,G) + #define ZRN_LOG_MSG_8(MSG,A,B,C,D,E,F,G,H) + + #define ZRN_LOG_1(A) + #define ZRN_LOG_2(A,B) + #define ZRN_LOG_3(A,B,C) + #define ZRN_LOG_4(A,B,C,D) + #define ZRN_LOG_5(A,B,C,D,E) + #define ZRN_LOG_6(A,B,C,D,E,F) + #define ZRN_LOG_7(A,B,C,D,E,F,G) + #define ZRN_LOG_8(A,B,C,D,E,F,G,H) + + #define ZRN_LOG_HMO(var1) + #define ZRN_LOG_MSG_HMO(MSG,var1) +#endif \ No newline at end of file diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml new file mode 100644 index 00000000000..06706f928a7 --- /dev/null +++ b/addons/wardrobe/stringtable.xml @@ -0,0 +1,63 @@ + + + + + + OverlordZorn[CVO] + OverlordZorn[CVO] + + + + + ACE Wardrobe + ACE Wardrobe + + + + + Enable + + + When Enabled, will let the player use the Wardrobe Actions. + + + + + Wardrobe + Wardrobe + + + Take Gloves Off + Take Gloves Off + + + Wear Gloves + Wear Gloves + + + Close Jacket + Close Jacket + + + Open Jacket + Open Jacket + + + Roll sleeves Down + Roll sleeves Down + + + Roll sleeves Up + Roll sleeves Up + + + Visor Down + Visor Down + + + Visor Up + Visor Up + + + + From 2a057ef1676e3cf3ca0816d91b674605b08e4ad1 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 27 Dec 2024 14:05:52 +0100 Subject: [PATCH 004/305] compat integration --- .../compat_gm_wardrobe}/CfgWardrobe.hpp | 1 + .../compat_gm_wardrobe}/Helmets.hpp | 0 .../compat_gm_wardrobe}/Uniforms.hpp | 0 .../compat_gm/compat_gm_wardrobe/config.cpp | 25 ++++++++++++ .../compat_gm_wardrobe/script_component.hpp | 3 ++ .../compat_rf_wardrobe}/CfgWardrobe.hpp | 0 .../compat_rf_wardrobe}/Helmets.hpp | 0 .../compat_rf_wardrobe}/Uniforms.hpp | 0 .../compat_rf/compat_rf_wardrobe/config.cpp | 25 ++++++++++++ .../compat_rf_wardrobe/script_component.hpp | 3 ++ .../compat_sog_wardrobe}/Booniehats.hpp | 0 .../compat_sog_wardrobe}/CfgWardrobe.hpp | 0 .../compat_sog_wardrobe}/Pilothelmets.hpp | 0 .../compat_sog_wardrobe}/Uniforms_B.hpp | 0 .../compat_sog_wardrobe}/Uniforms_O.hpp | 0 .../compat_sog/compat_sog_wardrobe/config.cpp | 25 ++++++++++++ .../compat_sog_wardrobe}/notes.md | 0 .../compat_sog_wardrobe/script_component.hpp | 3 ++ .../Uniforms.hpp | 2 +- .../config.cpp | 25 ++++++++++++ .../script_component.hpp | 3 ++ .../compat_ws_wardrobe}/CfgWardrobe.hpp | 0 .../compat_ws_wardrobe}/Turbans.hpp | 0 .../compat_ws_wardrobe}/config.cpp | 0 .../compat_ws_wardrobe}/notes.md | 0 .../compat_ws_wardrobe/script_component.hpp | 3 ++ addons/wardrobe/Baseclass.hpp | 8 ++-- addons/wardrobe/TODO/gm/$PBOPREFIX$ | 1 - addons/wardrobe/TODO/gm/config.cpp | 35 ----------------- addons/wardrobe/TODO/gm/script_component.hpp | 9 ----- addons/wardrobe/TODO/rf/$PBOPREFIX$ | 1 - addons/wardrobe/TODO/rf/config.cpp | 35 ----------------- addons/wardrobe/TODO/rf/script_component.hpp | 9 ----- addons/wardrobe/TODO/vanilla/$PBOPREFIX$ | 1 - addons/wardrobe/TODO/vanilla/CfgWardrobe.hpp | 10 ----- addons/wardrobe/TODO/vanilla/config.cpp | 35 ----------------- .../TODO/vanilla/script_component.hpp | 9 ----- addons/wardrobe/TODO/vn/$PBOPREFIX$ | 1 - addons/wardrobe/TODO/vn/config.cpp | 35 ----------------- addons/wardrobe/TODO/vn/notes.md | 4 -- addons/wardrobe/TODO/vn/script_component.hpp | 8 ---- .../TODO/vn/vn_uniform_fix/config.cpp | 38 ------------------- .../vn/vn_uniform_fix/script_component.hpp | 9 ----- addons/wardrobe/TODO/ws/$PBOPREFIX$ | 1 - addons/wardrobe/TODO/ws/notes.md | 4 -- addons/wardrobe/TODO/ws/script_component.hpp | 9 ----- .../vanilla => compat_vanilla}/Uniforms.hpp | 0 addons/wardrobe/config.cpp | 9 ++++- addons/wardrobe/script_macros_zrn.hpp | 31 +++------------ 49 files changed, 133 insertions(+), 287 deletions(-) rename addons/{wardrobe/TODO/gm => compat_gm/compat_gm_wardrobe}/CfgWardrobe.hpp (93%) rename addons/{wardrobe/TODO/gm => compat_gm/compat_gm_wardrobe}/Helmets.hpp (100%) rename addons/{wardrobe/TODO/gm => compat_gm/compat_gm_wardrobe}/Uniforms.hpp (100%) create mode 100644 addons/compat_gm/compat_gm_wardrobe/config.cpp create mode 100644 addons/compat_gm/compat_gm_wardrobe/script_component.hpp rename addons/{wardrobe/TODO/rf => compat_rf/compat_rf_wardrobe}/CfgWardrobe.hpp (100%) rename addons/{wardrobe/TODO/rf => compat_rf/compat_rf_wardrobe}/Helmets.hpp (100%) rename addons/{wardrobe/TODO/rf => compat_rf/compat_rf_wardrobe}/Uniforms.hpp (100%) create mode 100644 addons/compat_rf/compat_rf_wardrobe/config.cpp create mode 100644 addons/compat_rf/compat_rf_wardrobe/script_component.hpp rename addons/{wardrobe/TODO/vn => compat_sog/compat_sog_wardrobe}/Booniehats.hpp (100%) rename addons/{wardrobe/TODO/vn => compat_sog/compat_sog_wardrobe}/CfgWardrobe.hpp (100%) rename addons/{wardrobe/TODO/vn => compat_sog/compat_sog_wardrobe}/Pilothelmets.hpp (100%) rename addons/{wardrobe/TODO/vn => compat_sog/compat_sog_wardrobe}/Uniforms_B.hpp (100%) rename addons/{wardrobe/TODO/vn => compat_sog/compat_sog_wardrobe}/Uniforms_O.hpp (100%) create mode 100644 addons/compat_sog/compat_sog_wardrobe/config.cpp rename addons/{wardrobe/TODO/gm => compat_sog/compat_sog_wardrobe}/notes.md (100%) create mode 100644 addons/compat_sog/compat_sog_wardrobe/script_component.hpp rename addons/{wardrobe/TODO/vn/vn_uniform_fix => compat_sog/compat_sog_wardrobe_uniform_fix}/Uniforms.hpp (93%) create mode 100644 addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp create mode 100644 addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp rename addons/{wardrobe/TODO/ws => compat_ws/compat_ws_wardrobe}/CfgWardrobe.hpp (100%) rename addons/{wardrobe/TODO/ws => compat_ws/compat_ws_wardrobe}/Turbans.hpp (100%) rename addons/{wardrobe/TODO/ws => compat_ws/compat_ws_wardrobe}/config.cpp (100%) rename addons/{wardrobe/TODO/rf => compat_ws/compat_ws_wardrobe}/notes.md (100%) create mode 100644 addons/compat_ws/compat_ws_wardrobe/script_component.hpp delete mode 100644 addons/wardrobe/TODO/gm/$PBOPREFIX$ delete mode 100644 addons/wardrobe/TODO/gm/config.cpp delete mode 100644 addons/wardrobe/TODO/gm/script_component.hpp delete mode 100644 addons/wardrobe/TODO/rf/$PBOPREFIX$ delete mode 100644 addons/wardrobe/TODO/rf/config.cpp delete mode 100644 addons/wardrobe/TODO/rf/script_component.hpp delete mode 100644 addons/wardrobe/TODO/vanilla/$PBOPREFIX$ delete mode 100644 addons/wardrobe/TODO/vanilla/CfgWardrobe.hpp delete mode 100644 addons/wardrobe/TODO/vanilla/config.cpp delete mode 100644 addons/wardrobe/TODO/vanilla/script_component.hpp delete mode 100644 addons/wardrobe/TODO/vn/$PBOPREFIX$ delete mode 100644 addons/wardrobe/TODO/vn/config.cpp delete mode 100644 addons/wardrobe/TODO/vn/notes.md delete mode 100644 addons/wardrobe/TODO/vn/script_component.hpp delete mode 100644 addons/wardrobe/TODO/vn/vn_uniform_fix/config.cpp delete mode 100644 addons/wardrobe/TODO/vn/vn_uniform_fix/script_component.hpp delete mode 100644 addons/wardrobe/TODO/ws/$PBOPREFIX$ delete mode 100644 addons/wardrobe/TODO/ws/notes.md delete mode 100644 addons/wardrobe/TODO/ws/script_component.hpp rename addons/wardrobe/{TODO/vanilla => compat_vanilla}/Uniforms.hpp (100%) diff --git a/addons/wardrobe/TODO/gm/CfgWardrobe.hpp b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp similarity index 93% rename from addons/wardrobe/TODO/gm/CfgWardrobe.hpp rename to addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp index 678f456585d..8a4bcf09b43 100644 --- a/addons/wardrobe/TODO/gm/CfgWardrobe.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp @@ -1,3 +1,4 @@ +// Import Base Classes class EGVAR(wardrobe,base); class EGVAR(wardrobe,base_H_visor_up); diff --git a/addons/wardrobe/TODO/gm/Helmets.hpp b/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp similarity index 100% rename from addons/wardrobe/TODO/gm/Helmets.hpp rename to addons/compat_gm/compat_gm_wardrobe/Helmets.hpp diff --git a/addons/wardrobe/TODO/gm/Uniforms.hpp b/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp similarity index 100% rename from addons/wardrobe/TODO/gm/Uniforms.hpp rename to addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp diff --git a/addons/compat_gm/compat_gm_wardrobe/config.cpp b/addons/compat_gm/compat_gm_wardrobe/config.cpp new file mode 100644 index 00000000000..3823b748028 --- /dev/null +++ b/addons/compat_gm/compat_gm_wardrobe/config.cpp @@ -0,0 +1,25 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + author = ECSTRING(common,ACETeam); + authors[] = {"OverlordZorn [CVO]"}; + url = ECSTRING(main,URL); + + VERSION_CONFIG; + addonRootClass = QUOTE(ADDON); + requiredAddons[] = { + QPVAR(wardrobe), + "gm_core" + }; + skipWhenMissingDependencies = 1; + + requiredVersion = 2.02; + + units[] = {}; + weapons[] = {}; + }; +}; + +#include "CfgWardrobe.hpp" \ No newline at end of file diff --git a/addons/compat_gm/compat_gm_wardrobe/script_component.hpp b/addons/compat_gm/compat_gm_wardrobe/script_component.hpp new file mode 100644 index 00000000000..31996452391 --- /dev/null +++ b/addons/compat_gm/compat_gm_wardrobe/script_component.hpp @@ -0,0 +1,3 @@ +#define SUBCOMPONENT wardrobe +#define SUBCOMPONENT_BEAUTIFIED Wardrobe Compatibility for GlobMo +#include "..\script_component.hpp" diff --git a/addons/wardrobe/TODO/rf/CfgWardrobe.hpp b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp similarity index 100% rename from addons/wardrobe/TODO/rf/CfgWardrobe.hpp rename to addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp diff --git a/addons/wardrobe/TODO/rf/Helmets.hpp b/addons/compat_rf/compat_rf_wardrobe/Helmets.hpp similarity index 100% rename from addons/wardrobe/TODO/rf/Helmets.hpp rename to addons/compat_rf/compat_rf_wardrobe/Helmets.hpp diff --git a/addons/wardrobe/TODO/rf/Uniforms.hpp b/addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp similarity index 100% rename from addons/wardrobe/TODO/rf/Uniforms.hpp rename to addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp diff --git a/addons/compat_rf/compat_rf_wardrobe/config.cpp b/addons/compat_rf/compat_rf_wardrobe/config.cpp new file mode 100644 index 00000000000..98ab4e75619 --- /dev/null +++ b/addons/compat_rf/compat_rf_wardrobe/config.cpp @@ -0,0 +1,25 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + author = ECSTRING(common,ACETeam); + authors[] = {"OverlordZorn [CVO]"}; + url = ECSTRING(main,URL); + + VERSION_CONFIG; + addonRootClass = QUOTE(ADDON); + requiredAddons[] = { + QPVAR(wardrobe), + "RF_Data_Loadorder" + }; + skipWhenMissingDependencies = 1; + + requiredVersion = 2.02; + + units[] = {}; + weapons[] = {}; + }; +}; + +#include "CfgWardrobe.hpp" diff --git a/addons/compat_rf/compat_rf_wardrobe/script_component.hpp b/addons/compat_rf/compat_rf_wardrobe/script_component.hpp new file mode 100644 index 00000000000..ff47cdd6203 --- /dev/null +++ b/addons/compat_rf/compat_rf_wardrobe/script_component.hpp @@ -0,0 +1,3 @@ +#define SUBCOMPONENT wardrobe +#define SUBCOMPONENT_BEAUTIFIED Wardrobe Compatibility for RF +#include "..\script_component.hpp" diff --git a/addons/wardrobe/TODO/vn/Booniehats.hpp b/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp similarity index 100% rename from addons/wardrobe/TODO/vn/Booniehats.hpp rename to addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp diff --git a/addons/wardrobe/TODO/vn/CfgWardrobe.hpp b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp similarity index 100% rename from addons/wardrobe/TODO/vn/CfgWardrobe.hpp rename to addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp diff --git a/addons/wardrobe/TODO/vn/Pilothelmets.hpp b/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp similarity index 100% rename from addons/wardrobe/TODO/vn/Pilothelmets.hpp rename to addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp diff --git a/addons/wardrobe/TODO/vn/Uniforms_B.hpp b/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp similarity index 100% rename from addons/wardrobe/TODO/vn/Uniforms_B.hpp rename to addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp diff --git a/addons/wardrobe/TODO/vn/Uniforms_O.hpp b/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp similarity index 100% rename from addons/wardrobe/TODO/vn/Uniforms_O.hpp rename to addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp diff --git a/addons/compat_sog/compat_sog_wardrobe/config.cpp b/addons/compat_sog/compat_sog_wardrobe/config.cpp new file mode 100644 index 00000000000..b2bc7f07615 --- /dev/null +++ b/addons/compat_sog/compat_sog_wardrobe/config.cpp @@ -0,0 +1,25 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + author = ECSTRING(common,ACETeam); + authors[] = {"OverlordZorn [CVO]"}; + url = ECSTRING(main,URL); + + VERSION_CONFIG; + addonRootClass = QUOTE(ADDON); + requiredAddons[] = { + QPVAR(wardrobe), + "vn_data_f" + }; + skipWhenMissingDependencies = 1; + + requiredVersion = 2.02; + + units[] = {}; + weapons[] = {}; + }; +}; + +#include "CfgWardrobe.hpp" diff --git a/addons/wardrobe/TODO/gm/notes.md b/addons/compat_sog/compat_sog_wardrobe/notes.md similarity index 100% rename from addons/wardrobe/TODO/gm/notes.md rename to addons/compat_sog/compat_sog_wardrobe/notes.md diff --git a/addons/compat_sog/compat_sog_wardrobe/script_component.hpp b/addons/compat_sog/compat_sog_wardrobe/script_component.hpp new file mode 100644 index 00000000000..c4cfb8d4188 --- /dev/null +++ b/addons/compat_sog/compat_sog_wardrobe/script_component.hpp @@ -0,0 +1,3 @@ +#define SUBCOMPONENT wardrobe +#define SUBCOMPONENT_BEAUTIFIED Wardrobe Compatibility for SOG:PF +#include "..\script_component.hpp" diff --git a/addons/wardrobe/TODO/vn/vn_uniform_fix/Uniforms.hpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp similarity index 93% rename from addons/wardrobe/TODO/vn/vn_uniform_fix/Uniforms.hpp rename to addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp index fca77bf4987..f6365293956 100644 --- a/addons/wardrobe/TODO/vn/vn_uniform_fix/Uniforms.hpp +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp @@ -6,7 +6,7 @@ class CfgWeapons class vn_b_uniform_base; // creating the macro #define S_70(className)\ - class className : vn_b_uniform_base { class ItemInfo : ItemInfo { containerClass = "Supply70"; }; };\ + class className : vn_b_uniform_base { class ItemInfo : ItemInfo { containerClass = "Supply70"; }; }; S_70(vn_b_uniform_macv_04_01) S_70(vn_b_uniform_macv_04_02) diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp new file mode 100644 index 00000000000..819156bcfd8 --- /dev/null +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp @@ -0,0 +1,25 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + author = ECSTRING(common,ACETeam); + authors[] = {"OverlordZorn [CVO]"}; + url = ECSTRING(main,URL); + + VERSION_CONFIG; + addonRootClass = QUOTE(ADDON); + requiredAddons[] = { + QPVAR(wardrobe), + "vn_data_f" + }; + skipWhenMissingDependencies = 1; + + requiredVersion = 2.02; + + units[] = {}; + weapons[] = {}; + }; +}; + +#include "Uniforms.hpp" \ No newline at end of file diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp new file mode 100644 index 00000000000..689711cbfa2 --- /dev/null +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp @@ -0,0 +1,3 @@ +#define SUBCOMPONENT wardrobe +#define SUBCOMPONENT_BEAUTIFIED Wardrobe Compatibility for SOG:PF - Uniform Fix +#include "..\script_component.hpp" diff --git a/addons/wardrobe/TODO/ws/CfgWardrobe.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp similarity index 100% rename from addons/wardrobe/TODO/ws/CfgWardrobe.hpp rename to addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp diff --git a/addons/wardrobe/TODO/ws/Turbans.hpp b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp similarity index 100% rename from addons/wardrobe/TODO/ws/Turbans.hpp rename to addons/compat_ws/compat_ws_wardrobe/Turbans.hpp diff --git a/addons/wardrobe/TODO/ws/config.cpp b/addons/compat_ws/compat_ws_wardrobe/config.cpp similarity index 100% rename from addons/wardrobe/TODO/ws/config.cpp rename to addons/compat_ws/compat_ws_wardrobe/config.cpp diff --git a/addons/wardrobe/TODO/rf/notes.md b/addons/compat_ws/compat_ws_wardrobe/notes.md similarity index 100% rename from addons/wardrobe/TODO/rf/notes.md rename to addons/compat_ws/compat_ws_wardrobe/notes.md diff --git a/addons/compat_ws/compat_ws_wardrobe/script_component.hpp b/addons/compat_ws/compat_ws_wardrobe/script_component.hpp new file mode 100644 index 00000000000..5f9a4cf0fe3 --- /dev/null +++ b/addons/compat_ws/compat_ws_wardrobe/script_component.hpp @@ -0,0 +1,3 @@ +#define SUBCOMPONENT wardrobe +#define SUBCOMPONENT_BEAUTIFIED Wardrobe Compatibility for Western Sahara +#include "..\script_component.hpp" diff --git a/addons/wardrobe/Baseclass.hpp b/addons/wardrobe/Baseclass.hpp index 7e4efe5649c..3300086dfe8 100644 --- a/addons/wardrobe/Baseclass.hpp +++ b/addons/wardrobe/Baseclass.hpp @@ -1,10 +1,10 @@ class GVAR(base) { modifiableTo[] = {""}; - - // WIP - modifiableToWithDependency = ""; - dependency = ""; + // ## WIP ## + // describes the components of the current item. + // When the current wearable is being changed into something, that does not have these + components[] = {}; // Supports Multiple Sounds, will pick one by random. sound[] = {"click"}; // I need a better default Sound diff --git a/addons/wardrobe/TODO/gm/$PBOPREFIX$ b/addons/wardrobe/TODO/gm/$PBOPREFIX$ deleted file mode 100644 index e4a1b10ddc6..00000000000 --- a/addons/wardrobe/TODO/gm/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\gm \ No newline at end of file diff --git a/addons/wardrobe/TODO/gm/config.cpp b/addons/wardrobe/TODO/gm/config.cpp deleted file mode 100644 index fff8caaa821..00000000000 --- a/addons/wardrobe/TODO/gm/config.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include "script_component.hpp" - -class CfgPatches { - class ADDON { - - // Meta information for editor - name = ADDON_NAME; - author = "$STR_mod_author"; - authors[] = {"OverlordZorn [CVO]"}; - - url = "$STR_mod_URL"; - - VERSION_CONFIG; - - // Addon Specific Information - // Minimum compatible version. When the game's version is lower, pop-up warning will appear when launching the game. - requiredVersion = 2.02; - - // Required addons, used for setting load order. - // When any of the addons is missing, pop-up warning will appear when launching the game. - requiredAddons[] = {QPVAR(main),"cba_main", "gm_core"}; - - // Optional. If this is 1, if any of requiredAddons[] entry is missing in your game the entire config will be ignored and return no error (but in rpt) so useful to make a compat Mod (Since Arma 3 2.14) - skipWhenMissingDependencies = 1; - - // List of objects (CfgVehicles classes) contained in the addon. Important also for Zeus content (units and groups) - units[] = {}; - - // List of weapons (CfgWeapons classes) contained in the addon. - weapons[] = {}; - - }; -}; - -#include "CfgWardrobe.hpp" \ No newline at end of file diff --git a/addons/wardrobe/TODO/gm/script_component.hpp b/addons/wardrobe/TODO/gm/script_component.hpp deleted file mode 100644 index e823f5b7dfe..00000000000 --- a/addons/wardrobe/TODO/gm/script_component.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#define COMPONENT ws - - -// This is being used for the Addon's Name and can be "My Addon Template Framework" -#define COMPONENT_BEAUTIFIED Compatibility for Western Sahara - - -#include "\z\ace\addons\main\script_mod.hpp" -#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/wardrobe/TODO/rf/$PBOPREFIX$ b/addons/wardrobe/TODO/rf/$PBOPREFIX$ deleted file mode 100644 index fa13eec9733..00000000000 --- a/addons/wardrobe/TODO/rf/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\rf \ No newline at end of file diff --git a/addons/wardrobe/TODO/rf/config.cpp b/addons/wardrobe/TODO/rf/config.cpp deleted file mode 100644 index 511bd1d8a81..00000000000 --- a/addons/wardrobe/TODO/rf/config.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include "script_component.hpp" - -class CfgPatches { - class ADDON { - - // Meta information for editor - name = ADDON_NAME; - author = "$STR_mod_author"; - authors[] = {"OverlordZorn [CVO]"}; - - url = "$STR_mod_URL"; - - VERSION_CONFIG; - - // Addon Specific Information - // Minimum compatible version. When the game's version is lower, pop-up warning will appear when launching the game. - requiredVersion = 2.02; - - // Required addons, used for setting load order. - // When any of the addons is missing, pop-up warning will appear when launching the game. - requiredAddons[] = {QPVAR(main),"cba_main","RF_Data_Loadorder"}; - - // Optional. If this is 1, if any of requiredAddons[] entry is missing in your game the entire config will be ignored and return no error (but in rpt) so useful to make a compat Mod (Since Arma 3 2.14) - skipWhenMissingDependencies = 1; - - // List of objects (CfgVehicles classes) contained in the addon. Important also for Zeus content (units and groups) - units[] = {}; - - // List of weapons (CfgWeapons classes) contained in the addon. - weapons[] = {}; - - }; -}; - -#include "CfgWardrobe.hpp" \ No newline at end of file diff --git a/addons/wardrobe/TODO/rf/script_component.hpp b/addons/wardrobe/TODO/rf/script_component.hpp deleted file mode 100644 index 09b545796d9..00000000000 --- a/addons/wardrobe/TODO/rf/script_component.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#define COMPONENT rf - - -// This is being used for the Addon's Name and can be "My Addon Template Framework" -#define COMPONENT_BEAUTIFIED Compatibility for Reaction Forces - - -#include "\z\ace\addons\main\script_mod.hpp" -#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/wardrobe/TODO/vanilla/$PBOPREFIX$ b/addons/wardrobe/TODO/vanilla/$PBOPREFIX$ deleted file mode 100644 index c38a70b1dd2..00000000000 --- a/addons/wardrobe/TODO/vanilla/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\vanilla \ No newline at end of file diff --git a/addons/wardrobe/TODO/vanilla/CfgWardrobe.hpp b/addons/wardrobe/TODO/vanilla/CfgWardrobe.hpp deleted file mode 100644 index c581aff3568..00000000000 --- a/addons/wardrobe/TODO/vanilla/CfgWardrobe.hpp +++ /dev/null @@ -1,10 +0,0 @@ -class EGVAR(wardrobe,base); -class EGVAR(wardrobe,base_U_sleeves_up); -class EGVAR(wardrobe,base_U_sleeves_down); - - - -class CfgWeapons -{ - #include "Uniforms.hpp" -}; diff --git a/addons/wardrobe/TODO/vanilla/config.cpp b/addons/wardrobe/TODO/vanilla/config.cpp deleted file mode 100644 index d0d31d554ad..00000000000 --- a/addons/wardrobe/TODO/vanilla/config.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include "script_component.hpp" - -class CfgPatches { - class ADDON { - - // Meta information for editor - name = ADDON_NAME; - author = "$STR_mod_author"; - authors[] = {"OverlordZorn [CVO]"}; - - url = "$STR_mod_URL"; - - VERSION_CONFIG; - - // Addon Specific Information - // Minimum compatible version. When the game's version is lower, pop-up warning will appear when launching the game. - requiredVersion = 2.02; - - // Required addons, used for setting load order. - // When any of the addons is missing, pop-up warning will appear when launching the game. - requiredAddons[] = {QPVAR(main),"cba_main"}; - - // Optional. If this is 1, if any of requiredAddons[] entry is missing in your game the entire config will be ignored and return no error (but in rpt) so useful to make a compat Mod (Since Arma 3 2.14) - skipWhenMissingDependencies = 1; - - // List of objects (CfgVehicles classes) contained in the addon. Important also for Zeus content (units and groups) - units[] = {}; - - // List of weapons (CfgWeapons classes) contained in the addon. - weapons[] = {}; - - }; -}; - -#include "CfgWardrobe.hpp" \ No newline at end of file diff --git a/addons/wardrobe/TODO/vanilla/script_component.hpp b/addons/wardrobe/TODO/vanilla/script_component.hpp deleted file mode 100644 index a67b9d8c2b2..00000000000 --- a/addons/wardrobe/TODO/vanilla/script_component.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#define COMPONENT vanilla - - -// This is being used for the Addon's Name and can be "My Addon Template Framework" -#define COMPONENT_BEAUTIFIED Compatibility for Vanilla Assets - - -#include "\z\ace\addons\main\script_mod.hpp" -#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/wardrobe/TODO/vn/$PBOPREFIX$ b/addons/wardrobe/TODO/vn/$PBOPREFIX$ deleted file mode 100644 index 2d7e5ca17f8..00000000000 --- a/addons/wardrobe/TODO/vn/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\vn \ No newline at end of file diff --git a/addons/wardrobe/TODO/vn/config.cpp b/addons/wardrobe/TODO/vn/config.cpp deleted file mode 100644 index fa4640d2f84..00000000000 --- a/addons/wardrobe/TODO/vn/config.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include "script_component.hpp" - -class CfgPatches { - class ADDON { - - // Meta information for editor - name = ADDON_NAME; - author = "$STR_mod_author"; - authors[] = {"OverlordZorn [CVO]"}; - - url = "$STR_mod_URL"; - - VERSION_CONFIG; - - // Addon Specific Information - // Minimum compatible version. When the game's version is lower, pop-up warning will appear when launching the game. - requiredVersion = 2.02; - - // Required addons, used for setting load order. - // When any of the addons is missing, pop-up warning will appear when launching the game. - requiredAddons[] = {QPVAR(main),"cba_main","vn_data_f"}; - - // Optional. If this is 1, if any of requiredAddons[] entry is missing in your game the entire config will be ignored and return no error (but in rpt) so useful to make a compat Mod (Since Arma 3 2.14) - skipWhenMissingDependencies = 1; - - // List of objects (CfgVehicles classes) contained in the addon. Important also for Zeus content (units and groups) - units[] = {}; - - // List of weapons (CfgWeapons classes) contained in the addon. - weapons[] = {}; - - }; -}; - -#include "CfgWardrobe.hpp" \ No newline at end of file diff --git a/addons/wardrobe/TODO/vn/notes.md b/addons/wardrobe/TODO/vn/notes.md deleted file mode 100644 index 0021f2a4fad..00000000000 --- a/addons/wardrobe/TODO/vn/notes.md +++ /dev/null @@ -1,4 +0,0 @@ -lxWS_H_turban_01_black -lxWS_H_turban_02_black -lxWS_H_turban_03_black -lxWS_H_turban_04_black \ No newline at end of file diff --git a/addons/wardrobe/TODO/vn/script_component.hpp b/addons/wardrobe/TODO/vn/script_component.hpp deleted file mode 100644 index ec51690e2fc..00000000000 --- a/addons/wardrobe/TODO/vn/script_component.hpp +++ /dev/null @@ -1,8 +0,0 @@ -#define COMPONENT vn - -// This is being used for the Addon's Name and can be "My Addon Template Framework" -#define COMPONENT_BEAUTIFIED Compatibility for SOG:PF - - -#include "\z\ace\addons\main\script_mod.hpp" -#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/wardrobe/TODO/vn/vn_uniform_fix/config.cpp b/addons/wardrobe/TODO/vn/vn_uniform_fix/config.cpp deleted file mode 100644 index 3e183709561..00000000000 --- a/addons/wardrobe/TODO/vn/vn_uniform_fix/config.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#include "script_component.hpp" - -class CfgPatches { - class ADDON { - - // SubAddon Stuff - addonRootClass = QPVAR(vn); - - // Meta information for editor - name = ADDON_NAME; - author = "$STR_mod_author"; - authors[] = {"OverlordZorn [CVO]"}; - - url = "$STR_mod_URL"; - - VERSION_CONFIG; - - // Addon Specific Information - // Minimum compatible version. When the game's version is lower, pop-up warning will appear when launching the game. - requiredVersion = 2.02; - - // Required addons, used for setting load order. - // When any of the addons is missing, pop-up warning will appear when launching the game. - requiredAddons[] = {QPVAR(main),"cba_main","vn_data_f"}; - - // Optional. If this is 1, if any of requiredAddons[] entry is missing in your game the entire config will be ignored and return no error (but in rpt) so useful to make a compat Mod (Since Arma 3 2.14) - skipWhenMissingDependencies = 1; - - // List of objects (CfgVehicles classes) contained in the addon. Important also for Zeus content (units and groups) - units[] = {}; - - // List of weapons (CfgWeapons classes) contained in the addon. - weapons[] = {}; - - }; -}; - -#include "Uniforms.hpp" \ No newline at end of file diff --git a/addons/wardrobe/TODO/vn/vn_uniform_fix/script_component.hpp b/addons/wardrobe/TODO/vn/vn_uniform_fix/script_component.hpp deleted file mode 100644 index 972e84ffaa8..00000000000 --- a/addons/wardrobe/TODO/vn/vn_uniform_fix/script_component.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#define COMPONENT vn_uniform_fix - - -// This is being used for the Addon's Name and can be "My Addon Template Framework" -#define COMPONENT_BEAUTIFIED Compatibility for SOG:PF - Uniform Fix - - -#include "\z\ace\addons\main\script_mod.hpp" -#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/wardrobe/TODO/ws/$PBOPREFIX$ b/addons/wardrobe/TODO/ws/$PBOPREFIX$ deleted file mode 100644 index 1da69ea8489..00000000000 --- a/addons/wardrobe/TODO/ws/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\ws \ No newline at end of file diff --git a/addons/wardrobe/TODO/ws/notes.md b/addons/wardrobe/TODO/ws/notes.md deleted file mode 100644 index 0021f2a4fad..00000000000 --- a/addons/wardrobe/TODO/ws/notes.md +++ /dev/null @@ -1,4 +0,0 @@ -lxWS_H_turban_01_black -lxWS_H_turban_02_black -lxWS_H_turban_03_black -lxWS_H_turban_04_black \ No newline at end of file diff --git a/addons/wardrobe/TODO/ws/script_component.hpp b/addons/wardrobe/TODO/ws/script_component.hpp deleted file mode 100644 index e823f5b7dfe..00000000000 --- a/addons/wardrobe/TODO/ws/script_component.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#define COMPONENT ws - - -// This is being used for the Addon's Name and can be "My Addon Template Framework" -#define COMPONENT_BEAUTIFIED Compatibility for Western Sahara - - -#include "\z\ace\addons\main\script_mod.hpp" -#include "\z\ace\addons\main\script_macros.hpp" diff --git a/addons/wardrobe/TODO/vanilla/Uniforms.hpp b/addons/wardrobe/compat_vanilla/Uniforms.hpp similarity index 100% rename from addons/wardrobe/TODO/vanilla/Uniforms.hpp rename to addons/wardrobe/compat_vanilla/Uniforms.hpp diff --git a/addons/wardrobe/config.cpp b/addons/wardrobe/config.cpp index 89b33ae3244..3ec328500de 100644 --- a/addons/wardrobe/config.cpp +++ b/addons/wardrobe/config.cpp @@ -18,7 +18,7 @@ class CfgPatches { // Required addons, used for setting load order. // When any of the addons is missing, pop-up warning will appear when launching the game. - requiredAddons[] = {QPVAR(main),"cba_main", "ace_interact_menu"}; + requiredAddons[] = {"cba_main", "ace_interact_menu"}; // Optional. If this is 1, if any of requiredAddons[] entry is missing in your game the entire config will be ignored and return no error (but in rpt) so useful to make a compat Mod (Since Arma 3 2.14) skipWhenMissingDependencies = 1; @@ -35,6 +35,11 @@ class CfgPatches { #include "CfgFunctions.hpp" #include "XEH\CfgXEH.hpp" +#include "Baseclass.hpp" + #include "CfgVehicles.hpp" -#include "Baseclass.hpp" \ No newline at end of file +class CfgWeapons +{ + #include "compat_vanilla\Uniforms.hpp" +}; diff --git a/addons/wardrobe/script_macros_zrn.hpp b/addons/wardrobe/script_macros_zrn.hpp index 90138ec1f7b..c2179c41144 100644 --- a/addons/wardrobe/script_macros_zrn.hpp +++ b/addons/wardrobe/script_macros_zrn.hpp @@ -2,6 +2,7 @@ #define _ZRN_DEBUG_ #endif + // CBA Settings #define SET(var1) TRIPLES(ADDON,set,var1) #define QSET(var1) Q(SET(var1)) @@ -10,14 +11,10 @@ #define QESET(var1,var2) Q(ESET(var1,var2)) #define QQESET(var1,var2) QQ(ESET(var1,var2)) + // Stringtable.xml - use LSTRING() instead -// #define XML(var1) TRIPLES(STR,ADDON,var1) -// #define QXML(var1) Q(XML(var1)) #define SETLSTRING(key) [LSTRING(DOUBLES(set,key)),LSTRING(TRIPLES(set,key,desc))] -// hashMapObjects -#define OGET(var1) (_self get Q(var1)) -#define OSET(var1,var2) (_self set [Q(var1), var2]) // Quotes #ifndef QUOTE @@ -31,6 +28,7 @@ #define QPREFIX Q(PREFIX) #define QCOMPONENT Q(COMPONENT) + // Prefix Function #define PFUNC(var1) TRIPLES(PREFIX,fnc,var1) #define QPFUNC(var1) QUOTE(PFUNC(var1)) @@ -42,18 +40,13 @@ #define QPVAR(var1) QUOTE(PVAR(var1)) #define QQPVAR(var1) QUOTE(QPVAR(var1)) -// Component Variables -#define CVAR(var1) DOUBLES(COMPONENT,var1) -#define QCVAR(var1) QUOTE(CVAR(var1)) -#define QQCVAR(var1) QUOTE(QCVAR(var1)) // missionNamespace set/get Variables - #define SETMGVAR(name,value) (missionNamespace setVariable [QGVAR(name),value]) #define SETMGVAR_PUBLIC(name,value,public) (missionNamespace setVariable [QGVAR(name),value,public]) - #define GETMGVAR(name,default) (missionNamespace getVariable [QGVAR(name),default]) + // CfgPatches Stuff #ifndef PREFIX_BEAUTIFIED #define PREFIX_BEAUTIFIED PREFIX @@ -74,17 +67,8 @@ #define QPATH_TO_ADDON(var1) QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\var1) #define QQPATH_TO_ADDON(var1) Q(QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\var1)) -// Debug -// Doesnt seem to work currently -#ifdef _ZRN_DEBUG_ - #define _DEBUG_POSTINIT_ postInit = 1; - #define _DEBUG_PREINIT_ preInit = 1; -#else - #define _DEBUG_POSTINIT_ postInit = 0; - #define _DEBUG_PREINIT_ preInit = 0; -#endif - +// Debug #define DEBUG_HEADER format [QUOTE([PREFIX][COMPONENT](%1)),_fnc_scriptName] #define ZRN_LOG_MSG(MSG) diag_log (DEBUG_HEADER + " " + QUOTE(MSG)) @@ -110,9 +94,6 @@ #define ZRN_LOG_7(A,B,C,D,E,F,G) diag_log (DEBUG_HEADER + (format [' A: %1 - B: %2 - C: %3 - D: %4 - E: %5 - F: %6 - H: %7',RETNIL(A),RETNIL(B),RETNIL(C),RETNIL(D),RETNIL(E),RETNIL(F),RETNIL(G)])) #define ZRN_LOG_8(A,B,C,D,E,F,G,H) diag_log (DEBUG_HEADER + (format [' A: %1 - B: %2 - C: %3 - D: %4 - E: %5 - F: %6 - H: %7 - I: %8',RETNIL(A),RETNIL(B),RETNIL(C),RETNIL(D),RETNIL(E),RETNIL(F),RETNIL(G),RETNIL(H)])) - #define ZRN_LOG_HMO(var1) { if ('#' in _x || 'Meth' in _x) then {continue}; diag_log (DEBUG_HEADER + (format [' %3 - %1 - %2', _x, _y, Q(MSG)])) } forEach var1; - #define ZRN_LOG_MSG_HMO(MSG,var1) { if ('#' in _x || 'Meth' in _x) then {continue}; diag_log (DEBUG_HEADER + (format [' %3 - %1 - %2', _x, _y, Q(MSG)])) } forEach var1; - #else #define ZRN_SCRIPTNAME(var1) @@ -134,6 +115,4 @@ #define ZRN_LOG_7(A,B,C,D,E,F,G) #define ZRN_LOG_8(A,B,C,D,E,F,G,H) - #define ZRN_LOG_HMO(var1) - #define ZRN_LOG_MSG_HMO(MSG,var1) #endif \ No newline at end of file From a381dcc579473e558719da2b853f978f7890c4db Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 27 Dec 2024 14:10:49 +0100 Subject: [PATCH 005/305] Update config.cpp --- addons/wardrobe/config.cpp | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/addons/wardrobe/config.cpp b/addons/wardrobe/config.cpp index 3ec328500de..6806b610b62 100644 --- a/addons/wardrobe/config.cpp +++ b/addons/wardrobe/config.cpp @@ -2,33 +2,21 @@ class CfgPatches { class ADDON { - - // Meta information for editor - name = ADDON_NAME; - author = "$STR_wardrobe_author"; + name = COMPONENT_NAME; + author = ECSTRING(common,ACETeam); authors[] = {"OverlordZorn [CVO]"}; - - url = "$STR_mod_URL"; + url = ECSTRING(main,URL); VERSION_CONFIG; + requiredVersion = REQUIRED_VERSION; - // Addon Specific Information - // Minimum compatible version. When the game's version is lower, pop-up warning will appear when launching the game. - requiredVersion = 2.02; - - // Required addons, used for setting load order. - // When any of the addons is missing, pop-up warning will appear when launching the game. - requiredAddons[] = {"cba_main", "ace_interact_menu"}; - - // Optional. If this is 1, if any of requiredAddons[] entry is missing in your game the entire config will be ignored and return no error (but in rpt) so useful to make a compat Mod (Since Arma 3 2.14) + requiredAddons[] = { + "ace_interact_menu" + }; skipWhenMissingDependencies = 1; - - // List of objects (CfgVehicles classes) contained in the addon. Important also for Zeus content (units and groups) - units[] = {}; - // List of weapons (CfgWeapons classes) contained in the addon. + units[] = {}; weapons[] = {}; - }; }; From f6c1c9bd76d878c121e3bdea28c1faea652857d5 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 27 Dec 2024 14:10:51 +0100 Subject: [PATCH 006/305] Update config.cpp --- addons/compat_rf/compat_rf_wardrobe/config.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/compat_rf/compat_rf_wardrobe/config.cpp b/addons/compat_rf/compat_rf_wardrobe/config.cpp index 98ab4e75619..22793b4f532 100644 --- a/addons/compat_rf/compat_rf_wardrobe/config.cpp +++ b/addons/compat_rf/compat_rf_wardrobe/config.cpp @@ -15,7 +15,7 @@ class CfgPatches { }; skipWhenMissingDependencies = 1; - requiredVersion = 2.02; + requiredVersion = REQUIRED_VERSION; units[] = {}; weapons[] = {}; From a9134925842cdab711b5e957166b71204e211206 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 27 Dec 2024 14:35:59 +0100 Subject: [PATCH 007/305] small fixes: Macro's and typo's --- addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp | 2 +- addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp | 2 +- addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp | 2 +- addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp | 4 ++-- addons/wardrobe/Baseclass.hpp | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp b/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp index 9d55165814c..999de64c24e 100644 --- a/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp @@ -1,6 +1,6 @@ // CfgWeapons -// Sleves +// Sleeves class gm_ge_bgs_uniform_special_80_base; class gm_ge_bgs_uniform_special_rolled_80_base; diff --git a/addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp b/addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp index a00636efc1d..7bd89dc0e8c 100644 --- a/addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp +++ b/addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp @@ -5,7 +5,7 @@ class Uniform_Base; // Macros #define UNIFORM_BASE(class1,class2)\ class class1: Uniform_Base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(class2) }; }; };\ -class class2: Uniform_Base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(class1) }; }; };\ +class class2: Uniform_Base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(class1) }; }; }; // Simple Variants UNIFORM_BASE(U_C_FirefighterFatigues_RF,U_C_FirefighterFatigues_RolledUp_RF) diff --git a/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp b/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp index d41144eaa0a..8e461d7da1d 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp @@ -8,7 +8,7 @@ #define HELMET_VARIANT(side,var1,var2)\ class CN01(side,var1,var2) : base_class_up { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { Q(CN02(side,var1,var2)) }; }; };\ -class CN02(side,var1,var2) : base_class_dn { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { Q(CN01(side,var1,var2)) }; }; };\ +class CN02(side,var1,var2) : base_class_dn { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { Q(CN01(side,var1,var2)) }; }; }; // Base classes in CfgWeapons.hpp diff --git a/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp b/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp index 3e3953b4a29..cfa3ee4cf33 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp @@ -7,7 +7,7 @@ class vn_b_uniform_base; #define UNIFORM_BASE_B(class1,class2)\ class class1: vn_b_uniform_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(class2) }; }; };\ -class class2: vn_b_uniform_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(class1) }; }; };\ +class class2: vn_b_uniform_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(class1) }; }; }; #define B_U(div,var,camo) vn_b_uniform_##div##_##var##_##camo @@ -49,7 +49,7 @@ UNIFORM_BASE_B(vn_b_uniform_seal_01_07,vn_b_uniform_seal_02_07) // macv 05 and 04 have inconsistency between them -> different uniform maxLoad. This likely will cause the player to loose items when the uniform is filled to the brim. Difference is 1lb which translates to 16~17x ace bandages or 1x 1l blood #define B_U_PAIR_SET(camo)\ B_U_PAIR(macv,02,03,camo)\ -B_U_PAIR(macv,05,04,camo)\ +B_U_PAIR(macv,05,04,camo) B_U_PAIR_SET(TIGER) B_U_PAIR_SET(TIGER_GREEN) diff --git a/addons/wardrobe/Baseclass.hpp b/addons/wardrobe/Baseclass.hpp index 3300086dfe8..fa0c69bf997 100644 --- a/addons/wardrobe/Baseclass.hpp +++ b/addons/wardrobe/Baseclass.hpp @@ -13,7 +13,7 @@ class GVAR(base) // Gesture gesture = "Gear"; - // These will be read from the Target Class, so for example, the uniformclass with the rolled up sleaves, it should say "Roll Up Sleves" + // These will be read from the Target Class, so for example, the uniformclass with the rolled up sleaves, it should say "Roll Up Sleeves" alternativePicture = ""; alternativeDisplayName = ""; From fb246b8837eb87fa870a7c00b58c5d39f958765f Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 27 Dec 2024 14:36:05 +0100 Subject: [PATCH 008/305] Create readme.md --- addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md new file mode 100644 index 00000000000..e9f0fae9edd --- /dev/null +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md @@ -0,0 +1,5 @@ +The uniforms addressed in this sub-addon are the "sleeves rolled up" version of their "sleeves rolled down" counterpart. +The problem is, that the rolled up version are both, 1 lb lighter, and can carry 1 lb less. + +If we would ignore this, the player would run into situations where they would loose items by simply rolling up their sleeves. +To counter this, I increased the maxLoad of those items by 1 lb to be aligned with their counterpart. From 6abe9ab2d434bc5e125b6b06a2afeecdb718d6e7 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 28 Dec 2024 15:34:21 +0100 Subject: [PATCH 009/305] fix compat macros --- addons/compat_gm/compat_gm_wardrobe/script_component.hpp | 2 ++ addons/compat_rf/compat_rf_wardrobe/script_component.hpp | 2 ++ addons/compat_sog/compat_sog_wardrobe/script_component.hpp | 2 ++ .../compat_sog_wardrobe_uniform_fix/script_component.hpp | 2 ++ addons/compat_ws/compat_ws_wardrobe/script_component.hpp | 2 ++ 5 files changed, 10 insertions(+) diff --git a/addons/compat_gm/compat_gm_wardrobe/script_component.hpp b/addons/compat_gm/compat_gm_wardrobe/script_component.hpp index 31996452391..6fc839abdb8 100644 --- a/addons/compat_gm/compat_gm_wardrobe/script_component.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/script_component.hpp @@ -1,3 +1,5 @@ #define SUBCOMPONENT wardrobe #define SUBCOMPONENT_BEAUTIFIED Wardrobe Compatibility for GlobMo #include "..\script_component.hpp" + +#include "\z\ace\addons\wardrobe\script_macros_zrn.hpp" diff --git a/addons/compat_rf/compat_rf_wardrobe/script_component.hpp b/addons/compat_rf/compat_rf_wardrobe/script_component.hpp index ff47cdd6203..c6abb6601b1 100644 --- a/addons/compat_rf/compat_rf_wardrobe/script_component.hpp +++ b/addons/compat_rf/compat_rf_wardrobe/script_component.hpp @@ -1,3 +1,5 @@ #define SUBCOMPONENT wardrobe #define SUBCOMPONENT_BEAUTIFIED Wardrobe Compatibility for RF #include "..\script_component.hpp" + +#include "\z\ace\addons\wardrobe\script_macros_zrn.hpp" \ No newline at end of file diff --git a/addons/compat_sog/compat_sog_wardrobe/script_component.hpp b/addons/compat_sog/compat_sog_wardrobe/script_component.hpp index c4cfb8d4188..bc44bae5fc7 100644 --- a/addons/compat_sog/compat_sog_wardrobe/script_component.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/script_component.hpp @@ -1,3 +1,5 @@ #define SUBCOMPONENT wardrobe #define SUBCOMPONENT_BEAUTIFIED Wardrobe Compatibility for SOG:PF #include "..\script_component.hpp" + +#include "\z\ace\addons\wardrobe\script_macros_zrn.hpp" diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp index 689711cbfa2..273c8190a91 100644 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp @@ -1,3 +1,5 @@ #define SUBCOMPONENT wardrobe #define SUBCOMPONENT_BEAUTIFIED Wardrobe Compatibility for SOG:PF - Uniform Fix #include "..\script_component.hpp" + +#include "\z\ace\addons\wardrobe\script_macros_zrn.hpp" \ No newline at end of file diff --git a/addons/compat_ws/compat_ws_wardrobe/script_component.hpp b/addons/compat_ws/compat_ws_wardrobe/script_component.hpp index 5f9a4cf0fe3..424cc0eb6a9 100644 --- a/addons/compat_ws/compat_ws_wardrobe/script_component.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/script_component.hpp @@ -1,3 +1,5 @@ #define SUBCOMPONENT wardrobe #define SUBCOMPONENT_BEAUTIFIED Wardrobe Compatibility for Western Sahara #include "..\script_component.hpp" + +#include "\z\ace\addons\wardrobe\script_macros_zrn.hpp" \ No newline at end of file From 6f856048358edad5dfd5caf66f2e319cff167cd6 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 28 Dec 2024 17:48:36 +0100 Subject: [PATCH 010/305] fix: ignore inherited subclasses --- addons/wardrobe/functions/fn_checkItem.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fn_checkItem.sqf b/addons/wardrobe/functions/fn_checkItem.sqf index 3ae56ddac07..befaed14ede 100644 --- a/addons/wardrobe/functions/fn_checkItem.sqf +++ b/addons/wardrobe/functions/fn_checkItem.sqf @@ -22,4 +22,4 @@ params [ if (isNull _cfg) exitWith {false}; // Checks if the config has the property without it being inherited(!) -count configProperties [_cfg >> QADDON, Q(configName _x == QQ(modifiableTo)), false] > 0 \ No newline at end of file +count ( Q(configName _x isEqualTo QQPVAR(wardrobe)) configClasses _cfg ) > 0 \ No newline at end of file From 06f14908ae1678dbeb765baddc740f4da4ccb442 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 28 Dec 2024 17:48:57 +0100 Subject: [PATCH 011/305] reorganised --- .../wardrobe/functions/{ => config}/fn_getCfgDataRandom.sqf | 2 +- addons/wardrobe/functions/{ => effects}/fn_say3d.sqf | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename addons/wardrobe/functions/{ => config}/fn_getCfgDataRandom.sqf (93%) rename addons/wardrobe/functions/{ => effects}/fn_say3d.sqf (89%) diff --git a/addons/wardrobe/functions/fn_getCfgDataRandom.sqf b/addons/wardrobe/functions/config/fn_getCfgDataRandom.sqf similarity index 93% rename from addons/wardrobe/functions/fn_getCfgDataRandom.sqf rename to addons/wardrobe/functions/config/fn_getCfgDataRandom.sqf index cc28339a141..aeeb86c6792 100644 --- a/addons/wardrobe/functions/fn_getCfgDataRandom.sqf +++ b/addons/wardrobe/functions/config/fn_getCfgDataRandom.sqf @@ -1,4 +1,4 @@ -#include "../script_component.hpp" +#include "../../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fn_say3d.sqf b/addons/wardrobe/functions/effects/fn_say3d.sqf similarity index 89% rename from addons/wardrobe/functions/fn_say3d.sqf rename to addons/wardrobe/functions/effects/fn_say3d.sqf index 7b1fdf9b21d..942b90cee13 100644 --- a/addons/wardrobe/functions/fn_say3d.sqf +++ b/addons/wardrobe/functions/effects/fn_say3d.sqf @@ -1,4 +1,4 @@ -#include "../script_component.hpp" +#include "../../script_component.hpp" /* * Author: Zorn @@ -24,7 +24,7 @@ if (_sound isEqualType [] && {_sound#0 == ""} || {_sound isEqualType "" && {_sou _sound params [ "_className", -["_distance", 100, [0] ], +["_distance", 25, [0] ], ["_pitch", 0.95 + random 0.1, [0] ], ["_isSpeech", false, [false, 0] ], ["_offSet", 0, [0] ], From 155ebab056dab5da61fb801c7110bf0ab32b6650 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 28 Dec 2024 17:49:16 +0100 Subject: [PATCH 012/305] debug fnc --- addons/wardrobe/CfgFunctions.hpp | 21 +++++++++++++--- .../debug/fn_getAllWardrobeItems.sqf | 24 +++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 addons/wardrobe/functions/debug/fn_getAllWardrobeItems.sqf diff --git a/addons/wardrobe/CfgFunctions.hpp b/addons/wardrobe/CfgFunctions.hpp index 926a5696fa4..c2ff20159e9 100644 --- a/addons/wardrobe/CfgFunctions.hpp +++ b/addons/wardrobe/CfgFunctions.hpp @@ -7,12 +7,9 @@ class CfgFunctions file = PATH_TO_FUNC; class postInit { postInit = 1; }; - class say3d {}; class clearOnClose {}; class checkItem {}; - class getCfgDataRandom {}; - }; class ace_intel @@ -65,5 +62,23 @@ class CfgFunctions class cache_clear {}; }; + + class config + { + file = PATH_TO_FUNC_SUB(config); + class getCfgDataRandom {}; + }; + + class debug + { + file = PATH_TO_FUNC_SUB(debug); + class getAllWardrobeItems {}; + }; + + class effects + { + file = PATH_TO_FUNC_SUB(effects); + class say3d {}; + }; }; }; \ No newline at end of file diff --git a/addons/wardrobe/functions/debug/fn_getAllWardrobeItems.sqf b/addons/wardrobe/functions/debug/fn_getAllWardrobeItems.sqf new file mode 100644 index 00000000000..acf4e848b52 --- /dev/null +++ b/addons/wardrobe/functions/debug/fn_getAllWardrobeItems.sqf @@ -0,0 +1,24 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* Function to retrieve all Wardrobe Items. +* +* Arguments: +* +* Return Value: +* Nested Array of Classnames that have the wardrobe properties. One Entry per Cfg Group (currently just CfgWeapons) +* +* Example: +* [] call prefix_component_fnc_functionname +* +* Public: No +*/ + +[ + "allWardrobeItems", + { + ["CfgWeapons"] apply { ( Q([_x] call FUNC(checkItem)) configClasses (configFile >> _x) ) apply { configName _x } } + } +] call FUNC(cache_get); + From 0b1f6161afe7dc073fed5e8488644656b766abe7 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 28 Dec 2024 18:18:02 +0100 Subject: [PATCH 013/305] refactor of sound effects --- addons/wardrobe/Baseclass.hpp | 6 ++-- .../wardrobe/functions/replace/fn_replace.sqf | 30 ++++++++++++------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/addons/wardrobe/Baseclass.hpp b/addons/wardrobe/Baseclass.hpp index fa0c69bf997..9de6f596783 100644 --- a/addons/wardrobe/Baseclass.hpp +++ b/addons/wardrobe/Baseclass.hpp @@ -8,7 +8,7 @@ class GVAR(base) // Supports Multiple Sounds, will pick one by random. sound[] = {"click"}; // I need a better default Sound - sound_timing = 1; // [0..1] 0 at the start of the action, 0.5 half way during the duration of the action - always, if completed or not. 1 at the end, only when completed. + sound_timing = 0; // [0..1] 0 at the start of the action, 0.5 half way during the duration of the action - always, if completed or not. 1 at the end, only when completed. // Gesture gesture = "Gear"; @@ -35,5 +35,5 @@ class GVAR(base_U_jacket_closed) : GVAR(base) { alternativeDisplayName = CSTRING // Common Base Class for Helmets with a Visor that can be flipped up or down -class GVAR(base_H_visor_up) : GVAR(base) { gesture ="gestureNod"; sound[] = {""}; soundEnd[] = {"click"}; alternativeDisplayName = CSTRING(visorUp); }; -class GVAR(base_H_visor_down) : GVAR(base) { gesture ="gestureNod"; sound[] = {""}; soundEnd[] = {"click"}; alternativeDisplayName = CSTRING(visorDown); }; \ No newline at end of file +class GVAR(base_H_visor_up) : GVAR(base) { duration = 0.3; gesture ="gestureNod"; sound[] = {"click"}; sound_timing = 1; alternativeDisplayName = CSTRING(visorUp); }; +class GVAR(base_H_visor_down) : GVAR(base) { duration = 0.3; gesture ="gestureNod"; sound[] = {"click"}; sound_timing = 1; alternativeDisplayName = CSTRING(visorDown); }; \ No newline at end of file diff --git a/addons/wardrobe/functions/replace/fn_replace.sqf b/addons/wardrobe/functions/replace/fn_replace.sqf index 3a9ab735057..e661e9d787e 100644 --- a/addons/wardrobe/functions/replace/fn_replace.sqf +++ b/addons/wardrobe/functions/replace/fn_replace.sqf @@ -35,13 +35,24 @@ private _replaceCode = switch ( _typeNumber ) do { case TYPE_BACKPACK: { _additionalParams = "BACKPACK"; FUNC(replace_uniform) }; }; -private _duration = getNumber (_cfg_tgt>> Q(ADDON) >> "duration") max 1; +private _duration = getNumber (_cfg_tgt>> Q(ADDON) >> "duration"); // Plays Random Sound At the Beginning private _sound = [_cfg_tgt >> Q(ADDON) >> "sound"] call FUNC(getCfgDataRandom); private _sound_timing = getNumber (_cfg_tgt>> Q(ADDON) >> "sound_timing") max 0 min 1; -// TODO - refactor sound playing -if (_sound != "") then { [QGVAR(EH_say3d), [_player, _sound]] call CBA_fnc_globalEvent; }; +private _params_soundEnd = false; + +if (_sound != "") then { + if (_sound_timing < 1) then { + [ + CBA_fnc_globalEvent , + [QGVAR(EH_say3d), [_player, _sound]], + _sound_timing * _duration + ] call CBA_fnc_waitAndExecute; + } else { + _params_soundEnd = [ QGVAR(EH_say3d), [ _player, _sound] ]; + }; +}; private _notify_img = getText (_cfg_tgt >> "picture"); if !(".paa" in _notify_img) then { _notify_img = [_notify_img,"paa"] joinString "." }; @@ -51,7 +62,6 @@ private _params_replace = [_player, _cfg_origin, _cfg_tgt, _additionalParams ]; // Dart made a PR to CBA to impove depricated Functions. I plan to use these once cba gets updated. // [ [ _player ], [ _sound, 50 ] ] call CBA_fnc_globalSay; -private _params_soundEnd = [ QGVAR(EH_say3d), [ _player, [ _cfg_tgt >> Q(ADDON) >> "soundEnd" ] call FUNC(getCfgDataRandom), DISTANCE, 0.95 + random 0.1 ] ]; if ( _duration > 1 ) then { @@ -65,9 +75,7 @@ if ( _duration > 1 ) then { _params_replace call _replaceCode; _params_notify call CBA_fnc_notify; - _params_soundEnd call CBA_fnc_globalEvent; - - + if (_params_soundEnd isNotEqualTo false) then { _params_soundEnd call CBA_fnc_globalEvent; }; } // * 3: On Failure: Code called or STRING raised as event. ,{} @@ -75,7 +83,7 @@ if ( _duration > 1 ) then { ] call ace_common_fnc_progressBar; } else { - [ _replaceCode, _params_replace, 1.0 ] call CBA_fnc_waitAndExecute; - [ CBA_fnc_globalEvent, _params_soundEnd, 1.0 ] call CBA_fnc_waitAndExecute; - [ CBA_fnc_notify, _params_notify, 1.2 ] call CBA_fnc_waitAndExecute; -}; + [ _replaceCode, _params_replace, _duration * 1.0 ] call CBA_fnc_waitAndExecute; + [ CBA_fnc_notify, _params_notify, _duration * 1.2 ] call CBA_fnc_waitAndExecute; + if (_params_soundEnd isNotEqualTo false) then { [ CBA_fnc_globalEvent, _params_soundEnd, _duration * 1.0 ] call CBA_fnc_waitAndExecute; }; +}; \ No newline at end of file From 85c703234c6433ffd1567c12c1a258aeb6e9635b Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 28 Dec 2024 19:10:12 +0100 Subject: [PATCH 014/305] purge tab --- .../compat_gm/compat_gm_wardrobe/config.cpp | 14 ++++---- .../compat_rf/compat_rf_wardrobe/config.cpp | 14 ++++---- .../compat_sog/compat_sog_wardrobe/config.cpp | 14 ++++---- .../compat_ws/compat_ws_wardrobe/config.cpp | 16 ++++----- addons/wardrobe/XEH/XEH_preInit.sqf | 36 +++++++++---------- addons/wardrobe/config.cpp | 12 +++---- .../wardrobe/functions/replace/fn_replace.sqf | 7 ++-- addons/wardrobe/stringtable.xml | 36 +++++++++---------- 8 files changed, 72 insertions(+), 77 deletions(-) diff --git a/addons/compat_gm/compat_gm_wardrobe/config.cpp b/addons/compat_gm/compat_gm_wardrobe/config.cpp index 3823b748028..a3a1683f408 100644 --- a/addons/compat_gm/compat_gm_wardrobe/config.cpp +++ b/addons/compat_gm/compat_gm_wardrobe/config.cpp @@ -1,25 +1,25 @@ #include "script_component.hpp" class CfgPatches { - class SUBADDON { - name = COMPONENT_NAME; - author = ECSTRING(common,ACETeam); + class SUBADDON { + name = COMPONENT_NAME; + author = ECSTRING(common,ACETeam); authors[] = {"OverlordZorn [CVO]"}; url = ECSTRING(main,URL); - - VERSION_CONFIG; + + VERSION_CONFIG; addonRootClass = QUOTE(ADDON); requiredAddons[] = { QPVAR(wardrobe), "gm_core" }; - skipWhenMissingDependencies = 1; + skipWhenMissingDependencies = 1; requiredVersion = 2.02; units[] = {}; weapons[] = {}; - }; + }; }; #include "CfgWardrobe.hpp" \ No newline at end of file diff --git a/addons/compat_rf/compat_rf_wardrobe/config.cpp b/addons/compat_rf/compat_rf_wardrobe/config.cpp index 22793b4f532..704ee9bf340 100644 --- a/addons/compat_rf/compat_rf_wardrobe/config.cpp +++ b/addons/compat_rf/compat_rf_wardrobe/config.cpp @@ -1,25 +1,25 @@ #include "script_component.hpp" class CfgPatches { - class SUBADDON { - name = COMPONENT_NAME; - author = ECSTRING(common,ACETeam); + class SUBADDON { + name = COMPONENT_NAME; + author = ECSTRING(common,ACETeam); authors[] = {"OverlordZorn [CVO]"}; url = ECSTRING(main,URL); - - VERSION_CONFIG; + + VERSION_CONFIG; addonRootClass = QUOTE(ADDON); requiredAddons[] = { QPVAR(wardrobe), "RF_Data_Loadorder" }; - skipWhenMissingDependencies = 1; + skipWhenMissingDependencies = 1; requiredVersion = REQUIRED_VERSION; units[] = {}; weapons[] = {}; - }; + }; }; #include "CfgWardrobe.hpp" diff --git a/addons/compat_sog/compat_sog_wardrobe/config.cpp b/addons/compat_sog/compat_sog_wardrobe/config.cpp index b2bc7f07615..e07a5b05ec2 100644 --- a/addons/compat_sog/compat_sog_wardrobe/config.cpp +++ b/addons/compat_sog/compat_sog_wardrobe/config.cpp @@ -1,25 +1,25 @@ #include "script_component.hpp" class CfgPatches { - class SUBADDON { - name = COMPONENT_NAME; - author = ECSTRING(common,ACETeam); + class SUBADDON { + name = COMPONENT_NAME; + author = ECSTRING(common,ACETeam); authors[] = {"OverlordZorn [CVO]"}; url = ECSTRING(main,URL); - - VERSION_CONFIG; + + VERSION_CONFIG; addonRootClass = QUOTE(ADDON); requiredAddons[] = { QPVAR(wardrobe), "vn_data_f" }; - skipWhenMissingDependencies = 1; + skipWhenMissingDependencies = 1; requiredVersion = 2.02; units[] = {}; weapons[] = {}; - }; + }; }; #include "CfgWardrobe.hpp" diff --git a/addons/compat_ws/compat_ws_wardrobe/config.cpp b/addons/compat_ws/compat_ws_wardrobe/config.cpp index ee6b5864984..35ee5b61743 100644 --- a/addons/compat_ws/compat_ws_wardrobe/config.cpp +++ b/addons/compat_ws/compat_ws_wardrobe/config.cpp @@ -1,16 +1,16 @@ #include "script_component.hpp" class CfgPatches { - class ADDON { + class ADDON { // Meta information for editor - name = ADDON_NAME; - author = "$STR_mod_author"; + name = ADDON_NAME; + author = "$STR_mod_author"; authors[] = {"OverlordZorn [CVO]"}; - + url = "$STR_mod_URL"; - VERSION_CONFIG; + VERSION_CONFIG; // Addon Specific Information // Minimum compatible version. When the game's version is lower, pop-up warning will appear when launching the game. @@ -20,8 +20,8 @@ class CfgPatches { // When any of the addons is missing, pop-up warning will appear when launching the game. requiredAddons[] = {QPVAR(main),"cba_main","Characters_f_lxWS_headgear"}; - // Optional. If this is 1, if any of requiredAddons[] entry is missing in your game the entire config will be ignored and return no error (but in rpt) so useful to make a compat Mod (Since Arma 3 2.14) - skipWhenMissingDependencies = 1; + // Optional. If this is 1, if any of requiredAddons[] entry is missing in your game the entire config will be ignored and return no error (but in rpt) so useful to make a compat Mod (Since Arma 3 2.14) + skipWhenMissingDependencies = 1; // List of objects (CfgVehicles classes) contained in the addon. Important also for Zeus content (units and groups) units[] = {}; @@ -29,7 +29,7 @@ class CfgPatches { // List of weapons (CfgWeapons classes) contained in the addon. weapons[] = {}; - }; + }; }; #include "CfgWardrobe.hpp" \ No newline at end of file diff --git a/addons/wardrobe/XEH/XEH_preInit.sqf b/addons/wardrobe/XEH/XEH_preInit.sqf index 2c6434529da..8e8bcd2b3e1 100644 --- a/addons/wardrobe/XEH/XEH_preInit.sqf +++ b/addons/wardrobe/XEH/XEH_preInit.sqf @@ -14,26 +14,26 @@ QSET(test) -> "ADDON_set_test" /* [ - QSET(displayMusic), // _setting - Unique setting name. Matches resulting variable name - "CHECKBOX", // _settingType - Type of setting. Can be "CHECKBOX", "EDITBOX", "LIST", "SLIDER" or "COLOR" - ["Display Music Title","This enables the message of the currently played music title by the CVO Music System"], - // _title - Display name or display name + tooltip (optional, default: same as setting name) - ["CVO", "CVO Music"], // _category - Category for the settings menu + optional sub-category - false, // _valueInfo - Extra properties of the setting depending of _settingType. See examples below - 0, // _isGlobal - 1: all clients share the same setting, 2: setting can't be overwritten (optional, default: 0) - {}, // _script - Script to execute when setting is changed. (optional) - false // _needRestart - Setting will be marked as needing mission restart after being changed. (optional, default false) + QSET(displayMusic), // _setting - Unique setting name. Matches resulting variable name + "CHECKBOX", // _settingType - Type of setting. Can be "CHECKBOX", "EDITBOX", "LIST", "SLIDER" or "COLOR" + ["Display Music Title","This enables the message of the currently played music title by the CVO Music System"], + // _title - Display name or display name + tooltip (optional, default: same as setting name) + ["CVO", "CVO Music"], // _category - Category for the settings menu + optional sub-category + false, // _valueInfo - Extra properties of the setting depending of _settingType. See examples below + 0, // _isGlobal - 1: all clients share the same setting, 2: setting can't be overwritten (optional, default: 0) + {}, // _script - Script to execute when setting is changed. (optional) + false // _needRestart - Setting will be marked as needing mission restart after being changed. (optional, default false) ] call CBA_fnc_addSetting; */ [ - QSET(enable), // _setting - Unique setting name. Matches resulting variable name - "CHECKBOX", // _settingType - Type of setting. Can be "CHECKBOX", "EDITBOX", "LIST", "SLIDER" or "COLOR" - SETLSTRING(enable), - // _title - Display name or display name + tooltip (optional, default: same as setting name) - [LSTRING(set_cat_main)], // _category - Category for the settings menu + optional sub-category - true, // _valueInfo - Extra properties of the setting depending of _settingType. See examples below - 1, // _isGlobal - 1: all clients share the same setting, 2: setting can't be overwritten (optional, default: 0) - {}, // _script - Script to execute when setting is changed. (optional) - false // _needRestart - Setting will be marked as needing mission restart after being changed. (optional, default false) + QSET(enable), // _setting - Unique setting name. Matches resulting variable name + "CHECKBOX", // _settingType - Type of setting. Can be "CHECKBOX", "EDITBOX", "LIST", "SLIDER" or "COLOR" + SETLSTRING(enable), + // _title - Display name or display name + tooltip (optional, default: same as setting name) + [LSTRING(set_cat_main)], // _category - Category for the settings menu + optional sub-category + true, // _valueInfo - Extra properties of the setting depending of _settingType. See examples below + 1, // _isGlobal - 1: all clients share the same setting, 2: setting can't be overwritten (optional, default: 0) + {}, // _script - Script to execute when setting is changed. (optional) + false // _needRestart - Setting will be marked as needing mission restart after being changed. (optional, default false) ] call CBA_fnc_addSetting; diff --git a/addons/wardrobe/config.cpp b/addons/wardrobe/config.cpp index 6806b610b62..38a159cf24d 100644 --- a/addons/wardrobe/config.cpp +++ b/addons/wardrobe/config.cpp @@ -1,23 +1,23 @@ #include "script_component.hpp" class CfgPatches { - class ADDON { - name = COMPONENT_NAME; - author = ECSTRING(common,ACETeam); + class ADDON { + name = COMPONENT_NAME; + author = ECSTRING(common,ACETeam); authors[] = {"OverlordZorn [CVO]"}; url = ECSTRING(main,URL); - VERSION_CONFIG; + VERSION_CONFIG; requiredVersion = REQUIRED_VERSION; requiredAddons[] = { "ace_interact_menu" }; - skipWhenMissingDependencies = 1; + skipWhenMissingDependencies = 1; units[] = {}; weapons[] = {}; - }; + }; }; #include "CfgFunctions.hpp" diff --git a/addons/wardrobe/functions/replace/fn_replace.sqf b/addons/wardrobe/functions/replace/fn_replace.sqf index e661e9d787e..5772d1f6bb8 100644 --- a/addons/wardrobe/functions/replace/fn_replace.sqf +++ b/addons/wardrobe/functions/replace/fn_replace.sqf @@ -60,14 +60,11 @@ if !(".paa" in _notify_img) then { _notify_img = [_notify_img,"paa"] joinString private _params_notify = [[ _notify_img, 4], [getText (_cfg_tgt >> "displayName")], true ]; private _params_replace = [_player, _cfg_origin, _cfg_tgt, _additionalParams ]; -// Dart made a PR to CBA to impove depricated Functions. I plan to use these once cba gets updated. -// [ [ _player ], [ _sound, 50 ] ] call CBA_fnc_globalSay; - if ( _duration > 1 ) then { [ - _duration // * 0: Total Time (in game "time" seconds) - ,[_replaceCode, _params_replace, _params_soundEnd, _params_notify] // * 1: Arguments, passed to condition, fail and finish + _duration // * 0: Total Time (in game "time" seconds) + ,[_replaceCode, _params_replace, _params_soundEnd, _params_notify] // * 1: Arguments, passed to condition, fail and finish // * 2: On Finish: Code called or STRING raised as event. ,{ params ["_args", "_elapsedTime", "_totalTime", "_errorCode"]; diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml index 06706f928a7..92822bb6a0d 100644 --- a/addons/wardrobe/stringtable.xml +++ b/addons/wardrobe/stringtable.xml @@ -1,38 +1,36 @@ - - - OverlordZorn[CVO] - OverlordZorn[CVO] - - ACE Wardrobe ACE Wardrobe + ACE Gaderobe Enable + Enable + Aktivieren - When Enabled, will let the player use the Wardrobe Actions. + When Enabled, will let the player use the Wardrobe actions. Wardrobe Wardrobe + Gaderobe - Take Gloves Off - Take Gloves Off + Take gloves off + Take gloves off - Wear Gloves - Wear Gloves + Wear gloves + Wear gloves Close Jacket @@ -43,20 +41,20 @@ Open Jacket - Roll sleeves Down - Roll sleeves Down + Roll sleeves down + Roll sleeves down - Roll sleeves Up - Roll sleeves Up + Roll sleeves up + Roll sleeves up - Visor Down - Visor Down + Visor down + Visor down - Visor Up - Visor Up + Visor up + Visor up From 280e73666831627d92fa9a572decc967ed5c7439 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 28 Dec 2024 20:21:19 +0100 Subject: [PATCH 015/305] temp test mission --- .hemtt/launch.toml | 16 ++ .hemtt/missions/test.VR/mission.sqm | 254 ++++++++++++++++++++++++++++ 2 files changed, 270 insertions(+) create mode 100644 .hemtt/missions/test.VR/mission.sqm diff --git a/.hemtt/launch.toml b/.hemtt/launch.toml index c5a5da34530..adda989104e 100644 --- a/.hemtt/launch.toml +++ b/.hemtt/launch.toml @@ -41,3 +41,19 @@ workshop = [ "843593391", # RHS GREF Workshop ID "843632231", # RHS SAF Workshop ID ] + +[zrn] +extends = "default" +workshop = [ + "2369477168", # Advanced Developer Tools + "1779063631", # ZEN +# "623475643", # eden enhanced +] +mission = "test.VR" + +[zrn_dlc] +extends = "zrn" +dlc = [ + "Reaction Forces", + "Western Sahara" +] \ No newline at end of file diff --git a/.hemtt/missions/test.VR/mission.sqm b/.hemtt/missions/test.VR/mission.sqm new file mode 100644 index 00000000000..6e4cdddd9d6 --- /dev/null +++ b/.hemtt/missions/test.VR/mission.sqm @@ -0,0 +1,254 @@ +version=54; +class EditorData +{ + moveGridStep=2; + angleGridStep=0.2617994; + scaleGridStep=1; + autoGroupingDist=10; + toggles=517; + class ItemIDProvider + { + nextID=202; + }; + class Camera + { + pos[]={10.292682,7.7905149,-9.2390032}; + dir[]={0.76574892,-0.31659395,-0.55981857}; + up[]={0.2555781,0.94856107,-0.18684632}; + aside[]={-0.59017646,0,-0.8072741}; + }; +}; +binarizationWanted=0; +sourceName="test"; +addons[]= +{ + "A3_Weapons_F", + "ace_realisticnames", + "ace_ballistics", + "A3_Characters_F", + "A3_Soft_F_Exp_Offroad_02" +}; +class AddonsMetaData +{ + class List + { + items=4; + class Item0 + { + className="A3_Weapons_F"; + name="Arma 3 Alpha - Weapons and Accessories"; + author="Bohemia Interactive"; + url="https://www.arma3.com"; + }; + class Item1 + { + className="A3_Characters_F"; + name="Arma 3 Alpha - Characters and Clothing"; + author="Bohemia Interactive"; + url="https://www.arma3.com"; + }; + class Item2 + { + className="ace_ballistics"; + name="ACE3 - Ballistics"; + author="ACE-Team"; + url="https://ace3.acemod.org/"; + }; + class Item3 + { + className="A3_Soft_F_Exp"; + name="Arma 3 Apex - Unarmored Land Vehicles"; + author="Bohemia Interactive"; + url="https://www.arma3.com"; + }; + }; +}; +dlcs[]= +{ + "Expansion" +}; +randomSeed=4540948; +class ScenarioData +{ + author="Overlord Zorn"; +}; +class CustomAttributes +{ +}; +class Mission +{ + class Intel + { + timeOfChanges=1800.0002; + startWeather=0; + startWind=0.1; + startWaves=0.1; + forecastWeather=0; + forecastWind=0.1; + forecastWaves=0.1; + forecastLightnings=0.1; + wavesForced=1; + windForced=1; + year=2035; + day=28; + hour=13; + minute=37; + startFogDecay=0.014; + forecastFogDecay=0.014; + }; + class Entities + { + items=4; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={16,5,-12}; + }; + side="Empty"; + flags=4; + class Attributes + { + }; + id=196; + type="Weapon_hgun_Pistol_heavy_01_F"; + }; + class Item1 + { + dataType="Object"; + class PositionInfo + { + position[]={17.833,5.2840548,-13.012}; + }; + side="Empty"; + flags=4; + class Attributes + { + init="[this, flatten ([] call ACE_WARDROBE_fnc_getAllWardrobeItems)] call ace_arsenal_fnc_initBox;"; + }; + id=197; + type="ACE_Box_Ammo"; + class CustomAttributes + { + class Attribute0 + { + property="ace_arsenal_attribute"; + expression="if (!is3DEN) then {[_this, +_value] call ace_arsenal_fnc_attributeInit}"; + class Value + { + class data + { + singleType="ARRAY"; + class value + { + items=2; + class Item0 + { + class data + { + singleType="ARRAY"; + }; + }; + class Item1 + { + class data + { + singleType="SCALAR"; + value=0; + }; + }; + }; + }; + }; + }; + class Attribute1 + { + property="ammoBox"; + expression="[_this,_value] call bis_fnc_initAmmoBox;"; + class Value + { + class data + { + singleType="STRING"; + value="[[[[""hgun_Pistol_heavy_01_green_snds_F""],[1]],[[""11Rnd_45ACP_Mag""],[2]],[[],[]],[[],[]]],false]"; + }; + }; + }; + nAttributes=2; + }; + }; + class Item2 + { + dataType="Group"; + side="Civilian"; + class Entities + { + items=1; + class Item0 + { + dataType="Object"; + class PositionInfo + { + position[]={15.877691,5.0014391,-20.87595}; + }; + side="Civilian"; + flags=7; + class Attributes + { + isPlayer=1; + class Inventory + { + class uniform + { + typeName="gm_ge_uniform_soldier_rolled_90_flk"; + isBackpack=0; + }; + map="ItemMap"; + compass="ItemCompass"; + watch="ItemWatch"; + }; + }; + id=199; + type="C_man_polo_1_F"; + }; + }; + class Attributes + { + }; + id=198; + }; + class Item3 + { + dataType="Object"; + class PositionInfo + { + position[]={5,6.5695963,-27.110023}; + }; + side="Empty"; + flags=4; + class Attributes + { + }; + id=200; + type="C_Offroad_02_unarmed_F"; + class CustomAttributes + { + class Attribute0 + { + property="ammoBox"; + expression="[_this,_value] call bis_fnc_initAmmoBox;"; + class Value + { + class data + { + singleType="STRING"; + value="[[[[""FirstAidKit""],[6]],[[],[]],[[],[]],[[],[]]],false]"; + }; + }; + }; + nAttributes=1; + }; + }; + }; +}; From d91d5c023b370be87b3d41d1306deaed7503ca69 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 28 Dec 2024 20:26:32 +0100 Subject: [PATCH 016/305] Update Turbans.hpp --- .../compat_ws/compat_ws_wardrobe/Turbans.hpp | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp index 92db3bc726f..51969376257 100644 --- a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp @@ -8,27 +8,40 @@ class CN(01,COLOR): lxWS_H_turban_01_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,COLOR), QCN(03,COLOR), QCN(04,COLOR) }; }; };\ class CN(02,COLOR): lxWS_H_turban_02_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,COLOR), QCN(03,COLOR), QCN(04,COLOR) }; }; };\ class CN(03,COLOR): lxWS_H_turban_03_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,COLOR), QCN(02,COLOR), QCN(04,COLOR) }; }; };\ -class CN(04,COLOR): lxWS_H_turban_04_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,COLOR), QCN(02,COLOR), QCN(03,COLOR) }; }; };\ +class CN(04,COLOR): lxWS_H_turban_04_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,COLOR), QCN(02,COLOR), QCN(03,COLOR) }; }; }; #define COLORGROUP_SPECIAL(COLOR)\ class CN(02,COLOR): lxWS_H_turban_02_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(03,COLOR) }; }; };\ -class CN(03,COLOR): lxWS_H_turban_03_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,COLOR) }; }; };\ +class CN(03,COLOR): lxWS_H_turban_03_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,COLOR) }; }; }; + + +lxWS_H_bmask_base // mask standalone + // BASECLASS class H_Shemag_khk; -class lxWS_H_turban_01_black : H_Shemag_khk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,black), QCN(03,black), QCN(04,black) }; }; }; -class lxWS_H_turban_02_black : lxWS_H_turban_01_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(03,black), QCN(04,black) }; }; }; -class lxWS_H_turban_03_black : lxWS_H_turban_01_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(04,black) }; }; }; -class lxWS_H_turban_04_black : lxWS_H_turban_01_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(03,black) }; }; }; + +class H_turban_02_mask_black_lxws : H_Shemag_khk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(03,black), QCN(04,black) }; components[] = { "lxWS_H_bmask_base" }; }; }; +class lxWS_H_turban_01_black : H_Shemag_khk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,black), QCN(03,black), QCN(04,black), "H_turban_02_mask_black_lxws" }; }; }; +class lxWS_H_turban_02_black : lxWS_H_turban_01_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(03,black), QCN(04,black), "H_turban_02_mask_black_lxws" }; }; }; +class lxWS_H_turban_03_black : lxWS_H_turban_01_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(04,black), "H_turban_02_mask_black_lxws" }; }; }; +class lxWS_H_turban_04_black : lxWS_H_turban_01_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(03,black), "H_turban_02_mask_black_lxws" }; }; }; // VARIATIONS COLORGROUP(blue) COLORGROUP(blue_una) COLORGROUP(green) COLORGROUP(red) -COLORGROUP(sand) COLORGROUP(gray) COLORGROUP(yellow) // Special Variations -COLORGROUP_SPECIAL(green_pattern) \ No newline at end of file +COLORGROUP_SPECIAL(green_pattern) + +// Super Special Manual blabla +class H_turban_02_mask_snake_lxws : H_turban_02_mask_black_lxws { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_hex_lxws" }; components[] = {"lxWS_H_bmask_hex"}; }; }; +class H_turban_02_mask_hex_lxws: H_turban_02_mask_black_lxws { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws" }; components[] = {"H_bmask_snake_lxws"}; }; }; +class lxWS_H_turban_01_sand: lxWS_H_turban_01_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; +class lxWS_H_turban_02_sand: lxWS_H_turban_02_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; +class lxWS_H_turban_03_sand: lxWS_H_turban_03_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; +class lxWS_H_turban_04_sand: lxWS_H_turban_04_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; \ No newline at end of file From ce208c5488d74ba1b0f4eb02850c779f2fb19c3a Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 29 Dec 2024 17:22:52 +0100 Subject: [PATCH 017/305] check for component implemented --- .hemtt/missions/test.VR/mission.sqm | 13 +++---- .../compat_ws/compat_ws_wardrobe/Turbans.hpp | 9 ++--- addons/wardrobe/CfgFunctions.hpp | 7 +++- .../functions/action/fn_addActions.sqf | 9 ++--- .../action/fn_addActions_children.sqf | 12 ++---- .../action/fn_addActions_condition.sqf | 11 +++++- .../debug/fn_getAllWardrobeItems.sqf | 8 +--- addons/wardrobe/functions/fn_canModifyTo.sqf | 24 ++++++++++++ .../functions/fn_compare_components.sqf | 28 ++++++++++++++ .../{fn_checkItem.sqf => fn_isModifiable.sqf} | 0 addons/wardrobe/functions/fn_returnItem.sqf | 22 +++++++++++ .../getItems/fn_getItems_modifiableTo.sqf | 20 ++++++++++ .../getItems/fn_getItems_modifiable_all.sqf | 38 ++++++++++++++----- .../fn_getItems_modifiable_current.sqf | 38 +++++++++++++------ .../wardrobe/functions/replace/fn_replace.sqf | 11 +++++- 15 files changed, 193 insertions(+), 57 deletions(-) create mode 100644 addons/wardrobe/functions/fn_canModifyTo.sqf create mode 100644 addons/wardrobe/functions/fn_compare_components.sqf rename addons/wardrobe/functions/{fn_checkItem.sqf => fn_isModifiable.sqf} (100%) create mode 100644 addons/wardrobe/functions/fn_returnItem.sqf create mode 100644 addons/wardrobe/functions/getItems/fn_getItems_modifiableTo.sqf diff --git a/.hemtt/missions/test.VR/mission.sqm b/.hemtt/missions/test.VR/mission.sqm index 6e4cdddd9d6..0f1533140f5 100644 --- a/.hemtt/missions/test.VR/mission.sqm +++ b/.hemtt/missions/test.VR/mission.sqm @@ -5,17 +5,17 @@ class EditorData angleGridStep=0.2617994; scaleGridStep=1; autoGroupingDist=10; - toggles=517; + toggles=1541; class ItemIDProvider { nextID=202; }; class Camera { - pos[]={10.292682,7.7905149,-9.2390032}; - dir[]={0.76574892,-0.31659395,-0.55981857}; - up[]={0.2555781,0.94856107,-0.18684632}; - aside[]={-0.59017646,0,-0.8072741}; + pos[]={3.673414,13.197466,-29.890484}; + dir[]={0.56360948,-0.37021363,0.73846245}; + up[]={0.22461432,0.92893893,0.29429838}; + aside[]={0.79494452,-8.312054e-08,-0.60671729}; }; }; binarizationWanted=0; @@ -72,9 +72,6 @@ class ScenarioData { author="Overlord Zorn"; }; -class CustomAttributes -{ -}; class Mission { class Intel diff --git a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp index 51969376257..8b6fcc4a237 100644 --- a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp @@ -10,14 +10,12 @@ class CN(02,COLOR): lxWS_H_turban_02_black { class PVAR(wardrobe) : EGVAR(wardro class CN(03,COLOR): lxWS_H_turban_03_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,COLOR), QCN(02,COLOR), QCN(04,COLOR) }; }; };\ class CN(04,COLOR): lxWS_H_turban_04_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,COLOR), QCN(02,COLOR), QCN(03,COLOR) }; }; }; + #define COLORGROUP_SPECIAL(COLOR)\ class CN(02,COLOR): lxWS_H_turban_02_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(03,COLOR) }; }; };\ class CN(03,COLOR): lxWS_H_turban_03_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,COLOR) }; }; }; -lxWS_H_bmask_base // mask standalone - - // BASECLASS class H_Shemag_khk; @@ -38,9 +36,10 @@ COLORGROUP(yellow) // Special Variations COLORGROUP_SPECIAL(green_pattern) + // Super Special Manual blabla -class H_turban_02_mask_snake_lxws : H_turban_02_mask_black_lxws { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_hex_lxws" }; components[] = {"lxWS_H_bmask_hex"}; }; }; -class H_turban_02_mask_hex_lxws: H_turban_02_mask_black_lxws { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws" }; components[] = {"H_bmask_snake_lxws"}; }; }; +class H_turban_02_mask_snake_lxws : H_turban_02_mask_black_lxws { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_hex_lxws" }; components[] = {"H_bmask_snake_lxws"}; }; }; +class H_turban_02_mask_hex_lxws: H_turban_02_mask_black_lxws { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws" }; components[] = {"lxWS_H_bmask_hex"}; }; }; class lxWS_H_turban_01_sand: lxWS_H_turban_01_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; class lxWS_H_turban_02_sand: lxWS_H_turban_02_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; class lxWS_H_turban_03_sand: lxWS_H_turban_03_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; diff --git a/addons/wardrobe/CfgFunctions.hpp b/addons/wardrobe/CfgFunctions.hpp index c2ff20159e9..8ef9795d614 100644 --- a/addons/wardrobe/CfgFunctions.hpp +++ b/addons/wardrobe/CfgFunctions.hpp @@ -9,7 +9,10 @@ class CfgFunctions class postInit { postInit = 1; }; class clearOnClose {}; - class checkItem {}; + class isModifiable {}; + + class compare_components {}; + class canModifyTo {}; }; class ace_intel @@ -27,6 +30,8 @@ class CfgFunctions class getItems_modifiable_all {}; class getItems_modifiable_current {}; + class getItems_modifiableTo {}; + }; class replace diff --git a/addons/wardrobe/functions/action/fn_addActions.sqf b/addons/wardrobe/functions/action/fn_addActions.sqf index c3fc715aa8c..acbb88fbc0d 100644 --- a/addons/wardrobe/functions/action/fn_addActions.sqf +++ b/addons/wardrobe/functions/action/fn_addActions.sqf @@ -20,17 +20,16 @@ params ["_unit"]; private _modifiableItems = [_unit] call FUNC(getItems_modifiable_current); -diag_log format ['[CVO](debug)(fn_addActions) _modifiableItems: %1', _modifiableItems]; private _actions = []; - { - private _params = [_x]; - private _cfg = [_x] call CBA_fnc_getItemConfig; + private _cfg = _x#0; + private _className = configName _cfg; + private _params = [_cfg, _x#1]; diag_log format ['[CVO](debug)(fn_addActions) _cfg: %1', _cfg]; private _aceAction = [ - _x // * 0: Action name + _className // * 0: Action name ,getText (_cfg >> "displayName") // * 1: Name of the action shown in the menu ,getText (_cfg >> "picture") // * 2: Icon "\A3\ui_f\data\igui\cfg\simpleTasks\types\backpack_ca.paa" ,{} // * 3: Statement diff --git a/addons/wardrobe/functions/action/fn_addActions_children.sqf b/addons/wardrobe/functions/action/fn_addActions_children.sqf index 7bc4e5810b6..dbdb100f81a 100644 --- a/addons/wardrobe/functions/action/fn_addActions_children.sqf +++ b/addons/wardrobe/functions/action/fn_addActions_children.sqf @@ -16,23 +16,19 @@ */ params ["_target", "_player", "_actionParams"]; +_actionParams params ["_cfg_origin", "_newItems"]; -_actionParams params ["_modifiableItem"]; - -private _cfg_origin = [_modifiableItem] call CBA_fnc_getItemConfig; - -private _newItems = [_cfg_origin >> QPVAR(wardrobe) >> "modifiableTo"] call BIS_fnc_getCfgDataArray; private _actions = []; { - private _targetItem = _x; - private _cfg_target = [_targetItem] call CBA_fnc_getItemConfig; + private _cfg_target = _x; + private _className_target = configName _cfg_target; private _params = [_cfg_origin, _cfg_target]; private _aceAction = [ - _targetItem // * 0: Action name + _className_target // * 0: Action name ,[_cfg_target] call FUNC(getAction_Name) // * 1: Name of the action shown in the menu ,[_cfg_target] call FUNC(getAction_Icon) // * 2: Icon "\A3\ui_f\data\igui\cfg\simpleTasks\types\backpack_ca.paa" ,FUNC(replace) // * 3: Statement diff --git a/addons/wardrobe/functions/action/fn_addActions_condition.sqf b/addons/wardrobe/functions/action/fn_addActions_condition.sqf index 18b47ef6a46..d522e6f1a4a 100644 --- a/addons/wardrobe/functions/action/fn_addActions_condition.sqf +++ b/addons/wardrobe/functions/action/fn_addActions_condition.sqf @@ -17,4 +17,13 @@ params ["_player"]; -missionNamespace getVariable [QSET(enable), false] && { count ([_player] call FUNC(getItems_modifiable_current)) > 0 } \ No newline at end of file +missionNamespace getVariable [QSET(enable), false] +&& +{ + count ([_player] call FUNC(getItems_modifiable_current)) > 0 +} + + +// 1. Check if the player has items that can be modified +// 2. Get the target classnames and check if they are available. +// \ No newline at end of file diff --git a/addons/wardrobe/functions/debug/fn_getAllWardrobeItems.sqf b/addons/wardrobe/functions/debug/fn_getAllWardrobeItems.sqf index acf4e848b52..5fa1c7e69a1 100644 --- a/addons/wardrobe/functions/debug/fn_getAllWardrobeItems.sqf +++ b/addons/wardrobe/functions/debug/fn_getAllWardrobeItems.sqf @@ -15,10 +15,4 @@ * Public: No */ -[ - "allWardrobeItems", - { - ["CfgWeapons"] apply { ( Q([_x] call FUNC(checkItem)) configClasses (configFile >> _x) ) apply { configName _x } } - } -] call FUNC(cache_get); - +["CfgWeapons"] apply { ( Q([_x] call FUNC(isModifiable)) configClasses (configFile >> _x) ) apply { configName _x } } \ No newline at end of file diff --git a/addons/wardrobe/functions/fn_canModifyTo.sqf b/addons/wardrobe/functions/fn_canModifyTo.sqf new file mode 100644 index 00000000000..2580eace2ef --- /dev/null +++ b/addons/wardrobe/functions/fn_canModifyTo.sqf @@ -0,0 +1,24 @@ +#include "../script_component.hpp" + +/* +* Author: Zorn +* Check if the unit can modify from current to target. Checks and compares components. +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +params ["_unit", "_cfg_origin", "_cfg_target"]; + +[_cfg_origin, _cfg_target] call FUNC(compare_components) params ["_missing", "_surplus"]; + +private _currentItems = [_unit] call FUNC(getItems_all); + +count ( _missing select { ! (_x in _currentItems) } ) == 0 diff --git a/addons/wardrobe/functions/fn_compare_components.sqf b/addons/wardrobe/functions/fn_compare_components.sqf new file mode 100644 index 00000000000..a2acbb4a7df --- /dev/null +++ b/addons/wardrobe/functions/fn_compare_components.sqf @@ -0,0 +1,28 @@ +#include "../script_component.hpp" + +/* +* Author: Zorn +* Function to compare the components of the current and target wearables. +* +* Arguments: +* +* Return Value: +* Nested Array - [[missing components], [surplus components]] +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +params ["_cfg_origin", "_cfg_tgt"]; + +private _current = getArray (_cfg_origin >> QPVAR(wardrobe) >> "components"); +private _needed = getArray (_cfg_tgt >> QPVAR(wardrobe) >> "components"); + +private _missing = []; + +{ if (_x in _current) then { _current = _current - [_x] } else { _missing pushBack _x }; } forEach _needed; + +//[[missing components], [surplus components]] +[_missing, _current] \ No newline at end of file diff --git a/addons/wardrobe/functions/fn_checkItem.sqf b/addons/wardrobe/functions/fn_isModifiable.sqf similarity index 100% rename from addons/wardrobe/functions/fn_checkItem.sqf rename to addons/wardrobe/functions/fn_isModifiable.sqf diff --git a/addons/wardrobe/functions/fn_returnItem.sqf b/addons/wardrobe/functions/fn_returnItem.sqf new file mode 100644 index 00000000000..e44b0eb299e --- /dev/null +++ b/addons/wardrobe/functions/fn_returnItem.sqf @@ -0,0 +1,22 @@ +#include "../script_component.hpp" + +/* +* Author: Zorn +* Function to return an component to the player. +* +* Arguments: +* +* Return Value: +* boolean - was it successful? +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +params ["_unit", "_itemClassName"]; + +if !(_unit canAdd _itemClassName) exitWith { false }; +_unit addItem _itemClassName; +true \ No newline at end of file diff --git a/addons/wardrobe/functions/getItems/fn_getItems_modifiableTo.sqf b/addons/wardrobe/functions/getItems/fn_getItems_modifiableTo.sqf new file mode 100644 index 00000000000..388520c6835 --- /dev/null +++ b/addons/wardrobe/functions/getItems/fn_getItems_modifiableTo.sqf @@ -0,0 +1,20 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* Function to return an array the config of desired target items. Also checks if those items exist: CBA_fnc_getItemConfig returns configNull when item not found. +* +* Arguments: +* +* Return Value: +* Array of Configs - Available Target configs +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +params ["_cfg_current"]; + +[_cfg_current >> QADDON >> "modifiableTo"] call BIS_fnc_getCfgDataArray apply { [_x] call CBA_fnc_getItemConfig } select { !isNull _x } \ No newline at end of file diff --git a/addons/wardrobe/functions/getItems/fn_getItems_modifiable_all.sqf b/addons/wardrobe/functions/getItems/fn_getItems_modifiable_all.sqf index b8427d635ea..cd1afe40d5e 100644 --- a/addons/wardrobe/functions/getItems/fn_getItems_modifiable_all.sqf +++ b/addons/wardrobe/functions/getItems/fn_getItems_modifiable_all.sqf @@ -15,21 +15,39 @@ * Public: No */ - params [ - ["_player", objNull, [objNull]] + ["_unit", objNull, [objNull]] ]; + +private _code = { + + [_unit] call FUNC(getItems_all) + apply + { [_x] call CBA_fnc_getItemConfig } + select + { [_x] call FUNC(isModifiable) } + apply + { [_x, [_x] call FUNC(getItems_modifiableTo) ] } + select + { count (_x#1) > 0 } + apply + { + private _origin_cfg = _x#0; + [ + _origin_cfg, + _x#1 select { [_unit, _origin_cfg, _x] call FUNC(canModifyTo) } + ] + } + select + { count (_x#1) > 0 } +}; + + + // Cleanup Cache once the interaction menu is closed ["items_modifiable_all"] call FUNC(clearOnClose); [ "items_modifiable_all", - { - private _array = []; - { - private _cfg = [_x] call CBA_fnc_getItemConfig; - if ( [_cfg] call FUNC(checkItem) && { count ([_cfg >> QADDON >> "modifiableTo"] call BIS_fnc_getCfgDataArray) > 0 } ) then { _array pushBack _x; }; - } forEach ( [_player] call FUNC(getItems_all) ); - _array - } + _code ] call FUNC(cache_get); \ No newline at end of file diff --git a/addons/wardrobe/functions/getItems/fn_getItems_modifiable_current.sqf b/addons/wardrobe/functions/getItems/fn_getItems_modifiable_current.sqf index b3929b2be0a..66c71273f46 100644 --- a/addons/wardrobe/functions/getItems/fn_getItems_modifiable_current.sqf +++ b/addons/wardrobe/functions/getItems/fn_getItems_modifiable_current.sqf @@ -15,22 +15,38 @@ * Public: No */ - params [ - ["_player", objNull, [objNull]] + ["_unit", objNull, [objNull]] ]; + +private _code = { + + ( [headgear _unit, goggles _unit, uniform _unit, vest _unit, backpack _unit] - [""] ) + apply + { [_x] call CBA_fnc_getItemConfig } + select + { [_x] call FUNC(isModifiable) } + apply + { [_x, [_x] call FUNC(getItems_modifiableTo) ] } + select + { count (_x#1) > 0 } + apply + { + private _origin_cfg = _x#0; + [ + _origin_cfg, + _x#1 select { [_unit, _origin_cfg, _x] call FUNC(canModifyTo) } + ] + } + select + { count (_x#1) > 0 } +}; + + // Cleanup Cache once the interaction menu is closed ["items_modifiable_current"] call FUNC(clearOnClose); [ "items_modifiable_current", - { - private _array = []; - { - private _cfg = [_x] call CBA_fnc_getItemConfig; - if ( [_cfg] call FUNC(checkItem) && { count ([_cfg >> QADDON >> "modifiableTo"] call BIS_fnc_getCfgDataArray) > 0 } ) then { _array pushBack _x; }; - - } forEach ( [headgear _player, goggles _player, uniform _player, vest _player, backpack _player] - [""] ); - _array - } + _code ] call FUNC(cache_get); \ No newline at end of file diff --git a/addons/wardrobe/functions/replace/fn_replace.sqf b/addons/wardrobe/functions/replace/fn_replace.sqf index 5772d1f6bb8..4e8adcdf6bd 100644 --- a/addons/wardrobe/functions/replace/fn_replace.sqf +++ b/addons/wardrobe/functions/replace/fn_replace.sqf @@ -25,6 +25,10 @@ _actionParams params ["_cfg_origin", "_cfg_tgt"]; private _typeNumber = getNumber (_cfg_origin >> "ItemInfo" >> "type"); +// Remove / Add Missing/Surplus Items. +[_cfg_origin, _cfg_tgt] call FUNC(compare_components) params ["_missing", "_surplus"]; +systemChat format ["%1 - %2", _missing, _surplus]; + private _additionalParams = ""; private _replaceCode = switch ( _typeNumber ) do { @@ -60,6 +64,9 @@ if !(".paa" in _notify_img) then { _notify_img = [_notify_img,"paa"] joinString private _params_notify = [[ _notify_img, 4], [getText (_cfg_tgt >> "displayName")], true ]; private _params_replace = [_player, _cfg_origin, _cfg_tgt, _additionalParams ]; + +// Im considering removing the progressbar tbh. just causes alot of issues without a real need for it. + if ( _duration > 1 ) then { [ @@ -76,11 +83,13 @@ if ( _duration > 1 ) then { } // * 3: On Failure: Code called or STRING raised as event. ,{} - ,"" // * 4: Localized Title (default: "") + ,"" // * 4: Localized Title (default: "") ] call ace_common_fnc_progressBar; } else { + [ _replaceCode, _params_replace, _duration * 1.0 ] call CBA_fnc_waitAndExecute; [ CBA_fnc_notify, _params_notify, _duration * 1.2 ] call CBA_fnc_waitAndExecute; if (_params_soundEnd isNotEqualTo false) then { [ CBA_fnc_globalEvent, _params_soundEnd, _duration * 1.0 ] call CBA_fnc_waitAndExecute; }; + }; \ No newline at end of file From 70e2687805341ee01a9d256002fcf8c23b6b0837 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 29 Dec 2024 19:33:11 +0100 Subject: [PATCH 018/305] components fully supported --- addons/wardrobe/functions/fn_returnItem.sqf | 22 ------ .../wardrobe/functions/replace/fn_replace.sqf | 71 +++++-------------- 2 files changed, 16 insertions(+), 77 deletions(-) delete mode 100644 addons/wardrobe/functions/fn_returnItem.sqf diff --git a/addons/wardrobe/functions/fn_returnItem.sqf b/addons/wardrobe/functions/fn_returnItem.sqf deleted file mode 100644 index e44b0eb299e..00000000000 --- a/addons/wardrobe/functions/fn_returnItem.sqf +++ /dev/null @@ -1,22 +0,0 @@ -#include "../script_component.hpp" - -/* -* Author: Zorn -* Function to return an component to the player. -* -* Arguments: -* -* Return Value: -* boolean - was it successful? -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ - -params ["_unit", "_itemClassName"]; - -if !(_unit canAdd _itemClassName) exitWith { false }; -_unit addItem _itemClassName; -true \ No newline at end of file diff --git a/addons/wardrobe/functions/replace/fn_replace.sqf b/addons/wardrobe/functions/replace/fn_replace.sqf index 4e8adcdf6bd..c17a0cbc70c 100644 --- a/addons/wardrobe/functions/replace/fn_replace.sqf +++ b/addons/wardrobe/functions/replace/fn_replace.sqf @@ -15,81 +15,42 @@ * Public: No */ -#define DISTANCE 50 - -params ["_target", "_player", "_actionParams"]; +params ["_target", "_unit", "_actionParams"]; _actionParams params ["_cfg_origin", "_cfg_tgt"]; +// Duration of the "animation" +private _duration = getNumber (_cfg_tgt>> Q(ADDON) >> "duration"); + +// Animation/Gestures +[ _unit, getText (_cfg_tgt >> Q(ADDON) >> "gesture") ] call ace_common_fnc_doGesture; -[ _player, getText (_cfg_tgt >> Q(ADDON) >> "gesture") ] call ace_common_fnc_doGesture; -private _typeNumber = getNumber (_cfg_origin >> "ItemInfo" >> "type"); // Remove / Add Missing/Surplus Items. [_cfg_origin, _cfg_tgt] call FUNC(compare_components) params ["_missing", "_surplus"]; -systemChat format ["%1 - %2", _missing, _surplus]; +{ [_unit, _x, true] call CBA_fnc_addItem; } forEach _surplus; +{ [_unit, _x] call CBA_fnc_removeItem; } forEach _missing; +if (_sound != "") then { [ CBA_fnc_globalEvent, [QGVAR(EH_say3d), [_unit, _sound]], _sound_timing * _duration ] call CBA_fnc_waitAndExecute; }; +// Replace the Main Item. private _additionalParams = ""; - -private _replaceCode = switch ( _typeNumber ) do { +private _replaceCode = switch ( getNumber (_cfg_origin >> "ItemInfo" >> "type") ) do { case TYPE_GOGGLE: { FUNC(replace_facewear) }; case TYPE_HEADGEAR: { FUNC(replace_headgear) }; case TYPE_UNIFORM: { _additionalParams = "UNIFORM"; FUNC(replace_uniform) }; case TYPE_VEST: { _additionalParams = "VEST"; FUNC(replace_uniform) }; case TYPE_BACKPACK: { _additionalParams = "BACKPACK"; FUNC(replace_uniform) }; }; +[ _replaceCode, [_unit, _cfg_origin, _cfg_tgt, _additionalParams ], _duration * 1.0 ] call CBA_fnc_waitAndExecute; + -private _duration = getNumber (_cfg_tgt>> Q(ADDON) >> "duration"); // Plays Random Sound At the Beginning -private _sound = [_cfg_tgt >> Q(ADDON) >> "sound"] call FUNC(getCfgDataRandom); private _sound_timing = getNumber (_cfg_tgt>> Q(ADDON) >> "sound_timing") max 0 min 1; +private _sound = [_cfg_tgt >> Q(ADDON) >> "sound"] call FUNC(getCfgDataRandom); -private _params_soundEnd = false; - -if (_sound != "") then { - if (_sound_timing < 1) then { - [ - CBA_fnc_globalEvent , - [QGVAR(EH_say3d), [_player, _sound]], - _sound_timing * _duration - ] call CBA_fnc_waitAndExecute; - } else { - _params_soundEnd = [ QGVAR(EH_say3d), [ _player, _sound] ]; - }; -}; - +// Notification private _notify_img = getText (_cfg_tgt >> "picture"); if !(".paa" in _notify_img) then { _notify_img = [_notify_img,"paa"] joinString "." }; +[ CBA_fnc_notify, [[ _notify_img, 4], [getText (_cfg_tgt >> "displayName")], true ], _duration * 1.2 ] call CBA_fnc_waitAndExecute; -private _params_notify = [[ _notify_img, 4], [getText (_cfg_tgt >> "displayName")], true ]; -private _params_replace = [_player, _cfg_origin, _cfg_tgt, _additionalParams ]; - - -// Im considering removing the progressbar tbh. just causes alot of issues without a real need for it. - -if ( _duration > 1 ) then { - - [ - _duration // * 0: Total Time (in game "time" seconds) - ,[_replaceCode, _params_replace, _params_soundEnd, _params_notify] // * 1: Arguments, passed to condition, fail and finish - // * 2: On Finish: Code called or STRING raised as event. - ,{ - params ["_args", "_elapsedTime", "_totalTime", "_errorCode"]; - _args params ["_replaceCode", "_params_replace", "_params_soundEnd", "_params_notify"]; - - _params_replace call _replaceCode; - _params_notify call CBA_fnc_notify; - if (_params_soundEnd isNotEqualTo false) then { _params_soundEnd call CBA_fnc_globalEvent; }; - } - // * 3: On Failure: Code called or STRING raised as event. - ,{} - ,"" // * 4: Localized Title (default: "") - ] call ace_common_fnc_progressBar; - -} else { - - [ _replaceCode, _params_replace, _duration * 1.0 ] call CBA_fnc_waitAndExecute; - [ CBA_fnc_notify, _params_notify, _duration * 1.2 ] call CBA_fnc_waitAndExecute; - if (_params_soundEnd isNotEqualTo false) then { [ CBA_fnc_globalEvent, _params_soundEnd, _duration * 1.0 ] call CBA_fnc_waitAndExecute; }; -}; \ No newline at end of file From 094c3219d5492f9fc7d393d19dd04d5a3990c422 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 29 Dec 2024 23:18:29 +0100 Subject: [PATCH 019/305] wip contextmenu --- addons/wardrobe/XEH/XEH_preInit.sqf | 20 ++- .../action/fn_addActions_condition.sqf | 2 +- .../contextMenu/fn_enable_contextMenu.sqf | 123 ++++++++++++++++++ addons/wardrobe/stringtable.xml | 22 +++- 4 files changed, 156 insertions(+), 11 deletions(-) create mode 100644 addons/wardrobe/functions/contextMenu/fn_enable_contextMenu.sqf diff --git a/addons/wardrobe/XEH/XEH_preInit.sqf b/addons/wardrobe/XEH/XEH_preInit.sqf index 8e8bcd2b3e1..b5114ea8e5f 100644 --- a/addons/wardrobe/XEH/XEH_preInit.sqf +++ b/addons/wardrobe/XEH/XEH_preInit.sqf @@ -7,7 +7,7 @@ here, you put in your CBA Settings so they are available in the editor! https://github.com/CBATeam/CBA_A3/wiki/CBA-Settings-System#create-a-custom-setting-for-mission-or-mod MACROS Used: -SETLSTRING(test) -> [LSTRING(set_test), LSTRING(set_test_desc)] +SETLSTRING(test) -> [LSTRING(set_test), LSTRING(set_test_desc)] -> STR_prefix_component_set_test // STR_prefix_component_set_test_desc SET(test) -> ADDON_set_test QSET(test) -> "ADDON_set_test" */ @@ -27,9 +27,9 @@ QSET(test) -> "ADDON_set_test" */ [ - QSET(enable), // _setting - Unique setting name. Matches resulting variable name + QSET(enable_action), // _setting - Unique setting name. Matches resulting variable name "CHECKBOX", // _settingType - Type of setting. Can be "CHECKBOX", "EDITBOX", "LIST", "SLIDER" or "COLOR" - SETLSTRING(enable), + SETLSTRING(enable_action), // _title - Display name or display name + tooltip (optional, default: same as setting name) [LSTRING(set_cat_main)], // _category - Category for the settings menu + optional sub-category true, // _valueInfo - Extra properties of the setting depending of _settingType. See examples below @@ -37,3 +37,17 @@ QSET(test) -> "ADDON_set_test" {}, // _script - Script to execute when setting is changed. (optional) false // _needRestart - Setting will be marked as needing mission restart after being changed. (optional, default false) ] call CBA_fnc_addSetting; + +/* - I dont think there's going to be a way to make this work propperly. +[ + QSET(enable_contextMenu), // _setting - Unique setting name. Matches resulting variable name + "CHECKBOX", // _settingType - Type of setting. Can be "CHECKBOX", "EDITBOX", "LIST", "SLIDER" or "COLOR" + SETLSTRING(enable_contextMenu), + // _title - Display name or display name + tooltip (optional, default: same as setting name) + [LSTRING(set_cat_main)], // _category - Category for the settings menu + optional sub-category + true, // _valueInfo - Extra properties of the setting depending of _settingType. See examples below + 1, // _isGlobal - 1: all clients share the same setting, 2: setting can't be overwritten (optional, default: 0) + {}, // _script - Script to execute when setting is changed. (optional) + true // _needRestart - Setting will be marked as needing mission restart after being changed. (optional, default false) +] call CBA_fnc_addSetting; +*/ \ No newline at end of file diff --git a/addons/wardrobe/functions/action/fn_addActions_condition.sqf b/addons/wardrobe/functions/action/fn_addActions_condition.sqf index d522e6f1a4a..36d8a7996d1 100644 --- a/addons/wardrobe/functions/action/fn_addActions_condition.sqf +++ b/addons/wardrobe/functions/action/fn_addActions_condition.sqf @@ -17,7 +17,7 @@ params ["_player"]; -missionNamespace getVariable [QSET(enable), false] +missionNamespace getVariable [QSET(enable_action), false] && { count ([_player] call FUNC(getItems_modifiable_current)) > 0 diff --git a/addons/wardrobe/functions/contextMenu/fn_enable_contextMenu.sqf b/addons/wardrobe/functions/contextMenu/fn_enable_contextMenu.sqf new file mode 100644 index 00000000000..4374d3f8d93 --- /dev/null +++ b/addons/wardrobe/functions/contextMenu/fn_enable_contextMenu.sqf @@ -0,0 +1,123 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* Function to activate the Wardrobe related CBA Context Menu Options +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + + +params ["_enable", true, [true]]; + + +if (missionNamespace getVariable [QGVAR(contextmenu_enabled), false]) then { + missionNamespace setVariable [QGVAR(contextmenu_enabled), true]; + + +}; + + +/* +Description: + Adds context menu option to inventory display. + +Parameters: + _item - Item classname + Can be base class. + + Can be item type as reported by BIS_fnc_itemType: + ["Equipment","Headgear"] + -> + "#Equipment" and/or "##Headgear" + + Wildcard: + #All + + _slots - Relevant slots + Values: + CLOTHES + UNIFORM + VEST + BACKPACK + HEADGEAR + GOGGLES + + _displayName String keys are automatically translated. + 0: _displayName - Option display name + 1: _tooltip - Option tooltip + + _color - Option text color. Default alpha is 1. + (default: [] = default color) + + _icon - Path to icon. (default: "" = no icon) + + _condition + 0: _conditionEnable - Menu option is enabled and executed only if this + condition reports 'true' (default: {true}) + 1: _conditionShow - Menu option is shown only if this condition + reports 'true'. (optional, default: {true}) + + - Passed arguments: + params ["_unit", "_container", "_item", "_slot", "_params"]; + + _statement - Option statement (default: {}) + Return true to keep context menu opened. + + - Passed arguments: + params ["_unit", "_container", "_item", "_slot", "_params"]; + + _consume - Remove the item before executing the statement + code. (default: false) + + - This does NOT work for the following slots: + GROUND + CARGO + + _params - Arguments passed as '_this select 4' to condition and + statement (optional, default: []) + +Returns: + Nothing/Undefined. + +Examples: + (begin example) + ["#All", "ALL", ">DEBUG ACTION<", nil, nil, {true}, { + params ["_unit", "_container", "_item", "_slot", "_params"]; + systemChat str [name _unit, typeOf _container, _item, _slot, _params]; + true + }, false, [0,1,2]] call CBA_fnc_addItemContextMenuOption; + (end) +*/ + + + +/* + +To make this work i would need to add a Menu Option for each individual modfifiable item AND its potential variants. + +The most efficient variant i can think of would be following. +1. Event Handler for when the inventory gets open. +2. Get Current Modifiable Items. +3. Check if they are already established (GVAR(contextMenu_hashmap) classname, config) +4. For every new modifiable Item, create a ContextMenuOption for each of its variant +- could make an event handler, everytime the inventory gets opened, it scans the wearables, if they are modifiable, (and not already established) adds the option for those items + +*/ + +/* + [ + "#ALL", + "CLOTHES", + ] call CBA_fnc_addItemContextMenuOption; + + +*/ \ No newline at end of file diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml index 92822bb6a0d..c7d598c0c33 100644 --- a/addons/wardrobe/stringtable.xml +++ b/addons/wardrobe/stringtable.xml @@ -9,13 +9,21 @@ - - Enable - Enable - Aktivieren + + Enable ACE Interaction + Enable ACE Interaction + Aktivieren ACE Interaction - - When Enabled, will let the player use the Wardrobe actions. + + When Enabled, will let the player use the Wardrobe related Ace Interactions. + + + Enable CBA Context Menu + Enable + Aktiviere CBA Context Menu + + + When Enabled, will let the player use the Wardrobe related CBA Context Menu Options.<br/>Can be enabled at any time, but requires restart to disable. @@ -58,4 +66,4 @@ - + \ No newline at end of file From dc5ae607e78bf73c3a2fa0a13fa752321ede9bd3 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 30 Dec 2024 13:12:38 +0100 Subject: [PATCH 020/305] fix sound --- addons/wardrobe/functions/replace/fn_replace.sqf | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/addons/wardrobe/functions/replace/fn_replace.sqf b/addons/wardrobe/functions/replace/fn_replace.sqf index c17a0cbc70c..4eb39fa441a 100644 --- a/addons/wardrobe/functions/replace/fn_replace.sqf +++ b/addons/wardrobe/functions/replace/fn_replace.sqf @@ -25,12 +25,11 @@ private _duration = getNumber (_cfg_tgt>> Q(ADDON) >> "duration"); [ _unit, getText (_cfg_tgt >> Q(ADDON) >> "gesture") ] call ace_common_fnc_doGesture; - // Remove / Add Missing/Surplus Items. [_cfg_origin, _cfg_tgt] call FUNC(compare_components) params ["_missing", "_surplus"]; { [_unit, _x, true] call CBA_fnc_addItem; } forEach _surplus; { [_unit, _x] call CBA_fnc_removeItem; } forEach _missing; -if (_sound != "") then { [ CBA_fnc_globalEvent, [QGVAR(EH_say3d), [_unit, _sound]], _sound_timing * _duration ] call CBA_fnc_waitAndExecute; }; + // Replace the Main Item. private _additionalParams = ""; @@ -47,6 +46,8 @@ private _replaceCode = switch ( getNumber (_cfg_origin >> "ItemInfo" >> "type") // Plays Random Sound At the Beginning private _sound_timing = getNumber (_cfg_tgt>> Q(ADDON) >> "sound_timing") max 0 min 1; private _sound = [_cfg_tgt >> Q(ADDON) >> "sound"] call FUNC(getCfgDataRandom); +if (_sound != "") then { [ CBA_fnc_globalEvent, [QGVAR(EH_say3d), [_unit, _sound]], _sound_timing * _duration ] call CBA_fnc_waitAndExecute; }; + // Notification private _notify_img = getText (_cfg_tgt >> "picture"); From 1e28081c2cb6483fa2ff82f8282bfb1ecf654178 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 30 Dec 2024 13:13:03 +0100 Subject: [PATCH 021/305] added sounds --- addons/wardrobe/Baseclass.hpp | 9 ++++++--- addons/wardrobe/CfgSounds.hpp | 22 ++++++++++++++++++++++ addons/wardrobe/config.cpp | 2 ++ addons/wardrobe/data/attribution.md | 12 ++++++++++++ addons/wardrobe/data/fabric_06.ogg | Bin 0 -> 35534 bytes addons/wardrobe/data/fabric_07.ogg | Bin 0 -> 38708 bytes addons/wardrobe/data/fabric_16.ogg | Bin 0 -> 82265 bytes addons/wardrobe/data/fabric_20.ogg | Bin 0 -> 103913 bytes addons/wardrobe/data/fabric_25.ogg | Bin 0 -> 128550 bytes addons/wardrobe/data/helmet_visor_05.ogg | Bin 0 -> 29143 bytes 10 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 addons/wardrobe/CfgSounds.hpp create mode 100644 addons/wardrobe/data/attribution.md create mode 100644 addons/wardrobe/data/fabric_06.ogg create mode 100644 addons/wardrobe/data/fabric_07.ogg create mode 100644 addons/wardrobe/data/fabric_16.ogg create mode 100644 addons/wardrobe/data/fabric_20.ogg create mode 100644 addons/wardrobe/data/fabric_25.ogg create mode 100644 addons/wardrobe/data/helmet_visor_05.ogg diff --git a/addons/wardrobe/Baseclass.hpp b/addons/wardrobe/Baseclass.hpp index 9de6f596783..bc8dba5dd6c 100644 --- a/addons/wardrobe/Baseclass.hpp +++ b/addons/wardrobe/Baseclass.hpp @@ -1,3 +1,5 @@ + + class GVAR(base) { modifiableTo[] = {""}; @@ -7,7 +9,8 @@ class GVAR(base) components[] = {}; // Supports Multiple Sounds, will pick one by random. - sound[] = {"click"}; // I need a better default Sound + #define SOUND(base,dur) Q(TRIPLES(ADDON,base,dur)) + sound[] = {SOUND(fabric,06),SOUND(fabric,07),SOUND(fabric,16),SOUND(fabric,20),SOUND(fabric,25)}; sound_timing = 0; // [0..1] 0 at the start of the action, 0.5 half way during the duration of the action - always, if completed or not. 1 at the end, only when completed. // Gesture @@ -35,5 +38,5 @@ class GVAR(base_U_jacket_closed) : GVAR(base) { alternativeDisplayName = CSTRING // Common Base Class for Helmets with a Visor that can be flipped up or down -class GVAR(base_H_visor_up) : GVAR(base) { duration = 0.3; gesture ="gestureNod"; sound[] = {"click"}; sound_timing = 1; alternativeDisplayName = CSTRING(visorUp); }; -class GVAR(base_H_visor_down) : GVAR(base) { duration = 0.3; gesture ="gestureNod"; sound[] = {"click"}; sound_timing = 1; alternativeDisplayName = CSTRING(visorDown); }; \ No newline at end of file +class GVAR(base_H_visor_up) : GVAR(base) { duration = 0.5; gesture ="gestureNod"; sound[] = {SOUND(helmet_visor,05)}; sound_timing = 0; alternativeDisplayName = CSTRING(visorUp); }; +class GVAR(base_H_visor_down) : GVAR(base) { duration = 0.5; gesture ="gestureNod"; sound[] = {SOUND(helmet_visor,05)}; sound_timing = 0; alternativeDisplayName = CSTRING(visorDown); }; \ No newline at end of file diff --git a/addons/wardrobe/CfgSounds.hpp b/addons/wardrobe/CfgSounds.hpp new file mode 100644 index 00000000000..d66fcd44e2a --- /dev/null +++ b/addons/wardrobe/CfgSounds.hpp @@ -0,0 +1,22 @@ +#define SOUND(var1,dur)\ +class GVAR(DOUBLES(var1,dur))\ +{\ + name = Q(var1 dur);\ + sound[] = { QPATHTOF(data\DOUBLES(var1,dur)##.ogg), 1, 1, 100 };\ + titles[] = { 0, "" };\ + forceTitles = 0;\ + titlesStructured = 0;\ +}; + + +class CfgSounds +{ + sounds[] = {}; // OFP required it filled, now it can be empty or absent depending on the game's version + SOUND(fabric,06) + SOUND(fabric,07) + SOUND(fabric,16) + SOUND(fabric,20) + SOUND(fabric,25) + + SOUND(helmet_visor,05) +}; \ No newline at end of file diff --git a/addons/wardrobe/config.cpp b/addons/wardrobe/config.cpp index 38a159cf24d..2d8e69b6998 100644 --- a/addons/wardrobe/config.cpp +++ b/addons/wardrobe/config.cpp @@ -31,3 +31,5 @@ class CfgWeapons { #include "compat_vanilla\Uniforms.hpp" }; + +#include "CfgSounds.hpp" diff --git a/addons/wardrobe/data/attribution.md b/addons/wardrobe/data/attribution.md new file mode 100644 index 00000000000..ffd4622c6b6 --- /dev/null +++ b/addons/wardrobe/data/attribution.md @@ -0,0 +1,12 @@ +fabric_06, fabric_07, fabric_16, fabric_20, fabric_25 +Nylon Jacket or Raincoat +by IENBA +https://freesound.org/s/658410/ +License: Creative Commons 0 + +helmet_visor_05 + +Click of a Motorcycle Helmet Visor + by rylandbrooks + https://freesound.org/s/328103/ + License: Creative Commons 0 \ No newline at end of file diff --git a/addons/wardrobe/data/fabric_06.ogg b/addons/wardrobe/data/fabric_06.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e83564286983024e0dd896121aeb0b571aec2a2b GIT binary patch literal 35534 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 YmUXp<`SQo&qHwzzNLNF;dQ=uM0D;vlU;qFB literal 0 HcmV?d00001 diff --git a/addons/wardrobe/data/fabric_07.ogg b/addons/wardrobe/data/fabric_07.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5a26d62a9fa78648367f1fcd2bc8eb0855392a09 GIT binary patch literal 38708 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 literal 0 HcmV?d00001 diff --git a/addons/wardrobe/data/fabric_16.ogg b/addons/wardrobe/data/fabric_16.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ce46a5e5376ee122cd513d2b94578a4337cf1704 GIT binary patch literal 82265 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ξ>;w<8*ckafPM1rlWoIoRyu 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 E09nk_IsgCw literal 0 HcmV?d00001 diff --git a/addons/wardrobe/data/fabric_20.ogg b/addons/wardrobe/data/fabric_20.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e9e43cd28cee132ed1f275fe40c7337eb568775c GIT binary patch literal 103913 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

WFr9qE&CwBN9*)fn!G_`Rr_k5C}n? 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≪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
iM#`PU7OmVpF%kJ^xp&A?I!s zj)pjY_^Tz{peF>SwEtEyFa_%IGp3B^y{xztFfCCP9gKoI@(u~8bG&Zl zCY*%@(nf1gGEnJ6tL*MXDinZu;!=y1aZwc$wh&dfEb&ve$g7=GEv%^&Np`Ws08y3} zdN+8WA^sE8fCrdxVZf}+X?_`5{$2xkdMem@?DiaW#M4P8T~6c8Xai}U^DKJxqp~#8 zaW#Ccc5pklbG`oPUoU)vQ$5K*N0=YsvHT<#R@xk*ws@}=@0i{A=1KCtM!lnG_lnh= zZCHD+O;Beu(dXF-W7K=K8Mnpmggb+}8||KJ8R1P64Z1=ijGp7Ee0&UKdr8{^uTYMa z5_hWVL87Cjze!!tIi5eUF%wb7AL&# zud2GP-^`}$K!MMe!$vTb;F;*y;tQ+hx(kWOr}9AoXX3fzJ3oDYbpc-NWnTaHCe)28 zlp2_B6Un)}x4h%&4u&1s_5GpUx9weSupxX0GQRNfb!`N7sA#X1iF6)2bCc9`g#W)WYN;a|Oqa3AT%A^rmyiQgXA)+znsKkLAFi zm?FuHx*sXuQ*|%y*cv^772b|KJ9qW>t%~5!A8&eS1!wT+qJ*5_%J@u6r44#y;nT%P z?2=7XcwGubW@v9{wJYM%Q0#u=#L?xZcfP9L+h^Y2JvwyiETPG!VsCs|!DPI#gQ{1b zF)(>_5UT%sjMete(Y$2nL)*yO+?h2veGDw+H7Sp zrllC@rKnH$HH-}sy19d)(C@hp=VIT{(Kxy&l z9fCi zPIjm41SeRdyByu1$7;Sf5i0CkyJArK)KJ0u`RQ z*=Y?V;H0JNd9|k4)_X=C!I(U))bjFb$_T#&1BO5g+%+ntK3Um20H*a8ES&DN6^Os|v#4 zkX3#(Syn(=&=qUYfR~e2#D%!l!DK>BqqHTG)cClniUhkPGeE@QoM(X`^q}QjmIUwl zPsVl96s1AwG|?&&ect5;1juJNM3lL>Sefbr<9=;?I4{xqe$}?MaFCkX7)b-Pp@%OE(Y0DK&PK)07;jAkk-?c7Wg+(?^XGJO6 zsV|@}tfPFV*F9h{7B47!(H~NaZ!xaNI(xE5f8q|BdeTCbsGW(|-c-rl|u_>s2_EsM2M5<>6}0 zy~`E>0@yz*p;lm z24hD)Vp;52Zx$%+SdqN^V%xKxH%VfPPaJYG(CJkm(;Ta$jIpIJiDd#Lx0rm1f^2=n ztxxBl5l@}=gCClGk9Q-4L1oL8V%8*O0u;4Tfp5^+O0J6Fx_fZ@Osi@ofasG=-K^na zM_tqCmt`rkApo0RZL|e~gyL-;?K&9@07lIZScX;>>P?!i2U^zh){dw|r5sv?q(y+A zC=7y;&2!*00|>fr(Hv_P5e2-_gDO+W28>Y`SE_g-Tmc3NbOXTQF|kXfFJ*kHig56Sh+iA$PMs;(jlz>g;}P^#8q<>+pFv z=1)fKk&KV!AIlb>Y@t0SHC}|x#jubc?Hd<9YMr%V9539uNb@e6%GbSHb1IA+&gyO& zGjE(dFN1c`S!tWw_?cQDsiRZ1w=GAWBp$feMphPUv}>jDv>+KhK35hLgWvD}Z3{Pi z0Wu9+`1Rti>@*JM+W0dQxkqY&Gs6~~c9~%>ri?x>*&c#;ZL;e-+w8}|A4^_)j@5_< z5s9uU1%(O!v_BM<-o4z1%D}oK`)Eykc%Nvy$%_*~>pu0={7S_|*)}uk64o&tPLRe8 zWa~9DHOUR0WA6H4I@6MJ+J&7=IJ>qYJ9ovRg*?5LqT^lK!Z(*@T$(HiskB0{{e8pRn z*rZN2pAT;yB``pur}@dW#rKl*jP$I;3ZQ^wy)T)chdNM8QP%iEug7155MG#;SZ=X% z#YynjZ{Ee%vd)q|ey%O`)a-qAFSB4WxUD@%y8pt+iw^Xc)~3ImCuCDZR{Y0&9)(AN z4r4^LA7c3b%7pWa<}F5!JtoJ6Jr?_+xqjY3$>4kZw&+lBXI{$u2GW~(rfg~&XsE#r za`8(6*g1ifGUJ}yRhqr^v8>?iM$Hv<5cpVg#8Cn6F`zsMP)BIF> z>WS1@#(q->j5xQWd6=BiZ+bW~Gfoa${X~H%q%=A?7F^pBaTk{p`ubPn2#_J~I``B6 z-xy&zX^W|=b)ACZ01p)^SvU~rDIV&vAvx>_fobVJ&66M-UwqP=g&wyJp+J`0IY4+gaN&f`4oq`8J>P1 z8;(kn|2E7cpu+_u%9K<-6h{k@{1WRzVEe!6eHP&-0;PSUGaym1gyVdcG zxN^130omQu+NQJbnyiq`h`n(VT+lsO>-qYxBS&WnizG$I^-m>KH^iPeO&ljFMEFkC zJ)q^dKig>#=LrN%PC3Z^)g~5`-#hw?hqQwSuG}Bnb{od`3@*cpN<4KucG@n!rR{2P z)np>z(r9edlmYJP*d)y#*K(0ERW^TOb{^b5&Rt%gSWa%I#&w z_pkGnUXCV@p~edpc%RO|L+FJ7>@13R=ARf^juMY%PS6^38WzAU8K!h)vXoXMSz4Rg z#ju2{X*MuN^uVs(&~sv)bT)}^Pn#+{Oo$rJM$daUA7e9P(yl+j==U+s^8A)qohn)-OMWQ1N|UNZ<6ZW->M&uK65PRdg4)cKFf?Ws z3d4voo1|RRS6yaLP_@F}Ej8>64yv;{e<7HjpjJPg;(&eo+>la7b}6s4dCbpn9-Ln9 zXXxz0ArW{NhmRvm@F;LAgQ}G^>@VLv8ETs0w*mv>K-RF?x@Tn(>%F}WLI42IXgKvU z^lw(KcgwIWo#Fl5?o(BE#(!KSy%%g1-nIPHcwtQ#2vYVB3(7LnzqSy5 zX{5la|6|?kq4(QwVg;fY&*N_$t$BDi@~~<1nC~YS-=o!ELQh?s~u!xLrl!cOUf^^?&d!fNTQzii#5OyZSVXwyDgig5c%}^r&mrhZ;XE|1V|iS(Y%|| z6XJ8Xwz$4>&LFVTaqiHz3GMRdhx6jOF-Hv3zTf_l@19uXXi695p`})R&q(_f$zt8| zDVI@{R?7BgCbjST$ti^TgMcTe1tw49Wk{keZ!a`(?q{P#V5_(nz$m+!>AkW|qY1O1&5Nh2$&U#0sc zKZ=IfybnghA$nTm#(PVD?-PlioU@^~RK9-}iH-diMgabCgKIN>`HRrpNG6-uV6D8` z5(^35obBn$cmcrx<2({L>4PP*A$VwFY$W_T#A&XN1PBYDJl#@Ho0FX@0`x zLd)mu`I4B1oo*d|jahSVJl#8cWXRXSHmbGwDo9P~!UVD}J5<^RkgLcqY~x3*mSasv zR;0TD-n4uS`~T@i|NLKoD9sBHD{$y@|JyeG&vz#BUvT)pxAGHIeNnL_P$25TE75Ev zFn}tsg2hyV6t%Yv-W}4p2aM^F& zG-szfiqsC3X3Y!x*FZbYpPc`Zv2h=iE*>amfA{%9RjOyYcU0Eju4q4=o)g4q`A? zLnoV8Gn>#(nfY!ZIuM&lw|XwAFdm61^2OIRt{l?&m_@vEuL6(2a@V9 zH_(wr(&E*J=dlneFC{m(H9&m29-KsXNb`rC0zK9{Ek8yNlO=W1hg!r^e4JZZt0)MF zmkaRZ%mnBAVKABWFkJd7AINaNMKm4?8=$hxU^1PY>i_)c{)+Jf!H9TEFvMEE)R`F~ zt4?DuJ)^NT*9|v^vSxMxL&twAqX3{AevOz*+s2aL0->8`(Lwcyb*4=OHB{Hs2&^YELc0=Vs) z!*krxeWf4uE5{|rw6`n^^~+VyX}RYH-H$aN_5FGG)`|1yd*yzf&(fF*pqi+~J{$kY zaQ>OMxQ{)!|IhjFZ&!T;mt>5r>J2CQarXCsnh#PK3;$YSECFTcyM9dtoV#Mde+yMYj~$r}-yjFJva^Y#s_n zU%UPH$8DMK7cS=3J^nX0 zm2s5FXWR4_aK&+EOm8)47U&p*UxZRdgX|8e0|liB{CJ^)NnXcLJETlXWmG(^owx-O z1r(?zIjAt=@PjoRe=|!-OtPKEmOVfsL(Ga=hW?L-gmz)5DrnLw>ho09Ar5|$nhZXM zqYF3%$PY;br}1ts5=Z^qG==r+6LVCR@x+1>Q9gRUqI0T<XfN1dNvlzg+L)A^;R%@;C*+-x~#>ymL{it&NZPS#@tAcj6Fn+wenK z=dGPv`CrD`*KIRBdyapb811j(@QBdfN^Bt^&pRCq^+xMQrEOk39wLjVOlv^b8JB8Hu-H}P z@72m=a+-2_nBahB!1fXhA^-+iqd*o&2{PNy6L+7*P$n@*p0mNk_vYO#&M4 ztN3xVz(yVrc}eSBZDEaa_@kp^Bqztm#Sex|zjuCm{_CxMstVHX!%W$2XYC^$J{xBP zKcDnly}-PWsJ?LZm0{9FhhH_i`Z+h87Bwh^9)=HLC$~=gxP88;t0+YXqw`Mqarud^ zGXQh%k|SKhuJMSA;jaK+k9L^yMHny@9DQ6)razSjy}b#1@~ZaB=Yvse!oiIm$l?4m z+1ls74@f#@%@bPML9*li<&fso3w=JTw|u4!AB}YY|D`;&EFk`K71M&}*q$+b)kpf) z+;}k$F5A1RP=M&p#64T*N*36yf=!y=8n zK@jv;E)VmbcRm5`+8A+Q&mJ);GjPkCWjGcW4F5Y)LlVkuNq1;djpnB22x#TDvu@Gc zH^~N;V8_x_P*HH=m@wm)>p$ybHKszJW2qK>uKeK9mSZSAkf7YAu8_4p{mn!Ydel@g z#2%P|ZpaXTpoPs)yvu-sVV?dxZ*){-Etkf3fNlTMq*9p&*8Ow>M!>(+km&%StI}4b$^5 zL)-G8mOG)8MwtT(oBOZt9Ex_bw=QXdnND|_rSl$z!p!%OfF*9>y&$p4f}ln?^{7o@ zb*RewCi}GbyB$hRx}9MXp2@DG;I2lZ03Dq8cqM!e`1%36)=3Vb-rc(ZT@ynO4YFXa zXdui|r=Q?h8tl)$6673VcnUbXRzltKqi-?u2hoCcWAfFQH*QP^mx znaI=9xFi+Uq4zrF}l1!9d&WwOZ+2o(d+9==Oy^hoBbEQ z+^l%FSM40GX2m(5P#nG+#q?!-zxU6d z3(~s(W~w?KmM9{tKlHCDmf=_of7fI02}RmI#_3^i}!hd+|9dYaDQ61{ecHs1{(C&e41-bNb^%sgFZ7B;e)r}fKguW}0 zOsA&Y1KN0zqX&kUYcoNfUq!P*uActz$gX~%rRNfVneL(I|6c&32weBx9o*j{Is=aj zse7rNK2`x0sn0FNW?a{pvvHbJu+F7H`H{kWUN{1g1S5AvOCU||R151SCM%Ul0OwrrF(l&!8F21EGyo34sJajgYzPUA zG3J1vQ;?d#3~n4iW0Isw#T6u*WU!FVU;@yPiY?J7OvGf8h=DN$QAs+5N}&S=MOIuM}I>Zp1Y=);hbg(TJxLsvqh zG8C0TBng_T6bwi(vrs@%KuRViDL^1dVn{_uA`WxugaSr=AEI7Y2mqFa^FW3`02pQA z5?}!YfYDVMVZ?~Ro>%691M8sgF}P`taV^5mfhL}QSm5KCwmFU8I>BMakK zTm5~xgmqJkii#$&X!T?;Fx?o#jqx!h-!kI)HSv58?pW8eAAQEJO8XH$V_mTyfFD&2 zdw);uT|Y|KEd2+S_U(A#QOzEn9_4dJ%!-sQ{{A3E6}!<+4u!)jBQM6;w+?UEX6aw4 zRHIYHOmU2n{;=P!HW+rBynZM)Ei3k;`Jh^TWTboa+NNp2rq<0foRI-A)vBuLUzP(D zp{DWf^S-=!v&JZSzUeD9EtXM!hf+1nLQpFsG7SE0sGoScN{e~EyR2DfF^$saY3Fi9 zR7BfE6|*hIi}-65LF^TqYL2p+YE=!xR6s`4ANmpp zYv3^D9W1h_tu*3VO%cm#`Sok3hUr>(AHyug6x3=WRy9mDL@gL%B8C|9rXi?cU_lj3 zQBzT?SX2c}%Ub7Px0xaaVznApv4D-$P(#Hqv7qL%TdX!i#9}wZaAGwLQxP=)QL&1Z zQS7Q>8fs!-s8tNRVTw9Baq4KAhE>KUP7O80u$y3lDHcq_z-||;BBr%rW;YS50j2>q zHB6*~T`|NI15r#l?6SQY2TX|6WfytZYT0ZcDMJBZM3XZ{`yW4&kEDLjd|yQiPtG%Y z+b;d~wwRg>o;CqJ-&^L!}{9Cd@3utE4f`Pc6v2lv7Uo}PtH)E(mVMawp3h=Y=HYa;q8Fj z=E4n39XAHP_ypjh7P7y%*joY~UzR>_`M#-x?PG8KbylZ?ZzY>w=C{}EWOl^!4}|;XG=k_Lpa%^-miR<(i(k&{B+C&_Xg zSN*ihmqP*MBH|lY5e-UQ5>Icaje=-E;;LMV=GhJsIi-3?DgsxC!ysx@>ms?agq}py zBqo7G5e&QsRAx;wCm8ck88QxnS#kmv2_zXgCFTq9q?2F+$)FHSx|4zsjlc*I7~{YT z0C8j-5R)MV5hDgoiAXwT(rK8LLLulh2BHu&5(uEsNGfJvI+I4DG8qgyfhi==7*rBr zj1Yy%Kun-h=rlS>FfjuICTI)_sh?E!WtF8y)mPPl$`ZP))ko1IbpWX-#4166NdW+2 zlF-xu0|WpP1Y!s@)g4N&@AbVN2zmfdXJ=CY1YLXq000000P70?02crN06B>^hXkIS zzq?f3Frony3NN>AMlev|4qvw3^7NV)4vf6{&YI)unpXR!s$Qn3m}y8gEb*Vk>fNHm zUAuNEyJB%y!fMo%F;!Pf7wv$v85X-B7Qqw{!)_X(KY$3<-;SlbmB-`?1-Ny_hw+37 z8A6vyF{>o$P2?70C322}Yxmx3y<-4lb9x(@hj>WNfg_NT=Zr8`kW|1727wR_0GL&f zWVD6=Y}Eh+$aDnSs~Um;snfysywva3d7&I#L=Ayl-!7KIv^vzbboG^9F6Ww+QP`YH zIAy8+8agc&!w?gzX*b1irYVY8lmoN585RW@EP14RYvM+9=9WBe0NZ`1lb161tVpD- zMuaNwE_eCvUat2o>qNS44!J`TmBH$9&P#@q6*Y`#KpMgWxhMpUMv$07ArMK`5Gh%HR5G`;lwg zSM_DLZ%cisY1-jhHzDi5C|{`IT!GBr<{VW9fSz;4gL6bhUmg8OuSTCp1-cwe&`f9oHd>Gp5CQ>0Q3yRCf)o`SHA3hR5JHib0HFv< z0Kr1ghmIQIURb+ zFEkRlJ-(e_aI$j3Vh;Oz6VC+soYdA6-hPBLF|)D5+nQoh1B-wH{mmaCpGpjvLH`cWwb)RcahPa1mQ-w3YjD+K^NK&+}@ zM&+^5ga;!R2C2>@PZft#+C|6lDO@N zn5;mCfzegDGeZj1#b<=nYRck;w1?mcSnai{Tsxz+n#v5Lb=8(h(;b>E)7Drt$JwXx zE}!SchzY}$;(sE+KXkysv6%A7_==heYFMWf z|A%xq7f_~Xn7@RqK*(0SFs$HCB-cX#-)%_Xf;k9ePNfyYpVSys)EZdVdTR8h#^_Dx zpDLgP@NAC;C<~%7{$Jjokni_@_r`%kYJf3_LGE*eC3_XOb+LNAPVO^VGkCWL)kBt9AIUE2I zMgK_gztJC2{#%Nxawuves<+0pM>V#i`rZknjiz2vGbkFAVhue|iql!kr4fyWmcew^ zLpOCg6=#j4|E*CVQ{lc@CVVn~l!RPxW&~LcYQ=vu?k}YWV)9e}?+<^Z75B>vG!DlrW`Se#&ID)={p z|J9su$-!*7;cO+Fn@YCR8sl5K$KUHtNnjjwZ5^dNr=+6T(teKmo@_loHr|gD?f0nF z&%Nyuq4ghy`CDzC&PM&0=4`77!Z2gWGKc4XX-=7H#tVZCMXMYoLXOJ${D2f%ZDHwJ zZH3VP(40U@bpfS1nX;0cp_-B(ltN?Pt_T@v-01kf`u}Lou`^1b2Q>$CM(Mvarwc7- z25Qqy4cqsB(|C9a1T+$}>%SQQ09{#7n?Li215T5J)8pVY@lJ>T&l&@ka&&Fkx*)K5 z03ZX(Pd|To8csZS#_e^tD+Mh;=X-@tl1#`?94s&$aj>iK5mI=Cs-89^r)AF*g$lJz z3GWU^rzu=L3@b5RRpJAuJs!XT0QjsBR!YNLhboSJ(0H(va!4%p<$2xo6|2%?@6YW4 ztUjFEW1D*@du2)&TzR-ez#wf}uAmNyHQ)kLmCo<6+B%d2Hn5dcpyV@B_B@cll&Vn7 z*}CPle8zbMn5FHbU>)?lX{D=$D(px+qn7DG$XDnr-A7YlJ9&axUzdD^QBdtQj_cUc z{3*KQx+xVwJ-V9XU{;0pZ}zZ*({@{|BmQ>dMo-k?DJOiz|H^`6vn=)Bt{g-|ieuP` zL2k5wzq5gVvN4QRCYFsatYG3iXOlK!Dr!5xu2LAxGk7oyu6>i(si>5SI&lo%kJc!} z;h3|*?E0T9a|d1u?-*Uk*wD6}r866MJd(2I;yE9Mko@7Sy4| ziSlf33}pVBb;$#>01(T?55xizBgPq*SQV7|aeWUEBBO4wANxc+Xw` z)Liel2|aZD&!gF>ZKLCVbKtxzX8_K5Fq3^UcxmrS!CiY|{}rfMbTYcXz+1=~sjN#e zK`K)POf74xs8*JmtcTjFNN~bZrnfk|jZ{@V#03{pXWW7t0HBGR9}GLn|IoDu01~or z+r|RM5;*{i$Usy{`lJ~i6T?x^E5(&mwSHK{goAY+G0kvAm2Qn5D2SlqK+9sx(7KkI zhF+EfC&X<-1Dq8>lS2gnYPz@pc$Y=?xS&P6kT5|IsDc0na)ThwY>-Cf!DbB*C=is< zaE;MFK;-%bfv9ieI6A$}0}w>U+8+ehJDfP%XyZBmg$ft&Oi%M2e`XbwmGLv4lb* z)h)HzaGwtn$%6Sr*bU%tB=o>?v121k+GiXzz&wIA2i$f5#(`k~aInccDlxaBxeH_$ z1UL@>SvU|tm=6|7-!{z{)NR}g9IZjzK|HHL+|kR$e+;*Xi9gnx;mRKq4qODcv*1d& zodvC_?Pj1+0@)Vu-5C9SFhR9#8b!e=1J+B80Etr06H*v}M{ZMr7XYD21jnff8h!!_ zRFKdqu!_JoWvR?0dr)@h58Wa)BXQPNwJcaA6_E&zvw;OG0jbRan}Ot|(W_?M($M-V zz8YX|@^gfIWQv|G_Z2?GcAhjCQv?Sj8qXsRj$7V!UFkZ5nc_MZZ9?9+xT z@PAlsillGT^G`jT^}i{w7f?9=NW-59T(|#i0m6W@7W}7$sHrNQD*jJBW$;Cy84b2A z->zJ~z1)N7ZAYTui@^R={}gO@0A|Ha{}gP$XgmA&+y11$DA6A5^xpziT}kX(8Yf0ruw_+<05sJ8kNAo*OA0tdhEa0OlQB zuQveB9{n)I#3oj&Z1A|=ENHY12<-I%x%oI^Td5PX&;zo;6Sslb#{&F7AFrZd?JcN! zdiy&bsF-EBLLCqb17a0`MB+^l1#sd6xSX5RZ?%vr+iP?0tR{5ri|q6F9ilspy)>Ux z)SDqH&y`C(e#Yyyz32hj0MJJmHykWhe_6$vBWXzCM8Ii1dI%bmK@&WD)XRND-0GU?;zr=!BNh&H87GeMKzQxFzP$fY#&G^rL9S}7JAP`VtK)1b=LLmR_ z>p|$Y-S)nIyYw&9Mo)YSUfqVPhD0n3Nx z+DD=ou++TfJCB%6xy5G1nCM&&Iie@qaZddMEY?gd52wXh+vmn#euKHQv@L#IqMtl=+lO^fl@gWv2I<|6A4T~v@Y6Y>%uSrZdY-a_TqYIB`A0O^=c{ha{ zmtAf>11mcIeRk94bqKN$xm+X;4O6sh4?Mo{b z9m^E-4cSVSCG<@Qw^vtO__N{!J{w_a@#Y|2qog`j$PYeXP}PG=?3oK-aKcYyfRfxg zs&}+0V#fd4Pm2&-M%~Y$Xg^h3i&)PMd!X-JNjqdN%xZZdw~EG~AVW zsFfJn9D4u#>i(quvkV31FW4`}m&A5w9UFObTuPfut-KcLqc;Kw8-Yj{XviBmc0466?hDM-={2Nv+D@vTEaf=p#NVqsey#jLY#U|=2aKHwHkMY(1UH0Fz zK1dz-Yvg?JlY^&kI9#X}lp2n&e5-#!nuFwj^+Amq%3<*%PkmIh*t}v_n=u=S3v)Rk zMOcnF5#?7IeY`{8khu`=?)q+N@9UqFD_RFqFux3MwRJc-HxC?iKR%2& zEnV+)$M0PY#2h?a?0eElIP3h&0474e_4D*MkC&*XC9Q@doa)AYedxy|buFf1!k$w_ z-B$jObgFXO+}^YbWn|c(nu}r*T0$^Oqor(dvn$}xm~O-X=ap}_|iGZ@*A0l8p@8Sl#2ri~WY(H42RLI5lNQ2;kr_`{c+)|9(9Ua{I)KAD-8y2{2M) z$C=RZhYi!`sm(XfL_a%!3A>_ifvKwRti+0fNpwkgOo5zqr9xEh2i?hw`TIVQfAghvVM4cME75M_z@ZVE<>O|<9h zLom8w@l^e0IAd;;LhRPnOzyWorU&EgLm5NsFsI1gMnqXkP*e*f%^N)v+Kpfez!;To z_0CeA2z@a_pg@3x$MpHr$m2v;r#^c#8J4>gwAbFz1nQ_EE#^?i^kxR8pbTZA-DK1Z z=BPOyysOY&YjO@?yxdp({o(@hWHUmj?0Ng>y4SA0wj_~`O#0pHCO1yY2o6}<)!)B6 zJmOud`n*l(Oki~@8}`M4+%o)hw^`b&n$$NVPk%8LKdzkp{^Zt6^#^#F4EJImPkte9 z|LL&zjZEg8Sf=2^LL0_J*8Ex+kP|K0zF` z^T^ll@|)(~`^vS!ZPrEf`|)=QH<^1L58mi#L+|Wee$r`m<>07d9$!&yyBvF>40q+h zNxK)N`>8r}Gu9aUswDl4&(k-pW8km3e$GC3PGL8H-T$ll_#F)Eq->{#;s)GbX3(y< z+99`Y4ry}*QabUgCTdxTl=5jq)w0zZk7AAyXUABkZ?UhL*PBkS8lJkte>=|#GcYHW zqv?OEouh+H4fyLM?S1_N|2vko0vR-5t7rPK?Ts>I4Ax-ZOscIoUM3lz*I^uUSmw+m>EjYNr(@!5-T7l^W0lTR1_iD z{~|@;go%U@%0wJ6JmVz-Lk$>|uRyc7U0!-Q8SVonY9)nwl#vvfG0S1mOdWTWb^uL_op97?38{^&}Ysu+z`gCb@WG-yH_J z;uyjfjbaxbxQsb}y&6F74Eg?*y-<|*tFBXwcc8uYZcxz+pBSIe1K#cEoJuhZ>lmxd zp)@}Ol{LkSPR;0Pb3LEeM5gSijTa*Y;z^lYr)9$l^u&M4Nsj*FqEJk0jTy9Q1xjy+il07$-k?;W5Hb^*<%lGKp;& z1=72GMsBo~)_#MlwC-U9%`<5gWLsB!pE>7)-~Q8e1r!B;@2hb{nlxUoA3=_HYdF@x z{MCv;kb?>sHAdmn8L;T)T@3HsN>Vjm6wmFzf{7qVUJiA(oF>X8=rMk5bL||~oRh*K z88pwy;l(-?NV_{LrHU3EG#JlgYsR}su#9NdL0SE}{uhxm2u7u+BsW`Bo#CyAMU_;< zdhZ7MT8vokwllgK1wEUhlHpvAG^DM@05=@oY?NmoWjw4p;AFq|X zlmx1rt*%l9uDgw${k)Z{!w=J47W&BBzrVeH$AK>=l#*tL9D|IW7{suvI`22Z)A!#O z`Lw)LFs|A2%4PADk@0w-j;U>%NY<%Gc@F8ry7$ zjVoeHuf~D|cU-o7ac4BfCiklI+xP9L2g=o^-xVWIZ0>w;zawm+?P=JU;p$S@zS^7x zcI_v1RQlmV9cPa(zUsS8*fpHFtF(3LN8G;X^TNSLMSc8^+)$l*BL4e9s+Rxnoi}Xh zyIu@L-kd?0`v>+^pY?vT^D*yM)X(qjx2{QK(BiWaHgtDKPJ(A#!f#8w(1Esmt#ed3v!vuiUCk@5~9`smc1xR_r~;da`W$VR(7+^7s8s7R|5kOUeqr`FMrs zs$ju>YB^4;S0E3+ye+larK?i9e%bfizO<^%3k@k+DIq?BcVv(5z4Z9A|6{SkHI{0x z#FTvuvfVNJE8OKp@1|7-DvIq-7Oiu643iG~rZh&`|E;H&Cn(@!^WDrTzf@lBIz)=c z30+8?E7ICB&vPgKjDp4SU+11D%_#0()>>&%C<#mOswy8H(MXag7OWaU0rCMj!`-Ea z&PvIb#Ztt};6`-<#Rk{pAco?K&yoSCpo~HQ&yeVCbDlTJ5)dv?xEPvH!c$^Vo~<-l z19LPKM^DHAqANqIPJCA41tZ2hyoze}ss$reUO5)!4zWtem92+Y78IsF9Jaf6@on^l zpKaAI+b+!?`-I0k0JRFD*_S7$Dp#lKgyOT*f+ZhXmvbiVtKfoy&c;lkEJOjXAhBs- z%0!^&kuncYpC5F!OCW3RY&`f4;gJA$kKfL~0R3SuXF?fEO-NBYy8PPN=yNaz=R~bv zdqu>3Pxpae$|pu6VZK#4cm12^`*87V3&!5)60xGiN9p3J9G*wkhb#Jdc}s=&yOx+l z@GDizH>%zyK7F>Jst0lbh>>6o4_=dI;Bg)QY zGAJ?Ct`|^pJc*=dSTL)0#0yoVL4ib0a<<@r@vQ(ozu26CzaB>eJ2<*MVLiVx#+zE^ zu>7B!NCwB|O60NcF>?K$thv2@H_fw1sjv(Yk>nJK*JLko&&i^LN~m?BEoIT2{LLu>l;I(d-5w}CzVXSn zy+_-^8{6xv0_rjx^J_@75X#G^$EarO;^)bs;|C&|W;U1Pub8X&3h5kDtTPv~S;H&M zcxw3S1;c%yWt{{|RIE^>xerS4p#ok!92O<;_X$H6c$B{Fwoe$i!Cxx`T6wQ-%vnQVDekd!uRIm^j!-UHs<*ww^lB0TznF7_%+vc zMDb3~jw)&}6&XT4+|+NmVN{3V5R)Yo`^TD8sO7x8UVgjsN zK2 zB-0kOqKX#2`SYfv4(?wuoEd-pCU#)@_0^uHw-0dQ6lK@dRzY)pt0?1?4KpUQZWnH+ zO&*URoCIlEtm3gV3%lD|lmpk1c^I6YqM`L#p!2r>cnX2)sCCL=rtKAKaI639sPCz$ zR#)rY8H!#v7?xC5bKCDPX4DYLQu`Q8@4-M`|9ArGudgK%p6v{VRlo-Lvi<0rLCF^R+h-S%gwllT(*OZ`eC;D})JM@@8fK1O_WUS0_gB}Q$xBj1K}@bPpyEbWHztdg#bIO`0U7I9i1Yy=zwmJ6tEM}PS1aDGD)L_# z3kmDen0A&x@CjhRAw;MjsFhl@D!F;#$rdZ+vsG`*H$U?`r&3QJ==Vs^ z_Re*vzGT+3V>1)_X^+9Z*LAgwmLO(D>21H`cfOq3dn?0sMj)^IFPZrKFO7&fLAxp_6)`hvL@5b-6We-{ml#@uZtKt+ z?w80?TZfbT3AR#>!pF>biWvPftc?blUfp81dVMsO?cbc6AC=!fJQ7-b$_hOnE7w+)fT&*-Ag>H!Yjl$!E+Ke^V^QHvGHZt|y` zi-ZhlZp|HI+9C_D<`$i2gBEFlr*1$fUS3i>YHm6W&`bBZ3XdS-&jQ$rgckz-Zprpf>o(__xHtLCC)RO(${0^M^4qP7(_JLbDp`MU-DTR z5J0Drj+0k0|(Q?OWxDEFVBB*S>J=)=P@25dE}s{<%=G-SCwyjFBu1lxlBi|@1J}PI-~aXq4s_HiY1~kC3-Ss6diNrB{LRYSwY#7D32(kuJT7g^$hx7!r~A<> z=*jqlo3}JSpO|M#D#%&?>#(^v0B~OgI3+F?ZhX&_t!*daW9fUD$^@d@G zq?n{*B2^0qzFIhR*%DUGi%=>4cr?OEI_?r!fS1s`lL@UBnRCB{obefBGm@ zt!3a6cWhsyE&F5mn+UdH=#!_G>aX+icyfg8pW&7zC$E2F}X%MwbxW*FWnolx3Z^cvfr0oi;cJNy2j5*FdY&s zbQ&N$Pc)V_!7awhd$|f2m-`5XsRacZ`+(mJDyF*QkV<)WbgweFY&r#%P{y`W$+gl} z)v`#oH&ih6N|fWuGo6mJF2~hG%F5U9c@5w7f$DWr60IrMXOK0o^O0O2hK~({b^)TTf z@Y8FmNlQzSa&bM<^V^SEOn&e4v|9%Il{IgUE#zh!aC+G%X7V=B`E(+8ftXw(0%){9DB#TABB8in4n-Qci#fPw3t^Ok8djX zkANphCdl1MbvDff7Mf81;tlJe7GAd{r3X=^?AG%9v?HIZf}bjDRjWJ9S(u1%jhrG#nqy+5W(R|e1ju}T`rZ~&sVwj{h3Mm#CD z(ZOkwEQ1MD;3^Dk<~4dL$*z5Uw<9}^gw-mf*^^SKopvoZYG6T99IgGqE>OnPhs)*% zz$-JS>zS74v7N1qJhxz|LxNPQmjqX{s(QW@8)|lnEVbLmwU3CdC(qY26h3WPG}zhp zwh*#d14e#bT}_2#DM_=LmJ|i)I+$~_8rcvgK$=5oz9>r;B)LKzg_~&67WQ041~dl8 zo^8*Mu165nMD!&roSY+70fTZN!)*1%6~SLUpV4Gkg2Z04@LTU*X8FxU z1pRs^6}3^PHlOfN4&fu5 zDSF$5oh#NE6UD^(#)CVQ9?DXmjLqJcj@nkH;%@1_T;2TGeR9r;>xAT21s@J^wSVY< zwRRg+d-WO4h87p>8z}IZnByU*@c>p&Vx0`$LeK3pahSwY1tf(M;tG=)xL8U5GCNU? zV^*uyvYy=|N~=|-7;lV{`Y}nP1nPPFX2ki5Fl-VW3ABgD4|s9qsYB{y&8%vuu1b?u zWp$a%-4B|DT!lU*nn*!HTEa!+rKF8Qq%8d{F~)!wK!p`3N9bxn_RYLP84Gd2iK2>u zYax-47#`pk*@lvKt&&S)AuJ{L-I**j(U9!m*1~fy{bays=Ywkp=;^n@WtC3~-y%e5 zH(eA!_lfHL~iYFou&ts5eDc z&7w$_Uc6(+&M8NhY%(R@zV3?6qkR)e3N|Q?b`ZbgCA4Vx7JJuiC zPQ7T7xOCuQ>yT=NMfnT23w_3E`h$7mD?QI|i`OJi(MvGUQ`ubZ3ds>P^~?QUdKxJO zw29z{oK)*(tY-Ox)tq|IqF~i`Tsw_T%*-upTGBa~{yi#RMLNR(Yv$MlU zeTINTkd;NvMrY%hYOGV(0l9GfVqQJd?D;9uv5~-(endQFsK84T8MK3vFdk2pLjG%&O$5YbH@vwqqg_x#_3ZaT*A}!vr*SKFaRlz!SD7p7jjjblR zoLo_np$#5Y5o^44pkm-;LkT)2S;X=8YMHy-DN4rFlU>c5l9{r+DrZ8Trqp^Q>V^!E zwIzY#Bh{{+k2ZVqGr8N#G>M`+#ow~Uz99y)9#<8tD!afK8aJ=1%Zy?JEQ2!^=h+s5 zL0i(xm3~$A5&|j%)XiYh;ocP92fOX{{4&nhx-;r?=_6?S>2nE_bO-pT?ckqq*zD&VT77KOx*v&twn{a zy~NLFd02m$)_oe^Buu1ombs%(y-KF^&Go_#ayS9{EFIP&dx zdH6S1^I+sjMnH^6GOxVlk3v7C$OfcvUpJ#QIRHV#1KSG>2QvCpK2eN+=E% z$q?d6h(`$rM#fk4D5Y?TISF+GfUG^Tpb9AAQA^@6Dly?ULJ3|$(yf0o0RT zy)rWw0JbyUtxsd>)~obc4&E~zWy}^I_&rxGK^|6~sH3|;BeHvRZ9OuZYY>c1oO7|6jI-+Lco?}X zsGdf2o7WXm(5zEm^`apCgHXn{!+35-<@$#)9Fk}8hcY+)=48xxe}@1uFhwC4tMN(9 zI*)DZD4eAikMuK7fAZQN=4iZ0=8$SCX)g0Yg`JW|IV*`$XAI%@#G%iv=N@ z(S;K7skP31x*E=A{mjCJ%mTD9x=$sZ7mYQ+*v~jQh;_~zG3M(jL2xyud0VdA0K?fq z4})q-nKw7##8c+Q@GFrJgVFD`5K_2 zsc}-}?dbm1z=cnQyh`>yk>TF_j}`3j*M85K8ymD@wWH^pMHkJcGmi@SBQH29{XU3( zKDYZt&x`1<`(BkEl9gl^L1o%W={j6^9=MzuWbS=wmFN-48qY>+Zu( zZCXc58ly7YpPyT5n|N7&PzP51u&w4Ba_!Kp?>jvQ%LAk8UB@6;uhEVL^aua$$c^0| z_bBx@LMN)vil}^Epwu*KUQE-xeG;Xhd?9G?!pVg&p!LT+uf3V8`PX3|AE0P)ANQjU z?0I&xM7p<0TU8@#RRvO5?_<3}H=X-ri3=Nu?Hv2yY7h{wZuFrv2#*dF;=@%s7Ft$J z5rQ-TBa`q5X`HL2nSO3VPLQ>133$0Aen80}7pGL0WG?kgD9!SEIgzqz*~p3hqc;l1(uaf?Y+7+P+WHEuO?`^EFrJI`Xm6rcO)0Q79l&s8` zwf&wFQLap&Ua2cscEx+nYG65dR-?Oh6f)SGNf|;kI#Bl%v-F(^c;rF)4(MqN`ceZm z%0Z-pl5-Eu7Bv%dG@MJ;gXhzyTym{bhoNSH}G~aM<_9DO;32Rq#lRF>LB*5yUsQ`I9eCcIg&mzD15(~ zzaZUFV@A75YDQdHy|HoCdYDPqc%i|lWyH~=_t+?q6C!HrWfRMZ@guUHtQn>>a`3gZ z3woxh(iy5ASz?go!*Um6;~F`}VSPj$2R4esBbtYHlGmj4gSS$MUTAp~rh!sR9&fQ? z$%*U^LYK(*x4_7?@f--bj9I3SZm3{zp6H9n|LoS)pb!fvLVSy;8E|^3a}~xrMRyFH z%8uUWrjHhtlt?XL;1>H{W}&Bshjk3G>Pj{cVCfENh2F7JeJSQp`PRpAJQ`UKH(B;9B1yD)u0(|B{q?!LCTd zYhN>6`4xStX*_3N-4MNaoy3BYFsJE>GN!+M(>qU`%)XdA@iM9T_>;TeVAtmTwOZkFX&tmyhm%U9xJ^0)GL_Uys{c$bo}a)yWN+DXMCSSn&)pp z_d&i`4)-;F7>MI09`@}cZoFhnY<+t6-bcP#8m30U>eIiR(ym>5cgMwA*ERU-gRS1x z8{Z<-Cd{g}*EfEhANg@J?SazMpXt^ox5D2jp1Khq74iCNh^vD&?E=zvtp9Yr8_BAh zS(GKT;O7{$M~Li&uMtpIdutkR9vt%S^VY7GB>-CE^j6Ghymr+xe`SZ6YetGSHsRJ@ z0bQfqVK^!dDI!#4ori>)H;2G$2Qa)s3D$Ck;_vT-nZjRMLeF&&)40uiQLA0{)mf5& zloS_NUzU2dIU*ym%W#+Rkip8HIEUB)FCDbiq!lw~0$z(%lMgH?)6q2I)(PZ+3c|E8 z6NdXBY*DWqYc8WKY)+ZC5U)axS5~AE0$pO_hmwgcfT~y&So0sISol43Xwmo>=ae`z zwa&2-|AvnHz&U2jj4@`$s#%%(Nmq3%S>>4mrs$|%beEuB7Tj?W?dMdeERY3fAL9zaH?^PiGQ!{VDg;C34zrQjEfcByN4|j{n!%29od&M8}<>V9%ou?=WwT zE5By#u{HrdI$#`z`$2=;5!$btF}SQ-wmK&)rl-=k|a;E3TY|0wiWxE3}G+2>Id zxhBrmv#D!#wH2dG$2<`WVAl(4-moB9!6p#!4nCo_DqUFR$N4Qc*Klbuv8p>!Zd2k8 zc;jOvy%tF|awAIyVS_C8v_G3p#LX91M5bUao=Oa}Ow8qada zLz`3)ZdOliU((iwr{`rlDs873e&BSH9i6wR=wH zf|K0Mv5v^L8_oNy(+L;bGVSzx0^STCp$1=n5W;e*zVef=p-1%eNlxC5g`+R#R#$Dl zKY#jY?8&m}vJX$haQtjzw;<0_Pg--#&JfwsPOWFlLDii8eyCx`_ZK$3_zSms40~5T zkY5@1N=eX$Uah~mx^<0HxS_pN(W7~N@!;>(i-hLz%Zn#Gl)o(R^`X!G@cc%&A3Hh1 zb1k$fCFyZiI)!i&HM#IaU&gCKT%XQBN#C6j~ zw{p9}O}|7R3ux^k?AC>|&g+G#%L^EHL`WBR zb>Ra_cXoODHYV?&^hGq@?PFWNsa*h_Sq0CU_7}^u;MNFortB?POR+82p0l|o-cGpv zY|oc$mW+F*(pHbLstS%2>D=q9U8Bo~=bBGZf`n-qWGU^VcFWG65ngK$1zh+Kg&Jw~De_I-?AMg;+%9Fv;0KiVoj1xmZOd zQ*tpk8SpB$%Yq6C=O$aB3PYUvlDu+~Dd;>1)MywYixSNn@$ymwDjZdz@k(n-B_?#V zptyvR?J@9kZJkv8e(uSoF^z$dcB^lhp`Q|*+i)wzg#^zh>o=LfLF^{X zrWWU>*A*k1cCYp1AZIS$5_-+P>N~K^_ob3khO?tksk{LoDu zvn#M%?6FO_bUg!-tedS~oCE=;Iq~ks^{p|B*9tvGI?aw8-jB_A-MGWq`PD$v`6Jln zMcpjK{nzEMrmy*gPZVyBhu>$ppR`jR9Z$a#{D za?(Y_T!f3-$?*&Nz>kg|>*qQ6sH;QX2YA089(|o-A*c~GY95ti9pD$mf|WiLdYAsu z`HMq4>+;fj4ZgASA3usrn98l5U2`}iuaM3x#bxC6;H5QODvQoLt9{=8edz&BL1ltq zaIhCAtBNabSZOpnanSo7;o9pMYKfNiphlRrX#fYGCd68Hb|rK5UMqcMD3mw~fh`S5 zYw0WYZ_@kopc-B-6;kAdYt*;6>@bU8VMm_nd zrV2=yYNRPqT#`rEwj7PbVtsgxguSr}C_czkpsreU7S;>M^~Iq|Bmn*wa)P39HA<6l z);>8miQknkr8H9n8 zg_XfIR}tmA&eBmA(z*=mN%?yTGL_W#=dJtXFFgE6iJHoam~P1TaFvniR_)rLIBYQA z&-ZBHg)}FwA5f2q37;q*t@pp%K|T6Za>J0+FnYdo7E>~}66-$Cq)@>E6CK^Mi zq$sFqULD4=;%jQ$U`1R$L(Cv|?h2Bdum-Uv?_*f(O?rcCh!4wEl8tiWgbEPdG!f41 zur8-#b=pJ(gBp#}NFEQffEN@I7ZC6}v^X~{;k3RkBzeQl8lFNtPA z$l2Vfqc#KK?1b$H7!nbyos9^h6t-Wt+fHt)siU`m0V8$u;8EsSJ@A&h(+oh0igr^G zk@>LLB|vHkBo3mBl!JfBkuP7|*I05E57v>-yBR|h z{vq}~;v{;77%3lq(g#(l;S2YNQ3YsgP$CD#tE89pv zoOZpoiYxs=>BNe>y&jOc*Z;Jr(Ar7)3mQ*L-x7Yse*QjcdnxDF`$ccL(U0Z|k7b z>x>YR3!r@6#ys3s z;>;P<4v1;iql%V1*@;yLmDRn&#N+LGWjTwUfV_~kD#8qdriekp3QgxIuti@T2~5lwqf zy`LhL;Mvs}!8oi}{i{LLgY%9!s^kRdnpb7p9`;0HM3lW7@0Cr(UDeKkTU-^WS^Mgq zh&!h0VK{hk=Cm*JT=msu9Z0=>zol~Mah zy+&kFz1veS-8_M|b!2DULSoLlrf*5X&q?DW=AGEF)2AFz-Fj&nV$CV#4Db5!=+)NL zhuVEzH|urG`&FCsTkV4M@WSA}UWTu6v8jxNyuqOMYbXqMk(l1$O$df7#(_;b(8nag zNN}Gr24_llhUlgdT@2m~s0BX@aF4`r~;(J*?nfG8!+7$MC_$vL)xv{EXKfOLt1f|3F%f`OtBzyJSvj_1Yw zJ-#pZX2*Tq=Xrk4Yx70Fomy(y?BgU{FgdUHXQF=CktwvPO6H#vf<_}cGK^B@w68w( ztx3HV+tPSd0L%&Uv#VJ2-Sgy6vKAAS-KWgm3+ zD(zzR_`n6qD))}CVv3AEEbpf}y33lhME%;KK-J2chq>9?FUFqeY<8&!R;-c3>ILym< z3!EID9J2V7Zup0mK$we*qWP}eF8hbSo_Df*#TO;5dV41|e|0&(ncljS)1E0YdgaG; z`DX){+AgS`g>t{-A2Jts{O&Jtj#W+QuU*XKw*al#(=4AsTFpmHeSZr;8gtgVkfiFl zUw87yPR12+?jo^U-kIf{M)z60GAmZ9Ts}OX`@L5dnqculV6f7Y*C@?Xc6L`a>tu~P zSE!@|A^Ml}MVyNvqLvzLNDpwQswR!=Nb5+`G0QPxjYrhu7GAvX6Oh%uol#Y+@6Jlw zY~#bhAP$zuO2`h$>H$C|<1F=2@oM5weGgh10f5A?K0wV?C>tbkgPB>EL2OW8J-2pN z(qu3W{2@cd@CJ;PohMF)zTEtBJ;5RycOw@Dlzd4K6XWWCAxa86&u@xJClVi`Zn33s zAYzVZOljzB_HLfiCGhrH*U2Tz0SZMK0p`|{U^yJ_1&~pNw~1GD=P+2kjIK9L1y^%hwXM2A#oIS7o%{+nZYEsbGtu=oI-6e6?xF;1zU_ej z{YpLY*Ph$BRE_8#Vkn<&*!;v$#Wuk`;+U9a^y^xbw59OAac{=U5;e_9Q1#&ck$n0+ zoAK9%K5s}=(lK{lYw|jgp(@M1+vrWmU1bsXLM7iMzIL(&nRN%7sUzmYk|F1M<7t8# z+$OexFe4|LqJ?a8t6OZ7jWe3BQ7~Ecx_x`A$H78ToPwGoSyo$S1TK#~WwQtfSE|SN zAKZ3`S?+UGDO#CnGnIux7u6alDQ?V@+^BkAHNPLz7j3G&wE2nlOT~pm_j3bJQ7$Fi z*Yv_YvvRbix5{{F3a)T@W|omwT$)Tyu@8e{T>~g@X`Q2d92x|4hs~=ur#S(s zSOV6S!B{u|gHMcsr87``H+bbyJUmDZcprpMsNK9g))k)y=5HoBA?k9=KThZNqVA;2 zVuspE!6;kf)5YwTQcZoJ1_PAl%>P{k96lgjSqa`+DbzXE5Yx>b7!ykdBN+jed!>%% zsQPzzCV(yBcfFpoM#d{kY2Vqu$&p9t4n@r(e={wHZP}N~eC!ds_>j~HrPxMs>@}ar zhpdg}7|@BgM(Qa$o?iPSA7Bv!oNrDImn~md!%U1E3_e~q`*i=MOLBCa-Y`9VEMN?i&k8So#b{o!sSAxF!|V z_}El2f`LC5&>q!wm8{9};A>eELg`{jM%RKxpM7t_s+Z=ti~GLzKU3d^D=s2uJJDf0 z#)dCZllGVF_>LhTgzB3q3dl@DW7l4`j41WDNS)U|l2w|CeGa?#w_^(-vZ$)CM=C@G zFJI4sdVcif-LIFOKXGTS6N-9AkLh^7EZb3bTtjnz)!iw0dAx4%b`f@FI*p!Vzu6E? z2zA|!<69l%NwU7|qa;^<0qySJlF(sabkf1VM zEP4WD*6&vAt{2tI(S4q-1r4PO36#G9p0L6|G2GHP|1Xfb@3?6q*ZJngJI7bp4h*H zBlILD_)VY))&V;UD?RzmTgK&?xnebcsEu~zA(|FrWby(zA&XE4)z6Z_$32FEtOsOV zGSF=4`0g9Ue0?%~0+2dXP0JfA?`>I2Hf)wL5ef(SIlzp7&8}$Bn`#VtVbCzGxAZ{E zo=udcrlfEKwXi4ZiBRku!6Tr5N(l^l|eW=#dzN%BHQYEd7wjzEMAl~VS(sQ zj>pj?U0M zG0kb7evlj!m<74RXEYDtQ>ct%pfC(UjS+up-E@$w=iV?4&-CGiqbCx}ARQOlny zik`v_?U%t%n!x9gz;8{~6!&F9S<%wksA8=O(_J~hP~-30-9b=_Lv-3i$?D7xY4+=P z@mCx+ha!YSu??1|8WaJVx7;l^i}sMx zb+`waO_NdTKh~O z)eMSeD*nF3+Jyj@t%Z02jAq)=yKg54NzlUn@(I*lz}^! z#bC6VYs6Jlj>)4ej?dDT`Vo|-=9-`_#$*Dh2px`N)87)1^#+vDeMlSCnE{pdeMHdH zSKB~_0nj*R1X#sn)U^qe*Cz@oH>t^k$wBBzJzU<*%=+|$VDZcJ&|wmNAN^pht*`4G zsJbolQ~JD#`cS=Y2gn{FJ(E|yo1UM4}54{5<@UIl6PkY8T4MXI|As0a}MR6>J#KdlypIHQo{|=-ZO^V6(_fhRc>JgcqcT`i3wfR{N4?>Q1nJ7 zY#QT4f>UfQ3Ta^>fJUhxU@BJSxx545+Ma~;&`v)mfuXMaem*F8taS&QZ^)~H?v~rM zn#-OQ$J?XA!=Nx(q?}h~IdW*j>0%?v6J@1Q6_B#iohZAwVr`p*45=Ih!{9&)nkHD- z%GBwD2LsST7F?LMya0ta%b<}REtU;%1C^nz6?V7^6|-#RkD?Gz&Gq(I_%#%8HNIpV zF3{^?v5t6(8-a*fW*=xGISm~m*!kFqtQkllq>7dC5Cqap0Fwl>u=Xn9Q0g5@6@fT} z0QnR7K!XXaV4KjLQ@Wf~0t#<&dhND5W>XFpCT}upoaAv{EAdUS@l46f;cN`O=I2}- z>7mli&sWj+cg@-~j>gz0*Cu+djDDos6&q`}iF(L+cTn?>u2ibdNp-|`FZu4B#=G$W zvah>t)ya&xbDm%=@Y_=smx;*gc7e2vW$JCF;MbY*_aefPhvWkd%jVzJ4_BQy(%)~J zEfUxfe(U=FPg3ZI2tY%|n5A3E`HIhDR<(6mAYe>xSoBu|g?Boa?|#aW)#?gcsS}Z| z8Y8S7z@FllvxWRZd-S&Q`D_y`zn|Wjlxh!tBUoqk&*kBh2}80g{yv=%kLSq+!+zi8Nbg zm|I;o_#z|Gnt(H8NMM2Gnu~MiNea6&_J_%tdrsE_E3M50*=LIP&d2}6F;N0gE*tQo z*4hlHUI`Hhgkl6UYiSb=J#7fda=2r%p;&>2LK13kgg%o)l4TZoG9&hq%24YpBibv9 zv;->Rq%5VG`Jr;Y+-3{{q!^hn6G4m2{G`Wolg#H1ABC0ee7aA3D)8TQA6)4$k4PG8 zQpDW*b@+PYoQ`NDD|rvgRBMO-%?g*|uj#nY6R7K#vdW8*@=p=EN|U7N6mt8myi?=@ z4Qt=hK*5pr(3Zdd%#{z0q4NYQS@<;&x@Qh@w-A&C3=WcezISMP5F-cC02vU<-^&QgEkh|(UwsnP9sG+l=xg69-%X-Tp~ za0;m~4nBsUQ#r3Gi1Vd^*0r_g7g}TDtd~Jm>h>ANDliSJvGcqyNf*5UVTEfbU~w}I zh1G3o##ZT-DJ42HD~orWEG_NmE)uX8fVVkQ!wD+JDpZt4gO`9m3Rdbggdy3D8L&4+ zqzlWVY@x!iKJjKJ4=6&u<_&v;k8qdvKA{?eym$_%VsT`4l?H+w7FVqp=@v04hrxrf z46wnQ7COah_G-an0Dv|7%?HtZB)Rqq*VZ7kp}>oyN2{L(La;7R{cL}|5B^K^cg%9X zblBr(p6oY{=^o19DL)PT@iQVh6#n|HFB3K2m3GS&->G{=-Y))GoQuo8W9#v^tgm%L zS0$&~Tzl4R$WMVI%Jm7hpWvu_(UzWuV+%qBl?Rx}RPIgP8#@G3OX|XvsCNgOs621W zW|8qL)W_)!)q+2hTBp-&hRi%hF7x#1v~11Xz4)=vB`oo1!WO>Q)e%~-bG9hu$niw{ z)XCawWZ2*aBF1;;mh-hm<&?QEFR4dA3{oZBL*Gy8M?6im_4+m7GYu;>Vm4~DP)ON|uWDZ#=&XP+c z4kErn<3(w+cIM%=GYSleqNH5gCc6bFBrqYds*7$lZh{`9-EmRQ?1(!ff;h-8M_1db zs|n-AGC7V z$=qIzr*LwbDDPP%h&rRcu#n9mX_+f1W6zKq4lvG^WRGJ&7|@E=o6)MVkz7+4apu`$ zK*nS1RpU%0%p6@ua$*k~g8@y7k`N+VhMvbYU1e-oZXxvGbYh8AHU5lKNMHcuSylE* z9Jchj$$!Z1tzGLUqnu~aNsW(GT8ix!PC{G;k?yTkg}NIh-@h+VbY~lqp08YVU(q|V z;~-{1?HAVgev?$+pXSMKtZ?pTMH-EqS4_pUd}$*u0Ml_@a?e7)475>@uOjBONO65Q zx3-{mt+%{2WSeTtGtLySI7V25R|ylDQn_ii8}&u+X@~BSEOVR2{sGIJLU>+#A?~N! zyiLa+4i`(llQb;HHPzYDH!WFUBI%Xu9Yuk`-+hn_l>_Vh&lC8czVB|*GUl_exE}qh z$J;4$mL$P=M^X;oe$0jutS6P6z8ZyW2yUbiFeR~{e59)5x=^+%A_D*#; zjT#)J1XmyA%AA5%#QEaWSZiQ@z9o17r!uP|chcuNe1Jl9c z37z{11acNX8$UwvoE#z(@C~98+GGnIG|YIYo`4|@LB>GsB)7iBagBvO@*P{DW|CnW z?OEZ~jJ5s1!>Z4vS79O@TI@iYb{1B{$>P8+f=~mOwK+|k=!4phOB)fRzkdBh!fLmO z)#K`ZjrG!3sYPKiWfPL{++f8LucnU_#8aisFAMLL2ry$a6m*wcOrA6WOmK>Hd*PE9vFBLg|IMi3;ZTWBm^Xob|*7o-& z&gXBw-qW!A_O(l)oPO#hdpR1G=KOg#&w|#}DI^oalvActA}>{8DCV6Q|FBZ&>*ps{ zPJ~bIJ_T-wDSth1V*c=8Y6|m(}Q1p7L z@z7g^tv$%C>5D^c?U~QsqkpHvf8QJirwC9|>MNpRHHS12^s9L;5o|+03bV$G-}+|T zA;ZV>Z7!^jT)xqt^NZ?U>2XW`aZ`fZC`^1;K|WAD-X z&pP%4<$WrBDY1b$i~pi<>{TPbeKk`ZAGN^@FS|d8>U!>s8mez$9+qD$OSaVN4;Qcn zh|qFv7>FsDdvM6>tl6?Sahkm7RC-jNmq*Wga}a-xK8X9vDpn+C-PQ5A4qeKG6cfPc zS8bRftB*sI##5a%&gPUXmxmR za|x8jIA|ItBRic#`&ImgCEi3vfg7F8OOKRdCK5p1O8?*8uY{ z1h+gmE&G3)&h%0LNtgdCUjEmX8f>wgFBe+U2kx&j@5Ns-e# z!;v8XZ|--HYV!MQH2Tf&HxWcfwYkXKe@pIv;%Fz#;-5#_6msj9gnbV8=2ya^qY+~v z{3@VrA3};CiH?@;LWj@%E9D&RUIOwAo*KRH zeJQ%myw2gQ94%uiqOH_af@6@0nnB$h>U8eT*Xyn*%`dC#`Q{>PYpp;QBY$!Xuu};j zg8AXbcbGBlY>~I75_L1L-1u12j05L|#e~n!xB4NbRm~-xWcMwQP85-so z7{)X&yQySD7J?xeEz&8-@%AEzK)VJMWdU1~b%)|h?oTYVir_qonm4(@pIXw5cHO*DHUa5`RyxspDnh*d==4XA`$hanlb6(o8?nZ=l3iSMOTPS@m?QtpgGnwf^kyq0On>$nZC=nnGd3d@D597QRPmZVAeL8mVHt7Z{ zb8@7L?&_+V-s9b!4=i1G_n!5!?p66F!31e+Cr$`7#V^?=oTh>y>}ResA_svh%bo*w z1G^Z*fg?Mi7v2=SC(NC!2ib0^-tyQ5h4!wBUPsw6kii1#mBIX;I~+J* z!k!4R>N_uc8|cGm0Yz!<4x^rr^Vat^Ixk1UzF9^@@jvWftIlPlRH*DOT)pWOIzb;g z9?s);^OF0)(W8&4E-5WsQ0l|_R9N8?4k~!SKaG{

u!-P>TxmR&x8=_3JWFZ;dxQi;Nr?_HKQtV-9+U}l&)bN z%uj+0s=kAWJg~u%XwWbA2CKy@kcy)HH%xc!^#65?&b?|lwYydQbH`{U?UK+*eDP+4 z;sdRecgMWfrI&vEih6!M0r0qin$14*7gN8;wWpK${C<%^O|sxusHMw=09**&y0&tz zKQG%)W-sGi3qCQ5wlp(J*T_gl!2l4M68Zvg70^_%E;N0wMeNZ`WFA1SC{;n2#1XQsmyQ`_JA1$7Ul=O3tt&sp7wzEmId`NPe?#=;FX58)5X z5P{oZ1pKOkme4OZNy`kOklrtj{T_Z_OfK00;p|hNAx9D>zIeQDqrbNXlg5SgD<&sk ze=UX$_Q4`_^Xf+mHMZe#%w(W|`87K-bbKsir4sqY56|ZH zy9TfjI4-X$Q)5EL;e(>4vihE9Ri6Kxa_76l-#jR@i8Sp@ zz}oMLk|nSu7y{~(&qf5Pu6|r*DQDKNyr+GP43^KTQ{Z392NlfnYQVFqQcfv*t^}eR zrTS!S>=aADt>W#bMg{Hsa5;CRgc`CI8<(_%6!&(rO%$b1<;WNf2*QdFt^$J%yg(?# zg-}rpl(bA7A;B#oSPsQTP7z~F$?`=XRP$4e6`1!bQ=F*Uf_IGA;fbL35+V!729&+5 zL>$G2R#={=;S(6JHh>v0q%UAv>ltV?_L)-(vZ};WaK846a)di-s`jhAbHVEKTrd?R z`>9i}xT;ld;Y43#~^LV?$y!!ezNp!%yvah_V=;&i7txKIb`ngqq9;rtTy|;5| z?Gg;MtX+zKp+TWOQ-3|oWV#a?QVO;B(DKmUe!sm#==p*!9p_1Ki|3tPpxjicjOy{f z-G}to)cE>0BX$FW?y1gnZa)A#+Vc)SV060+sTBOo({ui+_2h{O;@r2ZcosE6-ggY4 z`;lo1x-n_&@)wrlObKC9G!-}P`IC!ZIGR=J#RpEi45$xHiE<&IPxfUW1OgaO_i=uuCPC7`>%A(sPidh@Gd2ST#W*=+v7JQ@|JiIQ*a zO?zkmGl`u~s^<=PuPBrIWxRYvpGFMjj{&+%XJ`%I}ClYg|>Mlw0YNE~6*ou#H zxa9YP0(6i*y)pfbJ{@<4>NSfV1gAdq1$g!wJdS6Zc`%-d5fnPgg^SZR@-jDOR8wH$ zn^6e1ji;CN5TebYhrn2qEx4I|=tbqY2si571u-iKMmi8eIypr)jCRH>p%Nk!mcV#! zKbg?FCKyV{@-n3uS|8_1(GoOt?afd3a&k}jYHO5pP!Fs%A{ppGzI?{HWUl6{^H@1E z&1?dVv{g1M#9VfNug_XIkW9(D1`tWj>*1iGaa|iQt~AmI5H6TK?rFAdp?#orU7;hB zx8IaC0Gy-~y0^Mv-SU`SzxGb-M=Y5HaGy`h^`gxlskBU8|(jtb4Z+j;j00a{)oz?o1GX`IrDwkVtGYP`DC zARcEwDI6l=bw1dPp)E2(B`3Q6sP^ABu}A~EQ}Z9!TPf#*OT=6IyMjCPWkJTCC@ODd zatT4TbLn{-VIAwZSBaeT z*7BH*%obIYoKU4*idoFRRc{3kVUN0)K8vEbHZwta7%4Nh}5E(O|Zp^!+Bt4A7IW?z~Np9`& zEZ9ovl&U)eU?v^|BoM&|3D|R$yEDKG)9`>ap%u>4L9XrMU`A;UqFV{07h6|B{P}L1 zRYo~EV*XC|>w&%-O{w?^^;)Y`)RF;=g0_ND>RA=LqaapEH;CdyFvfKRVkK7Q0jS(4 z?+>ir4>U<{_6mPd{7qGDeZo(mHqyUP&SgJQ>oaau{eHK=pNbXJ?LP-vYkZc`@mA07 zUU}ml-`UrGczyZu6B-_|4=80ud3TGw-=blN)|kTP z_aAtWf(2*PL-hOxd87n-@<*pQRQby$$>~dwNbAqKxhE_1A!|&1(FqaHZh2E0hU$SJr53z(!PD7yhUw0ALw_E{aRjs-per!Y*^`8y&Mw&zHSuzEo5enYKAD% zTWR8~Uobk5>3wV(_?P57nIC>uo%MbEif%bnb86t`ZXx!wH(%S3cBN8+XS}C>skM%3 zz01;Dq9(Dm-3!sq{!i+bQYLeSkmK?#5aagQzU5`R0?*F z^@X=Sj0N&PtpteznQoPgqPxO2f^VzO~N^y0e&*KE}^X2!%Uk~(WV3FxXnh&$&|B2ZsMe?YeGF{)+bD`eAtzHP(an=1qjRy$*iVGgrCqHCvpk0>yuq&lb!o) zxJAu!x@rgL`&<>xXn|Ib|+GAuAmO8NK@QiGT(#{_C2R=mSaWzRqPBd^ zsp~kO)!mAdknZ=si@!z=i*=G!`A{YkwMcsTEa(6`r0vm$#i+Gw+Ru!w1|nb@TvYz< zr^x*CP~Rhdifjk>El2k@dP;o$hzuNPeBL%=4@@Vo@8iYX&tu`CHsZ;J9cizy)hQaa zP=<4$n}dJoybh3rgqcDS@VO@Zt0v||);sA5B(f|P?>l5Y;Dxg{-j_(&C8aQ9MEQ~J zm=%4HZJdg=$^r;TH`jKaB@xr4RN>Ea=p}*1K?>(2I-f=ptrJx|g;Xy?tSYS7NmSxz z01a>%Q>)KDZpDwycp$J(rH>et7{^ zS+J`CfdTIOXCJyU!;eK?n{?RLzZ0LGWc^ZfGF!vClz#L6^{Bq_Yu-hj)gCbKG(CIB zU18tw1{w{C^E4)b5mP%-EX9DTQb-JdJV0-fn%Zkqn1rmmCQ5hyQgh{!D-P zuM0atdUMJ!lFajcO*!jRH_d|T;_&C90@i;H{|>kjSsN9(!w&a^XMu_9snOmIC%0z2 zM+1A34uWA){C=BKF_TQ?M#iAbY**MHZ_7AG9>g`mTzV7a!)07E?eIdu`e1 zPmlTyvBRlRDx|zRd%>4)bI04g zR9WwdtIU?$0!R>}kNTjULYMjie8+k>gC>Z2yM*p##^#1dT)evXX#NjTVwOJhy7c3; z3NxJ#DKNw^%>c9Tc0!!Qc9}KvWWL%g^@i^I8`|`_Kpks>{*Z;CtlCb(%dj~CrjIW& zKw=V;6S5&At+e7HhuUmD>bb78dHvAyq#4L)xGpqhRA)P5vQpQVm$e#XXo7$?LxivR zBnf8f6KH{qnOUH6Xc(iY+%&|zPQ{E$FGqx%3&!tE;N|$7kopT)=2IUrL=1fx!Q4U& zEN8YLl>kshbU3=d6 z;Cqnz@kdCj?&gr*_wNa~J2GI7km1*v>iqn(So`N?t;hTIulUCIR=8yk#F-FCW2Aw= zt#5a+;(LC`DPti}L8NS_vh8GyhNF^sD~J= z9YsDXnUr!X31T~_cVP%!(4>u3B7W`-dC zy9(~O3_Il@l;_Z(`kd1vwiar`LT85kOjcu4wM~(0MrT(SvB3PDDsu|Bk|bktk5ADZ zf00Nkk<(@Ls&DEr=4vK`lUtpP2N9)c3(BY&!4L96U3h_Ou#t$g0s{NiK7=jeJLNRb z&1K?Bv%|b~x@aY8&f25_qwI;tgT+xsR5>h&0XQd);lSfxsrNOK@9;tz&`7v}PxqT2 zxeMZ$^FRu3I>B8AYd^#b8%U^^ma9e?4MGN$yi^odhvN@6vYq^^<*;$}Bo+aV)&)-! zw7|#7k73i6I=LJ-7-#^HYq0!~h}s8Yt@#26TZgyVOY-LP_9EN%FcBq-8%wRHLe+R7 z)S&&}hOb2LV?Wb?fi1T)<%WKvYWm^T7R)by^T(xzF0ugJ%mpb=WWc8P~5G9#6*Wbu>hp zkCWn2$FYdvBZWO>$#?!f%!~o|-Gf`6HLH0ag%pbPe$CVR)|&d|L^#7G_!^IU(USlA ztJ>Ebeop&cE%O&SBwH}frqFTQ(Y`rh>R5Kd= zPJaJ>k&D$=8|*UC=lN9$vBiZ0QMg9YV!!fvE>B8qt{XG+F%Dv)wivYBSqhpwvgJgL z_@R7xIpUz{7geeqRdZY@*NHYmYc`rZTpTWGG)-QxrC;vyu)e&hsSu7;yxO`LXYPrC zeiIdzG}mV4b|aUj5Y9`BW%h8{*|@7l^wqWyJ~x=B4T)E7OMTx1kXSoYjG*Nzx0v1u zlTM8H<+iB-@Gvt9LlON+))uq%iR(>O&6W=_k8 z*H+IYThkxwC#10$GI7^Ri4hp$1%M2>yvg*SbF%G)4IMOrFPS%6T*?5HeNLf^8NeTd zXx38Z#29`8T%WANa5UEd%ZZ72w{YoIv)xNd<5d&Ql`^fPCH6%cE?b^0TzfW_XPOyZ z9!{9T-3`pxRIrSvuXvzOvi|&s!=8{IL92Z&7}k=U%jsl`Rks<7-bNVbm0`c(;ox z&;WiT{XxV4gq@0}CcIKtNPur;V{pEi#UQ$7435E8*lK>yRShwpb-pMPAI5}e0AtkX zjgk^~mPx2dfBC`hGmnjK**1}6z{^%Mg>gnN46lE%dMa0dbL(DH z<{j`%05uZP@v?SQ<6ruX$$nUb^j6@igd}(ftpG?&zT?K!uaDgLlSq3+WNe z`9_1*-aGV7s%>-gz^z{w8h3S6!9tffPZn;p4KJK6b0zth@T)J$mkldfl{B~8v>tLJYo92)MWhU?Ij zL8d_1bRClqgcq$$55s$OlXnCIcp$fPpE}gRJHNc5GoNun2CKXctAbkaLo$=>NGj$^ z!bOIcB29n-YP7tlYA#l>cr!-TqH{ZeK?%!!Gi7i=%p6wb&dw`cFDVO@Ht@FIQDQ8& zV3KABxP_x$GDQgCDj|lS<3XmwG5`T1LwdSNT*zd$M1dhGA0cQE!3E4sU}1EqR^5>- zH+K_fEU0ZccP%ibuBs$@%qTD`Bh(d`lTG6u<~m)j&dNteamk(!2(A!7q2?TbuANRludSG#cjpQ~ z{k1q&K81WBeef4~{dirQa@)Xbz47SI11-WCb)&QM4EkEPEH?J%+x=fZBd?9^UC%e- z9G2eDs`s=Gom2dDXV=c@!Y8}@@Y)5T5aSqyqrV0xMNQ_>?kB6B=Jh5e*RT%{WgZ{@ zMm%?}t<}p{HT2aOU|YH@Yngssw}<5YISt%+UsR$op6l6@{Y>n%#<0&HFet!1KMf1M zw$UocKLAF&ng)0O98KN5r5P0G_c?1f>drX$>l2f-uDv{LhTOYh7ysNr$QgU0u6;?| z-8N5s|FN74QI01nF@NwnKTn)8+qC`+-a2{mLX=23Ty%D`hO%F@xUL)%1=8+F_ z=0fsAZ^RM^wOm=>6=KSmx_nuZp>g=oOi^bHT|b2$-fY$^5F zTkRy@c3peW99A9;qyyTny%>Ih&lDw+t2L$3kiI6`+xiM|IM+%tW@X+BOstp2RwvpY zkg?6AmBB3^4Pg52JXbpT9Flz$);)wDN@0nskkztu`9g&Qe)n(-Hx{NJIJ`g5PEUgFCY})Af?n-@vsiT<*^`jB!#?${whT3s zYo{={ODmMR)}be#2vXyFPZVw=xE{6K5uHcyzRR=wNuIvJU{*&2ALiD4(r7Qgnsv4v zmSZuH_UXu~im5ZGGl%i%-uL@IU&W*z)7)@1%q*y0bn-fwy}sHO`_lArM|jM>U{zRX z=dpAS`0iXZ+I>ivD* z%l#XHYs9hT$-YJ!&k;U)svF2l++?as7o%iVw7SK-)J}-HUFeyI}tFV5gsLtIQ^_5DW+6^fR=%wgIFJp2YsR z(2ckk%rY=JKq54*m^ZeZ`EEs4;-JRr_IiCatXdQ9L# zk^A=Zpv81`)~>>6oruf}wyVW|yJ1h9#M}yoM16QOA&`0?^brpX@4=FgQcVLf;!&dS zqM6tP*9uw`B@vDa-I=XL`;NyKn=Z+1?%Km_yDSG!+R2Z+$90v4>}r%$khLqn&tctu zN4tiBw1q&U05qIpOIZlhM9y)|@frnlO_^VrKkI;tYDG8f!^z(P<4*iUHn`7)&=#z6#>u;MkA6R&U+8-L!}k7d z7Y~}}e$VcCw!BjJc@&rO@h@@sVPsQo*b}H5O}zOF7$BzhT1X^)CB;HG##~>9+&{R3 z7oXo0T@3L^7L6P*a1|d_(#JBP*^L@V9#_hAA37wA;^OftxpnydFvWNGg@JQK=%9eq zhW|2t7Nj?48dltF56$*@+VcQvc4MVjaI^i@or6|MYI(<%-vq5^y?%K>U};0^IGW<} zFZnSNQOX$Ehn2XzYOE_8#%&AI^dsj0mu5FFFTD@_OcIfRrZF%0Y9}{gy3L1TS znkIG$&aqeDa5t(DTa!WLH~MpCuMk^vRdXN(U$aop*IlDAj}W3V@?XSNFq5iG%p8eim?_ORH)b9GqzdFz#N)5L% zf42(cD(Fkf?$Ys4UBflgYmGpXkBH zy4Q=KsqmQZdeuJ*_g1PB?b!#OX8p`;zVl%B^BYf|??knpdl~jwhxW!+bBJbtdtOSW ztQ>Jg@V#}DgK?YYQ&LXgwaWBZ#Wy84=i4nLmK`9yMEge%mINY`-vx$6SZ}_{Z2W9R zul7VpG58-NV>JUB%$|k1qJ91^ z6{jEm|K*AQmXhZdB+2mpCrbQJtVHC$+y5YOoVqD_a!Gim=|15B7B-{DOw$9sAkX^z zH7e<11wjfLc-VnnEhjrzD>)d`;l+y1Q zQpV5rYV1Stn&?Q|=h9mgopWN%E?ma=eD8Mj#r8T%J0|F3x>>6K?~A_dUjiaX)<{OO z@|1?unv83$`oJ}(b|NLCQX(Z4{C)TI-k99|*z!87x3)~%8Ua0Q?BVRPf5N{1xF8G? z>6>pl4PSUCq;PF73J4!px477zk2*PFEL=&sj-LPWcDj%A{(XUDf$!h%vYN7+41W3a zE2;M&B@+qj8;w&v2j(u?{gxqBRtMD7Ktb~(A}|B6%Gi(dqCccD)D)CrPcHwfDWNJ( zz}s^U?_>>;2^gHc;~PGBfur}OX6=xUE3Z6_5cqJLVN9XZO?s7Pf;d@@NXUpZ7(^kg z`Q~IytuIpWq=a~1!m1Khl;~-E3o$>lZcIq!|4?)hKPPyt=uApFd<)7P0vB+z#y&Ap@&=kFdP?}!rF8F%zsIQZHzOlom0+!3352zWy=39qrY_9C&J#6CV*|%A@Z??!7cxb;{KoEoyv3!$cFD5>Q?G(PsSdEn_XHiB)#3 z$v#~qM(YrOut+rgGcH;YNEbeTOK0(DpP!~Qk7?8CgW9`T0fF)dSD6sCvq7?-vVRP9 zmeoGj%jjE3=3wjAyS3`ldn6V6?XF6a^nwj87_U|o3z zXyQzGPP-!h#)&&6^Q4ub! zj9Zk>K#ed**@>(0nIY;0(2Na(^e2Q}>!gg%lKZbtEf!z zq#V!R-l9oFa7?tVdo-H3gt+TDIo zi71X0BpUM#G!n%bNun9XRz|S&A?$fjWvH#b9wRDF8d87LH$g*Om#N0D@(KZG8cDuP z6ikU|mwR|kO2z@x#fI{h?&;a~#Zk2obW)xqfP{bP6D@7Eb$4v3huArFWxr@`H)Qg6 zrBW>G)Do6fWbw20z0U1U;pNQ47bmEYSn7!!Gm7&9>#OiJ#-9pWy+1#9zV$zJ>HYa^ zU`tfFjOt+S&4kqZCqlP=;dI&wk@~AuJ3Mc2|M)FIaE9_-Dqzp?vgzQq zN5BaiDl7q_3;Q+p)^qhU;Yvi+bk?a|-L?zpVd6L+N7w}I_x|aV*!>xBj2&E-PiP6L=x~wP> znvg_LN~{W6vwi6#Mk7Y;tu-T(P_u(lO6)uFXJUe(gw{_=YNkMI9;<#9ZZTu83u zI3LgRe%{a9{nTfF8A|%eBP2anZL#%}?Vh!)@g_0z%B0ZdUYY1pV3Lh4`CQ1Mzr#tw zzy8T4nq=BKYo0#fPb(0hk#!Dm*1PMK3ZdgDsa#<>Lkb%%NVQgC zIunqYsh(4ANE8&#){#?6Vi3f_ZFA|9@$r#9Ig&x?LzKgF2}P)Vj16#_ltYDBrf<1~$OAlymb8gF8c zkxDYwL^b6WkH%$=hKocewF^uO0lewkaRR%5ZvDQP?zqcdzOc|^ zzuos~R}4s@4!wVShHhA;Y3g;9{~E*7$gRHCn1IW+k{83QAdpnQUZQ?|EVl6oG*<>?ljz{v z=3x>-j5*<`6POOQ36ZVC?4Qqwhl==N6jvU30Gb)?rddd*D0G_Edu%Jl4uiFvH`z8W zXez%rL-m~V$TdbgHPJVQ89tx2)|%^!lLc97@ER#F2LUWsl_cu5S@<;h5L1CvA0h!Q zGS$;c#-%FpS9}?B0NXx_2d@sHP9=hR`vm1nf+2Wps+kXw%NzzK!)Yn3;)^(rR9~wP ze+@vH-B#3`1L^RX*~#=US7Xp&T2xsSC<@Ex{2F5=edxs(ITFcakWH>cNTPwp{87H$ z`iO6u5TGwtk-QN6uhMc*(8YUx;_gCVntrs=*OLtCx`Gb}D|TG%r;DZIqAU+=d~4m*QW2BR1Lx3ORc?r?pR&WgHW&gKwY5 zf8TvN$r^iaW|Sk}HC}MXg7Yf1U+|~uAAT6H(4^f)*-G}QiiG*k7YyE;J^FPs%>Bkg zXI196$c%lvqsoZ&NrBw%r$0joGnsc|exLH{I#RYhF%`5=$Z5#n)!CD;!dNjIlp986 z-!v%i?ou+Ij!1cFXnBr!0mh0u%0vUM-ux%MLapTo*!Fe%M8Bn>&4uCY|*zL{6M+yjf~>w z;XsHFr)se}!7ucQSNS7zxRul6{qsv;t0myy`ATG-V>?hm}tEEUhaF~uSv{Ym9c(9#t?ZOR&ztB@gVfB_eFhR^3pODzw7YBx>+orV>b9 z(0`E6V?rweaSHU1|J8#1B$BNZ2kPo?ey2u0E9&&PT)wR9?wr=lp@EiC3x#`^T2C*a z4jrn+yJU0SNy__z>JKG+wu(V#=FU`FPK+s}+Nb*F+RF70_fflI=O;eTB5G(g{%E(6 zHv`%@QWU9{IHx_{zJ<0OxfKv*WrrWuqrOq`OLE|NJ_r=gkJ)8!@&Rlb$)DNf^T>%I z9V=dFf=R09IW@EdNH+xI@L(K`KV8Q&UiBbh5u5+DcjVu7ki9L>k$-GSR5G*X=9+|Ib&41y!=cf z8EZ3lKHrZalFAQGS&JKM;c0MV)sU``1 z`eE)TGr~NhA$+~S;WPeWNB9rM0p&YxUp{13c)xA)>ghOL^e|IMUvp>VKAW z_UexgI_H>rPv7r{YwC}~5>MYS3k+2xH8+o?J*KUXZ8?s(lql^*b&vPIuHIJ^BX|2v zX?E#qy5=|8``L@*S*X5GobKT(B9^P4+TOQ=ZyPq?L;TmhlDAHa{JndhI&Y@`W$59_ zGq4`f*yeBHk-1_4kj;H~et85@#%vr*j#3pp>I4Jt+nVvIKfmSX;_C^jlT} z70C}!;~Ej;DZYH9pFP5XC#U65Yg8QsNYqd~3{);*&lE%p6->9AjMo4nphD?SgtM)*J?guB zu6>y+5JvzfF~=|OQY#L(NN4@gi_sukAJi9jsqvm3(TFZ*siLRiGhM8S03wU+@1^h9 zX-$i^pMw6#1S_eCa$K|#055R0k2s|w(?>K!8w}R#0ni2he^_wKr2o@F#QBdo=lh=i zPX|%`PXYn`cWC~1NWQq~7$^8%L~-$o**@5$H$e6ZxQ*N^1$VpJ88|mv+4sicZ_)0~ zhfDOsg!k`>3=2!*6rZ-HA94$%wI2!VH2u{kM;HSDRWgL2d$xRLzPE)%6O^_rTy5{|J^X)XBSr?Wg`Qc!?i zT`sd)!E3H*migd~#hsSfe6&11Mu!MTe@AW-6|f5PI+LZo4fitv+ zW0Ab81u)&fXK2mIcF)$U^)CFDf=afPkTs|FfOK>j@L zD2QXQ325fL$4C`|(lePvCx^<%u;$FX_>EmDKx<Ld^1{n%Xg~5`2-DbcbQ0tThR~i9Fu&MW-g|VIP2YOb> zoABg%ZNW3M=lRju%M$e9q~l+f%hQZoo^D0%H0EX9o1jBRNM`;FdkdF&#il2Gxbvan z_dEmKsfeVPZ(jH%NFF&5+wkJ{?1(pJ(__4O`@oZ_sSe-8h~96#a(i*?AE&liHuT38 zAEIf8hh^`6)Zg^Xy5UsoIIz=sObhZzT>MJ)%)?+#s`bs??fKllIlSqAKkb!#s4Nh1 z@n31Jb-AwM=#JcqZZBbczGeO=RiQV4_tX4-24weSF70qw3MQ|#lwO48MhmS z%Y(|+e-@I3#ve*0A9T#gy3RG+J~POc9g|u;JA36)VpZK=Ne{Mhev~DjcaClSspjLU5da1FjoE%KJ+uX&W_?;ll8XVm~ph$otKcqmATB`h1_$Q#`QUB?>L~N~5zo3Ayp|FMz ztUF#vK&&63p8bI`sZ)v(Lr8(G)R9s!Y;idt9a95|&W?AGs1(TIyE@}_gdH;F5SauC zm2)5jQ+ALaL*1w6W5{=WO$NhI;PmoIFtSb~!3TijgUZ2{eh&%@`-JnXY@!oc(Y6)H zHYM$9n|AI^GPOFFO**{EkqA5|hZdSfR67E45DrzhwKLH|gkhyh-(8X!e3_;&D{vZa5X|D^g_+*z_C z5r5PN93Rhra8st`AJhwjTryM+f>?Wf($MZ|ddn&{Y__@GqYHOjHtDnL?l0)vAll4) zp;VAG*KTKn0Yxml`}6@C95Dh}LLxS1lT2*W4QrlfT}HL5N10wZe5*>#I(_L$rJC8% zj$Sz5Fmf)2SpaL`k7gzq2%6PmLb@_|_*PAQxqN{s8Kr;2W0C z6rK0^|0qPGLk1SIEVm=2*M@0|Z4R5$<#bh*d!}RajE$C;%C6C4F8AfAK6;vd?q2Sw zd8Jjyqp7}4V@>^2{ORy^hAlYZ_%_Uz>T7_c3DC z`OjX->WkY^Bi}zYTv5Mj5v0-dKH50H)^pi^Z*|Agfd|@mII!q<14iZf^MfQF*j)5V zx>F2pA_?&_CG6U;`_o{zzMnBMo5NRJpOY`%KbviuBl264z;!rZT5o|6Kjg_k#Ztt|!fT4~?aPKo9Gf%8E-I4NV8Yyy5xf}MFtoR1NJM7H|UtNwG z)fJT9JMtW!pthHO>+BbPKKbXri^gt<52s#jFb_o#adni6Wr74xBD0hhIYuh7zQ+`npYon2q zf^<*=ii#i54spuJRn8VLq+|m$%BtDVura9^U&A;n!wnFP9|ahn5^N91>{hYy8O)?P zSfpbN#Rao85*QGXEa6GMDa^*Wd@^PhqrU4}L(<*F)ZNK9$%dkUuGO&iYd zE}|>}?}g$zZ|cSgJOVT-FnQg^XHs})UhGu2D;ko{+=M_c=Q*a7+MUK9-n{;MI|=Jw zo=DC7^aji6q)7mal^8U|?ESA(q&ZBYb3OXOA&1TEx$GV0wPo|#k)mG*RAl{_qS$p8 zs`&|dhSVL2T{HIbUB^OC~qphi5n zWT$t@9*z#d(0(n7Dl<36PTA=lQ;CdsttTBtbZp@O;WqDnE;Lk)Ik!y{}B@ zp~kWJa9J{vsLT%=2~n64aJB3+7BNxL@*|~!DV{W^rhGpSBu=k2vvaYDzD$wj_~LnR zQcF^+UsExgu7lwBF5JPwFtkFwyaT#GPycsDUKZsZ4Z!Wu2HQ)3$_lhDa=x%H;o-@^y59bN)cb{)e68%g6ECM)EH1@fRAsg4 zK9cEoHL(mwt>Lf;LV;0Kw#UW&*3_`FgdxQKz@hKB*YT_UyZ0;pqMWY1ynBlAxKMn| zFL!04rM`22){kex5@V%D&?Ra{$Ep{DcxH4yWT+;fIbTS22WFgoGAD%*I^f_5t?jFw&GZ{^wNWAFs!4dA7G>3aXxl|5^F<+x>VH z25;th@E+QBI{LBi_yK+I!IfvzS6j{$NV|>|g`YN`v+YBIg%vI(nBN{~;OOp|re4zExP24B@@&2wY}eeTwt z-TwSi=Pm^)ztFu$dZ|~>Owo?f)}@(h-W-8I{L$|w;AW9 z*TPi`dox1pQ30u@FP1s3-ZO|``Zpr#W&WjTc{?V86=OoIM=vj>%^7c zChId92|A>Ae1)=u$jwNG1KF4sEkEf(#xhdaL>N@n{PJ8c4D9vINxffjn3eu0b19m6)Yj}- z4|wexfXDwlTGLG^z0|NP_E??;2*1HO-V2CpB?P$}(b`<3FnTvqJ7 z_)W7y#G!Gw!t}iVPhy^DT0zwQuO!c=A7)SdYJP5~LW#kkERMJwc6>%B z`p+QTFZUss5x(-m2c+^EUtkEgw#YOcz*EfXUBw z-Wj|pt>RpLBmZsIQncJTR*3) zpV+PzmNsjT$Z-N|43*0ov-vPFjc%kih%ZJ?*3mN-i^sc#9ZpfPZz+Pf!on1XY#~8# z1fmD>APa=ZtIi?#P;Av$Ac-7N5VmFp>`>(bz_UO!9~nzSNY0aTA61}|kdcE$<&2`7 zR(eLAoM?J7(xF18P{O!e)dC5gwAU)Drl8f`Z)Hec)7&h*ohl$h ze2}_euDyeVcqd|;*u$8lHmc@XX7k0z4SP~+rb}ibSmWn>7sm?l|121J|0g~0@s$9v z)?9`ENe@c@2@e0;6#@V6iO(ptOr)s_gs6-QiO=qnX_T&{>e{aQc*S0GckhQsFss8a z1_gL~d#y)YyqINlL1ip)N$z;mk^y{h5%#WDEi{-sg)%zm8w5~Nqo%?+3kY;;x zkx5uv>2^MylCR*dE=O8D$0%P#`cQrEt`wJd+9|l5Iig<^=t1r51{F|SO$gn}GdiHnv>rbk6XBgZXQJ!6MbGj^uzqmr?1R^}^^=w4pWx;yb97hr zc4;)-K;P)2=3eh$dpi_ZzRZ;N^6e%M?)m&gNmUk!vu)ej-g2!qx=6idgj{3Dv&EM1 z;c8I7cRr|kgNA!H&XZdx6%=$mvYOx475nj!d?6Oh&%To7k(79i2#SFuJiyT%g$AK! z8NO^9MZh+uQHe%YWEt#pXv<5#ye4_>x%iz`Rw83nrzvgy>F*%p8vaLr|`6)SduH*_Uq!` z(_Z&s!=EmWEgbh;GfSv!dpPs#Q(DEGe7eEjqi>I3M+*e=HdD}}8<_chKit%_ljhOa zw$B-yfE)k9xR2_4Tbst1X^x_iOMo7t8Zvs>+FD zRCRU^O)UzG!hE>G9nLB)o5ngVXq03(Yz*Uk zy=27q^< zRZp>uyEXW2N3?~AU*e`Pod1!GM#6Zt`lu?bu-b6bGFw;$CMS_&Ent!EP&)}0IajD5 zUken{S7UH%_VoM#VB+grPnh&ftCL)8i1|fcE)c zM^>*Dxtdq~&3jZe()|29d+i){dEO+;uIrGDwSHL`pT#YEyn`x&2AAFbJGQ+&%ykNh zEqS<8{4MEoXASPzv#QyC)@=R`CRly+$k*oC{t}Y_m#Xr%0%C>dFx5)#o{27>t-XJ0 zIQI5T-&dtKWS9j{4#Jioxgv!moVHM)+$Q|imoue~wzHOyxBQrJzaV-(N#cH=iBnWM zCfH3UydM3%ZtRQ^t3A1e^%PfAWpqB*t0|HG%_M(%JmBd2t4~R8z>y_e0!f!|K5(De zZRWbA;whQBm5p2<4>_asmnx1J=2cz{ zWqQb&sOZVRqk68>*}yd4`|6bYab&146z@0J*FbZM#v)NpcnF6_D`du3u*soRd|n2R zQdpT>Cy!4Jes59VYD5<9ZRHP033%u%u8BYV&~4`)}xC8+j88&`Z|6k8>> zyRCfkG8-L~)cCt&)7^hgh1r?dY$t&(EqY13)tRfbBgKt&^7PIYmt(FLWf^R z-A`#Cy*6sR%Q+EpGEk zv;jnU;i-oTs3Az}&!-Oqz!%Csx(O?{b{joi_m1Cv-o$tz_kLJYzID65I%<35O1Rx6 z&B1wk!;tG_yK3%dX+1|!R-V+RvWe$IMWasT^rX+{)m|R3{^K@P^8Azc{D|ivR?b!a zzYyXXTyW>oU$G)RyU({H4hLUPLf|G2Qrl=f+T5Fx3meQEep%U&@U|bmZrZo5h)$z^ z-xZC0l@SXkMBXm*pR6d4RVz!i3ZLJ;zX=hB(M;LjV;*RO!^vZ1JYyphJk@B)Et@vJOWEB5jDuV&~1Ih2kCJ zG$G{zTcH0Ejrp$$0Oa~>gii&(APAA5P}FcK{a?zpftU~BRTEr;kk-axSBtpH zBb+W2M=(Z5=bF-h<*t z%rM_r{t7WJ@to552llv3r@Qd+`)$pm#l+9<8EWJ7M)<1RAv=kMOc${kS_Q{f*BZNl zBR08Xo>r@PpHQAi;SY>|mU##1oJq|$O%1?Tlk|yyxbiCvC`Ey#Q^$<3lfL8@7_-HN zY&~+=^;tnU$;n3Eb<89cTW0{eZ_vh;)JkH)gXaBNdZtZs_$}>f6kGzxYVvUDI<^$Z zMtE}?IF+1yJwH|m)pyFEm8$|xjVoRm|H1N*m?Z?wMDWPiterJ_Ma>*C%_P|X&Zp2Q zmABgwrF>_*kz+e{zC_}zkA97sbp?G2wP?HGgejD5Bb-7bmbW=5Q1?Y%>Iajg zuK*LPGyvht>SH?nCiDdbs#oPy9?N+fb_NYK?qSTYQ zt!LqpN!OL{+>ieqyLo!>gVw&{uXpj?_!gO#5Z)8l_LmK>APNdlt?f6_&J#oOBc-S38K-#C|El3f&RO)nQ4EXa6U7x=LYF`>tqFN1 zFf$oVqf>W>dRJkyKRbReXvUOU{+f<|{qf220_uh0jnAr!7dDLpBu^^ekXp=HeUlTL zr{ci;yARX>mb8GlWj(wlTy`7HJDdJGXM4gQG4Xuo-u5so(Q`k2$I_^bf*ZRg>-+blzMySHoGjXHtXRlJ6#)0+v%d|vGeAv~M-aIeO z?(Vn?br&4ra0TV#$2WyP@ycIh<44;19mauIyH2cOCAyD!kn0f-D6f-Y{FG5a0ooyN zZ)WBhLoMOBREA7kRwM#ybPns}CxcZgp*b89@^cCTbLk?b5`;5msz_Din}xP|apLi5 zs8?xpl#oB5)X2ZOly0snywWECv(b7&kGEHX!$1~LNSf>b#*!XqnIRF4#j)f-7z-q- zjQ^{&A%3@EC!EvcuS)Zu*4D_e#vvsgMDtX&>G3dvXi~YXaK#3T%fi{KoAjy5R6DY- za}Uc6jWS55I1*qhdm`I5yIKNG69;VDOX(10WQ4UuN0PlmUfMQ^|5ya@Qw|;Dl0>cg z=&{lY0+J#EKHfgLw+$bREXaBtKRJHNkPfz8{K8$2+=?`<<;RSFfvc&;nAnPF&jwhJ z-f<2b+dpPfBQxZk_4y8?cs}yT5#~E(5z_2Aka-onx&6`W^cj?pYd$xCM5>r}X(+DQ z&TF%~Ywy_0wT5OR?=qHvKg>jCS$F1+joKu{G>-1*}*NP*&&;NoteO3%Iv0VU92Nw!+3=)WfIpRf+)>OX1ZsnmojH=L4_za_92{l@mlE8F zR#wUPpoHE5cK)d}Le(s}jpa7na<85gV#0jDW1IN)ZV7o_`-(J2q`)uyo*=Lr8YfIeQs`*|>mksXA9fO*k>=qUIRGC7}GfOsJ*&HiH1sY`E&IRWl zxJ7GP!njM!=s1+%UP&(8G?vTH-!wf6NF~gnCMJhcI~_?2ck#?qd2ZpW@wcwVEm~tE z`*fd>z<}xIS)mCv0iqN4FD_1|gy8yF#yq%DEDr%ASP+qQ@>Wrq!UE;0WUX}oC`H)( zgS}`16$UCPXANydE7?uJ)SU~{sH=VDzU8iYal!OJS?O$t0Xcq7v0%0+UpmMH;(Gi9 zq?3fiG{*n=2cW8|;ol8_p|nf+kg3X|49zXK7vsP3H1$(GKl=QwnELqZbbp>9n|iIzjXwkI)5fQE3~o(3#sUkXFM3~oUl~|| zPC06wn@@D@x55RPt3&2@D!KVGM4~(Fqv=8t?2oO+h*<}MUqwzZPpc;!K;zJ}wO||E zz*P2=J=M;P2QpTED1`*K`0$KlA`EiS_yTt>+d`hh z$_2XAkEOTCn#Yp;T6M-L#WhlV)=+4!q41TIczVSey~X2Xg2T^He@fjjTt%Gypf5HuAiG`NaYS0H(k4*HhRr4JVOW&6cd>ldFz%Z{+AJK z>Gf;Je2U6#pQ90`A(8pKrTqJM+^K5)cetC~x1MdeQlEVxrr*1?;U(d|Wcp$G^825t z;;UC&z9EJMOym znZCRET>7KqE(b=6PMqY#e=p8YeRTWfrEB-?yg2pdqT<)zPAPm3_G0DU%j?rvReG%d ztlcekeT4VhIW>xND`FkC2Mf(d`W|yA@Cxg`ZG4DypL}d7=fK4=xT-Bfv-x)`S7`Z@ z{m!{p zjqSe8at>9o3^h#d}1mK6u5>OPfwzPbuu@OC* z3ABLbfDnO{>~8v#Y6wA?o&g^6@kxX@fHiPPJCKaMuwFI9vTCM?FC}0qo@(TECn`w^ zB>3YtG(={=e6y62%FH>CR(dk4knf~SvUZsjP*YXZ5Em{}?-SSGeo8ZM<5EZ1i2DkBH-*It3JIVsFv1~gb@@R6du1Je49VXOrilA zU%XaI5ds6|lQ6*@6-mYD6U8D~BvfDBvpj>(g(v3PZn23qB1s=rt-W5b6jD8z0ps$( zwhFnLkrxK;h~`JW>FtEuSu-b^#;jEGmakJvcf8DRqePSy%8bT&b-ArgppY|fTZI=Q zR~Fk0`YDCE2Eipqxd^+F-q8-RYjx99cgBvc%VV!=AqE!APD^>{HLuio-+R3~H&$ON z*3Ze=Dz@iCdD;ZM`6CVguI>Kf(Q5jr-28+2?r(ifpvo_b5f{*$Gtg?obo@Ns;mA^} ze5LNLglpH-M%9S1tJ!|vbDiyvEHv0j9%FNtrS^zHK~u*5Ae-U4CSH=3O%!)D^|{ME zYunL0bilk~Oo~aVQ%b;`g{h4?5zh&(Unun3u&;BWD)~w1GGR0wj3+mlACaqQ(=n%~ z&unsjM(0;$K=S{Q}zL${7W;l(WSE5+JVB~rd zD0S)GMOT$-8@nJa0AN*pYBE>`wdQ?j~jvvFkL2W5vQw36ewZj+bHuriLm*v}1 zlxW2Ws#SIC7ju&HyW-F>@oqO%(H{a81d7GM1 zm#4oX?)<#rT;Y25LGQ{9w|6(F7t)Q}yQd^)o<<*BkaZf29UmI?^Sd0-VG)_|@TTK2 z^YV31^mE8`KTzpQn9U)WTxhoZyhe)`7@7R4Vs^;3ab(v?*n*tf;&d}rPCUzBl5A+K74tJde$5;DU+fM_T>>&n9tl-wbaA|YaEtY% zL4!a@-f-XZH{l~lX`<=Ry_MN>pSkzfAD_aEe6P`y3L_l;@b)E=y&bbOk}1sMY1IbMve6O=PmKG_4_6}~e8aOuX@UqqBtlSc2n}E(7Gsm=uo69e8bT-t zJeZ(>oQ2VQ$^?b{OCjq3JGD)MZH)}yHtpOC%;a-y2wGCEVB9%NAxpY-CIQM6h}Y(G zui)9%J%t!epenG=@?hPaE;iiZmN)wB5KY7J8nLte@~(v17ofvsdXWj+Cy$6e)vH8N zsmCA)E=f!Yq7WOWR;URvfkoS~h3qyO{!Kq$wy2pQDc6-OtL9`}4Is~ik1{Lxm7piu z6eF~F5cSdEv0=^5=>375$`kJDcXd4`xVTrp+BF*4^Ct1`Z~bZ}?v8alI(#J%nOd+@ z`j?q%UN&9blCl#xHwa!ormt?a_c?~xdy#xdW+lNg_yh0Al?Be zVn;L!@9yU9J4PlIyJB4ZTd&W=&?HzXTXe=cvQGD=$u9M-K_@*bzxna=HNDh~7C_+$ zc`omA4Ow5kL4q$Z4*O8KGB}!sHqL~Jhm()xqj^+gf%$H1O)fmP@={N z_NW&EQkT#@IGY7FEIGI(H^h}g$(lcOb2CLf89D=YZK`t^ndDocjcxe|&R&B;zeSMk zdu(Ky(_KH!2D#zSvb{Wu6m*&3hDJu9?e%GT1!ZhGmw&}b8--yZY`1! z-YYOr*`hGc3*FQGsu9Q@QCXI@@Oxrz1t^br5w)}brzc&+!@WCiwCUl1qtN;1l(90q zLX=fa=f;ztr~gj86>-Yz$XnSf+B-BxDV6WKTx9ysjT!V`D`)YmV}CCz{(YhJ>h;x2 z3T#eb@y8QKe@6d3<+=BRCiJx>Il_XYcJtL4VvyMDiIXq3BmVMSR;r#3UWhVJJQ&t^ z8e4qv=FuB|+K=ty&WX6|UIAWlWaycuRyD|Xoo0UNeB+c8`RgCky+>n}mRyusLv{g- zV?A=K^YK%!lGyHn!En9ON0=C|r-Jt!bIyd$zn>BqZ_d?_7_uxJ!VwnF zDBC}7q1r1<8HrON9au5yH| zhR{2A=A*inCo|$EoZS_XvdS95<#w#9^0qz_s(#fUn_$+fBz!XSs{#j z(aQzPt;zE>zZ#c*c-%ce8ZNG>BaO{L>*~dnAjTF=OotvUmj7Yg@jt2KO*5%(zma93V zK1s|pUJc!BK@T%fx|H^D?}@bj$`EYJ7Z-|r4Vt8^$K_RyRm=^XE5j?O&o-Y=2D)7? z)xUIqkfL)JK0aO?dAZ3B)MOSs6H_rc`y>#SPtb-~iBvh=ePg-o0%L2*_Xd`?ZnmQy zXu^`wQZvybxsZqhA)bAeRD|`W;kY1ku8Ryp$)QG+{EEq;rZ!{Kh4Qsb0cx?edrvo` zFkwk5bxyCTkYe+WPFWmoDo%Dn&&~#rL5;Q z7I>St9lIE0t=KxR=j3Jm7oLZ_2WqkI-jkaNVpniJKOPd64;6XEA1UNsUOAKTSI08z z8fGAsU9udYO)TL6rRFPUB&Dr*r1#SGYx;TA(WBqB zH&fyxZ$`TnH4}=eOjkeW=iNq)KYdp+Ut9)rn?7%w=Jqz}Q*cw~C<+`3Qnl;b3uxL5E50LK=*q%96;=^V3pyJ_CouMFC2! zYfLB?4eWS?1BcVw-e;};MKI65UKQDdcxazwd|6m0yW5ADq}8nfwO4VF0gvLu z8P>v9nVFdqEy99M53DTzpSsZYf9e8=|0p*1{Pq9T1>QxbMCH`{vtCWbdqSGjQgTc{7K)3{Ep^>!8f_1F(Mh@VxMM57x`o5d zJyK6z*c|XhnZ*tukz{D8m2#{l=rmtPiq}acYZ2+I!PDL zy;gf0I-^u`20I|1<38bGhsi68HVvHGLAVs2bBM1?HD8rPdl6eX!(48AO`42QD%p4q zJk@60G==G8>6rN`(S21sr--Q8f9EfwQ96#N#Qa>JvE99~uI0AFh3tz_>AW5asx>s& zM&IuUwwIc#O7n2Cu>}cn=^o0+EL7;?oP;!Usk@boor~l$bP7qSb1dgjL;ZQ2&D}W* ze_Q){2#QPfn6>I_Rf5w1G@rH#CVtwP6R@Ug#|e9qT+9>^KqCol(m#47^e=9(c^jM3 zk~u0CJz6<3G$8=!+34GpkMgg?;O(GWcm8IDHCM;QM%GQrmu7sm6kQee@=N`v&B6J@ zVLQi$Z)>dHk%eVda&wZczejyj{_k83ixso7#1ns}j{UqaHg08hec(=t)!@r+QcipdKJ@W}Uzbpzo`leKRW9~hYJvAlwu}C^3&)QtK>mFC1M0i|Gez(y z<%Hza_2;|4FG}4`1(aA(Wq3FIYO2zNLr+qml zc#Bf+%S{7eIbUzMXr7T@oj=B#>rH(Zu+&g})-rdDIs!S=0(tm@k?r`~`U2fJkfqvW z^(Eh`^`b|yz4`3%Xw8oH7gbl^C|}?FYM*E@?AH=M6r-CuyJ+EhE9jUuRBc;a(TVqJ zPYb{Zh`@NI91IeY?l7QHW(_W+*=O4cu@kE6 z1O#m~#vj7XlDh#GV?CDqQi8Qe0n7R#kgP&yA#Cjf6u>ImSgSHyF5AZ?7;9TKZLgFx z>?25l^BoVcXp0=@|IFAxE#_2FHvpkZW5h|h%G8`kd zzUtJu=qwhVp2N4M=={C09g^Z1c`x64>N3yo5+s7~)b23i!NIN$Gz@1Yoa(7v>B(eu zva`<0%!$wc-7If9T}~&qZ&dU3PZDs&Uq{^Tn0)tfZ}{ODmOug|Z*aMUsy) z3SAP_4b+M0VC=*A>ZmG#Vb4(B46APOkq6;V1&zubR;JcjU>7gt_xaoJwB%6!!nv=CkQ|jY{JeIV_>%6kiJJJ<}IL7;93Z z^n&p=V9?BzF%K?}e9u^Fm5x~S_qb_e`*H~d!Os{Yv28+BR9|HrYmN$e2BQkNiePnV zzQjIJx^J;9hmMG|-_sCEGs^sa7fs=(fnUH+VPTA0^Wi-!LKj;i&j8`^{%N z9~6I8Nab9b2m1bV2{a);eg4azu!SDlZMd3a22so7%JZL}tLM6ALlYaZW5Flu9v^qO zoGIFZy0&y*A?K45HsjZ=s+W&3GKvo$zx(@bZN~q**k1M{i;x=z-)h%hC9Li(I{$3x z{y6qcQPKJHK`f-eCCoL{|6^&^)b5E!t7^w!kImRWZ9&9#TI0*N^|*gx!>^WK-_?cZ z_maQ<>W%%U!X?A&z`x(JzBWTb))OwZTzH#wSNf)z-Y*Zg3)`Th`jyIF6+hDNYy-o*kXtaoL5da zZy$`dJ}EkBSR%FC;C+k>UtkIV$(Ukqft_xN(%`C~Y_i_g0)a5y8DzrHPv6R?N{h zS87wOwCv&Y{e6GWa~}uyb#cHS{KawI=leX*S5EkL9B4~Hz6zM^JNGICG*uPnDXW$Y z`GoVd6FDm|y;H-lqVEyU0P`BmX3NTEMDadnOSm=4u5tcs8bCwnov4P1hpFjcjSZ4h zr3_!QP>&z9hwI}}QC{#|V*qFDxM8><19y%YAKrVm9tacB#TZH=%PQvSAq!wGqrHro zr!`x=Rduet4BfCY3QU^4e!a2EruIq0oC*9`Pscso;~v^bM;5r3DQZd~`hT(CiFIqXWmDnTyi%UDw`jGwv#v$xcN%FvZDe593Vn_!a4d5f zQZ?6hP3>&*$iPF5B-)%}BJw&?ij^v15qHF@%}b5aTH5-$YE3w$+-WWycXyoUY^A5y zJKhE>UTDn;=-cO65#wTT@STchn3k?WP~eLW=;|6-NgR^mA?Ie}hM-rXNC^KWL8{vF zj4kIzeAA4|c9@&#eq zM==#`m=!9^Y5ZS+Jd{8{;A$Hra9Tqt7?&3r?k!35=(LPOsvH@&Y7?ruh>#0Js0+{w zD@mRnBr+`osp!CZUI>`#?>KD8+qz0;5Ja}mbkKGR^l*3)d)@{X939|nKpU*WK;bOd zxsKX&vn%*@ zX!hpoFA{u@@4am+ua*8MTs1@^Dm@~_ZcMsvZj{a$r1shTOck4XU|iy<$)U3J$n*20 ztwv*XzLfC|)ScDfWcR!*zB}o?5rVZTU4Mdqo*Ta4AT1DRrKEFh?qr<*Rj0D{L1JXd z!PEWsMpkeBy}6%H`l3bt8hAr|`R$(D@8yd|wMtiw%j)NQv)x9Xd)mgz4tPAWRoA}j zR4;Vc4eL*UK6!@G%cm(`hW}~WkDaG2Lwe;oqK9y!!!IBw`T80SvlXP>1>5kb8Z<WOT37&E0bX|Ma@j-&Irw37--o%%bQJ-jO1Q_iF z$cXUrYz=1Bn)!^1h$G^vc$dH+Mn-}vh!L(=i6BT>*JJ6l94iJHKo$@)&u&=F3kIco z&(jUors5E=%m@oepP(;EujJ*GN-|^g<*@*VYo$v`8)VWUG0-Ire{tvLS(K3N1;U}} zJOBh~K#4h2aG*_%7GGzw{GxA9srJJhJM+Z`#n8vQ3eW&Z z;P*dhVtZi2(-6eK;eU7Hww%^Mw&zPKeOSH|L7a9u40!fS*;HO^(%=DjbK z7V5q-T*ZVfrG=_yRK`k(R%E?|} z$ljuFDfuU-r8=bcE2NB{cN)4myk4y?J9{)g3>|g9 zw^?3}2`hTfk$4R$NL82^ z@9Z$jZ0pCooOEp?c$Yp|^PA}sesPv!uX%cB(j2xYzuqPseq%V} z)xOyDLSMIoOvi_h%mE@n<5kO#cabGgYOPD%gpxsR)^_+Lw zUe4DAhia8UA4>$^O>;UV6TM+nePB40*-VwyDI1=UWCaWJjm;`wl=CulNakS<(_L@i zL(q2UY|}OXaz}tA0d+nAT)_i|Gf2f++T8pQ8w9-rY+VMr%^4pTE6!VGLjbcR7_(|6SV^NT;w!T4 zK^PvO9*?ea02?VBG%jwYl@Pxj%gdk(a-V;6unj8Ea@p2*G_YY7z`+5WmG$iPj5R~E zJn78v7pEhezs;&GBwq|NqLu2whH~U%PbE0w;ZqKDsE(|DTi~Mt`0D zw-NsDHgFA>KxUyICftXS=uswRK*KQVclU3FsWUHLOthbV`)!M@Ev>RAJl}nh(o}*r zw6UKKVRZ?((6pS35*uvD+5V_mTY966=Bz39A|SccBU|vzjYVrhdkV;JPr#_e;(O?vz@cLVJ(tXEC^~&Yx_oU~iyg$S& zhdu<294Zxs$W~#qM0!eNM2FEa0hH*Q?prr$gCBwzG!2pqgeYKvX_Hq~2tg`2b+>e@ zTvLvY;Ik9n(o4D(BZu%o%iiPh<82pm09MN$yh8dvWH#FOlA5k9aBCnVaLyAh`WZgx zbmC2;K{dUX4Gk`+60F+P_i{C@)Ji(t&~i+hY|(;G zNRAk>-KnCpGVq!X*g0B+&@ikDOG>f1#?zUSJe7A?DCfYB04IWTVgDRWp?_aA6;5T@2X&H}M~cj*Dk54CmUq-rPW#`mN5gZ6T0*PFVwpdleG z=S8B7I$(G6-anlFy}tVR-6|8lY^|;IxZI$zV%7Kan^tW71@6p0X`f~a>kG?e%L`9h zzjBupO1>Q(1N=R(cJ4a}Y+RMLOuSgp_3!=b5Y*??v$o&fUW_cYwY&no)1eZ1O|s=} zL{{d=*qoPRIYYJChkap!od*jzO!l>+=f4&@EB;U&71XS&;Xb|-Ss9TFaHNjL6l^1<6h!|%m z{mgYD)gH+pfYX|?2J<^TubEFq8si6e9H#Mq9%h>1sdJR4C&CXnlm)=>y@GUTYyC+26imHZPn-uTtB8P>M~9 z*#yWdq!&C$ky%Sz{x(wlr84>5Luy8r|2o4j0{*7Qvqj~&(nqwfjdZ23wBJR7@LJ@e;n1#W&Cu*6>ejlE?)USA`$ z+O|k(DoLV9i|rne@TM7Z@HlatX8ey~X#*tvmYk$QyD|{`5Rfj!cdyL2?<%S;YM9Xj1rcOz-Mg;I(tZNN2!P-M3pv9BBD6@x zq0v4T6m)Bmke%fahQNrYk3M)uWM71@&vwQyE30rsblT&9eBQ}!qEin@~HUhMcz2Fmti{iffx$wf<{*b_Cd(QlV z2i|un?HMt-*Kt&S(|5v|iCc_zHaWdb(ifZ|FOH;q2|D^KazFpC;qITO(_@<}GedttY{n1n7q8u( zC8>6`IJLM|xx)qIJZc}hv%TbrmopQ(r2n~vG|{6lP0A<=mb7Ip zuPm%vsw^VGV)0Gje0=1q(kLwI-LKC#kA05D!d@1*t+|BEV-- zEb-prITeT^dLAODDaZO@_>h)$QIQkdW9X2zv$==Z-^3~t9aAx}Bw&CPlYTR!J10Mo z(2?WJ!=9s$g#&Ni{u~=ed_QDljc1UNVFAR_#Y-Lr03FZCpTfq;;PHA`Q+(JE;Kcgo ziMs_S1sw6Wjpy?n+q4_LmdW>MrB~QLz>G-`=%be$9AvSYBl<&W?!0`Z8m7LrG~Z+C zU%-GxaNd_&9HUn*1p4?O9fIVIk|CYJhqc68w6G;$`*}xSkzGs#O(be6RFP=Y05ukx zZc2eP6wDy2^91r-d`OO*k`xs~n>DJFSsjP;NNKJ4I2o-FT<+B~y;anXt8Z&dBT=U9 zlzU;6Mx&j!_2MOcA7`3c0b@j&`OD83WlF)deAy%+`7US0w+_`ErLMN|yG~3Kq;`R% zxj@II;WWW~eU6uIoiB;47?e$(=%NXaEE;WzzBQtp64(y$dr{RlKPG_Q`c7(ZFQ!+? ze)l*YW($rQ!K$GxfqBY8ObcvO0j3=pM)lMROffe9S~umQ17!u5j9D#HWbur$S8Kpy zNbx=nmc!Qk;0R1BKEYEEOtA$~M&P6sy2LbWjcgE+ z03hV%i>WRq#1g?sC&Q=oMvXP7tlwZ~`OslRG(xs_dau7kd3WpMs zoKPOa2oX=il4Lzpz=l91I2Ge?miXwtO#gVx!+DSzwsPJs4!jZky3lr4 z`FqpeLpF?xX=o4k%vC+__XQC6+O~GtZgt8G7#j9xeoAAoZ)AdXo zb8jncuKU!A2Yx@hg0W~i*GToVF>8x>-NZBYZ9y-PGWdu66Y+-uw=;O?>SgIbuE2ED z-768e(J|kgTbVgW^Au-lO8?GeO2dmnnfRaeqUMd#H&5UA=$zjhT$*{V_d8X!J1p9mPa0h1)lqTLeraQLBTx0(Wgcu~)cW z5gJl#yZOkXB9{WO?^5tKkf;}unPks+7pS;%$)t%(gn{F#Xx^DZdud5SLtI<2gd|U5 ztQ&+6z{p^7>y_rS6hjyk#s)7jq<1cn-t~q9Xf2F9LO|F|8Do>_C_ZpelT~dN3Yuh98E;fQ7eGK+v!#&; z`tuMVJ1`vugVMjcAR;b(AUQwx;uukLR*@t9Sxx>i$P6k3)>9B*W6Tz?PynDM*yT)7 z4i%=h_H5&}*p|G>201n$&Z8jKtAdNOng>vT^BM%uPXmWwlQ@P|dZ7Bvb87;Q;%_Lx zsXsjfVp5#p_<4M{AZq>E1)mK6;mea(@{2Z(HoUIhF3{TEcI4ZX}`1 ziY-u9_V@VJ0~`Hb9sSkuTh-;6Ggq%yTd0}8^-Z#VTfZNbuM_pR?Tqxp_N@k?&&QE5 zowqAdzaX1LEcrJv^9KLR>CtmT&#}LLnI7_pO}$O!yTc~dy3Y%qp`wS)9vGo5o8) zMt9*j`P+ifWHo zRJB;dA}vH4yhyaFDvUT*upjDxq_;mH(Sk9;7W_l@gE(2alY|hxMr`Xc=a4Fo=Evpq z#`H_3LVdh48UQJ{fyvzbYs|Hy6-ARTc`{0O3(}{nLSC&ZeoQeZnooYL`F&?!`}(6l zrH(yyzW@G3+37@|=7&8Bxtv^Tv({aG;=XVA4f=8BP84{RHgyzu7r)+d`P_s3ikyF! z@-LLo{EhK^{j=ectsNleyWP!E$U}axP)G;rHCXwIlVX6XnDD?`+Dv&PUJ6EoI7Z>t^XL z=lRe4o_>-mWzYJ2nU2i=W#zt!p)*X+&Y;kSvM)3%0`J97ylVO0bHYZSaCELF+NzkQe_0cAWduK$i% z^E`|iJ0Ze~2^Sm%0$3cNwlFO*$T~h>LxN9&oU1CsK!3E6r8iEUXEUsuqgPKQ`vbr% zN&24RIW^*G0eHRIxr3M0bEN19(+5V}0n7)o3Wt(tM@GXwebd+^IG%tWhpPhXt?jdB zX&{*-bh-dMQArh=-ZU|5BTXOxP3Pn*rPGwKvvl}DEDKZU|B4}lwEv`#|4$6zqOZcD zIn*=7MTLZ-ik^=DWRNGNW%R4GtiSueckvzXRav#<_+JJO?}&Z0M7`*{{KS1*c=U@h z#&85I=`QwAuFU+sd4#DN3Y)x&C;knV7Yb~`_AVPV5*rD4sFk528y8XXrmo?xr{&%L z&}ixu41W_&esyQ7{^`J10gujh`V@_F^< zxAFF{^t1PhI-@JAFPNT_^$6!5d(QI-u(+ZTnhs#{oo1HV%l1riT;!(w=A;fi zM|L6d!aB+z`j&Q7_z4@=L5P;#vw`(<(}$l~ZXh&Le999ruVu)w-Y0eLLo|9S+}w&d zYA@U%+dY#>)?+QdPZ*iF}Wg~>)-^LnlsSv9vTj^BKF1wKxAnyXAqrsPvwe;vhujXj) z?Tv{aBiH!n)C1=nD<0$?W)1lc+;(2MpL=M+)tt_I1MYLC`-==bk|8dq&m-rIuoy*D zHBByD7XZ$>){~7d)=T+5C#zE0F>fc8*3QffZ^K^Asx|ve z=!9ZyDBq^&sf;Ehv7>%N49r1{Yhwlro->pN#5{Bw43V&GPUB)>!`(fw6OyFe`)Jpb zDg2YqjrF?Gr-lz|#MEZED<|WsP!7{$pEIuar<%9VPCs=2CX6v3ZDr)h_E3IhCG5$B z@%PZTV>45Lq*t^C04Co9SO5(AB38pWH^rfeA(<dfEN|=` zKd!kVIX(XD@!jxW-+oppUt8m^P56TDGm>WVEjk*^={|=;L#eWOJx-Fov7GXgtrO4J}S9zsP0GVM&B)aNO5>H zKiZ)=yev}hwYn4N9Zq@5dG=_j5#z-37W<2x^avwRrH-MS7$dOlMOI}-qKb4GKZ3W? zg0bzl;}3afozzDgKmVA2Nd0-o8(Z`E{G`;}m&*#Df5QL0KU`^!P^%mc+}$z*{xNci zJF*pay{THlk&h|U*qQ+YZ%Ud3SZIP6#jQvZlQq@>5Pu6e%v4vF3IH?q&KuNr>q~f? z<3YVwdiLOO;F5RN%euiJOkm$p6MjMT_rnm?& zy}*nO#o5|7M3U31(KaO?oayE8@VWCzU|khspVZ#7;bh2nJItFY{q5g{9aV`dO< zzZEK(Twl`KeCO38v)@fIUgEm?LN;BP<$)`^`Rl&U)sm*CKIb-GaCb)=Bg2@k-TtBz z__o4ROIZU4`4GjwF1FFLLkJ7;dMi;VDcN|LCZD8VRC~SP(NFHjf4@3?pZrz}DB>lc&mpAF>E zcUNDlb~Tho8~b;Lq^Q&!tMA{RDRhmf5miM|9t+TW^{MC5z%v$sSJHoJlgrnWwq7(i z3`c&wI5LL5PGmc6cH$FM;j~-iLAk!PZ@)P|IFCM1ys{izg<=<)Arr~PT}jO7Zx#t& zu_TNK9{NPl*K6N-j<3#TbR`6TIKo3Uwn1134r4k&1fmno-qoP+HI`Jb!EU0~Xk|h1 zBng5ItmSbdm#{8FSO8J1i%1^Pvlp`gm%PS6HWOk=c&Ly)4US1+2BR%JL>nV1v<{cW z4$TMw$_USbuiyxa3}Lhl7Ac6fM(z=-uoWqShUf@zCsfF;mF&bkLQbiOR2#_{$@_#W z+p~D^T*IQXParTxSAPaoUn|)I~I{dgPy}|yX_!-4V#i=5I zhF3hbv*mv+I6yfsQr{vcemR04ReW%KR>E2bYUTK2YHXuo8*uqj ze=*~o0pP$1y1fUY-GhA4H(`ES_OS`wE3mV1sk_KEd$so!o=>|}EjxN7KWz;f($_m{ zaB!`-|N8fYzehHyD2JNMpWNHCjo&I920aq~c9;>lPkE&?JMLm)x-WSqT& z9(@b%fLkYdb8-&ZsO2- z_lxnhxL5Fl#={pks-86H3W&s21^l>k>ZVjzv56N`D|gf!+rs`LKO2smS+zu8g|gEE zzriweZ}uS4<|=JUq4FQ!e^Whc?8(W9Kbu_>Rb{(jHX;dU9g52`VGtLZhr}CjmFnGQ z6v>p_O@@PcpTT1J5yolwSP98d2p=n*T+Cpg`-yIlk!FLIjT-{&=Z)%ez#y}n@OZuI zEPJhl02KhzAIRyYs~QgkF*D_(BzB}&44D}1NQ4v-Ff^SJ+Q3lH(+c8@r+afB4gpEi zQUDx?h1aaA?~JNy8lQnU{>&^~)rSA1obA;dM3T`%qUeo(9y7X?v*z)Q>U1T^$mW;R zhjP9Q!R%i(0JW+Y z6}azT(od;=XdvWl9<6!BSEnv)#!VM3Lb)q8baHB&(DI?HZUmxb;p|t~7GuWEpNyV} z7H5goieJ1=s|#qaCF|Ab*>Zwsee}7*MHnVu`x|YHfY|3>rRPZT1M~xDeOXyFA&(+2 zzZ@cXi4@}|{GWfL_8vsb-*{$wT%z!!BmY|6^gNf4oS*>}wmeZ1=_k-x+ZlPVl0 zamkZ1>*Vi8-5Xwqsq5s*7suRkRWEzGY^CiAFElT~6h8=!g;5o~3ijc-)0j?AkTH+C zL93iByGD82*n;l_huoraFRqzZY@_+)_Xpr~^Y_rca&zxzsoyJiH{7oj1c`Z7Vd5SF zKNiB5r7EYby)e^wb6iceNhYp?-Xxu6&%na4}naael((ui2c-5j3(oufzzEdhV zHGHQ!BfIUi+C6o{HDXGZ*Sr>;*K$#)wcLiaMA~Xw4c2E&AGNv$EKm*KLZy`P9xCI{ z&!ujr-<*9jZ2A1^Bj?l|0&ODk*)LiD(1gqzTu*u9aWAz4_ac`D<=0kjy`#f*E{iI7 z+;$#>sf$3^w&^jKc{U3fa!=PakX{PT+qc&49K)*(dUHDi=QGy~bzL-|^1A3w<-)rk zUEnK7HudDd<%WoH4hNLp#T=T7^yjd072Lb`XL7!Gk<$X4TLldj-ZccaroyD;bmRU? z_RdTxf6D`lwSEutU$(tG2TIdsxjQY#{E4#TEEc6)G@+v_egeHzclFI5skWH~0e0kh z$1Hlok3BFq*~~Btk7D{OaVXnoYu=y-G)mHEq%s2E;B)pR&;iteC?-B{&r&`5IG{SF z&TB_0aKP#5#X@0c#}8NB%nON?5~*n%ekRZCVk}Hr&JctL0tRTYz#{T@;V3nuSZkX%RXWSU(_4;X z&1>zPuA4p0oVP}o4yJtigCM>qrLICHLoa1;mTO<#i!a;a(p?Py4)#5nx;7EwWFqKl zN27MEuFBcQui{C`OevP4793{)bz86B6}fY$le^}>2%DpKlR77a2J#&z4>_10(01c| z<}Q6Mz2{z#R&^oY!6512*RRUgkoY?qS4tfef5^djmp-t$F^^V43xJ7`X`7qgY012T zlJIm8y`|lg?;~>~Lp-@AE8#kaJ|(WfmgV{T80YWhIhb6bz~HX<3>K zHR0mK*wr9QFGHrz)-;9S#Pqo?2X0rJpcfqs20=7mtxkDND6w9>goZK8VZCqhO^D5@ zz38!loA;D8^-q+273;4Rz(PMB_wh;@!|xJq3> zXW>5gpT(%T`zGbD-ui{Fnd;n4$h$A(6Hx3cc<)^ID)Cq`SWt%?XHTJFQ87gFPV$AH ztP2o11q?p3#xrf%Wzl$~50O$_h1VA&KH5&EIH{CF-Ue{rniqP4w%5$D?@ zBAEyqKxpJAK%8TxMF1b7PHQu?7hvf1g|Cky0fwLbtndoF{;HW;G^{3A z=npN)VL3l+obl(g;UB(Ncj`{D&n#BrYeMRYS~Y9U%V$@4LWG)&ExVxCp$(f9{f6ti zWx1`#ajkQYcwb+H@jXkF{%JNh({1C|`m1y@ZAz`6e3bd0jdyF7efeqv;ojo*)+#*x zW|^x?;>!I?t@t0*dDeExe??H0`d2!(={l5@fSiU@@2mYy=kvu1X~o8i3mZqWaR?#D z>fyJ&1J55cC~|Y&PFjuc(r|k9FFNWDBiDMJ^UY>SIw!hby@k|}Nl zb6ik{Ca8NUo0ycnDi%6DM`0%J?tRmM<`7NCuf!Oi5fcD3C}7*BhmU7TFV0<^jQID9 zTAVLsVVyHHF$!Z(t$6}mu#I(MbUfxLh(2dgeUpWq+gaL*YI>VVjg^DFdQ)#6=*|gF zPaaV@803X8FikUn5X@#^yriQoPgOR3dO@-Pnbp>dj|xD%Sb(Lu_VJ??9*G12crH#B zUo&S060|X+0u8IZpq%vnw+sS7oJ3#&=8poj(ubtBfeAI%{%rn0G32(cNjOx7j`9}s zlBwduCll-~{jn&zwj76QORSQINP+Ou998|EApOKAya5a_amN2e+-&}jT=+lcDQ^1q zy6QXxQkq97Dl02!ZU0XqZ29lT_}`7GVc!rKUQzLCUp8p;MHM0cidZ9J)$3ZyQw-`} z1{S(nw!wo7K4UZSTQv0$SrArMkms=A_VzsiXBTMM@CHZ2UNq#qtcZU%@Bd`ijaNJJ zw<5FS2hPNwCiOFOFZ(#w)?OnLRAeQC<#na^-eaC!3%XZT7p6{23FpQN0svCmAvsCm zWXlB;DTnJJ1-leS?gJjZ;Tkz+dm&e*$wMB1D5NFoGBAEJ7r0g|qH@0n(8!+VQkiEImTVk#?P@RUi=)*rGvaT52J4#rVhhhosZ}t~~0ksGYi4 zQN0OveDG;o2sT#lw9rvHaf|ACF;n*7D@op={?;d6W#t+$n1Z!phNRV_k`3QsAnx@K zO&`ols*2kSDVW0H5Pfdou>fO%KH%ssAl@A2#rpygwBLtZQl_q|w2Mwh5w_2|8a1Xk zQ9MV0yH3(tWxnptq;z>!j>|`TZ)M79s;9#xpqz6&WuJ*zE+)f$ zC`(-*84S*yk#X_2_y~Fe_ENOtcPv{&LmB*tqq{vdD)S9zX!EB#`?=VL<+B+1GTV%t za4eetrM2s@1Gb?_QEC$1--DeK?6(x74T^B3q%gRDQi?FlsZBL6`3u zxjR7Lq#FNP-#B;KJH9l>vg}Y@boy+V$^0 zqz}w6%UV~LdGQ-SZ%4s}|H7+pJfr)0eU5Cb{Uw*jyVDP^T|Nv-m`7F;y4FB^N%h`YZCuG}%6pw2B@~oP`tgSrs7n=0vJHPh zv{AxL?(|d=2`8ch*%v}=1c$xPt+`OBLGSc%>x#UOF<(CS6goqczWc_~6yFYvC;O$G z<%%G2z5Lbh`|Di|^+I8T-}>p2(WlPko$RvCv>Yy=u|iE71|0j}{}J76>>xhO5pEz2 z(*uYevoHYIiL;K#EN}F0V#E&{$t4;@#Ibqx#>vY5(@+tbpNiPMcEjkx3 z_1DqQpNnmz5SKI=a&?1)8YjwvLaujM2r&|~?7wB-SrVx#c5|?n6k-c~dM`>;sN3M} zWZXY*v!6Bf^iGeBd)M|XFMr{Q$XF0}y1Z`aG8#3;=Dl}nIb^Q{MfMRqA^gU`jAx#8 zOQqCgt7Ln?%?cQwd{Kq`P?o|;Q-RRl-yWc#HzG!7T$hF6=#Sk~$m_5C*FU^O1*}V+ z{BqJqoqPJrb)>m*WYsY*X`Cg-lmQzws$_1DH5NEv%n+n={v>r`2`9^umsbG8# zWZradJWfW8ypjR8UK|T@K^b$m-iDrmonHpOEjOy*NE0={_m#x<*-cO52y(Si}iz4HH{ffR?li~CiE_vj0+XITWywyVb zb+$S>lA5_4OE{|CS@#M>r`Qyzo2;Cv0*#XNuJ3i+I2^u-e4!`u*rn~*mPf?q587KW zue^;!Qx#ZH1u=v+il4#>*almNl9UDo`P763%#Jc7ja085&k)b0-l^>_I$TAx+9zM{ zf8vDd=kpmsOrbBw7Q@M;5qqj@uvIV)nwnxM1{xb`S>3V3T6| zW^C2(U*RJQ%c|UeUU@ra#=YnI=PG_3_&he*5xZ*pr8y?)2jTG)pm;6vY2fJs*X_RQ zg!yBoMLlz-_XTZS`4;c2>Z(UfF7DWWIjgO7@5!5|Q<-YjE4kGrYnw4iyk~iXylo9i zwFB)(S&^Jeus6H+izCymz;#cAbp8=~GC@tD#E7CNk5u*UEe2Kbx>xt0s$0;S)pstu zRjK~#dWZYz*PF=Loa)ICJ<8v$BXV)4-nEEd22|14C**aH?x{0gKi|GScjpj!8?qb_ zHEbSHdcRre*L?+TF~z%>y`itiv7A0%;wA5|vb@{ul2<{Wk1@EF1s#8A zj%gFfZTFtQ33*()u=_+xQbMDcws)QCl`R*`N1=%InjVlrw^G%NCN%aoVIo@aN?_;N zbDI)*PXzaGt@w+JmbJ|mt+gNQO%)L$Udp?1qQu2Ls_~CoZynxn*__pS^ZD81>l4Bo z<2yO*e=YKtg312%FyC$XsmVgkL*MVL+I(qd!ffSRMoh$ciK~Am2vXsLl<&pkHt}{3 z0YKmRU@c!2(-bW+`TFG@Jr8ap2lNzk;jSiwL zob#R7B|sOy2VCSG*3ieC^JUV4RQRRb+Dn2RXbC$SbF@n#!^>`^Ua%^&%*v<9mcK_4 zcQuTD^Stn)=?gIj_}|f6l+~=0?Wn!$U%0v$Dx=|qbfjv$iQ;e9v~?*fL-X(q^OTzB z=SfZnx*!@|FrV_4C!B4)c^3pLYifijO?rk%Lqo?=3?4HQE@Tm&UWGje0;r+WhdzBM zU|dkBcXSdC_?%=b~KFSW!le_WxvL^ve3b)xVQ>j=OqG8bJ;RTNZ#CngA}M| z(NaW)0jjVmE=jG8q!GA-9dMY6fjJ092=J&`cvF3y6fiE#{gqAv=vELeS;FIDNl5?X z73R(o493P_1h#lK(ig@JTQW?YS{Y)Dr1uGp&{KSKO%5e6oS+(lGjEw!3#Kl>fpf9U zGQ*5tZV_1+B8dZ9fZDeuo!-{YF7B<4j-3r+*)UQF_>rUcrn}rfHB%k>^$2xiV4{2T zPqWVBvutt~bwA&FzA-b_^ZmHE`0g%@b$RVEdiUfAUijs)-QCLTiNOx*i|JqQ`keON zuDjHIi}HDS@AKU=OK!%->FTw*jA|d6Exm%!UC>WaX;dz4SzLoo6Tv@XO7V5V=|zk2 zfA1-GziWGb`9tkK9T?Aqq`p*!t|tAw_DGhge2duGrxavVlD{Tsy)h9EC@aupq)z<1 zvGBAd;@2f*oU+qt@0aB_4)5Q68VmG6ZV{T=THPOS)SFy!{aouH&3=j2aX<35PdD%t z*3+c_+xX%Tttba$!M@-C&r_)BBUX9T%MdQ}`wx)WxVGCGFmE$an*>VFf6x zHCvtO^braXtp3{E{p@+3;Hzu)yUA{s9uXt%22~5`t-ugBo5IS^rSk2HrgB(8*i)>s za+R^kQjW3n9^l5!k|=wzGOX}k!Zu4OC6+2$*%%F> zH9YNEQbmGU0+Zs@<$30ETrQj=9pIrcY=b6383qxi^?VeY9{Yz87wk@b9J;=55z8Z# zvJ1c4ijMMa-RzQ`zK85^$~X=-^M3?6U;P<$UdW%ewPt+F)lch4o4Z;V_BapH6%)Og z-s_v!fBkYR}2- z)`lw|N1Ry1kknr4hXF$L{X4wZo9b~AF3m?(luZQ})XZ)RNr5u#YvX5^S?i>i|IB?z zBTlFaWU%1h7#wDG)6nYrXHq_7a!pdm9+M zJFO{Jf>Dwnq(Jl-v$g^1Sr{=}42N`dKBqSV04Pv$WGjLsNDumwp%4#o44sLF80>gy zWr0g8Gw_ym0X8nld}LzE*Z>S3Fn#Y)zpfZ@l{*ddWheFAA+mf#N}Dx5e?t6GTk^mA zKYJS#-B$vDTkfwi>a~3mnnbiuKyQA4t+jdFxt>|`^vwyk zY0HU!e?#bLnY&owQ*N4;gJnJil89Ggi8$R!DKD*+u*POm?m7dvk_vo$fm#SNJ=d15DrPRGC z?IzYAJfDWpt}N3y8xi22wR@>CDzeD|`1CET+s!xCM{9Q;J)gx<-wOAlN9|Xia@}}d z`pT#2J^XLXm9Ufej|q(Mca4RcpU+mwJar@ACuMOwUl!lJ7Hc`JaIgLSR05#2$j(n z04f{Rr$7Fi!N<+c*tpg3`=bEyAmGg{4o?YK4N6x*!bUTUE0OJaEYdsHkeZy$$b<0K zN_yro&sM=83Dd_=AxLqLwAfqX;$MOIesujgkQYm6v@ z+Gr%H1i@wMRb}#VMfRXvDF#Hop}v{tJiyM34qhMPMX<>TLR52bdZ>Fv0!hq}zGKqt zLtQC|xGg?uF;*%^oIM^V1&d>_wD$UC%!04+)@4r6gNPXq^5AuO{%>0E=>G{$JoGI* z4^{L(JwTxUB&PoX8zKMONuPa~TFNF40N?2W83GtQAjQ#O^i~w=<371}?@MB7gnOC| zO$qg;4&_fuS>i*kj?s~D|4^A^C1smF*}t}hg)JIqNVlE`vJa?X7oJ3OIZ&pHuhk1* zURDrDn$qOad@E`M8b)|;xQ{Bd*%r#$Vq7h~(Aae!Icazkb-trlO9*UW*I0ie%c#-C zWpFm%Ct#sac3r5TKF~|B%-RhJW)kEqf#CAkyqq0u(pLWuQSSlFhX2R^$1D+Qi`CjC zM#U<+j93wBB#}@=>=>nJs}nUMMr~@<7D;T;qE#WNJwwr5TC@GMs8+T8=llEr|MzqE zzPQU>?%c^cc|YH;=i~8WRy~Z5HcHUo;z0)cC7uhv@z~H_kxbSxO(VuB*-wz@_KBRs z${{sgS|3P`cAm|iJ!C};@N-p*i9Jo@Qdmv9;-qhJqnMCq=d^@X#%!L42ZllJXjcwn zzHi}W`*5@gJZz^rthA9vjA5~_`1q?O0X^*VL@?b}gX)8UPV@(B)Y32$ZiZ}nPZb%j z4oN7MbkdcMWRfIY!|K=@K~)_eC*iu2>$tNR(t#!ipLeN z(Tnbf^BIYtxWz*CJQH8j((~=V7|W>*G$;U8$LXC}HPJ_R?_IY$agHvjMAwfy(J-W) zTz2L7ED+rJUOO-8sGCPEy?82Y?bOEPx>@~CQ$4>A7tX2O`$XN|{gE>~a;NLTqcN>Z z5o&ceH#NR~y9D{z8vJu_`}c6q;-3A$&eCXw@6(vOrwcHD241OlYn{*TQM@a;e5q5F z>h}E2s_LH8;o&c#4hC#G`DU%rXMS!Xxo_!Vt*LCjui{E=d5vTCtaj{V!Pwc0&;P}| z`}AsR{8VKsD`i{jD&%xjIOF2!61yqmKX?3~dud;yZypyG9!`yhT2Mv zQnbl^;qbIQS!EyO8+v|`yvO=z>3U zVp9K;U=fSp_(XsGb%X8-uH2D|TyRm`yK%6xg>}A^Uvi&`J!HhzSZOsKtcNao2T{u^ zva>N7shH-6*tw8}6r>Fxx#oeY97M~jeoSfIp}3%EKQ?MOM@9I)qpmGb7b@XnTCW?# zmkluJ=Iul9-Zww>&;Y1XgN&(ZYMQPNVyjc#G&vg7Y3dZ~>J}l}7PM$hmb+52TCkob z3<0wM3Mxq|@NopVm=!}rG+{uD8AX(vpTiuIU8MmmWBnXqm}od;^n@wE*t> zfYEL=)m@j(j5WH~L=`vVSId0zH|sRI!rR7P-wAhv(Unn;2ur)?N*R>ovsN26>S=p_ zhO}ZNuS~WzaXeCns?iL)P6zg3nZ{WU$et9alrs zh%>cibX`!I;?O#Vxzwlb3g^LUC5J$P9Tr>P$(6pP9t$yE+8#Y$$vgwmlbq?S<>^6} zLXcj7^AIIWJuOOuG+WDI*ry)m#_fNz_I6pFMT6*dlrPF$i!*tb+_s>nNociA z1{z@4#kQvUw5Ix-YY7SYYBbh5V7EWXfFcFcD4slqg3wUOfh=e`#+R;K2Q1J_E+X

(F^qz#qi)vg|A1U$sa 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 L6Qt&8!6x)S%ub%( literal 0 HcmV?d00001 diff --git a/addons/wardrobe/data/helmet_visor_05.ogg b/addons/wardrobe/data/helmet_visor_05.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a438aaf1242389f1e2b5061eff7fa5dfb6fd934c GIT binary patch literal 29143 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 literal 0 HcmV?d00001 From 8a9e909ef90674eb332cc060735dd877126d31ec Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Mon, 30 Dec 2024 14:57:59 +0100 Subject: [PATCH 022/305] Update addons/wardrobe/XEH/XEH_preInit.sqf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- addons/wardrobe/XEH/XEH_preInit.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/XEH/XEH_preInit.sqf b/addons/wardrobe/XEH/XEH_preInit.sqf index b5114ea8e5f..e2111484ff7 100644 --- a/addons/wardrobe/XEH/XEH_preInit.sqf +++ b/addons/wardrobe/XEH/XEH_preInit.sqf @@ -38,7 +38,7 @@ QSET(test) -> "ADDON_set_test" false // _needRestart - Setting will be marked as needing mission restart after being changed. (optional, default false) ] call CBA_fnc_addSetting; -/* - I dont think there's going to be a way to make this work propperly. +/* - I dont think there's going to be a way to make this work properly. [ QSET(enable_contextMenu), // _setting - Unique setting name. Matches resulting variable name "CHECKBOX", // _settingType - Type of setting. Can be "CHECKBOX", "EDITBOX", "LIST", "SLIDER" or "COLOR" From 9ea7f5a71ac91df81ed841d6f03703e8a4ee9695 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Mon, 30 Dec 2024 14:58:07 +0100 Subject: [PATCH 023/305] Update addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md index e9f0fae9edd..b369055d6f0 100644 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md @@ -1,5 +1,5 @@ The uniforms addressed in this sub-addon are the "sleeves rolled up" version of their "sleeves rolled down" counterpart. The problem is, that the rolled up version are both, 1 lb lighter, and can carry 1 lb less. -If we would ignore this, the player would run into situations where they would loose items by simply rolling up their sleeves. +If we would ignore this, the player would run into situations where they would lose items by simply rolling up their sleeves. To counter this, I increased the maxLoad of those items by 1 lb to be aligned with their counterpart. From 489d2e06038f0c2a9c3e020843e83ed60829f238 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 30 Dec 2024 15:18:45 +0100 Subject: [PATCH 024/305] Update mission.sqm --- .hemtt/missions/test.VR/mission.sqm | 33 ++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/.hemtt/missions/test.VR/mission.sqm b/.hemtt/missions/test.VR/mission.sqm index 0f1533140f5..c611feb5e8b 100644 --- a/.hemtt/missions/test.VR/mission.sqm +++ b/.hemtt/missions/test.VR/mission.sqm @@ -5,17 +5,17 @@ class EditorData angleGridStep=0.2617994; scaleGridStep=1; autoGroupingDist=10; - toggles=1541; + toggles=517; class ItemIDProvider { - nextID=202; + nextID=203; }; class Camera { - pos[]={3.673414,13.197466,-29.890484}; - dir[]={0.56360948,-0.37021363,0.73846245}; - up[]={0.22461432,0.92893893,0.29429838}; - aside[]={0.79494452,-8.312054e-08,-0.60671729}; + pos[]={11.851013,13.197466,-25.312586}; + dir[]={0.28843617,-0.51576251,0.80672157}; + up[]={0.17364158,0.85673237,0.4856551}; + aside[]={0.94162649,-3.1082891e-08,-0.33667031}; }; }; binarizationWanted=0; @@ -26,7 +26,8 @@ addons[]= "ace_realisticnames", "ace_ballistics", "A3_Characters_F", - "A3_Soft_F_Exp_Offroad_02" + "A3_Soft_F_Exp_Offroad_02", + "A3_Weapons_F_Ammoboxes" }; class AddonsMetaData { @@ -95,7 +96,7 @@ class Mission }; class Entities { - items=4; + items=5; class Item0 { dataType="Object"; @@ -247,5 +248,21 @@ class Mission nAttributes=1; }; }; + class Item4 + { + dataType="Object"; + class PositionInfo + { + position[]={18.822828,5,-13.759856}; + angles[]={-0,1.0776811,0}; + }; + side="Empty"; + flags=4; + class Attributes + { + }; + id=202; + type="B_AssaultPack_blk"; + }; }; }; From fe99af78ec7bcf0c94952e646573b8b349b2eb52 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 30 Dec 2024 15:18:56 +0100 Subject: [PATCH 025/305] macro conflict --- addons/wardrobe/CfgSounds.hpp | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/addons/wardrobe/CfgSounds.hpp b/addons/wardrobe/CfgSounds.hpp index d66fcd44e2a..de489c489fc 100644 --- a/addons/wardrobe/CfgSounds.hpp +++ b/addons/wardrobe/CfgSounds.hpp @@ -1,8 +1,10 @@ -#define SOUND(var1,dur)\ -class GVAR(DOUBLES(var1,dur))\ +// Duration in this case is 10th of secounds. so 10 -> 1 sec, 15 -> 1.5sec, ... + +#define ENTRY(base,dur)\ +class GVAR(DOUBLES(base,dur))\ {\ - name = Q(var1 dur);\ - sound[] = { QPATHTOF(data\DOUBLES(var1,dur)##.ogg), 1, 1, 100 };\ + name = Q(base dur);\ + sound[] = { QPATHTOF(data\DOUBLES(base,dur)##.ogg), 1, 1, 100 };\ titles[] = { 0, "" };\ forceTitles = 0;\ titlesStructured = 0;\ @@ -12,11 +14,11 @@ class GVAR(DOUBLES(var1,dur))\ class CfgSounds { sounds[] = {}; // OFP required it filled, now it can be empty or absent depending on the game's version - SOUND(fabric,06) - SOUND(fabric,07) - SOUND(fabric,16) - SOUND(fabric,20) - SOUND(fabric,25) - - SOUND(helmet_visor,05) + ENTRY(fabric,06) + ENTRY(fabric,07) + ENTRY(fabric,16) + ENTRY(fabric,20) + ENTRY(fabric,25) + + ENTRY(helmet_visor,05) }; \ No newline at end of file From 2aa24796541d20a1f5867b41eb531d80447f159f Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 30 Dec 2024 15:19:06 +0100 Subject: [PATCH 026/305] fine-tuning helmet sound --- addons/wardrobe/Baseclass.hpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/addons/wardrobe/Baseclass.hpp b/addons/wardrobe/Baseclass.hpp index bc8dba5dd6c..834310e4cac 100644 --- a/addons/wardrobe/Baseclass.hpp +++ b/addons/wardrobe/Baseclass.hpp @@ -1,4 +1,4 @@ - +#define CN_SOUND(base,dur) Q(TRIPLES(ADDON,base,dur)) class GVAR(base) { @@ -9,8 +9,7 @@ class GVAR(base) components[] = {}; // Supports Multiple Sounds, will pick one by random. - #define SOUND(base,dur) Q(TRIPLES(ADDON,base,dur)) - sound[] = {SOUND(fabric,06),SOUND(fabric,07),SOUND(fabric,16),SOUND(fabric,20),SOUND(fabric,25)}; + sound[] = {CN_SOUND(fabric,06),CN_SOUND(fabric,07),CN_SOUND(fabric,16),CN_SOUND(fabric,20),CN_SOUND(fabric,25)}; sound_timing = 0; // [0..1] 0 at the start of the action, 0.5 half way during the duration of the action - always, if completed or not. 1 at the end, only when completed. // Gesture @@ -38,5 +37,5 @@ class GVAR(base_U_jacket_closed) : GVAR(base) { alternativeDisplayName = CSTRING // Common Base Class for Helmets with a Visor that can be flipped up or down -class GVAR(base_H_visor_up) : GVAR(base) { duration = 0.5; gesture ="gestureNod"; sound[] = {SOUND(helmet_visor,05)}; sound_timing = 0; alternativeDisplayName = CSTRING(visorUp); }; -class GVAR(base_H_visor_down) : GVAR(base) { duration = 0.5; gesture ="gestureNod"; sound[] = {SOUND(helmet_visor,05)}; sound_timing = 0; alternativeDisplayName = CSTRING(visorDown); }; \ No newline at end of file +class GVAR(base_H_visor_up) : GVAR(base) { duration = 0.3; gesture ="gestureNod"; sound[] = {CN_SOUND(helmet_visor,05)}; sound_timing = 0; alternativeDisplayName = CSTRING(visorUp); }; +class GVAR(base_H_visor_down) : GVAR(base) { duration = 0.3; gesture ="gestureNod"; sound[] = {CN_SOUND(helmet_visor,05)}; sound_timing = 0; alternativeDisplayName = CSTRING(visorDown); }; \ No newline at end of file From d6541fd2c18000d52af05cbf965fbbe8fac0f02f Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 31 Dec 2024 14:29:35 +0100 Subject: [PATCH 027/305] wip --- addons/wardrobe/CfgFunctions.hpp | 4 +- .../fn_clearOnClosed_InteractionMenu.sqf} | 2 +- .../cache/fn_clearOnClosed_Inventory.sqf | 35 ++++++ .../contextMenu/fn_CM_nextvariant.sqf | 114 ++++++++++++++++++ .../contextMenu/fn_do_nextVariant.sqf | 32 +++++ .../contextMenu/fn_enable_contextMenu.sqf | 99 +-------------- .../contextMenu/fn_getNextVariant.sqf | 46 +++++++ .../functions/getItems/fn_getItems_all.sqf | 2 +- .../getItems/fn_getItems_modifiable_all.sqf | 2 +- .../fn_getItems_modifiable_current.sqf | 2 +- 10 files changed, 235 insertions(+), 103 deletions(-) rename addons/wardrobe/functions/{fn_clearOnClose.sqf => cache/fn_clearOnClosed_InteractionMenu.sqf} (96%) create mode 100644 addons/wardrobe/functions/cache/fn_clearOnClosed_Inventory.sqf create mode 100644 addons/wardrobe/functions/contextMenu/fn_CM_nextvariant.sqf create mode 100644 addons/wardrobe/functions/contextMenu/fn_do_nextVariant.sqf create mode 100644 addons/wardrobe/functions/contextMenu/fn_getNextVariant.sqf diff --git a/addons/wardrobe/CfgFunctions.hpp b/addons/wardrobe/CfgFunctions.hpp index 8ef9795d614..18197b2919b 100644 --- a/addons/wardrobe/CfgFunctions.hpp +++ b/addons/wardrobe/CfgFunctions.hpp @@ -8,7 +8,6 @@ class CfgFunctions class postInit { postInit = 1; }; - class clearOnClose {}; class isModifiable {}; class compare_components {}; @@ -66,6 +65,9 @@ class CfgFunctions class cache_set {}; class cache_clear {}; + + class clearOnClosed_InteractionMenu {}; + class clearOnClosed_Inventory {}; }; class config diff --git a/addons/wardrobe/functions/fn_clearOnClose.sqf b/addons/wardrobe/functions/cache/fn_clearOnClosed_InteractionMenu.sqf similarity index 96% rename from addons/wardrobe/functions/fn_clearOnClose.sqf rename to addons/wardrobe/functions/cache/fn_clearOnClosed_InteractionMenu.sqf index 6b4669d93f6..a2aecfb5741 100644 --- a/addons/wardrobe/functions/fn_clearOnClose.sqf +++ b/addons/wardrobe/functions/cache/fn_clearOnClosed_InteractionMenu.sqf @@ -1,4 +1,4 @@ -#include "../script_component.hpp" +#include "../../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/cache/fn_clearOnClosed_Inventory.sqf b/addons/wardrobe/functions/cache/fn_clearOnClosed_Inventory.sqf new file mode 100644 index 00000000000..6ff42a9bfc8 --- /dev/null +++ b/addons/wardrobe/functions/cache/fn_clearOnClosed_Inventory.sqf @@ -0,0 +1,35 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* Function to request the clearing of the cache on closing of the menu +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ +// Cleanup Cache once the inventory is closed + +params [ ["_key", "", [""]] ]; + +private _queue = missionNamespace getVariable [QGVAR(inventory_clear_queue), "404"]; + +if (_queue isEqualTo "404") then { + + _queue = []; + + player addEventHandler ["InventoryClosed", { + { [_x] call FUNC(cache_clear) } forEach ( missionNamespace getVariable [QGVAR(inventory_clear_queue), [] ] ); + missionNamespace setVariable [QGVAR(inventory_clear_queue), nil ]; + player removeEventHandler [_thisEvent, _thisEventhandler]; + }]; + missionNamespace setVariable [QGVAR(inventory_clear_queue), _queue]; +}; + +_queue pushBackUnique _key; \ No newline at end of file diff --git a/addons/wardrobe/functions/contextMenu/fn_CM_nextvariant.sqf b/addons/wardrobe/functions/contextMenu/fn_CM_nextvariant.sqf new file mode 100644 index 00000000000..23486546b35 --- /dev/null +++ b/addons/wardrobe/functions/contextMenu/fn_CM_nextvariant.sqf @@ -0,0 +1,114 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* Function to create the CM Option to switch to the "next" Variant of the current Version. +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + + + +/* +Description: + Adds context menu option to inventory display. + +Parameters: + _item - Item classname + Can be base class. + + Can be item type as reported by BIS_fnc_itemType: + ["Equipment","Headgear"] + -> + "#Equipment" and/or "##Headgear" + + Wildcard: + #All + + _slots - Relevant slots + Values: + CLOTHES + UNIFORM + VEST + BACKPACK + HEADGEAR + GOGGLES + + _displayName String keys are automatically translated. + 0: _displayName - Option display name + 1: _tooltip - Option tooltip + + _color - Option text color. Default alpha is 1. + (default: [] = default color) + + _icon - Path to icon. (default: "" = no icon) + + _condition + 0: _conditionEnable - Menu option is enabled and executed only if this + condition reports 'true' (default: {true}) + 1: _conditionShow - Menu option is shown only if this condition + reports 'true'. (optional, default: {true}) + + - Passed arguments: + params ["_unit", "_container", "_item", "_slot", "_params"]; + + _statement - Option statement (default: {}) + Return true to keep context menu opened. + + - Passed arguments: + params ["_unit", "_container", "_item", "_slot", "_params"]; + + _consume - Remove the item before executing the statement + code. (default: false) + + - This does NOT work for the following slots: + GROUND + CARGO + + _params - Arguments passed as '_this select 4' to condition and + statement (optional, default: []) + +Returns: + Nothing/Undefined. + +Examples: + (begin example) + ["#All", "ALL", ">DEBUG ACTION<", nil, nil, {true}, { + params ["_unit", "_container", "_item", "_slot", "_params"]; + systemChat str [name _unit, typeOf _container, _item, _slot, _params]; + true + }, false, [0,1,2]] call CBA_fnc_addItemContextMenuOption; + (end) +*/ + + + +/* + +To make this work i would need to add a Menu Option for each individual modfifiable item AND its potential variants. + +The most efficient variant i can think of would be following. +1. Event Handler for when the inventory gets open. +2. Get Current Modifiable Items. +3. Check if they are already established (GVAR(contextMenu_hashmap) classname, config) +4. For every new modifiable Item, create a ContextMenuOption for each of its variant +- could make an event handler, everytime the inventory gets opened, it scans the wearables, if they are modifiable, (and not already established) adds the option for those items + +*/ + +/* + [ + "#ALL", + "CLOTHES", + ] call CBA_fnc_addItemContextMenuOption; + + +*/ \ No newline at end of file diff --git a/addons/wardrobe/functions/contextMenu/fn_do_nextVariant.sqf b/addons/wardrobe/functions/contextMenu/fn_do_nextVariant.sqf new file mode 100644 index 00000000000..5dfc75a57e8 --- /dev/null +++ b/addons/wardrobe/functions/contextMenu/fn_do_nextVariant.sqf @@ -0,0 +1,32 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* Function to Execute the Next Variant Context Menu Action. +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +params ["_unit", "_container", "_item", "_slot", "_params"]; + +private _current_cfg = [_item] call cba_fnc_getItemConfig; + +private _cfg_tgt = [ _current_cfg ] call FUNC(getNextVariant); + +if (_cfg_tgt isEqualTo false) exitWith { diag_log format ['[CVO](debug)(fn_do_nextVariant) "": %1', ""]; }; + +private _canModifyTo = [_unit, _current_cfg, _cfg_tgt] call FUNC(canModifyTo); + +if !(_canModifyTo) exitWith {[["Can not switch to:"], [getText (_cfg_tgt >> "displayName")], ["Due to missing components"] ,true ] call CBA_fnc_notify /* error hint to player: cannot switch to next variant, try again */ }; + + + +[_unit, _unit, [_current_cfg, _cfg_tgt]] call FUNC(replace); \ No newline at end of file diff --git a/addons/wardrobe/functions/contextMenu/fn_enable_contextMenu.sqf b/addons/wardrobe/functions/contextMenu/fn_enable_contextMenu.sqf index 4374d3f8d93..102d66639af 100644 --- a/addons/wardrobe/functions/contextMenu/fn_enable_contextMenu.sqf +++ b/addons/wardrobe/functions/contextMenu/fn_enable_contextMenu.sqf @@ -16,7 +16,7 @@ */ -params ["_enable", true, [true]]; +params [["_enable", true, [true]]]; if (missionNamespace getVariable [QGVAR(contextmenu_enabled), false]) then { @@ -24,100 +24,3 @@ if (missionNamespace getVariable [QGVAR(contextmenu_enabled), false]) then { }; - - -/* -Description: - Adds context menu option to inventory display. - -Parameters: - _item - Item classname - Can be base class. - - Can be item type as reported by BIS_fnc_itemType: - ["Equipment","Headgear"] - -> - "#Equipment" and/or "##Headgear" - - Wildcard: - #All - - _slots - Relevant slots - Values: - CLOTHES - UNIFORM - VEST - BACKPACK - HEADGEAR - GOGGLES - - _displayName String keys are automatically translated. - 0: _displayName - Option display name - 1: _tooltip - Option tooltip - - _color - Option text color. Default alpha is 1. - (default: [] = default color) - - _icon - Path to icon. (default: "" = no icon) - - _condition - 0: _conditionEnable - Menu option is enabled and executed only if this - condition reports 'true' (default: {true}) - 1: _conditionShow - Menu option is shown only if this condition - reports 'true'. (optional, default: {true}) - - - Passed arguments: - params ["_unit", "_container", "_item", "_slot", "_params"]; - - _statement - Option statement (default: {}) - Return true to keep context menu opened. - - - Passed arguments: - params ["_unit", "_container", "_item", "_slot", "_params"]; - - _consume - Remove the item before executing the statement - code. (default: false) - - - This does NOT work for the following slots: - GROUND - CARGO - - _params - Arguments passed as '_this select 4' to condition and - statement (optional, default: []) - -Returns: - Nothing/Undefined. - -Examples: - (begin example) - ["#All", "ALL", ">DEBUG ACTION<", nil, nil, {true}, { - params ["_unit", "_container", "_item", "_slot", "_params"]; - systemChat str [name _unit, typeOf _container, _item, _slot, _params]; - true - }, false, [0,1,2]] call CBA_fnc_addItemContextMenuOption; - (end) -*/ - - - -/* - -To make this work i would need to add a Menu Option for each individual modfifiable item AND its potential variants. - -The most efficient variant i can think of would be following. -1. Event Handler for when the inventory gets open. -2. Get Current Modifiable Items. -3. Check if they are already established (GVAR(contextMenu_hashmap) classname, config) -4. For every new modifiable Item, create a ContextMenuOption for each of its variant -- could make an event handler, everytime the inventory gets opened, it scans the wearables, if they are modifiable, (and not already established) adds the option for those items - -*/ - -/* - [ - "#ALL", - "CLOTHES", - ] call CBA_fnc_addItemContextMenuOption; - - -*/ \ No newline at end of file diff --git a/addons/wardrobe/functions/contextMenu/fn_getNextVariant.sqf b/addons/wardrobe/functions/contextMenu/fn_getNextVariant.sqf new file mode 100644 index 00000000000..4589d0c81fb --- /dev/null +++ b/addons/wardrobe/functions/contextMenu/fn_getNextVariant.sqf @@ -0,0 +1,46 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* function to return cfg the next variant. the choosen variant will be added to a gvar of previous variants. the array of possible variants has been exhausted, it will remove all possible variants from the backlog and start new. +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + + +params ["_cfg_current"]; + +private _modifiableTo_cfg = [_cfg_current] call FUNC(getItems_modifiableTo); + +if (count _modifiableTo_cfg == 0) exitWith {false}; + +private _history_cfg = missionNamespace getVariable [QGVAR(variant_history_cfg), "404"]; + +if (_history_cfg isEqualTo "404") then { + _history_cfg = []; + missionNamespace setVariable [QGVAR(variant_history_cfg), _history_cfg]; + player addEventHandler ["InventoryClosed", { + missionNamespace setVariable [QGVAR(variant_history_cfg), nil ]; + player removeEventHandler [_thisEvent, _thisEventhandler]; + }]; +}; + + +private _remaining = _modifiableTo_cfg - _history_cfg; +_history_cfg pushbackUnique _cfg_current; + +// Returns ether a random remaining item or alternatively, a random one from the complete array. +if (count _remaining > 0) then { + selectRandom _remaining +} else { + _history_cfg = _history_cfg select { !(_x in _modifiableTo_cfg) }; + selectRandom _modifiableTo_cfg +}; \ No newline at end of file diff --git a/addons/wardrobe/functions/getItems/fn_getItems_all.sqf b/addons/wardrobe/functions/getItems/fn_getItems_all.sqf index 322a23a609a..37c060b21b1 100644 --- a/addons/wardrobe/functions/getItems/fn_getItems_all.sqf +++ b/addons/wardrobe/functions/getItems/fn_getItems_all.sqf @@ -21,7 +21,7 @@ params [ // Cleanup Cache once the interaction menu is closed -["items_all"] call FUNC(clearOnClose); +["items_all"] call FUNC(clearOnClosed_InteractionMenu); [ "items_all", { diff --git a/addons/wardrobe/functions/getItems/fn_getItems_modifiable_all.sqf b/addons/wardrobe/functions/getItems/fn_getItems_modifiable_all.sqf index cd1afe40d5e..83c6f01918a 100644 --- a/addons/wardrobe/functions/getItems/fn_getItems_modifiable_all.sqf +++ b/addons/wardrobe/functions/getItems/fn_getItems_modifiable_all.sqf @@ -46,7 +46,7 @@ private _code = { // Cleanup Cache once the interaction menu is closed -["items_modifiable_all"] call FUNC(clearOnClose); +["items_modifiable_all"] call FUNC(clearOnClosed_InteractionMenu); [ "items_modifiable_all", _code diff --git a/addons/wardrobe/functions/getItems/fn_getItems_modifiable_current.sqf b/addons/wardrobe/functions/getItems/fn_getItems_modifiable_current.sqf index 66c71273f46..54dd463cb03 100644 --- a/addons/wardrobe/functions/getItems/fn_getItems_modifiable_current.sqf +++ b/addons/wardrobe/functions/getItems/fn_getItems_modifiable_current.sqf @@ -45,7 +45,7 @@ private _code = { // Cleanup Cache once the interaction menu is closed -["items_modifiable_current"] call FUNC(clearOnClose); +["items_modifiable_current"] call FUNC(clearOnClosed_InteractionMenu); [ "items_modifiable_current", _code From e67fa0c25c7386106dc0048fb8c1a1f9910f9f9b Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 1 Jan 2025 16:41:57 +0100 Subject: [PATCH 028/305] Update CfgFunctions.hpp --- addons/wardrobe/CfgFunctions.hpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/addons/wardrobe/CfgFunctions.hpp b/addons/wardrobe/CfgFunctions.hpp index 18197b2919b..d66e8eb5265 100644 --- a/addons/wardrobe/CfgFunctions.hpp +++ b/addons/wardrobe/CfgFunctions.hpp @@ -9,7 +9,6 @@ class CfgFunctions class postInit { postInit = 1; }; class isModifiable {}; - class compare_components {}; class canModifyTo {}; }; @@ -28,7 +27,6 @@ class CfgFunctions class getItems_all {}; class getItems_modifiable_all {}; class getItems_modifiable_current {}; - class getItems_modifiableTo {}; }; @@ -50,7 +48,6 @@ class CfgFunctions class addActions {}; class addActions_condition {}; class addActions_children {}; - class getAction_Name {}; class getAction_Icon {}; }; @@ -60,12 +57,9 @@ class CfgFunctions file = PATH_TO_FUNC_SUB(cache); class cache_db {}; - class cache_get {}; class cache_set {}; - class cache_clear {}; - class clearOnClosed_InteractionMenu {}; class clearOnClosed_Inventory {}; }; @@ -73,18 +67,21 @@ class CfgFunctions class config { file = PATH_TO_FUNC_SUB(config); + class getCfgDataRandom {}; }; class debug { file = PATH_TO_FUNC_SUB(debug); + class getAllWardrobeItems {}; }; class effects { file = PATH_TO_FUNC_SUB(effects); + class say3d {}; }; }; From 0d067f0b1ba82aa1d4fc1192f9674c3959ed1086 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 1 Jan 2025 18:55:50 +0100 Subject: [PATCH 029/305] wip contextMenu --- .hemtt/missions/test.VR/mission.sqm | 10 ++--- .../script_component.hpp | 2 +- .../compat_ws/compat_ws_wardrobe/config.cpp | 33 +++++--------- addons/wardrobe/CfgFunctions.hpp | 12 ++++- addons/wardrobe/XEH/XEH_preInit.sqf | 6 +-- ...xtvariant.sqf => fn_addCM_nextvariant.sqf} | 21 +++++---- .../contextMenu/fn_do_nextVariant.sqf | 14 ++++-- .../contextMenu/fn_enable_contextMenu.sqf | 6 +-- .../contextMenu/fn_getNextVariant.sqf | 2 +- .../debug/fn_compare_container_maxLoad.sqf | 45 +++++++++++++++++++ .../debug/fn_getAllWardrobeItems.sqf | 7 ++- 11 files changed, 109 insertions(+), 49 deletions(-) rename addons/wardrobe/functions/contextMenu/{fn_CM_nextvariant.sqf => fn_addCM_nextvariant.sqf} (87%) create mode 100644 addons/wardrobe/functions/debug/fn_compare_container_maxLoad.sqf diff --git a/.hemtt/missions/test.VR/mission.sqm b/.hemtt/missions/test.VR/mission.sqm index c611feb5e8b..a607b56fcac 100644 --- a/.hemtt/missions/test.VR/mission.sqm +++ b/.hemtt/missions/test.VR/mission.sqm @@ -12,10 +12,10 @@ class EditorData }; class Camera { - pos[]={11.851013,13.197466,-25.312586}; - dir[]={0.28843617,-0.51576251,0.80672157}; - up[]={0.17364158,0.85673237,0.4856551}; - aside[]={0.94162649,-3.1082891e-08,-0.33667031}; + pos[]={16.435326,30,-25}; + dir[]={0,-0.70710683,0.70710683}; + up[]={0,0.70710677,0.70710677}; + aside[]={0.99999994,0,-0}; }; }; binarizationWanted=0; @@ -254,7 +254,7 @@ class Mission class PositionInfo { position[]={18.822828,5,-13.759856}; - angles[]={-0,1.0776811,0}; + angles[]={0,1.0776811,0}; }; side="Empty"; flags=4; diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp index 273c8190a91..262eb23a042 100644 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp @@ -1,4 +1,4 @@ -#define SUBCOMPONENT wardrobe +#define SUBCOMPONENT wardrobe_uniform_fix #define SUBCOMPONENT_BEAUTIFIED Wardrobe Compatibility for SOG:PF - Uniform Fix #include "..\script_component.hpp" diff --git a/addons/compat_ws/compat_ws_wardrobe/config.cpp b/addons/compat_ws/compat_ws_wardrobe/config.cpp index 35ee5b61743..a25c5e3f89e 100644 --- a/addons/compat_ws/compat_ws_wardrobe/config.cpp +++ b/addons/compat_ws/compat_ws_wardrobe/config.cpp @@ -1,35 +1,26 @@ #include "script_component.hpp" class CfgPatches { - class ADDON { - - // Meta information for editor - name = ADDON_NAME; - author = "$STR_mod_author"; + class SUBADDON { + name = COMPONENT_NAME; + author = ECSTRING(common,ACETeam); authors[] = {"OverlordZorn [CVO]"}; + url = ECSTRING(main,URL); - url = "$STR_mod_URL"; - VERSION_CONFIG; + addonRootClass = QUOTE(ADDON); + requiredAddons[] = { + QPVAR(wardrobe), + "Characters_f_lxWS_headgear" + }; + skipWhenMissingDependencies = 1; - // Addon Specific Information - // Minimum compatible version. When the game's version is lower, pop-up warning will appear when launching the game. requiredVersion = 2.02; - - // Required addons, used for setting load order. - // When any of the addons is missing, pop-up warning will appear when launching the game. - requiredAddons[] = {QPVAR(main),"cba_main","Characters_f_lxWS_headgear"}; - - // Optional. If this is 1, if any of requiredAddons[] entry is missing in your game the entire config will be ignored and return no error (but in rpt) so useful to make a compat Mod (Since Arma 3 2.14) - skipWhenMissingDependencies = 1; - - // List of objects (CfgVehicles classes) contained in the addon. Important also for Zeus content (units and groups) + units[] = {}; - - // List of weapons (CfgWeapons classes) contained in the addon. weapons[] = {}; - }; }; + #include "CfgWardrobe.hpp" \ No newline at end of file diff --git a/addons/wardrobe/CfgFunctions.hpp b/addons/wardrobe/CfgFunctions.hpp index d66e8eb5265..852233ccb10 100644 --- a/addons/wardrobe/CfgFunctions.hpp +++ b/addons/wardrobe/CfgFunctions.hpp @@ -76,13 +76,23 @@ class CfgFunctions file = PATH_TO_FUNC_SUB(debug); class getAllWardrobeItems {}; + class compare_container_maxLoad {}; }; class effects { file = PATH_TO_FUNC_SUB(effects); - + class say3d {}; }; + class contextMenu + { + file = PATH_TO_FUNC_SUB(contextMenu); + + class enable_contextMenu {}; + class addCM_nextvariant {}; + class do_nextVariant {}; + class getNextVariant {}; + }; }; }; \ No newline at end of file diff --git a/addons/wardrobe/XEH/XEH_preInit.sqf b/addons/wardrobe/XEH/XEH_preInit.sqf index e2111484ff7..1a461780dd4 100644 --- a/addons/wardrobe/XEH/XEH_preInit.sqf +++ b/addons/wardrobe/XEH/XEH_preInit.sqf @@ -38,7 +38,6 @@ QSET(test) -> "ADDON_set_test" false // _needRestart - Setting will be marked as needing mission restart after being changed. (optional, default false) ] call CBA_fnc_addSetting; -/* - I dont think there's going to be a way to make this work properly. [ QSET(enable_contextMenu), // _setting - Unique setting name. Matches resulting variable name "CHECKBOX", // _settingType - Type of setting. Can be "CHECKBOX", "EDITBOX", "LIST", "SLIDER" or "COLOR" @@ -47,7 +46,6 @@ QSET(test) -> "ADDON_set_test" [LSTRING(set_cat_main)], // _category - Category for the settings menu + optional sub-category true, // _valueInfo - Extra properties of the setting depending of _settingType. See examples below 1, // _isGlobal - 1: all clients share the same setting, 2: setting can't be overwritten (optional, default: 0) - {}, // _script - Script to execute when setting is changed. (optional) + FUNC(enable_contextMenu), // _script - Script to execute when setting is changed. (optional) true // _needRestart - Setting will be marked as needing mission restart after being changed. (optional, default false) -] call CBA_fnc_addSetting; -*/ \ No newline at end of file +] call CBA_fnc_addSetting; \ No newline at end of file diff --git a/addons/wardrobe/functions/contextMenu/fn_CM_nextvariant.sqf b/addons/wardrobe/functions/contextMenu/fn_addCM_nextvariant.sqf similarity index 87% rename from addons/wardrobe/functions/contextMenu/fn_CM_nextvariant.sqf rename to addons/wardrobe/functions/contextMenu/fn_addCM_nextvariant.sqf index 23486546b35..941c0d1461c 100644 --- a/addons/wardrobe/functions/contextMenu/fn_CM_nextvariant.sqf +++ b/addons/wardrobe/functions/contextMenu/fn_addCM_nextvariant.sqf @@ -92,7 +92,6 @@ Examples: /* - To make this work i would need to add a Menu Option for each individual modfifiable item AND its potential variants. The most efficient variant i can think of would be following. @@ -101,14 +100,20 @@ The most efficient variant i can think of would be following. 3. Check if they are already established (GVAR(contextMenu_hashmap) classname, config) 4. For every new modifiable Item, create a ContextMenuOption for each of its variant - could make an event handler, everytime the inventory gets opened, it scans the wearables, if they are modifiable, (and not already established) adds the option for those items - */ -/* +[ + "#ALL", // filter items + "CLOTHES", // filter slots + "Switch to next Variant", // Display Name + [], // Color + "", // Icon [ - "#ALL", - "CLOTHES", - ] call CBA_fnc_addItemContextMenuOption; - + {true}, // Condition Enable action + {true} // Condition Show Action + ], + FUNC(do_nextVariant), // statement + false, // consume Item + [] // Params +] call CBA_fnc_addItemContextMenuOption; -*/ \ No newline at end of file diff --git a/addons/wardrobe/functions/contextMenu/fn_do_nextVariant.sqf b/addons/wardrobe/functions/contextMenu/fn_do_nextVariant.sqf index 5dfc75a57e8..0fba9b6323e 100644 --- a/addons/wardrobe/functions/contextMenu/fn_do_nextVariant.sqf +++ b/addons/wardrobe/functions/contextMenu/fn_do_nextVariant.sqf @@ -2,7 +2,7 @@ /* * Author: Zorn -* Function to Execute the Next Variant Context Menu Action. +* Function to Request the Next Variant Context Menu Action. * * Arguments: * @@ -25,8 +25,16 @@ if (_cfg_tgt isEqualTo false) exitWith { diag_log format ['[CVO](debug)(fn_do_ne private _canModifyTo = [_unit, _current_cfg, _cfg_tgt] call FUNC(canModifyTo); -if !(_canModifyTo) exitWith {[["Can not switch to:"], [getText (_cfg_tgt >> "displayName")], ["Due to missing components"] ,true ] call CBA_fnc_notify /* error hint to player: cannot switch to next variant, try again */ }; - +if !(_canModifyTo) exitWith { + // error hint to player: cannot switch to next variant, try again + // TODO: Stringtable XML + [ + ["Can not switch to:"], + [getText (_cfg_tgt >> "displayName")], + ["Due to missing components"], + true + ] call CBA_fnc_notify; +}; [_unit, _unit, [_current_cfg, _cfg_tgt]] call FUNC(replace); \ No newline at end of file diff --git a/addons/wardrobe/functions/contextMenu/fn_enable_contextMenu.sqf b/addons/wardrobe/functions/contextMenu/fn_enable_contextMenu.sqf index 102d66639af..56cca48daf5 100644 --- a/addons/wardrobe/functions/contextMenu/fn_enable_contextMenu.sqf +++ b/addons/wardrobe/functions/contextMenu/fn_enable_contextMenu.sqf @@ -18,9 +18,7 @@ params [["_enable", true, [true]]]; - -if (missionNamespace getVariable [QGVAR(contextmenu_enabled), false]) then { +if (_enable && {!(missionNamespace getVariable [QGVAR(contextmenu_enabled), false])}) then { missionNamespace setVariable [QGVAR(contextmenu_enabled), true]; - - + [] call FUNC(addCM_nextvariant); }; diff --git a/addons/wardrobe/functions/contextMenu/fn_getNextVariant.sqf b/addons/wardrobe/functions/contextMenu/fn_getNextVariant.sqf index 4589d0c81fb..9faa5063762 100644 --- a/addons/wardrobe/functions/contextMenu/fn_getNextVariant.sqf +++ b/addons/wardrobe/functions/contextMenu/fn_getNextVariant.sqf @@ -35,7 +35,7 @@ if (_history_cfg isEqualTo "404") then { private _remaining = _modifiableTo_cfg - _history_cfg; -_history_cfg pushbackUnique _cfg_current; +_history_cfg pushBackUnique _cfg_current; // Returns ether a random remaining item or alternatively, a random one from the complete array. if (count _remaining > 0) then { diff --git a/addons/wardrobe/functions/debug/fn_compare_container_maxLoad.sqf b/addons/wardrobe/functions/debug/fn_compare_container_maxLoad.sqf new file mode 100644 index 00000000000..d78251a1269 --- /dev/null +++ b/addons/wardrobe/functions/debug/fn_compare_container_maxLoad.sqf @@ -0,0 +1,45 @@ +#include "../../script_component.hpp" + +/* +* Author: Zorn +* This function will compare the maxLoad of all modifiable Items with its modifiableTo Variants and will provide an RPT output. +* +* Arguments: +* +* Return Value: +* None +* +* Example: +* ['something', player] call prefix_component_fnc_functionname +* +* Public: No +*/ + +// TODO + +private _allWardrobeItems = [true] call FUNC(getAllWardrobeItems) select { + switch ( getNumber (_x >> "ItemInfo" >> "type") ) do { + case TYPE_GOGGLE: { false; }; + case TYPE_HEADGEAR: { false; }; + case default { true }; + }; +}; + +private _established = []; + +{ + private _origin_cfg = _x; + private _origin_className = configName _origin_cfg; + + + if (_origin_className in _established) then { continue }; + _established pushBack _origin_className; + + private _targets = [_origin] call FUNC(getItems_modifiableTo); + + // formulate + + + +} forEach _allWardrobeItems; + diff --git a/addons/wardrobe/functions/debug/fn_getAllWardrobeItems.sqf b/addons/wardrobe/functions/debug/fn_getAllWardrobeItems.sqf index 5fa1c7e69a1..a3da7fd40fc 100644 --- a/addons/wardrobe/functions/debug/fn_getAllWardrobeItems.sqf +++ b/addons/wardrobe/functions/debug/fn_getAllWardrobeItems.sqf @@ -15,4 +15,9 @@ * Public: No */ -["CfgWeapons"] apply { ( Q([_x] call FUNC(isModifiable)) configClasses (configFile >> _x) ) apply { configName _x } } \ No newline at end of file +params [["_asConfig", false, [true]]]; + +[ + ["CfgWeapons", "CfgGlasses"] apply { ( Q([_x] call FUNC(isModifiable)) configClasses (configFile >> _x) ) apply { configName _x } }, + ["CfgWeapons", "CfgGlasses"] apply { ( Q([_x] call FUNC(isModifiable)) configClasses (configFile >> _x) ) } +] select _asConfig From 36eb40a10328c282edfd4877842641f9386b9093 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 1 Jan 2025 23:55:47 +0100 Subject: [PATCH 030/305] added icon --- addons/wardrobe/CfgVehicles.hpp | 2 +- addons/wardrobe/data/wardrobe_logo.paa | Bin 0 -> 34357 bytes addons/wardrobe/data/wardrobe_logo.png | Bin 0 -> 16653 bytes .../contextMenu/fn_addCM_nextvariant.sqf | 20 +++++++++--------- 4 files changed, 11 insertions(+), 11 deletions(-) create mode 100644 addons/wardrobe/data/wardrobe_logo.paa create mode 100644 addons/wardrobe/data/wardrobe_logo.png diff --git a/addons/wardrobe/CfgVehicles.hpp b/addons/wardrobe/CfgVehicles.hpp index 5dbee3c34d4..3c2f0e38775 100644 --- a/addons/wardrobe/CfgVehicles.hpp +++ b/addons/wardrobe/CfgVehicles.hpp @@ -5,7 +5,7 @@ class CfgVehicles { class ACE_Equipment { class ADDON { displayName = CSTRING(actionTitle); // Text shown to user - icon = ""; + icon = PATH_TO_ADDON(data\wardrobe_logo.paa); condition = Q([_player] call FUNC(addActions_condition)); statement = ""; insertChildren = Q([_player] call FUNC(addActions)); diff --git a/addons/wardrobe/data/wardrobe_logo.paa b/addons/wardrobe/data/wardrobe_logo.paa new file mode 100644 index 0000000000000000000000000000000000000000..2910c92cd715076db1ce9a70a9616cf2e2e906da GIT binary patch literal 34357 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 f|Lv6(LtN1Jf-5ck8y Date: Thu, 2 Jan 2025 13:28:09 +0100 Subject: [PATCH 031/305] polish --- .../action/fn_addActions_condition.sqf | 7 +------ .../contextMenu/fn_do_nextVariant.sqf | 6 +++--- .../contextMenu/fn_getNextVariant.sqf | 18 +++++++++++++----- addons/wardrobe/functions/fn_canModifyTo.sqf | 4 ++-- .../functions/getItems/fn_getItems_all.sqf | 19 ++++++++++--------- .../getItems/fn_getItems_modifiable_all.sqf | 15 +++++++-------- .../fn_getItems_modifiable_current.sqf | 17 +++++++++-------- .../wardrobe/functions/replace/fn_replace.sqf | 3 ++- 8 files changed, 47 insertions(+), 42 deletions(-) diff --git a/addons/wardrobe/functions/action/fn_addActions_condition.sqf b/addons/wardrobe/functions/action/fn_addActions_condition.sqf index 36d8a7996d1..7715f88818f 100644 --- a/addons/wardrobe/functions/action/fn_addActions_condition.sqf +++ b/addons/wardrobe/functions/action/fn_addActions_condition.sqf @@ -21,9 +21,4 @@ missionNamespace getVariable [QSET(enable_action), false] && { count ([_player] call FUNC(getItems_modifiable_current)) > 0 -} - - -// 1. Check if the player has items that can be modified -// 2. Get the target classnames and check if they are available. -// \ No newline at end of file +} \ No newline at end of file diff --git a/addons/wardrobe/functions/contextMenu/fn_do_nextVariant.sqf b/addons/wardrobe/functions/contextMenu/fn_do_nextVariant.sqf index 0fba9b6323e..f8e3ab6666b 100644 --- a/addons/wardrobe/functions/contextMenu/fn_do_nextVariant.sqf +++ b/addons/wardrobe/functions/contextMenu/fn_do_nextVariant.sqf @@ -23,7 +23,7 @@ private _cfg_tgt = [ _current_cfg ] call FUNC(getNextVariant); if (_cfg_tgt isEqualTo false) exitWith { diag_log format ['[CVO](debug)(fn_do_nextVariant) "": %1', ""]; }; -private _canModifyTo = [_unit, _current_cfg, _cfg_tgt] call FUNC(canModifyTo); +private _canModifyTo = [_unit, _current_cfg, _cfg_tgt, false] call FUNC(canModifyTo); if !(_canModifyTo) exitWith { // error hint to player: cannot switch to next variant, try again @@ -31,10 +31,10 @@ if !(_canModifyTo) exitWith { [ ["Can not switch to:"], [getText (_cfg_tgt >> "displayName")], - ["Due to missing components"], + ["missing components"], true ] call CBA_fnc_notify; }; -[_unit, _unit, [_current_cfg, _cfg_tgt]] call FUNC(replace); \ No newline at end of file +[_unit, _unit, [_current_cfg, _cfg_tgt], true] call FUNC(replace); \ No newline at end of file diff --git a/addons/wardrobe/functions/contextMenu/fn_getNextVariant.sqf b/addons/wardrobe/functions/contextMenu/fn_getNextVariant.sqf index 9faa5063762..7e92d5f01d9 100644 --- a/addons/wardrobe/functions/contextMenu/fn_getNextVariant.sqf +++ b/addons/wardrobe/functions/contextMenu/fn_getNextVariant.sqf @@ -18,15 +18,19 @@ params ["_cfg_current"]; -private _modifiableTo_cfg = [_cfg_current] call FUNC(getItems_modifiableTo); +private _modifiableTo_cfg = [_cfg_current, false] call FUNC(getItems_modifiableTo); if (count _modifiableTo_cfg == 0) exitWith {false}; private _history_cfg = missionNamespace getVariable [QGVAR(variant_history_cfg), "404"]; if (_history_cfg isEqualTo "404") then { + _history_cfg = []; + _history_cfg pushBackUnique _cfg_current; + missionNamespace setVariable [QGVAR(variant_history_cfg), _history_cfg]; + player addEventHandler ["InventoryClosed", { missionNamespace setVariable [QGVAR(variant_history_cfg), nil ]; player removeEventHandler [_thisEvent, _thisEventhandler]; @@ -35,12 +39,16 @@ if (_history_cfg isEqualTo "404") then { private _remaining = _modifiableTo_cfg - _history_cfg; -_history_cfg pushBackUnique _cfg_current; + // Returns ether a random remaining item or alternatively, a random one from the complete array. -if (count _remaining > 0) then { +private _return = if (count _remaining > 0) then { selectRandom _remaining } else { - _history_cfg = _history_cfg select { !(_x in _modifiableTo_cfg) }; + _history_cfg = []; // _history_cfg select { !(_x in _modifiableTo_cfg) }; + missionNamespace setVariable [QGVAR(variant_history_cfg), [] ]; selectRandom _modifiableTo_cfg -}; \ No newline at end of file +}; + +_history_cfg pushBackUnique _return; +_return \ No newline at end of file diff --git a/addons/wardrobe/functions/fn_canModifyTo.sqf b/addons/wardrobe/functions/fn_canModifyTo.sqf index 2580eace2ef..033e4e4330f 100644 --- a/addons/wardrobe/functions/fn_canModifyTo.sqf +++ b/addons/wardrobe/functions/fn_canModifyTo.sqf @@ -15,10 +15,10 @@ * Public: No */ -params ["_unit", "_cfg_origin", "_cfg_target"]; +params ["_unit", "_cfg_origin", "_cfg_target", ["_cache", true, [true]]]; [_cfg_origin, _cfg_target] call FUNC(compare_components) params ["_missing", "_surplus"]; -private _currentItems = [_unit] call FUNC(getItems_all); +private _currentItems = [_unit, _cache] call FUNC(getItems_all); count ( _missing select { ! (_x in _currentItems) } ) == 0 diff --git a/addons/wardrobe/functions/getItems/fn_getItems_all.sqf b/addons/wardrobe/functions/getItems/fn_getItems_all.sqf index 37c060b21b1..db3dfcc2de7 100644 --- a/addons/wardrobe/functions/getItems/fn_getItems_all.sqf +++ b/addons/wardrobe/functions/getItems/fn_getItems_all.sqf @@ -16,15 +16,16 @@ */ params [ - ["_player", objNull, [objNull]] + ["_unit", objNull, [objNull]], + ["_cache", true, [true] ] ]; -// Cleanup Cache once the interaction menu is closed -["items_all"] call FUNC(clearOnClosed_InteractionMenu); -[ - "items_all", - { - flatten getUnitLoadout _player select { _x isEqualType "" && { _x != ""}}; - } -] call FUNC(cache_get); \ No newline at end of file +private _code = { flatten getUnitLoadout _unit select { _x isEqualType "" && { _x != ""}}; }; + +private _caching = { + ["items_all"] call FUNC(clearOnClosed_InteractionMenu); + ["items_all", _code] call FUNC(cache_get); // returns the result +}; + +if (_cache) then _caching else _code; diff --git a/addons/wardrobe/functions/getItems/fn_getItems_modifiable_all.sqf b/addons/wardrobe/functions/getItems/fn_getItems_modifiable_all.sqf index 83c6f01918a..bcc00c4c5df 100644 --- a/addons/wardrobe/functions/getItems/fn_getItems_modifiable_all.sqf +++ b/addons/wardrobe/functions/getItems/fn_getItems_modifiable_all.sqf @@ -16,7 +16,8 @@ */ params [ - ["_unit", objNull, [objNull]] + ["_unit", objNull, [objNull]], + ["_cache", true, [true] ] ]; @@ -43,11 +44,9 @@ private _code = { { count (_x#1) > 0 } }; +private _caching = { + ["items_modifiable_all"] call FUNC(clearOnClosed_InteractionMenu); + ["items_modifiable_all", _code] call FUNC(cache_get); // returns the result +}; - -// Cleanup Cache once the interaction menu is closed -["items_modifiable_all"] call FUNC(clearOnClosed_InteractionMenu); -[ - "items_modifiable_all", - _code -] call FUNC(cache_get); \ No newline at end of file +if (_cache) then _caching else _code; diff --git a/addons/wardrobe/functions/getItems/fn_getItems_modifiable_current.sqf b/addons/wardrobe/functions/getItems/fn_getItems_modifiable_current.sqf index 54dd463cb03..4948b2cbdb3 100644 --- a/addons/wardrobe/functions/getItems/fn_getItems_modifiable_current.sqf +++ b/addons/wardrobe/functions/getItems/fn_getItems_modifiable_current.sqf @@ -16,7 +16,8 @@ */ params [ - ["_unit", objNull, [objNull]] + ["_unit", objNull, [objNull]], + ["_cache", true, [true] ] ]; @@ -28,7 +29,7 @@ private _code = { select { [_x] call FUNC(isModifiable) } apply - { [_x, [_x] call FUNC(getItems_modifiableTo) ] } + { [_x, [_x] call FUNC(getItems_modifiableTo) ] } // will return an array, even if the target variants are not available. select { count (_x#1) > 0 } apply @@ -44,9 +45,9 @@ private _code = { }; -// Cleanup Cache once the interaction menu is closed -["items_modifiable_current"] call FUNC(clearOnClosed_InteractionMenu); -[ - "items_modifiable_current", - _code -] call FUNC(cache_get); \ No newline at end of file +private _caching = { + ["items_modifiable_current"] call FUNC(clearOnClosed_InteractionMenu); + ["items_modifiable_current", _code] call FUNC(cache_get); // returns the result +}; + +if (_cache) then _caching else _code; diff --git a/addons/wardrobe/functions/replace/fn_replace.sqf b/addons/wardrobe/functions/replace/fn_replace.sqf index 4eb39fa441a..e85e4c0c52b 100644 --- a/addons/wardrobe/functions/replace/fn_replace.sqf +++ b/addons/wardrobe/functions/replace/fn_replace.sqf @@ -15,11 +15,12 @@ * Public: No */ -params ["_target", "_unit", "_actionParams"]; +params ["_target", "_unit", "_actionParams", ["_replaceNow", false, [true]]]; _actionParams params ["_cfg_origin", "_cfg_tgt"]; // Duration of the "animation" private _duration = getNumber (_cfg_tgt>> Q(ADDON) >> "duration"); +if (_replaceNow) then { _duration = 0; }; // Animation/Gestures [ _unit, getText (_cfg_tgt >> Q(ADDON) >> "gesture") ] call ace_common_fnc_doGesture; From 720fa9bb7c882a79f35b7b4964925f30726b7e4c Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 2 Jan 2025 14:09:23 +0100 Subject: [PATCH 032/305] compat facewear --- addons/wardrobe/compat_vanilla/Wardrobe.hpp | 10 ++++++++++ addons/wardrobe/config.cpp | 10 +++------- 2 files changed, 13 insertions(+), 7 deletions(-) create mode 100644 addons/wardrobe/compat_vanilla/Wardrobe.hpp diff --git a/addons/wardrobe/compat_vanilla/Wardrobe.hpp b/addons/wardrobe/compat_vanilla/Wardrobe.hpp new file mode 100644 index 00000000000..cce5ac273f3 --- /dev/null +++ b/addons/wardrobe/compat_vanilla/Wardrobe.hpp @@ -0,0 +1,10 @@ +class CfgWeapons +{ + #include "Uniforms.hpp" +}; + + +class CfgGlasses +{ + #include "Facewear.hpp" +}; \ No newline at end of file diff --git a/addons/wardrobe/config.cpp b/addons/wardrobe/config.cpp index 2d8e69b6998..af135d83bea 100644 --- a/addons/wardrobe/config.cpp +++ b/addons/wardrobe/config.cpp @@ -23,13 +23,9 @@ class CfgPatches { #include "CfgFunctions.hpp" #include "XEH\CfgXEH.hpp" -#include "Baseclass.hpp" - #include "CfgVehicles.hpp" +#include "CfgSounds.hpp" -class CfgWeapons -{ - #include "compat_vanilla\Uniforms.hpp" -}; +#include "Baseclass.hpp" -#include "CfgSounds.hpp" +#include "compat_vanilla\Wardrobe.hpp" \ No newline at end of file From c82d3447040eb0880a4f5967ebd1a78be37e0bf8 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 2 Jan 2025 14:09:30 +0100 Subject: [PATCH 033/305] compat balaclava black --- addons/wardrobe/compat_vanilla/Facewear.hpp | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 addons/wardrobe/compat_vanilla/Facewear.hpp diff --git a/addons/wardrobe/compat_vanilla/Facewear.hpp b/addons/wardrobe/compat_vanilla/Facewear.hpp new file mode 100644 index 00000000000..7d0f0f38928 --- /dev/null +++ b/addons/wardrobe/compat_vanilla/Facewear.hpp @@ -0,0 +1,9 @@ +// CfgGlasses + +// Parents +class None; + +// Balaclava, black +class G_Balaclava_blk : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_lowprofile), Q(G_Balaclava_combat) }; components[] = {""}; }; }; +class G_Balaclava_combat : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_blk) }; components[] = {"G_Combat"}; }; }; +class G_Balaclava_lowprofile : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_blk) }; components[] = {"G_Lowprofile"}; }; }; From f4a75714a876b1bf062bfb4c41fb4d847c8e31e6 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 2 Jan 2025 15:48:56 +0100 Subject: [PATCH 034/305] renamed hemtt Launch preset to Wardrobe --- .hemtt/launch.toml | 7 ++----- .hemtt/missions/{test.VR => Wardrobe.VR}/mission.sqm | 6 +++--- addons/wardrobe/compat_vanilla/Facewear.hpp | 9 +++++++++ 3 files changed, 14 insertions(+), 8 deletions(-) rename .hemtt/missions/{test.VR => Wardrobe.VR}/mission.sqm (97%) diff --git a/.hemtt/launch.toml b/.hemtt/launch.toml index adda989104e..c7bb05fec18 100644 --- a/.hemtt/launch.toml +++ b/.hemtt/launch.toml @@ -42,17 +42,14 @@ workshop = [ "843632231", # RHS SAF Workshop ID ] -[zrn] +[Wardrobe] extends = "default" workshop = [ "2369477168", # Advanced Developer Tools "1779063631", # ZEN # "623475643", # eden enhanced ] -mission = "test.VR" - -[zrn_dlc] -extends = "zrn" +mission = "Wardrobe.VR" dlc = [ "Reaction Forces", "Western Sahara" diff --git a/.hemtt/missions/test.VR/mission.sqm b/.hemtt/missions/Wardrobe.VR/mission.sqm similarity index 97% rename from .hemtt/missions/test.VR/mission.sqm rename to .hemtt/missions/Wardrobe.VR/mission.sqm index a607b56fcac..8329d2e730d 100644 --- a/.hemtt/missions/test.VR/mission.sqm +++ b/.hemtt/missions/Wardrobe.VR/mission.sqm @@ -13,9 +13,9 @@ class EditorData class Camera { pos[]={16.435326,30,-25}; - dir[]={0,-0.70710683,0.70710683}; - up[]={0,0.70710677,0.70710677}; - aside[]={0.99999994,0,-0}; + dir[]={-1.2363449e-07,-0.70710683,0.70710683}; + up[]={-1.2363449e-07,0.70710671,0.70710683}; + aside[]={1,0,1.7484557e-07}; }; }; binarizationWanted=0; diff --git a/addons/wardrobe/compat_vanilla/Facewear.hpp b/addons/wardrobe/compat_vanilla/Facewear.hpp index 7d0f0f38928..cdaec37cee1 100644 --- a/addons/wardrobe/compat_vanilla/Facewear.hpp +++ b/addons/wardrobe/compat_vanilla/Facewear.hpp @@ -7,3 +7,12 @@ class None; class G_Balaclava_blk : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_lowprofile), Q(G_Balaclava_combat) }; components[] = {""}; }; }; class G_Balaclava_combat : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_blk) }; components[] = {"G_Combat"}; }; }; class G_Balaclava_lowprofile : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_blk) }; components[] = {"G_Lowprofile"}; }; }; + + +// Stealth Balaclava, black +class G_Balaclava_TI_blk_F : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_TI_G_blk_F) }; components[] = {""}; }; }; +class G_Balaclava_TI_G_blk_F : G_Balaclava_TI_blk_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_TI_blk_F) }; components[] = {"G_Combat"}; }; }; + +// Stealth Balaclava, green(tanoa) +class G_Balaclava_TI_tna_F : G_Balaclava_TI_blk_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_TI_G_tna_F) }; components[] = {""}; }; }; +class G_Balaclava_TI_G_tna_F : G_Balaclava_TI_tna_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_TI_tna_F) }; components[] = {"G_Combat"}; }; }; From 7b13aed1f10cb6e54ab14acf73d2fd6f229eca84 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Thu, 2 Jan 2025 15:25:14 +0100 Subject: [PATCH 035/305] Update addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md index b369055d6f0..5a1967bfd3a 100644 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md @@ -1,5 +1,5 @@ The uniforms addressed in this sub-addon are the "sleeves rolled up" version of their "sleeves rolled down" counterpart. -The problem is, that the rolled up version are both, 1 lb lighter, and can carry 1 lb less. +The problem is, that the rolled up version are both 1 lb (0.453 kg) lighter and can carry 1 lb less. If we would ignore this, the player would run into situations where they would lose items by simply rolling up their sleeves. To counter this, I increased the maxLoad of those items by 1 lb to be aligned with their counterpart. From 1727637aa8c741bdf7c33006d67c6282ccfab063 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 2 Jan 2025 17:41:52 +0100 Subject: [PATCH 036/305] Update mission.sqm --- .hemtt/missions/Wardrobe.VR/mission.sqm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.hemtt/missions/Wardrobe.VR/mission.sqm b/.hemtt/missions/Wardrobe.VR/mission.sqm index 8329d2e730d..7898931dbb7 100644 --- a/.hemtt/missions/Wardrobe.VR/mission.sqm +++ b/.hemtt/missions/Wardrobe.VR/mission.sqm @@ -12,14 +12,14 @@ class EditorData }; class Camera { - pos[]={16.435326,30,-25}; - dir[]={-1.2363449e-07,-0.70710683,0.70710683}; - up[]={-1.2363449e-07,0.70710671,0.70710683}; - aside[]={1,0,1.7484557e-07}; + pos[]={6.6224675,9.7580004,-22.782627}; + dir[]={0.80753577,-0.42340663,0.4107419}; + up[]={0.3774308,0.90591747,0.19197531}; + aside[]={0.45338005,3.1408854e-07,-0.89136314}; }; }; binarizationWanted=0; -sourceName="test"; +sourceName="wardrobe"; addons[]= { "A3_Weapons_F", From b7af71a68c2473971ade96d40591e998d42bae61 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 2 Jan 2025 17:44:03 +0100 Subject: [PATCH 037/305] Refactored Components Supports non linear definitions. Example: Balaclava <-> Balaclava with Combat Goggles <-> Combat Goggles Requires: Balclava and Goggles to have itself as a component, while the combo version has both as components. --- addons/wardrobe/compat_vanilla/Facewear.hpp | 19 +++++++++------ .../contextMenu/fn_getNextVariant.sqf | 3 ++- .../wardrobe/functions/replace/fn_replace.sqf | 23 +++++++++++++++---- 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/addons/wardrobe/compat_vanilla/Facewear.hpp b/addons/wardrobe/compat_vanilla/Facewear.hpp index cdaec37cee1..c4d138b9930 100644 --- a/addons/wardrobe/compat_vanilla/Facewear.hpp +++ b/addons/wardrobe/compat_vanilla/Facewear.hpp @@ -3,16 +3,21 @@ // Parents class None; +class G_Lowprofile : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_lowprofile) }; components[] = {"G_Lowprofile"}; }; }; +class G_Combat : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_combat), Q(G_Balaclava_TI_G_blk_F), Q(G_Balaclava_TI_G_tna_F) }; components[] = {"G_Combat"}; }; }; + + // Balaclava, black -class G_Balaclava_blk : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_lowprofile), Q(G_Balaclava_combat) }; components[] = {""}; }; }; -class G_Balaclava_combat : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_blk) }; components[] = {"G_Combat"}; }; }; -class G_Balaclava_lowprofile : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_blk) }; components[] = {"G_Lowprofile"}; }; }; +class G_Balaclava_blk : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_lowprofile), Q(G_Balaclava_combat) }; components[] = {"G_Balaclava_blk"}; }; }; +class G_Balaclava_combat : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_blk) }; components[] = {"G_Balaclava_blk","G_Combat"}; }; }; +class G_Balaclava_lowprofile : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_blk) }; components[] = {"G_Balaclava_blk","G_Lowprofile"}; }; }; // Stealth Balaclava, black -class G_Balaclava_TI_blk_F : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_TI_G_blk_F) }; components[] = {""}; }; }; -class G_Balaclava_TI_G_blk_F : G_Balaclava_TI_blk_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_TI_blk_F) }; components[] = {"G_Combat"}; }; }; +class G_Balaclava_TI_blk_F : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_TI_G_blk_F) }; components[] = {"G_Balaclava_TI_blk_F"}; }; }; +class G_Balaclava_TI_G_blk_F : G_Balaclava_TI_blk_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_TI_blk_F) }; components[] = {"G_Balaclava_TI_blk_F","G_Combat"}; }; }; + // Stealth Balaclava, green(tanoa) -class G_Balaclava_TI_tna_F : G_Balaclava_TI_blk_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_TI_G_tna_F) }; components[] = {""}; }; }; -class G_Balaclava_TI_G_tna_F : G_Balaclava_TI_tna_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_TI_tna_F) }; components[] = {"G_Combat"}; }; }; +class G_Balaclava_TI_tna_F : G_Balaclava_TI_blk_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_TI_G_tna_F) }; components[] = {"G_Balaclava_TI_tna_F"}; }; }; +class G_Balaclava_TI_G_tna_F : G_Balaclava_TI_tna_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_TI_tna_F) }; components[] = {"G_Balaclava_TI_tna_F","G_Combat"}; }; }; diff --git a/addons/wardrobe/functions/contextMenu/fn_getNextVariant.sqf b/addons/wardrobe/functions/contextMenu/fn_getNextVariant.sqf index 7e92d5f01d9..b997d5bf5f3 100644 --- a/addons/wardrobe/functions/contextMenu/fn_getNextVariant.sqf +++ b/addons/wardrobe/functions/contextMenu/fn_getNextVariant.sqf @@ -47,7 +47,8 @@ private _return = if (count _remaining > 0) then { } else { _history_cfg = []; // _history_cfg select { !(_x in _modifiableTo_cfg) }; missionNamespace setVariable [QGVAR(variant_history_cfg), [] ]; - selectRandom _modifiableTo_cfg + _history_cfg pushBackUnique _cfg_current; + selectRandom _modifiableTo_cfg; }; _history_cfg pushBackUnique _return; diff --git a/addons/wardrobe/functions/replace/fn_replace.sqf b/addons/wardrobe/functions/replace/fn_replace.sqf index e85e4c0c52b..b6daa3dbad6 100644 --- a/addons/wardrobe/functions/replace/fn_replace.sqf +++ b/addons/wardrobe/functions/replace/fn_replace.sqf @@ -27,20 +27,35 @@ if (_replaceNow) then { _duration = 0; }; // Remove / Add Missing/Surplus Items. + [_cfg_origin, _cfg_tgt] call FUNC(compare_components) params ["_missing", "_surplus"]; -{ [_unit, _x, true] call CBA_fnc_addItem; } forEach _surplus; -{ [_unit, _x] call CBA_fnc_removeItem; } forEach _missing; +{ + if (configName _cfg_tgt != _x) then { [_unit, _x, true] call CBA_fnc_addItem; }; +} forEach _surplus; +{ + if (configName _cfg_origin != _x) then { [_unit, _x] call CBA_fnc_removeItem; }; +} forEach _missing; // Replace the Main Item. private _additionalParams = ""; -private _replaceCode = switch ( getNumber (_cfg_origin >> "ItemInfo" >> "type") ) do { - case TYPE_GOGGLE: { FUNC(replace_facewear) }; +private _typeNumber = getNumber (_cfg_origin >> "ItemInfo" >> "type"); +private _replaceCode = switch ( _typeNumber ) do { case TYPE_HEADGEAR: { FUNC(replace_headgear) }; case TYPE_UNIFORM: { _additionalParams = "UNIFORM"; FUNC(replace_uniform) }; case TYPE_VEST: { _additionalParams = "VEST"; FUNC(replace_uniform) }; case TYPE_BACKPACK: { _additionalParams = "BACKPACK"; FUNC(replace_uniform) }; + default { + // CfgGlasses items do not have a ItemInfo Subclass and therefore, not TypeNumber. + switch (true) do { + case ("CfgGlasses" in str _cfg_origin) : { FUNC(replace_facewear) }; + default { false }; + }; + }; }; + +if (_replaceCode isEqualType true) exitWith {ZRN_LOG_MSG_2(replacecode undefined,_typeNumber,_replaceCode);}; + [ _replaceCode, [_unit, _cfg_origin, _cfg_tgt, _additionalParams ], _duration * 1.0 ] call CBA_fnc_waitAndExecute; From 0df279be082ee0f7dd3f8d05a345c5789bf792b5 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 2 Jan 2025 18:37:05 +0100 Subject: [PATCH 038/305] fix for cfgGlasses not having ItemInfo --- .../wardrobe/functions/replace/fn_replace.sqf | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/addons/wardrobe/functions/replace/fn_replace.sqf b/addons/wardrobe/functions/replace/fn_replace.sqf index b6daa3dbad6..2206adac1d4 100644 --- a/addons/wardrobe/functions/replace/fn_replace.sqf +++ b/addons/wardrobe/functions/replace/fn_replace.sqf @@ -26,15 +26,6 @@ if (_replaceNow) then { _duration = 0; }; [ _unit, getText (_cfg_tgt >> Q(ADDON) >> "gesture") ] call ace_common_fnc_doGesture; -// Remove / Add Missing/Surplus Items. - -[_cfg_origin, _cfg_tgt] call FUNC(compare_components) params ["_missing", "_surplus"]; -{ - if (configName _cfg_tgt != _x) then { [_unit, _x, true] call CBA_fnc_addItem; }; -} forEach _surplus; -{ - if (configName _cfg_origin != _x) then { [_unit, _x] call CBA_fnc_removeItem; }; -} forEach _missing; // Replace the Main Item. @@ -48,16 +39,26 @@ private _replaceCode = switch ( _typeNumber ) do { default { // CfgGlasses items do not have a ItemInfo Subclass and therefore, not TypeNumber. switch (true) do { - case ("CfgGlasses" in str _cfg_origin) : { FUNC(replace_facewear) }; + case (isClass (configFile >> "CfgGlasses" >> configName _cfg_origin)) : { FUNC(replace_facewear) }; default { false }; }; }; }; + if (_replaceCode isEqualType true) exitWith {ZRN_LOG_MSG_2(replacecode undefined,_typeNumber,_replaceCode);}; [ _replaceCode, [_unit, _cfg_origin, _cfg_tgt, _additionalParams ], _duration * 1.0 ] call CBA_fnc_waitAndExecute; +// Remove / Add Missing/Surplus Items. +[_cfg_origin, _cfg_tgt] call FUNC(compare_components) params ["_missing", "_surplus"]; +{ + if (configName _cfg_tgt != _x) then { [_unit, _x, true] call CBA_fnc_addItem; }; +} forEach _surplus; +{ + if (configName _cfg_origin != _x) then { [_unit, _x] call CBA_fnc_removeItem; }; +} forEach _missing; + // Plays Random Sound At the Beginning private _sound_timing = getNumber (_cfg_tgt>> Q(ADDON) >> "sound_timing") max 0 min 1; From c67694998bf03ddcbc6ec5f8ec97463b35feab83 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 2 Jan 2025 18:37:13 +0100 Subject: [PATCH 039/305] Update Facewear.hpp --- addons/wardrobe/compat_vanilla/Facewear.hpp | 43 ++++++++++++++++----- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/addons/wardrobe/compat_vanilla/Facewear.hpp b/addons/wardrobe/compat_vanilla/Facewear.hpp index c4d138b9930..097c10774b9 100644 --- a/addons/wardrobe/compat_vanilla/Facewear.hpp +++ b/addons/wardrobe/compat_vanilla/Facewear.hpp @@ -2,22 +2,47 @@ // Parents class None; +class G_WirelessEarpiece_base_F; +class G_EyeProtectors_base_F; +class G_Sport_Blackred; -class G_Lowprofile : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_lowprofile) }; components[] = {"G_Lowprofile"}; }; }; -class G_Combat : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_combat), Q(G_Balaclava_TI_G_blk_F), Q(G_Balaclava_TI_G_tna_F) }; components[] = {"G_Combat"}; }; }; +// Common Components +class G_Lowprofile : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_lowprofile" }; components[] = {"G_Lowprofile"}; }; }; +class G_Combat : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_combat"), "G_Balaclava_TI_G_blk_F"), "G_Balaclava_TI_G_tna_F") }; components[] = {"G_Combat"}; }; }; + +class G_Aviator : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_aviator" }; components[] = {"G_Aviator"}; }; }; +class G_Shades_Black : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_shades" }; components[] = {"G_Shades_Black"}; }; }; // Balaclava, black -class G_Balaclava_blk : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_lowprofile), Q(G_Balaclava_combat) }; components[] = {"G_Balaclava_blk"}; }; }; -class G_Balaclava_combat : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_blk) }; components[] = {"G_Balaclava_blk","G_Combat"}; }; }; -class G_Balaclava_lowprofile : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_blk) }; components[] = {"G_Balaclava_blk","G_Lowprofile"}; }; }; +class G_Balaclava_blk : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_lowprofile"), "G_Balaclava_combat") }; components[] = {"G_Balaclava_blk"}; }; }; +class G_Balaclava_combat : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_blk" }; components[] = {"G_Balaclava_blk","G_Combat"}; }; }; +class G_Balaclava_lowprofile : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_blk" }; components[] = {"G_Balaclava_blk","G_Lowprofile"}; }; }; // Stealth Balaclava, black -class G_Balaclava_TI_blk_F : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_TI_G_blk_F) }; components[] = {"G_Balaclava_TI_blk_F"}; }; }; -class G_Balaclava_TI_G_blk_F : G_Balaclava_TI_blk_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_TI_blk_F) }; components[] = {"G_Balaclava_TI_blk_F","G_Combat"}; }; }; +class G_Balaclava_TI_blk_F : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_G_blk_F" }; components[] = {"G_Balaclava_TI_blk_F"}; }; }; +class G_Balaclava_TI_G_blk_F : G_Balaclava_TI_blk_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_blk_F" }; components[] = {"G_Balaclava_TI_blk_F","G_Combat"}; }; }; // Stealth Balaclava, green(tanoa) -class G_Balaclava_TI_tna_F : G_Balaclava_TI_blk_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_TI_G_tna_F) }; components[] = {"G_Balaclava_TI_tna_F"}; }; }; -class G_Balaclava_TI_G_tna_F : G_Balaclava_TI_tna_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(G_Balaclava_TI_tna_F) }; components[] = {"G_Balaclava_TI_tna_F","G_Combat"}; }; }; +class G_Balaclava_TI_tna_F : G_Balaclava_TI_blk_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_G_tna_F" }; components[] = {"G_Balaclava_TI_tna_F"}; }; }; +class G_Balaclava_TI_G_tna_F : G_Balaclava_TI_tna_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_tna_F" }; components[] = {"G_Balaclava_TI_tna_F","G_Combat"}; }; }; + + + +// Bandana, Black +G_Bandanna_blk : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_aviator" }; components[] = {"G_Bandanna_blk"}; }; }; + +G_Bandanna_shades : G_Bandanna_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Shades_Black" }; components[] = {"G_Shades_Black", "G_Bandanna_blk"}; }; }; +G_Bandanna_sport : G_Bandanna_shades { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Sport_Blackred" }; components[] = {"G_Sport_Blackred", "G_Bandanna_blk"}; }; }; +G_Bandanna_aviator : G_Bandanna_shades { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Aviator" }; components[] = {"G_Aviator", "G_Bandanna_blk"}; }; }; + + + + +// Eye Protector +G_EyeProtectors_F : G_EyeProtectors_base_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_Earpiece_F" }; components[] = {"G_EyeProtectors_F"}; }; }; +G_EyeProtectors_Earpiece_F : G_EyeProtectors_base_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_F", "G_WirelessEarpiece_F" }; components[] = {"G_EyeProtectors_F", "G_WirelessEarpiece_F"}; }; }; +G_WirelessEarpiece_F : G_WirelessEarpiece_base_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_Earpiece_F" }; components[] = {"G_WirelessEarpiece_F"}; }; }; + From 0478aa8ea636bfd5b09812eaf160b02072e55021 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 2 Jan 2025 18:42:29 +0100 Subject: [PATCH 040/305] missed ) --- addons/wardrobe/compat_vanilla/Facewear.hpp | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/addons/wardrobe/compat_vanilla/Facewear.hpp b/addons/wardrobe/compat_vanilla/Facewear.hpp index 097c10774b9..e540bc81939 100644 --- a/addons/wardrobe/compat_vanilla/Facewear.hpp +++ b/addons/wardrobe/compat_vanilla/Facewear.hpp @@ -4,43 +4,35 @@ class None; class G_WirelessEarpiece_base_F; class G_EyeProtectors_base_F; -class G_Sport_Blackred; - // Common Components class G_Lowprofile : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_lowprofile" }; components[] = {"G_Lowprofile"}; }; }; -class G_Combat : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_combat"), "G_Balaclava_TI_G_blk_F"), "G_Balaclava_TI_G_tna_F") }; components[] = {"G_Combat"}; }; }; +class G_Combat : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_combat", "G_Balaclava_TI_G_blk_F", "G_Balaclava_TI_G_tna_F" }; components[] = {"G_Combat"}; }; }; class G_Aviator : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_aviator" }; components[] = {"G_Aviator"}; }; }; class G_Shades_Black : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_shades" }; components[] = {"G_Shades_Black"}; }; }; + // Balaclava, black -class G_Balaclava_blk : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_lowprofile"), "G_Balaclava_combat") }; components[] = {"G_Balaclava_blk"}; }; }; +class G_Balaclava_blk : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_lowprofile", "G_Balaclava_combat" }; components[] = {"G_Balaclava_blk"}; }; }; class G_Balaclava_combat : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_blk" }; components[] = {"G_Balaclava_blk","G_Combat"}; }; }; class G_Balaclava_lowprofile : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_blk" }; components[] = {"G_Balaclava_blk","G_Lowprofile"}; }; }; - // Stealth Balaclava, black class G_Balaclava_TI_blk_F : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_G_blk_F" }; components[] = {"G_Balaclava_TI_blk_F"}; }; }; class G_Balaclava_TI_G_blk_F : G_Balaclava_TI_blk_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_blk_F" }; components[] = {"G_Balaclava_TI_blk_F","G_Combat"}; }; }; - // Stealth Balaclava, green(tanoa) class G_Balaclava_TI_tna_F : G_Balaclava_TI_blk_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_G_tna_F" }; components[] = {"G_Balaclava_TI_tna_F"}; }; }; class G_Balaclava_TI_G_tna_F : G_Balaclava_TI_tna_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_tna_F" }; components[] = {"G_Balaclava_TI_tna_F","G_Combat"}; }; }; - - // Bandana, Black G_Bandanna_blk : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_aviator" }; components[] = {"G_Bandanna_blk"}; }; }; - G_Bandanna_shades : G_Bandanna_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Shades_Black" }; components[] = {"G_Shades_Black", "G_Bandanna_blk"}; }; }; G_Bandanna_sport : G_Bandanna_shades { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Sport_Blackred" }; components[] = {"G_Sport_Blackred", "G_Bandanna_blk"}; }; }; G_Bandanna_aviator : G_Bandanna_shades { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Aviator" }; components[] = {"G_Aviator", "G_Bandanna_blk"}; }; }; - - // Eye Protector G_EyeProtectors_F : G_EyeProtectors_base_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_Earpiece_F" }; components[] = {"G_EyeProtectors_F"}; }; }; G_EyeProtectors_Earpiece_F : G_EyeProtectors_base_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_F", "G_WirelessEarpiece_F" }; components[] = {"G_EyeProtectors_F", "G_WirelessEarpiece_F"}; }; }; From 0728dea90908e3e900e2ea0977b0e0deb8526dca Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 2 Jan 2025 19:09:41 +0100 Subject: [PATCH 041/305] forgor "class" --- addons/wardrobe/compat_vanilla/Facewear.hpp | 34 ++++++++++----------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/addons/wardrobe/compat_vanilla/Facewear.hpp b/addons/wardrobe/compat_vanilla/Facewear.hpp index e540bc81939..0f73ff3b05a 100644 --- a/addons/wardrobe/compat_vanilla/Facewear.hpp +++ b/addons/wardrobe/compat_vanilla/Facewear.hpp @@ -7,34 +7,34 @@ class G_EyeProtectors_base_F; // Common Components class G_Lowprofile : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_lowprofile" }; components[] = {"G_Lowprofile"}; }; }; -class G_Combat : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_combat", "G_Balaclava_TI_G_blk_F", "G_Balaclava_TI_G_tna_F" }; components[] = {"G_Combat"}; }; }; +class G_Combat : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_combat", "G_Balaclava_TI_G_blk_F", "G_Balaclava_TI_G_tna_F" }; components[] = {"G_Combat"}; }; }; -class G_Aviator : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_aviator" }; components[] = {"G_Aviator"}; }; }; -class G_Shades_Black : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_shades" }; components[] = {"G_Shades_Black"}; }; }; +class G_Aviator : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_aviator" }; components[] = {"G_Aviator"}; }; }; +class G_Shades_Black : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_shades" }; components[] = {"G_Shades_Black"}; }; }; // Balaclava, black -class G_Balaclava_blk : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_lowprofile", "G_Balaclava_combat" }; components[] = {"G_Balaclava_blk"}; }; }; -class G_Balaclava_combat : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_blk" }; components[] = {"G_Balaclava_blk","G_Combat"}; }; }; +class G_Balaclava_blk : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_lowprofile", "G_Balaclava_combat" }; components[] = {"G_Balaclava_blk"}; }; }; +class G_Balaclava_combat : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_blk" }; components[] = {"G_Balaclava_blk","G_Combat"}; }; }; class G_Balaclava_lowprofile : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_blk" }; components[] = {"G_Balaclava_blk","G_Lowprofile"}; }; }; // Stealth Balaclava, black -class G_Balaclava_TI_blk_F : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_G_blk_F" }; components[] = {"G_Balaclava_TI_blk_F"}; }; }; -class G_Balaclava_TI_G_blk_F : G_Balaclava_TI_blk_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_blk_F" }; components[] = {"G_Balaclava_TI_blk_F","G_Combat"}; }; }; +class G_Balaclava_TI_blk_F : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_G_blk_F" }; components[] = {"G_Balaclava_TI_blk_F"}; }; }; +class G_Balaclava_TI_G_blk_F : G_Balaclava_TI_blk_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_blk_F" }; components[] = {"G_Balaclava_TI_blk_F","G_Combat"}; }; }; // Stealth Balaclava, green(tanoa) -class G_Balaclava_TI_tna_F : G_Balaclava_TI_blk_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_G_tna_F" }; components[] = {"G_Balaclava_TI_tna_F"}; }; }; -class G_Balaclava_TI_G_tna_F : G_Balaclava_TI_tna_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_tna_F" }; components[] = {"G_Balaclava_TI_tna_F","G_Combat"}; }; }; +class G_Balaclava_TI_tna_F : G_Balaclava_TI_blk_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_G_tna_F" }; components[] = {"G_Balaclava_TI_tna_F"}; }; }; +class G_Balaclava_TI_G_tna_F : G_Balaclava_TI_tna_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_tna_F" }; components[] = {"G_Balaclava_TI_tna_F","G_Combat"}; }; }; // Bandana, Black -G_Bandanna_blk : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_aviator" }; components[] = {"G_Bandanna_blk"}; }; }; -G_Bandanna_shades : G_Bandanna_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Shades_Black" }; components[] = {"G_Shades_Black", "G_Bandanna_blk"}; }; }; -G_Bandanna_sport : G_Bandanna_shades { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Sport_Blackred" }; components[] = {"G_Sport_Blackred", "G_Bandanna_blk"}; }; }; -G_Bandanna_aviator : G_Bandanna_shades { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Aviator" }; components[] = {"G_Aviator", "G_Bandanna_blk"}; }; }; +class G_Bandanna_blk : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_aviator", "G_Bandanna_sport", "G_Bandanna_aviator" }; components[] = {"G_Bandanna_blk"}; }; }; +class G_Bandanna_shades : G_Bandanna_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Shades_Black" }; components[] = {"G_Bandanna_blk", "G_Shades_Black" }; }; }; +class G_Bandanna_sport : G_Bandanna_shades { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Sport_Blackred" }; components[] = {"G_Bandanna_blk", "G_Sport_Blackred"}; }; }; +class G_Bandanna_aviator : G_Bandanna_shades { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Aviator" }; components[] = {"G_Bandanna_blk", "G_Aviator" }; }; }; -// Eye Protector -G_EyeProtectors_F : G_EyeProtectors_base_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_Earpiece_F" }; components[] = {"G_EyeProtectors_F"}; }; }; -G_EyeProtectors_Earpiece_F : G_EyeProtectors_base_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_F", "G_WirelessEarpiece_F" }; components[] = {"G_EyeProtectors_F", "G_WirelessEarpiece_F"}; }; }; -G_WirelessEarpiece_F : G_WirelessEarpiece_base_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_Earpiece_F" }; components[] = {"G_WirelessEarpiece_F"}; }; }; +// Eye Protector +class G_EyeProtectors_F : G_EyeProtectors_base_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_Earpiece_F" }; components[] = {"G_EyeProtectors_F"}; }; }; +class G_EyeProtectors_Earpiece_F : G_EyeProtectors_base_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_F", "G_WirelessEarpiece_F" }; components[] = {"G_EyeProtectors_F", "G_WirelessEarpiece_F"}; }; }; +class G_WirelessEarpiece_F : G_WirelessEarpiece_base_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_Earpiece_F" }; components[] = {"G_WirelessEarpiece_F"}; }; }; From a1b248f1301adf497a0b6d8e7371d95ce89c3fa2 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 01:55:35 +0100 Subject: [PATCH 042/305] zrn macro cleanup --- .../compat_gm_wardrobe/script_component.hpp | 2 +- .../compat_rf_wardrobe/script_component.hpp | 2 +- .../compat_sog_wardrobe/script_component.hpp | 2 +- .../script_component.hpp | 2 +- .../compat_ws_wardrobe/script_component.hpp | 2 +- .../wardrobe/functions/replace/fn_replace.sqf | 2 +- .../functions/replace/fn_replace_facewear.sqf | 3 - .../functions/replace/fn_replace_headgear.sqf | 3 - .../functions/replace/fn_replace_uniform.sqf | 2 - addons/wardrobe/script_component.hpp | 2 +- addons/wardrobe/script_macros_wardrobe.hpp | 25 ++++ addons/wardrobe/script_macros_zrn.hpp | 118 ------------------ 12 files changed, 32 insertions(+), 133 deletions(-) create mode 100644 addons/wardrobe/script_macros_wardrobe.hpp delete mode 100644 addons/wardrobe/script_macros_zrn.hpp diff --git a/addons/compat_gm/compat_gm_wardrobe/script_component.hpp b/addons/compat_gm/compat_gm_wardrobe/script_component.hpp index 6fc839abdb8..21f2a8d74d4 100644 --- a/addons/compat_gm/compat_gm_wardrobe/script_component.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/script_component.hpp @@ -2,4 +2,4 @@ #define SUBCOMPONENT_BEAUTIFIED Wardrobe Compatibility for GlobMo #include "..\script_component.hpp" -#include "\z\ace\addons\wardrobe\script_macros_zrn.hpp" +#include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp" diff --git a/addons/compat_rf/compat_rf_wardrobe/script_component.hpp b/addons/compat_rf/compat_rf_wardrobe/script_component.hpp index c6abb6601b1..b9375b33011 100644 --- a/addons/compat_rf/compat_rf_wardrobe/script_component.hpp +++ b/addons/compat_rf/compat_rf_wardrobe/script_component.hpp @@ -2,4 +2,4 @@ #define SUBCOMPONENT_BEAUTIFIED Wardrobe Compatibility for RF #include "..\script_component.hpp" -#include "\z\ace\addons\wardrobe\script_macros_zrn.hpp" \ No newline at end of file +#include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp" \ No newline at end of file diff --git a/addons/compat_sog/compat_sog_wardrobe/script_component.hpp b/addons/compat_sog/compat_sog_wardrobe/script_component.hpp index bc44bae5fc7..285bfd696d5 100644 --- a/addons/compat_sog/compat_sog_wardrobe/script_component.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/script_component.hpp @@ -2,4 +2,4 @@ #define SUBCOMPONENT_BEAUTIFIED Wardrobe Compatibility for SOG:PF #include "..\script_component.hpp" -#include "\z\ace\addons\wardrobe\script_macros_zrn.hpp" +#include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp" diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp index 262eb23a042..e02f07c5fcb 100644 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp @@ -2,4 +2,4 @@ #define SUBCOMPONENT_BEAUTIFIED Wardrobe Compatibility for SOG:PF - Uniform Fix #include "..\script_component.hpp" -#include "\z\ace\addons\wardrobe\script_macros_zrn.hpp" \ No newline at end of file +#include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp" \ No newline at end of file diff --git a/addons/compat_ws/compat_ws_wardrobe/script_component.hpp b/addons/compat_ws/compat_ws_wardrobe/script_component.hpp index 424cc0eb6a9..3cb1f8bd5c8 100644 --- a/addons/compat_ws/compat_ws_wardrobe/script_component.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/script_component.hpp @@ -2,4 +2,4 @@ #define SUBCOMPONENT_BEAUTIFIED Wardrobe Compatibility for Western Sahara #include "..\script_component.hpp" -#include "\z\ace\addons\wardrobe\script_macros_zrn.hpp" \ No newline at end of file +#include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp" \ No newline at end of file diff --git a/addons/wardrobe/functions/replace/fn_replace.sqf b/addons/wardrobe/functions/replace/fn_replace.sqf index 2206adac1d4..fd3db8b5d3f 100644 --- a/addons/wardrobe/functions/replace/fn_replace.sqf +++ b/addons/wardrobe/functions/replace/fn_replace.sqf @@ -46,7 +46,7 @@ private _replaceCode = switch ( _typeNumber ) do { }; -if (_replaceCode isEqualType true) exitWith {ZRN_LOG_MSG_2(replacecode undefined,_typeNumber,_replaceCode);}; +if (_replaceCode isEqualType false) exitWith {ERROR_2(replacecode undefined,_typeNumber,_replaceCode);}; [ _replaceCode, [_unit, _cfg_origin, _cfg_tgt, _additionalParams ], _duration * 1.0 ] call CBA_fnc_waitAndExecute; diff --git a/addons/wardrobe/functions/replace/fn_replace_facewear.sqf b/addons/wardrobe/functions/replace/fn_replace_facewear.sqf index e245f8a8569..a797edf87ce 100644 --- a/addons/wardrobe/functions/replace/fn_replace_facewear.sqf +++ b/addons/wardrobe/functions/replace/fn_replace_facewear.sqf @@ -15,9 +15,6 @@ * Public: No */ -ZRN_LOG_MSG_1(init,_this); - params ["_player", "_cfg_origin", "_cfg_tgt"]; - removeGoggles _player; _player addGoggles configName _cfg_tgt; \ No newline at end of file diff --git a/addons/wardrobe/functions/replace/fn_replace_headgear.sqf b/addons/wardrobe/functions/replace/fn_replace_headgear.sqf index b33abf195c0..f676e9fae6e 100644 --- a/addons/wardrobe/functions/replace/fn_replace_headgear.sqf +++ b/addons/wardrobe/functions/replace/fn_replace_headgear.sqf @@ -15,9 +15,6 @@ * Public: No */ -ZRN_LOG_MSG_1(init,_this); - params ["_player", "_cfg_origin", "_cfg_tgt"]; - removeHeadgear _player; _player addHeadgear configName _cfg_tgt; diff --git a/addons/wardrobe/functions/replace/fn_replace_uniform.sqf b/addons/wardrobe/functions/replace/fn_replace_uniform.sqf index b7e35a5f569..e8547160925 100644 --- a/addons/wardrobe/functions/replace/fn_replace_uniform.sqf +++ b/addons/wardrobe/functions/replace/fn_replace_uniform.sqf @@ -15,8 +15,6 @@ * Public: No */ -ZRN_LOG_MSG_1(init,_this); - params ["_player", "_cfg_origin", "_cfg_tgt", "_case"]; diff --git a/addons/wardrobe/script_component.hpp b/addons/wardrobe/script_component.hpp index 22f97fade07..3bfe0fd2d46 100644 --- a/addons/wardrobe/script_component.hpp +++ b/addons/wardrobe/script_component.hpp @@ -15,4 +15,4 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" -#include "\z\ace\addons\wardrobe\script_macros_zrn.hpp" \ No newline at end of file +#include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp" \ No newline at end of file diff --git a/addons/wardrobe/script_macros_wardrobe.hpp b/addons/wardrobe/script_macros_wardrobe.hpp new file mode 100644 index 00000000000..3759c81b5bd --- /dev/null +++ b/addons/wardrobe/script_macros_wardrobe.hpp @@ -0,0 +1,25 @@ +// CBA Settings +#define SET(var1) TRIPLES(ADDON,set,var1) +#define QSET(var1) Q(SET(var1)) +#define QQSET(var1) QQ(SET(var1)) +#define ESET(var1,var2) TRIPLES(DOUBLES(PREFIX,var1),SET,var2) +#define QESET(var1,var2) Q(ESET(var1,var2)) +#define QQESET(var1,var2) QQ(ESET(var1,var2)) + +// LSTRING for cba Settings +#define SETLSTRING(key) [LSTRING(DOUBLES(set,key)),LSTRING(TRIPLES(set,key,desc))] + +#define Q(var1) QUOTE(var1) +#define QQ(var1) Q(Q(var1)) + +#define QADDON Q(ADDON) + +// Prefix Variables +#define PVAR(var1) DOUBLES(PREFIX,var1) +#define QPVAR(var1) QUOTE(PVAR(var1)) +#define QQPVAR(var1) QUOTE(QPVAR(var1)) + +// Paths +#define PATH_TO_FUNC QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\functions) +#define PATH_TO_FUNC_SUB(var1) QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\functions\var1) +#define PATH_TO_ADDON(var1) QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\var1) \ No newline at end of file diff --git a/addons/wardrobe/script_macros_zrn.hpp b/addons/wardrobe/script_macros_zrn.hpp deleted file mode 100644 index c2179c41144..00000000000 --- a/addons/wardrobe/script_macros_zrn.hpp +++ /dev/null @@ -1,118 +0,0 @@ -#ifdef __A3_DEBUG__ - #define _ZRN_DEBUG_ -#endif - - -// CBA Settings -#define SET(var1) TRIPLES(ADDON,set,var1) -#define QSET(var1) Q(SET(var1)) -#define QQSET(var1) QQ(SET(var1)) -#define ESET(var1,var2) TRIPLES(DOUBLES(PREFIX,var1),SET,var2) -#define QESET(var1,var2) Q(ESET(var1,var2)) -#define QQESET(var1,var2) QQ(ESET(var1,var2)) - - -// Stringtable.xml - use LSTRING() instead -#define SETLSTRING(key) [LSTRING(DOUBLES(set,key)),LSTRING(TRIPLES(set,key,desc))] - - -// Quotes -#ifndef QUOTE - #define QUOTE(var1) #var1 -#endif -#define QQUOTE(var1) QUOTE(QUOTE(var1)) -#define Q(var1) QUOTE(var1) -#define QQ(var1) QQUOTE(var1) - -#define QADDON Q(ADDON) -#define QPREFIX Q(PREFIX) -#define QCOMPONENT Q(COMPONENT) - - -// Prefix Function -#define PFUNC(var1) TRIPLES(PREFIX,fnc,var1) -#define QPFUNC(var1) QUOTE(PFUNC(var1)) -#define QQPFUNC(var1) QUOTE(QPFUNC(var1)) - - -// Prefix Variables -#define PVAR(var1) DOUBLES(PREFIX,var1) -#define QPVAR(var1) QUOTE(PVAR(var1)) -#define QQPVAR(var1) QUOTE(QPVAR(var1)) - - -// missionNamespace set/get Variables -#define SETMGVAR(name,value) (missionNamespace setVariable [QGVAR(name),value]) -#define SETMGVAR_PUBLIC(name,value,public) (missionNamespace setVariable [QGVAR(name),value,public]) -#define GETMGVAR(name,default) (missionNamespace getVariable [QGVAR(name),default]) - - -// CfgPatches Stuff -#ifndef PREFIX_BEAUTIFIED - #define PREFIX_BEAUTIFIED PREFIX -#endif -#ifndef COMPONENT_BEAUTIFIED - #define COMPONENT_BEAUTIFIED COMPONENT -#endif - -#define ADDON_NAME Q(PREFIX_BEAUTIFIED - COMPONENT_BEAUTIFIED) - -// Paths -#define PATH_TO_FUNC QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\functions) -#define PATH_TO_FUNC_SUB(var1) QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\functions\var1) -#define PATH_TO_ADDON(var1) QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\var1) -#define PATH_TO_ADDON_2(var1,var2) QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\var1\var2) -#define PATH_TO_ADDON_3(var1,var2,var3) QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\var1\var2\var3) - -#define QPATH_TO_ADDON(var1) QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\var1) -#define QQPATH_TO_ADDON(var1) Q(QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\var1)) - - -// Debug -#define DEBUG_HEADER format [QUOTE([PREFIX][COMPONENT](%1)),_fnc_scriptName] - -#define ZRN_LOG_MSG(MSG) diag_log (DEBUG_HEADER + " " + QUOTE(MSG)) - -#ifdef _ZRN_DEBUG_ - #define ZRN_SCRIPTNAME(var1) private _fnc_scriptName = Q(var1) - - #define ZRN_LOG_MSG_1(MSG,A) diag_log (DEBUG_HEADER + (format [' %1 - A: %2',QUOTE(MSG),RETNIL(A)])) - #define ZRN_LOG_MSG_2(MSG,A,B) diag_log (DEBUG_HEADER + (format [' %1 - A: %2 - B: %3',QUOTE(MSG),RETNIL(A),RETNIL(B)])) - #define ZRN_LOG_MSG_3(MSG,A,B,C) diag_log (DEBUG_HEADER + (format [' %1 - A: %2 - B: %3 - C: %4',QUOTE(MSG),RETNIL(A),RETNIL(B),RETNIL(C)])) - #define ZRN_LOG_MSG_4(MSG,A,B,C,D) diag_log (DEBUG_HEADER + (format [' %1 - A: %2 - B: %3 - C: %4 - D: %5',QUOTE(MSG),RETNIL(A),RETNIL(B),RETNIL(C),RETNIL(D)])) - #define ZRN_LOG_MSG_5(MSG,A,B,C,D,E) diag_log (DEBUG_HEADER + (format [' %1 - A: %2 - B: %3 - C: %4 - D: %5 - E: %6',QUOTE(MSG),RETNIL(A),RETNIL(B),RETNIL(C),RETNIL(D),RETNIL(E)])) - #define ZRN_LOG_MSG_6(MSG,A,B,C,D,E,F) diag_log (DEBUG_HEADER + (format [' %1 - A: %2 - B: %3 - C: %4 - D: %5 - E: %6 - F: %7',QUOTE(MSG),RETNIL(A),RETNIL(B),RETNIL(C),RETNIL(D),RETNIL(E),RETNIL(F)])) - #define ZRN_LOG_MSG_7(MSG,A,B,C,D,E,F,G) diag_log (DEBUG_HEADER + (format [' %1 - A: %2 - B: %3 - C: %4 - D: %5 - E: %6 - F: %7 - H: %8',QUOTE(MSG),RETNIL(A),RETNIL(B),RETNIL(C),RETNIL(D),RETNIL(E),RETNIL(F),RETNIL(G)])) - #define ZRN_LOG_MSG_8(MSG,A,B,C,D,E,F,G,H) diag_log (DEBUG_HEADER + (format [' %1 - A: %2 - B: %3 - C: %4 - D: %5 - E: %6 - F: %7 - H: %8 - I: %9',QUOTE(MSG),RETNIL(A),RETNIL(B),RETNIL(C),RETNIL(D),RETNIL(E),RETNIL(F),RETNIL(G),RETNIL(H)])) - - #define ZRN_LOG_1(A) diag_log (DEBUG_HEADER + (format [' A: %1',RETNIL(A)])) - #define ZRN_LOG_2(A,B) diag_log (DEBUG_HEADER + (format [' A: %1 - B: %2',RETNIL(A),RETNIL(B)])) - #define ZRN_LOG_3(A,B,C) diag_log (DEBUG_HEADER + (format [' A: %1 - B: %2 - C: %3',RETNIL(A),RETNIL(B),RETNIL(C)])) - #define ZRN_LOG_4(A,B,C,D) diag_log (DEBUG_HEADER + (format [' A: %1 - B: %2 - C: %3 - D: %4',RETNIL(A),RETNIL(B),RETNIL(C),RETNIL(D)])) - #define ZRN_LOG_5(A,B,C,D,E) diag_log (DEBUG_HEADER + (format [' A: %1 - B: %2 - C: %3 - D: %4 - E: %5',RETNIL(A),RETNIL(B),RETNIL(C),RETNIL(D),RETNIL(E)])) - #define ZRN_LOG_6(A,B,C,D,E,F) diag_log (DEBUG_HEADER + (format [' A: %1 - B: %2 - C: %3 - D: %4 - E: %5 - F: %6',RETNIL(A),RETNIL(B),RETNIL(C),RETNIL(D),RETNIL(E),RETNIL(F)])) - #define ZRN_LOG_7(A,B,C,D,E,F,G) diag_log (DEBUG_HEADER + (format [' A: %1 - B: %2 - C: %3 - D: %4 - E: %5 - F: %6 - H: %7',RETNIL(A),RETNIL(B),RETNIL(C),RETNIL(D),RETNIL(E),RETNIL(F),RETNIL(G)])) - #define ZRN_LOG_8(A,B,C,D,E,F,G,H) diag_log (DEBUG_HEADER + (format [' A: %1 - B: %2 - C: %3 - D: %4 - E: %5 - F: %6 - H: %7 - I: %8',RETNIL(A),RETNIL(B),RETNIL(C),RETNIL(D),RETNIL(E),RETNIL(F),RETNIL(G),RETNIL(H)])) - -#else - #define ZRN_SCRIPTNAME(var1) - - #define ZRN_LOG_MSG_1(MSG,A) - #define ZRN_LOG_MSG_2(MSG,A,B) - #define ZRN_LOG_MSG_3(MSG,A,B,C) - #define ZRN_LOG_MSG_4(MSG,A,B,C,D) - #define ZRN_LOG_MSG_5(MSG,A,B,C,D,E) - #define ZRN_LOG_MSG_6(MSG,A,B,C,D,E,F) - #define ZRN_LOG_MSG_7(MSG,A,B,C,D,E,F,G) - #define ZRN_LOG_MSG_8(MSG,A,B,C,D,E,F,G,H) - - #define ZRN_LOG_1(A) - #define ZRN_LOG_2(A,B) - #define ZRN_LOG_3(A,B,C) - #define ZRN_LOG_4(A,B,C,D) - #define ZRN_LOG_5(A,B,C,D,E) - #define ZRN_LOG_6(A,B,C,D,E,F) - #define ZRN_LOG_7(A,B,C,D,E,F,G) - #define ZRN_LOG_8(A,B,C,D,E,F,G,H) - -#endif \ No newline at end of file From 34dfa5e4c80c40f59eb0b2dac7ac74c9089e4201 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:12:41 +0100 Subject: [PATCH 043/305] pvar -> ace_ --- .../compat_gm/compat_gm_wardrobe/Helmets.hpp | 12 ++-- .../compat_gm/compat_gm_wardrobe/Uniforms.hpp | 68 +++++++++---------- .../compat_gm/compat_gm_wardrobe/config.cpp | 2 +- .../compat_rf_wardrobe/CfgWardrobe.hpp | 4 +- .../compat_rf/compat_rf_wardrobe/Helmets.hpp | 8 +-- .../compat_rf/compat_rf_wardrobe/Uniforms.hpp | 16 ++--- .../compat_rf/compat_rf_wardrobe/config.cpp | 2 +- .../compat_sog_wardrobe/Booniehats.hpp | 26 +++---- .../compat_sog_wardrobe/Pilothelmets.hpp | 8 +-- .../compat_sog_wardrobe/Uniforms_B.hpp | 4 +- .../compat_sog_wardrobe/Uniforms_O.hpp | 4 +- .../compat_sog/compat_sog_wardrobe/config.cpp | 2 +- .../config.cpp | 2 +- .../compat_ws_wardrobe/CfgWardrobe.hpp | 4 +- .../compat_ws/compat_ws_wardrobe/Turbans.hpp | 34 +++++----- .../compat_ws/compat_ws_wardrobe/config.cpp | 2 +- addons/wardrobe/compat_vanilla/Facewear.hpp | 36 +++++----- addons/wardrobe/compat_vanilla/Uniforms.hpp | 4 +- .../functions/fn_compare_components.sqf | 4 +- addons/wardrobe/functions/fn_isModifiable.sqf | 2 +- addons/wardrobe/script_macros_wardrobe.hpp | 8 +-- 21 files changed, 123 insertions(+), 129 deletions(-) diff --git a/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp b/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp index 1d8a7e52f32..c3d4d023e66 100644 --- a/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp @@ -6,9 +6,9 @@ class gm_ge_headgear_psh77_cover_up_base; class gm_ge_headgear_psh77_down_base; class gm_ge_headgear_psh77_up_base; -class gm_ge_bgs_headgear_psh77_cover_down_smp : gm_ge_headgear_psh77_cover_down_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_up_smp" }; }; }; -class gm_ge_bgs_headgear_psh77_cover_up_smp : gm_ge_headgear_psh77_cover_up_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_down_smp" }; }; }; -class gm_ge_bgs_headgear_psh77_cover_down_str : gm_ge_headgear_psh77_cover_down_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_up_str" }; }; }; -class gm_ge_bgs_headgear_psh77_cover_up_str : gm_ge_headgear_psh77_cover_up_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_down_str" }; }; }; -class gm_ge_headgear_psh77_down_oli : gm_ge_headgear_psh77_down_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { "gm_ge_headgear_psh77_up_oli" }; }; }; -class gm_ge_headgear_psh77_up_oli : gm_ge_headgear_psh77_up_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { "gm_ge_headgear_psh77_down_oli" }; }; }; \ No newline at end of file +class gm_ge_bgs_headgear_psh77_cover_down_smp : gm_ge_headgear_psh77_cover_down_base { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_up_smp" }; }; }; +class gm_ge_bgs_headgear_psh77_cover_up_smp : gm_ge_headgear_psh77_cover_up_base { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_down_smp" }; }; }; +class gm_ge_bgs_headgear_psh77_cover_down_str : gm_ge_headgear_psh77_cover_down_base { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_up_str" }; }; }; +class gm_ge_bgs_headgear_psh77_cover_up_str : gm_ge_headgear_psh77_cover_up_base { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_down_str" }; }; }; +class gm_ge_headgear_psh77_down_oli : gm_ge_headgear_psh77_down_base { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { "gm_ge_headgear_psh77_up_oli" }; }; }; +class gm_ge_headgear_psh77_up_oli : gm_ge_headgear_psh77_up_base { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { "gm_ge_headgear_psh77_down_oli" }; }; }; \ No newline at end of file diff --git a/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp b/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp index 999de64c24e..324b4f9fc6b 100644 --- a/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp @@ -5,53 +5,53 @@ class gm_ge_bgs_uniform_special_80_base; class gm_ge_bgs_uniform_special_rolled_80_base; -class gm_ge_bgs_uniform_special_80_grn : gm_ge_bgs_uniform_special_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_bgs_uniform_special_rolled_80_grn) }; }; }; -class gm_ge_bgs_uniform_special_rolled_80_grn : gm_ge_bgs_uniform_special_rolled_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_bgs_uniform_special_80_grn) }; }; }; +class gm_ge_bgs_uniform_special_80_grn : gm_ge_bgs_uniform_special_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_bgs_uniform_special_rolled_80_grn) }; }; }; +class gm_ge_bgs_uniform_special_rolled_80_grn : gm_ge_bgs_uniform_special_rolled_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_bgs_uniform_special_80_grn) }; }; }; -class gm_ge_bgs_uniform_special_80_blk : gm_ge_bgs_uniform_special_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_bgs_uniform_special_rolled_80_blk) }; }; }; -class gm_ge_bgs_uniform_special_rolled_80_blk : gm_ge_bgs_uniform_special_rolled_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_bgs_uniform_special_80_blk) }; }; }; +class gm_ge_bgs_uniform_special_80_blk : gm_ge_bgs_uniform_special_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_bgs_uniform_special_rolled_80_blk) }; }; }; +class gm_ge_bgs_uniform_special_rolled_80_blk : gm_ge_bgs_uniform_special_rolled_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_bgs_uniform_special_80_blk) }; }; }; class gm_ge_army_uniform_pilot_base; class gm_ge_army_uniform_pilot_rolled_base; -class gm_ge_army_uniform_pilot_sar : gm_ge_army_uniform_pilot_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_army_uniform_pilot_rolled_sar) }; }; }; -class gm_ge_army_uniform_pilot_rolled_sar : gm_ge_army_uniform_pilot_rolled_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_army_uniform_pilot_sar) }; }; }; +class gm_ge_army_uniform_pilot_sar : gm_ge_army_uniform_pilot_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_army_uniform_pilot_rolled_sar) }; }; }; +class gm_ge_army_uniform_pilot_rolled_sar : gm_ge_army_uniform_pilot_rolled_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_army_uniform_pilot_sar) }; }; }; -class gm_ge_army_uniform_pilot_oli : gm_ge_army_uniform_pilot_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_army_uniform_pilot_oli) }; }; }; -class gm_ge_army_uniform_pilot_rolled_oli : gm_ge_army_uniform_pilot_rolled_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_army_uniform_pilot_rolled_oli) }; }; }; +class gm_ge_army_uniform_pilot_oli : gm_ge_army_uniform_pilot_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_army_uniform_pilot_oli) }; }; }; +class gm_ge_army_uniform_pilot_rolled_oli : gm_ge_army_uniform_pilot_rolled_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_army_uniform_pilot_rolled_oli) }; }; }; -class gm_ge_pol_uniform_pilot_grn : gm_ge_army_uniform_pilot_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_pol_uniform_pilot_rolled_grn) }; }; }; -class gm_ge_pol_uniform_pilot_rolled_grn : gm_ge_army_uniform_pilot_rolled_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_pol_uniform_pilot_grn) }; }; }; +class gm_ge_pol_uniform_pilot_grn : gm_ge_army_uniform_pilot_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_pol_uniform_pilot_rolled_grn) }; }; }; +class gm_ge_pol_uniform_pilot_rolled_grn : gm_ge_army_uniform_pilot_rolled_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_pol_uniform_pilot_grn) }; }; }; class gm_ge_uniform_pilot_commando_base; class gm_ge_uniform_pilot_commando_rolled_base; -class gm_ge_uniform_pilot_commando_oli : gm_ge_uniform_pilot_commando_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_rolled_oli) }; }; }; -class gm_ge_uniform_pilot_commando_rolled_oli : gm_ge_uniform_pilot_commando_rolled_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_oli) }; }; }; +class gm_ge_uniform_pilot_commando_oli : gm_ge_uniform_pilot_commando_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_rolled_oli) }; }; }; +class gm_ge_uniform_pilot_commando_rolled_oli : gm_ge_uniform_pilot_commando_rolled_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_oli) }; }; }; -class gm_ge_uniform_pilot_commando_gry : gm_ge_uniform_pilot_commando_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_rolled_gry) }; }; }; -class gm_ge_uniform_pilot_commando_rolled_gry : gm_ge_uniform_pilot_commando_rolled_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_gry) }; }; }; +class gm_ge_uniform_pilot_commando_gry : gm_ge_uniform_pilot_commando_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_rolled_gry) }; }; }; +class gm_ge_uniform_pilot_commando_rolled_gry : gm_ge_uniform_pilot_commando_rolled_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_gry) }; }; }; -class gm_ge_uniform_pilot_commando_blk : gm_ge_uniform_pilot_commando_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_rolled_blk) }; }; }; -class gm_ge_uniform_pilot_commando_rolled_blk : gm_ge_uniform_pilot_commando_rolled_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_blk) }; }; }; +class gm_ge_uniform_pilot_commando_blk : gm_ge_uniform_pilot_commando_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_rolled_blk) }; }; }; +class gm_ge_uniform_pilot_commando_rolled_blk : gm_ge_uniform_pilot_commando_rolled_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_blk) }; }; }; class gm_pl_uniform_soldier_80_base; -class gm_pl_army_uniform_soldier_80_frog : gm_pl_uniform_soldier_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_pl_army_uniform_soldier_rolled_80_frog) }; }; }; -class gm_pl_army_uniform_soldier_rolled_80_frog : gm_pl_uniform_soldier_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_pl_army_uniform_soldier_80_frog) }; }; }; +class gm_pl_army_uniform_soldier_80_frog : gm_pl_uniform_soldier_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_pl_army_uniform_soldier_rolled_80_frog) }; }; }; +class gm_pl_army_uniform_soldier_rolled_80_frog : gm_pl_uniform_soldier_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_pl_army_uniform_soldier_80_frog) }; }; }; -class gm_pl_army_uniform_soldier_80_moro : gm_pl_uniform_soldier_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_pl_army_uniform_soldier_rolled_80_moro) }; }; }; -class gm_pl_army_uniform_soldier_rolled_80_moro : gm_pl_uniform_soldier_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_pl_army_uniform_soldier_80_moro) }; }; }; +class gm_pl_army_uniform_soldier_80_moro : gm_pl_uniform_soldier_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_pl_army_uniform_soldier_rolled_80_moro) }; }; }; +class gm_pl_army_uniform_soldier_rolled_80_moro : gm_pl_uniform_soldier_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_pl_army_uniform_soldier_80_moro) }; }; }; class gm_ge_uniform_soldier_90_base; -class gm_ge_uniform_soldier_90_trp : gm_ge_uniform_soldier_90_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_soldier_rolled_90_trp) }; }; }; -class gm_ge_uniform_soldier_rolled_90_trp : gm_ge_uniform_soldier_90_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_soldier_90_trp) }; }; }; +class gm_ge_uniform_soldier_90_trp : gm_ge_uniform_soldier_90_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_soldier_rolled_90_trp) }; }; }; +class gm_ge_uniform_soldier_rolled_90_trp : gm_ge_uniform_soldier_90_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_soldier_90_trp) }; }; }; -class gm_ge_uniform_soldier_90_flk : gm_ge_uniform_soldier_90_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_soldier_rolled_90_flk) }; }; }; -class gm_ge_uniform_soldier_rolled_90_flk : gm_ge_uniform_soldier_90_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_soldier_90_flk) }; }; }; +class gm_ge_uniform_soldier_90_flk : gm_ge_uniform_soldier_90_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_soldier_rolled_90_flk) }; }; }; +class gm_ge_uniform_soldier_rolled_90_flk : gm_ge_uniform_soldier_90_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_soldier_90_flk) }; }; }; @@ -59,24 +59,24 @@ class gm_ge_uniform_soldier_rolled_90_flk : gm_ge_uniform_soldier_90_base { clas // Gloves class gm_gc_uniform_soldier_80_base; -class gm_gc_army_uniform_soldier_gloves_80_str : gm_gc_uniform_soldier_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_gloves_on) { modifiableTo[] = { Q(gm_gc_army_uniform_soldier_80_str) }; }; }; -class gm_gc_army_uniform_soldier_80_str : gm_gc_uniform_soldier_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_gloves_off) { modifiableTo[] = { Q(gm_gc_army_uniform_soldier_gloves_80_str) }; }; }; +class gm_gc_army_uniform_soldier_gloves_80_str : gm_gc_uniform_soldier_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_on) { modifiableTo[] = { Q(gm_gc_army_uniform_soldier_80_str) }; }; }; +class gm_gc_army_uniform_soldier_80_str : gm_gc_uniform_soldier_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_off) { modifiableTo[] = { Q(gm_gc_army_uniform_soldier_gloves_80_str) }; }; }; class gm_ge_uniform_soldier_80_base; -class gm_ge_army_uniform_soldier_gloves_80_ols : gm_ge_uniform_soldier_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_gloves_on) { modifiableTo[] = { Q(gm_ge_army_uniform_soldier_80_ols) }; }; }; -class gm_ge_army_uniform_soldier_80_ols : gm_ge_uniform_soldier_80_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_gloves_off) { modifiableTo[] = { Q(gm_ge_army_uniform_soldier_gloves_80_ols) }; }; }; +class gm_ge_army_uniform_soldier_gloves_80_ols : gm_ge_uniform_soldier_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_on) { modifiableTo[] = { Q(gm_ge_army_uniform_soldier_80_ols) }; }; }; +class gm_ge_army_uniform_soldier_80_ols : gm_ge_uniform_soldier_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_off) { modifiableTo[] = { Q(gm_ge_army_uniform_soldier_gloves_80_ols) }; }; }; // Mixed case -> Base Interaction class gm_ge_army_uniform_soldier_bdu_80_wdl; class gm_ge_army_uniform_soldier_bdu_rolled_80_wdl; -class gm_xx_uniform_soldier_bdu_80_wdl : gm_ge_army_uniform_soldier_bdu_80_wdl { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_gloves_on) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_rolled_80_wdl), Q(gm_xx_uniform_soldier_bdu_nogloves_80_wdl) }; }; }; -class gm_xx_uniform_soldier_bdu_rolled_80_wdl : gm_ge_army_uniform_soldier_bdu_rolled_80_wdl { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_wdl), Q(gm_xx_uniform_soldier_bdu_nogloves_80_wdl) }; }; }; -class gm_xx_uniform_soldier_bdu_nogloves_80_wdl : gm_ge_army_uniform_soldier_bdu_80_wdl { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_wdl), Q(gm_xx_uniform_soldier_bdu_rolled_80_wdl) }; }; }; +class gm_xx_uniform_soldier_bdu_80_wdl : gm_ge_army_uniform_soldier_bdu_80_wdl { class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_on) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_rolled_80_wdl), Q(gm_xx_uniform_soldier_bdu_nogloves_80_wdl) }; }; }; +class gm_xx_uniform_soldier_bdu_rolled_80_wdl : gm_ge_army_uniform_soldier_bdu_rolled_80_wdl { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_wdl), Q(gm_xx_uniform_soldier_bdu_nogloves_80_wdl) }; }; }; +class gm_xx_uniform_soldier_bdu_nogloves_80_wdl : gm_ge_army_uniform_soldier_bdu_80_wdl { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_wdl), Q(gm_xx_uniform_soldier_bdu_rolled_80_wdl) }; }; }; -class gm_xx_uniform_soldier_bdu_80_oli : gm_ge_army_uniform_soldier_bdu_80_wdl { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_gloves_on) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_rolled_80_oli), Q(gm_xx_uniform_soldier_bdu_nogloves_80_oli) }; }; }; -class gm_xx_uniform_soldier_bdu_rolled_80_oli : gm_ge_army_uniform_soldier_bdu_rolled_80_wdl { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_oli), Q(gm_xx_uniform_soldier_bdu_nogloves_80_oli) }; }; }; -class gm_xx_uniform_soldier_bdu_nogloves_80_oli : gm_ge_army_uniform_soldier_bdu_80_wdl { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_oli), Q(gm_xx_uniform_soldier_bdu_rolled_80_oli) }; }; }; +class gm_xx_uniform_soldier_bdu_80_oli : gm_ge_army_uniform_soldier_bdu_80_wdl { class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_on) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_rolled_80_oli), Q(gm_xx_uniform_soldier_bdu_nogloves_80_oli) }; }; }; +class gm_xx_uniform_soldier_bdu_rolled_80_oli : gm_ge_army_uniform_soldier_bdu_rolled_80_wdl { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_oli), Q(gm_xx_uniform_soldier_bdu_nogloves_80_oli) }; }; }; +class gm_xx_uniform_soldier_bdu_nogloves_80_oli : gm_ge_army_uniform_soldier_bdu_80_wdl { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_oli), Q(gm_xx_uniform_soldier_bdu_rolled_80_oli) }; }; }; diff --git a/addons/compat_gm/compat_gm_wardrobe/config.cpp b/addons/compat_gm/compat_gm_wardrobe/config.cpp index a3a1683f408..3ddc38573a5 100644 --- a/addons/compat_gm/compat_gm_wardrobe/config.cpp +++ b/addons/compat_gm/compat_gm_wardrobe/config.cpp @@ -10,7 +10,7 @@ class CfgPatches { VERSION_CONFIG; addonRootClass = QUOTE(ADDON); requiredAddons[] = { - QPVAR(wardrobe), + "ace_wardrobe", "gm_core" }; skipWhenMissingDependencies = 1; diff --git a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp index 7973d34ce81..dc891c51af4 100644 --- a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp @@ -14,8 +14,8 @@ class CfgWeapons // Cap (Ion) Forward and Reversed class lxWS_H_CapB_rvs_blk; - class lxWS_H_CapB_rvs_blk_ION: lxWS_H_CapB_rvs_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "H_Cap_headphones_ion_lxws" }; }; }; - class H_Cap_headphones_ion_lxws: lxWS_H_CapB_rvs_blk_ION { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "lxWS_H_CapB_rvs_blk_ION" }; }; }; + class lxWS_H_CapB_rvs_blk_ION: lxWS_H_CapB_rvs_blk { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "H_Cap_headphones_ion_lxws" }; }; }; + class H_Cap_headphones_ion_lxws: lxWS_H_CapB_rvs_blk_ION { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "lxWS_H_CapB_rvs_blk_ION" }; }; }; }; diff --git a/addons/compat_rf/compat_rf_wardrobe/Helmets.hpp b/addons/compat_rf/compat_rf_wardrobe/Helmets.hpp index 111db01f951..8b38ea87608 100644 --- a/addons/compat_rf/compat_rf_wardrobe/Helmets.hpp +++ b/addons/compat_rf/compat_rf_wardrobe/Helmets.hpp @@ -6,15 +6,15 @@ #define HELMET_VARIANT(color)\ -class CN(color): H_HelmetHeavy_Black_RF { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { Q(CN_VU(color)) }; }; };\ -class CN_VU(color): H_HelmetHeavy_VisorUp_Black_RF { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { Q(CN(color)) }; }; };\ +class CN(color): H_HelmetHeavy_Black_RF { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { Q(CN_VU(color)) }; }; };\ +class CN_VU(color): H_HelmetHeavy_VisorUp_Black_RF { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { Q(CN(color)) }; }; };\ // Base Classes class H_HelmetAggressor_F; -class H_HelmetHeavy_Black_RF : H_HelmetAggressor_F { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { "H_HelmetHeavy_VisorUp_Black_RF" }; }; }; -class H_HelmetHeavy_VisorUp_Black_RF : H_HelmetHeavy_Black_RF { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { "H_HelmetHeavy_Black_RF" }; }; }; +class H_HelmetHeavy_Black_RF : H_HelmetAggressor_F { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { "H_HelmetHeavy_VisorUp_Black_RF" }; }; }; +class H_HelmetHeavy_VisorUp_Black_RF : H_HelmetHeavy_Black_RF { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { "H_HelmetHeavy_Black_RF" }; }; }; // Variants HELMET_VARIANT(Hex) diff --git a/addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp b/addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp index 7bd89dc0e8c..fc1af3df27a 100644 --- a/addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp +++ b/addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp @@ -4,8 +4,8 @@ class Uniform_Base; // Macros #define UNIFORM_BASE(class1,class2)\ -class class1: Uniform_Base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(class2) }; }; };\ -class class2: Uniform_Base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(class1) }; }; }; +class class1: Uniform_Base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(class2) }; }; };\ +class class2: Uniform_Base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(class1) }; }; }; // Simple Variants UNIFORM_BASE(U_C_FirefighterFatigues_RF,U_C_FirefighterFatigues_RolledUp_RF) @@ -13,11 +13,11 @@ UNIFORM_BASE(U_BG_Guerrilla_6_1,U_BG_Guerrilla_RF) // Pilot Jackets -class U_C_PilotJacket_black_RF : Uniform_Base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { Q(U_C_PilotJacket_open_black_RF) }; }; }; -class U_C_PilotJacket_open_black_RF : U_C_PilotJacket_black_RF { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { Q(U_C_PilotJacket_black_RF) }; }; }; +class U_C_PilotJacket_black_RF : Uniform_Base { class ace_wardrobe : EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { Q(U_C_PilotJacket_open_black_RF) }; }; }; +class U_C_PilotJacket_open_black_RF : U_C_PilotJacket_black_RF { class ace_wardrobe : EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { Q(U_C_PilotJacket_black_RF) }; }; }; -class U_C_PilotJacket_brown_RF : U_C_PilotJacket_black_RF { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { Q(U_C_PilotJacket_open_brown_RF) }; }; }; -class U_C_PilotJacket_open_brown_RF : U_C_PilotJacket_brown_RF { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { Q(U_C_PilotJacket_brown_RF) }; }; }; +class U_C_PilotJacket_brown_RF : U_C_PilotJacket_black_RF { class ace_wardrobe : EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { Q(U_C_PilotJacket_open_brown_RF) }; }; }; +class U_C_PilotJacket_open_brown_RF : U_C_PilotJacket_brown_RF { class ace_wardrobe : EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { Q(U_C_PilotJacket_brown_RF) }; }; }; -class U_C_PilotJacket_lbrown_RF : U_C_PilotJacket_black_RF { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { Q(U_C_PilotJacket_open_lbrown_RF) }; }; }; -class U_C_PilotJacket_open_lbrown_RF : U_C_PilotJacket_lbrown_RF { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { Q(U_C_PilotJacket_lbrown_RF) }; }; }; +class U_C_PilotJacket_lbrown_RF : U_C_PilotJacket_black_RF { class ace_wardrobe : EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { Q(U_C_PilotJacket_open_lbrown_RF) }; }; }; +class U_C_PilotJacket_open_lbrown_RF : U_C_PilotJacket_lbrown_RF { class ace_wardrobe : EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { Q(U_C_PilotJacket_lbrown_RF) }; }; }; diff --git a/addons/compat_rf/compat_rf_wardrobe/config.cpp b/addons/compat_rf/compat_rf_wardrobe/config.cpp index 704ee9bf340..717c785aa98 100644 --- a/addons/compat_rf/compat_rf_wardrobe/config.cpp +++ b/addons/compat_rf/compat_rf_wardrobe/config.cpp @@ -10,7 +10,7 @@ class CfgPatches { VERSION_CONFIG; addonRootClass = QUOTE(ADDON); requiredAddons[] = { - QPVAR(wardrobe), + "ace_wardrobe", "RF_Data_Loadorder" }; skipWhenMissingDependencies = 1; diff --git a/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp b/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp index 0cb46ac35c9..5db08f4397d 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp @@ -13,19 +13,19 @@ // Base Boonie #define CAMO_BASE 01 -class CN(02,CAMO_BASE) : vn_b_headgear_base { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; }; }; -class CN(01,CAMO_BASE) : CN(02,CAMO_BASE) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; }; }; -class CN(03,CAMO_BASE) : CN(02,CAMO_BASE) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; }; }; -class CN(04,CAMO_BASE) : CN(02,CAMO_BASE) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; }; }; -class CN(05,CAMO_BASE) : CN(02,CAMO_BASE) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)) }; }; }; +class CN(02,CAMO_BASE) : vn_b_headgear_base { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; }; }; +class CN(01,CAMO_BASE) : CN(02,CAMO_BASE) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; }; }; +class CN(03,CAMO_BASE) : CN(02,CAMO_BASE) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; }; }; +class CN(04,CAMO_BASE) : CN(02,CAMO_BASE) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; }; }; +class CN(05,CAMO_BASE) : CN(02,CAMO_BASE) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)) }; }; }; #define CN_COLORS(CAMO)\ -class CN(02,CAMO) : CN(02,01) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(03,CAMO)), Q(CN(04,CAMO)), Q(CN(05,CAMO)) }; }; };\ -class CN(01,CAMO) : CN(02,CAMO) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(02,CAMO)), Q(CN(03,CAMO)), Q(CN(04,CAMO)), Q(CN(05,CAMO)) }; }; };\ -class CN(03,CAMO) : CN(02,CAMO) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(02,CAMO)), Q(CN(04,CAMO)), Q(CN(05,CAMO)) }; }; };\ -class CN(04,CAMO) : CN(02,CAMO) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(02,CAMO)), Q(CN(03,CAMO)), Q(CN(05,CAMO)) }; }; };\ -class CN(05,CAMO) : CN(02,CAMO) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(02,CAMO)), Q(CN(03,CAMO)), Q(CN(04,CAMO)) }; }; };\ +class CN(02,CAMO) : CN(02,01) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(03,CAMO)), Q(CN(04,CAMO)), Q(CN(05,CAMO)) }; }; };\ +class CN(01,CAMO) : CN(02,CAMO) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(02,CAMO)), Q(CN(03,CAMO)), Q(CN(04,CAMO)), Q(CN(05,CAMO)) }; }; };\ +class CN(03,CAMO) : CN(02,CAMO) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(02,CAMO)), Q(CN(04,CAMO)), Q(CN(05,CAMO)) }; }; };\ +class CN(04,CAMO) : CN(02,CAMO) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(02,CAMO)), Q(CN(03,CAMO)), Q(CN(05,CAMO)) }; }; };\ +class CN(05,CAMO) : CN(02,CAMO) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(02,CAMO)), Q(CN(03,CAMO)), Q(CN(04,CAMO)) }; }; };\ CN_COLORS(02) CN_COLORS(03) @@ -37,9 +37,9 @@ CN_COLORS(05) // 06-08 anzac #define BOONIE_ANZAC(VAR) -class CN(06,VAR) : CN(02,01) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(07,VAR)), Q(CN(08,VAR)) }; }; }; -class CN(07,VAR) : CN(06,VAR) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(06,VAR)), Q(CN(08,VAR)) }; }; }; -class CN(08,VAR) : CN(06,VAR) { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(06,VAR)), Q(CN(07,VAR)) }; }; }; +class CN(06,VAR) : CN(02,01) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(07,VAR)), Q(CN(08,VAR)) }; }; }; +class CN(07,VAR) : CN(06,VAR) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(06,VAR)), Q(CN(08,VAR)) }; }; }; +class CN(08,VAR) : CN(06,VAR) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(06,VAR)), Q(CN(07,VAR)) }; }; }; BOONIE_ANZAC(01) BOONIE_ANZAC(02) \ No newline at end of file diff --git a/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp b/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp index 8e461d7da1d..3f8464a3215 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp @@ -7,8 +7,8 @@ #define HELMET_VARIANT(side,var1,var2)\ -class CN01(side,var1,var2) : base_class_up { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { Q(CN02(side,var1,var2)) }; }; };\ -class CN02(side,var1,var2) : base_class_dn { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { Q(CN01(side,var1,var2)) }; }; }; +class CN01(side,var1,var2) : base_class_up { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { Q(CN02(side,var1,var2)) }; }; };\ +class CN02(side,var1,var2) : base_class_dn { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { Q(CN01(side,var1,var2)) }; }; }; // Base classes in CfgWeapons.hpp @@ -43,5 +43,5 @@ HELMET_VARIANT(b,svh4,05) HELMET_VARIANT(b,svh4,06) // Special Case zsh3 -class vn_o_helmet_zsh3_01 : vn_o_headgear_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { Q(vn_o_helmet_zsh3_02) }; }; }; -class vn_o_helmet_zsh3_02 : vn_o_helmet_zsh3_01 { class PVAR(wardrobe) : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { Q(vn_o_helmet_zsh3_01) }; }; }; +class vn_o_helmet_zsh3_01 : vn_o_headgear_base { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { Q(vn_o_helmet_zsh3_02) }; }; }; +class vn_o_helmet_zsh3_02 : vn_o_helmet_zsh3_01 { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { Q(vn_o_helmet_zsh3_01) }; }; }; diff --git a/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp b/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp index cfa3ee4cf33..da08f84f6e0 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp @@ -6,8 +6,8 @@ class vn_b_uniform_base; #define UNIFORM_BASE_B(class1,class2)\ -class class1: vn_b_uniform_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(class2) }; }; };\ -class class2: vn_b_uniform_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(class1) }; }; }; +class class1: vn_b_uniform_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(class2) }; }; };\ +class class2: vn_b_uniform_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(class1) }; }; }; #define B_U(div,var,camo) vn_b_uniform_##div##_##var##_##camo diff --git a/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp b/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp index 0ed331e0da9..a7119828511 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp @@ -1,8 +1,8 @@ class vn_o_uniform_base; #define UNIFORM_BASE_O(class1,class2)\ -class class1: vn_o_uniform_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(class2) }; }; };\ -class class2: vn_o_uniform_base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(class1) }; }; };\ +class class1: vn_o_uniform_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(class2) }; }; };\ +class class2: vn_o_uniform_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(class1) }; }; };\ // OPFOR diff --git a/addons/compat_sog/compat_sog_wardrobe/config.cpp b/addons/compat_sog/compat_sog_wardrobe/config.cpp index e07a5b05ec2..509b6ea2c6f 100644 --- a/addons/compat_sog/compat_sog_wardrobe/config.cpp +++ b/addons/compat_sog/compat_sog_wardrobe/config.cpp @@ -10,7 +10,7 @@ class CfgPatches { VERSION_CONFIG; addonRootClass = QUOTE(ADDON); requiredAddons[] = { - QPVAR(wardrobe), + "ace_wardrobe", "vn_data_f" }; skipWhenMissingDependencies = 1; diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp index 819156bcfd8..b982997e002 100644 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp @@ -10,7 +10,7 @@ class CfgPatches { VERSION_CONFIG; addonRootClass = QUOTE(ADDON); requiredAddons[] = { - QPVAR(wardrobe), + "ace_wardrobe", "vn_data_f" }; skipWhenMissingDependencies = 1; diff --git a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp index 5edba25847d..a6f3f6fb16a 100644 --- a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp @@ -4,8 +4,8 @@ class CfgWeapons { // Cap (Ion) Forward and Reversed class lxWS_H_CapB_rvs_blk; - class lxWS_H_CapB_rvs_blk_ION: lxWS_H_CapB_rvs_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "H_Cap_headphones_ion_lxws" }; }; }; - class H_Cap_headphones_ion_lxws: lxWS_H_CapB_rvs_blk_ION { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "lxWS_H_CapB_rvs_blk_ION" }; }; }; + class lxWS_H_CapB_rvs_blk_ION: lxWS_H_CapB_rvs_blk { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "H_Cap_headphones_ion_lxws" }; }; }; + class H_Cap_headphones_ion_lxws: lxWS_H_CapB_rvs_blk_ION { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "lxWS_H_CapB_rvs_blk_ION" }; }; }; #include "Turbans.hpp" }; diff --git a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp index 8b6fcc4a237..cc4ea18f268 100644 --- a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp @@ -5,25 +5,25 @@ #define QCN(version,color) Q(CN(version,color)) #define COLORGROUP(COLOR)\ -class CN(01,COLOR): lxWS_H_turban_01_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,COLOR), QCN(03,COLOR), QCN(04,COLOR) }; }; };\ -class CN(02,COLOR): lxWS_H_turban_02_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,COLOR), QCN(03,COLOR), QCN(04,COLOR) }; }; };\ -class CN(03,COLOR): lxWS_H_turban_03_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,COLOR), QCN(02,COLOR), QCN(04,COLOR) }; }; };\ -class CN(04,COLOR): lxWS_H_turban_04_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,COLOR), QCN(02,COLOR), QCN(03,COLOR) }; }; }; +class CN(01,COLOR): lxWS_H_turban_01_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,COLOR), QCN(03,COLOR), QCN(04,COLOR) }; }; };\ +class CN(02,COLOR): lxWS_H_turban_02_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,COLOR), QCN(03,COLOR), QCN(04,COLOR) }; }; };\ +class CN(03,COLOR): lxWS_H_turban_03_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,COLOR), QCN(02,COLOR), QCN(04,COLOR) }; }; };\ +class CN(04,COLOR): lxWS_H_turban_04_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,COLOR), QCN(02,COLOR), QCN(03,COLOR) }; }; }; #define COLORGROUP_SPECIAL(COLOR)\ -class CN(02,COLOR): lxWS_H_turban_02_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(03,COLOR) }; }; };\ -class CN(03,COLOR): lxWS_H_turban_03_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,COLOR) }; }; }; +class CN(02,COLOR): lxWS_H_turban_02_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(03,COLOR) }; }; };\ +class CN(03,COLOR): lxWS_H_turban_03_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,COLOR) }; }; }; // BASECLASS class H_Shemag_khk; -class H_turban_02_mask_black_lxws : H_Shemag_khk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(03,black), QCN(04,black) }; components[] = { "lxWS_H_bmask_base" }; }; }; -class lxWS_H_turban_01_black : H_Shemag_khk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,black), QCN(03,black), QCN(04,black), "H_turban_02_mask_black_lxws" }; }; }; -class lxWS_H_turban_02_black : lxWS_H_turban_01_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(03,black), QCN(04,black), "H_turban_02_mask_black_lxws" }; }; }; -class lxWS_H_turban_03_black : lxWS_H_turban_01_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(04,black), "H_turban_02_mask_black_lxws" }; }; }; -class lxWS_H_turban_04_black : lxWS_H_turban_01_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(03,black), "H_turban_02_mask_black_lxws" }; }; }; +class H_turban_02_mask_black_lxws : H_Shemag_khk { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(03,black), QCN(04,black) }; components[] = { "lxWS_H_bmask_base" }; }; }; +class lxWS_H_turban_01_black : H_Shemag_khk { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,black), QCN(03,black), QCN(04,black), "H_turban_02_mask_black_lxws" }; }; }; +class lxWS_H_turban_02_black : lxWS_H_turban_01_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(03,black), QCN(04,black), "H_turban_02_mask_black_lxws" }; }; }; +class lxWS_H_turban_03_black : lxWS_H_turban_01_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(04,black), "H_turban_02_mask_black_lxws" }; }; }; +class lxWS_H_turban_04_black : lxWS_H_turban_01_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(03,black), "H_turban_02_mask_black_lxws" }; }; }; // VARIATIONS COLORGROUP(blue) @@ -38,9 +38,9 @@ COLORGROUP_SPECIAL(green_pattern) // Super Special Manual blabla -class H_turban_02_mask_snake_lxws : H_turban_02_mask_black_lxws { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_hex_lxws" }; components[] = {"H_bmask_snake_lxws"}; }; }; -class H_turban_02_mask_hex_lxws: H_turban_02_mask_black_lxws { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws" }; components[] = {"lxWS_H_bmask_hex"}; }; }; -class lxWS_H_turban_01_sand: lxWS_H_turban_01_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; -class lxWS_H_turban_02_sand: lxWS_H_turban_02_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; -class lxWS_H_turban_03_sand: lxWS_H_turban_03_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; -class lxWS_H_turban_04_sand: lxWS_H_turban_04_black { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; \ No newline at end of file +class H_turban_02_mask_snake_lxws : H_turban_02_mask_black_lxws { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_hex_lxws" }; components[] = {"H_bmask_snake_lxws"}; }; }; +class H_turban_02_mask_hex_lxws: H_turban_02_mask_black_lxws { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws" }; components[] = {"lxWS_H_bmask_hex"}; }; }; +class lxWS_H_turban_01_sand: lxWS_H_turban_01_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; +class lxWS_H_turban_02_sand: lxWS_H_turban_02_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; +class lxWS_H_turban_03_sand: lxWS_H_turban_03_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; +class lxWS_H_turban_04_sand: lxWS_H_turban_04_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; \ No newline at end of file diff --git a/addons/compat_ws/compat_ws_wardrobe/config.cpp b/addons/compat_ws/compat_ws_wardrobe/config.cpp index a25c5e3f89e..a3d885cc333 100644 --- a/addons/compat_ws/compat_ws_wardrobe/config.cpp +++ b/addons/compat_ws/compat_ws_wardrobe/config.cpp @@ -10,7 +10,7 @@ class CfgPatches { VERSION_CONFIG; addonRootClass = QUOTE(ADDON); requiredAddons[] = { - QPVAR(wardrobe), + "ace_wardrobe", "Characters_f_lxWS_headgear" }; skipWhenMissingDependencies = 1; diff --git a/addons/wardrobe/compat_vanilla/Facewear.hpp b/addons/wardrobe/compat_vanilla/Facewear.hpp index 0f73ff3b05a..64ebb57bf14 100644 --- a/addons/wardrobe/compat_vanilla/Facewear.hpp +++ b/addons/wardrobe/compat_vanilla/Facewear.hpp @@ -6,35 +6,35 @@ class G_WirelessEarpiece_base_F; class G_EyeProtectors_base_F; // Common Components -class G_Lowprofile : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_lowprofile" }; components[] = {"G_Lowprofile"}; }; }; -class G_Combat : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_combat", "G_Balaclava_TI_G_blk_F", "G_Balaclava_TI_G_tna_F" }; components[] = {"G_Combat"}; }; }; +class G_Lowprofile : None { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_lowprofile" }; components[] = {"G_Lowprofile"}; }; }; +class G_Combat : None { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_combat", "G_Balaclava_TI_G_blk_F", "G_Balaclava_TI_G_tna_F" }; components[] = {"G_Combat"}; }; }; -class G_Aviator : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_aviator" }; components[] = {"G_Aviator"}; }; }; -class G_Shades_Black : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_shades" }; components[] = {"G_Shades_Black"}; }; }; +class G_Aviator : None { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_aviator" }; components[] = {"G_Aviator"}; }; }; +class G_Shades_Black : None { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_shades" }; components[] = {"G_Shades_Black"}; }; }; // Balaclava, black -class G_Balaclava_blk : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_lowprofile", "G_Balaclava_combat" }; components[] = {"G_Balaclava_blk"}; }; }; -class G_Balaclava_combat : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_blk" }; components[] = {"G_Balaclava_blk","G_Combat"}; }; }; -class G_Balaclava_lowprofile : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_blk" }; components[] = {"G_Balaclava_blk","G_Lowprofile"}; }; }; +class G_Balaclava_blk : None { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_lowprofile", "G_Balaclava_combat" }; components[] = {"G_Balaclava_blk"}; }; }; +class G_Balaclava_combat : G_Balaclava_blk { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_blk" }; components[] = {"G_Balaclava_blk","G_Combat"}; }; }; +class G_Balaclava_lowprofile : G_Balaclava_blk { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_blk" }; components[] = {"G_Balaclava_blk","G_Lowprofile"}; }; }; // Stealth Balaclava, black -class G_Balaclava_TI_blk_F : None { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_G_blk_F" }; components[] = {"G_Balaclava_TI_blk_F"}; }; }; -class G_Balaclava_TI_G_blk_F : G_Balaclava_TI_blk_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_blk_F" }; components[] = {"G_Balaclava_TI_blk_F","G_Combat"}; }; }; +class G_Balaclava_TI_blk_F : None { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_G_blk_F" }; components[] = {"G_Balaclava_TI_blk_F"}; }; }; +class G_Balaclava_TI_G_blk_F : G_Balaclava_TI_blk_F { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_blk_F" }; components[] = {"G_Balaclava_TI_blk_F","G_Combat"}; }; }; // Stealth Balaclava, green(tanoa) -class G_Balaclava_TI_tna_F : G_Balaclava_TI_blk_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_G_tna_F" }; components[] = {"G_Balaclava_TI_tna_F"}; }; }; -class G_Balaclava_TI_G_tna_F : G_Balaclava_TI_tna_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_tna_F" }; components[] = {"G_Balaclava_TI_tna_F","G_Combat"}; }; }; +class G_Balaclava_TI_tna_F : G_Balaclava_TI_blk_F { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_G_tna_F" }; components[] = {"G_Balaclava_TI_tna_F"}; }; }; +class G_Balaclava_TI_G_tna_F : G_Balaclava_TI_tna_F { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_tna_F" }; components[] = {"G_Balaclava_TI_tna_F","G_Combat"}; }; }; // Bandana, Black -class G_Bandanna_blk : G_Balaclava_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_aviator", "G_Bandanna_sport", "G_Bandanna_aviator" }; components[] = {"G_Bandanna_blk"}; }; }; +class G_Bandanna_blk : G_Balaclava_blk { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_aviator", "G_Bandanna_sport", "G_Bandanna_aviator" }; components[] = {"G_Bandanna_blk"}; }; }; -class G_Bandanna_shades : G_Bandanna_blk { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Shades_Black" }; components[] = {"G_Bandanna_blk", "G_Shades_Black" }; }; }; -class G_Bandanna_sport : G_Bandanna_shades { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Sport_Blackred" }; components[] = {"G_Bandanna_blk", "G_Sport_Blackred"}; }; }; -class G_Bandanna_aviator : G_Bandanna_shades { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Aviator" }; components[] = {"G_Bandanna_blk", "G_Aviator" }; }; }; +class G_Bandanna_shades : G_Bandanna_blk { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Shades_Black" }; components[] = {"G_Bandanna_blk", "G_Shades_Black" }; }; }; +class G_Bandanna_sport : G_Bandanna_shades { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Sport_Blackred" }; components[] = {"G_Bandanna_blk", "G_Sport_Blackred"}; }; }; +class G_Bandanna_aviator : G_Bandanna_shades { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Aviator" }; components[] = {"G_Bandanna_blk", "G_Aviator" }; }; }; // Eye Protector -class G_EyeProtectors_F : G_EyeProtectors_base_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_Earpiece_F" }; components[] = {"G_EyeProtectors_F"}; }; }; -class G_EyeProtectors_Earpiece_F : G_EyeProtectors_base_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_F", "G_WirelessEarpiece_F" }; components[] = {"G_EyeProtectors_F", "G_WirelessEarpiece_F"}; }; }; -class G_WirelessEarpiece_F : G_WirelessEarpiece_base_F { class PVAR(wardrobe) : EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_Earpiece_F" }; components[] = {"G_WirelessEarpiece_F"}; }; }; +class G_EyeProtectors_F : G_EyeProtectors_base_F { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_Earpiece_F" }; components[] = {"G_EyeProtectors_F"}; }; }; +class G_EyeProtectors_Earpiece_F : G_EyeProtectors_base_F { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_F", "G_WirelessEarpiece_F" }; components[] = {"G_EyeProtectors_F", "G_WirelessEarpiece_F"}; }; }; +class G_WirelessEarpiece_F : G_WirelessEarpiece_base_F { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_Earpiece_F" }; components[] = {"G_WirelessEarpiece_F"}; }; }; diff --git a/addons/wardrobe/compat_vanilla/Uniforms.hpp b/addons/wardrobe/compat_vanilla/Uniforms.hpp index e7c46ed163b..18d783bcccd 100644 --- a/addons/wardrobe/compat_vanilla/Uniforms.hpp +++ b/addons/wardrobe/compat_vanilla/Uniforms.hpp @@ -3,8 +3,8 @@ class Uniform_Base; // Macros #define UNIFORM_BASE(class1,class2)\ -class class1: Uniform_Base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(class2) }; }; };\ -class class2: Uniform_Base { class PVAR(wardrobe) : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(class1) }; }; };\ +class class1: Uniform_Base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(class2) }; }; };\ +class class2: Uniform_Base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(class1) }; }; };\ // Vanilla CTRG Uniform diff --git a/addons/wardrobe/functions/fn_compare_components.sqf b/addons/wardrobe/functions/fn_compare_components.sqf index a2acbb4a7df..ff90d18ab19 100644 --- a/addons/wardrobe/functions/fn_compare_components.sqf +++ b/addons/wardrobe/functions/fn_compare_components.sqf @@ -17,8 +17,8 @@ params ["_cfg_origin", "_cfg_tgt"]; -private _current = getArray (_cfg_origin >> QPVAR(wardrobe) >> "components"); -private _needed = getArray (_cfg_tgt >> QPVAR(wardrobe) >> "components"); +private _current = getArray (_cfg_origin >> "ace_wardrobe" >> "components"); +private _needed = getArray (_cfg_tgt >> "ace_wardrobe" >> "components"); private _missing = []; diff --git a/addons/wardrobe/functions/fn_isModifiable.sqf b/addons/wardrobe/functions/fn_isModifiable.sqf index befaed14ede..274339091a5 100644 --- a/addons/wardrobe/functions/fn_isModifiable.sqf +++ b/addons/wardrobe/functions/fn_isModifiable.sqf @@ -22,4 +22,4 @@ params [ if (isNull _cfg) exitWith {false}; // Checks if the config has the property without it being inherited(!) -count ( Q(configName _x isEqualTo QQPVAR(wardrobe)) configClasses _cfg ) > 0 \ No newline at end of file +count ( Q(configName _x isEqualTo ""ace_wardrobe"") configClasses _cfg ) > 0 \ No newline at end of file diff --git a/addons/wardrobe/script_macros_wardrobe.hpp b/addons/wardrobe/script_macros_wardrobe.hpp index 3759c81b5bd..86ab5b50b55 100644 --- a/addons/wardrobe/script_macros_wardrobe.hpp +++ b/addons/wardrobe/script_macros_wardrobe.hpp @@ -14,12 +14,6 @@ #define QADDON Q(ADDON) -// Prefix Variables -#define PVAR(var1) DOUBLES(PREFIX,var1) -#define QPVAR(var1) QUOTE(PVAR(var1)) -#define QQPVAR(var1) QUOTE(QPVAR(var1)) - // Paths #define PATH_TO_FUNC QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\functions) -#define PATH_TO_FUNC_SUB(var1) QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\functions\var1) -#define PATH_TO_ADDON(var1) QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\var1) \ No newline at end of file +#define PATH_TO_FUNC_SUB(var1) QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\functions\var1) \ No newline at end of file From 010a8922feb1596dc8bfd47389c2b55d89f246c7 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:13:10 +0100 Subject: [PATCH 044/305] -> QPATHTOF --- addons/wardrobe/CfgVehicles.hpp | 2 +- addons/wardrobe/functions/contextMenu/fn_addCM_nextvariant.sqf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/wardrobe/CfgVehicles.hpp b/addons/wardrobe/CfgVehicles.hpp index 3c2f0e38775..2035d60bf50 100644 --- a/addons/wardrobe/CfgVehicles.hpp +++ b/addons/wardrobe/CfgVehicles.hpp @@ -5,7 +5,7 @@ class CfgVehicles { class ACE_Equipment { class ADDON { displayName = CSTRING(actionTitle); // Text shown to user - icon = PATH_TO_ADDON(data\wardrobe_logo.paa); + icon = QPATHTOF(data\wardrobe_logo.paa); condition = Q([_player] call FUNC(addActions_condition)); statement = ""; insertChildren = Q([_player] call FUNC(addActions)); diff --git a/addons/wardrobe/functions/contextMenu/fn_addCM_nextvariant.sqf b/addons/wardrobe/functions/contextMenu/fn_addCM_nextvariant.sqf index 341a3143afc..7d7f6ad97e8 100644 --- a/addons/wardrobe/functions/contextMenu/fn_addCM_nextvariant.sqf +++ b/addons/wardrobe/functions/contextMenu/fn_addCM_nextvariant.sqf @@ -107,7 +107,7 @@ The most efficient variant i can think of would be following. "CLOTHES", // filter slots "Switch to next Variant", // Display Name [], // Color - PATH_TO_ADDON(data\wardrobe_logo.paa), // Icon + QPATHTOF(data\wardrobe_logo.paa), // Icon [ {true}, // Condition Enable action {true} // Condition Show Action From 285b49e4be6a86cc28e3d4cb4432eefbcf1d50e9 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Fri, 3 Jan 2025 02:06:37 +0100 Subject: [PATCH 045/305] Update addons/compat_gm/compat_gm_wardrobe/config.cpp Co-authored-by: Dart <59131299+DartRuffian@users.noreply.github.com> --- addons/compat_gm/compat_gm_wardrobe/config.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/compat_gm/compat_gm_wardrobe/config.cpp b/addons/compat_gm/compat_gm_wardrobe/config.cpp index 3ddc38573a5..f7e9cf6f46e 100644 --- a/addons/compat_gm/compat_gm_wardrobe/config.cpp +++ b/addons/compat_gm/compat_gm_wardrobe/config.cpp @@ -15,7 +15,7 @@ class CfgPatches { }; skipWhenMissingDependencies = 1; - requiredVersion = 2.02; + requiredVersion = REQUIRED_VERSION; units[] = {}; weapons[] = {}; From 3fb3e6a8acf0d5d8dff3556b9f00f304059f398a Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Fri, 3 Jan 2025 02:06:56 +0100 Subject: [PATCH 046/305] Update addons/compat_sog/compat_sog_wardrobe/config.cpp Co-authored-by: Dart <59131299+DartRuffian@users.noreply.github.com> --- addons/compat_sog/compat_sog_wardrobe/config.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/compat_sog/compat_sog_wardrobe/config.cpp b/addons/compat_sog/compat_sog_wardrobe/config.cpp index 509b6ea2c6f..4c152d8ca84 100644 --- a/addons/compat_sog/compat_sog_wardrobe/config.cpp +++ b/addons/compat_sog/compat_sog_wardrobe/config.cpp @@ -15,7 +15,7 @@ class CfgPatches { }; skipWhenMissingDependencies = 1; - requiredVersion = 2.02; + requiredVersion = REQUIRED_VERSION; units[] = {}; weapons[] = {}; From d4d1de2ae12f2ce23ae882f31f1c6f0e45a5979e Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Fri, 3 Jan 2025 02:07:04 +0100 Subject: [PATCH 047/305] Update addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp Co-authored-by: Dart <59131299+DartRuffian@users.noreply.github.com> --- addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp index b982997e002..36c24cde11a 100644 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp @@ -15,7 +15,7 @@ class CfgPatches { }; skipWhenMissingDependencies = 1; - requiredVersion = 2.02; + requiredVersion = REQUIRED_VERSION; units[] = {}; weapons[] = {}; From 60b2c2a4ebea5c400ecc48e11454457dd04748e3 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Fri, 3 Jan 2025 02:07:15 +0100 Subject: [PATCH 048/305] Update addons/compat_ws/compat_ws_wardrobe/config.cpp Co-authored-by: Dart <59131299+DartRuffian@users.noreply.github.com> --- addons/compat_ws/compat_ws_wardrobe/config.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/compat_ws/compat_ws_wardrobe/config.cpp b/addons/compat_ws/compat_ws_wardrobe/config.cpp index a3d885cc333..cf96156b57e 100644 --- a/addons/compat_ws/compat_ws_wardrobe/config.cpp +++ b/addons/compat_ws/compat_ws_wardrobe/config.cpp @@ -15,7 +15,7 @@ class CfgPatches { }; skipWhenMissingDependencies = 1; - requiredVersion = 2.02; + requiredVersion = REQUIRED_VERSION; units[] = {}; weapons[] = {}; From b18a92bafb408afe0b12e568bc405cefb895b423 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:17:43 +0100 Subject: [PATCH 049/305] -> root + rename --- .../{XEH/CfgXEH.hpp => CfgEventHandlers.hpp} | 2 +- addons/wardrobe/{XEH => }/XEH_preInit.sqf | 26 ------------------- addons/wardrobe/config.cpp | 2 +- 3 files changed, 2 insertions(+), 28 deletions(-) rename addons/wardrobe/{XEH/CfgXEH.hpp => CfgEventHandlers.hpp} (63%) rename addons/wardrobe/{XEH => }/XEH_preInit.sqf (59%) diff --git a/addons/wardrobe/XEH/CfgXEH.hpp b/addons/wardrobe/CfgEventHandlers.hpp similarity index 63% rename from addons/wardrobe/XEH/CfgXEH.hpp rename to addons/wardrobe/CfgEventHandlers.hpp index cde9653434e..82da8b574b8 100644 --- a/addons/wardrobe/XEH/CfgXEH.hpp +++ b/addons/wardrobe/CfgEventHandlers.hpp @@ -1,6 +1,6 @@ // No need to change anything here class Extended_PreInit_EventHandlers { class ADDON { - init = QUOTE(call COMPILE_FILE(XEH\XEH_preInit)); + init = QUOTE(call COMPILE_FILE(XEH_preInit)); }; }; \ No newline at end of file diff --git a/addons/wardrobe/XEH/XEH_preInit.sqf b/addons/wardrobe/XEH_preInit.sqf similarity index 59% rename from addons/wardrobe/XEH/XEH_preInit.sqf rename to addons/wardrobe/XEH_preInit.sqf index 1a461780dd4..4dbebbc46c4 100644 --- a/addons/wardrobe/XEH/XEH_preInit.sqf +++ b/addons/wardrobe/XEH_preInit.sqf @@ -1,31 +1,5 @@ #include "../script_component.hpp" - -/* -here, you put in your CBA Settings so they are available in the editor! - -https://github.com/CBATeam/CBA_A3/wiki/CBA-Settings-System#create-a-custom-setting-for-mission-or-mod - -MACROS Used: -SETLSTRING(test) -> [LSTRING(set_test), LSTRING(set_test_desc)] -> STR_prefix_component_set_test // STR_prefix_component_set_test_desc -SET(test) -> ADDON_set_test -QSET(test) -> "ADDON_set_test" -*/ - -/* -[ - QSET(displayMusic), // _setting - Unique setting name. Matches resulting variable name - "CHECKBOX", // _settingType - Type of setting. Can be "CHECKBOX", "EDITBOX", "LIST", "SLIDER" or "COLOR" - ["Display Music Title","This enables the message of the currently played music title by the CVO Music System"], - // _title - Display name or display name + tooltip (optional, default: same as setting name) - ["CVO", "CVO Music"], // _category - Category for the settings menu + optional sub-category - false, // _valueInfo - Extra properties of the setting depending of _settingType. See examples below - 0, // _isGlobal - 1: all clients share the same setting, 2: setting can't be overwritten (optional, default: 0) - {}, // _script - Script to execute when setting is changed. (optional) - false // _needRestart - Setting will be marked as needing mission restart after being changed. (optional, default false) -] call CBA_fnc_addSetting; -*/ - [ QSET(enable_action), // _setting - Unique setting name. Matches resulting variable name "CHECKBOX", // _settingType - Type of setting. Can be "CHECKBOX", "EDITBOX", "LIST", "SLIDER" or "COLOR" diff --git a/addons/wardrobe/config.cpp b/addons/wardrobe/config.cpp index af135d83bea..daf52d50b31 100644 --- a/addons/wardrobe/config.cpp +++ b/addons/wardrobe/config.cpp @@ -21,7 +21,7 @@ class CfgPatches { }; #include "CfgFunctions.hpp" -#include "XEH\CfgXEH.hpp" +#include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" #include "CfgSounds.hpp" From 1feadab19437240ec22faf5ca27a0c91acec0d47 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:19:16 +0100 Subject: [PATCH 050/305] comment cleanup --- .../contextMenu/fn_addCM_nextvariant.sqf | 87 ------------------- 1 file changed, 87 deletions(-) diff --git a/addons/wardrobe/functions/contextMenu/fn_addCM_nextvariant.sqf b/addons/wardrobe/functions/contextMenu/fn_addCM_nextvariant.sqf index 7d7f6ad97e8..5b402b50f42 100644 --- a/addons/wardrobe/functions/contextMenu/fn_addCM_nextvariant.sqf +++ b/addons/wardrobe/functions/contextMenu/fn_addCM_nextvariant.sqf @@ -15,93 +15,6 @@ * Public: No */ - - -/* -Description: - Adds context menu option to inventory display. - -Parameters: - _item - Item classname - Can be base class. - - Can be item type as reported by BIS_fnc_itemType: - ["Equipment","Headgear"] - -> - "#Equipment" and/or "##Headgear" - - Wildcard: - #All - - _slots - Relevant slots - Values: - CLOTHES - UNIFORM - VEST - BACKPACK - HEADGEAR - GOGGLES - - _displayName String keys are automatically translated. - 0: _displayName - Option display name - 1: _tooltip - Option tooltip - - _color - Option text color. Default alpha is 1. - (default: [] = default color) - - _icon - Path to icon. (default: "" = no icon) - - _condition - 0: _conditionEnable - Menu option is enabled and executed only if this - condition reports 'true' (default: {true}) - 1: _conditionShow - Menu option is shown only if this condition - reports 'true'. (optional, default: {true}) - - - Passed arguments: - params ["_unit", "_container", "_item", "_slot", "_params"]; - - _statement - Option statement (default: {}) - Return true to keep context menu opened. - - - Passed arguments: - params ["_unit", "_container", "_item", "_slot", "_params"]; - - _consume - Remove the item before executing the statement - code. (default: false) - - - This does NOT work for the following slots: - GROUND - CARGO - - _params - Arguments passed as '_this select 4' to condition and - statement (optional, default: []) - -Returns: - Nothing/Undefined. - -Examples: - (begin example) - ["#All", "ALL", ">DEBUG ACTION<", nil, nil, {true}, { - params ["_unit", "_container", "_item", "_slot", "_params"]; - systemChat str [name _unit, typeOf _container, _item, _slot, _params]; - true - }, false, [0,1,2]] call CBA_fnc_addItemContextMenuOption; - (end) -*/ - - - -/* -To make this work i would need to add a Menu Option for each individual modfifiable item AND its potential variants. - -The most efficient variant i can think of would be following. -1. Event Handler for when the inventory gets open. -2. Get Current Modifiable Items. -3. Check if they are already established (GVAR(contextMenu_hashmap) classname, config) -4. For every new modifiable Item, create a ContextMenuOption for each of its variant -- could make an event handler, everytime the inventory gets opened, it scans the wearables, if they are modifiable, (and not already established) adds the option for those items -*/ - [ "#ALL", // filter items "CLOTHES", // filter slots From 67da41cf81e28e3f20714f92f0c9f87d3e6415d0 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:20:17 +0100 Subject: [PATCH 051/305] comment cleanup --- addons/wardrobe/XEH_preInit.sqf | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/addons/wardrobe/XEH_preInit.sqf b/addons/wardrobe/XEH_preInit.sqf index 4dbebbc46c4..3ecfb8d76d2 100644 --- a/addons/wardrobe/XEH_preInit.sqf +++ b/addons/wardrobe/XEH_preInit.sqf @@ -1,25 +1,23 @@ #include "../script_component.hpp" [ - QSET(enable_action), // _setting - Unique setting name. Matches resulting variable name - "CHECKBOX", // _settingType - Type of setting. Can be "CHECKBOX", "EDITBOX", "LIST", "SLIDER" or "COLOR" + QSET(enable_action), + "CHECKBOX", SETLSTRING(enable_action), - // _title - Display name or display name + tooltip (optional, default: same as setting name) - [LSTRING(set_cat_main)], // _category - Category for the settings menu + optional sub-category - true, // _valueInfo - Extra properties of the setting depending of _settingType. See examples below - 1, // _isGlobal - 1: all clients share the same setting, 2: setting can't be overwritten (optional, default: 0) - {}, // _script - Script to execute when setting is changed. (optional) - false // _needRestart - Setting will be marked as needing mission restart after being changed. (optional, default false) + [LSTRING(set_cat_main)], + true, + 1, + {}, + false ] call CBA_fnc_addSetting; [ - QSET(enable_contextMenu), // _setting - Unique setting name. Matches resulting variable name - "CHECKBOX", // _settingType - Type of setting. Can be "CHECKBOX", "EDITBOX", "LIST", "SLIDER" or "COLOR" + QSET(enable_contextMenu), + "CHECKBOX", SETLSTRING(enable_contextMenu), - // _title - Display name or display name + tooltip (optional, default: same as setting name) - [LSTRING(set_cat_main)], // _category - Category for the settings menu + optional sub-category - true, // _valueInfo - Extra properties of the setting depending of _settingType. See examples below - 1, // _isGlobal - 1: all clients share the same setting, 2: setting can't be overwritten (optional, default: 0) - FUNC(enable_contextMenu), // _script - Script to execute when setting is changed. (optional) - true // _needRestart - Setting will be marked as needing mission restart after being changed. (optional, default false) + [LSTRING(set_cat_main)], + true, + 1, + FUNC(enable_contextMenu), + true ] call CBA_fnc_addSetting; \ No newline at end of file From 893918833deb4af2dc8bfed0b8579f96a7220326 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:29:01 +0100 Subject: [PATCH 052/305] wardrobe/config --- addons/wardrobe/Baseclass.hpp | 45 +++++-- addons/wardrobe/CfgSounds.hpp | 4 +- addons/wardrobe/compat_vanilla/Facewear.hpp | 126 +++++++++++++++++--- addons/wardrobe/compat_vanilla/Uniforms.hpp | 12 +- 4 files changed, 156 insertions(+), 31 deletions(-) diff --git a/addons/wardrobe/Baseclass.hpp b/addons/wardrobe/Baseclass.hpp index 834310e4cac..79afb9a2379 100644 --- a/addons/wardrobe/Baseclass.hpp +++ b/addons/wardrobe/Baseclass.hpp @@ -23,19 +23,48 @@ class GVAR(base) }; // Common Base Class for Uniforms with Sleeves Up/Down Variants -class GVAR(base_U_sleeves_up) : GVAR(base) { alternativeDisplayName = CSTRING(sleevesUp); }; -class GVAR(base_U_sleeves_down) : GVAR(base) { alternativeDisplayName = CSTRING(sleevesDown); }; +class GVAR(base_U_sleeves_up) : GVAR(base) { + alternativeDisplayName = CSTRING(sleevesUp); +}; +class GVAR(base_U_sleeves_down) : GVAR(base) { + alternativeDisplayName = CSTRING(sleevesDown); +}; // Common Base Class for Uniforms with Sleeves Up/Down Variants -class GVAR(base_U_gloves_on) : GVAR(base) { alternativeDisplayName = CSTRING(glovesOn); }; -class GVAR(base_U_gloves_off) : GVAR(base) { alternativeDisplayName = CSTRING(glovesOff); }; +class GVAR(base_U_gloves_on) : GVAR(base) { + alternativeDisplayName = CSTRING(glovesOn); +}; +class GVAR(base_U_gloves_off) : GVAR(base) { + alternativeDisplayName = CSTRING(glovesOff); +}; // Common Base Class for Uniforms who are open/closed in the front -class GVAR(base_U_jacket_open) : GVAR(base) { alternativeDisplayName = CSTRING(jacketOpen); }; -class GVAR(base_U_jacket_closed) : GVAR(base) { alternativeDisplayName = CSTRING(jacketClose); }; +class GVAR(base_U_jacket_open) : GVAR(base) { + alternativeDisplayName = CSTRING(jacketOpen); +}; +class GVAR(base_U_jacket_closed) : GVAR(base) { + alternativeDisplayName = CSTRING(jacketClose); +}; // Common Base Class for Helmets with a Visor that can be flipped up or down -class GVAR(base_H_visor_up) : GVAR(base) { duration = 0.3; gesture ="gestureNod"; sound[] = {CN_SOUND(helmet_visor,05)}; sound_timing = 0; alternativeDisplayName = CSTRING(visorUp); }; -class GVAR(base_H_visor_down) : GVAR(base) { duration = 0.3; gesture ="gestureNod"; sound[] = {CN_SOUND(helmet_visor,05)}; sound_timing = 0; alternativeDisplayName = CSTRING(visorDown); }; \ No newline at end of file +class GVAR(base_H_visor_up) : GVAR(base) { + duration = 0.3; + gesture ="gestureNod"; + + sound[] = {CN_SOUND(helmet_visor,05)}; + sound_timing = 0; + + alternativeDisplayName = CSTRING(visorUp); +}; + +class GVAR(base_H_visor_down) : GVAR(base) { + duration = 0.3; + gesture ="gestureNod"; + + sound[] = {CN_SOUND(helmet_visor,05)}; + sound_timing = 0; + + alternativeDisplayName = CSTRING(visorDown); +}; \ No newline at end of file diff --git a/addons/wardrobe/CfgSounds.hpp b/addons/wardrobe/CfgSounds.hpp index de489c489fc..2c5ddd4f0f0 100644 --- a/addons/wardrobe/CfgSounds.hpp +++ b/addons/wardrobe/CfgSounds.hpp @@ -1,5 +1,4 @@ // Duration in this case is 10th of secounds. so 10 -> 1 sec, 15 -> 1.5sec, ... - #define ENTRY(base,dur)\ class GVAR(DOUBLES(base,dur))\ {\ @@ -10,10 +9,9 @@ class GVAR(DOUBLES(base,dur))\ titlesStructured = 0;\ }; - class CfgSounds { - sounds[] = {}; // OFP required it filled, now it can be empty or absent depending on the game's version + sounds[] = {}; ENTRY(fabric,06) ENTRY(fabric,07) ENTRY(fabric,16) diff --git a/addons/wardrobe/compat_vanilla/Facewear.hpp b/addons/wardrobe/compat_vanilla/Facewear.hpp index 64ebb57bf14..59ac668761f 100644 --- a/addons/wardrobe/compat_vanilla/Facewear.hpp +++ b/addons/wardrobe/compat_vanilla/Facewear.hpp @@ -6,35 +6,125 @@ class G_WirelessEarpiece_base_F; class G_EyeProtectors_base_F; // Common Components -class G_Lowprofile : None { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_lowprofile" }; components[] = {"G_Lowprofile"}; }; }; -class G_Combat : None { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_combat", "G_Balaclava_TI_G_blk_F", "G_Balaclava_TI_G_tna_F" }; components[] = {"G_Combat"}; }; }; +class G_Lowprofile : None { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { "G_Balaclava_lowprofile" }; + components[] = {"G_Lowprofile"}; + }; +}; +class G_Combat : None { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { "G_Balaclava_combat", "G_Balaclava_TI_G_blk_F", "G_Balaclava_TI_G_tna_F" }; + components[] = {"G_Combat"}; + }; +}; -class G_Aviator : None { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_aviator" }; components[] = {"G_Aviator"}; }; }; -class G_Shades_Black : None { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_shades" }; components[] = {"G_Shades_Black"}; }; }; +class G_Aviator : None { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { "G_Bandanna_aviator" }; + components[] = {"G_Aviator"}; + }; +}; +class G_Shades_Black : None { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { "G_Bandanna_shades" }; + components[] = {"G_Shades_Black"}; + }; +}; // Balaclava, black -class G_Balaclava_blk : None { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_lowprofile", "G_Balaclava_combat" }; components[] = {"G_Balaclava_blk"}; }; }; -class G_Balaclava_combat : G_Balaclava_blk { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_blk" }; components[] = {"G_Balaclava_blk","G_Combat"}; }; }; -class G_Balaclava_lowprofile : G_Balaclava_blk { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_blk" }; components[] = {"G_Balaclava_blk","G_Lowprofile"}; }; }; +class G_Balaclava_blk : None { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { "G_Balaclava_lowprofile", "G_Balaclava_combat" }; + components[] = {"G_Balaclava_blk"}; + }; +}; +class G_Balaclava_combat : G_Balaclava_blk { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { "G_Balaclava_blk" }; + components[] = {"G_Balaclava_blk","G_Combat"}; + }; +}; +class G_Balaclava_lowprofile : G_Balaclava_blk { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { "G_Balaclava_blk" }; + components[] = {"G_Balaclava_blk","G_Lowprofile"}; + }; +}; // Stealth Balaclava, black -class G_Balaclava_TI_blk_F : None { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_G_blk_F" }; components[] = {"G_Balaclava_TI_blk_F"}; }; }; -class G_Balaclava_TI_G_blk_F : G_Balaclava_TI_blk_F { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_blk_F" }; components[] = {"G_Balaclava_TI_blk_F","G_Combat"}; }; }; +class G_Balaclava_TI_blk_F : None { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { "G_Balaclava_TI_G_blk_F" }; + components[] = {"G_Balaclava_TI_blk_F"}; + }; +}; +class G_Balaclava_TI_G_blk_F : G_Balaclava_TI_blk_F { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { "G_Balaclava_TI_blk_F" }; + components[] = {"G_Balaclava_TI_blk_F","G_Combat"}; + }; +}; // Stealth Balaclava, green(tanoa) -class G_Balaclava_TI_tna_F : G_Balaclava_TI_blk_F { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_G_tna_F" }; components[] = {"G_Balaclava_TI_tna_F"}; }; }; -class G_Balaclava_TI_G_tna_F : G_Balaclava_TI_tna_F { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_tna_F" }; components[] = {"G_Balaclava_TI_tna_F","G_Combat"}; }; }; +class G_Balaclava_TI_tna_F : G_Balaclava_TI_blk_F { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { "G_Balaclava_TI_G_tna_F" }; + components[] = {"G_Balaclava_TI_tna_F"}; + }; +}; +class G_Balaclava_TI_G_tna_F : G_Balaclava_TI_tna_F { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { "G_Balaclava_TI_tna_F" }; + components[] = {"G_Balaclava_TI_tna_F","G_Combat"}; + }; +}; // Bandana, Black -class G_Bandanna_blk : G_Balaclava_blk { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_aviator", "G_Bandanna_sport", "G_Bandanna_aviator" }; components[] = {"G_Bandanna_blk"}; }; }; +class G_Bandanna_blk : G_Balaclava_blk { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { "G_Bandanna_aviator", "G_Bandanna_sport", "G_Bandanna_aviator" }; + components[] = {"G_Bandanna_blk"}; + }; +}; -class G_Bandanna_shades : G_Bandanna_blk { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Shades_Black" }; components[] = {"G_Bandanna_blk", "G_Shades_Black" }; }; }; -class G_Bandanna_sport : G_Bandanna_shades { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Sport_Blackred" }; components[] = {"G_Bandanna_blk", "G_Sport_Blackred"}; }; }; -class G_Bandanna_aviator : G_Bandanna_shades { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Aviator" }; components[] = {"G_Bandanna_blk", "G_Aviator" }; }; }; +class G_Bandanna_shades : G_Bandanna_blk { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { "G_Bandanna_blk", "G_Shades_Black" }; + components[] = {"G_Bandanna_blk", "G_Shades_Black" }; + }; +}; +class G_Bandanna_sport : G_Bandanna_shades { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { "G_Bandanna_blk", "G_Sport_Blackred" }; + components[] = {"G_Bandanna_blk", "G_Sport_Blackred"}; + }; +}; +class G_Bandanna_aviator : G_Bandanna_shades { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { "G_Bandanna_blk", "G_Aviator" }; + components[] = {"G_Bandanna_blk", "G_Aviator" }; + }; +}; // Eye Protector -class G_EyeProtectors_F : G_EyeProtectors_base_F { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_Earpiece_F" }; components[] = {"G_EyeProtectors_F"}; }; }; -class G_EyeProtectors_Earpiece_F : G_EyeProtectors_base_F { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_F", "G_WirelessEarpiece_F" }; components[] = {"G_EyeProtectors_F", "G_WirelessEarpiece_F"}; }; }; -class G_WirelessEarpiece_F : G_WirelessEarpiece_base_F { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_Earpiece_F" }; components[] = {"G_WirelessEarpiece_F"}; }; }; +class G_EyeProtectors_F : G_EyeProtectors_base_F { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { "G_EyeProtectors_Earpiece_F" }; + components[] = {"G_EyeProtectors_F"}; + }; +}; +class G_EyeProtectors_Earpiece_F : G_EyeProtectors_base_F { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { "G_EyeProtectors_F", "G_WirelessEarpiece_F" }; + components[] = {"G_EyeProtectors_F", "G_WirelessEarpiece_F"}; + }; +}; +class G_WirelessEarpiece_F : G_WirelessEarpiece_base_F { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { "G_EyeProtectors_Earpiece_F" }; + components[] = {"G_WirelessEarpiece_F"}; + }; +}; diff --git a/addons/wardrobe/compat_vanilla/Uniforms.hpp b/addons/wardrobe/compat_vanilla/Uniforms.hpp index 18d783bcccd..3d6fde86aed 100644 --- a/addons/wardrobe/compat_vanilla/Uniforms.hpp +++ b/addons/wardrobe/compat_vanilla/Uniforms.hpp @@ -3,8 +3,16 @@ class Uniform_Base; // Macros #define UNIFORM_BASE(class1,class2)\ -class class1: Uniform_Base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(class2) }; }; };\ -class class2: Uniform_Base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(class1) }; }; };\ +class class1: Uniform_Base {\ + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) {\ + modifiableTo[] = { Q(class2) };\ + };\ +};\ +class class2: Uniform_Base {\ + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) {\ + modifiableTo[] = { Q(class1) };\ + };\ +}; // Vanilla CTRG Uniform From 43776129b4878c8165c1c00f91c547f945da5ec0 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:40:26 +0100 Subject: [PATCH 053/305] sog/config --- .../compat_sog_wardrobe/Booniehats.hpp | 82 +++++++++++++++---- .../compat_sog_wardrobe/Pilothelmets.hpp | 24 +++++- .../compat_sog_wardrobe/Uniforms_B.hpp | 12 ++- .../compat_sog_wardrobe/Uniforms_O.hpp | 12 ++- .../Uniforms.hpp | 3 +- 5 files changed, 108 insertions(+), 25 deletions(-) diff --git a/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp b/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp index 5db08f4397d..ddf9c8690ef 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp @@ -12,20 +12,60 @@ #define CN(variation,color) vn_b_boonie_##variation##_##color // Base Boonie -#define CAMO_BASE 01 -class CN(02,CAMO_BASE) : vn_b_headgear_base { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; }; }; -class CN(01,CAMO_BASE) : CN(02,CAMO_BASE) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; }; }; -class CN(03,CAMO_BASE) : CN(02,CAMO_BASE) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; }; }; -class CN(04,CAMO_BASE) : CN(02,CAMO_BASE) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; }; }; -class CN(05,CAMO_BASE) : CN(02,CAMO_BASE) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)) }; }; }; +#define CAMO_BASE 01\ +class CN(02,CAMO_BASE) : vn_b_headgear_base {\ + class ace_wardrobe : EGVAR(wardrobe,base) {\ + modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) };\ + };\ +};\ +class CN(01,CAMO_BASE) : CN(02,CAMO_BASE) {\ + class ace_wardrobe : EGVAR(wardrobe,base) {\ + modifiableTo[] = { Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) };\ + };\ +};\ +class CN(03,CAMO_BASE) : CN(02,CAMO_BASE) {\ + class ace_wardrobe : EGVAR(wardrobe,base) {\ + modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) };\ + };\ +};\ +class CN(04,CAMO_BASE) : CN(02,CAMO_BASE) {\ + class ace_wardrobe : EGVAR(wardrobe,base) {\ + modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(05,CAMO_BASE)) };\ + };\ +};\ +class CN(05,CAMO_BASE) : CN(02,CAMO_BASE) {\ + class ace_wardrobe : EGVAR(wardrobe,base) {\ + modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)) };\ + };\ +}; #define CN_COLORS(CAMO)\ -class CN(02,CAMO) : CN(02,01) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(03,CAMO)), Q(CN(04,CAMO)), Q(CN(05,CAMO)) }; }; };\ -class CN(01,CAMO) : CN(02,CAMO) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(02,CAMO)), Q(CN(03,CAMO)), Q(CN(04,CAMO)), Q(CN(05,CAMO)) }; }; };\ -class CN(03,CAMO) : CN(02,CAMO) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(02,CAMO)), Q(CN(04,CAMO)), Q(CN(05,CAMO)) }; }; };\ -class CN(04,CAMO) : CN(02,CAMO) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(02,CAMO)), Q(CN(03,CAMO)), Q(CN(05,CAMO)) }; }; };\ -class CN(05,CAMO) : CN(02,CAMO) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(02,CAMO)), Q(CN(03,CAMO)), Q(CN(04,CAMO)) }; }; };\ +class CN(02,CAMO) : CN(02,01) {\ + class ace_wardrobe : EGVAR(wardrobe,base) {\ + modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(03,CAMO)), Q(CN(04,CAMO)), Q(CN(05,CAMO)) };\ + };\ +};\ +class CN(01,CAMO) : CN(02,CAMO) {\ + class ace_wardrobe : EGVAR(wardrobe,base) {\ + modifiableTo[] = { Q(CN(02,CAMO)), Q(CN(03,CAMO)), Q(CN(04,CAMO)), Q(CN(05,CAMO)) };\ + };\ +};\ +class CN(03,CAMO) : CN(02,CAMO) {\ + class ace_wardrobe : EGVAR(wardrobe,base) {\ + modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(02,CAMO)), Q(CN(04,CAMO)), Q(CN(05,CAMO)) };\ + };\ +};\ +class CN(04,CAMO) : CN(02,CAMO) {\ + class ace_wardrobe : EGVAR(wardrobe,base) {\ + modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(02,CAMO)), Q(CN(03,CAMO)), Q(CN(05,CAMO)) };\ + };\ +};\ +class CN(05,CAMO) : CN(02,CAMO) {\ + class ace_wardrobe : EGVAR(wardrobe,base) {\ + modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(02,CAMO)), Q(CN(03,CAMO)), Q(CN(04,CAMO)) };\ + };\ +}; CN_COLORS(02) CN_COLORS(03) @@ -36,10 +76,22 @@ CN_COLORS(05) // Base classes in CfgWeapons.hpp // 06-08 anzac -#define BOONIE_ANZAC(VAR) -class CN(06,VAR) : CN(02,01) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(07,VAR)), Q(CN(08,VAR)) }; }; }; -class CN(07,VAR) : CN(06,VAR) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(06,VAR)), Q(CN(08,VAR)) }; }; }; -class CN(08,VAR) : CN(06,VAR) { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(06,VAR)), Q(CN(07,VAR)) }; }; }; +#define BOONIE_ANZAC(VAR)\ +class CN(06,VAR) : CN(02,01) {\ + class ace_wardrobe : EGVAR(wardrobe,base) {\ + modifiableTo[] = { Q(CN(07,VAR)), Q(CN(08,VAR)) };\ + };\ +};\ +class CN(07,VAR) : CN(06,VAR) {\ + class ace_wardrobe : EGVAR(wardrobe,base) {\ + modifiableTo[] = { Q(CN(06,VAR)), Q(CN(08,VAR)) };\ + };\ +};\ +class CN(08,VAR) : CN(06,VAR) {\ + class ace_wardrobe : EGVAR(wardrobe,base) {\ + modifiableTo[] = { Q(CN(06,VAR)), Q(CN(07,VAR)) };\ + };\ +}; BOONIE_ANZAC(01) BOONIE_ANZAC(02) \ No newline at end of file diff --git a/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp b/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp index 3f8464a3215..e18be1d6910 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp @@ -7,8 +7,16 @@ #define HELMET_VARIANT(side,var1,var2)\ -class CN01(side,var1,var2) : base_class_up { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { Q(CN02(side,var1,var2)) }; }; };\ -class CN02(side,var1,var2) : base_class_dn { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { Q(CN01(side,var1,var2)) }; }; }; +class CN01(side,var1,var2) : base_class_up {\ + class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) {\ + modifiableTo[] = { Q(CN02(side,var1,var2)) };\ + };\ +};\ +class CN02(side,var1,var2) : base_class_dn {\ + class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) {\ + modifiableTo[] = { Q(CN01(side,var1,var2)) };\ + };\ +}; // Base classes in CfgWeapons.hpp @@ -43,5 +51,13 @@ HELMET_VARIANT(b,svh4,05) HELMET_VARIANT(b,svh4,06) // Special Case zsh3 -class vn_o_helmet_zsh3_01 : vn_o_headgear_base { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { Q(vn_o_helmet_zsh3_02) }; }; }; -class vn_o_helmet_zsh3_02 : vn_o_helmet_zsh3_01 { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { Q(vn_o_helmet_zsh3_01) }; }; }; +class vn_o_helmet_zsh3_01 : vn_o_headgear_base { + class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) { + modifiableTo[] = { Q(vn_o_helmet_zsh3_02) }; + }; +}; +class vn_o_helmet_zsh3_02 : vn_o_helmet_zsh3_01 { + class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) { + modifiableTo[] = { Q(vn_o_helmet_zsh3_01) }; + }; +}; diff --git a/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp b/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp index da08f84f6e0..be0f9307815 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp @@ -6,8 +6,16 @@ class vn_b_uniform_base; #define UNIFORM_BASE_B(class1,class2)\ -class class1: vn_b_uniform_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(class2) }; }; };\ -class class2: vn_b_uniform_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(class1) }; }; }; +class class1: vn_b_uniform_base {\ + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) {\ + modifiableTo[] = { Q(class2) };\ + };\ +};\ +class class2: vn_b_uniform_base {\ + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) {\ + modifiableTo[] = { Q(class1) };\ + };\ +}; #define B_U(div,var,camo) vn_b_uniform_##div##_##var##_##camo diff --git a/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp b/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp index a7119828511..9af22b9abe9 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp @@ -1,8 +1,16 @@ class vn_o_uniform_base; #define UNIFORM_BASE_O(class1,class2)\ -class class1: vn_o_uniform_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(class2) }; }; };\ -class class2: vn_o_uniform_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(class1) }; }; };\ +class class1: vn_o_uniform_base {\ + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) {\ + modifiableTo[] = { Q(class2) };\ + };\ +};\ +class class2: vn_o_uniform_base {\ + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) {\ + modifiableTo[] = { Q(class1) };\ + };\ +}; // OPFOR diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp index f6365293956..a142e0067ea 100644 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp @@ -2,9 +2,8 @@ class ItemInfo; class CfgWeapons { - // Importing the parent class for the uniforms we want to change, so we can inherit from it. class vn_b_uniform_base; - // creating the macro + #define S_70(className)\ class className : vn_b_uniform_base { class ItemInfo : ItemInfo { containerClass = "Supply70"; }; }; From 2772a36accdd61b130863d35d2e97b7e54db7c1b Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:40:32 +0100 Subject: [PATCH 054/305] Delete notes.md --- addons/compat_sog/compat_sog_wardrobe/notes.md | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 addons/compat_sog/compat_sog_wardrobe/notes.md diff --git a/addons/compat_sog/compat_sog_wardrobe/notes.md b/addons/compat_sog/compat_sog_wardrobe/notes.md deleted file mode 100644 index 0021f2a4fad..00000000000 --- a/addons/compat_sog/compat_sog_wardrobe/notes.md +++ /dev/null @@ -1,4 +0,0 @@ -lxWS_H_turban_01_black -lxWS_H_turban_02_black -lxWS_H_turban_03_black -lxWS_H_turban_04_black \ No newline at end of file From 9d1c3c055bc8d6ae4c1f4769e8288472e6658a29 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:48:37 +0100 Subject: [PATCH 055/305] Delete notes.md --- addons/compat_ws/compat_ws_wardrobe/notes.md | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 addons/compat_ws/compat_ws_wardrobe/notes.md diff --git a/addons/compat_ws/compat_ws_wardrobe/notes.md b/addons/compat_ws/compat_ws_wardrobe/notes.md deleted file mode 100644 index 0021f2a4fad..00000000000 --- a/addons/compat_ws/compat_ws_wardrobe/notes.md +++ /dev/null @@ -1,4 +0,0 @@ -lxWS_H_turban_01_black -lxWS_H_turban_02_black -lxWS_H_turban_03_black -lxWS_H_turban_04_black \ No newline at end of file From f52afce082f0480a9d5d8b53a40924d1c08fef26 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:48:43 +0100 Subject: [PATCH 056/305] Update script_component.hpp --- addons/compat_ws/script_component.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/compat_ws/script_component.hpp b/addons/compat_ws/script_component.hpp index 7607cd056bc..2c5ebd6ba49 100644 --- a/addons/compat_ws/script_component.hpp +++ b/addons/compat_ws/script_component.hpp @@ -2,5 +2,4 @@ #define COMPONENT_BEAUTIFIED Western Sahara Compatibility #include "\z\ace\addons\main\script_mod.hpp" - #include "\z\ace\addons\main\script_macros.hpp" From 50009820fb9574b751d8a8782e6295b38494f0cc Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:49:15 +0100 Subject: [PATCH 057/305] ws\config --- .../compat_ws_wardrobe/CfgWardrobe.hpp | 13 ++- .../compat_ws/compat_ws_wardrobe/Turbans.hpp | 105 +++++++++++++++--- 2 files changed, 98 insertions(+), 20 deletions(-) diff --git a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp index a6f3f6fb16a..9a6f2e7ebbe 100644 --- a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp @@ -4,9 +4,16 @@ class CfgWeapons { // Cap (Ion) Forward and Reversed class lxWS_H_CapB_rvs_blk; - class lxWS_H_CapB_rvs_blk_ION: lxWS_H_CapB_rvs_blk { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "H_Cap_headphones_ion_lxws" }; }; }; - class H_Cap_headphones_ion_lxws: lxWS_H_CapB_rvs_blk_ION { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "lxWS_H_CapB_rvs_blk_ION" }; }; }; + class lxWS_H_CapB_rvs_blk_ION: lxWS_H_CapB_rvs_blk { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { "H_Cap_headphones_ion_lxws" }; + }; + }; + class H_Cap_headphones_ion_lxws: lxWS_H_CapB_rvs_blk_ION { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { "lxWS_H_CapB_rvs_blk_ION" }; + }; + }; #include "Turbans.hpp" }; - diff --git a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp index cc4ea18f268..8e8703abc71 100644 --- a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp @@ -5,25 +5,70 @@ #define QCN(version,color) Q(CN(version,color)) #define COLORGROUP(COLOR)\ -class CN(01,COLOR): lxWS_H_turban_01_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,COLOR), QCN(03,COLOR), QCN(04,COLOR) }; }; };\ -class CN(02,COLOR): lxWS_H_turban_02_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,COLOR), QCN(03,COLOR), QCN(04,COLOR) }; }; };\ -class CN(03,COLOR): lxWS_H_turban_03_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,COLOR), QCN(02,COLOR), QCN(04,COLOR) }; }; };\ -class CN(04,COLOR): lxWS_H_turban_04_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,COLOR), QCN(02,COLOR), QCN(03,COLOR) }; }; }; +class CN(01,COLOR): lxWS_H_turban_01_black {\ + class ace_wardrobe : EGVAR(wardrobe,base) {\ + modifiableTo[] = { QCN(02,COLOR), QCN(03,COLOR), QCN(04,COLOR) };\ + };\ +};\ +class CN(02,COLOR): lxWS_H_turban_02_black {\ + class ace_wardrobe : EGVAR(wardrobe,base) {\ + modifiableTo[] = { QCN(01,COLOR), QCN(03,COLOR), QCN(04,COLOR) };\ + };\ +};\ +class CN(03,COLOR): lxWS_H_turban_03_black {\ + class ace_wardrobe : EGVAR(wardrobe,base) {\ + modifiableTo[] = { QCN(01,COLOR), QCN(02,COLOR), QCN(04,COLOR) };\ + };\ +};\ +class CN(04,COLOR): lxWS_H_turban_04_black {\ + class ace_wardrobe : EGVAR(wardrobe,base) {\ + modifiableTo[] = { QCN(01,COLOR), QCN(02,COLOR), QCN(03,COLOR) };\ + };\ +}; #define COLORGROUP_SPECIAL(COLOR)\ -class CN(02,COLOR): lxWS_H_turban_02_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(03,COLOR) }; }; };\ -class CN(03,COLOR): lxWS_H_turban_03_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,COLOR) }; }; }; +class CN(02,COLOR): lxWS_H_turban_02_black {\ + class ace_wardrobe : EGVAR(wardrobe,base) {\ + modifiableTo[] = { QCN(03,COLOR) };\ + };\ +};\ +class CN(03,COLOR): lxWS_H_turban_03_black {\ + class ace_wardrobe : EGVAR(wardrobe,base) {\ + modifiableTo[] = { QCN(02,COLOR) };\ + };\ +}; // BASECLASS class H_Shemag_khk; -class H_turban_02_mask_black_lxws : H_Shemag_khk { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(03,black), QCN(04,black) }; components[] = { "lxWS_H_bmask_base" }; }; }; -class lxWS_H_turban_01_black : H_Shemag_khk { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,black), QCN(03,black), QCN(04,black), "H_turban_02_mask_black_lxws" }; }; }; -class lxWS_H_turban_02_black : lxWS_H_turban_01_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(03,black), QCN(04,black), "H_turban_02_mask_black_lxws" }; }; }; -class lxWS_H_turban_03_black : lxWS_H_turban_01_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(04,black), "H_turban_02_mask_black_lxws" }; }; }; -class lxWS_H_turban_04_black : lxWS_H_turban_01_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(03,black), "H_turban_02_mask_black_lxws" }; }; }; +class H_turban_02_mask_black_lxws : H_Shemag_khk { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(03,black), QCN(04,black) }; + components[] = { "lxWS_H_bmask_base" }; + }; +}; +class lxWS_H_turban_01_black : H_Shemag_khk { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { QCN(02,black), QCN(03,black), QCN(04,black), "H_turban_02_mask_black_lxws" }; + }; +}; +class lxWS_H_turban_02_black : lxWS_H_turban_01_black { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { QCN(01,black), QCN(03,black), QCN(04,black), "H_turban_02_mask_black_lxws" }; + }; +}; +class lxWS_H_turban_03_black : lxWS_H_turban_01_black { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(04,black), "H_turban_02_mask_black_lxws" }; + }; +}; +class lxWS_H_turban_04_black : lxWS_H_turban_01_black { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(03,black), "H_turban_02_mask_black_lxws" }; + }; +}; // VARIATIONS COLORGROUP(blue) @@ -38,9 +83,35 @@ COLORGROUP_SPECIAL(green_pattern) // Super Special Manual blabla -class H_turban_02_mask_snake_lxws : H_turban_02_mask_black_lxws { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_hex_lxws" }; components[] = {"H_bmask_snake_lxws"}; }; }; -class H_turban_02_mask_hex_lxws: H_turban_02_mask_black_lxws { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws" }; components[] = {"lxWS_H_bmask_hex"}; }; }; -class lxWS_H_turban_01_sand: lxWS_H_turban_01_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; -class lxWS_H_turban_02_sand: lxWS_H_turban_02_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; -class lxWS_H_turban_03_sand: lxWS_H_turban_03_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; -class lxWS_H_turban_04_sand: lxWS_H_turban_04_black { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; \ No newline at end of file +class H_turban_02_mask_snake_lxws : H_turban_02_mask_black_lxws { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_hex_lxws" }; + components[] = {"H_bmask_snake_lxws"}; + }; +}; +class H_turban_02_mask_hex_lxws: H_turban_02_mask_black_lxws { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws" }; + components[] = {"lxWS_H_bmask_hex"}; + }; +}; +class lxWS_H_turban_01_sand: lxWS_H_turban_01_black { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; + }; +}; +class lxWS_H_turban_02_sand: lxWS_H_turban_02_black { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { QCN(01,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; + }; +}; +class lxWS_H_turban_03_sand: lxWS_H_turban_03_black { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; + }; +}; +class lxWS_H_turban_04_sand: lxWS_H_turban_04_black { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; + }; +}; \ No newline at end of file From bb6e17f685b9f1bff29545fbf691d9aebf102b5b Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:49:22 +0100 Subject: [PATCH 058/305] cleanup --- addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp | 3 --- .../compat_sog_wardrobe_uniform_fix/Uniforms.hpp | 10 +++++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp b/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp index be0f9307815..a5f13456132 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp @@ -3,8 +3,6 @@ class vn_b_uniform_base; // Macros - - #define UNIFORM_BASE_B(class1,class2)\ class class1: vn_b_uniform_base {\ class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) {\ @@ -18,7 +16,6 @@ class class2: vn_b_uniform_base {\ }; #define B_U(div,var,camo) vn_b_uniform_##div##_##var##_##camo - #define B_U_PAIR(div,down,up,camo) UNIFORM_BASE_B(B_U(div,down,camo),B_U(div,up,camo)) diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp index a142e0067ea..5e12ed5350f 100644 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp @@ -1,12 +1,16 @@ class ItemInfo; +#define S_70(className)\ +class className : vn_b_uniform_base {\ + class ItemInfo : ItemInfo {\ + containerClass = "Supply70";\ + };\ +}; + class CfgWeapons { class vn_b_uniform_base; - #define S_70(className)\ - class className : vn_b_uniform_base { class ItemInfo : ItemInfo { containerClass = "Supply70"; }; }; - S_70(vn_b_uniform_macv_04_01) S_70(vn_b_uniform_macv_04_02) S_70(vn_b_uniform_macv_04_05) From f59a1f2395df5ddb1ba85c10a839b45281b05331 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:55:22 +0100 Subject: [PATCH 059/305] gm/config --- .../compat_gm/compat_gm_wardrobe/Helmets.hpp | 36 ++- .../compat_gm/compat_gm_wardrobe/Uniforms.hpp | 218 ++++++++++++++---- 2 files changed, 207 insertions(+), 47 deletions(-) diff --git a/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp b/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp index c3d4d023e66..6dff70fc9d8 100644 --- a/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp @@ -6,9 +6,33 @@ class gm_ge_headgear_psh77_cover_up_base; class gm_ge_headgear_psh77_down_base; class gm_ge_headgear_psh77_up_base; -class gm_ge_bgs_headgear_psh77_cover_down_smp : gm_ge_headgear_psh77_cover_down_base { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_up_smp" }; }; }; -class gm_ge_bgs_headgear_psh77_cover_up_smp : gm_ge_headgear_psh77_cover_up_base { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_down_smp" }; }; }; -class gm_ge_bgs_headgear_psh77_cover_down_str : gm_ge_headgear_psh77_cover_down_base { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_up_str" }; }; }; -class gm_ge_bgs_headgear_psh77_cover_up_str : gm_ge_headgear_psh77_cover_up_base { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_down_str" }; }; }; -class gm_ge_headgear_psh77_down_oli : gm_ge_headgear_psh77_down_base { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { "gm_ge_headgear_psh77_up_oli" }; }; }; -class gm_ge_headgear_psh77_up_oli : gm_ge_headgear_psh77_up_base { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { "gm_ge_headgear_psh77_down_oli" }; }; }; \ No newline at end of file +class gm_ge_bgs_headgear_psh77_cover_down_smp : gm_ge_headgear_psh77_cover_down_base { + class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) { + modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_up_smp" }; + }; +}; +class gm_ge_bgs_headgear_psh77_cover_up_smp : gm_ge_headgear_psh77_cover_up_base { + class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) { + modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_down_smp" }; + }; +}; +class gm_ge_bgs_headgear_psh77_cover_down_str : gm_ge_headgear_psh77_cover_down_base { + class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) { + modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_up_str" }; + }; +}; +class gm_ge_bgs_headgear_psh77_cover_up_str : gm_ge_headgear_psh77_cover_up_base { + class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) { + modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_down_str" }; + }; +}; +class gm_ge_headgear_psh77_down_oli : gm_ge_headgear_psh77_down_base { + class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) { + modifiableTo[] = { "gm_ge_headgear_psh77_up_oli" }; + }; +}; +class gm_ge_headgear_psh77_up_oli : gm_ge_headgear_psh77_up_base { + class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) { + modifiableTo[] = { "gm_ge_headgear_psh77_down_oli" }; + }; +}; \ No newline at end of file diff --git a/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp b/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp index 324b4f9fc6b..3993ed35ff8 100644 --- a/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp @@ -5,53 +5,149 @@ class gm_ge_bgs_uniform_special_80_base; class gm_ge_bgs_uniform_special_rolled_80_base; -class gm_ge_bgs_uniform_special_80_grn : gm_ge_bgs_uniform_special_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_bgs_uniform_special_rolled_80_grn) }; }; }; -class gm_ge_bgs_uniform_special_rolled_80_grn : gm_ge_bgs_uniform_special_rolled_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_bgs_uniform_special_80_grn) }; }; }; - -class gm_ge_bgs_uniform_special_80_blk : gm_ge_bgs_uniform_special_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_bgs_uniform_special_rolled_80_blk) }; }; }; -class gm_ge_bgs_uniform_special_rolled_80_blk : gm_ge_bgs_uniform_special_rolled_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_bgs_uniform_special_80_blk) }; }; }; +class gm_ge_bgs_uniform_special_80_grn : gm_ge_bgs_uniform_special_80_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { + modifiableTo[] = { Q(gm_ge_bgs_uniform_special_rolled_80_grn) }; + }; +}; +class gm_ge_bgs_uniform_special_rolled_80_grn : gm_ge_bgs_uniform_special_rolled_80_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { + modifiableTo[] = { Q(gm_ge_bgs_uniform_special_80_grn) }; + }; +}; + +class gm_ge_bgs_uniform_special_80_blk : gm_ge_bgs_uniform_special_80_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { + modifiableTo[] = { Q(gm_ge_bgs_uniform_special_rolled_80_blk) }; + }; +}; +class gm_ge_bgs_uniform_special_rolled_80_blk : gm_ge_bgs_uniform_special_rolled_80_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { + modifiableTo[] = { Q(gm_ge_bgs_uniform_special_80_blk) }; + }; +}; class gm_ge_army_uniform_pilot_base; class gm_ge_army_uniform_pilot_rolled_base; -class gm_ge_army_uniform_pilot_sar : gm_ge_army_uniform_pilot_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_army_uniform_pilot_rolled_sar) }; }; }; -class gm_ge_army_uniform_pilot_rolled_sar : gm_ge_army_uniform_pilot_rolled_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_army_uniform_pilot_sar) }; }; }; - -class gm_ge_army_uniform_pilot_oli : gm_ge_army_uniform_pilot_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_army_uniform_pilot_oli) }; }; }; -class gm_ge_army_uniform_pilot_rolled_oli : gm_ge_army_uniform_pilot_rolled_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_army_uniform_pilot_rolled_oli) }; }; }; - -class gm_ge_pol_uniform_pilot_grn : gm_ge_army_uniform_pilot_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_pol_uniform_pilot_rolled_grn) }; }; }; -class gm_ge_pol_uniform_pilot_rolled_grn : gm_ge_army_uniform_pilot_rolled_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_pol_uniform_pilot_grn) }; }; }; +class gm_ge_army_uniform_pilot_sar : gm_ge_army_uniform_pilot_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { + modifiableTo[] = { Q(gm_ge_army_uniform_pilot_rolled_sar) }; + }; +}; +class gm_ge_army_uniform_pilot_rolled_sar : gm_ge_army_uniform_pilot_rolled_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { + modifiableTo[] = { Q(gm_ge_army_uniform_pilot_sar) }; + }; +}; + +class gm_ge_army_uniform_pilot_oli : gm_ge_army_uniform_pilot_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { + modifiableTo[] = { Q(gm_ge_army_uniform_pilot_oli) }; + }; +}; +class gm_ge_army_uniform_pilot_rolled_oli : gm_ge_army_uniform_pilot_rolled_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { + modifiableTo[] = { Q(gm_ge_army_uniform_pilot_rolled_oli) }; + }; +}; + +class gm_ge_pol_uniform_pilot_grn : gm_ge_army_uniform_pilot_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { + modifiableTo[] = { Q(gm_ge_pol_uniform_pilot_rolled_grn) }; + }; +}; +class gm_ge_pol_uniform_pilot_rolled_grn : gm_ge_army_uniform_pilot_rolled_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { + modifiableTo[] = { Q(gm_ge_pol_uniform_pilot_grn) }; + }; +}; class gm_ge_uniform_pilot_commando_base; class gm_ge_uniform_pilot_commando_rolled_base; -class gm_ge_uniform_pilot_commando_oli : gm_ge_uniform_pilot_commando_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_rolled_oli) }; }; }; -class gm_ge_uniform_pilot_commando_rolled_oli : gm_ge_uniform_pilot_commando_rolled_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_oli) }; }; }; - -class gm_ge_uniform_pilot_commando_gry : gm_ge_uniform_pilot_commando_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_rolled_gry) }; }; }; -class gm_ge_uniform_pilot_commando_rolled_gry : gm_ge_uniform_pilot_commando_rolled_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_gry) }; }; }; - -class gm_ge_uniform_pilot_commando_blk : gm_ge_uniform_pilot_commando_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_rolled_blk) }; }; }; -class gm_ge_uniform_pilot_commando_rolled_blk : gm_ge_uniform_pilot_commando_rolled_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_blk) }; }; }; +class gm_ge_uniform_pilot_commando_oli : gm_ge_uniform_pilot_commando_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { + modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_rolled_oli) }; + }; +}; +class gm_ge_uniform_pilot_commando_rolled_oli : gm_ge_uniform_pilot_commando_rolled_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { + modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_oli) }; + }; +}; + +class gm_ge_uniform_pilot_commando_gry : gm_ge_uniform_pilot_commando_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { + modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_rolled_gry) }; + }; +}; +class gm_ge_uniform_pilot_commando_rolled_gry : gm_ge_uniform_pilot_commando_rolled_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { + modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_gry) }; + }; +}; + +class gm_ge_uniform_pilot_commando_blk : gm_ge_uniform_pilot_commando_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { + modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_rolled_blk) }; + }; +}; +class gm_ge_uniform_pilot_commando_rolled_blk : gm_ge_uniform_pilot_commando_rolled_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { + modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_blk) }; + }; +}; class gm_pl_uniform_soldier_80_base; -class gm_pl_army_uniform_soldier_80_frog : gm_pl_uniform_soldier_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_pl_army_uniform_soldier_rolled_80_frog) }; }; }; -class gm_pl_army_uniform_soldier_rolled_80_frog : gm_pl_uniform_soldier_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_pl_army_uniform_soldier_80_frog) }; }; }; - -class gm_pl_army_uniform_soldier_80_moro : gm_pl_uniform_soldier_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_pl_army_uniform_soldier_rolled_80_moro) }; }; }; -class gm_pl_army_uniform_soldier_rolled_80_moro : gm_pl_uniform_soldier_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_pl_army_uniform_soldier_80_moro) }; }; }; +class gm_pl_army_uniform_soldier_80_frog : gm_pl_uniform_soldier_80_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { + modifiableTo[] = { Q(gm_pl_army_uniform_soldier_rolled_80_frog) }; + }; +}; +class gm_pl_army_uniform_soldier_rolled_80_frog : gm_pl_uniform_soldier_80_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { + modifiableTo[] = { Q(gm_pl_army_uniform_soldier_80_frog) }; + }; +}; + +class gm_pl_army_uniform_soldier_80_moro : gm_pl_uniform_soldier_80_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { + modifiableTo[] = { Q(gm_pl_army_uniform_soldier_rolled_80_moro) }; + }; +}; +class gm_pl_army_uniform_soldier_rolled_80_moro : gm_pl_uniform_soldier_80_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { + modifiableTo[] = { Q(gm_pl_army_uniform_soldier_80_moro) }; + }; +}; class gm_ge_uniform_soldier_90_base; -class gm_ge_uniform_soldier_90_trp : gm_ge_uniform_soldier_90_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_soldier_rolled_90_trp) }; }; }; -class gm_ge_uniform_soldier_rolled_90_trp : gm_ge_uniform_soldier_90_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_soldier_90_trp) }; }; }; +class gm_ge_uniform_soldier_90_trp : gm_ge_uniform_soldier_90_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { + modifiableTo[] = { Q(gm_ge_uniform_soldier_rolled_90_trp) }; + }; +}; +class gm_ge_uniform_soldier_rolled_90_trp : gm_ge_uniform_soldier_90_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { + modifiableTo[] = { Q(gm_ge_uniform_soldier_90_trp) }; + }; +}; -class gm_ge_uniform_soldier_90_flk : gm_ge_uniform_soldier_90_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_soldier_rolled_90_flk) }; }; }; -class gm_ge_uniform_soldier_rolled_90_flk : gm_ge_uniform_soldier_90_base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_soldier_90_flk) }; }; }; +class gm_ge_uniform_soldier_90_flk : gm_ge_uniform_soldier_90_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { + modifiableTo[] = { Q(gm_ge_uniform_soldier_rolled_90_flk) }; + }; +}; +class gm_ge_uniform_soldier_rolled_90_flk : gm_ge_uniform_soldier_90_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { + modifiableTo[] = { Q(gm_ge_uniform_soldier_90_flk) }; + }; +}; @@ -59,24 +155,64 @@ class gm_ge_uniform_soldier_rolled_90_flk : gm_ge_uniform_soldier_90_base { clas // Gloves class gm_gc_uniform_soldier_80_base; -class gm_gc_army_uniform_soldier_gloves_80_str : gm_gc_uniform_soldier_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_on) { modifiableTo[] = { Q(gm_gc_army_uniform_soldier_80_str) }; }; }; -class gm_gc_army_uniform_soldier_80_str : gm_gc_uniform_soldier_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_off) { modifiableTo[] = { Q(gm_gc_army_uniform_soldier_gloves_80_str) }; }; }; +class gm_gc_army_uniform_soldier_gloves_80_str : gm_gc_uniform_soldier_80_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_on) { + modifiableTo[] = { Q(gm_gc_army_uniform_soldier_80_str) }; + }; +}; +class gm_gc_army_uniform_soldier_80_str : gm_gc_uniform_soldier_80_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_off) { + modifiableTo[] = { Q(gm_gc_army_uniform_soldier_gloves_80_str) }; + }; +}; class gm_ge_uniform_soldier_80_base; -class gm_ge_army_uniform_soldier_gloves_80_ols : gm_ge_uniform_soldier_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_on) { modifiableTo[] = { Q(gm_ge_army_uniform_soldier_80_ols) }; }; }; -class gm_ge_army_uniform_soldier_80_ols : gm_ge_uniform_soldier_80_base { class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_off) { modifiableTo[] = { Q(gm_ge_army_uniform_soldier_gloves_80_ols) }; }; }; +class gm_ge_army_uniform_soldier_gloves_80_ols : gm_ge_uniform_soldier_80_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_on) { + modifiableTo[] = { Q(gm_ge_army_uniform_soldier_80_ols) }; + }; +}; +class gm_ge_army_uniform_soldier_80_ols : gm_ge_uniform_soldier_80_base { + class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_off) { + modifiableTo[] = { Q(gm_ge_army_uniform_soldier_gloves_80_ols) }; + }; +}; // Mixed case -> Base Interaction class gm_ge_army_uniform_soldier_bdu_80_wdl; class gm_ge_army_uniform_soldier_bdu_rolled_80_wdl; -class gm_xx_uniform_soldier_bdu_80_wdl : gm_ge_army_uniform_soldier_bdu_80_wdl { class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_on) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_rolled_80_wdl), Q(gm_xx_uniform_soldier_bdu_nogloves_80_wdl) }; }; }; -class gm_xx_uniform_soldier_bdu_rolled_80_wdl : gm_ge_army_uniform_soldier_bdu_rolled_80_wdl { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_wdl), Q(gm_xx_uniform_soldier_bdu_nogloves_80_wdl) }; }; }; -class gm_xx_uniform_soldier_bdu_nogloves_80_wdl : gm_ge_army_uniform_soldier_bdu_80_wdl { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_wdl), Q(gm_xx_uniform_soldier_bdu_rolled_80_wdl) }; }; }; - -class gm_xx_uniform_soldier_bdu_80_oli : gm_ge_army_uniform_soldier_bdu_80_wdl { class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_on) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_rolled_80_oli), Q(gm_xx_uniform_soldier_bdu_nogloves_80_oli) }; }; }; -class gm_xx_uniform_soldier_bdu_rolled_80_oli : gm_ge_army_uniform_soldier_bdu_rolled_80_wdl { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_oli), Q(gm_xx_uniform_soldier_bdu_nogloves_80_oli) }; }; }; -class gm_xx_uniform_soldier_bdu_nogloves_80_oli : gm_ge_army_uniform_soldier_bdu_80_wdl { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_oli), Q(gm_xx_uniform_soldier_bdu_rolled_80_oli) }; }; }; +class gm_xx_uniform_soldier_bdu_80_wdl : gm_ge_army_uniform_soldier_bdu_80_wdl { + class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_on) { + modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_rolled_80_wdl), Q(gm_xx_uniform_soldier_bdu_nogloves_80_wdl) }; + }; +}; +class gm_xx_uniform_soldier_bdu_rolled_80_wdl : gm_ge_army_uniform_soldier_bdu_rolled_80_wdl { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { + modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_wdl), Q(gm_xx_uniform_soldier_bdu_nogloves_80_wdl) }; + }; +}; +class gm_xx_uniform_soldier_bdu_nogloves_80_wdl : gm_ge_army_uniform_soldier_bdu_80_wdl { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_wdl), Q(gm_xx_uniform_soldier_bdu_rolled_80_wdl) }; + }; +}; + +class gm_xx_uniform_soldier_bdu_80_oli : gm_ge_army_uniform_soldier_bdu_80_wdl { + class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_on) { + modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_rolled_80_oli), Q(gm_xx_uniform_soldier_bdu_nogloves_80_oli) }; + }; +}; +class gm_xx_uniform_soldier_bdu_rolled_80_oli : gm_ge_army_uniform_soldier_bdu_rolled_80_wdl { + class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { + modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_oli), Q(gm_xx_uniform_soldier_bdu_nogloves_80_oli) }; + }; +}; +class gm_xx_uniform_soldier_bdu_nogloves_80_oli : gm_ge_army_uniform_soldier_bdu_80_wdl { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_oli), Q(gm_xx_uniform_soldier_bdu_rolled_80_oli) }; + }; +}; From 70298182d16204f42145a13714bae432763eb5f9 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 03:04:34 +0100 Subject: [PATCH 060/305] fix path --- addons/wardrobe/XEH_preInit.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/XEH_preInit.sqf b/addons/wardrobe/XEH_preInit.sqf index 3ecfb8d76d2..9e2dfa374cc 100644 --- a/addons/wardrobe/XEH_preInit.sqf +++ b/addons/wardrobe/XEH_preInit.sqf @@ -1,4 +1,4 @@ -#include "../script_component.hpp" +#include "script_component.hpp" [ QSET(enable_action), From 3f07dcb432eb267a1b05fe7fd37325c718796ae7 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 03:14:49 +0100 Subject: [PATCH 061/305] fixed error_2 --- addons/wardrobe/functions/replace/fn_replace.sqf | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/addons/wardrobe/functions/replace/fn_replace.sqf b/addons/wardrobe/functions/replace/fn_replace.sqf index fd3db8b5d3f..73ecc301ec2 100644 --- a/addons/wardrobe/functions/replace/fn_replace.sqf +++ b/addons/wardrobe/functions/replace/fn_replace.sqf @@ -22,12 +22,6 @@ _actionParams params ["_cfg_origin", "_cfg_tgt"]; private _duration = getNumber (_cfg_tgt>> Q(ADDON) >> "duration"); if (_replaceNow) then { _duration = 0; }; -// Animation/Gestures -[ _unit, getText (_cfg_tgt >> Q(ADDON) >> "gesture") ] call ace_common_fnc_doGesture; - - - - // Replace the Main Item. private _additionalParams = ""; private _typeNumber = getNumber (_cfg_origin >> "ItemInfo" >> "type"); @@ -45,8 +39,7 @@ private _replaceCode = switch ( _typeNumber ) do { }; }; - -if (_replaceCode isEqualType false) exitWith {ERROR_2(replacecode undefined,_typeNumber,_replaceCode);}; +if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 - %2",_typeNumber,configName _cfg_origin); }; [ _replaceCode, [_unit, _cfg_origin, _cfg_tgt, _additionalParams ], _duration * 1.0 ] call CBA_fnc_waitAndExecute; @@ -60,6 +53,9 @@ if (_replaceCode isEqualType false) exitWith {ERROR_2(replacecode undefined,_typ } forEach _missing; +// Animation/Gestures +[ _unit, getText (_cfg_tgt >> Q(ADDON) >> "gesture") ] call ace_common_fnc_doGesture; + // Plays Random Sound At the Beginning private _sound_timing = getNumber (_cfg_tgt>> Q(ADDON) >> "sound_timing") max 0 min 1; private _sound = [_cfg_tgt >> Q(ADDON) >> "sound"] call FUNC(getCfgDataRandom); From 81a81502aa4c9d9380df89f1ab54cfcfe15b6683 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 03:15:04 +0100 Subject: [PATCH 062/305] fixed config --- .../compat_sog_wardrobe/Booniehats.hpp | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp b/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp index ddf9c8690ef..56b1c3049a3 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp @@ -12,31 +12,32 @@ #define CN(variation,color) vn_b_boonie_##variation##_##color // Base Boonie -#define CAMO_BASE 01\ -class CN(02,CAMO_BASE) : vn_b_headgear_base {\ - class ace_wardrobe : EGVAR(wardrobe,base) {\ - modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) };\ - };\ -};\ -class CN(01,CAMO_BASE) : CN(02,CAMO_BASE) {\ - class ace_wardrobe : EGVAR(wardrobe,base) {\ - modifiableTo[] = { Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) };\ - };\ -};\ -class CN(03,CAMO_BASE) : CN(02,CAMO_BASE) {\ - class ace_wardrobe : EGVAR(wardrobe,base) {\ - modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) };\ - };\ -};\ -class CN(04,CAMO_BASE) : CN(02,CAMO_BASE) {\ - class ace_wardrobe : EGVAR(wardrobe,base) {\ - modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(05,CAMO_BASE)) };\ - };\ -};\ -class CN(05,CAMO_BASE) : CN(02,CAMO_BASE) {\ - class ace_wardrobe : EGVAR(wardrobe,base) {\ - modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)) };\ - };\ +#define CAMO_BASE 01 + +class CN(02,CAMO_BASE) : vn_b_headgear_base { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; + }; +}; +class CN(01,CAMO_BASE) : CN(02,CAMO_BASE) { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; + }; +}; +class CN(03,CAMO_BASE) : CN(02,CAMO_BASE) { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; + }; +}; +class CN(04,CAMO_BASE) : CN(02,CAMO_BASE) { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; + }; +}; +class CN(05,CAMO_BASE) : CN(02,CAMO_BASE) { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)) }; + }; }; From 14ea3f792ce60cdfac8518bb5d373e172a1b447c Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 03:22:53 +0100 Subject: [PATCH 063/305] config fix ` :` --- .../compat_gm/compat_gm_wardrobe/Helmets.hpp | 24 ++-- .../compat_gm/compat_gm_wardrobe/Uniforms.hpp | 136 +++++++++--------- .../compat_rf_wardrobe/CfgWardrobe.hpp | 4 +- .../compat_rf/compat_rf_wardrobe/Helmets.hpp | 8 +- .../compat_rf/compat_rf_wardrobe/Uniforms.hpp | 16 +-- .../compat_sog_wardrobe/Booniehats.hpp | 52 +++---- .../compat_sog_wardrobe/Pilothelmets.hpp | 16 +-- .../compat_sog_wardrobe/Uniforms_B.hpp | 4 +- .../compat_sog_wardrobe/Uniforms_O.hpp | 4 +- .../Uniforms.hpp | 4 +- .../compat_ws_wardrobe/CfgWardrobe.hpp | 4 +- .../compat_ws/compat_ws_wardrobe/Turbans.hpp | 46 +++--- addons/wardrobe/Baseclass.hpp | 16 +-- addons/wardrobe/compat_vanilla/Facewear.hpp | 72 +++++----- addons/wardrobe/compat_vanilla/Uniforms.hpp | 4 +- .../wardrobe/functions/replace/fn_replace.sqf | 2 +- 16 files changed, 206 insertions(+), 206 deletions(-) diff --git a/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp b/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp index 6dff70fc9d8..36d42efd33c 100644 --- a/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp @@ -6,33 +6,33 @@ class gm_ge_headgear_psh77_cover_up_base; class gm_ge_headgear_psh77_down_base; class gm_ge_headgear_psh77_up_base; -class gm_ge_bgs_headgear_psh77_cover_down_smp : gm_ge_headgear_psh77_cover_down_base { - class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) { +class gm_ge_bgs_headgear_psh77_cover_down_smp: gm_ge_headgear_psh77_cover_down_base { + class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_up_smp" }; }; }; -class gm_ge_bgs_headgear_psh77_cover_up_smp : gm_ge_headgear_psh77_cover_up_base { - class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) { +class gm_ge_bgs_headgear_psh77_cover_up_smp: gm_ge_headgear_psh77_cover_up_base { + class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_down_smp" }; }; }; -class gm_ge_bgs_headgear_psh77_cover_down_str : gm_ge_headgear_psh77_cover_down_base { - class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) { +class gm_ge_bgs_headgear_psh77_cover_down_str: gm_ge_headgear_psh77_cover_down_base { + class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_up_str" }; }; }; -class gm_ge_bgs_headgear_psh77_cover_up_str : gm_ge_headgear_psh77_cover_up_base { - class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) { +class gm_ge_bgs_headgear_psh77_cover_up_str: gm_ge_headgear_psh77_cover_up_base { + class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_down_str" }; }; }; -class gm_ge_headgear_psh77_down_oli : gm_ge_headgear_psh77_down_base { - class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) { +class gm_ge_headgear_psh77_down_oli: gm_ge_headgear_psh77_down_base { + class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { "gm_ge_headgear_psh77_up_oli" }; }; }; -class gm_ge_headgear_psh77_up_oli : gm_ge_headgear_psh77_up_base { - class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) { +class gm_ge_headgear_psh77_up_oli: gm_ge_headgear_psh77_up_base { + class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { "gm_ge_headgear_psh77_down_oli" }; }; }; \ No newline at end of file diff --git a/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp b/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp index 3993ed35ff8..31bd6db4255 100644 --- a/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp @@ -5,24 +5,24 @@ class gm_ge_bgs_uniform_special_80_base; class gm_ge_bgs_uniform_special_rolled_80_base; -class gm_ge_bgs_uniform_special_80_grn : gm_ge_bgs_uniform_special_80_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { +class gm_ge_bgs_uniform_special_80_grn: gm_ge_bgs_uniform_special_80_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_bgs_uniform_special_rolled_80_grn) }; }; }; -class gm_ge_bgs_uniform_special_rolled_80_grn : gm_ge_bgs_uniform_special_rolled_80_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { +class gm_ge_bgs_uniform_special_rolled_80_grn: gm_ge_bgs_uniform_special_rolled_80_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_bgs_uniform_special_80_grn) }; }; }; -class gm_ge_bgs_uniform_special_80_blk : gm_ge_bgs_uniform_special_80_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { +class gm_ge_bgs_uniform_special_80_blk: gm_ge_bgs_uniform_special_80_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_bgs_uniform_special_rolled_80_blk) }; }; }; -class gm_ge_bgs_uniform_special_rolled_80_blk : gm_ge_bgs_uniform_special_rolled_80_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { +class gm_ge_bgs_uniform_special_rolled_80_blk: gm_ge_bgs_uniform_special_rolled_80_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_bgs_uniform_special_80_blk) }; }; }; @@ -31,35 +31,35 @@ class gm_ge_bgs_uniform_special_rolled_80_blk : gm_ge_bgs_uniform_special_rolled class gm_ge_army_uniform_pilot_base; class gm_ge_army_uniform_pilot_rolled_base; -class gm_ge_army_uniform_pilot_sar : gm_ge_army_uniform_pilot_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { +class gm_ge_army_uniform_pilot_sar: gm_ge_army_uniform_pilot_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_army_uniform_pilot_rolled_sar) }; }; }; -class gm_ge_army_uniform_pilot_rolled_sar : gm_ge_army_uniform_pilot_rolled_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { +class gm_ge_army_uniform_pilot_rolled_sar: gm_ge_army_uniform_pilot_rolled_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_army_uniform_pilot_sar) }; }; }; -class gm_ge_army_uniform_pilot_oli : gm_ge_army_uniform_pilot_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { +class gm_ge_army_uniform_pilot_oli: gm_ge_army_uniform_pilot_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_army_uniform_pilot_oli) }; }; }; -class gm_ge_army_uniform_pilot_rolled_oli : gm_ge_army_uniform_pilot_rolled_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { +class gm_ge_army_uniform_pilot_rolled_oli: gm_ge_army_uniform_pilot_rolled_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_army_uniform_pilot_rolled_oli) }; }; }; -class gm_ge_pol_uniform_pilot_grn : gm_ge_army_uniform_pilot_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { +class gm_ge_pol_uniform_pilot_grn: gm_ge_army_uniform_pilot_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_pol_uniform_pilot_rolled_grn) }; }; }; -class gm_ge_pol_uniform_pilot_rolled_grn : gm_ge_army_uniform_pilot_rolled_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { +class gm_ge_pol_uniform_pilot_rolled_grn: gm_ge_army_uniform_pilot_rolled_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_pol_uniform_pilot_grn) }; }; }; @@ -67,59 +67,59 @@ class gm_ge_pol_uniform_pilot_rolled_grn : gm_ge_army_uniform_pilot_rolled_base class gm_ge_uniform_pilot_commando_base; class gm_ge_uniform_pilot_commando_rolled_base; -class gm_ge_uniform_pilot_commando_oli : gm_ge_uniform_pilot_commando_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { +class gm_ge_uniform_pilot_commando_oli: gm_ge_uniform_pilot_commando_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_rolled_oli) }; }; }; -class gm_ge_uniform_pilot_commando_rolled_oli : gm_ge_uniform_pilot_commando_rolled_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { +class gm_ge_uniform_pilot_commando_rolled_oli: gm_ge_uniform_pilot_commando_rolled_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_oli) }; }; }; -class gm_ge_uniform_pilot_commando_gry : gm_ge_uniform_pilot_commando_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { +class gm_ge_uniform_pilot_commando_gry: gm_ge_uniform_pilot_commando_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_rolled_gry) }; }; }; -class gm_ge_uniform_pilot_commando_rolled_gry : gm_ge_uniform_pilot_commando_rolled_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { +class gm_ge_uniform_pilot_commando_rolled_gry: gm_ge_uniform_pilot_commando_rolled_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_gry) }; }; }; -class gm_ge_uniform_pilot_commando_blk : gm_ge_uniform_pilot_commando_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { +class gm_ge_uniform_pilot_commando_blk: gm_ge_uniform_pilot_commando_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_rolled_blk) }; }; }; -class gm_ge_uniform_pilot_commando_rolled_blk : gm_ge_uniform_pilot_commando_rolled_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { +class gm_ge_uniform_pilot_commando_rolled_blk: gm_ge_uniform_pilot_commando_rolled_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_blk) }; }; }; class gm_pl_uniform_soldier_80_base; -class gm_pl_army_uniform_soldier_80_frog : gm_pl_uniform_soldier_80_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { +class gm_pl_army_uniform_soldier_80_frog: gm_pl_uniform_soldier_80_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_pl_army_uniform_soldier_rolled_80_frog) }; }; }; -class gm_pl_army_uniform_soldier_rolled_80_frog : gm_pl_uniform_soldier_80_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { +class gm_pl_army_uniform_soldier_rolled_80_frog: gm_pl_uniform_soldier_80_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_pl_army_uniform_soldier_80_frog) }; }; }; -class gm_pl_army_uniform_soldier_80_moro : gm_pl_uniform_soldier_80_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { +class gm_pl_army_uniform_soldier_80_moro: gm_pl_uniform_soldier_80_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_pl_army_uniform_soldier_rolled_80_moro) }; }; }; -class gm_pl_army_uniform_soldier_rolled_80_moro : gm_pl_uniform_soldier_80_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { +class gm_pl_army_uniform_soldier_rolled_80_moro: gm_pl_uniform_soldier_80_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_pl_army_uniform_soldier_80_moro) }; }; }; @@ -127,24 +127,24 @@ class gm_pl_army_uniform_soldier_rolled_80_moro : gm_pl_uniform_soldier_80_base class gm_ge_uniform_soldier_90_base; -class gm_ge_uniform_soldier_90_trp : gm_ge_uniform_soldier_90_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { +class gm_ge_uniform_soldier_90_trp: gm_ge_uniform_soldier_90_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_soldier_rolled_90_trp) }; }; }; -class gm_ge_uniform_soldier_rolled_90_trp : gm_ge_uniform_soldier_90_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { +class gm_ge_uniform_soldier_rolled_90_trp: gm_ge_uniform_soldier_90_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_soldier_90_trp) }; }; }; -class gm_ge_uniform_soldier_90_flk : gm_ge_uniform_soldier_90_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { +class gm_ge_uniform_soldier_90_flk: gm_ge_uniform_soldier_90_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(gm_ge_uniform_soldier_rolled_90_flk) }; }; }; -class gm_ge_uniform_soldier_rolled_90_flk : gm_ge_uniform_soldier_90_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { +class gm_ge_uniform_soldier_rolled_90_flk: gm_ge_uniform_soldier_90_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_ge_uniform_soldier_90_flk) }; }; }; @@ -155,25 +155,25 @@ class gm_ge_uniform_soldier_rolled_90_flk : gm_ge_uniform_soldier_90_base { // Gloves class gm_gc_uniform_soldier_80_base; -class gm_gc_army_uniform_soldier_gloves_80_str : gm_gc_uniform_soldier_80_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_on) { +class gm_gc_army_uniform_soldier_gloves_80_str: gm_gc_uniform_soldier_80_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_gloves_on) { modifiableTo[] = { Q(gm_gc_army_uniform_soldier_80_str) }; }; }; -class gm_gc_army_uniform_soldier_80_str : gm_gc_uniform_soldier_80_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_off) { +class gm_gc_army_uniform_soldier_80_str: gm_gc_uniform_soldier_80_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_gloves_off) { modifiableTo[] = { Q(gm_gc_army_uniform_soldier_gloves_80_str) }; }; }; class gm_ge_uniform_soldier_80_base; -class gm_ge_army_uniform_soldier_gloves_80_ols : gm_ge_uniform_soldier_80_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_on) { +class gm_ge_army_uniform_soldier_gloves_80_ols: gm_ge_uniform_soldier_80_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_gloves_on) { modifiableTo[] = { Q(gm_ge_army_uniform_soldier_80_ols) }; }; }; -class gm_ge_army_uniform_soldier_80_ols : gm_ge_uniform_soldier_80_base { - class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_off) { +class gm_ge_army_uniform_soldier_80_ols: gm_ge_uniform_soldier_80_base { + class ace_wardrobe: EGVAR(wardrobe,base_U_gloves_off) { modifiableTo[] = { Q(gm_ge_army_uniform_soldier_gloves_80_ols) }; }; }; @@ -183,34 +183,34 @@ class gm_ge_army_uniform_soldier_80_ols : gm_ge_uniform_soldier_80_base { class gm_ge_army_uniform_soldier_bdu_80_wdl; class gm_ge_army_uniform_soldier_bdu_rolled_80_wdl; -class gm_xx_uniform_soldier_bdu_80_wdl : gm_ge_army_uniform_soldier_bdu_80_wdl { - class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_on) { +class gm_xx_uniform_soldier_bdu_80_wdl: gm_ge_army_uniform_soldier_bdu_80_wdl { + class ace_wardrobe: EGVAR(wardrobe,base_U_gloves_on) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_rolled_80_wdl), Q(gm_xx_uniform_soldier_bdu_nogloves_80_wdl) }; }; }; -class gm_xx_uniform_soldier_bdu_rolled_80_wdl : gm_ge_army_uniform_soldier_bdu_rolled_80_wdl { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { +class gm_xx_uniform_soldier_bdu_rolled_80_wdl: gm_ge_army_uniform_soldier_bdu_rolled_80_wdl { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_wdl), Q(gm_xx_uniform_soldier_bdu_nogloves_80_wdl) }; }; }; -class gm_xx_uniform_soldier_bdu_nogloves_80_wdl : gm_ge_army_uniform_soldier_bdu_80_wdl { - class ace_wardrobe : EGVAR(wardrobe,base) { +class gm_xx_uniform_soldier_bdu_nogloves_80_wdl: gm_ge_army_uniform_soldier_bdu_80_wdl { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_wdl), Q(gm_xx_uniform_soldier_bdu_rolled_80_wdl) }; }; }; -class gm_xx_uniform_soldier_bdu_80_oli : gm_ge_army_uniform_soldier_bdu_80_wdl { - class ace_wardrobe : EGVAR(wardrobe,base_U_gloves_on) { +class gm_xx_uniform_soldier_bdu_80_oli: gm_ge_army_uniform_soldier_bdu_80_wdl { + class ace_wardrobe: EGVAR(wardrobe,base_U_gloves_on) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_rolled_80_oli), Q(gm_xx_uniform_soldier_bdu_nogloves_80_oli) }; }; }; -class gm_xx_uniform_soldier_bdu_rolled_80_oli : gm_ge_army_uniform_soldier_bdu_rolled_80_wdl { - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { +class gm_xx_uniform_soldier_bdu_rolled_80_oli: gm_ge_army_uniform_soldier_bdu_rolled_80_wdl { + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_oli), Q(gm_xx_uniform_soldier_bdu_nogloves_80_oli) }; }; }; -class gm_xx_uniform_soldier_bdu_nogloves_80_oli : gm_ge_army_uniform_soldier_bdu_80_wdl { - class ace_wardrobe : EGVAR(wardrobe,base) { +class gm_xx_uniform_soldier_bdu_nogloves_80_oli: gm_ge_army_uniform_soldier_bdu_80_wdl { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_oli), Q(gm_xx_uniform_soldier_bdu_rolled_80_oli) }; }; }; diff --git a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp index dc891c51af4..1989d2e2ab8 100644 --- a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp @@ -14,8 +14,8 @@ class CfgWeapons // Cap (Ion) Forward and Reversed class lxWS_H_CapB_rvs_blk; - class lxWS_H_CapB_rvs_blk_ION: lxWS_H_CapB_rvs_blk { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "H_Cap_headphones_ion_lxws" }; }; }; - class H_Cap_headphones_ion_lxws: lxWS_H_CapB_rvs_blk_ION { class ace_wardrobe : EGVAR(wardrobe,base) { modifiableTo[] = { "lxWS_H_CapB_rvs_blk_ION" }; }; }; + class lxWS_H_CapB_rvs_blk_ION: lxWS_H_CapB_rvs_blk { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "H_Cap_headphones_ion_lxws" }; }; }; + class H_Cap_headphones_ion_lxws: lxWS_H_CapB_rvs_blk_ION { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "lxWS_H_CapB_rvs_blk_ION" }; }; }; }; diff --git a/addons/compat_rf/compat_rf_wardrobe/Helmets.hpp b/addons/compat_rf/compat_rf_wardrobe/Helmets.hpp index 8b38ea87608..06411e8dd1c 100644 --- a/addons/compat_rf/compat_rf_wardrobe/Helmets.hpp +++ b/addons/compat_rf/compat_rf_wardrobe/Helmets.hpp @@ -6,15 +6,15 @@ #define HELMET_VARIANT(color)\ -class CN(color): H_HelmetHeavy_Black_RF { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { Q(CN_VU(color)) }; }; };\ -class CN_VU(color): H_HelmetHeavy_VisorUp_Black_RF { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { Q(CN(color)) }; }; };\ +class CN(color): H_HelmetHeavy_Black_RF { class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { Q(CN_VU(color)) }; }; };\ +class CN_VU(color): H_HelmetHeavy_VisorUp_Black_RF { class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up){ modifiableTo[] = { Q(CN(color)) }; }; };\ // Base Classes class H_HelmetAggressor_F; -class H_HelmetHeavy_Black_RF : H_HelmetAggressor_F { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { "H_HelmetHeavy_VisorUp_Black_RF" }; }; }; -class H_HelmetHeavy_VisorUp_Black_RF : H_HelmetHeavy_Black_RF { class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { "H_HelmetHeavy_Black_RF" }; }; }; +class H_HelmetHeavy_Black_RF: H_HelmetAggressor_F { class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { "H_HelmetHeavy_VisorUp_Black_RF" }; }; }; +class H_HelmetHeavy_VisorUp_Black_RF: H_HelmetHeavy_Black_RF { class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up){ modifiableTo[] = { "H_HelmetHeavy_Black_RF" }; }; }; // Variants HELMET_VARIANT(Hex) diff --git a/addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp b/addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp index fc1af3df27a..0692cd72fb0 100644 --- a/addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp +++ b/addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp @@ -4,8 +4,8 @@ class Uniform_Base; // Macros #define UNIFORM_BASE(class1,class2)\ -class class1: Uniform_Base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(class2) }; }; };\ -class class2: Uniform_Base { class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(class1) }; }; }; +class class1: Uniform_Base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(class2) }; }; };\ +class class2: Uniform_Base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(class1) }; }; }; // Simple Variants UNIFORM_BASE(U_C_FirefighterFatigues_RF,U_C_FirefighterFatigues_RolledUp_RF) @@ -13,11 +13,11 @@ UNIFORM_BASE(U_BG_Guerrilla_6_1,U_BG_Guerrilla_RF) // Pilot Jackets -class U_C_PilotJacket_black_RF : Uniform_Base { class ace_wardrobe : EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { Q(U_C_PilotJacket_open_black_RF) }; }; }; -class U_C_PilotJacket_open_black_RF : U_C_PilotJacket_black_RF { class ace_wardrobe : EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { Q(U_C_PilotJacket_black_RF) }; }; }; +class U_C_PilotJacket_black_RF: Uniform_Base { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { Q(U_C_PilotJacket_open_black_RF) }; }; }; +class U_C_PilotJacket_open_black_RF: U_C_PilotJacket_black_RF { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { Q(U_C_PilotJacket_black_RF) }; }; }; -class U_C_PilotJacket_brown_RF : U_C_PilotJacket_black_RF { class ace_wardrobe : EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { Q(U_C_PilotJacket_open_brown_RF) }; }; }; -class U_C_PilotJacket_open_brown_RF : U_C_PilotJacket_brown_RF { class ace_wardrobe : EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { Q(U_C_PilotJacket_brown_RF) }; }; }; +class U_C_PilotJacket_brown_RF: U_C_PilotJacket_black_RF { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { Q(U_C_PilotJacket_open_brown_RF) }; }; }; +class U_C_PilotJacket_open_brown_RF: U_C_PilotJacket_brown_RF { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { Q(U_C_PilotJacket_brown_RF) }; }; }; -class U_C_PilotJacket_lbrown_RF : U_C_PilotJacket_black_RF { class ace_wardrobe : EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { Q(U_C_PilotJacket_open_lbrown_RF) }; }; }; -class U_C_PilotJacket_open_lbrown_RF : U_C_PilotJacket_lbrown_RF { class ace_wardrobe : EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { Q(U_C_PilotJacket_lbrown_RF) }; }; }; +class U_C_PilotJacket_lbrown_RF: U_C_PilotJacket_black_RF { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { Q(U_C_PilotJacket_open_lbrown_RF) }; }; }; +class U_C_PilotJacket_open_lbrown_RF: U_C_PilotJacket_lbrown_RF { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { Q(U_C_PilotJacket_lbrown_RF) }; }; }; diff --git a/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp b/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp index 56b1c3049a3..99dd22b0963 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp @@ -14,56 +14,56 @@ // Base Boonie #define CAMO_BASE 01 -class CN(02,CAMO_BASE) : vn_b_headgear_base { - class ace_wardrobe : EGVAR(wardrobe,base) { +class CN(02,CAMO_BASE): vn_b_headgear_base { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; }; }; -class CN(01,CAMO_BASE) : CN(02,CAMO_BASE) { - class ace_wardrobe : EGVAR(wardrobe,base) { +class CN(01,CAMO_BASE): CN(02,CAMO_BASE) { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; }; }; -class CN(03,CAMO_BASE) : CN(02,CAMO_BASE) { - class ace_wardrobe : EGVAR(wardrobe,base) { +class CN(03,CAMO_BASE): CN(02,CAMO_BASE) { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; }; }; -class CN(04,CAMO_BASE) : CN(02,CAMO_BASE) { - class ace_wardrobe : EGVAR(wardrobe,base) { +class CN(04,CAMO_BASE): CN(02,CAMO_BASE) { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; }; }; -class CN(05,CAMO_BASE) : CN(02,CAMO_BASE) { - class ace_wardrobe : EGVAR(wardrobe,base) { +class CN(05,CAMO_BASE): CN(02,CAMO_BASE) { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)) }; }; }; #define CN_COLORS(CAMO)\ -class CN(02,CAMO) : CN(02,01) {\ - class ace_wardrobe : EGVAR(wardrobe,base) {\ +class CN(02,CAMO): CN(02,01) {\ + class ace_wardrobe: EGVAR(wardrobe,base) {\ modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(03,CAMO)), Q(CN(04,CAMO)), Q(CN(05,CAMO)) };\ };\ };\ -class CN(01,CAMO) : CN(02,CAMO) {\ - class ace_wardrobe : EGVAR(wardrobe,base) {\ +class CN(01,CAMO): CN(02,CAMO) {\ + class ace_wardrobe: EGVAR(wardrobe,base) {\ modifiableTo[] = { Q(CN(02,CAMO)), Q(CN(03,CAMO)), Q(CN(04,CAMO)), Q(CN(05,CAMO)) };\ };\ };\ -class CN(03,CAMO) : CN(02,CAMO) {\ - class ace_wardrobe : EGVAR(wardrobe,base) {\ +class CN(03,CAMO): CN(02,CAMO) {\ + class ace_wardrobe: EGVAR(wardrobe,base) {\ modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(02,CAMO)), Q(CN(04,CAMO)), Q(CN(05,CAMO)) };\ };\ };\ -class CN(04,CAMO) : CN(02,CAMO) {\ - class ace_wardrobe : EGVAR(wardrobe,base) {\ +class CN(04,CAMO): CN(02,CAMO) {\ + class ace_wardrobe: EGVAR(wardrobe,base) {\ modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(02,CAMO)), Q(CN(03,CAMO)), Q(CN(05,CAMO)) };\ };\ };\ -class CN(05,CAMO) : CN(02,CAMO) {\ - class ace_wardrobe : EGVAR(wardrobe,base) {\ +class CN(05,CAMO): CN(02,CAMO) {\ + class ace_wardrobe: EGVAR(wardrobe,base) {\ modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(02,CAMO)), Q(CN(03,CAMO)), Q(CN(04,CAMO)) };\ };\ }; @@ -78,18 +78,18 @@ CN_COLORS(05) // 06-08 anzac #define BOONIE_ANZAC(VAR)\ -class CN(06,VAR) : CN(02,01) {\ - class ace_wardrobe : EGVAR(wardrobe,base) {\ +class CN(06,VAR): CN(02,01) {\ + class ace_wardrobe: EGVAR(wardrobe,base) {\ modifiableTo[] = { Q(CN(07,VAR)), Q(CN(08,VAR)) };\ };\ };\ -class CN(07,VAR) : CN(06,VAR) {\ - class ace_wardrobe : EGVAR(wardrobe,base) {\ +class CN(07,VAR): CN(06,VAR) {\ + class ace_wardrobe: EGVAR(wardrobe,base) {\ modifiableTo[] = { Q(CN(06,VAR)), Q(CN(08,VAR)) };\ };\ };\ -class CN(08,VAR) : CN(06,VAR) {\ - class ace_wardrobe : EGVAR(wardrobe,base) {\ +class CN(08,VAR): CN(06,VAR) {\ + class ace_wardrobe: EGVAR(wardrobe,base) {\ modifiableTo[] = { Q(CN(06,VAR)), Q(CN(07,VAR)) };\ };\ }; diff --git a/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp b/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp index e18be1d6910..e87a5782932 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp @@ -7,13 +7,13 @@ #define HELMET_VARIANT(side,var1,var2)\ -class CN01(side,var1,var2) : base_class_up {\ - class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) {\ +class CN01(side,var1,var2): base_class_up {\ + class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up) {\ modifiableTo[] = { Q(CN02(side,var1,var2)) };\ };\ };\ -class CN02(side,var1,var2) : base_class_dn {\ - class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) {\ +class CN02(side,var1,var2): base_class_dn {\ + class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) {\ modifiableTo[] = { Q(CN01(side,var1,var2)) };\ };\ }; @@ -51,13 +51,13 @@ HELMET_VARIANT(b,svh4,05) HELMET_VARIANT(b,svh4,06) // Special Case zsh3 -class vn_o_helmet_zsh3_01 : vn_o_headgear_base { - class ace_wardrobe : EGVAR(wardrobe,base_H_visor_up) { +class vn_o_helmet_zsh3_01: vn_o_headgear_base { + class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { Q(vn_o_helmet_zsh3_02) }; }; }; -class vn_o_helmet_zsh3_02 : vn_o_helmet_zsh3_01 { - class ace_wardrobe : EGVAR(wardrobe,base_H_visor_down) { +class vn_o_helmet_zsh3_02: vn_o_helmet_zsh3_01 { + class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { Q(vn_o_helmet_zsh3_01) }; }; }; diff --git a/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp b/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp index a5f13456132..704f58d966b 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp @@ -5,12 +5,12 @@ class vn_b_uniform_base; // Macros #define UNIFORM_BASE_B(class1,class2)\ class class1: vn_b_uniform_base {\ - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) {\ + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) {\ modifiableTo[] = { Q(class2) };\ };\ };\ class class2: vn_b_uniform_base {\ - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) {\ + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) {\ modifiableTo[] = { Q(class1) };\ };\ }; diff --git a/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp b/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp index 9af22b9abe9..c68db25cd9f 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp @@ -2,12 +2,12 @@ class vn_o_uniform_base; #define UNIFORM_BASE_O(class1,class2)\ class class1: vn_o_uniform_base {\ - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) {\ + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) {\ modifiableTo[] = { Q(class2) };\ };\ };\ class class2: vn_o_uniform_base {\ - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) {\ + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) {\ modifiableTo[] = { Q(class1) };\ };\ }; diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp index 5e12ed5350f..5f60ac6c006 100644 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp @@ -1,8 +1,8 @@ class ItemInfo; #define S_70(className)\ -class className : vn_b_uniform_base {\ - class ItemInfo : ItemInfo {\ +class className: vn_b_uniform_base {\ + class ItemInfo: ItemInfo {\ containerClass = "Supply70";\ };\ }; diff --git a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp index 9a6f2e7ebbe..8e58be79228 100644 --- a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp @@ -5,12 +5,12 @@ class CfgWeapons // Cap (Ion) Forward and Reversed class lxWS_H_CapB_rvs_blk; class lxWS_H_CapB_rvs_blk_ION: lxWS_H_CapB_rvs_blk { - class ace_wardrobe : EGVAR(wardrobe,base) { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "H_Cap_headphones_ion_lxws" }; }; }; class H_Cap_headphones_ion_lxws: lxWS_H_CapB_rvs_blk_ION { - class ace_wardrobe : EGVAR(wardrobe,base) { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "lxWS_H_CapB_rvs_blk_ION" }; }; }; diff --git a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp index 8e8703abc71..87346bb6aa4 100644 --- a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp @@ -6,22 +6,22 @@ #define COLORGROUP(COLOR)\ class CN(01,COLOR): lxWS_H_turban_01_black {\ - class ace_wardrobe : EGVAR(wardrobe,base) {\ + class ace_wardrobe: EGVAR(wardrobe,base) {\ modifiableTo[] = { QCN(02,COLOR), QCN(03,COLOR), QCN(04,COLOR) };\ };\ };\ class CN(02,COLOR): lxWS_H_turban_02_black {\ - class ace_wardrobe : EGVAR(wardrobe,base) {\ + class ace_wardrobe: EGVAR(wardrobe,base) {\ modifiableTo[] = { QCN(01,COLOR), QCN(03,COLOR), QCN(04,COLOR) };\ };\ };\ class CN(03,COLOR): lxWS_H_turban_03_black {\ - class ace_wardrobe : EGVAR(wardrobe,base) {\ + class ace_wardrobe: EGVAR(wardrobe,base) {\ modifiableTo[] = { QCN(01,COLOR), QCN(02,COLOR), QCN(04,COLOR) };\ };\ };\ class CN(04,COLOR): lxWS_H_turban_04_black {\ - class ace_wardrobe : EGVAR(wardrobe,base) {\ + class ace_wardrobe: EGVAR(wardrobe,base) {\ modifiableTo[] = { QCN(01,COLOR), QCN(02,COLOR), QCN(03,COLOR) };\ };\ }; @@ -29,12 +29,12 @@ class CN(04,COLOR): lxWS_H_turban_04_black {\ #define COLORGROUP_SPECIAL(COLOR)\ class CN(02,COLOR): lxWS_H_turban_02_black {\ - class ace_wardrobe : EGVAR(wardrobe,base) {\ + class ace_wardrobe: EGVAR(wardrobe,base) {\ modifiableTo[] = { QCN(03,COLOR) };\ };\ };\ class CN(03,COLOR): lxWS_H_turban_03_black {\ - class ace_wardrobe : EGVAR(wardrobe,base) {\ + class ace_wardrobe: EGVAR(wardrobe,base) {\ modifiableTo[] = { QCN(02,COLOR) };\ };\ }; @@ -43,29 +43,29 @@ class CN(03,COLOR): lxWS_H_turban_03_black {\ // BASECLASS class H_Shemag_khk; -class H_turban_02_mask_black_lxws : H_Shemag_khk { - class ace_wardrobe : EGVAR(wardrobe,base) { +class H_turban_02_mask_black_lxws: H_Shemag_khk { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(03,black), QCN(04,black) }; components[] = { "lxWS_H_bmask_base" }; }; }; -class lxWS_H_turban_01_black : H_Shemag_khk { - class ace_wardrobe : EGVAR(wardrobe,base) { +class lxWS_H_turban_01_black: H_Shemag_khk { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,black), QCN(03,black), QCN(04,black), "H_turban_02_mask_black_lxws" }; }; }; -class lxWS_H_turban_02_black : lxWS_H_turban_01_black { - class ace_wardrobe : EGVAR(wardrobe,base) { +class lxWS_H_turban_02_black: lxWS_H_turban_01_black { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(03,black), QCN(04,black), "H_turban_02_mask_black_lxws" }; }; }; -class lxWS_H_turban_03_black : lxWS_H_turban_01_black { - class ace_wardrobe : EGVAR(wardrobe,base) { +class lxWS_H_turban_03_black: lxWS_H_turban_01_black { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(04,black), "H_turban_02_mask_black_lxws" }; }; }; -class lxWS_H_turban_04_black : lxWS_H_turban_01_black { - class ace_wardrobe : EGVAR(wardrobe,base) { +class lxWS_H_turban_04_black: lxWS_H_turban_01_black { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(03,black), "H_turban_02_mask_black_lxws" }; }; }; @@ -83,35 +83,35 @@ COLORGROUP_SPECIAL(green_pattern) // Super Special Manual blabla -class H_turban_02_mask_snake_lxws : H_turban_02_mask_black_lxws { - class ace_wardrobe : EGVAR(wardrobe,base) { +class H_turban_02_mask_snake_lxws: H_turban_02_mask_black_lxws { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_hex_lxws" }; components[] = {"H_bmask_snake_lxws"}; }; }; class H_turban_02_mask_hex_lxws: H_turban_02_mask_black_lxws { - class ace_wardrobe : EGVAR(wardrobe,base) { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws" }; components[] = {"lxWS_H_bmask_hex"}; }; }; class lxWS_H_turban_01_sand: lxWS_H_turban_01_black { - class ace_wardrobe : EGVAR(wardrobe,base) { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; class lxWS_H_turban_02_sand: lxWS_H_turban_02_black { - class ace_wardrobe : EGVAR(wardrobe,base) { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; class lxWS_H_turban_03_sand: lxWS_H_turban_03_black { - class ace_wardrobe : EGVAR(wardrobe,base) { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; class lxWS_H_turban_04_sand: lxWS_H_turban_04_black { - class ace_wardrobe : EGVAR(wardrobe,base) { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; \ No newline at end of file diff --git a/addons/wardrobe/Baseclass.hpp b/addons/wardrobe/Baseclass.hpp index 79afb9a2379..7c9ca77e15a 100644 --- a/addons/wardrobe/Baseclass.hpp +++ b/addons/wardrobe/Baseclass.hpp @@ -23,33 +23,33 @@ class GVAR(base) }; // Common Base Class for Uniforms with Sleeves Up/Down Variants -class GVAR(base_U_sleeves_up) : GVAR(base) { +class GVAR(base_U_sleeves_up): GVAR(base) { alternativeDisplayName = CSTRING(sleevesUp); }; -class GVAR(base_U_sleeves_down) : GVAR(base) { +class GVAR(base_U_sleeves_down): GVAR(base) { alternativeDisplayName = CSTRING(sleevesDown); }; // Common Base Class for Uniforms with Sleeves Up/Down Variants -class GVAR(base_U_gloves_on) : GVAR(base) { +class GVAR(base_U_gloves_on): GVAR(base) { alternativeDisplayName = CSTRING(glovesOn); }; -class GVAR(base_U_gloves_off) : GVAR(base) { +class GVAR(base_U_gloves_off): GVAR(base) { alternativeDisplayName = CSTRING(glovesOff); }; // Common Base Class for Uniforms who are open/closed in the front -class GVAR(base_U_jacket_open) : GVAR(base) { +class GVAR(base_U_jacket_open): GVAR(base) { alternativeDisplayName = CSTRING(jacketOpen); }; -class GVAR(base_U_jacket_closed) : GVAR(base) { +class GVAR(base_U_jacket_closed): GVAR(base) { alternativeDisplayName = CSTRING(jacketClose); }; // Common Base Class for Helmets with a Visor that can be flipped up or down -class GVAR(base_H_visor_up) : GVAR(base) { +class GVAR(base_H_visor_up): GVAR(base) { duration = 0.3; gesture ="gestureNod"; @@ -59,7 +59,7 @@ class GVAR(base_H_visor_up) : GVAR(base) { alternativeDisplayName = CSTRING(visorUp); }; -class GVAR(base_H_visor_down) : GVAR(base) { +class GVAR(base_H_visor_down): GVAR(base) { duration = 0.3; gesture ="gestureNod"; diff --git a/addons/wardrobe/compat_vanilla/Facewear.hpp b/addons/wardrobe/compat_vanilla/Facewear.hpp index 59ac668761f..ee800590004 100644 --- a/addons/wardrobe/compat_vanilla/Facewear.hpp +++ b/addons/wardrobe/compat_vanilla/Facewear.hpp @@ -6,27 +6,27 @@ class G_WirelessEarpiece_base_F; class G_EyeProtectors_base_F; // Common Components -class G_Lowprofile : None { - class ace_wardrobe : EGVAR(wardrobe,base) { +class G_Lowprofile: None { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_lowprofile" }; components[] = {"G_Lowprofile"}; }; }; -class G_Combat : None { - class ace_wardrobe : EGVAR(wardrobe,base) { +class G_Combat: None { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_combat", "G_Balaclava_TI_G_blk_F", "G_Balaclava_TI_G_tna_F" }; components[] = {"G_Combat"}; }; }; -class G_Aviator : None { - class ace_wardrobe : EGVAR(wardrobe,base) { +class G_Aviator: None { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_aviator" }; components[] = {"G_Aviator"}; }; }; -class G_Shades_Black : None { - class ace_wardrobe : EGVAR(wardrobe,base) { +class G_Shades_Black: None { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_shades" }; components[] = {"G_Shades_Black"}; }; @@ -34,75 +34,75 @@ class G_Shades_Black : None { // Balaclava, black -class G_Balaclava_blk : None { - class ace_wardrobe : EGVAR(wardrobe,base) { +class G_Balaclava_blk: None { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_lowprofile", "G_Balaclava_combat" }; components[] = {"G_Balaclava_blk"}; }; }; -class G_Balaclava_combat : G_Balaclava_blk { - class ace_wardrobe : EGVAR(wardrobe,base) { +class G_Balaclava_combat: G_Balaclava_blk { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_blk" }; components[] = {"G_Balaclava_blk","G_Combat"}; }; }; -class G_Balaclava_lowprofile : G_Balaclava_blk { - class ace_wardrobe : EGVAR(wardrobe,base) { +class G_Balaclava_lowprofile: G_Balaclava_blk { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_blk" }; components[] = {"G_Balaclava_blk","G_Lowprofile"}; }; }; // Stealth Balaclava, black -class G_Balaclava_TI_blk_F : None { - class ace_wardrobe : EGVAR(wardrobe,base) { +class G_Balaclava_TI_blk_F: None { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_G_blk_F" }; components[] = {"G_Balaclava_TI_blk_F"}; }; }; -class G_Balaclava_TI_G_blk_F : G_Balaclava_TI_blk_F { - class ace_wardrobe : EGVAR(wardrobe,base) { +class G_Balaclava_TI_G_blk_F: G_Balaclava_TI_blk_F { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_blk_F" }; components[] = {"G_Balaclava_TI_blk_F","G_Combat"}; }; }; // Stealth Balaclava, green(tanoa) -class G_Balaclava_TI_tna_F : G_Balaclava_TI_blk_F { - class ace_wardrobe : EGVAR(wardrobe,base) { +class G_Balaclava_TI_tna_F: G_Balaclava_TI_blk_F { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_G_tna_F" }; components[] = {"G_Balaclava_TI_tna_F"}; }; }; -class G_Balaclava_TI_G_tna_F : G_Balaclava_TI_tna_F { - class ace_wardrobe : EGVAR(wardrobe,base) { +class G_Balaclava_TI_G_tna_F: G_Balaclava_TI_tna_F { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_tna_F" }; components[] = {"G_Balaclava_TI_tna_F","G_Combat"}; }; }; // Bandana, Black -class G_Bandanna_blk : G_Balaclava_blk { - class ace_wardrobe : EGVAR(wardrobe,base) { +class G_Bandanna_blk: G_Balaclava_blk { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_aviator", "G_Bandanna_sport", "G_Bandanna_aviator" }; components[] = {"G_Bandanna_blk"}; }; }; -class G_Bandanna_shades : G_Bandanna_blk { - class ace_wardrobe : EGVAR(wardrobe,base) { +class G_Bandanna_shades: G_Bandanna_blk { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Shades_Black" }; components[] = {"G_Bandanna_blk", "G_Shades_Black" }; }; }; -class G_Bandanna_sport : G_Bandanna_shades { - class ace_wardrobe : EGVAR(wardrobe,base) { +class G_Bandanna_sport: G_Bandanna_shades { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Sport_Blackred" }; components[] = {"G_Bandanna_blk", "G_Sport_Blackred"}; }; }; -class G_Bandanna_aviator : G_Bandanna_shades { - class ace_wardrobe : EGVAR(wardrobe,base) { +class G_Bandanna_aviator: G_Bandanna_shades { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Aviator" }; components[] = {"G_Bandanna_blk", "G_Aviator" }; }; @@ -110,20 +110,20 @@ class G_Bandanna_aviator : G_Bandanna_shades { // Eye Protector -class G_EyeProtectors_F : G_EyeProtectors_base_F { - class ace_wardrobe : EGVAR(wardrobe,base) { +class G_EyeProtectors_F: G_EyeProtectors_base_F { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_Earpiece_F" }; components[] = {"G_EyeProtectors_F"}; }; }; -class G_EyeProtectors_Earpiece_F : G_EyeProtectors_base_F { - class ace_wardrobe : EGVAR(wardrobe,base) { +class G_EyeProtectors_Earpiece_F: G_EyeProtectors_base_F { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_F", "G_WirelessEarpiece_F" }; components[] = {"G_EyeProtectors_F", "G_WirelessEarpiece_F"}; }; }; -class G_WirelessEarpiece_F : G_WirelessEarpiece_base_F { - class ace_wardrobe : EGVAR(wardrobe,base) { +class G_WirelessEarpiece_F: G_WirelessEarpiece_base_F { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_Earpiece_F" }; components[] = {"G_WirelessEarpiece_F"}; }; diff --git a/addons/wardrobe/compat_vanilla/Uniforms.hpp b/addons/wardrobe/compat_vanilla/Uniforms.hpp index 3d6fde86aed..ed1ec598b02 100644 --- a/addons/wardrobe/compat_vanilla/Uniforms.hpp +++ b/addons/wardrobe/compat_vanilla/Uniforms.hpp @@ -4,12 +4,12 @@ class Uniform_Base; // Macros #define UNIFORM_BASE(class1,class2)\ class class1: Uniform_Base {\ - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_down) {\ + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) {\ modifiableTo[] = { Q(class2) };\ };\ };\ class class2: Uniform_Base {\ - class ace_wardrobe : EGVAR(wardrobe,base_U_sleeves_up) {\ + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) {\ modifiableTo[] = { Q(class1) };\ };\ }; diff --git a/addons/wardrobe/functions/replace/fn_replace.sqf b/addons/wardrobe/functions/replace/fn_replace.sqf index 73ecc301ec2..e0cc297d3f5 100644 --- a/addons/wardrobe/functions/replace/fn_replace.sqf +++ b/addons/wardrobe/functions/replace/fn_replace.sqf @@ -33,7 +33,7 @@ private _replaceCode = switch ( _typeNumber ) do { default { // CfgGlasses items do not have a ItemInfo Subclass and therefore, not TypeNumber. switch (true) do { - case (isClass (configFile >> "CfgGlasses" >> configName _cfg_origin)) : { FUNC(replace_facewear) }; + case (isclass (configFile >> "CfgGlasses" >> configName _cfg_origin)): { FUNC(replace_facewear) }; default { false }; }; }; From d4ec77e45d8b79ac8983d9b9bae8880326a8adf7 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 03:25:21 +0100 Subject: [PATCH 064/305] tab -> spaces --- .../compat_sog_wardrobe_uniform_fix/config.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp index 36c24cde11a..7e28c9dc177 100644 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp @@ -1,25 +1,25 @@ #include "script_component.hpp" class CfgPatches { - class SUBADDON { - name = COMPONENT_NAME; - author = ECSTRING(common,ACETeam); + class SUBADDON { + name = COMPONENT_NAME; + author = ECSTRING(common,ACETeam); authors[] = {"OverlordZorn [CVO]"}; url = ECSTRING(main,URL); - - VERSION_CONFIG; + + VERSION_CONFIG; addonRootClass = QUOTE(ADDON); requiredAddons[] = { "ace_wardrobe", "vn_data_f" }; - skipWhenMissingDependencies = 1; + skipWhenMissingDependencies = 1; requiredVersion = REQUIRED_VERSION; units[] = {}; weapons[] = {}; - }; + }; }; #include "Uniforms.hpp" \ No newline at end of file From 1050160a3223807ae76f17dc832afc67a22c0ade Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 03:30:12 +0100 Subject: [PATCH 065/305] fix formatting --- .../compat_gm_wardrobe/CfgWardrobe.hpp | 3 +- .../compat_sog_wardrobe/CfgWardrobe.hpp | 3 +- .../Uniforms.hpp | 3 +- .../compat_ws_wardrobe/CfgWardrobe.hpp | 3 +- addons/wardrobe/Baseclass.hpp | 3 +- addons/wardrobe/CfgFunctions.hpp | 30 +++++++------------ addons/wardrobe/CfgSounds.hpp | 8 ++--- addons/wardrobe/compat_vanilla/Wardrobe.hpp | 6 ++-- 8 files changed, 20 insertions(+), 39 deletions(-) diff --git a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp index 8a4bcf09b43..f8bd616392a 100644 --- a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp @@ -10,8 +10,7 @@ class EGVAR(wardrobe,base_U_sleeves_down); class EGVAR(wardrobe,base_U_gloves_on); class EGVAR(wardrobe,base_U_gloves_off); -class CfgWeapons -{ +class CfgWeapons { #include "Helmets.hpp" #include "Uniforms.hpp" }; diff --git a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp index 79049a426bd..1516da1e51a 100644 --- a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp @@ -6,8 +6,7 @@ class EGVAR(wardrobe,base_H_visor_down); class EGVAR(wardrobe,base_U_sleeves_up); class EGVAR(wardrobe,base_U_sleeves_down); -class CfgWeapons -{ +class CfgWeapons { // Base Classes class vn_b_headgear_base; class vn_o_headgear_base; diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp index 5f60ac6c006..82d18c07c20 100644 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp @@ -7,8 +7,7 @@ class className: vn_b_uniform_base {\ };\ }; -class CfgWeapons -{ +class CfgWeapons { class vn_b_uniform_base; S_70(vn_b_uniform_macv_04_01) diff --git a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp index 8e58be79228..76571f73a82 100644 --- a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp @@ -1,7 +1,6 @@ class EGVAR(wardrobe,base); -class CfgWeapons -{ +class CfgWeapons { // Cap (Ion) Forward and Reversed class lxWS_H_CapB_rvs_blk; class lxWS_H_CapB_rvs_blk_ION: lxWS_H_CapB_rvs_blk { diff --git a/addons/wardrobe/Baseclass.hpp b/addons/wardrobe/Baseclass.hpp index 7c9ca77e15a..f09c2dbe844 100644 --- a/addons/wardrobe/Baseclass.hpp +++ b/addons/wardrobe/Baseclass.hpp @@ -1,7 +1,6 @@ #define CN_SOUND(base,dur) Q(TRIPLES(ADDON,base,dur)) -class GVAR(base) -{ +class GVAR(base) { modifiableTo[] = {""}; // ## WIP ## // describes the components of the current item. diff --git a/addons/wardrobe/CfgFunctions.hpp b/addons/wardrobe/CfgFunctions.hpp index 852233ccb10..041980f8351 100644 --- a/addons/wardrobe/CfgFunctions.hpp +++ b/addons/wardrobe/CfgFunctions.hpp @@ -2,8 +2,7 @@ class CfgFunctions { class ADDON { - class COMPONENT - { + class COMPONENT { file = PATH_TO_FUNC; class postInit { postInit = 1; }; @@ -13,16 +12,14 @@ class CfgFunctions class canModifyTo {}; }; - class ace_intel - { + class ace_intel { file = PATH_TO_FUNC_SUB(ace_intel); class getMagIDs {}; class getIndexFromMagID {}; class setIndexForMagID {}; }; - class getItems - { + class getItems { file = PATH_TO_FUNC_SUB(getItems); class getItems_all {}; class getItems_modifiable_all {}; @@ -31,8 +28,7 @@ class CfgFunctions }; - class replace - { + class replace { file = PATH_TO_FUNC_SUB(replace); class replace {}; @@ -41,8 +37,7 @@ class CfgFunctions class replace_uniform {}; }; - class action - { + class action { file = PATH_TO_FUNC_SUB(action); class addActions {}; @@ -52,8 +47,7 @@ class CfgFunctions class getAction_Icon {}; }; - class cache - { + class cache { file = PATH_TO_FUNC_SUB(cache); class cache_db {}; @@ -64,29 +58,25 @@ class CfgFunctions class clearOnClosed_Inventory {}; }; - class config - { + class config { file = PATH_TO_FUNC_SUB(config); class getCfgDataRandom {}; }; - class debug - { + class debug { file = PATH_TO_FUNC_SUB(debug); class getAllWardrobeItems {}; class compare_container_maxLoad {}; }; - class effects - { + class effects { file = PATH_TO_FUNC_SUB(effects); class say3d {}; }; - class contextMenu - { + class contextMenu { file = PATH_TO_FUNC_SUB(contextMenu); class enable_contextMenu {}; diff --git a/addons/wardrobe/CfgSounds.hpp b/addons/wardrobe/CfgSounds.hpp index 2c5ddd4f0f0..d0e12cbcae2 100644 --- a/addons/wardrobe/CfgSounds.hpp +++ b/addons/wardrobe/CfgSounds.hpp @@ -1,7 +1,6 @@ // Duration in this case is 10th of secounds. so 10 -> 1 sec, 15 -> 1.5sec, ... #define ENTRY(base,dur)\ -class GVAR(DOUBLES(base,dur))\ -{\ +class GVAR(DOUBLES(base,dur)) {\ name = Q(base dur);\ sound[] = { QPATHTOF(data\DOUBLES(base,dur)##.ogg), 1, 1, 100 };\ titles[] = { 0, "" };\ @@ -9,9 +8,8 @@ class GVAR(DOUBLES(base,dur))\ titlesStructured = 0;\ }; -class CfgSounds -{ - sounds[] = {}; +class CfgSounds { + sounds[] = {}; ENTRY(fabric,06) ENTRY(fabric,07) ENTRY(fabric,16) diff --git a/addons/wardrobe/compat_vanilla/Wardrobe.hpp b/addons/wardrobe/compat_vanilla/Wardrobe.hpp index cce5ac273f3..b1740e5a47d 100644 --- a/addons/wardrobe/compat_vanilla/Wardrobe.hpp +++ b/addons/wardrobe/compat_vanilla/Wardrobe.hpp @@ -1,10 +1,8 @@ -class CfgWeapons -{ +class CfgWeapons { #include "Uniforms.hpp" }; -class CfgGlasses -{ +class CfgGlasses { #include "Facewear.hpp" }; \ No newline at end of file From 2e5b2af923fb4dcf2c3bd3500b8f50ecc244ba2b Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 03:32:18 +0100 Subject: [PATCH 066/305] formatting --- addons/wardrobe/stringtable.xml | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml index c7d598c0c33..c13714e91e8 100644 --- a/addons/wardrobe/stringtable.xml +++ b/addons/wardrobe/stringtable.xml @@ -1,16 +1,14 @@ - - + + - ACE Wardrobe ACE Wardrobe ACE Gaderobe - Enable ACE Interaction Enable ACE Interaction Aktivieren ACE Interaction @@ -18,7 +16,6 @@ When Enabled, will let the player use the Wardrobe related Ace Interactions. - Enable CBA Context Menu Enable Aktiviere CBA Context Menu @@ -28,40 +25,31 @@ - Wardrobe Wardrobe Gaderobe - Take gloves off Take gloves off - Wear gloves Wear gloves - Close Jacket Close Jacket - Open Jacket Open Jacket - Roll sleeves down Roll sleeves down - Roll sleeves up Roll sleeves up - Visor down Visor down - Visor up Visor up From 970a1e2726d4d981fe4aa98dd97cfcb3a1d43711 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 03:34:00 +0100 Subject: [PATCH 067/305] fix ID attribute --- addons/wardrobe/stringtable.xml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml index c13714e91e8..12b8f41893f 100644 --- a/addons/wardrobe/stringtable.xml +++ b/addons/wardrobe/stringtable.xml @@ -2,54 +2,54 @@ - + ACE Wardrobe ACE Gaderobe - + Enable ACE Interaction Aktivieren ACE Interaction - + When Enabled, will let the player use the Wardrobe related Ace Interactions. - + Enable Aktiviere CBA Context Menu - + When Enabled, will let the player use the Wardrobe related CBA Context Menu Options.<br/>Can be enabled at any time, but requires restart to disable. - + Wardrobe Gaderobe - + Take gloves off - + Wear gloves - + Close Jacket - + Open Jacket - + Roll sleeves down - + Roll sleeves up - + Visor down - + Visor up From 092f28e904a0c258c0d37d3ad47b8755b9b52ed4 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 11:57:00 +0100 Subject: [PATCH 068/305] Q( -> QUOTE( --- .../compat_gm/compat_gm_wardrobe/Uniforms.hpp | 68 +++++++++---------- .../compat_rf/compat_rf_wardrobe/Helmets.hpp | 4 +- .../compat_rf/compat_rf_wardrobe/Uniforms.hpp | 16 ++--- .../compat_sog_wardrobe/Booniehats.hpp | 27 ++++---- .../compat_sog_wardrobe/Pilothelmets.hpp | 8 +-- .../compat_sog_wardrobe/Uniforms_B.hpp | 4 +- .../compat_sog_wardrobe/Uniforms_O.hpp | 4 +- .../compat_ws/compat_ws_wardrobe/Turbans.hpp | 2 +- addons/wardrobe/Baseclass.hpp | 2 +- addons/wardrobe/CfgSounds.hpp | 2 +- addons/wardrobe/CfgVehicles.hpp | 4 +- addons/wardrobe/compat_vanilla/Uniforms.hpp | 4 +- .../debug/fn_getAllWardrobeItems.sqf | 4 +- addons/wardrobe/functions/fn_isModifiable.sqf | 2 +- .../wardrobe/functions/replace/fn_replace.sqf | 10 +-- addons/wardrobe/script_macros_wardrobe.hpp | 9 ++- 16 files changed, 85 insertions(+), 85 deletions(-) diff --git a/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp b/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp index 31bd6db4255..c8857364a5e 100644 --- a/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp @@ -7,23 +7,23 @@ class gm_ge_bgs_uniform_special_rolled_80_base; class gm_ge_bgs_uniform_special_80_grn: gm_ge_bgs_uniform_special_80_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { Q(gm_ge_bgs_uniform_special_rolled_80_grn) }; + modifiableTo[] = { "gm_ge_bgs_uniform_special_rolled_80_grn" }; }; }; class gm_ge_bgs_uniform_special_rolled_80_grn: gm_ge_bgs_uniform_special_rolled_80_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { Q(gm_ge_bgs_uniform_special_80_grn) }; + modifiableTo[] = { "gm_ge_bgs_uniform_special_80_grn" }; }; }; class gm_ge_bgs_uniform_special_80_blk: gm_ge_bgs_uniform_special_80_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { Q(gm_ge_bgs_uniform_special_rolled_80_blk) }; + modifiableTo[] = { "gm_ge_bgs_uniform_special_rolled_80_blk" }; }; }; class gm_ge_bgs_uniform_special_rolled_80_blk: gm_ge_bgs_uniform_special_rolled_80_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { Q(gm_ge_bgs_uniform_special_80_blk) }; + modifiableTo[] = { "gm_ge_bgs_uniform_special_80_blk" }; }; }; @@ -33,34 +33,34 @@ class gm_ge_army_uniform_pilot_rolled_base; class gm_ge_army_uniform_pilot_sar: gm_ge_army_uniform_pilot_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { Q(gm_ge_army_uniform_pilot_rolled_sar) }; + modifiableTo[] = { "gm_ge_army_uniform_pilot_rolled_sar" }; }; }; class gm_ge_army_uniform_pilot_rolled_sar: gm_ge_army_uniform_pilot_rolled_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { Q(gm_ge_army_uniform_pilot_sar) }; + modifiableTo[] = { "gm_ge_army_uniform_pilot_sar" }; }; }; class gm_ge_army_uniform_pilot_oli: gm_ge_army_uniform_pilot_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { Q(gm_ge_army_uniform_pilot_oli) }; + modifiableTo[] = { "gm_ge_army_uniform_pilot_oli" }; }; }; class gm_ge_army_uniform_pilot_rolled_oli: gm_ge_army_uniform_pilot_rolled_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { Q(gm_ge_army_uniform_pilot_rolled_oli) }; + modifiableTo[] = { "gm_ge_army_uniform_pilot_rolled_oli" }; }; }; class gm_ge_pol_uniform_pilot_grn: gm_ge_army_uniform_pilot_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { Q(gm_ge_pol_uniform_pilot_rolled_grn) }; + modifiableTo[] = { "gm_ge_pol_uniform_pilot_rolled_grn" }; }; }; class gm_ge_pol_uniform_pilot_rolled_grn: gm_ge_army_uniform_pilot_rolled_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { Q(gm_ge_pol_uniform_pilot_grn) }; + modifiableTo[] = { "gm_ge_pol_uniform_pilot_grn" }; }; }; @@ -69,34 +69,34 @@ class gm_ge_uniform_pilot_commando_rolled_base; class gm_ge_uniform_pilot_commando_oli: gm_ge_uniform_pilot_commando_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_rolled_oli) }; + modifiableTo[] = { "gm_ge_uniform_pilot_commando_rolled_oli" }; }; }; class gm_ge_uniform_pilot_commando_rolled_oli: gm_ge_uniform_pilot_commando_rolled_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_oli) }; + modifiableTo[] = { "gm_ge_uniform_pilot_commando_oli" }; }; }; class gm_ge_uniform_pilot_commando_gry: gm_ge_uniform_pilot_commando_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_rolled_gry) }; + modifiableTo[] = { "gm_ge_uniform_pilot_commando_rolled_gry" }; }; }; class gm_ge_uniform_pilot_commando_rolled_gry: gm_ge_uniform_pilot_commando_rolled_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_gry) }; + modifiableTo[] = { "gm_ge_uniform_pilot_commando_gry" }; }; }; class gm_ge_uniform_pilot_commando_blk: gm_ge_uniform_pilot_commando_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_rolled_blk) }; + modifiableTo[] = { "gm_ge_uniform_pilot_commando_rolled_blk" }; }; }; class gm_ge_uniform_pilot_commando_rolled_blk: gm_ge_uniform_pilot_commando_rolled_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { Q(gm_ge_uniform_pilot_commando_blk) }; + modifiableTo[] = { "gm_ge_uniform_pilot_commando_blk" }; }; }; @@ -104,23 +104,23 @@ class gm_pl_uniform_soldier_80_base; class gm_pl_army_uniform_soldier_80_frog: gm_pl_uniform_soldier_80_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { Q(gm_pl_army_uniform_soldier_rolled_80_frog) }; + modifiableTo[] = { "gm_pl_army_uniform_soldier_rolled_80_frog" }; }; }; class gm_pl_army_uniform_soldier_rolled_80_frog: gm_pl_uniform_soldier_80_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { Q(gm_pl_army_uniform_soldier_80_frog) }; + modifiableTo[] = { "gm_pl_army_uniform_soldier_80_frog" }; }; }; class gm_pl_army_uniform_soldier_80_moro: gm_pl_uniform_soldier_80_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { Q(gm_pl_army_uniform_soldier_rolled_80_moro) }; + modifiableTo[] = { "gm_pl_army_uniform_soldier_rolled_80_moro" }; }; }; class gm_pl_army_uniform_soldier_rolled_80_moro: gm_pl_uniform_soldier_80_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { Q(gm_pl_army_uniform_soldier_80_moro) }; + modifiableTo[] = { "gm_pl_army_uniform_soldier_80_moro" }; }; }; @@ -129,23 +129,23 @@ class gm_ge_uniform_soldier_90_base; class gm_ge_uniform_soldier_90_trp: gm_ge_uniform_soldier_90_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { Q(gm_ge_uniform_soldier_rolled_90_trp) }; + modifiableTo[] = { "gm_ge_uniform_soldier_rolled_90_trp" }; }; }; class gm_ge_uniform_soldier_rolled_90_trp: gm_ge_uniform_soldier_90_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { Q(gm_ge_uniform_soldier_90_trp) }; + modifiableTo[] = { "gm_ge_uniform_soldier_90_trp" }; }; }; class gm_ge_uniform_soldier_90_flk: gm_ge_uniform_soldier_90_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { Q(gm_ge_uniform_soldier_rolled_90_flk) }; + modifiableTo[] = { "gm_ge_uniform_soldier_rolled_90_flk" }; }; }; class gm_ge_uniform_soldier_rolled_90_flk: gm_ge_uniform_soldier_90_base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { Q(gm_ge_uniform_soldier_90_flk) }; + modifiableTo[] = { "gm_ge_uniform_soldier_90_flk" }; }; }; @@ -157,24 +157,24 @@ class gm_ge_uniform_soldier_rolled_90_flk: gm_ge_uniform_soldier_90_base { class gm_gc_uniform_soldier_80_base; class gm_gc_army_uniform_soldier_gloves_80_str: gm_gc_uniform_soldier_80_base { class ace_wardrobe: EGVAR(wardrobe,base_U_gloves_on) { - modifiableTo[] = { Q(gm_gc_army_uniform_soldier_80_str) }; + modifiableTo[] = { "gm_gc_army_uniform_soldier_80_str" }; }; }; class gm_gc_army_uniform_soldier_80_str: gm_gc_uniform_soldier_80_base { class ace_wardrobe: EGVAR(wardrobe,base_U_gloves_off) { - modifiableTo[] = { Q(gm_gc_army_uniform_soldier_gloves_80_str) }; + modifiableTo[] = { "gm_gc_army_uniform_soldier_gloves_80_str" }; }; }; class gm_ge_uniform_soldier_80_base; class gm_ge_army_uniform_soldier_gloves_80_ols: gm_ge_uniform_soldier_80_base { class ace_wardrobe: EGVAR(wardrobe,base_U_gloves_on) { - modifiableTo[] = { Q(gm_ge_army_uniform_soldier_80_ols) }; + modifiableTo[] = { "gm_ge_army_uniform_soldier_80_ols" }; }; }; class gm_ge_army_uniform_soldier_80_ols: gm_ge_uniform_soldier_80_base { class ace_wardrobe: EGVAR(wardrobe,base_U_gloves_off) { - modifiableTo[] = { Q(gm_ge_army_uniform_soldier_gloves_80_ols) }; + modifiableTo[] = { "gm_ge_army_uniform_soldier_gloves_80_ols" }; }; }; @@ -185,33 +185,33 @@ class gm_ge_army_uniform_soldier_bdu_rolled_80_wdl; class gm_xx_uniform_soldier_bdu_80_wdl: gm_ge_army_uniform_soldier_bdu_80_wdl { class ace_wardrobe: EGVAR(wardrobe,base_U_gloves_on) { - modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_rolled_80_wdl), Q(gm_xx_uniform_soldier_bdu_nogloves_80_wdl) }; + modifiableTo[] = { "gm_xx_uniform_soldier_bdu_rolled_80_wdl", "gm_xx_uniform_soldier_bdu_nogloves_80_wdl" }; }; }; class gm_xx_uniform_soldier_bdu_rolled_80_wdl: gm_ge_army_uniform_soldier_bdu_rolled_80_wdl { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_wdl), Q(gm_xx_uniform_soldier_bdu_nogloves_80_wdl) }; + modifiableTo[] = { "gm_xx_uniform_soldier_bdu_80_wdl", "gm_xx_uniform_soldier_bdu_nogloves_80_wdl" }; }; }; class gm_xx_uniform_soldier_bdu_nogloves_80_wdl: gm_ge_army_uniform_soldier_bdu_80_wdl { class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_wdl), Q(gm_xx_uniform_soldier_bdu_rolled_80_wdl) }; + modifiableTo[] = { "gm_xx_uniform_soldier_bdu_80_wdl", "gm_xx_uniform_soldier_bdu_rolled_80_wdl" }; }; }; class gm_xx_uniform_soldier_bdu_80_oli: gm_ge_army_uniform_soldier_bdu_80_wdl { class ace_wardrobe: EGVAR(wardrobe,base_U_gloves_on) { - modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_rolled_80_oli), Q(gm_xx_uniform_soldier_bdu_nogloves_80_oli) }; + modifiableTo[] = { "gm_xx_uniform_soldier_bdu_rolled_80_oli", "gm_xx_uniform_soldier_bdu_nogloves_80_oli" }; }; }; class gm_xx_uniform_soldier_bdu_rolled_80_oli: gm_ge_army_uniform_soldier_bdu_rolled_80_wdl { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_oli), Q(gm_xx_uniform_soldier_bdu_nogloves_80_oli) }; + modifiableTo[] = { "gm_xx_uniform_soldier_bdu_80_oli", "gm_xx_uniform_soldier_bdu_nogloves_80_oli" }; }; }; class gm_xx_uniform_soldier_bdu_nogloves_80_oli: gm_ge_army_uniform_soldier_bdu_80_wdl { class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { Q(gm_xx_uniform_soldier_bdu_80_oli), Q(gm_xx_uniform_soldier_bdu_rolled_80_oli) }; + modifiableTo[] = { "gm_xx_uniform_soldier_bdu_80_oli", "gm_xx_uniform_soldier_bdu_rolled_80_oli" }; }; }; diff --git a/addons/compat_rf/compat_rf_wardrobe/Helmets.hpp b/addons/compat_rf/compat_rf_wardrobe/Helmets.hpp index 06411e8dd1c..9691347d687 100644 --- a/addons/compat_rf/compat_rf_wardrobe/Helmets.hpp +++ b/addons/compat_rf/compat_rf_wardrobe/Helmets.hpp @@ -6,8 +6,8 @@ #define HELMET_VARIANT(color)\ -class CN(color): H_HelmetHeavy_Black_RF { class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { Q(CN_VU(color)) }; }; };\ -class CN_VU(color): H_HelmetHeavy_VisorUp_Black_RF { class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up){ modifiableTo[] = { Q(CN(color)) }; }; };\ +class CN(color): H_HelmetHeavy_Black_RF { class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { QUOTE(CN_VU(color)) }; }; };\ +class CN_VU(color): H_HelmetHeavy_VisorUp_Black_RF { class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up){ modifiableTo[] = { QUOTE(CN(color)) }; }; };\ // Base Classes diff --git a/addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp b/addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp index 0692cd72fb0..dae2da7e4e8 100644 --- a/addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp +++ b/addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp @@ -4,8 +4,8 @@ class Uniform_Base; // Macros #define UNIFORM_BASE(class1,class2)\ -class class1: Uniform_Base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { Q(class2) }; }; };\ -class class2: Uniform_Base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { Q(class1) }; }; }; +class class1: Uniform_Base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { QUOTE(class2) }; }; };\ +class class2: Uniform_Base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { QUOTE(class1) }; }; }; // Simple Variants UNIFORM_BASE(U_C_FirefighterFatigues_RF,U_C_FirefighterFatigues_RolledUp_RF) @@ -13,11 +13,11 @@ UNIFORM_BASE(U_BG_Guerrilla_6_1,U_BG_Guerrilla_RF) // Pilot Jackets -class U_C_PilotJacket_black_RF: Uniform_Base { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { Q(U_C_PilotJacket_open_black_RF) }; }; }; -class U_C_PilotJacket_open_black_RF: U_C_PilotJacket_black_RF { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { Q(U_C_PilotJacket_black_RF) }; }; }; +class U_C_PilotJacket_black_RF: Uniform_Base { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { "U_C_PilotJacket_open_black_RF" }; }; }; +class U_C_PilotJacket_open_black_RF: U_C_PilotJacket_black_RF { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { "U_C_PilotJacket_black_RF" }; }; }; -class U_C_PilotJacket_brown_RF: U_C_PilotJacket_black_RF { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { Q(U_C_PilotJacket_open_brown_RF) }; }; }; -class U_C_PilotJacket_open_brown_RF: U_C_PilotJacket_brown_RF { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { Q(U_C_PilotJacket_brown_RF) }; }; }; +class U_C_PilotJacket_brown_RF: U_C_PilotJacket_black_RF { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { "U_C_PilotJacket_open_brown_RF" }; }; }; +class U_C_PilotJacket_open_brown_RF: U_C_PilotJacket_brown_RF { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { "U_C_PilotJacket_brown_RF" }; }; }; -class U_C_PilotJacket_lbrown_RF: U_C_PilotJacket_black_RF { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { Q(U_C_PilotJacket_open_lbrown_RF) }; }; }; -class U_C_PilotJacket_open_lbrown_RF: U_C_PilotJacket_lbrown_RF { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { Q(U_C_PilotJacket_lbrown_RF) }; }; }; +class U_C_PilotJacket_lbrown_RF: U_C_PilotJacket_black_RF { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { "U_C_PilotJacket_open_lbrown_RF" }; }; }; +class U_C_PilotJacket_open_lbrown_RF: U_C_PilotJacket_lbrown_RF { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { "U_C_PilotJacket_lbrown_RF" }; }; }; diff --git a/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp b/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp index 99dd22b0963..4bffac40e10 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp @@ -10,33 +10,34 @@ // Macros #define CN(variation,color) vn_b_boonie_##variation##_##color +#define QCN(variation,color) QUOTE(CN(variation,color)) // Base Boonie #define CAMO_BASE 01 class CN(02,CAMO_BASE): vn_b_headgear_base { class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; + modifiableTo[] = { QCN(01,CAMO_BASE), QCN(03,CAMO_BASE), QCN(04,CAMO_BASE), QCN(05,CAMO_BASE) }; }; }; class CN(01,CAMO_BASE): CN(02,CAMO_BASE) { class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; + modifiableTo[] = { QCN(02,CAMO_BASE), QCN(03,CAMO_BASE), QCN(04,CAMO_BASE), QCN(05,CAMO_BASE) }; }; }; class CN(03,CAMO_BASE): CN(02,CAMO_BASE) { class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(04,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; + modifiableTo[] = { QCN(01,CAMO_BASE), QCN(02,CAMO_BASE), QCN(04,CAMO_BASE), QCN(05,CAMO_BASE) }; }; }; class CN(04,CAMO_BASE): CN(02,CAMO_BASE) { class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(05,CAMO_BASE)) }; + modifiableTo[] = { QCN(01,CAMO_BASE), QCN(02,CAMO_BASE), QCN(03,CAMO_BASE), QCN(05,CAMO_BASE) }; }; }; class CN(05,CAMO_BASE): CN(02,CAMO_BASE) { class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { Q(CN(01,CAMO_BASE)), Q(CN(02,CAMO_BASE)), Q(CN(03,CAMO_BASE)), Q(CN(04,CAMO_BASE)) }; + modifiableTo[] = { QCN(01,CAMO_BASE), QCN(02,CAMO_BASE), QCN(03,CAMO_BASE), QCN(04,CAMO_BASE) }; }; }; @@ -44,27 +45,27 @@ class CN(05,CAMO_BASE): CN(02,CAMO_BASE) { #define CN_COLORS(CAMO)\ class CN(02,CAMO): CN(02,01) {\ class ace_wardrobe: EGVAR(wardrobe,base) {\ - modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(03,CAMO)), Q(CN(04,CAMO)), Q(CN(05,CAMO)) };\ + modifiableTo[] = { QCN(01,CAMO), QCN(03,CAMO), QCN(04,CAMO), QCN(05,CAMO) };\ };\ };\ class CN(01,CAMO): CN(02,CAMO) {\ class ace_wardrobe: EGVAR(wardrobe,base) {\ - modifiableTo[] = { Q(CN(02,CAMO)), Q(CN(03,CAMO)), Q(CN(04,CAMO)), Q(CN(05,CAMO)) };\ + modifiableTo[] = { QCN(02,CAMO), QCN(03,CAMO), QCN(04,CAMO), QCN(05,CAMO) };\ };\ };\ class CN(03,CAMO): CN(02,CAMO) {\ class ace_wardrobe: EGVAR(wardrobe,base) {\ - modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(02,CAMO)), Q(CN(04,CAMO)), Q(CN(05,CAMO)) };\ + modifiableTo[] = { QCN(01,CAMO), QCN(02,CAMO), QCN(04,CAMO), QCN(05,CAMO) };\ };\ };\ class CN(04,CAMO): CN(02,CAMO) {\ class ace_wardrobe: EGVAR(wardrobe,base) {\ - modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(02,CAMO)), Q(CN(03,CAMO)), Q(CN(05,CAMO)) };\ + modifiableTo[] = { QCN(01,CAMO), QCN(02,CAMO), QCN(03,CAMO), QCN(05,CAMO) };\ };\ };\ class CN(05,CAMO): CN(02,CAMO) {\ class ace_wardrobe: EGVAR(wardrobe,base) {\ - modifiableTo[] = { Q(CN(01,CAMO)), Q(CN(02,CAMO)), Q(CN(03,CAMO)), Q(CN(04,CAMO)) };\ + modifiableTo[] = { QCN(01,CAMO), QCN(02,CAMO), QCN(03,CAMO), QCN(04,CAMO) };\ };\ }; @@ -80,17 +81,17 @@ CN_COLORS(05) #define BOONIE_ANZAC(VAR)\ class CN(06,VAR): CN(02,01) {\ class ace_wardrobe: EGVAR(wardrobe,base) {\ - modifiableTo[] = { Q(CN(07,VAR)), Q(CN(08,VAR)) };\ + modifiableTo[] = { QCN(07,VAR), QCN(08,VAR) };\ };\ };\ class CN(07,VAR): CN(06,VAR) {\ class ace_wardrobe: EGVAR(wardrobe,base) {\ - modifiableTo[] = { Q(CN(06,VAR)), Q(CN(08,VAR)) };\ + modifiableTo[] = { QCN(06,VAR), QCN(08,VAR) };\ };\ };\ class CN(08,VAR): CN(06,VAR) {\ class ace_wardrobe: EGVAR(wardrobe,base) {\ - modifiableTo[] = { Q(CN(06,VAR)), Q(CN(07,VAR)) };\ + modifiableTo[] = { QCN(06,VAR), QCN(07,VAR) };\ };\ }; diff --git a/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp b/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp index e87a5782932..d31d288e4b7 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp @@ -9,12 +9,12 @@ #define HELMET_VARIANT(side,var1,var2)\ class CN01(side,var1,var2): base_class_up {\ class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up) {\ - modifiableTo[] = { Q(CN02(side,var1,var2)) };\ + modifiableTo[] = { QUOTE(CN02(side,var1,var2)) };\ };\ };\ class CN02(side,var1,var2): base_class_dn {\ class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) {\ - modifiableTo[] = { Q(CN01(side,var1,var2)) };\ + modifiableTo[] = { QUOTE(CN01(side,var1,var2)) };\ };\ }; @@ -53,11 +53,11 @@ HELMET_VARIANT(b,svh4,06) // Special Case zsh3 class vn_o_helmet_zsh3_01: vn_o_headgear_base { class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up) { - modifiableTo[] = { Q(vn_o_helmet_zsh3_02) }; + modifiableTo[] = { "vn_o_helmet_zsh3_02" }; }; }; class vn_o_helmet_zsh3_02: vn_o_helmet_zsh3_01 { class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) { - modifiableTo[] = { Q(vn_o_helmet_zsh3_01) }; + modifiableTo[] = { "vn_o_helmet_zsh3_01" }; }; }; diff --git a/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp b/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp index 704f58d966b..72e41a9b087 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp @@ -6,12 +6,12 @@ class vn_b_uniform_base; #define UNIFORM_BASE_B(class1,class2)\ class class1: vn_b_uniform_base {\ class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) {\ - modifiableTo[] = { Q(class2) };\ + modifiableTo[] = { QUOTE(class2) };\ };\ };\ class class2: vn_b_uniform_base {\ class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) {\ - modifiableTo[] = { Q(class1) };\ + modifiableTo[] = { QUOTE(class1) };\ };\ }; diff --git a/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp b/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp index c68db25cd9f..b411ab0c7f5 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp @@ -3,12 +3,12 @@ class vn_o_uniform_base; #define UNIFORM_BASE_O(class1,class2)\ class class1: vn_o_uniform_base {\ class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) {\ - modifiableTo[] = { Q(class2) };\ + modifiableTo[] = { QUOTE(class2) };\ };\ };\ class class2: vn_o_uniform_base {\ class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) {\ - modifiableTo[] = { Q(class1) };\ + modifiableTo[] = { QUOTE(class1) };\ };\ }; diff --git a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp index 87346bb6aa4..ff8b091e736 100644 --- a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp @@ -2,7 +2,7 @@ // MACROS #define CN(version,color) lxWS_H_turban_##version##_##color -#define QCN(version,color) Q(CN(version,color)) +#define QCN(version,color) QUOTE(CN(version,color)) #define COLORGROUP(COLOR)\ class CN(01,COLOR): lxWS_H_turban_01_black {\ diff --git a/addons/wardrobe/Baseclass.hpp b/addons/wardrobe/Baseclass.hpp index f09c2dbe844..c2d070e179d 100644 --- a/addons/wardrobe/Baseclass.hpp +++ b/addons/wardrobe/Baseclass.hpp @@ -1,4 +1,4 @@ -#define CN_SOUND(base,dur) Q(TRIPLES(ADDON,base,dur)) +#define CN_SOUND(base,dur) QUOTE(TRIPLES(ADDON,base,dur)) class GVAR(base) { modifiableTo[] = {""}; diff --git a/addons/wardrobe/CfgSounds.hpp b/addons/wardrobe/CfgSounds.hpp index d0e12cbcae2..72a856caed6 100644 --- a/addons/wardrobe/CfgSounds.hpp +++ b/addons/wardrobe/CfgSounds.hpp @@ -1,7 +1,7 @@ // Duration in this case is 10th of secounds. so 10 -> 1 sec, 15 -> 1.5sec, ... #define ENTRY(base,dur)\ class GVAR(DOUBLES(base,dur)) {\ - name = Q(base dur);\ + name = QUOTE(base dur);\ sound[] = { QPATHTOF(data\DOUBLES(base,dur)##.ogg), 1, 1, 100 };\ titles[] = { 0, "" };\ forceTitles = 0;\ diff --git a/addons/wardrobe/CfgVehicles.hpp b/addons/wardrobe/CfgVehicles.hpp index 2035d60bf50..c24fa239e63 100644 --- a/addons/wardrobe/CfgVehicles.hpp +++ b/addons/wardrobe/CfgVehicles.hpp @@ -6,9 +6,9 @@ class CfgVehicles { class ADDON { displayName = CSTRING(actionTitle); // Text shown to user icon = QPATHTOF(data\wardrobe_logo.paa); - condition = Q([_player] call FUNC(addActions_condition)); + condition = QUOTE([_player] call FUNC(addActions_condition)); statement = ""; - insertChildren = Q([_player] call FUNC(addActions)); + insertChildren = QUOTE([_player] call FUNC(addActions)); exceptions[] = {"isNotSwimming","isNotSitting"}; }; }; diff --git a/addons/wardrobe/compat_vanilla/Uniforms.hpp b/addons/wardrobe/compat_vanilla/Uniforms.hpp index ed1ec598b02..511fba3b967 100644 --- a/addons/wardrobe/compat_vanilla/Uniforms.hpp +++ b/addons/wardrobe/compat_vanilla/Uniforms.hpp @@ -5,12 +5,12 @@ class Uniform_Base; #define UNIFORM_BASE(class1,class2)\ class class1: Uniform_Base {\ class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) {\ - modifiableTo[] = { Q(class2) };\ + modifiableTo[] = { QUOTE(class2) };\ };\ };\ class class2: Uniform_Base {\ class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) {\ - modifiableTo[] = { Q(class1) };\ + modifiableTo[] = { QUOTE(class1) };\ };\ }; diff --git a/addons/wardrobe/functions/debug/fn_getAllWardrobeItems.sqf b/addons/wardrobe/functions/debug/fn_getAllWardrobeItems.sqf index a3da7fd40fc..7bb6cb8b308 100644 --- a/addons/wardrobe/functions/debug/fn_getAllWardrobeItems.sqf +++ b/addons/wardrobe/functions/debug/fn_getAllWardrobeItems.sqf @@ -18,6 +18,6 @@ params [["_asConfig", false, [true]]]; [ - ["CfgWeapons", "CfgGlasses"] apply { ( Q([_x] call FUNC(isModifiable)) configClasses (configFile >> _x) ) apply { configName _x } }, - ["CfgWeapons", "CfgGlasses"] apply { ( Q([_x] call FUNC(isModifiable)) configClasses (configFile >> _x) ) } + ["CfgWeapons", "CfgGlasses"] apply { ( QUOTE([_x] call FUNC(isModifiable)) configClasses (configFile >> _x) ) apply { configName _x } }, + ["CfgWeapons", "CfgGlasses"] apply { ( QUOTE([_x] call FUNC(isModifiable)) configClasses (configFile >> _x) ) } ] select _asConfig diff --git a/addons/wardrobe/functions/fn_isModifiable.sqf b/addons/wardrobe/functions/fn_isModifiable.sqf index 274339091a5..c382ac5b36a 100644 --- a/addons/wardrobe/functions/fn_isModifiable.sqf +++ b/addons/wardrobe/functions/fn_isModifiable.sqf @@ -22,4 +22,4 @@ params [ if (isNull _cfg) exitWith {false}; // Checks if the config has the property without it being inherited(!) -count ( Q(configName _x isEqualTo ""ace_wardrobe"") configClasses _cfg ) > 0 \ No newline at end of file +count ( QUOTE(configName _x isEqualTo QQ(ace_wardrobe)) configClasses _cfg ) > 0 \ No newline at end of file diff --git a/addons/wardrobe/functions/replace/fn_replace.sqf b/addons/wardrobe/functions/replace/fn_replace.sqf index e0cc297d3f5..265f62c7506 100644 --- a/addons/wardrobe/functions/replace/fn_replace.sqf +++ b/addons/wardrobe/functions/replace/fn_replace.sqf @@ -19,7 +19,7 @@ params ["_target", "_unit", "_actionParams", ["_replaceNow", false, [true]]]; _actionParams params ["_cfg_origin", "_cfg_tgt"]; // Duration of the "animation" -private _duration = getNumber (_cfg_tgt>> Q(ADDON) >> "duration"); +private _duration = getNumber (_cfg_tgt>> QADDON >> "duration"); if (_replaceNow) then { _duration = 0; }; // Replace the Main Item. @@ -33,7 +33,7 @@ private _replaceCode = switch ( _typeNumber ) do { default { // CfgGlasses items do not have a ItemInfo Subclass and therefore, not TypeNumber. switch (true) do { - case (isclass (configFile >> "CfgGlasses" >> configName _cfg_origin)): { FUNC(replace_facewear) }; + case (isClass (configFile >> "CfgGlasses" >> configName _cfg_origin)): { FUNC(replace_facewear) }; default { false }; }; }; @@ -54,11 +54,11 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 // Animation/Gestures -[ _unit, getText (_cfg_tgt >> Q(ADDON) >> "gesture") ] call ace_common_fnc_doGesture; +[ _unit, getText (_cfg_tgt >> QADDON >> "gesture") ] call ace_common_fnc_doGesture; // Plays Random Sound At the Beginning -private _sound_timing = getNumber (_cfg_tgt>> Q(ADDON) >> "sound_timing") max 0 min 1; -private _sound = [_cfg_tgt >> Q(ADDON) >> "sound"] call FUNC(getCfgDataRandom); +private _sound_timing = getNumber (_cfg_tgt>> QADDON >> "sound_timing") max 0 min 1; +private _sound = [_cfg_tgt >> QADDON >> "sound"] call FUNC(getCfgDataRandom); if (_sound != "") then { [ CBA_fnc_globalEvent, [QGVAR(EH_say3d), [_unit, _sound]], _sound_timing * _duration ] call CBA_fnc_waitAndExecute; }; diff --git a/addons/wardrobe/script_macros_wardrobe.hpp b/addons/wardrobe/script_macros_wardrobe.hpp index 86ab5b50b55..75236f0e046 100644 --- a/addons/wardrobe/script_macros_wardrobe.hpp +++ b/addons/wardrobe/script_macros_wardrobe.hpp @@ -1,18 +1,17 @@ // CBA Settings #define SET(var1) TRIPLES(ADDON,set,var1) -#define QSET(var1) Q(SET(var1)) +#define QSET(var1) QUOTE(SET(var1)) #define QQSET(var1) QQ(SET(var1)) #define ESET(var1,var2) TRIPLES(DOUBLES(PREFIX,var1),SET,var2) -#define QESET(var1,var2) Q(ESET(var1,var2)) +#define QESET(var1,var2) QUOTE(ESET(var1,var2)) #define QQESET(var1,var2) QQ(ESET(var1,var2)) // LSTRING for cba Settings #define SETLSTRING(key) [LSTRING(DOUBLES(set,key)),LSTRING(TRIPLES(set,key,desc))] -#define Q(var1) QUOTE(var1) -#define QQ(var1) Q(Q(var1)) +#define QQ(var1) QUOTE(QUOTE(var1)) -#define QADDON Q(ADDON) +#define QADDON QUOTE(ADDON) // Paths #define PATH_TO_FUNC QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\functions) From 5f0bbb287fe506db67bcb5490c9e3444c41b555c Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 11:59:39 +0100 Subject: [PATCH 069/305] pruned SUBCOMPONENT_BEAUTIFIED --- addons/compat_gm/compat_gm_wardrobe/script_component.hpp | 2 +- addons/compat_rf/compat_rf_wardrobe/script_component.hpp | 2 +- addons/compat_sog/compat_sog_wardrobe/script_component.hpp | 2 +- .../compat_sog_wardrobe_uniform_fix/script_component.hpp | 2 +- addons/compat_ws/compat_ws_wardrobe/script_component.hpp | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/compat_gm/compat_gm_wardrobe/script_component.hpp b/addons/compat_gm/compat_gm_wardrobe/script_component.hpp index 21f2a8d74d4..33ff700f410 100644 --- a/addons/compat_gm/compat_gm_wardrobe/script_component.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/script_component.hpp @@ -1,5 +1,5 @@ #define SUBCOMPONENT wardrobe -#define SUBCOMPONENT_BEAUTIFIED Wardrobe Compatibility for GlobMo +#define SUBCOMPONENT_BEAUTIFIED Wardrobe #include "..\script_component.hpp" #include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp" diff --git a/addons/compat_rf/compat_rf_wardrobe/script_component.hpp b/addons/compat_rf/compat_rf_wardrobe/script_component.hpp index b9375b33011..67ddb91ef0a 100644 --- a/addons/compat_rf/compat_rf_wardrobe/script_component.hpp +++ b/addons/compat_rf/compat_rf_wardrobe/script_component.hpp @@ -1,5 +1,5 @@ #define SUBCOMPONENT wardrobe -#define SUBCOMPONENT_BEAUTIFIED Wardrobe Compatibility for RF +#define SUBCOMPONENT_BEAUTIFIED Wardrobe #include "..\script_component.hpp" #include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp" \ No newline at end of file diff --git a/addons/compat_sog/compat_sog_wardrobe/script_component.hpp b/addons/compat_sog/compat_sog_wardrobe/script_component.hpp index 285bfd696d5..33ff700f410 100644 --- a/addons/compat_sog/compat_sog_wardrobe/script_component.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/script_component.hpp @@ -1,5 +1,5 @@ #define SUBCOMPONENT wardrobe -#define SUBCOMPONENT_BEAUTIFIED Wardrobe Compatibility for SOG:PF +#define SUBCOMPONENT_BEAUTIFIED Wardrobe #include "..\script_component.hpp" #include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp" diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp index e02f07c5fcb..845da92a822 100644 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp @@ -1,5 +1,5 @@ #define SUBCOMPONENT wardrobe_uniform_fix -#define SUBCOMPONENT_BEAUTIFIED Wardrobe Compatibility for SOG:PF - Uniform Fix +#define SUBCOMPONENT_BEAUTIFIED Wardrobe #include "..\script_component.hpp" #include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp" \ No newline at end of file diff --git a/addons/compat_ws/compat_ws_wardrobe/script_component.hpp b/addons/compat_ws/compat_ws_wardrobe/script_component.hpp index 3cb1f8bd5c8..67ddb91ef0a 100644 --- a/addons/compat_ws/compat_ws_wardrobe/script_component.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/script_component.hpp @@ -1,5 +1,5 @@ #define SUBCOMPONENT wardrobe -#define SUBCOMPONENT_BEAUTIFIED Wardrobe Compatibility for Western Sahara +#define SUBCOMPONENT_BEAUTIFIED Wardrobe #include "..\script_component.hpp" #include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp" \ No newline at end of file From 56add0d3128f211954cb30e97d3696aac5870756 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 12:06:26 +0100 Subject: [PATCH 070/305] also adapt mass to 70 --- addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp index 82d18c07c20..10bc6521da1 100644 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp @@ -4,6 +4,7 @@ class ItemInfo; class className: vn_b_uniform_base {\ class ItemInfo: ItemInfo {\ containerClass = "Supply70";\ + mass = 70;\ };\ }; From f2c6891173f01fe448c93b567fb6508e8b860e3d Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 18:27:16 +0100 Subject: [PATCH 071/305] compat_vanilla -> root --- .../wardrobe/{compat_vanilla/Wardrobe.hpp => CfgWardrobe.hpp} | 0 addons/wardrobe/{compat_vanilla => }/Facewear.hpp | 0 addons/wardrobe/{compat_vanilla => }/Uniforms.hpp | 0 addons/wardrobe/config.cpp | 2 +- 4 files changed, 1 insertion(+), 1 deletion(-) rename addons/wardrobe/{compat_vanilla/Wardrobe.hpp => CfgWardrobe.hpp} (100%) rename addons/wardrobe/{compat_vanilla => }/Facewear.hpp (100%) rename addons/wardrobe/{compat_vanilla => }/Uniforms.hpp (100%) diff --git a/addons/wardrobe/compat_vanilla/Wardrobe.hpp b/addons/wardrobe/CfgWardrobe.hpp similarity index 100% rename from addons/wardrobe/compat_vanilla/Wardrobe.hpp rename to addons/wardrobe/CfgWardrobe.hpp diff --git a/addons/wardrobe/compat_vanilla/Facewear.hpp b/addons/wardrobe/Facewear.hpp similarity index 100% rename from addons/wardrobe/compat_vanilla/Facewear.hpp rename to addons/wardrobe/Facewear.hpp diff --git a/addons/wardrobe/compat_vanilla/Uniforms.hpp b/addons/wardrobe/Uniforms.hpp similarity index 100% rename from addons/wardrobe/compat_vanilla/Uniforms.hpp rename to addons/wardrobe/Uniforms.hpp diff --git a/addons/wardrobe/config.cpp b/addons/wardrobe/config.cpp index daf52d50b31..c01f8e87e1e 100644 --- a/addons/wardrobe/config.cpp +++ b/addons/wardrobe/config.cpp @@ -28,4 +28,4 @@ class CfgPatches { #include "Baseclass.hpp" -#include "compat_vanilla\Wardrobe.hpp" \ No newline at end of file +#include "CfgWardrobe.hpp" \ No newline at end of file From 581973e0677d7052ac647e91cf29ba5a953142c4 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 19:17:27 +0100 Subject: [PATCH 072/305] =?UTF-8?q?->=20PREP=20=F0=9F=92=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- addons/wardrobe/XEH_PREP.hpp | 43 +++++++++++++++++++ addons/wardrobe/XEH_preInit.sqf | 28 ++++-------- .../fn_addActions.sqf => fnc_addActions.sqf} | 0 ...ildren.sqf => fnc_addActions_children.sqf} | 0 ...ition.sqf => fnc_addActions_condition.sqf} | 0 ...tvariant.sqf => fnc_addCM_nextvariant.sqf} | 0 ...fn_cache_clear.sqf => fnc_cache_clear.sqf} | 0 .../fn_cache_db.sqf => fnc_cache_db.sqf} | 0 .../fn_cache_get.sqf => fnc_cache_get.sqf} | 0 .../fn_cache_set.sqf => fnc_cache_set.sqf} | 0 ...fn_canModifyTo.sqf => fnc_canModifyTo.sqf} | 0 ... => fnc_clearOnClosed_InteractionMenu.sqf} | 0 ...ry.sqf => fnc_clearOnClosed_Inventory.sqf} | 0 ...ponents.sqf => fnc_compare_components.sqf} | 0 ....sqf => fnc_compare_container_maxLoad.sqf} | 0 ...nextVariant.sqf => fnc_do_nextVariant.sqf} | 0 ...extMenu.sqf => fnc_enable_contextMenu.sqf} | 0 ...Action_Icon.sqf => fnc_getAction_Icon.sqf} | 0 ...Action_Name.sqf => fnc_getAction_Name.sqf} | 0 ...eItems.sqf => fnc_getAllWardrobeItems.sqf} | 0 ...ataRandom.sqf => fnc_getCfgDataRandom.sqf} | 0 ...romMagID.sqf => fnc_getIndexFromMagID.sqf} | 0 ..._getItems_all.sqf => fnc_getItems_all.sqf} | 0 ...leTo.sqf => fnc_getItems_modifiableTo.sqf} | 0 ...ll.sqf => fnc_getItems_modifiable_all.sqf} | 0 ...qf => fnc_getItems_modifiable_current.sqf} | 0 .../fn_getMagIDs.sqf => fnc_getMagIDs.sqf} | 0 ...NextVariant.sqf => fnc_getNextVariant.sqf} | 0 ..._isModifiable.sqf => fnc_isModifiable.sqf} | 0 .../{fn_postInit.sqf => fnc_postInit.sqf} | 0 .../fn_replace.sqf => fnc_replace.sqf} | 0 ..._facewear.sqf => fnc_replace_facewear.sqf} | 0 ..._headgear.sqf => fnc_replace_headgear.sqf} | 0 ...ce_uniform.sqf => fnc_replace_uniform.sqf} | 0 .../{effects/fn_say3d.sqf => fnc_say3d.sqf} | 0 ...xForMagID.sqf => fnc_setIndexForMagID.sqf} | 0 addons/wardrobe/initSettings.inc.sqf | 21 +++++++++ 37 files changed, 72 insertions(+), 20 deletions(-) create mode 100644 addons/wardrobe/XEH_PREP.hpp rename addons/wardrobe/functions/{action/fn_addActions.sqf => fnc_addActions.sqf} (100%) rename addons/wardrobe/functions/{action/fn_addActions_children.sqf => fnc_addActions_children.sqf} (100%) rename addons/wardrobe/functions/{action/fn_addActions_condition.sqf => fnc_addActions_condition.sqf} (100%) rename addons/wardrobe/functions/{contextMenu/fn_addCM_nextvariant.sqf => fnc_addCM_nextvariant.sqf} (100%) rename addons/wardrobe/functions/{cache/fn_cache_clear.sqf => fnc_cache_clear.sqf} (100%) rename addons/wardrobe/functions/{cache/fn_cache_db.sqf => fnc_cache_db.sqf} (100%) rename addons/wardrobe/functions/{cache/fn_cache_get.sqf => fnc_cache_get.sqf} (100%) rename addons/wardrobe/functions/{cache/fn_cache_set.sqf => fnc_cache_set.sqf} (100%) rename addons/wardrobe/functions/{fn_canModifyTo.sqf => fnc_canModifyTo.sqf} (100%) rename addons/wardrobe/functions/{cache/fn_clearOnClosed_InteractionMenu.sqf => fnc_clearOnClosed_InteractionMenu.sqf} (100%) rename addons/wardrobe/functions/{cache/fn_clearOnClosed_Inventory.sqf => fnc_clearOnClosed_Inventory.sqf} (100%) rename addons/wardrobe/functions/{fn_compare_components.sqf => fnc_compare_components.sqf} (100%) rename addons/wardrobe/functions/{debug/fn_compare_container_maxLoad.sqf => fnc_compare_container_maxLoad.sqf} (100%) rename addons/wardrobe/functions/{contextMenu/fn_do_nextVariant.sqf => fnc_do_nextVariant.sqf} (100%) rename addons/wardrobe/functions/{contextMenu/fn_enable_contextMenu.sqf => fnc_enable_contextMenu.sqf} (100%) rename addons/wardrobe/functions/{action/fn_getAction_Icon.sqf => fnc_getAction_Icon.sqf} (100%) rename addons/wardrobe/functions/{action/fn_getAction_Name.sqf => fnc_getAction_Name.sqf} (100%) rename addons/wardrobe/functions/{debug/fn_getAllWardrobeItems.sqf => fnc_getAllWardrobeItems.sqf} (100%) rename addons/wardrobe/functions/{config/fn_getCfgDataRandom.sqf => fnc_getCfgDataRandom.sqf} (100%) rename addons/wardrobe/functions/{ace_intel/fn_getIndexFromMagID.sqf => fnc_getIndexFromMagID.sqf} (100%) rename addons/wardrobe/functions/{getItems/fn_getItems_all.sqf => fnc_getItems_all.sqf} (100%) rename addons/wardrobe/functions/{getItems/fn_getItems_modifiableTo.sqf => fnc_getItems_modifiableTo.sqf} (100%) rename addons/wardrobe/functions/{getItems/fn_getItems_modifiable_all.sqf => fnc_getItems_modifiable_all.sqf} (100%) rename addons/wardrobe/functions/{getItems/fn_getItems_modifiable_current.sqf => fnc_getItems_modifiable_current.sqf} (100%) rename addons/wardrobe/functions/{ace_intel/fn_getMagIDs.sqf => fnc_getMagIDs.sqf} (100%) rename addons/wardrobe/functions/{contextMenu/fn_getNextVariant.sqf => fnc_getNextVariant.sqf} (100%) rename addons/wardrobe/functions/{fn_isModifiable.sqf => fnc_isModifiable.sqf} (100%) rename addons/wardrobe/functions/{fn_postInit.sqf => fnc_postInit.sqf} (100%) rename addons/wardrobe/functions/{replace/fn_replace.sqf => fnc_replace.sqf} (100%) rename addons/wardrobe/functions/{replace/fn_replace_facewear.sqf => fnc_replace_facewear.sqf} (100%) rename addons/wardrobe/functions/{replace/fn_replace_headgear.sqf => fnc_replace_headgear.sqf} (100%) rename addons/wardrobe/functions/{replace/fn_replace_uniform.sqf => fnc_replace_uniform.sqf} (100%) rename addons/wardrobe/functions/{effects/fn_say3d.sqf => fnc_say3d.sqf} (100%) rename addons/wardrobe/functions/{ace_intel/fn_setIndexForMagID.sqf => fnc_setIndexForMagID.sqf} (100%) create mode 100644 addons/wardrobe/initSettings.inc.sqf diff --git a/addons/wardrobe/XEH_PREP.hpp b/addons/wardrobe/XEH_PREP.hpp new file mode 100644 index 00000000000..a2c61927671 --- /dev/null +++ b/addons/wardrobe/XEH_PREP.hpp @@ -0,0 +1,43 @@ +PREP(postInit); +PREP(isModifiable); +PREP(compare_components); +PREP(canModifyTo); +// ace_intel +PREP(getMagIDs); +PREP(getIndexFromMagID); +PREP(setIndexForMagID); +// getItems +PREP(getItems_all); +PREP(getItems_modifiable_all); +PREP(getItems_modifiable_current); +PREP(getItems_modifiableTo); +// Replace +PREP(replace); +PREP(replace_headgear); +PREP(replace_facewear); +PREP(replace_uniform); +// Ace Actions +PREP(addActions); +PREP(addActions_condition); +PREP(addActions_children); +PREP(getAction_Name); +PREP(getAction_Icon); +// Cache +PREP(cache_db); +PREP(cache_get); +PREP(cache_set); +PREP(cache_clear); +PREP(clearOnClosed_InteractionMenu); +PREP(clearOnClosed_Inventory); +// Config +PREP(getCfgDataRandom); +// Debug +PREP(getAllWardrobeItems); +PREP(compare_container_maxLoad); +// Effects +PREP(say3d); +// CBA Context Menu +PREP(enable_contextMenu); +PREP(addCM_nextvariant); +PREP(do_nextVariant); +PREP(getNextVariant); \ No newline at end of file diff --git a/addons/wardrobe/XEH_preInit.sqf b/addons/wardrobe/XEH_preInit.sqf index 9e2dfa374cc..894773534a4 100644 --- a/addons/wardrobe/XEH_preInit.sqf +++ b/addons/wardrobe/XEH_preInit.sqf @@ -1,23 +1,11 @@ #include "script_component.hpp" -[ - QSET(enable_action), - "CHECKBOX", - SETLSTRING(enable_action), - [LSTRING(set_cat_main)], - true, - 1, - {}, - false -] call CBA_fnc_addSetting; +ADDON = false; -[ - QSET(enable_contextMenu), - "CHECKBOX", - SETLSTRING(enable_contextMenu), - [LSTRING(set_cat_main)], - true, - 1, - FUNC(enable_contextMenu), - true -] call CBA_fnc_addSetting; \ No newline at end of file +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +#include "initSettings.inc.sqf" + +ADDON = true; diff --git a/addons/wardrobe/functions/action/fn_addActions.sqf b/addons/wardrobe/functions/fnc_addActions.sqf similarity index 100% rename from addons/wardrobe/functions/action/fn_addActions.sqf rename to addons/wardrobe/functions/fnc_addActions.sqf diff --git a/addons/wardrobe/functions/action/fn_addActions_children.sqf b/addons/wardrobe/functions/fnc_addActions_children.sqf similarity index 100% rename from addons/wardrobe/functions/action/fn_addActions_children.sqf rename to addons/wardrobe/functions/fnc_addActions_children.sqf diff --git a/addons/wardrobe/functions/action/fn_addActions_condition.sqf b/addons/wardrobe/functions/fnc_addActions_condition.sqf similarity index 100% rename from addons/wardrobe/functions/action/fn_addActions_condition.sqf rename to addons/wardrobe/functions/fnc_addActions_condition.sqf diff --git a/addons/wardrobe/functions/contextMenu/fn_addCM_nextvariant.sqf b/addons/wardrobe/functions/fnc_addCM_nextvariant.sqf similarity index 100% rename from addons/wardrobe/functions/contextMenu/fn_addCM_nextvariant.sqf rename to addons/wardrobe/functions/fnc_addCM_nextvariant.sqf diff --git a/addons/wardrobe/functions/cache/fn_cache_clear.sqf b/addons/wardrobe/functions/fnc_cache_clear.sqf similarity index 100% rename from addons/wardrobe/functions/cache/fn_cache_clear.sqf rename to addons/wardrobe/functions/fnc_cache_clear.sqf diff --git a/addons/wardrobe/functions/cache/fn_cache_db.sqf b/addons/wardrobe/functions/fnc_cache_db.sqf similarity index 100% rename from addons/wardrobe/functions/cache/fn_cache_db.sqf rename to addons/wardrobe/functions/fnc_cache_db.sqf diff --git a/addons/wardrobe/functions/cache/fn_cache_get.sqf b/addons/wardrobe/functions/fnc_cache_get.sqf similarity index 100% rename from addons/wardrobe/functions/cache/fn_cache_get.sqf rename to addons/wardrobe/functions/fnc_cache_get.sqf diff --git a/addons/wardrobe/functions/cache/fn_cache_set.sqf b/addons/wardrobe/functions/fnc_cache_set.sqf similarity index 100% rename from addons/wardrobe/functions/cache/fn_cache_set.sqf rename to addons/wardrobe/functions/fnc_cache_set.sqf diff --git a/addons/wardrobe/functions/fn_canModifyTo.sqf b/addons/wardrobe/functions/fnc_canModifyTo.sqf similarity index 100% rename from addons/wardrobe/functions/fn_canModifyTo.sqf rename to addons/wardrobe/functions/fnc_canModifyTo.sqf diff --git a/addons/wardrobe/functions/cache/fn_clearOnClosed_InteractionMenu.sqf b/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf similarity index 100% rename from addons/wardrobe/functions/cache/fn_clearOnClosed_InteractionMenu.sqf rename to addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf diff --git a/addons/wardrobe/functions/cache/fn_clearOnClosed_Inventory.sqf b/addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf similarity index 100% rename from addons/wardrobe/functions/cache/fn_clearOnClosed_Inventory.sqf rename to addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf diff --git a/addons/wardrobe/functions/fn_compare_components.sqf b/addons/wardrobe/functions/fnc_compare_components.sqf similarity index 100% rename from addons/wardrobe/functions/fn_compare_components.sqf rename to addons/wardrobe/functions/fnc_compare_components.sqf diff --git a/addons/wardrobe/functions/debug/fn_compare_container_maxLoad.sqf b/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf similarity index 100% rename from addons/wardrobe/functions/debug/fn_compare_container_maxLoad.sqf rename to addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf diff --git a/addons/wardrobe/functions/contextMenu/fn_do_nextVariant.sqf b/addons/wardrobe/functions/fnc_do_nextVariant.sqf similarity index 100% rename from addons/wardrobe/functions/contextMenu/fn_do_nextVariant.sqf rename to addons/wardrobe/functions/fnc_do_nextVariant.sqf diff --git a/addons/wardrobe/functions/contextMenu/fn_enable_contextMenu.sqf b/addons/wardrobe/functions/fnc_enable_contextMenu.sqf similarity index 100% rename from addons/wardrobe/functions/contextMenu/fn_enable_contextMenu.sqf rename to addons/wardrobe/functions/fnc_enable_contextMenu.sqf diff --git a/addons/wardrobe/functions/action/fn_getAction_Icon.sqf b/addons/wardrobe/functions/fnc_getAction_Icon.sqf similarity index 100% rename from addons/wardrobe/functions/action/fn_getAction_Icon.sqf rename to addons/wardrobe/functions/fnc_getAction_Icon.sqf diff --git a/addons/wardrobe/functions/action/fn_getAction_Name.sqf b/addons/wardrobe/functions/fnc_getAction_Name.sqf similarity index 100% rename from addons/wardrobe/functions/action/fn_getAction_Name.sqf rename to addons/wardrobe/functions/fnc_getAction_Name.sqf diff --git a/addons/wardrobe/functions/debug/fn_getAllWardrobeItems.sqf b/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf similarity index 100% rename from addons/wardrobe/functions/debug/fn_getAllWardrobeItems.sqf rename to addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf diff --git a/addons/wardrobe/functions/config/fn_getCfgDataRandom.sqf b/addons/wardrobe/functions/fnc_getCfgDataRandom.sqf similarity index 100% rename from addons/wardrobe/functions/config/fn_getCfgDataRandom.sqf rename to addons/wardrobe/functions/fnc_getCfgDataRandom.sqf diff --git a/addons/wardrobe/functions/ace_intel/fn_getIndexFromMagID.sqf b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf similarity index 100% rename from addons/wardrobe/functions/ace_intel/fn_getIndexFromMagID.sqf rename to addons/wardrobe/functions/fnc_getIndexFromMagID.sqf diff --git a/addons/wardrobe/functions/getItems/fn_getItems_all.sqf b/addons/wardrobe/functions/fnc_getItems_all.sqf similarity index 100% rename from addons/wardrobe/functions/getItems/fn_getItems_all.sqf rename to addons/wardrobe/functions/fnc_getItems_all.sqf diff --git a/addons/wardrobe/functions/getItems/fn_getItems_modifiableTo.sqf b/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf similarity index 100% rename from addons/wardrobe/functions/getItems/fn_getItems_modifiableTo.sqf rename to addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf diff --git a/addons/wardrobe/functions/getItems/fn_getItems_modifiable_all.sqf b/addons/wardrobe/functions/fnc_getItems_modifiable_all.sqf similarity index 100% rename from addons/wardrobe/functions/getItems/fn_getItems_modifiable_all.sqf rename to addons/wardrobe/functions/fnc_getItems_modifiable_all.sqf diff --git a/addons/wardrobe/functions/getItems/fn_getItems_modifiable_current.sqf b/addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf similarity index 100% rename from addons/wardrobe/functions/getItems/fn_getItems_modifiable_current.sqf rename to addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf diff --git a/addons/wardrobe/functions/ace_intel/fn_getMagIDs.sqf b/addons/wardrobe/functions/fnc_getMagIDs.sqf similarity index 100% rename from addons/wardrobe/functions/ace_intel/fn_getMagIDs.sqf rename to addons/wardrobe/functions/fnc_getMagIDs.sqf diff --git a/addons/wardrobe/functions/contextMenu/fn_getNextVariant.sqf b/addons/wardrobe/functions/fnc_getNextVariant.sqf similarity index 100% rename from addons/wardrobe/functions/contextMenu/fn_getNextVariant.sqf rename to addons/wardrobe/functions/fnc_getNextVariant.sqf diff --git a/addons/wardrobe/functions/fn_isModifiable.sqf b/addons/wardrobe/functions/fnc_isModifiable.sqf similarity index 100% rename from addons/wardrobe/functions/fn_isModifiable.sqf rename to addons/wardrobe/functions/fnc_isModifiable.sqf diff --git a/addons/wardrobe/functions/fn_postInit.sqf b/addons/wardrobe/functions/fnc_postInit.sqf similarity index 100% rename from addons/wardrobe/functions/fn_postInit.sqf rename to addons/wardrobe/functions/fnc_postInit.sqf diff --git a/addons/wardrobe/functions/replace/fn_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf similarity index 100% rename from addons/wardrobe/functions/replace/fn_replace.sqf rename to addons/wardrobe/functions/fnc_replace.sqf diff --git a/addons/wardrobe/functions/replace/fn_replace_facewear.sqf b/addons/wardrobe/functions/fnc_replace_facewear.sqf similarity index 100% rename from addons/wardrobe/functions/replace/fn_replace_facewear.sqf rename to addons/wardrobe/functions/fnc_replace_facewear.sqf diff --git a/addons/wardrobe/functions/replace/fn_replace_headgear.sqf b/addons/wardrobe/functions/fnc_replace_headgear.sqf similarity index 100% rename from addons/wardrobe/functions/replace/fn_replace_headgear.sqf rename to addons/wardrobe/functions/fnc_replace_headgear.sqf diff --git a/addons/wardrobe/functions/replace/fn_replace_uniform.sqf b/addons/wardrobe/functions/fnc_replace_uniform.sqf similarity index 100% rename from addons/wardrobe/functions/replace/fn_replace_uniform.sqf rename to addons/wardrobe/functions/fnc_replace_uniform.sqf diff --git a/addons/wardrobe/functions/effects/fn_say3d.sqf b/addons/wardrobe/functions/fnc_say3d.sqf similarity index 100% rename from addons/wardrobe/functions/effects/fn_say3d.sqf rename to addons/wardrobe/functions/fnc_say3d.sqf diff --git a/addons/wardrobe/functions/ace_intel/fn_setIndexForMagID.sqf b/addons/wardrobe/functions/fnc_setIndexForMagID.sqf similarity index 100% rename from addons/wardrobe/functions/ace_intel/fn_setIndexForMagID.sqf rename to addons/wardrobe/functions/fnc_setIndexForMagID.sqf diff --git a/addons/wardrobe/initSettings.inc.sqf b/addons/wardrobe/initSettings.inc.sqf new file mode 100644 index 00000000000..c6869b5192b --- /dev/null +++ b/addons/wardrobe/initSettings.inc.sqf @@ -0,0 +1,21 @@ +[ + QSET(enable_action), + "CHECKBOX", + SETLSTRING(enable_action), + [LSTRING(set_cat_main)], + true, + 1, + {}, + false +] call CBA_fnc_addSetting; + +[ + QSET(enable_contextMenu), + "CHECKBOX", + SETLSTRING(enable_contextMenu), + [LSTRING(set_cat_main)], + true, + 1, + FUNC(enable_contextMenu), + true +] call CBA_fnc_addSetting; From c67fba923c8d2b921d07d15fc224d71a107c7a75 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 19:43:05 +0100 Subject: [PATCH 073/305] "../../" -> "../" --- addons/wardrobe/functions/fnc_addActions.sqf | 2 +- addons/wardrobe/functions/fnc_addActions_children.sqf | 2 +- addons/wardrobe/functions/fnc_addActions_condition.sqf | 2 +- addons/wardrobe/functions/fnc_addCM_nextvariant.sqf | 2 +- addons/wardrobe/functions/fnc_cache_clear.sqf | 2 +- addons/wardrobe/functions/fnc_cache_db.sqf | 2 +- addons/wardrobe/functions/fnc_cache_get.sqf | 2 +- addons/wardrobe/functions/fnc_cache_set.sqf | 2 +- addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf | 2 +- addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf | 2 +- addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf | 2 +- addons/wardrobe/functions/fnc_do_nextVariant.sqf | 2 +- addons/wardrobe/functions/fnc_enable_contextMenu.sqf | 2 +- addons/wardrobe/functions/fnc_getAction_Icon.sqf | 2 +- addons/wardrobe/functions/fnc_getAction_Name.sqf | 2 +- addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf | 2 +- addons/wardrobe/functions/fnc_getCfgDataRandom.sqf | 2 +- addons/wardrobe/functions/fnc_getIndexFromMagID.sqf | 2 +- addons/wardrobe/functions/fnc_getItems_all.sqf | 2 +- addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf | 2 +- addons/wardrobe/functions/fnc_getItems_modifiable_all.sqf | 2 +- addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf | 2 +- addons/wardrobe/functions/fnc_getMagIDs.sqf | 2 +- addons/wardrobe/functions/fnc_getNextVariant.sqf | 2 +- addons/wardrobe/functions/fnc_replace.sqf | 2 +- addons/wardrobe/functions/fnc_replace_facewear.sqf | 2 +- addons/wardrobe/functions/fnc_replace_headgear.sqf | 2 +- addons/wardrobe/functions/fnc_replace_uniform.sqf | 2 +- addons/wardrobe/functions/fnc_say3d.sqf | 2 +- addons/wardrobe/functions/fnc_setIndexForMagID.sqf | 2 +- 30 files changed, 30 insertions(+), 30 deletions(-) diff --git a/addons/wardrobe/functions/fnc_addActions.sqf b/addons/wardrobe/functions/fnc_addActions.sqf index acbb88fbc0d..431c3481b19 100644 --- a/addons/wardrobe/functions/fnc_addActions.sqf +++ b/addons/wardrobe/functions/fnc_addActions.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_addActions_children.sqf b/addons/wardrobe/functions/fnc_addActions_children.sqf index dbdb100f81a..b186b875cc9 100644 --- a/addons/wardrobe/functions/fnc_addActions_children.sqf +++ b/addons/wardrobe/functions/fnc_addActions_children.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_addActions_condition.sqf b/addons/wardrobe/functions/fnc_addActions_condition.sqf index 7715f88818f..af50d06b3f3 100644 --- a/addons/wardrobe/functions/fnc_addActions_condition.sqf +++ b/addons/wardrobe/functions/fnc_addActions_condition.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_addCM_nextvariant.sqf b/addons/wardrobe/functions/fnc_addCM_nextvariant.sqf index 5b402b50f42..2b503fe71f3 100644 --- a/addons/wardrobe/functions/fnc_addCM_nextvariant.sqf +++ b/addons/wardrobe/functions/fnc_addCM_nextvariant.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_cache_clear.sqf b/addons/wardrobe/functions/fnc_cache_clear.sqf index f60461add6a..a53d09bd0e0 100644 --- a/addons/wardrobe/functions/fnc_cache_clear.sqf +++ b/addons/wardrobe/functions/fnc_cache_clear.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_cache_db.sqf b/addons/wardrobe/functions/fnc_cache_db.sqf index 6039c3f3595..fb7cc811ea9 100644 --- a/addons/wardrobe/functions/fnc_cache_db.sqf +++ b/addons/wardrobe/functions/fnc_cache_db.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_cache_get.sqf b/addons/wardrobe/functions/fnc_cache_get.sqf index bfa2648f2ff..c95e3678013 100644 --- a/addons/wardrobe/functions/fnc_cache_get.sqf +++ b/addons/wardrobe/functions/fnc_cache_get.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_cache_set.sqf b/addons/wardrobe/functions/fnc_cache_set.sqf index 7c0f4cf9453..84eca982db2 100644 --- a/addons/wardrobe/functions/fnc_cache_set.sqf +++ b/addons/wardrobe/functions/fnc_cache_set.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf b/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf index a2aecfb5741..6b4669d93f6 100644 --- a/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf +++ b/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf b/addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf index 6ff42a9bfc8..f84ab95a390 100644 --- a/addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf +++ b/addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf b/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf index d78251a1269..d9d8f0dcb53 100644 --- a/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf +++ b/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_do_nextVariant.sqf b/addons/wardrobe/functions/fnc_do_nextVariant.sqf index f8e3ab6666b..fd12d1efec3 100644 --- a/addons/wardrobe/functions/fnc_do_nextVariant.sqf +++ b/addons/wardrobe/functions/fnc_do_nextVariant.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_enable_contextMenu.sqf b/addons/wardrobe/functions/fnc_enable_contextMenu.sqf index 56cca48daf5..b5d8c8d8514 100644 --- a/addons/wardrobe/functions/fnc_enable_contextMenu.sqf +++ b/addons/wardrobe/functions/fnc_enable_contextMenu.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_getAction_Icon.sqf b/addons/wardrobe/functions/fnc_getAction_Icon.sqf index a3119d6957f..ab759df1fbc 100644 --- a/addons/wardrobe/functions/fnc_getAction_Icon.sqf +++ b/addons/wardrobe/functions/fnc_getAction_Icon.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_getAction_Name.sqf b/addons/wardrobe/functions/fnc_getAction_Name.sqf index afde79c357d..709ff0514ee 100644 --- a/addons/wardrobe/functions/fnc_getAction_Name.sqf +++ b/addons/wardrobe/functions/fnc_getAction_Name.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf b/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf index 7bb6cb8b308..1dedf396942 100644 --- a/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf +++ b/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_getCfgDataRandom.sqf b/addons/wardrobe/functions/fnc_getCfgDataRandom.sqf index aeeb86c6792..cc28339a141 100644 --- a/addons/wardrobe/functions/fnc_getCfgDataRandom.sqf +++ b/addons/wardrobe/functions/fnc_getCfgDataRandom.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf index ce6b6d66071..52ebdac03ea 100644 --- a/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf +++ b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_getItems_all.sqf b/addons/wardrobe/functions/fnc_getItems_all.sqf index db3dfcc2de7..4c980f045ee 100644 --- a/addons/wardrobe/functions/fnc_getItems_all.sqf +++ b/addons/wardrobe/functions/fnc_getItems_all.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf b/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf index 388520c6835..f666c475d26 100644 --- a/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf +++ b/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_getItems_modifiable_all.sqf b/addons/wardrobe/functions/fnc_getItems_modifiable_all.sqf index bcc00c4c5df..2bc1ab1ac5c 100644 --- a/addons/wardrobe/functions/fnc_getItems_modifiable_all.sqf +++ b/addons/wardrobe/functions/fnc_getItems_modifiable_all.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf b/addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf index 4948b2cbdb3..59df6c4c359 100644 --- a/addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf +++ b/addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_getMagIDs.sqf b/addons/wardrobe/functions/fnc_getMagIDs.sqf index eb1df20c373..88f3851388f 100644 --- a/addons/wardrobe/functions/fnc_getMagIDs.sqf +++ b/addons/wardrobe/functions/fnc_getMagIDs.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_getNextVariant.sqf b/addons/wardrobe/functions/fnc_getNextVariant.sqf index b997d5bf5f3..8f5f6b80240 100644 --- a/addons/wardrobe/functions/fnc_getNextVariant.sqf +++ b/addons/wardrobe/functions/fnc_getNextVariant.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 265f62c7506..35d67d26cf0 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_replace_facewear.sqf b/addons/wardrobe/functions/fnc_replace_facewear.sqf index a797edf87ce..e2238da8771 100644 --- a/addons/wardrobe/functions/fnc_replace_facewear.sqf +++ b/addons/wardrobe/functions/fnc_replace_facewear.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_replace_headgear.sqf b/addons/wardrobe/functions/fnc_replace_headgear.sqf index f676e9fae6e..dd30b6bf9ea 100644 --- a/addons/wardrobe/functions/fnc_replace_headgear.sqf +++ b/addons/wardrobe/functions/fnc_replace_headgear.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_replace_uniform.sqf b/addons/wardrobe/functions/fnc_replace_uniform.sqf index e8547160925..db71ca51c93 100644 --- a/addons/wardrobe/functions/fnc_replace_uniform.sqf +++ b/addons/wardrobe/functions/fnc_replace_uniform.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_say3d.sqf b/addons/wardrobe/functions/fnc_say3d.sqf index 942b90cee13..8f393fb3803 100644 --- a/addons/wardrobe/functions/fnc_say3d.sqf +++ b/addons/wardrobe/functions/fnc_say3d.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn diff --git a/addons/wardrobe/functions/fnc_setIndexForMagID.sqf b/addons/wardrobe/functions/fnc_setIndexForMagID.sqf index 142f5952031..ceb786cba20 100644 --- a/addons/wardrobe/functions/fnc_setIndexForMagID.sqf +++ b/addons/wardrobe/functions/fnc_setIndexForMagID.sqf @@ -1,4 +1,4 @@ -#include "../../script_component.hpp" +#include "../script_component.hpp" /* * Author: Zorn From f1e677f754830a67a2d9f3902e8f5a1ff9d3bdd7 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 19:56:19 +0100 Subject: [PATCH 074/305] 1 New Line at EOF --- addons/wardrobe/functions/fnc_addActions.sqf | 2 +- addons/wardrobe/functions/fnc_addActions_children.sqf | 2 +- addons/wardrobe/functions/fnc_addActions_condition.sqf | 2 +- addons/wardrobe/functions/fnc_addCM_nextvariant.sqf | 1 - addons/wardrobe/functions/fnc_cache_clear.sqf | 2 +- addons/wardrobe/functions/fnc_cache_db.sqf | 2 +- addons/wardrobe/functions/fnc_cache_set.sqf | 2 +- addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf | 2 +- addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf | 2 +- addons/wardrobe/functions/fnc_compare_components.sqf | 2 +- addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf | 1 - addons/wardrobe/functions/fnc_do_nextVariant.sqf | 2 +- addons/wardrobe/functions/fnc_getAction_Icon.sqf | 1 - addons/wardrobe/functions/fnc_getAction_Name.sqf | 1 - addons/wardrobe/functions/fnc_getCfgDataRandom.sqf | 2 +- addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf | 2 +- addons/wardrobe/functions/fnc_getMagIDs.sqf | 2 +- addons/wardrobe/functions/fnc_getNextVariant.sqf | 2 +- addons/wardrobe/functions/fnc_isModifiable.sqf | 2 +- addons/wardrobe/functions/fnc_postInit.sqf | 2 +- addons/wardrobe/functions/fnc_replace.sqf | 2 -- addons/wardrobe/functions/fnc_replace_facewear.sqf | 2 +- addons/wardrobe/functions/fnc_replace_uniform.sqf | 2 +- addons/wardrobe/functions/fnc_say3d.sqf | 2 +- addons/wardrobe/functions/fnc_setIndexForMagID.sqf | 2 +- 25 files changed, 20 insertions(+), 26 deletions(-) diff --git a/addons/wardrobe/functions/fnc_addActions.sqf b/addons/wardrobe/functions/fnc_addActions.sqf index 431c3481b19..1fc3497ab8e 100644 --- a/addons/wardrobe/functions/fnc_addActions.sqf +++ b/addons/wardrobe/functions/fnc_addActions.sqf @@ -45,4 +45,4 @@ private _actions = []; } forEach _modifiableItems; -_actions \ No newline at end of file +_actions diff --git a/addons/wardrobe/functions/fnc_addActions_children.sqf b/addons/wardrobe/functions/fnc_addActions_children.sqf index b186b875cc9..9c49a4e8c0a 100644 --- a/addons/wardrobe/functions/fnc_addActions_children.sqf +++ b/addons/wardrobe/functions/fnc_addActions_children.sqf @@ -44,4 +44,4 @@ private _actions = []; } forEach _newItems; -_actions \ No newline at end of file +_actions diff --git a/addons/wardrobe/functions/fnc_addActions_condition.sqf b/addons/wardrobe/functions/fnc_addActions_condition.sqf index af50d06b3f3..27065980dd4 100644 --- a/addons/wardrobe/functions/fnc_addActions_condition.sqf +++ b/addons/wardrobe/functions/fnc_addActions_condition.sqf @@ -21,4 +21,4 @@ missionNamespace getVariable [QSET(enable_action), false] && { count ([_player] call FUNC(getItems_modifiable_current)) > 0 -} \ No newline at end of file +} diff --git a/addons/wardrobe/functions/fnc_addCM_nextvariant.sqf b/addons/wardrobe/functions/fnc_addCM_nextvariant.sqf index 2b503fe71f3..60fa1f9c0e0 100644 --- a/addons/wardrobe/functions/fnc_addCM_nextvariant.sqf +++ b/addons/wardrobe/functions/fnc_addCM_nextvariant.sqf @@ -29,4 +29,3 @@ false, // consume Item [] // Params ] call CBA_fnc_addItemContextMenuOption; - diff --git a/addons/wardrobe/functions/fnc_cache_clear.sqf b/addons/wardrobe/functions/fnc_cache_clear.sqf index a53d09bd0e0..437d0a047f2 100644 --- a/addons/wardrobe/functions/fnc_cache_clear.sqf +++ b/addons/wardrobe/functions/fnc_cache_clear.sqf @@ -23,4 +23,4 @@ params [ ["_key", "", [""]] ]; private _map = missionNamespace getVariable [QGVAR(cache), "404"]; _map deleteAt _key; -if (count _map == 0) then { missionNamespace setVariable [QGVAR(cache),nil] }; \ No newline at end of file +if (count _map == 0) then { missionNamespace setVariable [QGVAR(cache),nil] }; diff --git a/addons/wardrobe/functions/fnc_cache_db.sqf b/addons/wardrobe/functions/fnc_cache_db.sqf index fb7cc811ea9..81f5ffdc858 100644 --- a/addons/wardrobe/functions/fnc_cache_db.sqf +++ b/addons/wardrobe/functions/fnc_cache_db.sqf @@ -24,4 +24,4 @@ if (_map isEqualTo "404") then { missionNamespace setVariable [QGVAR(cache), _map]; }; -_map \ No newline at end of file +_map diff --git a/addons/wardrobe/functions/fnc_cache_set.sqf b/addons/wardrobe/functions/fnc_cache_set.sqf index 84eca982db2..89fcd5d5e8a 100644 --- a/addons/wardrobe/functions/fnc_cache_set.sqf +++ b/addons/wardrobe/functions/fnc_cache_set.sqf @@ -23,4 +23,4 @@ if (_value isEqualTo "404") exitWith { false }; _db set [_key, _value]; -true \ No newline at end of file +true diff --git a/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf b/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf index 6b4669d93f6..03793f475f8 100644 --- a/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf +++ b/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf @@ -36,4 +36,4 @@ if (_queue isEqualTo "404") then { missionNamespace setVariable [QGVAR(menu_clear_queue), _queue]; }; -_queue pushBackUnique _key; \ No newline at end of file +_queue pushBackUnique _key; diff --git a/addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf b/addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf index f84ab95a390..3f904d73179 100644 --- a/addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf +++ b/addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf @@ -32,4 +32,4 @@ if (_queue isEqualTo "404") then { missionNamespace setVariable [QGVAR(inventory_clear_queue), _queue]; }; -_queue pushBackUnique _key; \ No newline at end of file +_queue pushBackUnique _key; diff --git a/addons/wardrobe/functions/fnc_compare_components.sqf b/addons/wardrobe/functions/fnc_compare_components.sqf index ff90d18ab19..c5790375553 100644 --- a/addons/wardrobe/functions/fnc_compare_components.sqf +++ b/addons/wardrobe/functions/fnc_compare_components.sqf @@ -25,4 +25,4 @@ private _missing = []; { if (_x in _current) then { _current = _current - [_x] } else { _missing pushBack _x }; } forEach _needed; //[[missing components], [surplus components]] -[_missing, _current] \ No newline at end of file +[_missing, _current] diff --git a/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf b/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf index d9d8f0dcb53..ecdf3c52a45 100644 --- a/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf +++ b/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf @@ -42,4 +42,3 @@ private _established = []; } forEach _allWardrobeItems; - diff --git a/addons/wardrobe/functions/fnc_do_nextVariant.sqf b/addons/wardrobe/functions/fnc_do_nextVariant.sqf index fd12d1efec3..1f3460c0af1 100644 --- a/addons/wardrobe/functions/fnc_do_nextVariant.sqf +++ b/addons/wardrobe/functions/fnc_do_nextVariant.sqf @@ -37,4 +37,4 @@ if !(_canModifyTo) exitWith { }; -[_unit, _unit, [_current_cfg, _cfg_tgt], true] call FUNC(replace); \ No newline at end of file +[_unit, _unit, [_current_cfg, _cfg_tgt], true] call FUNC(replace); diff --git a/addons/wardrobe/functions/fnc_getAction_Icon.sqf b/addons/wardrobe/functions/fnc_getAction_Icon.sqf index ab759df1fbc..fcaedbce9e9 100644 --- a/addons/wardrobe/functions/fnc_getAction_Icon.sqf +++ b/addons/wardrobe/functions/fnc_getAction_Icon.sqf @@ -19,4 +19,3 @@ params [ ["_cfg", configNull, [configNull] ] ]; private _altDispIcon = getText (_cfg >> QADDON >> "alternativePicture"); if (_altDispIcon isEqualTo "") then { getText (_cfg >> "picture") } else { _altDispIcon } - diff --git a/addons/wardrobe/functions/fnc_getAction_Name.sqf b/addons/wardrobe/functions/fnc_getAction_Name.sqf index 709ff0514ee..07aa658ec52 100644 --- a/addons/wardrobe/functions/fnc_getAction_Name.sqf +++ b/addons/wardrobe/functions/fnc_getAction_Name.sqf @@ -19,4 +19,3 @@ params [ ["_cfg", configNull, [configNull] ] ]; private _altDispName = getText (_cfg >> QADDON >> "alternativeDisplayName"); if (_altDispName isEqualTo "") then { getText (_cfg >> "displayName") } else { _altDispName }; - diff --git a/addons/wardrobe/functions/fnc_getCfgDataRandom.sqf b/addons/wardrobe/functions/fnc_getCfgDataRandom.sqf index cc28339a141..7aa909cda22 100644 --- a/addons/wardrobe/functions/fnc_getCfgDataRandom.sqf +++ b/addons/wardrobe/functions/fnc_getCfgDataRandom.sqf @@ -22,4 +22,4 @@ params [ if (_cfg isEqualTo configNull) exitWith {nil}; private _data = [_cfg] call BIS_fnc_getCfgData; if (_data isEqualType []) then { _data = selectRandom _data }; -_data \ No newline at end of file +_data diff --git a/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf b/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf index f666c475d26..5706ea34f03 100644 --- a/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf +++ b/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf @@ -17,4 +17,4 @@ params ["_cfg_current"]; -[_cfg_current >> QADDON >> "modifiableTo"] call BIS_fnc_getCfgDataArray apply { [_x] call CBA_fnc_getItemConfig } select { !isNull _x } \ No newline at end of file +[_cfg_current >> QADDON >> "modifiableTo"] call BIS_fnc_getCfgDataArray apply { [_x] call CBA_fnc_getItemConfig } select { !isNull _x } diff --git a/addons/wardrobe/functions/fnc_getMagIDs.sqf b/addons/wardrobe/functions/fnc_getMagIDs.sqf index 88f3851388f..34506224033 100644 --- a/addons/wardrobe/functions/fnc_getMagIDs.sqf +++ b/addons/wardrobe/functions/fnc_getMagIDs.sqf @@ -23,4 +23,4 @@ params [ if ( _className == "" || { _unit isEqualTo objNull } ) exitWith {}; toFixed 0; -(magazinesAmmoFull _unit) apply { [_x#0, _x#-2, _x#-1] } select { _x#0 == _className } apply { format ["%1/%2", _x#1,_x#2] } \ No newline at end of file +(magazinesAmmoFull _unit) apply { [_x#0, _x#-2, _x#-1] } select { _x#0 == _className } apply { format ["%1/%2", _x#1,_x#2] } diff --git a/addons/wardrobe/functions/fnc_getNextVariant.sqf b/addons/wardrobe/functions/fnc_getNextVariant.sqf index 8f5f6b80240..9340d186726 100644 --- a/addons/wardrobe/functions/fnc_getNextVariant.sqf +++ b/addons/wardrobe/functions/fnc_getNextVariant.sqf @@ -52,4 +52,4 @@ private _return = if (count _remaining > 0) then { }; _history_cfg pushBackUnique _return; -_return \ No newline at end of file +_return diff --git a/addons/wardrobe/functions/fnc_isModifiable.sqf b/addons/wardrobe/functions/fnc_isModifiable.sqf index c382ac5b36a..e4a824cf964 100644 --- a/addons/wardrobe/functions/fnc_isModifiable.sqf +++ b/addons/wardrobe/functions/fnc_isModifiable.sqf @@ -22,4 +22,4 @@ params [ if (isNull _cfg) exitWith {false}; // Checks if the config has the property without it being inherited(!) -count ( QUOTE(configName _x isEqualTo QQ(ace_wardrobe)) configClasses _cfg ) > 0 \ No newline at end of file +count ( QUOTE(configName _x isEqualTo QQ(ace_wardrobe)) configClasses _cfg ) > 0 diff --git a/addons/wardrobe/functions/fnc_postInit.sqf b/addons/wardrobe/functions/fnc_postInit.sqf index b689c089e34..ab84300a4e3 100644 --- a/addons/wardrobe/functions/fnc_postInit.sqf +++ b/addons/wardrobe/functions/fnc_postInit.sqf @@ -15,4 +15,4 @@ * Public: No */ -[ QGVAR(EH_say3d), FUNC(say3d) ] call CBA_fnc_addEventHandler; \ No newline at end of file +[ QGVAR(EH_say3d), FUNC(say3d) ] call CBA_fnc_addEventHandler; diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 35d67d26cf0..b940831c938 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -66,5 +66,3 @@ if (_sound != "") then { [ CBA_fnc_globalEvent, [QGVAR(EH_say3d), [_unit, _sound private _notify_img = getText (_cfg_tgt >> "picture"); if !(".paa" in _notify_img) then { _notify_img = [_notify_img,"paa"] joinString "." }; [ CBA_fnc_notify, [[ _notify_img, 4], [getText (_cfg_tgt >> "displayName")], true ], _duration * 1.2 ] call CBA_fnc_waitAndExecute; - - diff --git a/addons/wardrobe/functions/fnc_replace_facewear.sqf b/addons/wardrobe/functions/fnc_replace_facewear.sqf index e2238da8771..bc9fe45459d 100644 --- a/addons/wardrobe/functions/fnc_replace_facewear.sqf +++ b/addons/wardrobe/functions/fnc_replace_facewear.sqf @@ -17,4 +17,4 @@ params ["_player", "_cfg_origin", "_cfg_tgt"]; removeGoggles _player; -_player addGoggles configName _cfg_tgt; \ No newline at end of file +_player addGoggles configName _cfg_tgt; diff --git a/addons/wardrobe/functions/fnc_replace_uniform.sqf b/addons/wardrobe/functions/fnc_replace_uniform.sqf index db71ca51c93..ccda6137bdd 100644 --- a/addons/wardrobe/functions/fnc_replace_uniform.sqf +++ b/addons/wardrobe/functions/fnc_replace_uniform.sqf @@ -49,4 +49,4 @@ switch (_case) do { // ACE Intel Items if (_hasDocument isEqualType []) then { { [_x, _hasDocument # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_document" ] call FUNC(getMagIDs) ); }; if (_hasNotepad isEqualType []) then { { [_x, _hasNotepad # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_notepad" ] call FUNC(getMagIDs) ); }; -if (_hasPhoto isEqualType []) then { { [_x, _hasPhoto # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_photo" ] call FUNC(getMagIDs) ); }; \ No newline at end of file +if (_hasPhoto isEqualType []) then { { [_x, _hasPhoto # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_photo" ] call FUNC(getMagIDs) ); }; diff --git a/addons/wardrobe/functions/fnc_say3d.sqf b/addons/wardrobe/functions/fnc_say3d.sqf index 8f393fb3803..490a1d57eae 100644 --- a/addons/wardrobe/functions/fnc_say3d.sqf +++ b/addons/wardrobe/functions/fnc_say3d.sqf @@ -32,4 +32,4 @@ _sound params [ ]; -_source say3D [_className, _distance, _pitch, _isSpeech, _offSet, _simSpeedOfSound]; \ No newline at end of file +_source say3D [_className, _distance, _pitch, _isSpeech, _offSet, _simSpeedOfSound]; diff --git a/addons/wardrobe/functions/fnc_setIndexForMagID.sqf b/addons/wardrobe/functions/fnc_setIndexForMagID.sqf index ceb786cba20..9437afb73f3 100644 --- a/addons/wardrobe/functions/fnc_setIndexForMagID.sqf +++ b/addons/wardrobe/functions/fnc_setIndexForMagID.sqf @@ -22,4 +22,4 @@ params [ if (_index == -1) exitWith {}; -ace_intelItems_intelMap setVariable [_magID, _index, true]; \ No newline at end of file +ace_intelItems_intelMap setVariable [_magID, _index, true]; From f3f7b8e23af4026996e44d44f81a9922558bf5d4 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 4 Jan 2025 18:20:23 +0100 Subject: [PATCH 075/305] fnc headers and minor polish here and there --- addons/wardrobe/functions/fnc_addActions.sqf | 31 +++++++------ .../functions/fnc_addActions_children.sqf | 31 +++++++------ .../functions/fnc_addActions_condition.sqf | 27 ++++++------ .../functions/fnc_addCM_nextvariant.sqf | 27 ++++++------ addons/wardrobe/functions/fnc_cache_clear.sqf | 30 ++++++------- addons/wardrobe/functions/fnc_cache_db.sqf | 28 ++++++------ addons/wardrobe/functions/fnc_cache_get.sqf | 30 +++++++------ addons/wardrobe/functions/fnc_cache_set.sqf | 30 +++++++------ addons/wardrobe/functions/fnc_canModifyTo.sqf | 30 +++++++------ .../fnc_clearOnClosed_InteractionMenu.sqf | 30 +++++++------ .../functions/fnc_clearOnClosed_Inventory.sqf | 30 +++++++------ .../functions/fnc_compare_components.sqf | 30 +++++++------ .../fnc_compare_container_maxLoad.sqf | 27 ++++++------ .../wardrobe/functions/fnc_do_nextVariant.sqf | 42 ++++++++++-------- .../functions/fnc_enable_contextMenu.sqf | 27 ++++++------ .../wardrobe/functions/fnc_getAction_Icon.sqf | 29 ++++++------ .../wardrobe/functions/fnc_getAction_Name.sqf | 27 ++++++------ .../functions/fnc_getAllWardrobeItems.sqf | 36 ++++++++------- .../functions/fnc_getCfgDataRandom.sqf | 29 ++++++------ .../functions/fnc_getIndexFromMagID.sqf | 27 ++++++------ .../wardrobe/functions/fnc_getItems_all.sqf | 28 ++++++------ .../functions/fnc_getItems_modifiableTo.sqf | 27 ++++++------ .../functions/fnc_getItems_modifiable_all.sqf | 28 ++++++------ .../fnc_getItems_modifiable_current.sqf | 28 ++++++------ addons/wardrobe/functions/fnc_getMagIDs.sqf | 29 ++++++------ .../wardrobe/functions/fnc_getNextVariant.sqf | 33 ++++++++------ .../wardrobe/functions/fnc_isModifiable.sqf | 28 ++++++------ addons/wardrobe/functions/fnc_replace.sqf | 34 ++++++++------ .../functions/fnc_replace_facewear.sqf | 29 ++++++------ .../functions/fnc_replace_headgear.sqf | 33 ++++++++------ .../functions/fnc_replace_uniform.sqf | 32 ++++++++------ addons/wardrobe/functions/fnc_say3d.sqf | 44 ++++++++++++------- .../functions/fnc_setIndexForMagID.sqf | 28 ++++++------ addons/wardrobe/stringtable.xml | 8 ++++ 34 files changed, 554 insertions(+), 453 deletions(-) diff --git a/addons/wardrobe/functions/fnc_addActions.sqf b/addons/wardrobe/functions/fnc_addActions.sqf index 1fc3497ab8e..e31913e9208 100644 --- a/addons/wardrobe/functions/fnc_addActions.sqf +++ b/addons/wardrobe/functions/fnc_addActions.sqf @@ -1,20 +1,21 @@ #include "../script_component.hpp" /* -* Author: Zorn -* This function creates children for every modifiable Item. -* Each Modifiable Item will have its own children in regard of the items it can be changed towards. -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call cvo_fnc_sth -* -* Public: Yes -*/ + * Author: OverlordZorn + * This function creates children for the main wardrobe action - one for every modifiable Item. + * Each Modifiable Item will have its own children in regard of the items it can be changed towards. + * + * Arguments: + * 0: The Unit who's wearable shall be changed - usually the player themselves + * + * Return Value: + * Array of ACE Child Actions + * + * Example: + * [_player] call ace_wardrobe_fnc_addActions + * + * Public: No + */ params ["_unit"]; @@ -26,8 +27,6 @@ private _actions = []; private _className = configName _cfg; private _params = [_cfg, _x#1]; - diag_log format ['[CVO](debug)(fn_addActions) _cfg: %1', _cfg]; - private _aceAction = [ _className // * 0: Action name ,getText (_cfg >> "displayName") // * 1: Name of the action shown in the menu diff --git a/addons/wardrobe/functions/fnc_addActions_children.sqf b/addons/wardrobe/functions/fnc_addActions_children.sqf index 9c49a4e8c0a..5da634b9fd8 100644 --- a/addons/wardrobe/functions/fnc_addActions_children.sqf +++ b/addons/wardrobe/functions/fnc_addActions_children.sqf @@ -1,19 +1,24 @@ #include "../script_component.hpp" /* -* Author: Zorn -* Function to create the sub-children for each modifiable item -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * Function to create the ace action children, one for each possible variant of the current item. + * + * Arguments: + * 0: target + * 1: player + * 2: Multiple input types + * - 0: Current Variant + * - 1: Array of Configs Possible Variants + * + * Return Value: + * Array of ACE Child Actions + * + * Example: + * _this call ace_wardrobe_fnc_addActions_children + * + * Public: No + */ params ["_target", "_player", "_actionParams"]; _actionParams params ["_cfg_origin", "_newItems"]; diff --git a/addons/wardrobe/functions/fnc_addActions_condition.sqf b/addons/wardrobe/functions/fnc_addActions_condition.sqf index 27065980dd4..d4561680cba 100644 --- a/addons/wardrobe/functions/fnc_addActions_condition.sqf +++ b/addons/wardrobe/functions/fnc_addActions_condition.sqf @@ -1,19 +1,20 @@ #include "../script_component.hpp" /* -* Author: Zorn -* Function to check if the player has an item that can be modified. -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * Condition check: Is wardrobe enabled & if the player has an item that can be modified + * + * Arguments: + * 0: _player from the Ace Action + * + * Return Value: + * condition + * + * Example: + * [_player] call ace_wardrobe_fnc_addActions_condition + * + * Public: No + */ params ["_player"]; diff --git a/addons/wardrobe/functions/fnc_addCM_nextvariant.sqf b/addons/wardrobe/functions/fnc_addCM_nextvariant.sqf index 60fa1f9c0e0..95112dea49c 100644 --- a/addons/wardrobe/functions/fnc_addCM_nextvariant.sqf +++ b/addons/wardrobe/functions/fnc_addCM_nextvariant.sqf @@ -1,19 +1,20 @@ #include "../script_component.hpp" /* -* Author: Zorn -* Function to create the CM Option to switch to the "next" Variant of the current Version. -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * Function to create the CBA ContextMenu Option to switch to the (randomly choosen) next Variant of the current Version. + * + * Arguments: + * none + * + * Return Value: + * none + * + * Example: + * [] call ace_wardrobe_fnc_addCM_nextvariant + * + * Public: No + */ [ "#ALL", // filter items diff --git a/addons/wardrobe/functions/fnc_cache_clear.sqf b/addons/wardrobe/functions/fnc_cache_clear.sqf index 437d0a047f2..49785672c0e 100644 --- a/addons/wardrobe/functions/fnc_cache_clear.sqf +++ b/addons/wardrobe/functions/fnc_cache_clear.sqf @@ -1,22 +1,20 @@ #include "../script_component.hpp" /* -* Author: Zorn -* Function to clear an entry from the cache-database. -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ - - -// Retrieve hashmap + * Author: OverlordZorn + * Function to clear an entry from the cache-database. + * + * Arguments: + * 0: Key + * + * Return Value: + * none + * + * Example: + * ["myKey"] call ace_wardrobe_fnc_cache_clear + * + * Public: Yes + */ params [ ["_key", "", [""]] ]; diff --git a/addons/wardrobe/functions/fnc_cache_db.sqf b/addons/wardrobe/functions/fnc_cache_db.sqf index 81f5ffdc858..de4b9aa979e 100644 --- a/addons/wardrobe/functions/fnc_cache_db.sqf +++ b/addons/wardrobe/functions/fnc_cache_db.sqf @@ -1,21 +1,21 @@ #include "../script_component.hpp" /* -* Author: Zorn -* [Description] -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * Function to retrieve the Cache Database (Hashmap). + * + * Arguments: + * none + * + * Return Value: + * Cache Database + * + * Example: + * [] call ace_wardrobe_fnc_cache_db + * + * Public: No + */ -// Retrieve hashmap private _map = missionNamespace getVariable [QGVAR(cache), "404"]; diff --git a/addons/wardrobe/functions/fnc_cache_get.sqf b/addons/wardrobe/functions/fnc_cache_get.sqf index c95e3678013..da6a78399e3 100644 --- a/addons/wardrobe/functions/fnc_cache_get.sqf +++ b/addons/wardrobe/functions/fnc_cache_get.sqf @@ -1,19 +1,23 @@ #include "../script_component.hpp" /* -* Author: Zorn -* function to retrieve a value from the database. returns "404" if not stored or, when provided will execute the alternative code and store said result. -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * To retrieve a value from the database. returns "404" if not stored or, when provided, will execute the alternative code and return and store said result + * + * Arguments: + * 0: Key + * 1: Code to run when there is no value stored (optional) + * + * Return Value: + * Return or "404" if no entry found and no code provided + * + * + * Example: + * ["tag_loadout", { getUnitLoadout player }] call ace_wardrobe_fnc_cache_get + * + * Public: Yes + */ + params [ [ "_key", "", [""] ], [ "_else", "404", [{}] ] ]; diff --git a/addons/wardrobe/functions/fnc_cache_set.sqf b/addons/wardrobe/functions/fnc_cache_set.sqf index 89fcd5d5e8a..cb10a50a8c3 100644 --- a/addons/wardrobe/functions/fnc_cache_set.sqf +++ b/addons/wardrobe/functions/fnc_cache_set.sqf @@ -1,19 +1,23 @@ #include "../script_component.hpp" /* -* Author: Zorn -* Function to store a value into under a key into the addons cache -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * Function to store a value behind a key into the addons cache + * + * Arguments: + * 0: Key + * 1: Value + * + * Return Value: + * success + * + * Example: + * ['tag_myKey', ["some","data"]] call ace_wardrobe_fnc_cache_set + * + * Public: Yes + */ + + params [ ["_key", "", [""] ], ["_value", "404"] ]; diff --git a/addons/wardrobe/functions/fnc_canModifyTo.sqf b/addons/wardrobe/functions/fnc_canModifyTo.sqf index 033e4e4330f..8e7dfce0d88 100644 --- a/addons/wardrobe/functions/fnc_canModifyTo.sqf +++ b/addons/wardrobe/functions/fnc_canModifyTo.sqf @@ -1,19 +1,23 @@ #include "../script_component.hpp" /* -* Author: Zorn -* Check if the unit can modify from current to target. Checks and compares components. -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * Condition Check if the unit can modify from current variant to target variant. Checks and compares components. + * + * Arguments: + * 0: Unit + * 1: Current Variant + * 2: Desired Variant + * 3: Cache Result of fnc_getitems_all (default: true) + * + * Return Value: + * The return value + * + * Example: + * [_unit, _cfg_origin, _cfg_target] call ace_wardrobe_fnc_canModifyTo + * + * Public: No + */ params ["_unit", "_cfg_origin", "_cfg_target", ["_cache", true, [true]]]; diff --git a/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf b/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf index 03793f475f8..0f7dd2f23e7 100644 --- a/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf +++ b/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf @@ -1,20 +1,20 @@ #include "../script_component.hpp" /* -* Author: Zorn -* Function to request the clearing of the cache on closing of the menu -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ -// Cleanup Cache once the interaction menu is closed + * Author: OverlordZorn + * Function to request the clearing of the cache on closing of the menu + * + * Arguments: + * 0: The first argument + * + * Return Value: + * none + * + * Example: + * ["tag_myDataEntry"] call ace_wardrobe_fnc_clearOnClosed_InteractionMenu + * + * Public: yes + */ params [ ["_key", "", [""]] ]; @@ -37,3 +37,5 @@ if (_queue isEqualTo "404") then { }; _queue pushBackUnique _key; + +nil diff --git a/addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf b/addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf index 3f904d73179..8e5e1794b8c 100644 --- a/addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf +++ b/addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf @@ -1,20 +1,20 @@ #include "../script_component.hpp" /* -* Author: Zorn -* Function to request the clearing of the cache on closing of the menu -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ -// Cleanup Cache once the inventory is closed + * Author: OverlordZorn + * Function to request the clearing of the cache once the Inventory Window gets closed. + * + * Arguments: + * 0: Key + * + * Return Value: + * none + * + * Example: + * ["tag_myKeyName"] call ace_wardrobe_fnc_clearOnClosed_Inventory + * + * Public: yes + */ params [ ["_key", "", [""]] ]; @@ -33,3 +33,5 @@ if (_queue isEqualTo "404") then { }; _queue pushBackUnique _key; + +nil diff --git a/addons/wardrobe/functions/fnc_compare_components.sqf b/addons/wardrobe/functions/fnc_compare_components.sqf index c5790375553..184b5c3a34a 100644 --- a/addons/wardrobe/functions/fnc_compare_components.sqf +++ b/addons/wardrobe/functions/fnc_compare_components.sqf @@ -1,19 +1,23 @@ #include "../script_component.hpp" /* -* Author: Zorn -* Function to compare the components of the current and target wearables. -* -* Arguments: -* -* Return Value: -* Nested Array - [[missing components], [surplus components]] -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * Function to compare the components of the current and target wearables. + * + * Arguments: + * 0: current variant + * 1: desired variant + * + * Return Value: + * Nested array + * - Array of configs of missing components + * - Array of configs of surplus components + * + * Example: + * [_cfg_origin, _cfg_tgt] call ace_wardrobe_fnc_compare_components + * + * Public: No + */ params ["_cfg_origin", "_cfg_tgt"]; diff --git a/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf b/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf index ecdf3c52a45..ebb98125793 100644 --- a/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf +++ b/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf @@ -1,19 +1,20 @@ #include "../script_component.hpp" /* -* Author: Zorn -* This function will compare the maxLoad of all modifiable Items with its modifiableTo Variants and will provide an RPT output. -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * This function will compare the maxLoad of all modifiable Items with its modifiableTo Variants and will provide an RPT output. + * + * Arguments: + * none + * + * Return Value: + * none + * + * Example: + * [] call ace_wardrobe_fnc_compare_container_maxLoad + * + * Public: yes + */ // TODO diff --git a/addons/wardrobe/functions/fnc_do_nextVariant.sqf b/addons/wardrobe/functions/fnc_do_nextVariant.sqf index 1f3460c0af1..dd7ab23312d 100644 --- a/addons/wardrobe/functions/fnc_do_nextVariant.sqf +++ b/addons/wardrobe/functions/fnc_do_nextVariant.sqf @@ -1,19 +1,24 @@ #include "../script_component.hpp" /* -* Author: Zorn -* Function to Request the Next Variant Context Menu Action. -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * Statement of CBA Context Menu Entry - Request the Next Variant. + * + * Arguments: + * 0: Player + * 1: Container + * 2: Classname + * 3: Slot + * 4: Arguments + * + * Return Value: + * nothing + * + * Example: + * [_unit, _container, _item, _slot, _params] call ace_wardrobe_fnc_do_nextVariant + * + * Public: No + */ params ["_unit", "_container", "_item", "_slot", "_params"]; @@ -21,20 +26,19 @@ private _current_cfg = [_item] call cba_fnc_getItemConfig; private _cfg_tgt = [ _current_cfg ] call FUNC(getNextVariant); -if (_cfg_tgt isEqualTo false) exitWith { diag_log format ['[CVO](debug)(fn_do_nextVariant) "": %1', ""]; }; +if (_cfg_tgt isEqualTo false) exitWith {}; private _canModifyTo = [_unit, _current_cfg, _cfg_tgt, false] call FUNC(canModifyTo); if !(_canModifyTo) exitWith { - // error hint to player: cannot switch to next variant, try again - // TODO: Stringtable XML [ - ["Can not switch to:"], + [LLSTRING(cannotSwitchTo)], [getText (_cfg_tgt >> "displayName")], - ["missing components"], + [LLSTRING(missingComponents)], true ] call CBA_fnc_notify; }; - [_unit, _unit, [_current_cfg, _cfg_tgt], true] call FUNC(replace); + +nil diff --git a/addons/wardrobe/functions/fnc_enable_contextMenu.sqf b/addons/wardrobe/functions/fnc_enable_contextMenu.sqf index b5d8c8d8514..6e889462bd5 100644 --- a/addons/wardrobe/functions/fnc_enable_contextMenu.sqf +++ b/addons/wardrobe/functions/fnc_enable_contextMenu.sqf @@ -1,19 +1,20 @@ #include "../script_component.hpp" /* -* Author: Zorn -* Function to activate the Wardrobe related CBA Context Menu Options -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * CBA Setting - On Setting Changed - Function to activate the Wardrobe related CBA Context Menu Options + * + * Arguments: + * 0: CBA Setting Value + * + * Return Value: + * none + * + * Example: + * [true] call ace_wardrobe_fnc_enable_contextMenu + * + * Public: No + */ params [["_enable", true, [true]]]; diff --git a/addons/wardrobe/functions/fnc_getAction_Icon.sqf b/addons/wardrobe/functions/fnc_getAction_Icon.sqf index fcaedbce9e9..8cda6ab602a 100644 --- a/addons/wardrobe/functions/fnc_getAction_Icon.sqf +++ b/addons/wardrobe/functions/fnc_getAction_Icon.sqf @@ -1,21 +1,24 @@ #include "../script_component.hpp" /* -* Author: Zorn -* This Function checks if the Target Item has an Alternative Picture for the Action, if not, it returns the picture property -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * This Function checks if the Target Item has an alternative Picture for the Action, if not, it returns the picture property + * + * Arguments: + * 0: Config of desired Variant + * + * Return Value: + * Path to Icon or "" + * + * Example: + * [_cfg] call ace_wardrobe_fnc_getAction_Icon + * + * Public: No + */ params [ ["_cfg", configNull, [configNull] ] ]; +if (isNull _cfg) exitWith {}; + private _altDispIcon = getText (_cfg >> QADDON >> "alternativePicture"); if (_altDispIcon isEqualTo "") then { getText (_cfg >> "picture") } else { _altDispIcon } diff --git a/addons/wardrobe/functions/fnc_getAction_Name.sqf b/addons/wardrobe/functions/fnc_getAction_Name.sqf index 07aa658ec52..679d39ee4b8 100644 --- a/addons/wardrobe/functions/fnc_getAction_Name.sqf +++ b/addons/wardrobe/functions/fnc_getAction_Name.sqf @@ -1,19 +1,20 @@ #include "../script_component.hpp" /* -* Author: Zorn -* This Function checks if the Target Item has an Alternative String for the Action, if not, it returns the displayName property -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * This Function checks if the Target Item has an Alternative String for the Action, if not, it returns the displayName property + * + * Arguments: + * 0: Desired Variant + * + * Return Value: + * The return value + * + * Example: + * ['something', player] call ace_wardrobe_fnc_getAction_Name + * + * Public: No + */ params [ ["_cfg", configNull, [configNull] ] ]; diff --git a/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf b/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf index 1dedf396942..56c8239abe0 100644 --- a/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf +++ b/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf @@ -1,23 +1,25 @@ #include "../script_component.hpp" /* -* Author: Zorn -* Function to retrieve all Wardrobe Items. -* -* Arguments: -* -* Return Value: -* Nested Array of Classnames that have the wardrobe properties. One Entry per Cfg Group (currently just CfgWeapons) -* -* Example: -* [] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * Debug - Function to retrieve all existing Wardrobe items. + * + * Arguments: + * 0: Return as Config? + * + * Return Value: + * Array Wardobe Items, ether as Classname or as Config + * + * Example: + * [true] call ace_wardrobe_fnc_getAllWardrobeItems; + * [this, flatten ([] call ace_wardrobe_fnc_getAllWardrobeItems)] call ace_arsenal_fnc_initBox; + * + * Public: Yes + */ + params [["_asConfig", false, [true]]]; -[ - ["CfgWeapons", "CfgGlasses"] apply { ( QUOTE([_x] call FUNC(isModifiable)) configClasses (configFile >> _x) ) apply { configName _x } }, - ["CfgWeapons", "CfgGlasses"] apply { ( QUOTE([_x] call FUNC(isModifiable)) configClasses (configFile >> _x) ) } -] select _asConfig +private _return = ["CfgWeapons", "CfgGlasses"] apply { ( QUOTE([_x] call FUNC(isModifiable)) configClasses (configFile >> _x) ) }; + +if (_asConfig) then { _return apply { configName _x } } else { _return } diff --git a/addons/wardrobe/functions/fnc_getCfgDataRandom.sqf b/addons/wardrobe/functions/fnc_getCfgDataRandom.sqf index 7aa909cda22..9be9e65d03a 100644 --- a/addons/wardrobe/functions/fnc_getCfgDataRandom.sqf +++ b/addons/wardrobe/functions/fnc_getCfgDataRandom.sqf @@ -1,25 +1,28 @@ #include "../script_component.hpp" /* -* Author: Zorn -* This function extracts data from a config property. If it is an Array, it will select a random entry from the array, otherwise it will simply return the provided data. -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call cigs_wardrobe_fnc_getCfgDataRandom -* -* Public: No -*/ + * Author: OverlordZorn + * This function extracts data from a config property. If it is an Array, it will select a random entry from the array, otherwise it will simply return the provided data. + * + * Arguments: + * 0: configPath + * + * Return Value: + * Value + * + * Example: + * [_cfg] call ace_wardrobe_fnc_getCfgDataRandom + * + * Public: yes + */ params [ [ "_cfg", configNull, [configNull] ] ]; if (_cfg isEqualTo configNull) exitWith {nil}; + private _data = [_cfg] call BIS_fnc_getCfgData; if (_data isEqualType []) then { _data = selectRandom _data }; + _data diff --git a/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf index 52ebdac03ea..20aca66709d 100644 --- a/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf +++ b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf @@ -1,19 +1,20 @@ #include "../script_component.hpp" /* -* Author: Zorn -* function to return the data index based of the magazine ID -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * function to return the data index based of the magazine ID + * + * Arguments: + * 0: magazine ID + * + * Return Value: + * The return value + * + * Example: + * [_magID] call ace_wardrobe_fnc_getIndexFromMagID + * + * Public: Yes + */ params [ ["_magazineID", "", [""] ] diff --git a/addons/wardrobe/functions/fnc_getItems_all.sqf b/addons/wardrobe/functions/fnc_getItems_all.sqf index 4c980f045ee..44166f9ce0c 100644 --- a/addons/wardrobe/functions/fnc_getItems_all.sqf +++ b/addons/wardrobe/functions/fnc_getItems_all.sqf @@ -1,19 +1,21 @@ #include "../script_component.hpp" /* -* Author: Zorn -* Retrieves a list of items on the user - will be cached for the duration of the interaction. -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * Retrieves a list of all items of unit - can be cached for the duration of the ace interaction. + * + * Arguments: + * 0: Unit + * 1: Cache Return? + * + * Return Value: + * All Items of the Unit + * + * Example: + * [player, false] call ace_wardrobe_fnc_getItems_all + * + * Public: No + */ params [ ["_unit", objNull, [objNull]], diff --git a/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf b/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf index 5706ea34f03..bbfef931543 100644 --- a/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf +++ b/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf @@ -1,19 +1,20 @@ #include "../script_component.hpp" /* -* Author: Zorn -* Function to return an array the config of desired target items. Also checks if those items exist: CBA_fnc_getItemConfig returns configNull when item not found. -* -* Arguments: -* -* Return Value: -* Array of Configs - Available Target configs -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * Function to return an array the config of desired target items. Also checks if those items exist: CBA_fnc_getItemConfig returns configNull when item not found. + * + * Arguments: + * 0: Current Variant + * + * Return Value: + * Array of all possible variants as config + * + * Example: + * [_cfg_current] call ace_wardrobe_fnc_getItems_modifiableTo + * + * Public: No + */ params ["_cfg_current"]; diff --git a/addons/wardrobe/functions/fnc_getItems_modifiable_all.sqf b/addons/wardrobe/functions/fnc_getItems_modifiable_all.sqf index 2bc1ab1ac5c..b2947210596 100644 --- a/addons/wardrobe/functions/fnc_getItems_modifiable_all.sqf +++ b/addons/wardrobe/functions/fnc_getItems_modifiable_all.sqf @@ -1,19 +1,21 @@ #include "../script_component.hpp" /* -* Author: Zorn -* Function to retrieve modifiable items. Cached Array for the duration of the interaction menu. -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * Function to retrieve modifiable items of a unit. Can be cached for the duration of the interaction menu. + * + * Arguments: + * 0: Unit + * 1: Cache Return? + * + * Return Value: + * modifiable Items of the Unit + * + * Example: + * [player, false] call ace_wardrobe_fnc_getItems_modifiable_all + * + * Public: Yes + */ params [ ["_unit", objNull, [objNull]], diff --git a/addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf b/addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf index 59df6c4c359..327277fe24c 100644 --- a/addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf +++ b/addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf @@ -1,19 +1,21 @@ #include "../script_component.hpp" /* -* Author: Zorn -* Function to retrieve currently worn, modifiable items. Cached Array for the duration of the interaction menu. -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * Function to retrieve currently worn, modifiable items. Return can be cached for the duration of the interaction menu. + * + * Arguments: + * 0: Unit + * 1: Cache Return? + * + * Return Value: + * modifiable Items of the Unit + * + * Example: + * [player, false] call ace_wardrobe_fnc_getItems_modifiable_current + * + * Public: Yes + */ params [ ["_unit", objNull, [objNull]], diff --git a/addons/wardrobe/functions/fnc_getMagIDs.sqf b/addons/wardrobe/functions/fnc_getMagIDs.sqf index 34506224033..d0b221c84d7 100644 --- a/addons/wardrobe/functions/fnc_getMagIDs.sqf +++ b/addons/wardrobe/functions/fnc_getMagIDs.sqf @@ -1,19 +1,22 @@ #include "../script_component.hpp" /* -* Author: Zorn -* function to return the magazine ID's of certain magazines -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * Function to return the magazine ID's of certain magazines + * + * Arguments: + * 0: Unit + * 1: Classname + * + * Return Value: + * Strings of Magazines IDs + * + * Example: + * [_unit, _className] call ace_wardrobe_fnc_getMagIDs; + * + * Public: No + */ + params [ ["_unit", objNull, [objNull] ], diff --git a/addons/wardrobe/functions/fnc_getNextVariant.sqf b/addons/wardrobe/functions/fnc_getNextVariant.sqf index 9340d186726..5ff9894fa3f 100644 --- a/addons/wardrobe/functions/fnc_getNextVariant.sqf +++ b/addons/wardrobe/functions/fnc_getNextVariant.sqf @@ -1,19 +1,23 @@ #include "../script_component.hpp" /* -* Author: Zorn -* function to return cfg the next variant. the choosen variant will be added to a gvar of previous variants. the array of possible variants has been exhausted, it will remove all possible variants from the backlog and start new. -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * Context Menu - Return config the "next" variant - if multiple Variants are defined, it will choose randomly. + * Maintains a Histroy of the current and chosen variants as long as the Inventory is open. + * Already used variants from the History will be removed from the availabe options. + * Once all options have been exhausted, the history will be purged and start over. + * + * Arguments: + * 0: Current Variant + * + * Return Value: + * Desired Variant + * + * Example: + * [_cfg_current] call ace_wardrobe_fnc_getNextVariant + * + * Public: No + */ params ["_cfg_current"]; @@ -45,7 +49,8 @@ private _remaining = _modifiableTo_cfg - _history_cfg; private _return = if (count _remaining > 0) then { selectRandom _remaining } else { - _history_cfg = []; // _history_cfg select { !(_x in _modifiableTo_cfg) }; + // _history_cfg select { !(_x in _modifiableTo_cfg) }; + _history_cfg = []; missionNamespace setVariable [QGVAR(variant_history_cfg), [] ]; _history_cfg pushBackUnique _cfg_current; selectRandom _modifiableTo_cfg; diff --git a/addons/wardrobe/functions/fnc_isModifiable.sqf b/addons/wardrobe/functions/fnc_isModifiable.sqf index e4a824cf964..54d3ab4c9d4 100644 --- a/addons/wardrobe/functions/fnc_isModifiable.sqf +++ b/addons/wardrobe/functions/fnc_isModifiable.sqf @@ -1,19 +1,21 @@ #include "../script_component.hpp" /* -* Author: Zorn -* function to check if the this item is modifiable - returns boolean -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * Function to check if the provided wearable Item (Config) item is defined as a modifiable Wardrobe Item. + * Will not return true on fully inherited "ace_wardrobe" subclass + * + * Arguments: + * 0: Wearable Item + * + * Return Value: + * The return value + * + * Example: + * [_cfg] call ace_wardrobe_fnc_isModifiable + * + * Public: No + */ params [ ["_cfg", configNull, [configNull] ] diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index b940831c938..450d9430eb7 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -1,19 +1,25 @@ #include "../script_component.hpp" /* -* Author: Zorn -* function to removes the modifiableItem and replaces it with the target item -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * Ace Action Statement - Removes the modifiableItem and replaces it with the target item + * + * Arguments: + * 0: Action Target + * 1: Action Player + * 2: Action Params + * - 0: Current Variant + * - 0: Desired Variant + * 3: Replace Now? + * + * Return Value: + * none + * + * Example: + * _this call ace_wardrobe_fnc_replace + * + * Public: No + */ params ["_target", "_unit", "_actionParams", ["_replaceNow", false, [true]]]; _actionParams params ["_cfg_origin", "_cfg_tgt"]; @@ -66,3 +72,5 @@ if (_sound != "") then { [ CBA_fnc_globalEvent, [QGVAR(EH_say3d), [_unit, _sound private _notify_img = getText (_cfg_tgt >> "picture"); if !(".paa" in _notify_img) then { _notify_img = [_notify_img,"paa"] joinString "." }; [ CBA_fnc_notify, [[ _notify_img, 4], [getText (_cfg_tgt >> "displayName")], true ], _duration * 1.2 ] call CBA_fnc_waitAndExecute; + +nil diff --git a/addons/wardrobe/functions/fnc_replace_facewear.sqf b/addons/wardrobe/functions/fnc_replace_facewear.sqf index bc9fe45459d..3dcfcb4fa2f 100644 --- a/addons/wardrobe/functions/fnc_replace_facewear.sqf +++ b/addons/wardrobe/functions/fnc_replace_facewear.sqf @@ -1,19 +1,22 @@ #include "../script_component.hpp" /* -* Author: Zorn -* Function to replace a persons goggles/facewear. -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * Function to replace a persons goggles/facewear. + * + * Arguments: + * 0: Unit + * 1: Current Variant + * 2: Desired Variant + * + * Return Value: + * none + * + * Example: + * [_player, _cfg_origin, _cfg_tgt] call ace_wardrobe_fnc_replace_facewear + * + * Public: No + */ params ["_player", "_cfg_origin", "_cfg_tgt"]; removeGoggles _player; diff --git a/addons/wardrobe/functions/fnc_replace_headgear.sqf b/addons/wardrobe/functions/fnc_replace_headgear.sqf index dd30b6bf9ea..8b22d5ec403 100644 --- a/addons/wardrobe/functions/fnc_replace_headgear.sqf +++ b/addons/wardrobe/functions/fnc_replace_headgear.sqf @@ -1,20 +1,27 @@ #include "../script_component.hpp" /* -* Author: Zorn -* Function to replace a persons Headgear/Helmet slot. -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * Function to replace a persons Headgear/Helmet slot. + * + * Arguments: + * 0: Unit + * 1: Current Variant + * 2: Desired Variant + * + * Return Value: + * none + * + * Example: + * [_player, _cfg_origin, _cfg_tgt] call ace_wardrobe_fnc_replace_headgear + * + * Public: No + */ params ["_player", "_cfg_origin", "_cfg_tgt"]; removeHeadgear _player; _player addHeadgear configName _cfg_tgt; + + + + diff --git a/addons/wardrobe/functions/fnc_replace_uniform.sqf b/addons/wardrobe/functions/fnc_replace_uniform.sqf index ccda6137bdd..47d724a0d48 100644 --- a/addons/wardrobe/functions/fnc_replace_uniform.sqf +++ b/addons/wardrobe/functions/fnc_replace_uniform.sqf @@ -1,19 +1,23 @@ #include "../script_component.hpp" /* -* Author: Zorn -* Function to replace a persons Uniform while maintaining the content of the uniform. -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * Function to replace a persons Uniform while maintaining the content of the uniform. + * + * Arguments: + * 0: Unit + * 1: Current Variant + * 2: Desired Variant + * 2: Type of Wearable Container + * + * Return Value: + * none + * + * Example: + * [_player, _cfg_origin, _cfg_tgt, _case] call ace_wardrobe_fnc_replace_uniform + * + * Public: No + */ params ["_player", "_cfg_origin", "_cfg_tgt", "_case"]; @@ -39,7 +43,7 @@ switch (_case) do { case "UNIFORM": { _loadout # 0 # 3 set [0, configName _cfg_tgt]; }; case "VEST": { _loadout # 0 # 4 set [0, configName _cfg_tgt]; }; case "BACKPACK": { _loadout # 0 # 5 set [0, configName _cfg_tgt]; }; - default { diag_log format ['[CVO](debug)(fn_replace_uniform) Failed! - _case: %1', _case]; }; + default { ERROR_1("Case undefined: %1",_case); }; }; // Apply new Loadout diff --git a/addons/wardrobe/functions/fnc_say3d.sqf b/addons/wardrobe/functions/fnc_say3d.sqf index 490a1d57eae..8958ad1a1e8 100644 --- a/addons/wardrobe/functions/fnc_say3d.sqf +++ b/addons/wardrobe/functions/fnc_say3d.sqf @@ -1,30 +1,40 @@ #include "../script_component.hpp" /* -* Author: Zorn -* Function to execute say3d globally - triggered as 3cba event. -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * CBA Event: "ace_wardrobe_eh_say3d" + * Function to use say3D + * If not defined otherwise, the Pitch will be randomised between 95% to 105% + * + * Arguments: + * 0: Sound Source + * 1: CfgSound Classname or Parameter Array + * - 0: CfgSound Classname + * - 1: distance in meters (default: 50) + * - 2: pitch (default: random from 0.95 to 1.05) + * - 3: is Speech (default: false) + * - 4: offset (default: 0) + * - 4: Simulate Speed of Sound (default: false) + * + * Return Value: + * none + * + * Example: + * [player, "ace_horny_bonk"] call ace_wardrobe_fnc_say3d + * + * Public: No + */ params [ - ["_source", objNull, [objNull] ], - ["_sound", [""], ["", []] ] + ["_source", objNull, [objNull] ], + ["_sound", [""], ["", []] ] ]; if (_sound isEqualType [] && {_sound#0 == ""} || {_sound isEqualType "" && {_sound == ""}}) exitWith {}; _sound params [ "_className", -["_distance", 25, [0] ], +["_distance", 50, [0] ], ["_pitch", 0.95 + random 0.1, [0] ], ["_isSpeech", false, [false, 0] ], ["_offSet", 0, [0] ], @@ -33,3 +43,5 @@ _sound params [ _source say3D [_className, _distance, _pitch, _isSpeech, _offSet, _simSpeedOfSound]; + +nil diff --git a/addons/wardrobe/functions/fnc_setIndexForMagID.sqf b/addons/wardrobe/functions/fnc_setIndexForMagID.sqf index 9437afb73f3..72d917aaeb4 100644 --- a/addons/wardrobe/functions/fnc_setIndexForMagID.sqf +++ b/addons/wardrobe/functions/fnc_setIndexForMagID.sqf @@ -1,19 +1,21 @@ #include "../script_component.hpp" /* -* Author: Zorn -* This function sets the data-index for a magID -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ + * Author: OverlordZorn + * Sets the data-index for a magID + * + * Arguments: + * 0: Magazine ID + * 1: Index + * + * Return Value: + * none + * + * Example: + * [_magID, _index] call ace_wardrobe_fnc_setIndexForMagID + * + * Public: No + */ params [ ["_magID", "", [""] ], diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml index 12b8f41893f..785bfd2d19d 100644 --- a/addons/wardrobe/stringtable.xml +++ b/addons/wardrobe/stringtable.xml @@ -53,5 +53,13 @@ Visor up + + + Cannot switch to + + + due to missing components + + \ No newline at end of file From 058d390f6fb3f47ec7d588801b27dd8237e59cbe Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 4 Jan 2025 18:24:13 +0100 Subject: [PATCH 076/305] disabled - to be deleted later --- addons/wardrobe/CfgFunctions.hpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/wardrobe/CfgFunctions.hpp b/addons/wardrobe/CfgFunctions.hpp index 041980f8351..20ab848e801 100644 --- a/addons/wardrobe/CfgFunctions.hpp +++ b/addons/wardrobe/CfgFunctions.hpp @@ -1,3 +1,4 @@ +/* class CfgFunctions { class ADDON @@ -85,4 +86,5 @@ class CfgFunctions class getNextVariant {}; }; }; -}; \ No newline at end of file +}; +*/ \ No newline at end of file From f0a34e1cd29a96826f4f802cb0e86c9937800956 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 4 Jan 2025 18:28:13 +0100 Subject: [PATCH 077/305] WIP - Documentation --- addons/wardrobe/Baseclass.hpp | 5 +- docs/wiki/framework/wardrobe-framework.md | 138 ++++++++++++++++++++++ 2 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 docs/wiki/framework/wardrobe-framework.md diff --git a/addons/wardrobe/Baseclass.hpp b/addons/wardrobe/Baseclass.hpp index c2d070e179d..d968aa0e4b3 100644 --- a/addons/wardrobe/Baseclass.hpp +++ b/addons/wardrobe/Baseclass.hpp @@ -1,8 +1,9 @@ #define CN_SOUND(base,dur) QUOTE(TRIPLES(ADDON,base,dur)) class GVAR(base) { + modifiableTo[] = {""}; - // ## WIP ## + // describes the components of the current item. // When the current wearable is being changed into something, that does not have these components[] = {}; @@ -66,4 +67,4 @@ class GVAR(base_H_visor_down): GVAR(base) { sound_timing = 0; alternativeDisplayName = CSTRING(visorDown); -}; \ No newline at end of file +}; diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md new file mode 100644 index 00000000000..1f896f27adc --- /dev/null +++ b/docs/wiki/framework/wardrobe-framework.md @@ -0,0 +1,138 @@ +--- +layout: wiki +title: Wardrobe Framework +description: Explains the wardrobe system and how to make a compat. +group: framework +order: 5 +parent: wiki +mod: ace +version: + major: 3 + minor: 18 + patch: 2 +--- + + +## 1. Overview + +## 2. Config + +- Only directly defined Subclasses will be taken into account. An fully inherited subclass will be ignored and will not provide an Interaction. + +## 2.1 Properties + +### 2.2 Base Classes + +#### 2.2.1 Base + +#### 2.2.2 Base Uniform Sleeves Up / Down + +#### 2.2.3 Base Uniform Gloves On / Off + +#### 2.2.4 Base Uniform Jacket Open / Closed + +#### 2.2.4 Base Helmet Visor Up / Down + + +## 3. Examples + +### 3.1 Linear Example + +### 3.2 Advanced Example (Components) + + +## 4. Sounds + + + +### 4.1 Integrated Sounds + + + + + + + + \ No newline at end of file From 6e06b8657a5787107bc224f9a43a0da26f0bd549 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 4 Jan 2025 18:52:49 +0100 Subject: [PATCH 078/305] postInit -> XEH --- addons/wardrobe/CfgEventHandlers.hpp | 7 ++++++- addons/wardrobe/XEH_PREP.hpp | 1 - addons/wardrobe/XEH_postInit.sqf | 3 +++ addons/wardrobe/functions/fnc_postInit.sqf | 18 ------------------ 4 files changed, 9 insertions(+), 20 deletions(-) create mode 100644 addons/wardrobe/XEH_postInit.sqf delete mode 100644 addons/wardrobe/functions/fnc_postInit.sqf diff --git a/addons/wardrobe/CfgEventHandlers.hpp b/addons/wardrobe/CfgEventHandlers.hpp index 82da8b574b8..2f9c48aa546 100644 --- a/addons/wardrobe/CfgEventHandlers.hpp +++ b/addons/wardrobe/CfgEventHandlers.hpp @@ -1,6 +1,11 @@ -// No need to change anything here class Extended_PreInit_EventHandlers { class ADDON { init = QUOTE(call COMPILE_FILE(XEH_preInit)); }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); + }; }; \ No newline at end of file diff --git a/addons/wardrobe/XEH_PREP.hpp b/addons/wardrobe/XEH_PREP.hpp index a2c61927671..af8f2e73336 100644 --- a/addons/wardrobe/XEH_PREP.hpp +++ b/addons/wardrobe/XEH_PREP.hpp @@ -1,4 +1,3 @@ -PREP(postInit); PREP(isModifiable); PREP(compare_components); PREP(canModifyTo); diff --git a/addons/wardrobe/XEH_postInit.sqf b/addons/wardrobe/XEH_postInit.sqf new file mode 100644 index 00000000000..3658433d5fe --- /dev/null +++ b/addons/wardrobe/XEH_postInit.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +[ QGVAR(EH_say3d), FUNC(say3d) ] call CBA_fnc_addEventHandler; diff --git a/addons/wardrobe/functions/fnc_postInit.sqf b/addons/wardrobe/functions/fnc_postInit.sqf deleted file mode 100644 index ab84300a4e3..00000000000 --- a/addons/wardrobe/functions/fnc_postInit.sqf +++ /dev/null @@ -1,18 +0,0 @@ -#include "../script_component.hpp" - -/* -* Author: Zorn -* [Description] -* -* Arguments: -* -* Return Value: -* None -* -* Example: -* ['something', player] call prefix_component_fnc_functionname -* -* Public: No -*/ - -[ QGVAR(EH_say3d), FUNC(say3d) ] call CBA_fnc_addEventHandler; From a6d3528e031a15a365ca36bfc5a47aa00cee537e Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 4 Jan 2025 18:53:04 +0100 Subject: [PATCH 079/305] none -> None --- addons/wardrobe/functions/fnc_addCM_nextvariant.sqf | 4 ++-- addons/wardrobe/functions/fnc_cache_clear.sqf | 2 +- addons/wardrobe/functions/fnc_cache_db.sqf | 2 +- addons/wardrobe/functions/fnc_cache_get.sqf | 2 +- .../wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf | 2 +- addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf | 2 +- addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf | 4 ++-- addons/wardrobe/functions/fnc_enable_contextMenu.sqf | 2 +- addons/wardrobe/functions/fnc_replace.sqf | 2 +- addons/wardrobe/functions/fnc_replace_facewear.sqf | 2 +- addons/wardrobe/functions/fnc_replace_headgear.sqf | 2 +- addons/wardrobe/functions/fnc_replace_uniform.sqf | 2 +- addons/wardrobe/functions/fnc_say3d.sqf | 2 +- addons/wardrobe/functions/fnc_setIndexForMagID.sqf | 2 +- 14 files changed, 16 insertions(+), 16 deletions(-) diff --git a/addons/wardrobe/functions/fnc_addCM_nextvariant.sqf b/addons/wardrobe/functions/fnc_addCM_nextvariant.sqf index 95112dea49c..62ceb2dacf0 100644 --- a/addons/wardrobe/functions/fnc_addCM_nextvariant.sqf +++ b/addons/wardrobe/functions/fnc_addCM_nextvariant.sqf @@ -5,10 +5,10 @@ * Function to create the CBA ContextMenu Option to switch to the (randomly choosen) next Variant of the current Version. * * Arguments: - * none + * None * * Return Value: - * none + * None * * Example: * [] call ace_wardrobe_fnc_addCM_nextvariant diff --git a/addons/wardrobe/functions/fnc_cache_clear.sqf b/addons/wardrobe/functions/fnc_cache_clear.sqf index 49785672c0e..8f6bd0b7133 100644 --- a/addons/wardrobe/functions/fnc_cache_clear.sqf +++ b/addons/wardrobe/functions/fnc_cache_clear.sqf @@ -8,7 +8,7 @@ * 0: Key * * Return Value: - * none + * None * * Example: * ["myKey"] call ace_wardrobe_fnc_cache_clear diff --git a/addons/wardrobe/functions/fnc_cache_db.sqf b/addons/wardrobe/functions/fnc_cache_db.sqf index de4b9aa979e..0945178049c 100644 --- a/addons/wardrobe/functions/fnc_cache_db.sqf +++ b/addons/wardrobe/functions/fnc_cache_db.sqf @@ -5,7 +5,7 @@ * Function to retrieve the Cache Database (Hashmap). * * Arguments: - * none + * None * * Return Value: * Cache Database diff --git a/addons/wardrobe/functions/fnc_cache_get.sqf b/addons/wardrobe/functions/fnc_cache_get.sqf index da6a78399e3..9f43e97094c 100644 --- a/addons/wardrobe/functions/fnc_cache_get.sqf +++ b/addons/wardrobe/functions/fnc_cache_get.sqf @@ -6,7 +6,7 @@ * * Arguments: * 0: Key - * 1: Code to run when there is no value stored (optional) + * 1: Code to run when there is no value stored (optional) * * Return Value: * Return or "404" if no entry found and no code provided diff --git a/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf b/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf index 0f7dd2f23e7..e795c710f0d 100644 --- a/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf +++ b/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf @@ -8,7 +8,7 @@ * 0: The first argument * * Return Value: - * none + * None * * Example: * ["tag_myDataEntry"] call ace_wardrobe_fnc_clearOnClosed_InteractionMenu diff --git a/addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf b/addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf index 8e5e1794b8c..63ce6cddfc1 100644 --- a/addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf +++ b/addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf @@ -8,7 +8,7 @@ * 0: Key * * Return Value: - * none + * None * * Example: * ["tag_myKeyName"] call ace_wardrobe_fnc_clearOnClosed_Inventory diff --git a/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf b/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf index ebb98125793..c818edfdf6e 100644 --- a/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf +++ b/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf @@ -5,10 +5,10 @@ * This function will compare the maxLoad of all modifiable Items with its modifiableTo Variants and will provide an RPT output. * * Arguments: - * none + * None * * Return Value: - * none + * None * * Example: * [] call ace_wardrobe_fnc_compare_container_maxLoad diff --git a/addons/wardrobe/functions/fnc_enable_contextMenu.sqf b/addons/wardrobe/functions/fnc_enable_contextMenu.sqf index 6e889462bd5..67f2d7f6221 100644 --- a/addons/wardrobe/functions/fnc_enable_contextMenu.sqf +++ b/addons/wardrobe/functions/fnc_enable_contextMenu.sqf @@ -8,7 +8,7 @@ * 0: CBA Setting Value * * Return Value: - * none + * None * * Example: * [true] call ace_wardrobe_fnc_enable_contextMenu diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 450d9430eb7..84ccd4e7d52 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -13,7 +13,7 @@ * 3: Replace Now? * * Return Value: - * none + * None * * Example: * _this call ace_wardrobe_fnc_replace diff --git a/addons/wardrobe/functions/fnc_replace_facewear.sqf b/addons/wardrobe/functions/fnc_replace_facewear.sqf index 3dcfcb4fa2f..0d6eec65d1b 100644 --- a/addons/wardrobe/functions/fnc_replace_facewear.sqf +++ b/addons/wardrobe/functions/fnc_replace_facewear.sqf @@ -10,7 +10,7 @@ * 2: Desired Variant * * Return Value: - * none + * None * * Example: * [_player, _cfg_origin, _cfg_tgt] call ace_wardrobe_fnc_replace_facewear diff --git a/addons/wardrobe/functions/fnc_replace_headgear.sqf b/addons/wardrobe/functions/fnc_replace_headgear.sqf index 8b22d5ec403..5a3592b61c6 100644 --- a/addons/wardrobe/functions/fnc_replace_headgear.sqf +++ b/addons/wardrobe/functions/fnc_replace_headgear.sqf @@ -10,7 +10,7 @@ * 2: Desired Variant * * Return Value: - * none + * None * * Example: * [_player, _cfg_origin, _cfg_tgt] call ace_wardrobe_fnc_replace_headgear diff --git a/addons/wardrobe/functions/fnc_replace_uniform.sqf b/addons/wardrobe/functions/fnc_replace_uniform.sqf index 47d724a0d48..c67c247a3f0 100644 --- a/addons/wardrobe/functions/fnc_replace_uniform.sqf +++ b/addons/wardrobe/functions/fnc_replace_uniform.sqf @@ -11,7 +11,7 @@ * 2: Type of Wearable Container * * Return Value: - * none + * None * * Example: * [_player, _cfg_origin, _cfg_tgt, _case] call ace_wardrobe_fnc_replace_uniform diff --git a/addons/wardrobe/functions/fnc_say3d.sqf b/addons/wardrobe/functions/fnc_say3d.sqf index 8958ad1a1e8..edb261dfa8a 100644 --- a/addons/wardrobe/functions/fnc_say3d.sqf +++ b/addons/wardrobe/functions/fnc_say3d.sqf @@ -17,7 +17,7 @@ * - 4: Simulate Speed of Sound (default: false) * * Return Value: - * none + * None * * Example: * [player, "ace_horny_bonk"] call ace_wardrobe_fnc_say3d diff --git a/addons/wardrobe/functions/fnc_setIndexForMagID.sqf b/addons/wardrobe/functions/fnc_setIndexForMagID.sqf index 72d917aaeb4..e24a9cfaf46 100644 --- a/addons/wardrobe/functions/fnc_setIndexForMagID.sqf +++ b/addons/wardrobe/functions/fnc_setIndexForMagID.sqf @@ -9,7 +9,7 @@ * 1: Index * * Return Value: - * none + * None * * Example: * [_magID, _index] call ace_wardrobe_fnc_setIndexForMagID From 1350da1053fbefa7e0f2578d59986b9913e03b4a Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Sat, 4 Jan 2025 19:21:36 +0100 Subject: [PATCH 080/305] Update addons/wardrobe/stringtable.xml Co-authored-by: Grim <69561145+LinkIsGrim@users.noreply.github.com> --- addons/wardrobe/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml index 785bfd2d19d..5d7dc67ef74 100644 --- a/addons/wardrobe/stringtable.xml +++ b/addons/wardrobe/stringtable.xml @@ -9,7 +9,7 @@ - Enable ACE Interaction + ACE Interaction Aktivieren ACE Interaction From 10265a0024fca9859b68387eeb80648b069e5b0a Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Sat, 4 Jan 2025 19:22:24 +0100 Subject: [PATCH 081/305] Update addons/wardrobe/stringtable.xml Co-authored-by: Grim <69561145+LinkIsGrim@users.noreply.github.com> --- addons/wardrobe/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml index 5d7dc67ef74..babc3bd2d13 100644 --- a/addons/wardrobe/stringtable.xml +++ b/addons/wardrobe/stringtable.xml @@ -16,7 +16,7 @@ When Enabled, will let the player use the Wardrobe related Ace Interactions. - Enable + CBA Context Menu Aktiviere CBA Context Menu From 68609e65211499b5b0ff10ea745e9171e819f3e2 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 4 Jan 2025 19:36:34 +0100 Subject: [PATCH 082/305] Drop Unneeded Description --- addons/wardrobe/initSettings.inc.sqf | 4 ++-- addons/wardrobe/stringtable.xml | 6 ------ 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/addons/wardrobe/initSettings.inc.sqf b/addons/wardrobe/initSettings.inc.sqf index c6869b5192b..d22a804bebc 100644 --- a/addons/wardrobe/initSettings.inc.sqf +++ b/addons/wardrobe/initSettings.inc.sqf @@ -1,7 +1,7 @@ [ QSET(enable_action), "CHECKBOX", - SETLSTRING(enable_action), + LSTRING(enable_action), [LSTRING(set_cat_main)], true, 1, @@ -12,7 +12,7 @@ [ QSET(enable_contextMenu), "CHECKBOX", - SETLSTRING(enable_contextMenu), + LSTRING(enable_contextMenu), [LSTRING(set_cat_main)], true, 1, diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml index babc3bd2d13..84f23ebba4e 100644 --- a/addons/wardrobe/stringtable.xml +++ b/addons/wardrobe/stringtable.xml @@ -12,16 +12,10 @@ ACE Interaction Aktivieren ACE Interaction - - When Enabled, will let the player use the Wardrobe related Ace Interactions. - CBA Context Menu Aktiviere CBA Context Menu - - When Enabled, will let the player use the Wardrobe related CBA Context Menu Options.<br/>Can be enabled at any time, but requires restart to disable. - From e30dc2a147c6d7c93f7f9f28c28b1384fc6a7d59 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 4 Jan 2025 19:39:39 +0100 Subject: [PATCH 083/305] ACE_SpareBarrel - needs testing --- addons/wardrobe/functions/fnc_replace_uniform.sqf | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/addons/wardrobe/functions/fnc_replace_uniform.sqf b/addons/wardrobe/functions/fnc_replace_uniform.sqf index c67c247a3f0..4983e92fa30 100644 --- a/addons/wardrobe/functions/fnc_replace_uniform.sqf +++ b/addons/wardrobe/functions/fnc_replace_uniform.sqf @@ -36,6 +36,10 @@ if (_hasDocument) then { _hasDocument = [_player, "acex_intelitems_document" ] c if (_hasNotepad) then { _hasNotepad = [_player, "acex_intelitems_notepad" ] call FUNC(getMagIDs) apply { [_x] call FUNC(getIndexFromMagID) } }; if (_hasPhoto) then { _hasPhoto = [_player, "acex_intelitems_photo" ] call FUNC(getMagIDs) apply { [_x] call FUNC(getIndexFromMagID) } }; +// ACE Overheating +private _hasSpareBarrel = _magazineDetails findIf { _x#0 == "ACE_SpareBarrel" } > -1; +if (_hasSpareBarrel) then { _hasSpareBarrel = [_player, "ACE_SpareBarrel" ] call FUNC(getMagIDs) apply { [_x] call FUNC(getIndexFromMagID) } }; + //// Replace Wearable // Change Wearable @@ -54,3 +58,6 @@ switch (_case) do { if (_hasDocument isEqualType []) then { { [_x, _hasDocument # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_document" ] call FUNC(getMagIDs) ); }; if (_hasNotepad isEqualType []) then { { [_x, _hasNotepad # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_notepad" ] call FUNC(getMagIDs) ); }; if (_hasPhoto isEqualType []) then { { [_x, _hasPhoto # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_photo" ] call FUNC(getMagIDs) ); }; + +// ACE Overheating +if (_hasSpareBarrel isEqualType []) then { { [_x, _hasSpareBarrel # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "ACE_SpareBarrel" ] call FUNC(getMagIDs) ); }; From 3bcff1ec07e750f5896c7ab819ee56ac3a8915f4 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Sat, 4 Jan 2025 23:15:58 +0100 Subject: [PATCH 084/305] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- docs/wiki/framework/wardrobe-framework.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index 1f896f27adc..4f7d31b2e2a 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -17,7 +17,7 @@ version: ## 2. Config -- Only directly defined Subclasses will be taken into account. An fully inherited subclass will be ignored and will not provide an Interaction. +- Only directly defined Subclasses will be taken into account. A fully inherited subclass will be ignored and will not provide an Interaction. ## 2.1 Properties @@ -104,8 +104,8 @@ class ACE_Tags { ### 2.2 Tags in description.ext -Tags can also be configured in description.ext like shown above. -File Paths will be relative to your mission, if you want to define Tags inside description.ext but use Addon paths for `Texture`/`Material`/`TagModel` you need to prefix the path with `@`. +Tags can also be configured in `description.ext` like shown above. +File Paths will be relative to your mission, if you want to define Tags inside `description.ext` but use Addon paths for `Texture`/`Material`/`TagModel` you need to prefix the path with `@`. This is how above config would look when using Addon paths from description.ext: From b0e2c5ba9571952762f86b2194730a680c7d50ec Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 5 Jan 2025 00:23:28 +0100 Subject: [PATCH 085/305] cleanup --- addons/wardrobe/CfgFunctions.hpp | 90 ------------------- addons/wardrobe/Facewear.hpp | 28 +++--- addons/wardrobe/XEH_PREP.hpp | 2 +- addons/wardrobe/XEH_postInit.sqf | 2 +- addons/wardrobe/config.cpp | 1 - .../wardrobe/functions/fnc_getItems_all.sqf | 4 +- .../functions/fnc_getItems_modifiable_all.sqf | 4 +- .../fnc_getItems_modifiable_current.sqf | 4 +- addons/wardrobe/functions/fnc_getMagIDs.sqf | 4 +- .../wardrobe/functions/fnc_isModifiable.sqf | 2 +- .../functions/fnc_replace_uniform.sqf | 16 ++-- addons/wardrobe/functions/fnc_say3d.sqf | 2 + .../functions/fnc_setIndexForMagID.sqf | 4 +- 13 files changed, 37 insertions(+), 126 deletions(-) delete mode 100644 addons/wardrobe/CfgFunctions.hpp diff --git a/addons/wardrobe/CfgFunctions.hpp b/addons/wardrobe/CfgFunctions.hpp deleted file mode 100644 index 20ab848e801..00000000000 --- a/addons/wardrobe/CfgFunctions.hpp +++ /dev/null @@ -1,90 +0,0 @@ -/* -class CfgFunctions -{ - class ADDON - { - class COMPONENT { - file = PATH_TO_FUNC; - - class postInit { postInit = 1; }; - - class isModifiable {}; - class compare_components {}; - class canModifyTo {}; - }; - - class ace_intel { - file = PATH_TO_FUNC_SUB(ace_intel); - class getMagIDs {}; - class getIndexFromMagID {}; - class setIndexForMagID {}; - }; - - class getItems { - file = PATH_TO_FUNC_SUB(getItems); - class getItems_all {}; - class getItems_modifiable_all {}; - class getItems_modifiable_current {}; - class getItems_modifiableTo {}; - - }; - - class replace { - file = PATH_TO_FUNC_SUB(replace); - - class replace {}; - class replace_headgear {}; - class replace_facewear {}; - class replace_uniform {}; - }; - - class action { - file = PATH_TO_FUNC_SUB(action); - - class addActions {}; - class addActions_condition {}; - class addActions_children {}; - class getAction_Name {}; - class getAction_Icon {}; - }; - - class cache { - file = PATH_TO_FUNC_SUB(cache); - - class cache_db {}; - class cache_get {}; - class cache_set {}; - class cache_clear {}; - class clearOnClosed_InteractionMenu {}; - class clearOnClosed_Inventory {}; - }; - - class config { - file = PATH_TO_FUNC_SUB(config); - - class getCfgDataRandom {}; - }; - - class debug { - file = PATH_TO_FUNC_SUB(debug); - - class getAllWardrobeItems {}; - class compare_container_maxLoad {}; - }; - - class effects { - file = PATH_TO_FUNC_SUB(effects); - - class say3d {}; - }; - class contextMenu { - file = PATH_TO_FUNC_SUB(contextMenu); - - class enable_contextMenu {}; - class addCM_nextvariant {}; - class do_nextVariant {}; - class getNextVariant {}; - }; - }; -}; -*/ \ No newline at end of file diff --git a/addons/wardrobe/Facewear.hpp b/addons/wardrobe/Facewear.hpp index ee800590004..bd6369769fd 100644 --- a/addons/wardrobe/Facewear.hpp +++ b/addons/wardrobe/Facewear.hpp @@ -37,19 +37,19 @@ class G_Shades_Black: None { class G_Balaclava_blk: None { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_lowprofile", "G_Balaclava_combat" }; - components[] = {"G_Balaclava_blk"}; + components[] = { "G_Balaclava_blk" }; }; }; class G_Balaclava_combat: G_Balaclava_blk { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_blk" }; - components[] = {"G_Balaclava_blk","G_Combat"}; + components[] = {"G_Balaclava_blk", "G_Combat"}; }; }; class G_Balaclava_lowprofile: G_Balaclava_blk { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_blk" }; - components[] = {"G_Balaclava_blk","G_Lowprofile"}; + components[] = { "G_Balaclava_blk", "G_Lowprofile" }; }; }; @@ -57,13 +57,13 @@ class G_Balaclava_lowprofile: G_Balaclava_blk { class G_Balaclava_TI_blk_F: None { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_G_blk_F" }; - components[] = {"G_Balaclava_TI_blk_F"}; + components[] = { "G_Balaclava_TI_blk_F" }; }; }; class G_Balaclava_TI_G_blk_F: G_Balaclava_TI_blk_F { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_blk_F" }; - components[] = {"G_Balaclava_TI_blk_F","G_Combat"}; + components[] = { "G_Balaclava_TI_blk_F", "G_Combat" }; }; }; @@ -71,13 +71,13 @@ class G_Balaclava_TI_G_blk_F: G_Balaclava_TI_blk_F { class G_Balaclava_TI_tna_F: G_Balaclava_TI_blk_F { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_G_tna_F" }; - components[] = {"G_Balaclava_TI_tna_F"}; + components[] = { "G_Balaclava_TI_tna_F" }; }; }; class G_Balaclava_TI_G_tna_F: G_Balaclava_TI_tna_F { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Balaclava_TI_tna_F" }; - components[] = {"G_Balaclava_TI_tna_F","G_Combat"}; + components[] = { "G_Balaclava_TI_tna_F", "G_Combat" }; }; }; @@ -85,26 +85,26 @@ class G_Balaclava_TI_G_tna_F: G_Balaclava_TI_tna_F { class G_Bandanna_blk: G_Balaclava_blk { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_aviator", "G_Bandanna_sport", "G_Bandanna_aviator" }; - components[] = {"G_Bandanna_blk"}; + components[] = { "G_Bandanna_blk" }; }; }; class G_Bandanna_shades: G_Bandanna_blk { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Shades_Black" }; - components[] = {"G_Bandanna_blk", "G_Shades_Black" }; + components[] = { "G_Bandanna_blk", "G_Shades_Black" }; }; }; class G_Bandanna_sport: G_Bandanna_shades { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Sport_Blackred" }; - components[] = {"G_Bandanna_blk", "G_Sport_Blackred"}; + components[] = { "G_Bandanna_blk", "G_Sport_Blackred" }; }; }; class G_Bandanna_aviator: G_Bandanna_shades { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_Bandanna_blk", "G_Aviator" }; - components[] = {"G_Bandanna_blk", "G_Aviator" }; + components[] = { "G_Bandanna_blk", "G_Aviator" }; }; }; @@ -113,18 +113,18 @@ class G_Bandanna_aviator: G_Bandanna_shades { class G_EyeProtectors_F: G_EyeProtectors_base_F { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_Earpiece_F" }; - components[] = {"G_EyeProtectors_F"}; + components[] = { "G_EyeProtectors_F" }; }; }; class G_EyeProtectors_Earpiece_F: G_EyeProtectors_base_F { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_F", "G_WirelessEarpiece_F" }; - components[] = {"G_EyeProtectors_F", "G_WirelessEarpiece_F"}; + components[] = { "G_EyeProtectors_F", "G_WirelessEarpiece_F" }; }; }; class G_WirelessEarpiece_F: G_WirelessEarpiece_base_F { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "G_EyeProtectors_Earpiece_F" }; - components[] = {"G_WirelessEarpiece_F"}; + components[] = { "G_WirelessEarpiece_F" }; }; }; diff --git a/addons/wardrobe/XEH_PREP.hpp b/addons/wardrobe/XEH_PREP.hpp index af8f2e73336..cfd103febdb 100644 --- a/addons/wardrobe/XEH_PREP.hpp +++ b/addons/wardrobe/XEH_PREP.hpp @@ -34,7 +34,7 @@ PREP(getCfgDataRandom); PREP(getAllWardrobeItems); PREP(compare_container_maxLoad); // Effects -PREP(say3d); +PREP(say3d); // TO BE DELETED ONCE https://github.com/acemod/ACE3/pull/10619 has merged // CBA Context Menu PREP(enable_contextMenu); PREP(addCM_nextvariant); diff --git a/addons/wardrobe/XEH_postInit.sqf b/addons/wardrobe/XEH_postInit.sqf index 3658433d5fe..c63f685fe03 100644 --- a/addons/wardrobe/XEH_postInit.sqf +++ b/addons/wardrobe/XEH_postInit.sqf @@ -1,3 +1,3 @@ #include "script_component.hpp" -[ QGVAR(EH_say3d), FUNC(say3d) ] call CBA_fnc_addEventHandler; +[ QGVAR(EH_say3d), FUNC(say3d) ] call CBA_fnc_addEventHandler; // TO BE DELETED ONCE https://github.com/acemod/ACE3/pull/10619 has merged diff --git a/addons/wardrobe/config.cpp b/addons/wardrobe/config.cpp index c01f8e87e1e..f275eb53fe7 100644 --- a/addons/wardrobe/config.cpp +++ b/addons/wardrobe/config.cpp @@ -20,7 +20,6 @@ class CfgPatches { }; }; -#include "CfgFunctions.hpp" #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" diff --git a/addons/wardrobe/functions/fnc_getItems_all.sqf b/addons/wardrobe/functions/fnc_getItems_all.sqf index 44166f9ce0c..29e6165e957 100644 --- a/addons/wardrobe/functions/fnc_getItems_all.sqf +++ b/addons/wardrobe/functions/fnc_getItems_all.sqf @@ -18,8 +18,8 @@ */ params [ - ["_unit", objNull, [objNull]], - ["_cache", true, [true] ] + ["_unit", objNull, [objNull]], + ["_cache", true, [true]] ]; diff --git a/addons/wardrobe/functions/fnc_getItems_modifiable_all.sqf b/addons/wardrobe/functions/fnc_getItems_modifiable_all.sqf index b2947210596..021d56bd76d 100644 --- a/addons/wardrobe/functions/fnc_getItems_modifiable_all.sqf +++ b/addons/wardrobe/functions/fnc_getItems_modifiable_all.sqf @@ -18,8 +18,8 @@ */ params [ - ["_unit", objNull, [objNull]], - ["_cache", true, [true] ] + ["_unit", objNull, [objNull]], + ["_cache", true, [true]] ]; diff --git a/addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf b/addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf index 327277fe24c..3d498395b55 100644 --- a/addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf +++ b/addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf @@ -18,8 +18,8 @@ */ params [ - ["_unit", objNull, [objNull]], - ["_cache", true, [true] ] + ["_unit", objNull, [objNull]], + ["_cache", true, [true]] ]; diff --git a/addons/wardrobe/functions/fnc_getMagIDs.sqf b/addons/wardrobe/functions/fnc_getMagIDs.sqf index d0b221c84d7..a4d1f9af6bf 100644 --- a/addons/wardrobe/functions/fnc_getMagIDs.sqf +++ b/addons/wardrobe/functions/fnc_getMagIDs.sqf @@ -19,8 +19,8 @@ params [ - ["_unit", objNull, [objNull] ], - ["_className", "", [""] ] + ["_unit", objNull, [objNull]], + ["_className", "", [""]] ]; if ( _className == "" || { _unit isEqualTo objNull } ) exitWith {}; diff --git a/addons/wardrobe/functions/fnc_isModifiable.sqf b/addons/wardrobe/functions/fnc_isModifiable.sqf index 54d3ab4c9d4..9ca0fd3f256 100644 --- a/addons/wardrobe/functions/fnc_isModifiable.sqf +++ b/addons/wardrobe/functions/fnc_isModifiable.sqf @@ -18,7 +18,7 @@ */ params [ - ["_cfg", configNull, [configNull] ] + ["_cfg", configNull, [configNull]] ]; diff --git a/addons/wardrobe/functions/fnc_replace_uniform.sqf b/addons/wardrobe/functions/fnc_replace_uniform.sqf index 4983e92fa30..758ffc3f737 100644 --- a/addons/wardrobe/functions/fnc_replace_uniform.sqf +++ b/addons/wardrobe/functions/fnc_replace_uniform.sqf @@ -29,12 +29,12 @@ private _loadout = [_player] call CBA_fnc_getLoadout; //// Handle Special Cases - Pre Replace // ACE Intel Items -private _hasDocument = _magazineDetails findIf { _x#0 == "acex_intelitems_document"} > -1; +private _hasDocument = _magazineDetails findIf { _x#0 == "acex_intelitems_document" } > -1; private _hasNotepad = _magazineDetails findIf { _x#0 == "acex_intelitems_notepad" } > -1; -private _hasPhoto = _magazineDetails findIf { _x#0 == "acex_intelitems_photo" } > -1; -if (_hasDocument) then { _hasDocument = [_player, "acex_intelitems_document" ] call FUNC(getMagIDs) apply { [_x] call FUNC(getIndexFromMagID) } }; -if (_hasNotepad) then { _hasNotepad = [_player, "acex_intelitems_notepad" ] call FUNC(getMagIDs) apply { [_x] call FUNC(getIndexFromMagID) } }; -if (_hasPhoto) then { _hasPhoto = [_player, "acex_intelitems_photo" ] call FUNC(getMagIDs) apply { [_x] call FUNC(getIndexFromMagID) } }; +private _hasPhoto = _magazineDetails findIf { _x#0 == "acex_intelitems_photo" } > -1; +if (_hasDocument) then { _hasDocument = [_player, "acex_intelitems_document"] call FUNC(getMagIDs) apply { [_x] call FUNC(getIndexFromMagID) } }; +if (_hasNotepad) then { _hasNotepad = [_player, "acex_intelitems_notepad"] call FUNC(getMagIDs) apply { [_x] call FUNC(getIndexFromMagID) } }; +if (_hasPhoto) then { _hasPhoto = [_player, "acex_intelitems_photo"] call FUNC(getMagIDs) apply { [_x] call FUNC(getIndexFromMagID) } }; // ACE Overheating private _hasSpareBarrel = _magazineDetails findIf { _x#0 == "ACE_SpareBarrel" } > -1; @@ -55,9 +55,9 @@ switch (_case) do { //// Handle Special Cases - Post Replace // ACE Intel Items -if (_hasDocument isEqualType []) then { { [_x, _hasDocument # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_document" ] call FUNC(getMagIDs) ); }; -if (_hasNotepad isEqualType []) then { { [_x, _hasNotepad # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_notepad" ] call FUNC(getMagIDs) ); }; -if (_hasPhoto isEqualType []) then { { [_x, _hasPhoto # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_photo" ] call FUNC(getMagIDs) ); }; +if (_hasDocument isEqualType []) then { { [_x, _hasDocument # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_document"] call FUNC(getMagIDs) ); }; +if (_hasNotepad isEqualType []) then { { [_x, _hasNotepad # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_notepad"] call FUNC(getMagIDs) ); }; +if (_hasPhoto isEqualType []) then { { [_x, _hasPhoto # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_photo"] call FUNC(getMagIDs) ); }; // ACE Overheating if (_hasSpareBarrel isEqualType []) then { { [_x, _hasSpareBarrel # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "ACE_SpareBarrel" ] call FUNC(getMagIDs) ); }; diff --git a/addons/wardrobe/functions/fnc_say3d.sqf b/addons/wardrobe/functions/fnc_say3d.sqf index edb261dfa8a..df038d05764 100644 --- a/addons/wardrobe/functions/fnc_say3d.sqf +++ b/addons/wardrobe/functions/fnc_say3d.sqf @@ -1,3 +1,5 @@ +// TO BE DELETED ONCE https://github.com/acemod/ACE3/pull/10619 has merged + #include "../script_component.hpp" /* diff --git a/addons/wardrobe/functions/fnc_setIndexForMagID.sqf b/addons/wardrobe/functions/fnc_setIndexForMagID.sqf index e24a9cfaf46..a63a8690aff 100644 --- a/addons/wardrobe/functions/fnc_setIndexForMagID.sqf +++ b/addons/wardrobe/functions/fnc_setIndexForMagID.sqf @@ -18,8 +18,8 @@ */ params [ - ["_magID", "", [""] ], - ["_index", 0, [0] ] + ["_magID", "", [""]], + ["_index", 0, [0]] ]; if (_index == -1) exitWith {}; From 295ac3334aeefe072458fbaa4bb5f30dc178875e Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 5 Jan 2025 02:59:30 +0100 Subject: [PATCH 086/305] fix --- addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf b/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf index 56c8239abe0..38258a85c91 100644 --- a/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf +++ b/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf @@ -20,6 +20,6 @@ params [["_asConfig", false, [true]]]; -private _return = ["CfgWeapons", "CfgGlasses"] apply { ( QUOTE([_x] call FUNC(isModifiable)) configClasses (configFile >> _x) ) }; +private _return = flatten ( ["CfgWeapons", "CfgGlasses"] apply { ( QUOTE([_x] call FUNC(isModifiable)) configClasses (configFile >> _x) ) } ); -if (_asConfig) then { _return apply { configName _x } } else { _return } +if (_asConfig) then { _return } else { _return apply { configName _x } } From 20e229d3c298d98c12b8202d4dc71fb693050436 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 5 Jan 2025 02:59:53 +0100 Subject: [PATCH 087/305] Compat for ace_spareBarrel --- addons/wardrobe/XEH_PREP.hpp | 2 ++ addons/wardrobe/XEH_postInit.sqf | 1 + .../functions/fnc_replace_uniform.sqf | 10 ++++-- .../fnc_spareBarrel_updateMagIDs.sqf | 33 +++++++++++++++++++ 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 addons/wardrobe/functions/fnc_spareBarrel_updateMagIDs.sqf diff --git a/addons/wardrobe/XEH_PREP.hpp b/addons/wardrobe/XEH_PREP.hpp index cfd103febdb..36286bec196 100644 --- a/addons/wardrobe/XEH_PREP.hpp +++ b/addons/wardrobe/XEH_PREP.hpp @@ -15,6 +15,8 @@ PREP(replace); PREP(replace_headgear); PREP(replace_facewear); PREP(replace_uniform); +// Compat +PREP(spareBarrel_updateMagIDs); // Ace Actions PREP(addActions); PREP(addActions_condition); diff --git a/addons/wardrobe/XEH_postInit.sqf b/addons/wardrobe/XEH_postInit.sqf index c63f685fe03..e71b70bd49e 100644 --- a/addons/wardrobe/XEH_postInit.sqf +++ b/addons/wardrobe/XEH_postInit.sqf @@ -1,3 +1,4 @@ #include "script_component.hpp" [ QGVAR(EH_say3d), FUNC(say3d) ] call CBA_fnc_addEventHandler; // TO BE DELETED ONCE https://github.com/acemod/ACE3/pull/10619 has merged +[ QGVAR(EH_updateMagIDs), FUNC(spareBarrel_updateMagIDs) ] call CBA_fnc_addEventHandler; diff --git a/addons/wardrobe/functions/fnc_replace_uniform.sqf b/addons/wardrobe/functions/fnc_replace_uniform.sqf index 758ffc3f737..b44f1bba5f8 100644 --- a/addons/wardrobe/functions/fnc_replace_uniform.sqf +++ b/addons/wardrobe/functions/fnc_replace_uniform.sqf @@ -28,6 +28,7 @@ private _loadout = [_player] call CBA_fnc_getLoadout; //// Handle Special Cases - Pre Replace + // ACE Intel Items private _hasDocument = _magazineDetails findIf { _x#0 == "acex_intelitems_document" } > -1; private _hasNotepad = _magazineDetails findIf { _x#0 == "acex_intelitems_notepad" } > -1; @@ -38,7 +39,7 @@ if (_hasPhoto) then { _hasPhoto = [_player, "acex_intelitems_photo"] ca // ACE Overheating private _hasSpareBarrel = _magazineDetails findIf { _x#0 == "ACE_SpareBarrel" } > -1; -if (_hasSpareBarrel) then { _hasSpareBarrel = [_player, "ACE_SpareBarrel" ] call FUNC(getMagIDs) apply { [_x] call FUNC(getIndexFromMagID) } }; +if (_hasSpareBarrel) then { _hasSpareBarrel = [_player, "ACE_SpareBarrel" ] call FUNC(getMagIDs) }; //// Replace Wearable @@ -53,11 +54,16 @@ switch (_case) do { // Apply new Loadout [_player, _loadout] call CBA_fnc_setLoadout; + //// Handle Special Cases - Post Replace + // ACE Intel Items if (_hasDocument isEqualType []) then { { [_x, _hasDocument # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_document"] call FUNC(getMagIDs) ); }; if (_hasNotepad isEqualType []) then { { [_x, _hasNotepad # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_notepad"] call FUNC(getMagIDs) ); }; if (_hasPhoto isEqualType []) then { { [_x, _hasPhoto # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_photo"] call FUNC(getMagIDs) ); }; // ACE Overheating -if (_hasSpareBarrel isEqualType []) then { { [_x, _hasSpareBarrel # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "ACE_SpareBarrel" ] call FUNC(getMagIDs) ); }; +if (_hasSpareBarrel isEqualType [] ) then { + private _SpareBarrel_new_MagIDs = [_player, "ACE_SpareBarrel"] call FUNC(getMagIDs); + [QGVAR(EH_updateMagIDs), [_hasSpareBarrel, _SpareBarrel_new_MagIDs]] call CBA_fnc_serverEvent; +}; diff --git a/addons/wardrobe/functions/fnc_spareBarrel_updateMagIDs.sqf b/addons/wardrobe/functions/fnc_spareBarrel_updateMagIDs.sqf new file mode 100644 index 00000000000..843c04bb009 --- /dev/null +++ b/addons/wardrobe/functions/fnc_spareBarrel_updateMagIDs.sqf @@ -0,0 +1,33 @@ +#include "../script_component.hpp" + +/* + * Author: OverlordZorn + * Function to update ACE Overheating's Serverside SpareBarrel DataBase with new MagIDs. + * + * Arguments: + * 0: old magIDs + * 1: new magIDs + * + * Return Value: + * The return value + * + * Example: + * [_old, _new] call ace_wardrobe_fnc_spareBarrel_updateMagIDs + * + * Public: No + */ + +if (!isServer) exitWith {}; + +params ["_old_magIDs", "_new_magIDs"]; + +if (count _old_magIDs != count _new_magIDs) exitWith { ERROR_2("Not Equal Number of magID's provided: %1 - %2",_old_magIDs,_new_magIDs); systemChat "Errorrrrrrrrrrr"; }; + +private _map = EGVAR(overheating,storedSpareBarrels); + +{ + private _oldID = _x; + if !(_oldID in _map) then { continue }; + _map set [ _new_magIDs # _forEachIndex , _map deleteAt _oldID ]; + +} forEach _old_magIDs; \ No newline at end of file From e85902f33aa5c30be00e94e9241c8cb75421522a Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 5 Jan 2025 03:02:30 +0100 Subject: [PATCH 088/305] Update launch.toml --- .hemtt/launch.toml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.hemtt/launch.toml b/.hemtt/launch.toml index c7bb05fec18..1cf47e3b0bb 100644 --- a/.hemtt/launch.toml +++ b/.hemtt/launch.toml @@ -51,6 +51,7 @@ workshop = [ ] mission = "Wardrobe.VR" dlc = [ - "Reaction Forces", - "Western Sahara" +# "Western Sahara", +# "Reaction Forces" +# "S.O.G. Prairie Fire" ] \ No newline at end of file From f53e6c89045bfae887d504b3415db6b498a39787 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 5 Jan 2025 19:21:15 +0100 Subject: [PATCH 089/305] remove fnc_say3d.sqf --- addons/wardrobe/XEH_PREP.hpp | 2 - addons/wardrobe/XEH_postInit.sqf | 16 +++++++- addons/wardrobe/functions/fnc_say3d.sqf | 49 ------------------------- 3 files changed, 15 insertions(+), 52 deletions(-) delete mode 100644 addons/wardrobe/functions/fnc_say3d.sqf diff --git a/addons/wardrobe/XEH_PREP.hpp b/addons/wardrobe/XEH_PREP.hpp index 36286bec196..e2bc8559567 100644 --- a/addons/wardrobe/XEH_PREP.hpp +++ b/addons/wardrobe/XEH_PREP.hpp @@ -35,8 +35,6 @@ PREP(getCfgDataRandom); // Debug PREP(getAllWardrobeItems); PREP(compare_container_maxLoad); -// Effects -PREP(say3d); // TO BE DELETED ONCE https://github.com/acemod/ACE3/pull/10619 has merged // CBA Context Menu PREP(enable_contextMenu); PREP(addCM_nextvariant); diff --git a/addons/wardrobe/XEH_postInit.sqf b/addons/wardrobe/XEH_postInit.sqf index e71b70bd49e..75fa2c87365 100644 --- a/addons/wardrobe/XEH_postInit.sqf +++ b/addons/wardrobe/XEH_postInit.sqf @@ -1,4 +1,18 @@ #include "script_component.hpp" -[ QGVAR(EH_say3d), FUNC(say3d) ] call CBA_fnc_addEventHandler; // TO BE DELETED ONCE https://github.com/acemod/ACE3/pull/10619 has merged [ QGVAR(EH_updateMagIDs), FUNC(spareBarrel_updateMagIDs) ] call CBA_fnc_addEventHandler; + +[ + QGVAR(EH_say3d), + { + params [["_source", objNull, [objNull]],["_sound",[""],["", []]]]; + if (_sound isEqualType [] && {_sound#0 == ""} || {_sound isEqualType "" && {_sound == ""}}) exitWith {}; + _sound params [ + "_className", + ["_distance", 50, [0]], + ["_pitch", 0.95 + random 0.1, [0]] + ]; + _source say3D [_className, _distance, _pitch, _isSpeech, _offSet, _simSpeedOfSound]; + nil + } +] call CBA_fnc_addEventHandler; diff --git a/addons/wardrobe/functions/fnc_say3d.sqf b/addons/wardrobe/functions/fnc_say3d.sqf deleted file mode 100644 index df038d05764..00000000000 --- a/addons/wardrobe/functions/fnc_say3d.sqf +++ /dev/null @@ -1,49 +0,0 @@ -// TO BE DELETED ONCE https://github.com/acemod/ACE3/pull/10619 has merged - -#include "../script_component.hpp" - -/* - * Author: OverlordZorn - * CBA Event: "ace_wardrobe_eh_say3d" - * Function to use say3D - * If not defined otherwise, the Pitch will be randomised between 95% to 105% - * - * Arguments: - * 0: Sound Source - * 1: CfgSound Classname or Parameter Array - * - 0: CfgSound Classname - * - 1: distance in meters (default: 50) - * - 2: pitch (default: random from 0.95 to 1.05) - * - 3: is Speech (default: false) - * - 4: offset (default: 0) - * - 4: Simulate Speed of Sound (default: false) - * - * Return Value: - * None - * - * Example: - * [player, "ace_horny_bonk"] call ace_wardrobe_fnc_say3d - * - * Public: No - */ - -params [ - ["_source", objNull, [objNull] ], - ["_sound", [""], ["", []] ] -]; - -if (_sound isEqualType [] && {_sound#0 == ""} || {_sound isEqualType "" && {_sound == ""}}) exitWith {}; - -_sound params [ -"_className", -["_distance", 50, [0] ], -["_pitch", 0.95 + random 0.1, [0] ], -["_isSpeech", false, [false, 0] ], -["_offSet", 0, [0] ], -["_simSpeedOfSound", false, [false] ] -]; - - -_source say3D [_className, _distance, _pitch, _isSpeech, _offSet, _simSpeedOfSound]; - -nil From b1ecde59df7916381a516ffb084c1ef4debde6f9 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 5 Jan 2025 19:36:05 +0100 Subject: [PATCH 090/305] remove unused variables --- addons/wardrobe/XEH_postInit.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/XEH_postInit.sqf b/addons/wardrobe/XEH_postInit.sqf index 75fa2c87365..cece4f6f968 100644 --- a/addons/wardrobe/XEH_postInit.sqf +++ b/addons/wardrobe/XEH_postInit.sqf @@ -12,7 +12,7 @@ ["_distance", 50, [0]], ["_pitch", 0.95 + random 0.1, [0]] ]; - _source say3D [_className, _distance, _pitch, _isSpeech, _offSet, _simSpeedOfSound]; + _source say3D [_className, _distance, _pitch]; nil } ] call CBA_fnc_addEventHandler; From ece1741bea36888449083efdf1bf8060a301b333 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 01:18:40 +0100 Subject: [PATCH 091/305] refactor: goggles as components --- addons/wardrobe/functions/fnc_replace.sqf | 25 ++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 84ccd4e7d52..9ce16bb7668 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -47,18 +47,34 @@ private _replaceCode = switch ( _typeNumber ) do { if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 - %2",_typeNumber,configName _cfg_origin); }; -[ _replaceCode, [_unit, _cfg_origin, _cfg_tgt, _additionalParams ], _duration * 1.0 ] call CBA_fnc_waitAndExecute; +[ _replaceCode, [_unit, _cfg_origin, _cfg_tgt, _additionalParams ], _duration * 1.0 ] call CBA_fnc_waitAndExecute; -// Remove / Add Missing/Surplus Items. +//// Handle Components +// Add Surplus [_cfg_origin, _cfg_tgt] call FUNC(compare_components) params ["_missing", "_surplus"]; { - if (configName _cfg_tgt != _x) then { [_unit, _x, true] call CBA_fnc_addItem; }; + if (configName _cfg_tgt != _x) then { + if ( isClass (configFile >> "CfgGlasses" >> _x) && { goggles _unit == "" } ) then { + _unit addGoggles _x; + } else { + [_unit, _x, true] call CBA_fnc_addItem; + }; + }; } forEach _surplus; + +// Remove Missing { - if (configName _cfg_origin != _x) then { [_unit, _x] call CBA_fnc_removeItem; }; + if (configName _cfg_origin != _x) then { + + switch (true) do { + case (goggles _unit == _x): { removeGoggles _unit; }; + default { [_unit, _x] call CBA_fnc_removeItem; }; + }; + }; } forEach _missing; +//// Handle Effects // Animation/Gestures [ _unit, getText (_cfg_tgt >> QADDON >> "gesture") ] call ace_common_fnc_doGesture; @@ -67,7 +83,6 @@ private _sound_timing = getNumber (_cfg_tgt>> QADDON >> "sound_timing") max 0 mi private _sound = [_cfg_tgt >> QADDON >> "sound"] call FUNC(getCfgDataRandom); if (_sound != "") then { [ CBA_fnc_globalEvent, [QGVAR(EH_say3d), [_unit, _sound]], _sound_timing * _duration ] call CBA_fnc_waitAndExecute; }; - // Notification private _notify_img = getText (_cfg_tgt >> "picture"); if !(".paa" in _notify_img) then { _notify_img = [_notify_img,"paa"] joinString "." }; From fd980b5ae70951b81084cf4ac2df614e4ebfd7a8 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 01:18:57 +0100 Subject: [PATCH 092/305] remove whitespace --- addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp index 76571f73a82..c49da34f18a 100644 --- a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp @@ -10,7 +10,7 @@ class CfgWeapons { }; class H_Cap_headphones_ion_lxws: lxWS_H_CapB_rvs_blk_ION { class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "lxWS_H_CapB_rvs_blk_ION" }; + modifiableTo[] = { "lxWS_H_CapB_rvs_blk_ION" }; }; }; From ef65249615e8d55f188717da4b99ecb46851b33c Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 01:21:10 +0100 Subject: [PATCH 093/305] more compats --- .../compat_sog_wardrobe/CfgWardrobe.hpp | 13 +- .../compat_sog_wardrobe/Facewear.hpp | 103 +++++++++++ .../compat_sog_wardrobe/Helmets.hpp | 171 ++++++++++++++++++ .../compat_sog_wardrobe/Pilothelmets.hpp | 63 ------- .../Uniforms.hpp | 67 ++++++- .../compat_sog_wardrobe_uniform_fix/readme.md | 5 + addons/wardrobe/Baseclass.hpp | 13 +- addons/wardrobe/config.cpp | 3 +- addons/wardrobe/stringtable.xml | 12 ++ 9 files changed, 382 insertions(+), 68 deletions(-) create mode 100644 addons/compat_sog/compat_sog_wardrobe/Facewear.hpp create mode 100644 addons/compat_sog/compat_sog_wardrobe/Helmets.hpp delete mode 100644 addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp diff --git a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp index 1516da1e51a..07abc3fea55 100644 --- a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp @@ -1,3 +1,5 @@ + + class EGVAR(wardrobe,base); class EGVAR(wardrobe,base_H_visor_up); @@ -6,14 +8,23 @@ class EGVAR(wardrobe,base_H_visor_down); class EGVAR(wardrobe,base_U_sleeves_up); class EGVAR(wardrobe,base_U_sleeves_down); +class EGVAR(wardrobe,base_H_goggles_on); +class EGVAR(wardrobe,base_H_goggles_off); + + + class CfgWeapons { // Base Classes class vn_b_headgear_base; class vn_o_headgear_base; - #include "Pilothelmets.hpp" + #include "Helmets.hpp" #include "Booniehats.hpp" #include "Uniforms_B.hpp" #include "Uniforms_O.hpp" }; + +class CfgGlasses { + #include "Facewear.hpp" +}; diff --git a/addons/compat_sog/compat_sog_wardrobe/Facewear.hpp b/addons/compat_sog/compat_sog_wardrobe/Facewear.hpp new file mode 100644 index 00000000000..a99810ffa00 --- /dev/null +++ b/addons/compat_sog/compat_sog_wardrobe/Facewear.hpp @@ -0,0 +1,103 @@ +// Common Base +class vn_glasses_base; + + +// Scarf +class vn_b_acc_rag_01: vn_glasses_base { + class ace_wardrobe: EGVAR(wardrobe,base) { + modifiableTo[] = { "vn_b_acc_rag_02" }; + }; +}; +class vn_b_acc_rag_02: vn_b_acc_rag_01 { + class ace_wardrobe: EGVAR(wardrobe,base) { + modifiableTo[] = { "vn_b_acc_rag_01" }; + }; +}; + + +// Towel +class vn_b_acc_towel_01: vn_b_acc_rag_02 { + class ace_wardrobe: EGVAR(wardrobe,base) { + modifiableTo[] = { "vn_b_acc_towel_02" }; + }; +}; +class vn_b_acc_towel_02: vn_b_acc_towel_01 { + class ace_wardrobe: EGVAR(wardrobe,base) { + modifiableTo[] = { "vn_b_acc_towel_01" }; + }; +}; + + +// Pilot Air Mask +class vn_b_acc_ms22001_01: vn_glasses_base { + class ace_wardrobe: EGVAR(wardrobe,base) { + modifiableTo[] = { "vn_b_acc_ms22001_02" }; + alternativeDisplayName = ECSTRING(wardrobe,maskOn); + }; +}; +class vn_b_acc_ms22001_02: vn_b_acc_ms22001_01 { + class ace_wardrobe: EGVAR(wardrobe,base) { + modifiableTo[] = { "vn_b_acc_ms22001_01" }; + alternativeDisplayName = ECSTRING(wardrobe,maskOff); + }; +}; + +// Bandana + Aviators +class vn_b_aviator: vn_glasses_base { + class ace_wardrobe: EGVAR(wardrobe,base) { + modifiableTo[] = { "vn_b_bandana_a" }; + components[] = {"vn_b_aviator"}; + }; +}; + +class vn_o_bandana_b: vn_glasses_base { + class ace_wardrobe: EGVAR(wardrobe,base) { + modifiableTo[] = { "vn_b_bandana_a" }; + components[] = {"vn_o_bandana_b"}; + }; +}; + +class vn_b_bandana_a: vn_o_bandana_b { + class ace_wardrobe: EGVAR(wardrobe,base) { + modifiableTo[] = { "vn_b_aviator", "vn_o_bandana_b" }; + components[] = {"vn_b_aviator", "vn_o_bandana_b"}; + }; +}; + + + +// US Combat Goggles, used by vn_b_helmet_m1_20_01 & vn_b_helmet_m1_20_02 +class vn_b_acc_goggles_01: vn_glasses_base { + class ace_wardrobe: EGVAR(wardrobe,base) { + components[] = {"vn_b_acc_goggles_01"}; + }; +}; + +// VN Pilot Glasses + Mask +// Pilot Mask +class vn_o_acc_km32_01: vn_glasses_base { + class ace_wardrobe: EGVAR(wardrobe,base) { + modifiableTo[] = { "vn_o_acc_goggles_03" }; + components[] = {"vn_o_acc_km32_01"}; + }; +}; +// VN Crew Goggles +class vn_o_acc_goggles_01: vn_glasses_base { + class ace_wardrobe: EGVAR(wardrobe,base) { + components[] = {"vn_o_acc_goggles_01"}; + }; +}; +// Goggles +class vn_o_acc_goggles_02: vn_glasses_base { + class ace_wardrobe: EGVAR(wardrobe,base) { + modifiableTo[] = { "vn_o_acc_goggles_03" }; + components[] = {"vn_o_acc_goggles_02"}; + }; +}; +// Goggles with Mask +class vn_o_acc_goggles_03: vn_glasses_base { + class ace_wardrobe: EGVAR(wardrobe,base) { + modifiableTo[] = { "vn_o_acc_km32_01", "vn_o_acc_goggles_02" }; + components[] = { "vn_o_acc_km32_01", "vn_o_acc_goggles_02"}; + }; +}; \ No newline at end of file diff --git a/addons/compat_sog/compat_sog_wardrobe/Helmets.hpp b/addons/compat_sog/compat_sog_wardrobe/Helmets.hpp new file mode 100644 index 00000000000..bc5af5b4e8a --- /dev/null +++ b/addons/compat_sog/compat_sog_wardrobe/Helmets.hpp @@ -0,0 +1,171 @@ +// CfgWeapons + + +// Macros +#define CN01(side,var1,var2) vn_##side##_helmet_##var1##_01_##var2 +#define CN02(side,var1,var2) vn_##side##_helmet_##var1##_02_##var2 + + +#define HELMET_VARIANT(side,var1,var2)\ +class CN01(side,var1,var2): base_class_up {\ + class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up) {\ + modifiableTo[] = { QUOTE(CN02(side,var1,var2)) };\ + };\ +};\ +class CN02(side,var1,var2): base_class_dn {\ + class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) {\ + modifiableTo[] = { QUOTE(CN01(side,var1,var2)) };\ + };\ +}; + + +// Base classes in CfgWeapons.hpp + +// Parent Version aph6 & svh4 +#define base_class_up vn_b_headgear_base +#define base_class_dn vn_b_headgear_base +HELMET_VARIANT(b,aph6,01) +HELMET_VARIANT(b,svh4,01) + +// Child Version aph6 +#undef base_class_up +#undef base_class_dn +#define base_class_up CN01(b,aph6,01) +#define base_class_dn CN02(b,aph6,01) + +HELMET_VARIANT(b,aph6,02) +HELMET_VARIANT(b,aph6,03) +HELMET_VARIANT(b,aph6,04) +HELMET_VARIANT(b,aph6,05) + +// Child Version svh4 +#undef base_class_up +#undef base_class_dn +#define base_class_up CN01(b,svh4,01) +#define base_class_dn CN02(b,svh4,01) + +HELMET_VARIANT(b,svh4,02) +HELMET_VARIANT(b,svh4,03) +HELMET_VARIANT(b,svh4,04) +HELMET_VARIANT(b,svh4,05) +HELMET_VARIANT(b,svh4,06) + +// Special Case zsh3 +class vn_o_helmet_zsh3_01: vn_o_headgear_base { + class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up) { + modifiableTo[] = { "vn_o_helmet_zsh3_02" }; + }; +}; +class vn_o_helmet_zsh3_02: vn_o_helmet_zsh3_01 { + class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) { + modifiableTo[] = { "vn_o_helmet_zsh3_01" }; + }; +}; + +// Helmets with/without Goggles +class vn_b_helmet_m1_01_01; +class vn_b_helmet_m1_14_01: vn_b_helmet_m1_01_01 { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { + modifiableTo[] = { "vn_b_helmet_m1_20_01" }; + }; +}; +class vn_b_helmet_m1_14_02: vn_b_helmet_m1_14_01 { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { + modifiableTo[] = { "vn_b_helmet_m1_20_02" }; + }; +}; + +class vn_b_helmet_m1_20_01 : vn_b_helmet_m1_14_01 { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { + modifiableTo[] = { "vn_b_helmet_m1_14_01" }; + components[] = {"vn_b_acc_goggles_01"}; + }; +}; +class vn_b_helmet_m1_20_02 : vn_b_helmet_m1_20_01 { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { + modifiableTo[] = { "vn_b_helmet_m1_14_02" }; + components[] = {"vn_b_acc_goggles_01"}; + }; +}; + + +//// VN Pilot Helmet +// With Goggles +class vn_o_helmet_shl61_01: vn_o_headgear_base { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { + modifiableTo[] = { "vn_o_helmet_shl61_02" }; + components[] = {"vn_o_acc_goggles_02"}; + }; +}; +// Without Goggles +class vn_o_helmet_shl61_02: vn_o_helmet_shl61_01 { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { + modifiableTo[] = { "vn_o_helmet_shl61_01" }; + }; +}; + + +// US Vic Crew Helmets +class vn_b_helmet_t56_01_01: vn_b_headgear_base { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { + modifiableTo[] = { "vn_b_helmet_t56_02_01" }; + }; +}; +class vn_b_helmet_t56_02_01: vn_b_helmet_t56_01_01 { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { + modifiableTo[] = { "vn_b_helmet_t56_01_01" }; + components[] = {"vn_b_acc_goggles_01"}; + }; +}; + +class vn_b_helmet_t56_01_02: vn_b_helmet_t56_01_01 { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { + modifiableTo[] = { "vn_b_helmet_t56_02_02" }; + }; +}; +class vn_b_helmet_t56_02_02: vn_b_helmet_t56_02_01 { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { + modifiableTo[] = { "vn_b_helmet_t56_01_02" }; + components[] = {"vn_b_acc_goggles_01"}; + }; +}; + +class vn_b_helmet_t56_01_03: vn_b_helmet_t56_01_01 { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { + modifiableTo[] = { "vn_b_helmet_t56_02_03" }; + }; +}; +class vn_b_helmet_t56_02_03: vn_b_helmet_t56_02_01 { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { + modifiableTo[] = { "vn_b_helmet_t56_01_03" }; + components[] = {"vn_b_acc_goggles_01"}; + }; +}; + + +// VN Vic Crew Helmet // 1 with goggles +// vn_o_acc_goggles_01 +class vn_o_helmet_tsh3_01: vn_o_headgear_base { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { + modifiableTo[] = { "vn_o_helmet_tsh3_02" }; + components[] = {"vn_o_acc_goggles_01"}; + }; +}; +class vn_o_helmet_tsh3_02: vn_o_helmet_tsh3_01 { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { + modifiableTo[] = { "vn_o_helmet_tsh3_01" }; + }; +}; + +// VN Pith Helmet with Crew Goggles +class vn_o_helmet_nva_01: vn_o_headgear_base { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { + modifiableTo[] = { "vn_o_helmet_nva_05" }; + }; +}; +class vn_o_helmet_nva_05: vn_o_helmet_nva_01 { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { + modifiableTo[] = { "vn_o_helmet_nva_01" }; + components[] = {"vn_o_acc_goggles_02"}; + }; +}; diff --git a/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp b/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp deleted file mode 100644 index d31d288e4b7..00000000000 --- a/addons/compat_sog/compat_sog_wardrobe/Pilothelmets.hpp +++ /dev/null @@ -1,63 +0,0 @@ -// CfgWeapons - - -// Macros -#define CN01(side,var1,var2) vn_##side##_helmet_##var1##_01_##var2 -#define CN02(side,var1,var2) vn_##side##_helmet_##var1##_02_##var2 - - -#define HELMET_VARIANT(side,var1,var2)\ -class CN01(side,var1,var2): base_class_up {\ - class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up) {\ - modifiableTo[] = { QUOTE(CN02(side,var1,var2)) };\ - };\ -};\ -class CN02(side,var1,var2): base_class_dn {\ - class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) {\ - modifiableTo[] = { QUOTE(CN01(side,var1,var2)) };\ - };\ -}; - - -// Base classes in CfgWeapons.hpp - -// Parent Version aph6 & svh4 -#define base_class_up vn_b_headgear_base -#define base_class_dn vn_b_headgear_base -HELMET_VARIANT(b,aph6,01) -HELMET_VARIANT(b,svh4,01) - -// Child Version aph6 -#undef base_class_up -#undef base_class_dn -#define base_class_up CN01(b,aph6,01) -#define base_class_dn CN02(b,aph6,01) - -HELMET_VARIANT(b,aph6,02) -HELMET_VARIANT(b,aph6,03) -HELMET_VARIANT(b,aph6,04) -HELMET_VARIANT(b,aph6,05) - -// Child Version svh4 -#undef base_class_up -#undef base_class_dn -#define base_class_up CN01(b,svh4,01) -#define base_class_dn CN02(b,svh4,01) - -HELMET_VARIANT(b,svh4,02) -HELMET_VARIANT(b,svh4,03) -HELMET_VARIANT(b,svh4,04) -HELMET_VARIANT(b,svh4,05) -HELMET_VARIANT(b,svh4,06) - -// Special Case zsh3 -class vn_o_helmet_zsh3_01: vn_o_headgear_base { - class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up) { - modifiableTo[] = { "vn_o_helmet_zsh3_02" }; - }; -}; -class vn_o_helmet_zsh3_02: vn_o_helmet_zsh3_01 { - class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) { - modifiableTo[] = { "vn_o_helmet_zsh3_01" }; - }; -}; diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp index 10bc6521da1..c62a7c6f743 100644 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp @@ -8,6 +8,11 @@ class className: vn_b_uniform_base {\ };\ }; +#define MASS(var)\ +class ItemInfo: ItemInfo {\ + mass = var;\ +}; + class CfgWeapons { class vn_b_uniform_base; @@ -21,4 +26,64 @@ class CfgWeapons { S_70(vn_b_uniform_macv_04_16) S_70(vn_b_uniform_macv_04_17) S_70(vn_b_uniform_macv_04_18) -}; \ No newline at end of file + + + //// US Headgear + // Helmets with Combat Goggles + class vn_b_helmet_m1_14_01; + + class vn_b_helmet_m1_20_01: vn_b_helmet_m1_14_01 { + MASS(12) + }; + class vn_b_helmet_m1_20_02: vn_b_helmet_m1_20_01 { + MASS(12) + }; + + // Crew Helmets with Goggles + class vn_b_helmet_t56_01_01; + class vn_b_helmet_t56_02_01: vn_b_helmet_t56_01_01 { + MASS(12) + }; + + class vn_b_helmet_t56_02_02: vn_b_helmet_t56_02_01 { + MASS(12) + }; + + class vn_b_helmet_t56_02_03: vn_b_helmet_t56_02_01 { + MASS(12) + }; + + //// NVA Headgear + // NVA Gear usually has the Goggles Version be the parent version of the non-goggle version, meaning we have to "reset" the children to their previous mass. + class vn_o_headgear_base; + // NVA Pilot Helmet with Goggles + class vn_o_helmet_shl61_01: vn_o_headgear_base { + MASS(12) + }; + class vn_o_helmet_shl61_02: vn_o_helmet_shl61_01 { + MASS(10) + }; + + // NVA Crew Helmet with Goggles + class vn_o_helmet_tsh3_01: vn_o_headgear_base { + MASS(12) + }; + class vn_o_helmet_tsh3_02: vn_o_helmet_tsh3_01 { + MASS(10) + }; + + // NVA Pith helmet with Crew Goggles + class vn_o_helmet_nva_01; + class vn_o_helmet_nva_05: vn_o_helmet_nva_01 { + MASS(12) + }; +}; + + +class CfgGlasses { + // VN Pilot Goggles + Mask + class vn_glasses_base; + class vn_o_acc_goggles_03: vn_glasses_base { + mass = 4; + }; +}; diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md index 5a1967bfd3a..9eadffa1447 100644 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md @@ -3,3 +3,8 @@ The problem is, that the rolled up version are both 1 lb (0.453 kg) lighter and If we would ignore this, the player would run into situations where they would lose items by simply rolling up their sleeves. To counter this, I increased the maxLoad of those items by 1 lb to be aligned with their counterpart. + + +Addition: +This also adjusts helmets with combat goggles due to a weight discrepancy. + diff --git a/addons/wardrobe/Baseclass.hpp b/addons/wardrobe/Baseclass.hpp index d968aa0e4b3..70cbb9feb75 100644 --- a/addons/wardrobe/Baseclass.hpp +++ b/addons/wardrobe/Baseclass.hpp @@ -38,7 +38,6 @@ class GVAR(base_U_gloves_off): GVAR(base) { alternativeDisplayName = CSTRING(glovesOff); }; - // Common Base Class for Uniforms who are open/closed in the front class GVAR(base_U_jacket_open): GVAR(base) { alternativeDisplayName = CSTRING(jacketOpen); @@ -47,7 +46,6 @@ class GVAR(base_U_jacket_closed): GVAR(base) { alternativeDisplayName = CSTRING(jacketClose); }; - // Common Base Class for Helmets with a Visor that can be flipped up or down class GVAR(base_H_visor_up): GVAR(base) { duration = 0.3; @@ -68,3 +66,14 @@ class GVAR(base_H_visor_down): GVAR(base) { alternativeDisplayName = CSTRING(visorDown); }; + +// Common Base Class for Headgear with goggles that can be used as a facewear item. +class GVAR(base_H_goggles_on): GVAR(base) { + gesture ="GestureWipeFace"; + alternativeDisplayName = CSTRING(gogglesOn); +}; + +class GVAR(base_H_goggles_off): GVAR(base) { + gesture ="GestureWipeFace"; + alternativeDisplayName = CSTRING(gogglesOff); +}; \ No newline at end of file diff --git a/addons/wardrobe/config.cpp b/addons/wardrobe/config.cpp index f275eb53fe7..cc109411521 100644 --- a/addons/wardrobe/config.cpp +++ b/addons/wardrobe/config.cpp @@ -11,7 +11,8 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = { - "ace_interact_menu" + "ace_interact_menu", + "ace_goggles" }; skipWhenMissingDependencies = 1; diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml index 84f23ebba4e..ceabd45898d 100644 --- a/addons/wardrobe/stringtable.xml +++ b/addons/wardrobe/stringtable.xml @@ -46,6 +46,18 @@ Visor up + + Put mask on + + + Take mask off + + + Put goggles on + + + Take goggles off + From 094547e54f2773d60787ad486a1f81e1ec8c057a Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 10:43:48 +0100 Subject: [PATCH 094/305] getMagIDs -> CBA fnc. --- addons/wardrobe/XEH_PREP.hpp | 1 - addons/wardrobe/functions/fnc_getMagIDs.sqf | 29 ------------------- .../functions/fnc_replace_uniform.sqf | 16 +++++----- 3 files changed, 8 insertions(+), 38 deletions(-) delete mode 100644 addons/wardrobe/functions/fnc_getMagIDs.sqf diff --git a/addons/wardrobe/XEH_PREP.hpp b/addons/wardrobe/XEH_PREP.hpp index e2bc8559567..e050f7c9533 100644 --- a/addons/wardrobe/XEH_PREP.hpp +++ b/addons/wardrobe/XEH_PREP.hpp @@ -2,7 +2,6 @@ PREP(isModifiable); PREP(compare_components); PREP(canModifyTo); // ace_intel -PREP(getMagIDs); PREP(getIndexFromMagID); PREP(setIndexForMagID); // getItems diff --git a/addons/wardrobe/functions/fnc_getMagIDs.sqf b/addons/wardrobe/functions/fnc_getMagIDs.sqf deleted file mode 100644 index a4d1f9af6bf..00000000000 --- a/addons/wardrobe/functions/fnc_getMagIDs.sqf +++ /dev/null @@ -1,29 +0,0 @@ -#include "../script_component.hpp" - -/* - * Author: OverlordZorn - * Function to return the magazine ID's of certain magazines - * - * Arguments: - * 0: Unit - * 1: Classname - * - * Return Value: - * Strings of Magazines IDs - * - * Example: - * [_unit, _className] call ace_wardrobe_fnc_getMagIDs; - * - * Public: No - */ - - -params [ - ["_unit", objNull, [objNull]], - ["_className", "", [""]] -]; - -if ( _className == "" || { _unit isEqualTo objNull } ) exitWith {}; - -toFixed 0; -(magazinesAmmoFull _unit) apply { [_x#0, _x#-2, _x#-1] } select { _x#0 == _className } apply { format ["%1/%2", _x#1,_x#2] } diff --git a/addons/wardrobe/functions/fnc_replace_uniform.sqf b/addons/wardrobe/functions/fnc_replace_uniform.sqf index b44f1bba5f8..8b6411074d0 100644 --- a/addons/wardrobe/functions/fnc_replace_uniform.sqf +++ b/addons/wardrobe/functions/fnc_replace_uniform.sqf @@ -33,13 +33,13 @@ private _loadout = [_player] call CBA_fnc_getLoadout; private _hasDocument = _magazineDetails findIf { _x#0 == "acex_intelitems_document" } > -1; private _hasNotepad = _magazineDetails findIf { _x#0 == "acex_intelitems_notepad" } > -1; private _hasPhoto = _magazineDetails findIf { _x#0 == "acex_intelitems_photo" } > -1; -if (_hasDocument) then { _hasDocument = [_player, "acex_intelitems_document"] call FUNC(getMagIDs) apply { [_x] call FUNC(getIndexFromMagID) } }; -if (_hasNotepad) then { _hasNotepad = [_player, "acex_intelitems_notepad"] call FUNC(getMagIDs) apply { [_x] call FUNC(getIndexFromMagID) } }; -if (_hasPhoto) then { _hasPhoto = [_player, "acex_intelitems_photo"] call FUNC(getMagIDs) apply { [_x] call FUNC(getIndexFromMagID) } }; +if (_hasDocument) then { _hasDocument = [_player, "acex_intelitems_document"] call CBA_fnc_getMagazineIndex apply { [_x] call FUNC(getIndexFromMagID) } }; +if (_hasNotepad) then { _hasNotepad = [_player, "acex_intelitems_notepad"] call CBA_fnc_getMagazineIndex apply { [_x] call FUNC(getIndexFromMagID) } }; +if (_hasPhoto) then { _hasPhoto = [_player, "acex_intelitems_photo"] call CBA_fnc_getMagazineIndex apply { [_x] call FUNC(getIndexFromMagID) } }; // ACE Overheating private _hasSpareBarrel = _magazineDetails findIf { _x#0 == "ACE_SpareBarrel" } > -1; -if (_hasSpareBarrel) then { _hasSpareBarrel = [_player, "ACE_SpareBarrel" ] call FUNC(getMagIDs) }; +if (_hasSpareBarrel) then { _hasSpareBarrel = [_player, "ACE_SpareBarrel" ] call CBA_fnc_getMagazineIndex }; //// Replace Wearable @@ -58,12 +58,12 @@ switch (_case) do { //// Handle Special Cases - Post Replace // ACE Intel Items -if (_hasDocument isEqualType []) then { { [_x, _hasDocument # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_document"] call FUNC(getMagIDs) ); }; -if (_hasNotepad isEqualType []) then { { [_x, _hasNotepad # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_notepad"] call FUNC(getMagIDs) ); }; -if (_hasPhoto isEqualType []) then { { [_x, _hasPhoto # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_photo"] call FUNC(getMagIDs) ); }; +if (_hasDocument isEqualType []) then { { [_x, _hasDocument # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_document"] call CBA_fnc_getMagazineIndex ); }; +if (_hasNotepad isEqualType []) then { { [_x, _hasNotepad # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_notepad"] call CBA_fnc_getMagazineIndex ); }; +if (_hasPhoto isEqualType []) then { { [_x, _hasPhoto # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_photo"] call CBA_fnc_getMagazineIndex ); }; // ACE Overheating if (_hasSpareBarrel isEqualType [] ) then { - private _SpareBarrel_new_MagIDs = [_player, "ACE_SpareBarrel"] call FUNC(getMagIDs); + private _SpareBarrel_new_MagIDs = [_player, "ACE_SpareBarrel"] call CBA_fnc_getMagazineIndex; [QGVAR(EH_updateMagIDs), [_hasSpareBarrel, _SpareBarrel_new_MagIDs]] call CBA_fnc_serverEvent; }; From 56e257de8dedff3dbc356b2cd41b73deb6f8e5e1 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 10:44:33 +0100 Subject: [PATCH 095/305] added ace intel item --- .hemtt/missions/Wardrobe.VR/mission.sqm | 59 +++++++++++++++++++++---- 1 file changed, 51 insertions(+), 8 deletions(-) diff --git a/.hemtt/missions/Wardrobe.VR/mission.sqm b/.hemtt/missions/Wardrobe.VR/mission.sqm index 7898931dbb7..de50d66b569 100644 --- a/.hemtt/missions/Wardrobe.VR/mission.sqm +++ b/.hemtt/missions/Wardrobe.VR/mission.sqm @@ -8,14 +8,14 @@ class EditorData toggles=517; class ItemIDProvider { - nextID=203; + nextID=204; }; class Camera { - pos[]={6.6224675,9.7580004,-22.782627}; - dir[]={0.80753577,-0.42340663,0.4107419}; - up[]={0.3774308,0.90591747,0.19197531}; - aside[]={0.45338005,3.1408854e-07,-0.89136314}; + pos[]={10.529591,7.5298214,-21.69327}; + dir[]={0.82719439,-0.34348413,0.44482145}; + up[]={0.30256075,0.93913782,0.16270162}; + aside[]={0.47363219,2.9360672e-07,-0.8807708}; }; }; binarizationWanted=0; @@ -27,13 +27,14 @@ addons[]= "ace_ballistics", "A3_Characters_F", "A3_Soft_F_Exp_Offroad_02", - "A3_Weapons_F_Ammoboxes" + "A3_Weapons_F_Ammoboxes", + "ace_intelitems" }; class AddonsMetaData { class List { - items=4; + items=5; class Item0 { className="A3_Weapons_F"; @@ -62,6 +63,13 @@ class AddonsMetaData author="Bohemia Interactive"; url="https://www.arma3.com"; }; + class Item4 + { + className="ace_intelitems"; + name="ACE3 - Intel Items"; + author="ACE-Team"; + url="https://ace3.acemod.org/"; + }; }; }; dlcs[]= @@ -73,6 +81,9 @@ class ScenarioData { author="Overlord Zorn"; }; +class CustomAttributes +{ +}; class Mission { class Intel @@ -96,7 +107,7 @@ class Mission }; class Entities { - items=5; + items=6; class Item0 { dataType="Object"; @@ -264,5 +275,37 @@ class Mission id=202; type="B_AssaultPack_blk"; }; + class Item5 + { + dataType="Object"; + class PositionInfo + { + position[]={17.528999,5.0073819,-17.298}; + }; + side="Empty"; + flags=4; + class Attributes + { + }; + id=203; + type="acex_intelitems_document"; + class CustomAttributes + { + class Attribute0 + { + property="ace_intelitems_data"; + expression="[_this, _value] call ace_intelitems_fnc_setObjectData"; + class Value + { + class data + { + singleType="STRING"; + value="Funny Bean Toast Man struck again."; + }; + }; + }; + nAttributes=1; + }; + }; }; }; From 205f32262cc4ad976a00e110bd4b62bbfc97e6ec Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 10:50:55 +0100 Subject: [PATCH 096/305] condense replace functions --- addons/wardrobe/XEH_PREP.hpp | 5 ++-- addons/wardrobe/functions/fnc_replace.sqf | 10 +++---- ..._uniform.sqf => fnc_replace_container.sqf} | 0 .../functions/fnc_replace_headgear.sqf | 27 ------------------- ...ace_facewear.sqf => fnc_replace_other.sqf} | 15 ++++++++--- 5 files changed, 19 insertions(+), 38 deletions(-) rename addons/wardrobe/functions/{fnc_replace_uniform.sqf => fnc_replace_container.sqf} (100%) delete mode 100644 addons/wardrobe/functions/fnc_replace_headgear.sqf rename addons/wardrobe/functions/{fnc_replace_facewear.sqf => fnc_replace_other.sqf} (52%) diff --git a/addons/wardrobe/XEH_PREP.hpp b/addons/wardrobe/XEH_PREP.hpp index e050f7c9533..496773c2e5c 100644 --- a/addons/wardrobe/XEH_PREP.hpp +++ b/addons/wardrobe/XEH_PREP.hpp @@ -11,9 +11,8 @@ PREP(getItems_modifiable_current); PREP(getItems_modifiableTo); // Replace PREP(replace); -PREP(replace_headgear); -PREP(replace_facewear); -PREP(replace_uniform); +PREP(replace_other); +PREP(replace_container); // Compat PREP(spareBarrel_updateMagIDs); // Ace Actions diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 9ce16bb7668..b57e6518aaf 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -32,14 +32,14 @@ if (_replaceNow) then { _duration = 0; }; private _additionalParams = ""; private _typeNumber = getNumber (_cfg_origin >> "ItemInfo" >> "type"); private _replaceCode = switch ( _typeNumber ) do { - case TYPE_HEADGEAR: { FUNC(replace_headgear) }; - case TYPE_UNIFORM: { _additionalParams = "UNIFORM"; FUNC(replace_uniform) }; - case TYPE_VEST: { _additionalParams = "VEST"; FUNC(replace_uniform) }; - case TYPE_BACKPACK: { _additionalParams = "BACKPACK"; FUNC(replace_uniform) }; + case TYPE_HEADGEAR: { _additionalParams = "HEADGEAR"; FUNC(replace_other) }; + case TYPE_UNIFORM: { _additionalParams = "UNIFORM"; FUNC(replace_container) }; + case TYPE_VEST: { _additionalParams = "VEST"; FUNC(replace_container) }; + case TYPE_BACKPACK: { _additionalParams = "BACKPACK"; FUNC(replace_container) }; default { // CfgGlasses items do not have a ItemInfo Subclass and therefore, not TypeNumber. switch (true) do { - case (isClass (configFile >> "CfgGlasses" >> configName _cfg_origin)): { FUNC(replace_facewear) }; + case (isClass (configFile >> "CfgGlasses" >> configName _cfg_origin)): { _additionalParams = "FACEWEAR"; FUNC(replace_other) }; default { false }; }; }; diff --git a/addons/wardrobe/functions/fnc_replace_uniform.sqf b/addons/wardrobe/functions/fnc_replace_container.sqf similarity index 100% rename from addons/wardrobe/functions/fnc_replace_uniform.sqf rename to addons/wardrobe/functions/fnc_replace_container.sqf diff --git a/addons/wardrobe/functions/fnc_replace_headgear.sqf b/addons/wardrobe/functions/fnc_replace_headgear.sqf deleted file mode 100644 index 5a3592b61c6..00000000000 --- a/addons/wardrobe/functions/fnc_replace_headgear.sqf +++ /dev/null @@ -1,27 +0,0 @@ -#include "../script_component.hpp" - -/* - * Author: OverlordZorn - * Function to replace a persons Headgear/Helmet slot. - * - * Arguments: - * 0: Unit - * 1: Current Variant - * 2: Desired Variant - * - * Return Value: - * None - * - * Example: - * [_player, _cfg_origin, _cfg_tgt] call ace_wardrobe_fnc_replace_headgear - * - * Public: No - */ - -params ["_player", "_cfg_origin", "_cfg_tgt"]; -removeHeadgear _player; -_player addHeadgear configName _cfg_tgt; - - - - diff --git a/addons/wardrobe/functions/fnc_replace_facewear.sqf b/addons/wardrobe/functions/fnc_replace_other.sqf similarity index 52% rename from addons/wardrobe/functions/fnc_replace_facewear.sqf rename to addons/wardrobe/functions/fnc_replace_other.sqf index 0d6eec65d1b..4d14fb3364b 100644 --- a/addons/wardrobe/functions/fnc_replace_facewear.sqf +++ b/addons/wardrobe/functions/fnc_replace_other.sqf @@ -18,6 +18,15 @@ * Public: No */ -params ["_player", "_cfg_origin", "_cfg_tgt"]; -removeGoggles _player; -_player addGoggles configName _cfg_tgt; +params ["_player", "_cfg_origin", "_cfg_tgt", "_additionalParams"]; + +switch (_additionalParams) do { + case "HEADGEAR": { + removeHeadgear _player; + _player addHeadgear configName _cfg_tgt; + }; + case "FACEWEAR": { + removeGoggles _player; + _player addGoggles configName _cfg_tgt; + }; +}; From 34aa2d92a16764ee34f9e6c8d360e1eb834464dc Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 11:49:53 +0100 Subject: [PATCH 097/305] remove func(cache_db) --- addons/wardrobe/XEH_PREP.hpp | 1 - addons/wardrobe/XEH_preInit.sqf | 2 ++ addons/wardrobe/functions/fnc_cache_db.sqf | 27 --------------------- addons/wardrobe/functions/fnc_cache_get.sqf | 6 ++--- addons/wardrobe/functions/fnc_cache_set.sqf | 4 +-- 5 files changed, 6 insertions(+), 34 deletions(-) delete mode 100644 addons/wardrobe/functions/fnc_cache_db.sqf diff --git a/addons/wardrobe/XEH_PREP.hpp b/addons/wardrobe/XEH_PREP.hpp index 496773c2e5c..106ba691918 100644 --- a/addons/wardrobe/XEH_PREP.hpp +++ b/addons/wardrobe/XEH_PREP.hpp @@ -22,7 +22,6 @@ PREP(addActions_children); PREP(getAction_Name); PREP(getAction_Icon); // Cache -PREP(cache_db); PREP(cache_get); PREP(cache_set); PREP(cache_clear); diff --git a/addons/wardrobe/XEH_preInit.sqf b/addons/wardrobe/XEH_preInit.sqf index 894773534a4..6d5fd0a42f7 100644 --- a/addons/wardrobe/XEH_preInit.sqf +++ b/addons/wardrobe/XEH_preInit.sqf @@ -8,4 +8,6 @@ PREP_RECOMPILE_END; #include "initSettings.inc.sqf" +missionNamespace setVariable [QGVAR(cache), createHashMap]; + ADDON = true; diff --git a/addons/wardrobe/functions/fnc_cache_db.sqf b/addons/wardrobe/functions/fnc_cache_db.sqf deleted file mode 100644 index 0945178049c..00000000000 --- a/addons/wardrobe/functions/fnc_cache_db.sqf +++ /dev/null @@ -1,27 +0,0 @@ -#include "../script_component.hpp" - -/* - * Author: OverlordZorn - * Function to retrieve the Cache Database (Hashmap). - * - * Arguments: - * None - * - * Return Value: - * Cache Database - * - * Example: - * [] call ace_wardrobe_fnc_cache_db - * - * Public: No - */ - - -private _map = missionNamespace getVariable [QGVAR(cache), "404"]; - -if (_map isEqualTo "404") then { - _map = createHashMap; - missionNamespace setVariable [QGVAR(cache), _map]; -}; - -_map diff --git a/addons/wardrobe/functions/fnc_cache_get.sqf b/addons/wardrobe/functions/fnc_cache_get.sqf index 9f43e97094c..ba8d74ae5a4 100644 --- a/addons/wardrobe/functions/fnc_cache_get.sqf +++ b/addons/wardrobe/functions/fnc_cache_get.sqf @@ -22,7 +22,7 @@ params [ [ "_key", "", [""] ], [ "_else", "404", [{}] ] ]; if (_else isEqualTo "404") then { - [] call FUNC(cache_db) getOrDefault [_key, "404"]; + GVAR(cache) getOrDefault [_key, "404"]; } else { - [] call FUNC(cache_db) getOrDefaultCall [_key, _else, true]; -}; + GVAR(cache) getOrDefaultCall [_key, _else, true]; +}; \ No newline at end of file diff --git a/addons/wardrobe/functions/fnc_cache_set.sqf b/addons/wardrobe/functions/fnc_cache_set.sqf index cb10a50a8c3..7640c9d7e3e 100644 --- a/addons/wardrobe/functions/fnc_cache_set.sqf +++ b/addons/wardrobe/functions/fnc_cache_set.sqf @@ -21,10 +21,8 @@ params [ ["_key", "", [""] ], ["_value", "404"] ]; -private _db = [] call FUNC(cache_db); - if (_value isEqualTo "404") exitWith { false }; -_db set [_key, _value]; +GVAR(cache) set [_key, _value]; true From 8d044232fde9a44357db4a5dd45ef2e1eb594c6c Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 11:50:44 +0100 Subject: [PATCH 098/305] unused function --- addons/wardrobe/XEH_PREP.hpp | 1 - .../functions/fnc_clearOnClosed_Inventory.sqf | 37 ------------------- 2 files changed, 38 deletions(-) delete mode 100644 addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf diff --git a/addons/wardrobe/XEH_PREP.hpp b/addons/wardrobe/XEH_PREP.hpp index 106ba691918..ca5dc579fb3 100644 --- a/addons/wardrobe/XEH_PREP.hpp +++ b/addons/wardrobe/XEH_PREP.hpp @@ -26,7 +26,6 @@ PREP(cache_get); PREP(cache_set); PREP(cache_clear); PREP(clearOnClosed_InteractionMenu); -PREP(clearOnClosed_Inventory); // Config PREP(getCfgDataRandom); // Debug diff --git a/addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf b/addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf deleted file mode 100644 index 63ce6cddfc1..00000000000 --- a/addons/wardrobe/functions/fnc_clearOnClosed_Inventory.sqf +++ /dev/null @@ -1,37 +0,0 @@ -#include "../script_component.hpp" - -/* - * Author: OverlordZorn - * Function to request the clearing of the cache once the Inventory Window gets closed. - * - * Arguments: - * 0: Key - * - * Return Value: - * None - * - * Example: - * ["tag_myKeyName"] call ace_wardrobe_fnc_clearOnClosed_Inventory - * - * Public: yes - */ - -params [ ["_key", "", [""]] ]; - -private _queue = missionNamespace getVariable [QGVAR(inventory_clear_queue), "404"]; - -if (_queue isEqualTo "404") then { - - _queue = []; - - player addEventHandler ["InventoryClosed", { - { [_x] call FUNC(cache_clear) } forEach ( missionNamespace getVariable [QGVAR(inventory_clear_queue), [] ] ); - missionNamespace setVariable [QGVAR(inventory_clear_queue), nil ]; - player removeEventHandler [_thisEvent, _thisEventhandler]; - }]; - missionNamespace setVariable [QGVAR(inventory_clear_queue), _queue]; -}; - -_queue pushBackUnique _key; - -nil From 559388c15084587061dbff71bcf7088b14f0a049 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 11:53:06 +0100 Subject: [PATCH 099/305] macrofied --- .../functions/fnc_replace_container.sqf | 18 ++++++---------- addons/wardrobe/script_macros_wardrobe.hpp | 21 ++++++++++++++++++- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/addons/wardrobe/functions/fnc_replace_container.sqf b/addons/wardrobe/functions/fnc_replace_container.sqf index 8b6411074d0..9de67da85af 100644 --- a/addons/wardrobe/functions/fnc_replace_container.sqf +++ b/addons/wardrobe/functions/fnc_replace_container.sqf @@ -21,21 +21,16 @@ params ["_player", "_cfg_origin", "_cfg_tgt", "_case"]; - toFixed 0; private _magazineDetails = (magazinesAmmoFull _player) apply { [_x#0, _x#-2, _x#-1] }; private _loadout = [_player] call CBA_fnc_getLoadout; //// Handle Special Cases - Pre Replace - // ACE Intel Items -private _hasDocument = _magazineDetails findIf { _x#0 == "acex_intelitems_document" } > -1; -private _hasNotepad = _magazineDetails findIf { _x#0 == "acex_intelitems_notepad" } > -1; -private _hasPhoto = _magazineDetails findIf { _x#0 == "acex_intelitems_photo" } > -1; -if (_hasDocument) then { _hasDocument = [_player, "acex_intelitems_document"] call CBA_fnc_getMagazineIndex apply { [_x] call FUNC(getIndexFromMagID) } }; -if (_hasNotepad) then { _hasNotepad = [_player, "acex_intelitems_notepad"] call CBA_fnc_getMagazineIndex apply { [_x] call FUNC(getIndexFromMagID) } }; -if (_hasPhoto) then { _hasPhoto = [_player, "acex_intelitems_photo"] call CBA_fnc_getMagazineIndex apply { [_x] call FUNC(getIndexFromMagID) } }; +INTEL_PRE(_hasDocument,acex_intelitems_document) +INTEL_PRE(_hasNotepad,acex_intelitems_notepad) +INTEL_PRE(_hasPhoto,acex_intelitems_photo) // ACE Overheating private _hasSpareBarrel = _magazineDetails findIf { _x#0 == "ACE_SpareBarrel" } > -1; @@ -56,11 +51,10 @@ switch (_case) do { //// Handle Special Cases - Post Replace - // ACE Intel Items -if (_hasDocument isEqualType []) then { { [_x, _hasDocument # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_document"] call CBA_fnc_getMagazineIndex ); }; -if (_hasNotepad isEqualType []) then { { [_x, _hasNotepad # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_notepad"] call CBA_fnc_getMagazineIndex ); }; -if (_hasPhoto isEqualType []) then { { [_x, _hasPhoto # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, "acex_intelitems_photo"] call CBA_fnc_getMagazineIndex ); }; +INTEL_POST(_hasDocument,acex_intelitems_document) +INTEL_POST(_hasNotepad,acex_intelitems_notepad) +INTEL_POST(_hasPhoto,acex_intelitems_photo) // ACE Overheating if (_hasSpareBarrel isEqualType [] ) then { diff --git a/addons/wardrobe/script_macros_wardrobe.hpp b/addons/wardrobe/script_macros_wardrobe.hpp index 75236f0e046..df15fa4f94f 100644 --- a/addons/wardrobe/script_macros_wardrobe.hpp +++ b/addons/wardrobe/script_macros_wardrobe.hpp @@ -15,4 +15,23 @@ // Paths #define PATH_TO_FUNC QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\functions) -#define PATH_TO_FUNC_SUB(var1) QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\functions\var1) \ No newline at end of file +#define PATH_TO_FUNC_SUB(var1) QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\functions\var1) + + +// Config + +//// Adjust Weight of CfgWeapons Wearables. +#define MASS(var)\ +class ItemInfo: ItemInfo {\ + mass = var;\ +}; + + +// REPLACE +#define INTEL_PRE(varName,className)\ +private varName = _magazineDetails findIf { _x#0 == QUOTE(className) } > -1;\ +if (varName) then { _hasDocument = [_player, QUOTE(className)] call CBA_fnc_getMagazineIndex apply { [_x] call FUNC(getIndexFromMagID) } }; + +#define INTEL_POST(varName,className)\ +if (varName isEqualType []) then { { [_x, varName # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, QUOTE(className)] call CBA_fnc_getMagazineIndex ); }; + From 19d464e7e9cfbad1c240d07a5dfbad08f2fade5c Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 11:53:25 +0100 Subject: [PATCH 100/305] fix inheritance --- addons/compat_ws/compat_ws_wardrobe/Turbans.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp index ff8b091e736..791fc9e2531 100644 --- a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp @@ -28,7 +28,7 @@ class CN(04,COLOR): lxWS_H_turban_04_black {\ #define COLORGROUP_SPECIAL(COLOR)\ -class CN(02,COLOR): lxWS_H_turban_02_black {\ +class CN(02,COLOR): lxWS_H_turban_02_green {\ class ace_wardrobe: EGVAR(wardrobe,base) {\ modifiableTo[] = { QCN(03,COLOR) };\ };\ From c9091fc9b447ddefeec57e16455ebed1b19e4caa Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 11:53:52 +0100 Subject: [PATCH 101/305] cleanup --- .../Uniforms.hpp | 5 -- .../compat_ws_wardrobe/CfgWardrobe.hpp | 68 ++++++++++++++++++- .../compat_ws/compat_ws_wardrobe/Turbans.hpp | 10 +-- addons/wardrobe/functions/fnc_replace.sqf | 14 ++-- 4 files changed, 81 insertions(+), 16 deletions(-) diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp index c62a7c6f743..9bebdd2e2f3 100644 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp @@ -8,11 +8,6 @@ class className: vn_b_uniform_base {\ };\ }; -#define MASS(var)\ -class ItemInfo: ItemInfo {\ - mass = var;\ -}; - class CfgWeapons { class vn_b_uniform_base; diff --git a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp index c49da34f18a..8ad96b2bfc2 100644 --- a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp @@ -1,6 +1,21 @@ class EGVAR(wardrobe,base); +class EGVAR(wardrobe,base_H_goggles_on); +class EGVAR(wardrobe,base_H_goggles_off); + + + +class CfgGlasses { + class G_Combat; + class G_Combat_lxWS: G_Combat { + class ace_wardrobe: EGVAR(wardrobe,base) { + components[] = {"G_Combat_lxWS"}; + }; + }; +}; class CfgWeapons { + #include "Turbans.hpp" + // Cap (Ion) Forward and Reversed class lxWS_H_CapB_rvs_blk; class lxWS_H_CapB_rvs_blk_ION: lxWS_H_CapB_rvs_blk { @@ -14,5 +29,56 @@ class CfgWeapons { }; }; - #include "Turbans.hpp" + // Helmets + class HelmetBase; + class H_PASGT_basic_base_F; + + //// RF Helmets with Glasses + class lxWS_H_PASGT_goggles_UN_F: HelmetBase { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { + modifiableTo[] = { "lxWS_H_PASGT_basic_UN_F" }; + components[] = {"G_Combat_lxWS"}; + }; + }; + class lxWS_H_PASGT_goggles_black_F: lxWS_H_PASGT_goggles_UN_F { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { + modifiableTo[] = { "H_PASGT_basic_black_F" }; + components[] = {"G_Combat_lxWS"}; + }; + }; + class lxWS_H_PASGT_goggles_olive_F: lxWS_H_PASGT_goggles_UN_F { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { + modifiableTo[] = { "H_PASGT_basic_olive_F" }; + components[] = {"G_Combat_lxWS"}; + }; + }; + class lxWS_H_PASGT_goggles_white_F: lxWS_H_PASGT_goggles_UN_F { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { + modifiableTo[] = { "H_PASGT_basic_white_F" }; + components[] = {"G_Combat_lxWS"}; + }; + }; + + // Without + class lxWS_H_PASGT_basic_UN_F: HelmetBase { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { + modifiableTo[] = { "lxWS_H_PASGT_goggles_UN_F" }; + }; + }; + class H_PASGT_basic_black_F: H_PASGT_basic_base_F { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { + modifiableTo[] = { "lxWS_H_PASGT_goggles_black_F" }; + }; + }; + class H_PASGT_basic_olive_F: H_PASGT_basic_base_F { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { + modifiableTo[] = { "lxWS_H_PASGT_goggles_olive_F" }; + }; + }; + class H_PASGT_basic_white_F: H_PASGT_basic_base_F { + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { + modifiableTo[] = { "lxWS_H_PASGT_goggles_white_F" }; + }; + }; }; + diff --git a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp index 791fc9e2531..1d9129d2062 100644 --- a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp @@ -89,28 +89,28 @@ class H_turban_02_mask_snake_lxws: H_turban_02_mask_black_lxws { components[] = {"H_bmask_snake_lxws"}; }; }; -class H_turban_02_mask_hex_lxws: H_turban_02_mask_black_lxws { +class H_turban_02_mask_hex_lxws: H_turban_02_mask_black_lxws { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws" }; components[] = {"lxWS_H_bmask_hex"}; }; }; -class lxWS_H_turban_01_sand: lxWS_H_turban_01_black { +class lxWS_H_turban_01_sand: lxWS_H_turban_01_black { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; -class lxWS_H_turban_02_sand: lxWS_H_turban_02_black { +class lxWS_H_turban_02_sand: lxWS_H_turban_02_black { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; -class lxWS_H_turban_03_sand: lxWS_H_turban_03_black { +class lxWS_H_turban_03_sand: lxWS_H_turban_03_black { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; }; -class lxWS_H_turban_04_sand: lxWS_H_turban_04_black { +class lxWS_H_turban_04_sand: lxWS_H_turban_04_black { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; }; diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index b57e6518aaf..5982d30236b 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -46,8 +46,7 @@ private _replaceCode = switch ( _typeNumber ) do { }; if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 - %2",_typeNumber,configName _cfg_origin); }; - -[ _replaceCode, [_unit, _cfg_origin, _cfg_tgt, _additionalParams ], _duration * 1.0 ] call CBA_fnc_waitAndExecute; +[ _replaceCode, [_unit, _cfg_origin, _cfg_tgt, _additionalParams ], _duration] call CBA_fnc_waitAndExecute; //// Handle Components // Add Surplus @@ -79,13 +78,18 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 [ _unit, getText (_cfg_tgt >> QADDON >> "gesture") ] call ace_common_fnc_doGesture; // Plays Random Sound At the Beginning -private _sound_timing = getNumber (_cfg_tgt>> QADDON >> "sound_timing") max 0 min 1; private _sound = [_cfg_tgt >> QADDON >> "sound"] call FUNC(getCfgDataRandom); -if (_sound != "") then { [ CBA_fnc_globalEvent, [QGVAR(EH_say3d), [_unit, _sound]], _sound_timing * _duration ] call CBA_fnc_waitAndExecute; }; +if (_sound != "") then { + [ + CBA_fnc_globalEvent, + [QGVAR(EH_say3d), [_unit,_sound]], + (getNumber (_cfg_tgt>> QADDON >> "sound_timing") max 0 min 1) * _duration + ] call CBA_fnc_waitAndExecute; +}; // Notification private _notify_img = getText (_cfg_tgt >> "picture"); if !(".paa" in _notify_img) then { _notify_img = [_notify_img,"paa"] joinString "." }; -[ CBA_fnc_notify, [[ _notify_img, 4], [getText (_cfg_tgt >> "displayName")], true ], _duration * 1.2 ] call CBA_fnc_waitAndExecute; +[ CBA_fnc_notify, [[ _notify_img, 4], [getText (_cfg_tgt >> "displayName")], true ], _duration * 1.2 ] call CBA_fnc_waitAndExecute; nil From 37b9945db84492c72b78f21cc8aa52a280f2a848 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 12:09:12 +0100 Subject: [PATCH 102/305] cleanup --- addons/wardrobe/XEH_PREP.hpp | 1 - addons/wardrobe/functions/fnc_addActions.sqf | 21 ++++-------- .../functions/fnc_addActions_children.sqf | 22 ++++--------- .../functions/fnc_addCM_nextvariant.sqf | 32 ------------------- .../functions/fnc_compare_components.sqf | 13 +++++--- .../fnc_compare_container_maxLoad.sqf | 2 +- .../functions/fnc_enable_contextMenu.sqf | 16 +++++++++- .../functions/fnc_getIndexFromMagID.sqf | 4 +-- .../functions/fnc_setIndexForMagID.sqf | 2 +- 9 files changed, 42 insertions(+), 71 deletions(-) delete mode 100644 addons/wardrobe/functions/fnc_addCM_nextvariant.sqf diff --git a/addons/wardrobe/XEH_PREP.hpp b/addons/wardrobe/XEH_PREP.hpp index ca5dc579fb3..cd8aec06557 100644 --- a/addons/wardrobe/XEH_PREP.hpp +++ b/addons/wardrobe/XEH_PREP.hpp @@ -33,6 +33,5 @@ PREP(getAllWardrobeItems); PREP(compare_container_maxLoad); // CBA Context Menu PREP(enable_contextMenu); -PREP(addCM_nextvariant); PREP(do_nextVariant); PREP(getNextVariant); \ No newline at end of file diff --git a/addons/wardrobe/functions/fnc_addActions.sqf b/addons/wardrobe/functions/fnc_addActions.sqf index e31913e9208..3f781a81423 100644 --- a/addons/wardrobe/functions/fnc_addActions.sqf +++ b/addons/wardrobe/functions/fnc_addActions.sqf @@ -24,21 +24,14 @@ private _modifiableItems = [_unit] call FUNC(getItems_modifiable_current); private _actions = []; { private _cfg = _x#0; - private _className = configName _cfg; - private _params = [_cfg, _x#1]; - private _aceAction = [ - _className // * 0: Action name - ,getText (_cfg >> "displayName") // * 1: Name of the action shown in the menu - ,getText (_cfg >> "picture") // * 2: Icon "\A3\ui_f\data\igui\cfg\simpleTasks\types\backpack_ca.paa" - ,{} // * 3: Statement - ,{true} // * 4: Condition - ,FUNC(addActions_children) // * 5: Insert children code (Optional) - ,_params // * 6: Action parameters (Optional) - // ,[0,0,0] // * 7: Position (Position array, Position code or Selection Name) , or (Optional) - // ,20 // * 8: Distance (Optional) - // ,[false,false,false,false,false] // * 9: Other parameters [showDisabled,enableInside,canCollapse,runOnHover,doNotCheckLOS] (Optional) - // ,{} // * 10: Modifier function (Optional) + configName _cfg, + getText (_cfg >> "displayName"), + getText (_cfg >> "picture"), + {}, + {true}, + FUNC(addActions_children), + [_cfg, _x#1] ] call ace_interact_menu_fnc_createAction; _actions pushBack [_aceAction, [], _target]; diff --git a/addons/wardrobe/functions/fnc_addActions_children.sqf b/addons/wardrobe/functions/fnc_addActions_children.sqf index 5da634b9fd8..3f40fed0097 100644 --- a/addons/wardrobe/functions/fnc_addActions_children.sqf +++ b/addons/wardrobe/functions/fnc_addActions_children.sqf @@ -28,22 +28,14 @@ private _actions = []; { private _cfg_target = _x; - private _className_target = configName _cfg_target; - - private _params = [_cfg_origin, _cfg_target]; - private _aceAction = [ - _className_target // * 0: Action name - ,[_cfg_target] call FUNC(getAction_Name) // * 1: Name of the action shown in the menu - ,[_cfg_target] call FUNC(getAction_Icon) // * 2: Icon "\A3\ui_f\data\igui\cfg\simpleTasks\types\backpack_ca.paa" - ,FUNC(replace) // * 3: Statement - ,{true} // * 4: Condition - ,{} // * 5: Insert children code (Optional) - ,_params // * 6: Action parameters (Optional) - // ,[0,0,0] // * 7: Position (Position array, Position code or Selection Name) , or (Optional) - // ,20 // * 8: Distance (Optional) - // ,[false,false,false,false,false] // * 9: Other parameters [showDisabled,enableInside,canCollapse,runOnHover,doNotCheckLOS] (Optional) - // ,{} // * 10: Modifier function (Optional) + configName _cfg_target, + [_cfg_target] call FUNC(getAction_Name), + [_cfg_target] call FUNC(getAction_Icon), + FUNC(replace), + {true}, + {}, + [_cfg_origin, _cfg_target] ] call ace_interact_menu_fnc_createAction; _actions pushBack [_aceAction, [], _target]; diff --git a/addons/wardrobe/functions/fnc_addCM_nextvariant.sqf b/addons/wardrobe/functions/fnc_addCM_nextvariant.sqf deleted file mode 100644 index 62ceb2dacf0..00000000000 --- a/addons/wardrobe/functions/fnc_addCM_nextvariant.sqf +++ /dev/null @@ -1,32 +0,0 @@ -#include "../script_component.hpp" - -/* - * Author: OverlordZorn - * Function to create the CBA ContextMenu Option to switch to the (randomly choosen) next Variant of the current Version. - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * [] call ace_wardrobe_fnc_addCM_nextvariant - * - * Public: No - */ - -[ - "#ALL", // filter items - "CLOTHES", // filter slots - "Switch to next Variant", // Display Name - [], // Color - QPATHTOF(data\wardrobe_logo.paa), // Icon - [ - {true}, // Condition Enable action - {true} // Condition Show Action - ], - FUNC(do_nextVariant), // statement - false, // consume Item - [] // Params -] call CBA_fnc_addItemContextMenuOption; diff --git a/addons/wardrobe/functions/fnc_compare_components.sqf b/addons/wardrobe/functions/fnc_compare_components.sqf index 184b5c3a34a..6271f1ffbc4 100644 --- a/addons/wardrobe/functions/fnc_compare_components.sqf +++ b/addons/wardrobe/functions/fnc_compare_components.sqf @@ -10,8 +10,8 @@ * * Return Value: * Nested array - * - Array of configs of missing components - * - Array of configs of surplus components + * - configs of missing components + * - configs of surplus components * * Example: * [_cfg_origin, _cfg_tgt] call ace_wardrobe_fnc_compare_components @@ -26,7 +26,12 @@ private _needed = getArray (_cfg_tgt >> "ace_wardrobe" >> "components"); private _missing = []; -{ if (_x in _current) then { _current = _current - [_x] } else { _missing pushBack _x }; } forEach _needed; +{ + if (_x in _current) then { + _current = _current - [_x] + } else { + _missing pushBack _x + }; +} forEach _needed; -//[[missing components], [surplus components]] [_missing, _current] diff --git a/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf b/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf index c818edfdf6e..65c5d988dff 100644 --- a/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf +++ b/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf @@ -2,7 +2,7 @@ /* * Author: OverlordZorn - * This function will compare the maxLoad of all modifiable Items with its modifiableTo Variants and will provide an RPT output. + * WIP - This function will compare the maxLoad of all modifiable Items with its modifiableTo Variants and will provide an RPT output. * * Arguments: * None diff --git a/addons/wardrobe/functions/fnc_enable_contextMenu.sqf b/addons/wardrobe/functions/fnc_enable_contextMenu.sqf index 67f2d7f6221..87410477159 100644 --- a/addons/wardrobe/functions/fnc_enable_contextMenu.sqf +++ b/addons/wardrobe/functions/fnc_enable_contextMenu.sqf @@ -21,5 +21,19 @@ params [["_enable", true, [true]]]; if (_enable && {!(missionNamespace getVariable [QGVAR(contextmenu_enabled), false])}) then { missionNamespace setVariable [QGVAR(contextmenu_enabled), true]; - [] call FUNC(addCM_nextvariant); + + [ + "#ALL", + "CLOTHES", + "Switch to next Variant", + [], + QPATHTOF(data\wardrobe_logo.paa), + [ + {true}, + {true} + ], + FUNC(do_nextVariant), + false, + [] + ] call CBA_fnc_addItemContextMenuOption; }; diff --git a/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf index 20aca66709d..16a1b6e8d6f 100644 --- a/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf +++ b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf @@ -20,6 +20,6 @@ params [ ["_magazineID", "", [""] ] ]; -if !(_magazineID in allVariables ace_intelItems_intelMap) exitWith { -1 }; +if !(_magazineID in allVariables EGVAR(intelItems,intelMap)) exitWith { -1 }; -ace_intelItems_intelMap getVariable _magazineID +EGVAR(intelItems,intelMap) getVariable _magazineID diff --git a/addons/wardrobe/functions/fnc_setIndexForMagID.sqf b/addons/wardrobe/functions/fnc_setIndexForMagID.sqf index a63a8690aff..187076ad39e 100644 --- a/addons/wardrobe/functions/fnc_setIndexForMagID.sqf +++ b/addons/wardrobe/functions/fnc_setIndexForMagID.sqf @@ -24,4 +24,4 @@ params [ if (_index == -1) exitWith {}; -ace_intelItems_intelMap setVariable [_magID, _index, true]; +EGVAR(intelItems,intelMap) setVariable [_magID, _index, true]; From f5f38fd737213bbbd0ed40d9045cd1fb052d7c9d Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 14:35:30 +0100 Subject: [PATCH 103/305] remove fnc_db_clear --- addons/wardrobe/functions/fnc_cache_clear.sqf | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/addons/wardrobe/functions/fnc_cache_clear.sqf b/addons/wardrobe/functions/fnc_cache_clear.sqf index 8f6bd0b7133..ea00e831012 100644 --- a/addons/wardrobe/functions/fnc_cache_clear.sqf +++ b/addons/wardrobe/functions/fnc_cache_clear.sqf @@ -19,6 +19,4 @@ params [ ["_key", "", [""]] ]; private _map = missionNamespace getVariable [QGVAR(cache), "404"]; -_map deleteAt _key; - -if (count _map == 0) then { missionNamespace setVariable [QGVAR(cache),nil] }; +_map deleteAt _key; \ No newline at end of file From 4d8322b86ab7238c6fc4b1fd5c1494a49a2e8c49 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 14:56:51 +0100 Subject: [PATCH 104/305] reduce fnc clear cache --- addons/wardrobe/XEH_PREP.hpp | 1 - addons/wardrobe/functions/fnc_cache_clear.sqf | 22 ------------------- .../fnc_clearOnClosed_InteractionMenu.sqf | 2 +- 3 files changed, 1 insertion(+), 24 deletions(-) delete mode 100644 addons/wardrobe/functions/fnc_cache_clear.sqf diff --git a/addons/wardrobe/XEH_PREP.hpp b/addons/wardrobe/XEH_PREP.hpp index cd8aec06557..d3277cea11f 100644 --- a/addons/wardrobe/XEH_PREP.hpp +++ b/addons/wardrobe/XEH_PREP.hpp @@ -24,7 +24,6 @@ PREP(getAction_Icon); // Cache PREP(cache_get); PREP(cache_set); -PREP(cache_clear); PREP(clearOnClosed_InteractionMenu); // Config PREP(getCfgDataRandom); diff --git a/addons/wardrobe/functions/fnc_cache_clear.sqf b/addons/wardrobe/functions/fnc_cache_clear.sqf deleted file mode 100644 index ea00e831012..00000000000 --- a/addons/wardrobe/functions/fnc_cache_clear.sqf +++ /dev/null @@ -1,22 +0,0 @@ -#include "../script_component.hpp" - -/* - * Author: OverlordZorn - * Function to clear an entry from the cache-database. - * - * Arguments: - * 0: Key - * - * Return Value: - * None - * - * Example: - * ["myKey"] call ace_wardrobe_fnc_cache_clear - * - * Public: Yes - */ - -params [ ["_key", "", [""]] ]; - -private _map = missionNamespace getVariable [QGVAR(cache), "404"]; -_map deleteAt _key; \ No newline at end of file diff --git a/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf b/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf index e795c710f0d..f7e54eef1cf 100644 --- a/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf +++ b/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf @@ -27,7 +27,7 @@ if (_queue isEqualTo "404") then { { if (_this isNotEqualTo [1]) exitWith {}; - { [_x] call FUNC(cache_clear) } forEach ( missionNamespace getVariable [QGVAR(menu_clear_queue), [] ] ); + { GVAR(cache) deleteAt _x } forEach ( missionNamespace getVariable [QGVAR(menu_clear_queue), [] ] ); missionNamespace setVariable [QGVAR(menu_clear_queue), nil ]; [_thisType, _thisId] call CBA_fnc_removeEventHandler; From ef982b2c4e6307c5cebe4aa99cc525de0b64e266 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 15:57:28 +0100 Subject: [PATCH 105/305] ws compats - helmets --- .../compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp | 15 ++++++++++++++- addons/compat_ws/compat_ws_wardrobe/Turbans.hpp | 3 +++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp index 8ad96b2bfc2..65562da4807 100644 --- a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp @@ -13,7 +13,17 @@ class CfgGlasses { }; }; + + + + class CfgWeapons { + + class ItemCore; + class HelmetBase: ItemCore { + class ItemInfo; + }; + #include "Turbans.hpp" // Cap (Ion) Forward and Reversed @@ -30,29 +40,32 @@ class CfgWeapons { }; // Helmets - class HelmetBase; class H_PASGT_basic_base_F; //// RF Helmets with Glasses class lxWS_H_PASGT_goggles_UN_F: HelmetBase { + MASS(32) class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { modifiableTo[] = { "lxWS_H_PASGT_basic_UN_F" }; components[] = {"G_Combat_lxWS"}; }; }; class lxWS_H_PASGT_goggles_black_F: lxWS_H_PASGT_goggles_UN_F { + MASS(32) class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { modifiableTo[] = { "H_PASGT_basic_black_F" }; components[] = {"G_Combat_lxWS"}; }; }; class lxWS_H_PASGT_goggles_olive_F: lxWS_H_PASGT_goggles_UN_F { + MASS(32) class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { modifiableTo[] = { "H_PASGT_basic_olive_F" }; components[] = {"G_Combat_lxWS"}; }; }; class lxWS_H_PASGT_goggles_white_F: lxWS_H_PASGT_goggles_UN_F { + MASS(32) class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { modifiableTo[] = { "H_PASGT_basic_white_F" }; components[] = {"G_Combat_lxWS"}; diff --git a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp index 1d9129d2062..a1f41839dd2 100644 --- a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp @@ -47,6 +47,9 @@ class H_turban_02_mask_black_lxws: H_Shemag_khk { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(03,black), QCN(04,black) }; components[] = { "lxWS_H_bmask_base" }; + ItemInfo: ItemInfo { + mass = 26; + }; }; }; class lxWS_H_turban_01_black: H_Shemag_khk { From bfa77178c0238df6d18b98a3bac2bbc253851049 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 15:57:44 +0100 Subject: [PATCH 106/305] # in macro -> select --- addons/wardrobe/script_macros_wardrobe.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/wardrobe/script_macros_wardrobe.hpp b/addons/wardrobe/script_macros_wardrobe.hpp index df15fa4f94f..238c4a0429d 100644 --- a/addons/wardrobe/script_macros_wardrobe.hpp +++ b/addons/wardrobe/script_macros_wardrobe.hpp @@ -29,9 +29,9 @@ class ItemInfo: ItemInfo {\ // REPLACE #define INTEL_PRE(varName,className)\ -private varName = _magazineDetails findIf { _x#0 == QUOTE(className) } > -1;\ +private varName = _magazineDetails findIf { _x select 0 == QUOTE(className) } > -1;\ if (varName) then { _hasDocument = [_player, QUOTE(className)] call CBA_fnc_getMagazineIndex apply { [_x] call FUNC(getIndexFromMagID) } }; #define INTEL_POST(varName,className)\ -if (varName isEqualType []) then { { [_x, varName # _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, QUOTE(className)] call CBA_fnc_getMagazineIndex ); }; +if (varName isEqualType []) then { { [_x, varName select _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, QUOTE(className)] call CBA_fnc_getMagazineIndex ); }; From ff7751fdc42cc2acdba18af423fda6f51d8e3b64 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 16:02:01 +0100 Subject: [PATCH 107/305] missing "class" --- addons/compat_ws/compat_ws_wardrobe/Turbans.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp index a1f41839dd2..10dc9cd888b 100644 --- a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp @@ -47,7 +47,7 @@ class H_turban_02_mask_black_lxws: H_Shemag_khk { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(03,black), QCN(04,black) }; components[] = { "lxWS_H_bmask_base" }; - ItemInfo: ItemInfo { + class ItemInfo: ItemInfo { mass = 26; }; }; From d2d4f97744ac76030999aeeca079a5b96d430112 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 16:06:23 +0100 Subject: [PATCH 108/305] Finetuning --- addons/wardrobe/Baseclass.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/wardrobe/Baseclass.hpp b/addons/wardrobe/Baseclass.hpp index 70cbb9feb75..48ee0d77db2 100644 --- a/addons/wardrobe/Baseclass.hpp +++ b/addons/wardrobe/Baseclass.hpp @@ -48,7 +48,7 @@ class GVAR(base_U_jacket_closed): GVAR(base) { // Common Base Class for Helmets with a Visor that can be flipped up or down class GVAR(base_H_visor_up): GVAR(base) { - duration = 0.3; + duration = 0.25; gesture ="gestureNod"; sound[] = {CN_SOUND(helmet_visor,05)}; @@ -58,7 +58,7 @@ class GVAR(base_H_visor_up): GVAR(base) { }; class GVAR(base_H_visor_down): GVAR(base) { - duration = 0.3; + duration = 0.25; gesture ="gestureNod"; sound[] = {CN_SOUND(helmet_visor,05)}; From 8e18436cb7d575d81e52af3a629104fab3ea5e34 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 18:51:09 +0100 Subject: [PATCH 109/305] added zeus module --- .hemtt/missions/Wardrobe.VR/mission.sqm | 113 +++++++++++++++++++++--- 1 file changed, 101 insertions(+), 12 deletions(-) diff --git a/.hemtt/missions/Wardrobe.VR/mission.sqm b/.hemtt/missions/Wardrobe.VR/mission.sqm index de50d66b569..4744bbac503 100644 --- a/.hemtt/missions/Wardrobe.VR/mission.sqm +++ b/.hemtt/missions/Wardrobe.VR/mission.sqm @@ -8,14 +8,14 @@ class EditorData toggles=517; class ItemIDProvider { - nextID=204; + nextID=205; }; class Camera { - pos[]={10.529591,7.5298214,-21.69327}; - dir[]={0.82719439,-0.34348413,0.44482145}; - up[]={0.30256075,0.93913782,0.16270162}; - aside[]={0.47363219,2.9360672e-07,-0.8807708}; + pos[]={10.750697,7.5298214,-16.120056}; + dir[]={0.78896397,-0.42873386,-0.44013983}; + up[]={0.37441224,0.90343088,-0.20887361}; + aside[]={-0.48718709,-1.4901161e-08,-0.87329757}; }; }; binarizationWanted=0; @@ -26,15 +26,18 @@ addons[]= "ace_realisticnames", "ace_ballistics", "A3_Characters_F", + "gm_characters_ge_characters", + "ace_compat_gm_wardrobe", "A3_Soft_F_Exp_Offroad_02", "A3_Weapons_F_Ammoboxes", - "ace_intelitems" + "ace_intelitems", + "A3_Modules_F_Curator_Curator" }; class AddonsMetaData { class List { - items=5; + items=8; class Item0 { className="A3_Weapons_F"; @@ -57,23 +60,45 @@ class AddonsMetaData url="https://ace3.acemod.org/"; }; class Item3 + { + className="gm_characters_ge_characters"; + name="gm_characters_ge_characters"; + author="Global Mobilization"; + url="global-mobilization.com"; + }; + class Item4 + { + className="ace_compat_gm"; + name="ACE3 - GM Compatibility"; + author="ACE-Team"; + url="https://ace3.acemod.org/"; + }; + class Item5 { className="A3_Soft_F_Exp"; name="Arma 3 Apex - Unarmored Land Vehicles"; author="Bohemia Interactive"; url="https://www.arma3.com"; }; - class Item4 + class Item6 { className="ace_intelitems"; name="ACE3 - Intel Items"; author="ACE-Team"; url="https://ace3.acemod.org/"; }; + class Item7 + { + className="A3_Modules_F_Curator"; + name="Arma 3 Zeus Update - Scripted Modules"; + author="Bohemia Interactive"; + url="https://www.arma3.com"; + }; }; }; dlcs[]= { + "gm", "Expansion" }; randomSeed=4540948; @@ -81,9 +106,6 @@ class ScenarioData { author="Overlord Zorn"; }; -class CustomAttributes -{ -}; class Mission { class Intel @@ -107,7 +129,7 @@ class Mission }; class Entities { - items=6; + items=7; class Item0 { dataType="Object"; @@ -307,5 +329,72 @@ class Mission nAttributes=1; }; }; + class Item6 + { + dataType="Logic"; + class PositionInfo + { + position[]={26,5,-20}; + angles[]={0,4.6137218,0}; + }; + id=204; + type="ModuleCurator_F"; + class CustomAttributes + { + class Attribute0 + { + property="ModuleCurator_F_Owner"; + expression="_this setVariable ['Owner',_value,true];"; + class Value + { + class data + { + singleType="STRING"; + value=""; + }; + }; + }; + class Attribute1 + { + property="ModuleCurator_F_Forced"; + expression="_this setVariable ['Forced',_value,true];"; + class Value + { + class data + { + singleType="SCALAR"; + value=0; + }; + }; + }; + class Attribute2 + { + property="ModuleCurator_F_Name"; + expression="_this setVariable ['Name',_value,true];"; + class Value + { + class data + { + singleType="STRING"; + value=""; + }; + }; + }; + class Attribute3 + { + property="ModuleCurator_F_Addons"; + expression="_this setVariable ['Addons',_value,true];"; + class Value + { + class data + { + singleType="SCALAR"; + value=2; + }; + }; + }; + nAttributes=4; + }; + }; }; }; From d18d61f7ae389c2889ec497b51de4ecf2ddd6a02 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 18:51:31 +0100 Subject: [PATCH 110/305] moar GM Compats --- .../compat_gm_wardrobe/CfgWardrobe.hpp | 3 + .../compat_gm/compat_gm_wardrobe/Helmets.hpp | 94 ++++++++++++++++++- 2 files changed, 96 insertions(+), 1 deletion(-) diff --git a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp index f8bd616392a..10c8f8d2da7 100644 --- a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp @@ -10,6 +10,9 @@ class EGVAR(wardrobe,base_U_sleeves_down); class EGVAR(wardrobe,base_U_gloves_on); class EGVAR(wardrobe,base_U_gloves_off); +class EGVAR(wardrobe,base_H_goggles_on); +class EGVAR(wardrobe,base_H_goggles_off); + class CfgWeapons { #include "Helmets.hpp" #include "Uniforms.hpp" diff --git a/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp b/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp index 36d42efd33c..7773741253a 100644 --- a/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp @@ -35,4 +35,96 @@ class gm_ge_headgear_psh77_up_oli: gm_ge_headgear_psh77_up_base { class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up) { modifiableTo[] = { "gm_ge_headgear_psh77_down_oli" }; }; -}; \ No newline at end of file +}; + +#define GM_Helmet_Glasses(classWith,classWithout,baseWith,baseWithout,goggles)\ +class classWith: baseWith {\ + class ace_wardrobe : EGVAR(wardrobe,base_H_goggles_on) {\ + modifiableTo[] = { QUOTE(classWithout) };\ + components[] = { QUOTE(goggles) };\ + };\ + MASS(11)\ +};\ +class classWithout: baseWithout {\ + class ace_wardrobe : EGVAR(wardrobe,base_H_goggles_off) {\ + modifiableTo[] = { QUOTE(classWith) };\ + };\ +}; + + +class gm_ge_headgear_m92_base; +class gm_ge_headgear_m92_cover_base; + +class gm_ge_headgear_m92_glasses_base: gm_ge_headgear_m92_base { + class ItemInfo; +}; + +class gm_ge_headgear_m92_cover_glasses_base: gm_ge_headgear_m92_base { + class ItemInfo; +}; + +GM_Helmet_Glasses(gm_ge_headgear_m92_cover_glasses_win,gm_ge_headgear_m92_cover_win,gm_ge_headgear_m92_cover_glasses_base,gm_ge_headgear_m92_cover_base,gm_ge_facewear_dustglasses) +GM_Helmet_Glasses(gm_ge_headgear_m92_cover_glasses_oli,gm_ge_headgear_m92_cover_oli,gm_ge_headgear_m92_cover_glasses_base,gm_ge_headgear_m92_cover_base,gm_ge_facewear_dustglasses) +GM_Helmet_Glasses(gm_ge_headgear_m92_cover_glasses_blk,gm_ge_headgear_m92_cover_blk,gm_ge_headgear_m92_cover_glasses_base,gm_ge_headgear_m92_cover_base,gm_ge_facewear_dustglasses) + +GM_Helmet_Glasses(gm_ge_headgear_m92_glasses_trp,gm_ge_headgear_m92_trp,gm_ge_headgear_m92_glasses_base,gm_ge_headgear_m92_base,gm_ge_facewear_dustglasses) +GM_Helmet_Glasses(gm_ge_headgear_m92_glasses_flk,gm_ge_headgear_m92_flk,gm_ge_headgear_m92_glasses_base,gm_ge_headgear_m92_base,gm_ge_facewear_dustglasses) + + +class gm_headgear_armored_base; +class gm_ge_headgear_m38_72_base; +class gm_ge_headgear_m38_72_goggles_base: gm_headgear_armored_base { + class ItemInfo; +}; +GM_Helmet_Glasses(gm_ge_bgs_headgear_m38_72_goggles_bgr,gm_ge_bgs_headgear_m38_72_bgr,gm_ge_headgear_m38_72_goggles_base,gm_ge_headgear_m38_72_base,gm_ge_facewear_acidgoggles) + +// Caps with M62 Helmets +// Base Classes +class gm_ge_headgear_hat_base; + +class gm_ge_headgear_hat_80_base: gm_ge_headgear_hat_base { + class ItemInfo; +}; +class gm_ge_headgear_sidecap_base; +class gm_ge_headgear_sidecap_80_base: gm_ge_headgear_sidecap_base { + class ItemInfo; +}; + +// Helmet Only +class gm_ge_headgear_m62_base; +class gm_ge_headgear_m62_net: gm_ge_headgear_m62_base { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = {"gm_ge_headgear_hgm_ge_headgear_sidecap_80_m62_oliat_80_oli", "gm_ge_headgear_hat_80_m62_oli"}; + components[] = {"gm_ge_headgear_m62_net"}; + }; +}; + +// Hats only +class gm_ge_headgear_hat_80_oli: gm_ge_headgear_hat_80_base { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = {"gm_ge_headgear_hat_80_m62_oli"}; + components[] = {"gm_ge_headgear_hat_80_oli"}; + }; +}; +class gm_ge_headgear_sidecap_80_oli: gm_ge_headgear_sidecap_80_base { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = {"gm_ge_headgear_sidecap_80_m62_oli"}; + components[] = {"gm_ge_headgear_sidecap_80_oli"}; + }; +}; + +// Hats + Helmets +class gm_ge_headgear_hat_80_m62_oli: gm_ge_headgear_hat_80_base { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = {"gm_ge_headgear_hat_80_oli","gm_ge_headgear_m62_net"}; + components[] = {"gm_ge_headgear_hat_80_oli","gm_ge_headgear_m62_net"}; + }; + MASS(20) +}; +class gm_ge_headgear_sidecap_80_m62_oli: gm_ge_headgear_sidecap_80_base { + class ace_wardrobe : EGVAR(wardrobe,base) { + modifiableTo[] = {"gm_ge_headgear_sidecap_80_oli","gm_ge_headgear_m62_net"}; + components[] = {"gm_ge_headgear_sidecap_80_oli","gm_ge_headgear_m62_net"}; + }; + MASS(20) +}; From 0585633cd8ce9296481344ca99a71197d069b9eb Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 18:52:29 +0100 Subject: [PATCH 111/305] ln sort --- addons/wardrobe/stringtable.xml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml index ceabd45898d..98c59311ddc 100644 --- a/addons/wardrobe/stringtable.xml +++ b/addons/wardrobe/stringtable.xml @@ -28,12 +28,24 @@ Wear gloves + + Take goggles off + + + Put goggles on + Close Jacket Open Jacket + + Take mask off + + + Put mask on + Roll sleeves down @@ -46,18 +58,6 @@ Visor up - - Put mask on - - - Take mask off - - - Put goggles on - - - Take goggles off - @@ -68,4 +68,4 @@ - \ No newline at end of file + From c8b97027cca4e4b31cf39a2a74b42269c8b77891 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 19:16:36 +0100 Subject: [PATCH 112/305] fix mask turban mass config --- addons/compat_ws/compat_ws_wardrobe/Turbans.hpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp index 10dc9cd888b..48a23d42864 100644 --- a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp @@ -42,16 +42,18 @@ class CN(03,COLOR): lxWS_H_turban_03_black {\ // BASECLASS class H_Shemag_khk; +class HeadgearItem; class H_turban_02_mask_black_lxws: H_Shemag_khk { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(03,black), QCN(04,black) }; components[] = { "lxWS_H_bmask_base" }; - class ItemInfo: ItemInfo { - mass = 26; - }; + }; + class ItemInfo: HeadgearItem { + mass = 26; }; }; + class lxWS_H_turban_01_black: H_Shemag_khk { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { QCN(02,black), QCN(03,black), QCN(04,black), "H_turban_02_mask_black_lxws" }; From e252deafdbe1c77f72876199fd20f0920e7740c1 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 19:59:18 +0100 Subject: [PATCH 113/305] fix base inheritances --- .../compat_sog_wardrobe/Booniehats.hpp | 47 ++++++++++++------- .../Uniforms.hpp | 32 ++++++++++--- 2 files changed, 55 insertions(+), 24 deletions(-) diff --git a/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp b/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp index 4bffac40e10..14626adbeb6 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp @@ -8,6 +8,7 @@ // 01 green 02 tiger 03 black 04 spray 05 tiger green 06 erdl brown 07 leopard 08 erdl // 09 gray <- Fuck this - inheritance is fucking horrible as fuck. + // Macros #define CN(variation,color) vn_b_boonie_##variation##_##color #define QCN(variation,color) QUOTE(CN(variation,color)) @@ -78,22 +79,34 @@ CN_COLORS(05) // Base classes in CfgWeapons.hpp // 06-08 anzac -#define BOONIE_ANZAC(VAR)\ -class CN(06,VAR): CN(02,01) {\ - class ace_wardrobe: EGVAR(wardrobe,base) {\ - modifiableTo[] = { QCN(07,VAR), QCN(08,VAR) };\ - };\ -};\ -class CN(07,VAR): CN(06,VAR) {\ - class ace_wardrobe: EGVAR(wardrobe,base) {\ - modifiableTo[] = { QCN(06,VAR), QCN(08,VAR) };\ - };\ -};\ -class CN(08,VAR): CN(06,VAR) {\ - class ace_wardrobe: EGVAR(wardrobe,base) {\ - modifiableTo[] = { QCN(06,VAR), QCN(07,VAR) };\ - };\ +class CN(06,01): CN(02,01) { + class ace_wardrobe: EGVAR(wardrobe,base) { + modifiableTo[] = { QCN(07,01), QCN(08,01) }; + }; +}; +class CN(07,01): CN(06,01) { + class ace_wardrobe: EGVAR(wardrobe,base) { + modifiableTo[] = { QCN(06,VAR), QCN(08,01) }; + }; +}; +class CN(08,01): CN(06,01) { + class ace_wardrobe: EGVAR(wardrobe,base) { + modifiableTo[] = { QCN(06,01), QCN(07,01) }; + }; }; -BOONIE_ANZAC(01) -BOONIE_ANZAC(02) \ No newline at end of file +class CN(06,02): CN(06,01) { + class ace_wardrobe: EGVAR(wardrobe,base) { + modifiableTo[] = { QCN(07,02), QCN(08,02) }; + }; +}; +class CN(07,02): CN(06,01) { + class ace_wardrobe: EGVAR(wardrobe,base) { + modifiableTo[] = { QCN(06,02), QCN(08,02) }; + }; +}; +class CN(08,02): CN(06,01) { + class ace_wardrobe: EGVAR(wardrobe,base) { + modifiableTo[] = { QCN(06,02), QCN(07,02) }; + }; +}; diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp index 9bebdd2e2f3..99f7e28cb5e 100644 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp @@ -1,5 +1,3 @@ -class ItemInfo; - #define S_70(className)\ class className: vn_b_uniform_base {\ class ItemInfo: ItemInfo {\ @@ -9,7 +7,10 @@ class className: vn_b_uniform_base {\ }; class CfgWeapons { - class vn_b_uniform_base; + class Uniform_Base; + class vn_b_uniform_base: Uniform_Base { + class ItemInfo; + }; S_70(vn_b_uniform_macv_04_01) S_70(vn_b_uniform_macv_04_02) @@ -25,7 +26,10 @@ class CfgWeapons { //// US Headgear // Helmets with Combat Goggles - class vn_b_helmet_m1_14_01; + class vn_b_helmet_m1_01_01; + class vn_b_helmet_m1_14_01: vn_b_helmet_m1_01_01 { + class ItemInfo; + }; class vn_b_helmet_m1_20_01: vn_b_helmet_m1_14_01 { MASS(12) @@ -34,8 +38,12 @@ class CfgWeapons { MASS(12) }; + // Crew Helmets with Goggles - class vn_b_helmet_t56_01_01; + class vn_b_headgear_base; + class vn_b_helmet_t56_01_01: vn_b_headgear_base { + class ItemInfo; + }; class vn_b_helmet_t56_02_01: vn_b_helmet_t56_01_01 { MASS(12) }; @@ -49,8 +57,14 @@ class CfgWeapons { }; //// NVA Headgear + + + // NVA Gear usually has the Goggles Version be the parent version of the non-goggle version, meaning we have to "reset" the children to their previous mass. - class vn_o_headgear_base; + class H_Booniehat_khk; + class vn_o_headgear_base: H_Booniehat_khk { + class ItemInfo; + }; // NVA Pilot Helmet with Goggles class vn_o_helmet_shl61_01: vn_o_headgear_base { MASS(12) @@ -67,8 +81,12 @@ class CfgWeapons { MASS(10) }; + + // NVA Pith helmet with Crew Goggles - class vn_o_helmet_nva_01; + class vn_o_helmet_nva_01: vn_o_headgear_base { + class ItemInfo; + }; class vn_o_helmet_nva_05: vn_o_helmet_nva_01 { MASS(12) }; From 8834862905dfa4ce6db76d2e9e244f6687ea320e Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 20:06:14 +0100 Subject: [PATCH 114/305] fix validation errors config --- .../compat_gm/compat_gm_wardrobe/Helmets.hpp | 14 ++++---- .../compat_rf_wardrobe/CfgWardrobe.hpp | 12 +++++-- .../Uniforms.hpp | 32 +++++++++---------- 3 files changed, 33 insertions(+), 25 deletions(-) diff --git a/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp b/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp index 7773741253a..f65a423cb91 100644 --- a/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp @@ -39,14 +39,14 @@ class gm_ge_headgear_psh77_up_oli: gm_ge_headgear_psh77_up_base { #define GM_Helmet_Glasses(classWith,classWithout,baseWith,baseWithout,goggles)\ class classWith: baseWith {\ - class ace_wardrobe : EGVAR(wardrobe,base_H_goggles_on) {\ + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) {\ modifiableTo[] = { QUOTE(classWithout) };\ components[] = { QUOTE(goggles) };\ };\ MASS(11)\ };\ class classWithout: baseWithout {\ - class ace_wardrobe : EGVAR(wardrobe,base_H_goggles_off) {\ + class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) {\ modifiableTo[] = { QUOTE(classWith) };\ };\ }; @@ -93,7 +93,7 @@ class gm_ge_headgear_sidecap_80_base: gm_ge_headgear_sidecap_base { // Helmet Only class gm_ge_headgear_m62_base; class gm_ge_headgear_m62_net: gm_ge_headgear_m62_base { - class ace_wardrobe : EGVAR(wardrobe,base) { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = {"gm_ge_headgear_hgm_ge_headgear_sidecap_80_m62_oliat_80_oli", "gm_ge_headgear_hat_80_m62_oli"}; components[] = {"gm_ge_headgear_m62_net"}; }; @@ -101,13 +101,13 @@ class gm_ge_headgear_m62_net: gm_ge_headgear_m62_base { // Hats only class gm_ge_headgear_hat_80_oli: gm_ge_headgear_hat_80_base { - class ace_wardrobe : EGVAR(wardrobe,base) { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = {"gm_ge_headgear_hat_80_m62_oli"}; components[] = {"gm_ge_headgear_hat_80_oli"}; }; }; class gm_ge_headgear_sidecap_80_oli: gm_ge_headgear_sidecap_80_base { - class ace_wardrobe : EGVAR(wardrobe,base) { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = {"gm_ge_headgear_sidecap_80_m62_oli"}; components[] = {"gm_ge_headgear_sidecap_80_oli"}; }; @@ -115,14 +115,14 @@ class gm_ge_headgear_sidecap_80_oli: gm_ge_headgear_sidecap_80_base { // Hats + Helmets class gm_ge_headgear_hat_80_m62_oli: gm_ge_headgear_hat_80_base { - class ace_wardrobe : EGVAR(wardrobe,base) { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = {"gm_ge_headgear_hat_80_oli","gm_ge_headgear_m62_net"}; components[] = {"gm_ge_headgear_hat_80_oli","gm_ge_headgear_m62_net"}; }; MASS(20) }; class gm_ge_headgear_sidecap_80_m62_oli: gm_ge_headgear_sidecap_80_base { - class ace_wardrobe : EGVAR(wardrobe,base) { + class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = {"gm_ge_headgear_sidecap_80_oli","gm_ge_headgear_m62_net"}; components[] = {"gm_ge_headgear_sidecap_80_oli","gm_ge_headgear_m62_net"}; }; diff --git a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp index 1989d2e2ab8..fb1bac1fc20 100644 --- a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp @@ -14,8 +14,16 @@ class CfgWeapons // Cap (Ion) Forward and Reversed class lxWS_H_CapB_rvs_blk; - class lxWS_H_CapB_rvs_blk_ION: lxWS_H_CapB_rvs_blk { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "H_Cap_headphones_ion_lxws" }; }; }; - class H_Cap_headphones_ion_lxws: lxWS_H_CapB_rvs_blk_ION { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = { "lxWS_H_CapB_rvs_blk_ION" }; }; }; + class lxWS_H_CapB_rvs_blk_ION: lxWS_H_CapB_rvs_blk { + class ace_wardrobe: EGVAR(wardrobe,base) { + modifiableTo[] = { "H_Cap_headphones_ion_lxws" }; + }; + }; + class H_Cap_headphones_ion_lxws: lxWS_H_CapB_rvs_blk_ION { + class ace_wardrobe: EGVAR(wardrobe,base) { + modifiableTo[] = { "lxWS_H_CapB_rvs_blk_ION" }; + }; + }; }; diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp index 99f7e28cb5e..f7aa497ff4a 100644 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp @@ -7,10 +7,10 @@ class className: vn_b_uniform_base {\ }; class CfgWeapons { - class Uniform_Base; - class vn_b_uniform_base: Uniform_Base { - class ItemInfo; - }; + class Uniform_Base; + class vn_b_uniform_base: Uniform_Base { + class ItemInfo; + }; S_70(vn_b_uniform_macv_04_01) S_70(vn_b_uniform_macv_04_02) @@ -27,9 +27,9 @@ class CfgWeapons { //// US Headgear // Helmets with Combat Goggles class vn_b_helmet_m1_01_01; - class vn_b_helmet_m1_14_01: vn_b_helmet_m1_01_01 { - class ItemInfo; - }; + class vn_b_helmet_m1_14_01: vn_b_helmet_m1_01_01 { + class ItemInfo; + }; class vn_b_helmet_m1_20_01: vn_b_helmet_m1_14_01 { MASS(12) @@ -41,9 +41,9 @@ class CfgWeapons { // Crew Helmets with Goggles class vn_b_headgear_base; - class vn_b_helmet_t56_01_01: vn_b_headgear_base { - class ItemInfo; - }; + class vn_b_helmet_t56_01_01: vn_b_headgear_base { + class ItemInfo; + }; class vn_b_helmet_t56_02_01: vn_b_helmet_t56_01_01 { MASS(12) }; @@ -62,9 +62,9 @@ class CfgWeapons { // NVA Gear usually has the Goggles Version be the parent version of the non-goggle version, meaning we have to "reset" the children to their previous mass. class H_Booniehat_khk; - class vn_o_headgear_base: H_Booniehat_khk { - class ItemInfo; - }; + class vn_o_headgear_base: H_Booniehat_khk { + class ItemInfo; + }; // NVA Pilot Helmet with Goggles class vn_o_helmet_shl61_01: vn_o_headgear_base { MASS(12) @@ -84,9 +84,9 @@ class CfgWeapons { // NVA Pith helmet with Crew Goggles - class vn_o_helmet_nva_01: vn_o_headgear_base { - class ItemInfo; - }; + class vn_o_helmet_nva_01: vn_o_headgear_base { + class ItemInfo; + }; class vn_o_helmet_nva_05: vn_o_helmet_nva_01 { MASS(12) }; From bd2edd88f42a1299881f561343ae1730777e41ef Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 22:00:22 +0100 Subject: [PATCH 115/305] Update mission.sqm --- .hemtt/missions/Wardrobe.VR/mission.sqm | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/.hemtt/missions/Wardrobe.VR/mission.sqm b/.hemtt/missions/Wardrobe.VR/mission.sqm index 4744bbac503..1010aff970d 100644 --- a/.hemtt/missions/Wardrobe.VR/mission.sqm +++ b/.hemtt/missions/Wardrobe.VR/mission.sqm @@ -26,8 +26,6 @@ addons[]= "ace_realisticnames", "ace_ballistics", "A3_Characters_F", - "gm_characters_ge_characters", - "ace_compat_gm_wardrobe", "A3_Soft_F_Exp_Offroad_02", "A3_Weapons_F_Ammoboxes", "ace_intelitems", @@ -37,7 +35,7 @@ class AddonsMetaData { class List { - items=8; + items=6; class Item0 { className="A3_Weapons_F"; @@ -60,34 +58,20 @@ class AddonsMetaData url="https://ace3.acemod.org/"; }; class Item3 - { - className="gm_characters_ge_characters"; - name="gm_characters_ge_characters"; - author="Global Mobilization"; - url="global-mobilization.com"; - }; - class Item4 - { - className="ace_compat_gm"; - name="ACE3 - GM Compatibility"; - author="ACE-Team"; - url="https://ace3.acemod.org/"; - }; - class Item5 { className="A3_Soft_F_Exp"; name="Arma 3 Apex - Unarmored Land Vehicles"; author="Bohemia Interactive"; url="https://www.arma3.com"; }; - class Item6 + class Item4 { className="ace_intelitems"; name="ACE3 - Intel Items"; author="ACE-Team"; url="https://ace3.acemod.org/"; }; - class Item7 + class Item5 { className="A3_Modules_F_Curator"; name="Arma 3 Zeus Update - Scripted Modules"; @@ -98,7 +82,6 @@ class AddonsMetaData }; dlcs[]= { - "gm", "Expansion" }; randomSeed=4540948; From f6e8fdb24d1ffe7540bea402b9c88ba8c9124df5 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 22:01:50 +0100 Subject: [PATCH 116/305] Update launch.toml --- .hemtt/launch.toml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.hemtt/launch.toml b/.hemtt/launch.toml index 1cf47e3b0bb..36d048e14e3 100644 --- a/.hemtt/launch.toml +++ b/.hemtt/launch.toml @@ -43,7 +43,7 @@ workshop = [ ] [Wardrobe] -extends = "default" +extends = "rhs" workshop = [ "2369477168", # Advanced Developer Tools "1779063631", # ZEN @@ -52,6 +52,7 @@ workshop = [ mission = "Wardrobe.VR" dlc = [ # "Western Sahara", -# "Reaction Forces" -# "S.O.G. Prairie Fire" +# "Reaction Forces", +# "S.O.G. Prairie Fire", +# "gm" ] \ No newline at end of file From 922c98991c2cd23ab57d75b806eafd2ffc0f3b0c Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 7 Jan 2025 01:01:53 +0100 Subject: [PATCH 117/305] fixes --- addons/wardrobe/Baseclass.hpp | 2 +- addons/wardrobe/Facewear.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/wardrobe/Baseclass.hpp b/addons/wardrobe/Baseclass.hpp index 48ee0d77db2..42d951adda5 100644 --- a/addons/wardrobe/Baseclass.hpp +++ b/addons/wardrobe/Baseclass.hpp @@ -30,7 +30,7 @@ class GVAR(base_U_sleeves_down): GVAR(base) { alternativeDisplayName = CSTRING(sleevesDown); }; -// Common Base Class for Uniforms with Sleeves Up/Down Variants +// Common Base Class for Uniforms with Gloves On/Off Variants class GVAR(base_U_gloves_on): GVAR(base) { alternativeDisplayName = CSTRING(glovesOn); }; diff --git a/addons/wardrobe/Facewear.hpp b/addons/wardrobe/Facewear.hpp index bd6369769fd..75f4a68de40 100644 --- a/addons/wardrobe/Facewear.hpp +++ b/addons/wardrobe/Facewear.hpp @@ -84,7 +84,7 @@ class G_Balaclava_TI_G_tna_F: G_Balaclava_TI_tna_F { // Bandana, Black class G_Bandanna_blk: G_Balaclava_blk { class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "G_Bandanna_aviator", "G_Bandanna_sport", "G_Bandanna_aviator" }; + modifiableTo[] = { "G_Bandanna_aviator", "G_Bandanna_sport", "G_Bandanna_shades" }; components[] = { "G_Bandanna_blk" }; }; }; From 419ebb8390ae5e5282d9a97315bfbdf47e58aaff Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 7 Jan 2025 01:02:25 +0100 Subject: [PATCH 118/305] Update wardrobe-framework.md --- docs/wiki/framework/wardrobe-framework.md | 293 ++++++++++++++++------ 1 file changed, 223 insertions(+), 70 deletions(-) diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index 4f7d31b2e2a..7c5cb5541f1 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -8,131 +8,284 @@ parent: wiki mod: ace version: major: 3 - minor: 18 - patch: 2 + minor: 20 + patch: 0 --- ## 1. Overview -## 2. Config - -- Only directly defined Subclasses will be taken into account. A fully inherited subclass will be ignored and will not provide an Interaction. - -## 2.1 Properties +The Wardrobe Addon gives the player the opportunity to change/modify their current wearables into different variants of these. -### 2.2 Base Classes - -#### 2.2.1 Base +For example, if a uniform has a normal variant and a "Rolled-Up Sleeves" variant, the player will be able to use ether an ACE Self Interaction or utilize the CBA Context Menu in their Inventory. -#### 2.2.2 Base Uniform Sleeves Up / Down +Since there is no common pattern in terms of class inheritence, not even within the same DLC, each possbile variant has to be defined within the classes config properties. -#### 2.2.3 Base Uniform Gloves On / Off +### 1.1 Components -#### 2.2.4 Base Uniform Jacket Open / Closed +Components are an optional assistance to define a group of variants where one or more variants have components that are merged into another. +For example, Western Saharah comes with turbans in different variations. Those can be interchanged to and from each other without any restriction. But there are also the the variants which utilize the balistic facemasks. In this case, the balistic facemask would be defined as a component and the turban with the the facemask would also be defined having the ballistic facemask as a component. -#### 2.2.4 Base Helmet Visor Up / Down +If the player switches from the variant with the mask to a turban variant without a mask, the mask, being a component that is no longer needed, will be deposited into the players inventory (or on the floor when full) and the turban will be changed in to the desired variant. +More examples can be found below. -## 3. Examples +### 1.2 Config Guidelines -### 3.1 Linear Example +- An Container (Uniform, Vest, Backpack) should never change its maxLoad, unless there is a really good reason for it. This will result in the loss of items. +- Variants should never "magically" add/remove parts of themselves, unless its handled through a component. +- There should not be a difference in weight between the different variants unless compoents get added/removed. + - For Example: `Mass of Helmet with Goggles = Mass of Helmet + Mass of Goggles.` -### 3.2 Advanced Example (Components) +## 2. Config +Only directly defined Subclasses will be taken into account. A fully inherited subclass will be ignored and will not provide any interaction. The ace_wardrobe properties are to be found as a subclass of the item itself. Multiple base configs are designed at root of `configFile`. -## 4. Sounds +## 2.1 Properties +| Class Property | Data Type | Description | +| -------------- | ----------- | ----------- | +| modifiableTo[] | Array of Classnames | possible Variants this item can be turned into. | +| components[] | Array of Classnames | Components the current variant contains within itself | +| sound[] | Array of CfgSound Entries | to be chosen by random when the action is performed | +| sound_timing | Number 0..1 | defines the point time relative to the duration when the sound is played | +| gesture | String of Classname | Gesture to be played when the action is performed | +| alternativePicture | String of path to icon | to be used instead of target variant picture | +| alternativeDisplayName | String | Will be used instead of the target variants displayname | +| duration | Number in seconds | Duration of action. Items are being replaced at the end. | -### 4.1 Integrated Sounds +### 2.2 Base Classes +#### 2.2.1 Base +```cpp +// root of configFile +class ace_wardrobe_base { + modifiableTo[] = {""}; + components[] = {}; + // Supports Multiple Sounds, will pick one by random. + sound[] = { "ace_wardrobe_fabric_06", "ace_wardrobe_fabric_07", "ace_wardrobe_fabric_16", "ace_wardrobe_fabric_20", "ace_wardrobe_fabric_25"}; + sound_timing = 0; // [0..1] 0 at the start of the action, 0.5 half way during the duration of the action - always, if completed or not. 1 at the end, only when completed. + // Gesture + gesture = "Gear"; - \ No newline at end of file +- `ace_wardrobe_fabric_06` +- `ace_wardrobe_fabric_07` +- `ace_wardrobe_fabric_16` +- `ace_wardrobe_fabric_20` +- `ace_wardrobe_fabric_25` +- `ace_wardrobe_helmet_visor_05` \ No newline at end of file From a0a23dfb9f59fa670af63a48955e2e002711f6ce Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 7 Jan 2025 02:03:20 +0100 Subject: [PATCH 119/305] revision docs --- docs/wiki/framework/wardrobe-framework.md | 27 +++++++++++++++-------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index 7c5cb5541f1..0ad7cd88932 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -15,18 +15,18 @@ version: ## 1. Overview -The Wardrobe Addon gives the player the opportunity to change/modify their current wearables into different variants of these. +The Wardrobe Addon gives the player the opportunity to change/modify their current wearables into different variants. -For example, if a uniform has a normal variant and a "Rolled-Up Sleeves" variant, the player will be able to use ether an ACE Self Interaction or utilize the CBA Context Menu in their Inventory. +For example, if a uniform has a normal variant and a "Rolled-Up Sleeves" variant, the player will be able to use ether an ACE Self Interaction or the CBA Context Menu in the Inventory. -Since there is no common pattern in terms of class inheritence, not even within the same DLC, each possbile variant has to be defined within the classes config properties. +Since there is no reliable, common pattern in terms of class inheritence, not even within the same DLC, each possbile variant has to be defined individually within the classes config properties. ### 1.1 Components -Components are an optional assistance to define a group of variants where one or more variants have components that are merged into another. -For example, Western Saharah comes with turbans in different variations. Those can be interchanged to and from each other without any restriction. But there are also the the variants which utilize the balistic facemasks. In this case, the balistic facemask would be defined as a component and the turban with the the facemask would also be defined having the ballistic facemask as a component. +Components are an optional assistance to define a group of variants where a variant is made of one or more components. +For example, a bandanna with sunglasses would have the the bandanna and the sunglasses as components, while the bandanna and sunglasses themself only have themselves as a component. -If the player switches from the variant with the mask to a turban variant without a mask, the mask, being a component that is no longer needed, will be deposited into the players inventory (or on the floor when full) and the turban will be changed in to the desired variant. +If the player switches from a variant with more components to a variant with less components, the surplus components will be deposited in their inventory. Vise Versa, if the player wants to change from a variant with less components to a variant with more components, they are required to have the missing components in their inventory, which will be removed on conversion. More examples can be found below. @@ -274,11 +274,15 @@ class CfgGlasses { }; ``` -## 4. Sounds +## 4. Addon Settings + + + +## 5. Sounds The following CfgSounds classes are integrated in ace_wardrobe and are the default sounds for the `ace_wardrobe_base` and `ace_wardrobe_base_H_visor_up`/`ace_wardrobe_base_H_visor_down` base classes. -### 4.1 Integrated Sounds +### 5.1 Integrated Sounds The number at the end of the classnames indicates the length of the file in 1/10th seconds. 10 -> 1 sec, 15 -> 1.5sec, ... @@ -288,4 +292,9 @@ The number at the end of the classnames indicates the length of the file in 1/10 - `ace_wardrobe_fabric_16` - `ace_wardrobe_fabric_20` - `ace_wardrobe_fabric_25` -- `ace_wardrobe_helmet_visor_05` \ No newline at end of file +- `ace_wardrobe_helmet_visor_05` + +## 6. Compatibility +Currently, ace_IntelItems and ace_overheating (spare barrels) are being directly supported. + +If an addon or mod utilizes a magazines magazineID to handle additional data about an items carried by the player, then the process of modifying a wearable container (uniform, vest, backpack) to another variant will result in new magazineIDs for all magazines on the player. From ed4cfb592640f128c027672c1a3fedefc3038602 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Wed, 8 Jan 2025 18:18:03 +0100 Subject: [PATCH 120/305] Update addons/compat_rf/compat_rf_wardrobe/config.cpp Co-authored-by: Mike-MF --- .../compat_rf/compat_rf_wardrobe/config.cpp | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/addons/compat_rf/compat_rf_wardrobe/config.cpp b/addons/compat_rf/compat_rf_wardrobe/config.cpp index 717c785aa98..8039ddb493e 100644 --- a/addons/compat_rf/compat_rf_wardrobe/config.cpp +++ b/addons/compat_rf/compat_rf_wardrobe/config.cpp @@ -3,22 +3,19 @@ class CfgPatches { class SUBADDON { name = COMPONENT_NAME; - author = ECSTRING(common,ACETeam); - authors[] = {"OverlordZorn [CVO]"}; - url = ECSTRING(main,URL); - - VERSION_CONFIG; - addonRootClass = QUOTE(ADDON); + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; requiredAddons[] = { "ace_wardrobe", "RF_Data_Loadorder" }; skipWhenMissingDependencies = 1; - - requiredVersion = REQUIRED_VERSION; - - units[] = {}; - weapons[] = {}; + author = ECSTRING(common,ACETeam); + authors[] = {"OverlordZorn [CVO]"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + addonRootClass = QUOTE(ADDON); }; }; From e0a797edc0a4501da80aedd9bf8557c867adcf8f Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 8 Jan 2025 19:16:34 +0100 Subject: [PATCH 121/305] common structure --- .../compat_gm/compat_gm_wardrobe/config.cpp | 21 ++++++++---------- .../compat_sog/compat_sog_wardrobe/config.cpp | 19 +++++++--------- .../config.cpp | 21 ++++++++---------- .../compat_ws/compat_ws_wardrobe/config.cpp | 22 ++++++++----------- 4 files changed, 35 insertions(+), 48 deletions(-) diff --git a/addons/compat_gm/compat_gm_wardrobe/config.cpp b/addons/compat_gm/compat_gm_wardrobe/config.cpp index f7e9cf6f46e..1045ac7f1b5 100644 --- a/addons/compat_gm/compat_gm_wardrobe/config.cpp +++ b/addons/compat_gm/compat_gm_wardrobe/config.cpp @@ -3,23 +3,20 @@ class CfgPatches { class SUBADDON { name = COMPONENT_NAME; - author = ECSTRING(common,ACETeam); - authors[] = {"OverlordZorn [CVO]"}; - url = ECSTRING(main,URL); - - VERSION_CONFIG; - addonRootClass = QUOTE(ADDON); + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; requiredAddons[] = { "ace_wardrobe", "gm_core" }; skipWhenMissingDependencies = 1; - - requiredVersion = REQUIRED_VERSION; - - units[] = {}; - weapons[] = {}; + author = ECSTRING(common,ACETeam); + authors[] = {"OverlordZorn [CVO]"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + addonRootClass = QUOTE(ADDON); }; }; -#include "CfgWardrobe.hpp" \ No newline at end of file +#include "CfgWardrobe.hpp" diff --git a/addons/compat_sog/compat_sog_wardrobe/config.cpp b/addons/compat_sog/compat_sog_wardrobe/config.cpp index 4c152d8ca84..108f13ae1be 100644 --- a/addons/compat_sog/compat_sog_wardrobe/config.cpp +++ b/addons/compat_sog/compat_sog_wardrobe/config.cpp @@ -3,22 +3,19 @@ class CfgPatches { class SUBADDON { name = COMPONENT_NAME; - author = ECSTRING(common,ACETeam); - authors[] = {"OverlordZorn [CVO]"}; - url = ECSTRING(main,URL); - - VERSION_CONFIG; - addonRootClass = QUOTE(ADDON); + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; requiredAddons[] = { "ace_wardrobe", "vn_data_f" }; skipWhenMissingDependencies = 1; - - requiredVersion = REQUIRED_VERSION; - - units[] = {}; - weapons[] = {}; + author = ECSTRING(common,ACETeam); + authors[] = {"OverlordZorn [CVO]"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + addonRootClass = QUOTE(ADDON); }; }; diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp index 7e28c9dc177..fa521d4051d 100644 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp @@ -3,23 +3,20 @@ class CfgPatches { class SUBADDON { name = COMPONENT_NAME; - author = ECSTRING(common,ACETeam); - authors[] = {"OverlordZorn [CVO]"}; - url = ECSTRING(main,URL); - - VERSION_CONFIG; - addonRootClass = QUOTE(ADDON); + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; requiredAddons[] = { "ace_wardrobe", "vn_data_f" }; skipWhenMissingDependencies = 1; - - requiredVersion = REQUIRED_VERSION; - - units[] = {}; - weapons[] = {}; + author = ECSTRING(common,ACETeam); + authors[] = {"OverlordZorn [CVO]"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + addonRootClass = QUOTE(ADDON); }; }; -#include "Uniforms.hpp" \ No newline at end of file +#include "Uniforms.hpp" diff --git a/addons/compat_ws/compat_ws_wardrobe/config.cpp b/addons/compat_ws/compat_ws_wardrobe/config.cpp index cf96156b57e..f5df153e6a4 100644 --- a/addons/compat_ws/compat_ws_wardrobe/config.cpp +++ b/addons/compat_ws/compat_ws_wardrobe/config.cpp @@ -3,24 +3,20 @@ class CfgPatches { class SUBADDON { name = COMPONENT_NAME; - author = ECSTRING(common,ACETeam); - authors[] = {"OverlordZorn [CVO]"}; - url = ECSTRING(main,URL); - - VERSION_CONFIG; - addonRootClass = QUOTE(ADDON); + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; requiredAddons[] = { "ace_wardrobe", "Characters_f_lxWS_headgear" }; skipWhenMissingDependencies = 1; - - requiredVersion = REQUIRED_VERSION; - - units[] = {}; - weapons[] = {}; + author = ECSTRING(common,ACETeam); + authors[] = {"OverlordZorn [CVO]"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + addonRootClass = QUOTE(ADDON); }; }; - -#include "CfgWardrobe.hpp" \ No newline at end of file +#include "CfgWardrobe.hpp" From c49a8e9935af760ff15009196399e7214592dfe0 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 8 Jan 2025 19:28:20 +0100 Subject: [PATCH 122/305] restructure .hpp's --- .../compat_rf_wardrobe/CfgWardrobe.hpp | 97 ++++++++++++++++++- .../compat_rf/compat_rf_wardrobe/Helmets.hpp | 24 ----- .../compat_rf/compat_rf_wardrobe/Uniforms.hpp | 23 ----- .../compat_rf_wardrobe/script_component.hpp | 2 +- 4 files changed, 93 insertions(+), 53 deletions(-) delete mode 100644 addons/compat_rf/compat_rf_wardrobe/Helmets.hpp delete mode 100644 addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp diff --git a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp index fb1bac1fc20..10ae7cb65aa 100644 --- a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp @@ -8,8 +8,97 @@ class EGVAR(wardrobe,base_H_visor_down); class CfgWeapons { - #include "Helmets.hpp" - #include "Uniforms.hpp" + //// Helmets + // Macros + #define CN(color) H_HelmetHeavy_##color##_RF + #define CN_VU(color) H_HelmetHeavy_VisorUp_##color##_RF + + #define HELMET_VARIANT(color)\ + class CN(color): H_HelmetHeavy_Black_RF {\ + class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) {\ + modifiableTo[] = { QUOTE(CN_VU(color)) };\ + };\ + };\ + class CN_VU(color): H_HelmetHeavy_VisorUp_Black_RF {\ + class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up){\ + modifiableTo[] = { QUOTE(CN(color)) };\ + };\ + } + + // Base Classes + class H_HelmetAggressor_F; + + class H_HelmetHeavy_Black_RF: H_HelmetAggressor_F { + class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) { + modifiableTo[] = { "H_HelmetHeavy_VisorUp_Black_RF" }; + }; + }; + class H_HelmetHeavy_VisorUp_Black_RF: H_HelmetHeavy_Black_RF { + class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up){ + modifiableTo[] = { "H_HelmetHeavy_Black_RF" }; + }; + }; + // Variants + HELMET_VARIANT(Hex); + HELMET_VARIANT(GHex); + HELMET_VARIANT(Sand); + HELMET_VARIANT(Olive); + HELMET_VARIANT(White); + + //// Uniforms + class Uniform_Base; + + // Macros + #define UNIFORM_BASE(class1,class2)\ + class class1: Uniform_Base {\ + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) {\ + modifiableTo[] = { QUOTE(class2) };\ + };\ + };\ + class class2: Uniform_Base {\ + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) {\ + modifiableTo[] = { QUOTE(class1) };\ + };\ + } + + // Sleeves up/down + UNIFORM_BASE(U_C_FirefighterFatigues_RF,U_C_FirefighterFatigues_RolledUp_RF); + UNIFORM_BASE(U_BG_Guerrilla_6_1,U_BG_Guerrilla_RF); + + + // Pilot Jackets + class U_C_PilotJacket_black_RF: Uniform_Base { + class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_closed) { + modifiableTo[] = { "U_C_PilotJacket_open_black_RF" }; + }; + }; + class U_C_PilotJacket_open_black_RF: U_C_PilotJacket_black_RF { + class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_open) { + modifiableTo[] = { "U_C_PilotJacket_black_RF" }; + }; + }; + + class U_C_PilotJacket_brown_RF: U_C_PilotJacket_black_RF { + class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_closed) { + modifiableTo[] = { "U_C_PilotJacket_open_brown_RF" }; + }; + }; + class U_C_PilotJacket_open_brown_RF: U_C_PilotJacket_brown_RF { + class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_open) { + modifiableTo[] = { "U_C_PilotJacket_brown_RF" }; + }; + }; + + class U_C_PilotJacket_lbrown_RF: U_C_PilotJacket_black_RF { + class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_closed) { + modifiableTo[] = { "U_C_PilotJacket_open_lbrown_RF" }; + }; + }; + class U_C_PilotJacket_open_lbrown_RF: U_C_PilotJacket_lbrown_RF { + class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_open) { + modifiableTo[] = { "U_C_PilotJacket_lbrown_RF" }; + }; + }; // Cap (Ion) Forward and Reversed @@ -21,9 +110,7 @@ class CfgWeapons }; class H_Cap_headphones_ion_lxws: lxWS_H_CapB_rvs_blk_ION { class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "lxWS_H_CapB_rvs_blk_ION" }; + modifiableTo[] = { "lxWS_H_CapB_rvs_blk_ION" }; }; }; }; - - diff --git a/addons/compat_rf/compat_rf_wardrobe/Helmets.hpp b/addons/compat_rf/compat_rf_wardrobe/Helmets.hpp deleted file mode 100644 index 9691347d687..00000000000 --- a/addons/compat_rf/compat_rf_wardrobe/Helmets.hpp +++ /dev/null @@ -1,24 +0,0 @@ -// CfgWeapons - -// Macros -#define CN(color) H_HelmetHeavy_##color##_RF -#define CN_VU(color) H_HelmetHeavy_VisorUp_##color##_RF - - -#define HELMET_VARIANT(color)\ -class CN(color): H_HelmetHeavy_Black_RF { class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { QUOTE(CN_VU(color)) }; }; };\ -class CN_VU(color): H_HelmetHeavy_VisorUp_Black_RF { class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up){ modifiableTo[] = { QUOTE(CN(color)) }; }; };\ - - -// Base Classes -class H_HelmetAggressor_F; - -class H_HelmetHeavy_Black_RF: H_HelmetAggressor_F { class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) { modifiableTo[] = { "H_HelmetHeavy_VisorUp_Black_RF" }; }; }; -class H_HelmetHeavy_VisorUp_Black_RF: H_HelmetHeavy_Black_RF { class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up){ modifiableTo[] = { "H_HelmetHeavy_Black_RF" }; }; }; - -// Variants -HELMET_VARIANT(Hex) -HELMET_VARIANT(GHex) -HELMET_VARIANT(Sand) -HELMET_VARIANT(Olive) -HELMET_VARIANT(White) \ No newline at end of file diff --git a/addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp b/addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp deleted file mode 100644 index dae2da7e4e8..00000000000 --- a/addons/compat_rf/compat_rf_wardrobe/Uniforms.hpp +++ /dev/null @@ -1,23 +0,0 @@ -// CfgWeapons - -class Uniform_Base; - -// Macros -#define UNIFORM_BASE(class1,class2)\ -class class1: Uniform_Base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { modifiableTo[] = { QUOTE(class2) }; }; };\ -class class2: Uniform_Base { class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { modifiableTo[] = { QUOTE(class1) }; }; }; - -// Simple Variants -UNIFORM_BASE(U_C_FirefighterFatigues_RF,U_C_FirefighterFatigues_RolledUp_RF) -UNIFORM_BASE(U_BG_Guerrilla_6_1,U_BG_Guerrilla_RF) - - -// Pilot Jackets -class U_C_PilotJacket_black_RF: Uniform_Base { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { "U_C_PilotJacket_open_black_RF" }; }; }; -class U_C_PilotJacket_open_black_RF: U_C_PilotJacket_black_RF { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { "U_C_PilotJacket_black_RF" }; }; }; - -class U_C_PilotJacket_brown_RF: U_C_PilotJacket_black_RF { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { "U_C_PilotJacket_open_brown_RF" }; }; }; -class U_C_PilotJacket_open_brown_RF: U_C_PilotJacket_brown_RF { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { "U_C_PilotJacket_brown_RF" }; }; }; - -class U_C_PilotJacket_lbrown_RF: U_C_PilotJacket_black_RF { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_closed) { modifiableTo[] = { "U_C_PilotJacket_open_lbrown_RF" }; }; }; -class U_C_PilotJacket_open_lbrown_RF: U_C_PilotJacket_lbrown_RF { class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_open) { modifiableTo[] = { "U_C_PilotJacket_lbrown_RF" }; }; }; diff --git a/addons/compat_rf/compat_rf_wardrobe/script_component.hpp b/addons/compat_rf/compat_rf_wardrobe/script_component.hpp index 67ddb91ef0a..33ff700f410 100644 --- a/addons/compat_rf/compat_rf_wardrobe/script_component.hpp +++ b/addons/compat_rf/compat_rf_wardrobe/script_component.hpp @@ -2,4 +2,4 @@ #define SUBCOMPONENT_BEAUTIFIED Wardrobe #include "..\script_component.hpp" -#include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp" \ No newline at end of file +#include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp" From 28eb0ed3190b939bfa96511acdb3f7aa24c1c90f Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 8 Jan 2025 19:29:01 +0100 Subject: [PATCH 123/305] fix macro's (;) and linebreaks. --- .../compat_gm_wardrobe/CfgWardrobe.hpp | 1 - .../compat_gm/compat_gm_wardrobe/Helmets.hpp | 20 ++-- .../compat_gm/compat_gm_wardrobe/Uniforms.hpp | 4 - .../compat_sog_wardrobe/Booniehats.hpp | 10 +- .../compat_sog_wardrobe/Facewear.hpp | 2 +- .../compat_sog_wardrobe/Helmets.hpp | 28 +++--- .../compat_sog_wardrobe/Uniforms_B.hpp | 50 +++++----- .../compat_sog_wardrobe/Uniforms_O.hpp | 96 +++++++++---------- .../Uniforms.hpp | 42 ++++---- .../compat_ws_wardrobe/CfgWardrobe.hpp | 13 +-- .../compat_ws/compat_ws_wardrobe/Turbans.hpp | 18 ++-- .../functions/fnc_replace_container.sqf | 12 +-- addons/wardrobe/script_macros_wardrobe.hpp | 26 ++--- 13 files changed, 155 insertions(+), 167 deletions(-) diff --git a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp index 10c8f8d2da7..704f461fcfa 100644 --- a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp @@ -17,4 +17,3 @@ class CfgWeapons { #include "Helmets.hpp" #include "Uniforms.hpp" }; - diff --git a/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp b/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp index f65a423cb91..06b7fea1f5a 100644 --- a/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp @@ -43,13 +43,13 @@ class classWith: baseWith {\ modifiableTo[] = { QUOTE(classWithout) };\ components[] = { QUOTE(goggles) };\ };\ - MASS(11)\ + MASS(11);\ };\ class classWithout: baseWithout {\ class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) {\ modifiableTo[] = { QUOTE(classWith) };\ };\ -}; +} class gm_ge_headgear_m92_base; @@ -63,12 +63,12 @@ class gm_ge_headgear_m92_cover_glasses_base: gm_ge_headgear_m92_base { class ItemInfo; }; -GM_Helmet_Glasses(gm_ge_headgear_m92_cover_glasses_win,gm_ge_headgear_m92_cover_win,gm_ge_headgear_m92_cover_glasses_base,gm_ge_headgear_m92_cover_base,gm_ge_facewear_dustglasses) -GM_Helmet_Glasses(gm_ge_headgear_m92_cover_glasses_oli,gm_ge_headgear_m92_cover_oli,gm_ge_headgear_m92_cover_glasses_base,gm_ge_headgear_m92_cover_base,gm_ge_facewear_dustglasses) -GM_Helmet_Glasses(gm_ge_headgear_m92_cover_glasses_blk,gm_ge_headgear_m92_cover_blk,gm_ge_headgear_m92_cover_glasses_base,gm_ge_headgear_m92_cover_base,gm_ge_facewear_dustglasses) +GM_Helmet_Glasses(gm_ge_headgear_m92_cover_glasses_win,gm_ge_headgear_m92_cover_win,gm_ge_headgear_m92_cover_glasses_base,gm_ge_headgear_m92_cover_base,gm_ge_facewear_dustglasses); +GM_Helmet_Glasses(gm_ge_headgear_m92_cover_glasses_oli,gm_ge_headgear_m92_cover_oli,gm_ge_headgear_m92_cover_glasses_base,gm_ge_headgear_m92_cover_base,gm_ge_facewear_dustglasses); +GM_Helmet_Glasses(gm_ge_headgear_m92_cover_glasses_blk,gm_ge_headgear_m92_cover_blk,gm_ge_headgear_m92_cover_glasses_base,gm_ge_headgear_m92_cover_base,gm_ge_facewear_dustglasses); -GM_Helmet_Glasses(gm_ge_headgear_m92_glasses_trp,gm_ge_headgear_m92_trp,gm_ge_headgear_m92_glasses_base,gm_ge_headgear_m92_base,gm_ge_facewear_dustglasses) -GM_Helmet_Glasses(gm_ge_headgear_m92_glasses_flk,gm_ge_headgear_m92_flk,gm_ge_headgear_m92_glasses_base,gm_ge_headgear_m92_base,gm_ge_facewear_dustglasses) +GM_Helmet_Glasses(gm_ge_headgear_m92_glasses_trp,gm_ge_headgear_m92_trp,gm_ge_headgear_m92_glasses_base,gm_ge_headgear_m92_base,gm_ge_facewear_dustglasses); +GM_Helmet_Glasses(gm_ge_headgear_m92_glasses_flk,gm_ge_headgear_m92_flk,gm_ge_headgear_m92_glasses_base,gm_ge_headgear_m92_base,gm_ge_facewear_dustglasses); class gm_headgear_armored_base; @@ -76,7 +76,7 @@ class gm_ge_headgear_m38_72_base; class gm_ge_headgear_m38_72_goggles_base: gm_headgear_armored_base { class ItemInfo; }; -GM_Helmet_Glasses(gm_ge_bgs_headgear_m38_72_goggles_bgr,gm_ge_bgs_headgear_m38_72_bgr,gm_ge_headgear_m38_72_goggles_base,gm_ge_headgear_m38_72_base,gm_ge_facewear_acidgoggles) +GM_Helmet_Glasses(gm_ge_bgs_headgear_m38_72_goggles_bgr,gm_ge_bgs_headgear_m38_72_bgr,gm_ge_headgear_m38_72_goggles_base,gm_ge_headgear_m38_72_base,gm_ge_facewear_acidgoggles); // Caps with M62 Helmets // Base Classes @@ -119,12 +119,12 @@ class gm_ge_headgear_hat_80_m62_oli: gm_ge_headgear_hat_80_base { modifiableTo[] = {"gm_ge_headgear_hat_80_oli","gm_ge_headgear_m62_net"}; components[] = {"gm_ge_headgear_hat_80_oli","gm_ge_headgear_m62_net"}; }; - MASS(20) + MASS(20); }; class gm_ge_headgear_sidecap_80_m62_oli: gm_ge_headgear_sidecap_80_base { class ace_wardrobe: EGVAR(wardrobe,base) { modifiableTo[] = {"gm_ge_headgear_sidecap_80_oli","gm_ge_headgear_m62_net"}; components[] = {"gm_ge_headgear_sidecap_80_oli","gm_ge_headgear_m62_net"}; }; - MASS(20) + MASS(20); }; diff --git a/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp b/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp index c8857364a5e..6a548d214e6 100644 --- a/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp @@ -150,8 +150,6 @@ class gm_ge_uniform_soldier_rolled_90_flk: gm_ge_uniform_soldier_90_base { }; - - // Gloves class gm_gc_uniform_soldier_80_base; @@ -214,5 +212,3 @@ class gm_xx_uniform_soldier_bdu_nogloves_80_oli: gm_ge_army_uniform_soldier_bdu_ modifiableTo[] = { "gm_xx_uniform_soldier_bdu_80_oli", "gm_xx_uniform_soldier_bdu_rolled_80_oli" }; }; }; - - diff --git a/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp b/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp index 14626adbeb6..9cc5a49843c 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp @@ -68,12 +68,12 @@ class CN(05,CAMO): CN(02,CAMO) {\ class ace_wardrobe: EGVAR(wardrobe,base) {\ modifiableTo[] = { QCN(01,CAMO), QCN(02,CAMO), QCN(03,CAMO), QCN(04,CAMO) };\ };\ -}; +} -CN_COLORS(02) -CN_COLORS(03) -CN_COLORS(04) -CN_COLORS(05) +CN_COLORS(02); +CN_COLORS(03); +CN_COLORS(04); +CN_COLORS(05); // Base classes in CfgWeapons.hpp diff --git a/addons/compat_sog/compat_sog_wardrobe/Facewear.hpp b/addons/compat_sog/compat_sog_wardrobe/Facewear.hpp index a99810ffa00..65435cbde80 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Facewear.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Facewear.hpp @@ -100,4 +100,4 @@ class vn_o_acc_goggles_03: vn_glasses_base { modifiableTo[] = { "vn_o_acc_km32_01", "vn_o_acc_goggles_02" }; components[] = { "vn_o_acc_km32_01", "vn_o_acc_goggles_02"}; }; -}; \ No newline at end of file +}; diff --git a/addons/compat_sog/compat_sog_wardrobe/Helmets.hpp b/addons/compat_sog/compat_sog_wardrobe/Helmets.hpp index bc5af5b4e8a..9f1fb7b961a 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Helmets.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Helmets.hpp @@ -16,7 +16,7 @@ class CN02(side,var1,var2): base_class_dn {\ class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) {\ modifiableTo[] = { QUOTE(CN01(side,var1,var2)) };\ };\ -}; +} // Base classes in CfgWeapons.hpp @@ -24,8 +24,8 @@ class CN02(side,var1,var2): base_class_dn {\ // Parent Version aph6 & svh4 #define base_class_up vn_b_headgear_base #define base_class_dn vn_b_headgear_base -HELMET_VARIANT(b,aph6,01) -HELMET_VARIANT(b,svh4,01) +HELMET_VARIANT(b,aph6,01); +HELMET_VARIANT(b,svh4,01); // Child Version aph6 #undef base_class_up @@ -33,10 +33,10 @@ HELMET_VARIANT(b,svh4,01) #define base_class_up CN01(b,aph6,01) #define base_class_dn CN02(b,aph6,01) -HELMET_VARIANT(b,aph6,02) -HELMET_VARIANT(b,aph6,03) -HELMET_VARIANT(b,aph6,04) -HELMET_VARIANT(b,aph6,05) +HELMET_VARIANT(b,aph6,02); +HELMET_VARIANT(b,aph6,03); +HELMET_VARIANT(b,aph6,04); +HELMET_VARIANT(b,aph6,05); // Child Version svh4 #undef base_class_up @@ -44,11 +44,15 @@ HELMET_VARIANT(b,aph6,05) #define base_class_up CN01(b,svh4,01) #define base_class_dn CN02(b,svh4,01) -HELMET_VARIANT(b,svh4,02) -HELMET_VARIANT(b,svh4,03) -HELMET_VARIANT(b,svh4,04) -HELMET_VARIANT(b,svh4,05) -HELMET_VARIANT(b,svh4,06) +HELMET_VARIANT(b,svh4,02); +HELMET_VARIANT(b,svh4,03); +HELMET_VARIANT(b,svh4,04); +HELMET_VARIANT(b,svh4,05); +HELMET_VARIANT(b,svh4,06); + +#undef base_class_up +#undef base_class_dn + // Special Case zsh3 class vn_o_helmet_zsh3_01: vn_o_headgear_base { diff --git a/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp b/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp index 72e41a9b087..b7252fac4e5 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp @@ -13,7 +13,7 @@ class class2: vn_b_uniform_base {\ class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) {\ modifiableTo[] = { QUOTE(class1) };\ };\ -}; +} #define B_U(div,var,camo) vn_b_uniform_##div##_##var##_##camo #define B_U_PAIR(div,down,up,camo) UNIFORM_BASE_B(B_U(div,down,camo),B_U(div,up,camo)) @@ -21,23 +21,23 @@ class class2: vn_b_uniform_base {\ // Simple Variants // ACZAC -UNIFORM_BASE_B(vn_b_uniform_aus_01_01,vn_b_uniform_aus_02_01) -UNIFORM_BASE_B(vn_b_uniform_aus_03_01,vn_b_uniform_aus_04_01) -UNIFORM_BASE_B(vn_b_uniform_aus_05_01,vn_b_uniform_aus_06_01) -UNIFORM_BASE_B(vn_b_uniform_aus_07_01,vn_b_uniform_aus_08_01) -UNIFORM_BASE_B(vn_b_uniform_aus_09_01,vn_b_uniform_aus_10_01) +UNIFORM_BASE_B(vn_b_uniform_aus_01_01,vn_b_uniform_aus_02_01); +UNIFORM_BASE_B(vn_b_uniform_aus_03_01,vn_b_uniform_aus_04_01); +UNIFORM_BASE_B(vn_b_uniform_aus_05_01,vn_b_uniform_aus_06_01); +UNIFORM_BASE_B(vn_b_uniform_aus_07_01,vn_b_uniform_aus_08_01); +UNIFORM_BASE_B(vn_b_uniform_aus_09_01,vn_b_uniform_aus_10_01); // NZ -UNIFORM_BASE_B(vn_b_uniform_NZ_01_01,vn_b_uniform_NZ_02_01) -UNIFORM_BASE_B(vn_b_uniform_NZ_03_01,vn_b_uniform_NZ_04_01) -UNIFORM_BASE_B(vn_b_uniform_NZ_05_01,vn_b_uniform_NZ_06_01) +UNIFORM_BASE_B(vn_b_uniform_NZ_01_01,vn_b_uniform_NZ_02_01); +UNIFORM_BASE_B(vn_b_uniform_NZ_03_01,vn_b_uniform_NZ_04_01); +UNIFORM_BASE_B(vn_b_uniform_NZ_05_01,vn_b_uniform_NZ_06_01); // SEAL STUFF -UNIFORM_BASE_B(vn_b_uniform_seal_01_01,vn_b_uniform_seal_02_01) -UNIFORM_BASE_B(vn_b_uniform_seal_01_02,vn_b_uniform_seal_02_02) -UNIFORM_BASE_B(vn_b_uniform_seal_01_05,vn_b_uniform_seal_02_05) -UNIFORM_BASE_B(vn_b_uniform_seal_01_06,vn_b_uniform_seal_02_06) -UNIFORM_BASE_B(vn_b_uniform_seal_01_07,vn_b_uniform_seal_02_07) +UNIFORM_BASE_B(vn_b_uniform_seal_01_01,vn_b_uniform_seal_02_01); +UNIFORM_BASE_B(vn_b_uniform_seal_01_02,vn_b_uniform_seal_02_02); +UNIFORM_BASE_B(vn_b_uniform_seal_01_05,vn_b_uniform_seal_02_05); +UNIFORM_BASE_B(vn_b_uniform_seal_01_06,vn_b_uniform_seal_02_06); +UNIFORM_BASE_B(vn_b_uniform_seal_01_07,vn_b_uniform_seal_02_07); // MACV #define OLIVE_FIELD 01 @@ -53,16 +53,16 @@ UNIFORM_BASE_B(vn_b_uniform_seal_01_07,vn_b_uniform_seal_02_07) // macv 05 and 04 have inconsistency between them -> different uniform maxLoad. This likely will cause the player to loose items when the uniform is filled to the brim. Difference is 1lb which translates to 16~17x ace bandages or 1x 1l blood #define B_U_PAIR_SET(camo)\ -B_U_PAIR(macv,02,03,camo)\ +B_U_PAIR(macv,02,03,camo);\ B_U_PAIR(macv,05,04,camo) -B_U_PAIR_SET(TIGER) -B_U_PAIR_SET(TIGER_GREEN) -B_U_PAIR_SET(ERDL) -B_U_PAIR_SET(ERDL_BROWN) -B_U_PAIR_SET(OLIVE) -B_U_PAIR_SET(OLIVE_FIELD) -B_U_PAIR_SET(LEOPARD) -B_U_PAIR_SET(LIZARD) -B_U_PAIR_SET(BDQ) -B_U_PAIR_SET(FROG) +B_U_PAIR_SET(TIGER); +B_U_PAIR_SET(TIGER_GREEN); +B_U_PAIR_SET(ERDL); +B_U_PAIR_SET(ERDL_BROWN); +B_U_PAIR_SET(OLIVE); +B_U_PAIR_SET(OLIVE_FIELD); +B_U_PAIR_SET(LEOPARD); +B_U_PAIR_SET(LIZARD); +B_U_PAIR_SET(BDQ); +B_U_PAIR_SET(FROG); diff --git a/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp b/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp index b411ab0c7f5..f4b20fca32e 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp @@ -10,13 +10,13 @@ class class2: vn_o_uniform_base {\ class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) {\ modifiableTo[] = { QUOTE(class1) };\ };\ -}; +} // OPFOR // NVA Sailors -UNIFORM_BASE_O(vn_o_uniform_nva_navy_01,vn_o_uniform_nva_navy_03) -UNIFORM_BASE_O(vn_o_uniform_nva_navy_02,vn_o_uniform_nva_navy_04) +UNIFORM_BASE_O(vn_o_uniform_nva_navy_01,vn_o_uniform_nva_navy_03); +UNIFORM_BASE_O(vn_o_uniform_nva_navy_02,vn_o_uniform_nva_navy_04); // NVA_Army_AA_BB // brown: 01,02 03,04 | GREEN: 01..12 @@ -26,23 +26,23 @@ UNIFORM_BASE_O(vn_o_uniform_nva_navy_02,vn_o_uniform_nva_navy_04) #define GREEN_FIELD 04 #define O_U_NVA_ARMY(var,camo) vn_o_uniform_nva_army_##var##_##camo #define O_U_NVA_ARMY_PAIR(down,up,camo) UNIFORM_BASE_O(O_U_NVA_ARMY(down,camo),O_U_NVA_ARMY(up,camo)) -O_U_NVA_ARMY_PAIR(01,02,BROWN) -O_U_NVA_ARMY_PAIR(03,04,BROWN) -O_U_NVA_ARMY_PAIR(01,02,BROWN_FIELD) -O_U_NVA_ARMY_PAIR(03,04,BROWN_FIELD) +O_U_NVA_ARMY_PAIR(01,02,BROWN); +O_U_NVA_ARMY_PAIR(03,04,BROWN); +O_U_NVA_ARMY_PAIR(01,02,BROWN_FIELD); +O_U_NVA_ARMY_PAIR(03,04,BROWN_FIELD); -O_U_NVA_ARMY_PAIR(01,02,GREEN) -O_U_NVA_ARMY_PAIR(03,04,GREEN) -O_U_NVA_ARMY_PAIR(05,06,GREEN) -O_U_NVA_ARMY_PAIR(07,08,GREEN) -O_U_NVA_ARMY_PAIR(09,10,GREEN) -O_U_NVA_ARMY_PAIR(11,12,GREEN) -O_U_NVA_ARMY_PAIR(01,02,GREEN_FIELD) -O_U_NVA_ARMY_PAIR(03,04,GREEN_FIELD) -O_U_NVA_ARMY_PAIR(05,06,GREEN_FIELD) -O_U_NVA_ARMY_PAIR(07,08,GREEN_FIELD) -O_U_NVA_ARMY_PAIR(09,10,GREEN_FIELD) -O_U_NVA_ARMY_PAIR(11,12,GREEN_FIELD) +O_U_NVA_ARMY_PAIR(01,02,GREEN); +O_U_NVA_ARMY_PAIR(03,04,GREEN); +O_U_NVA_ARMY_PAIR(05,06,GREEN); +O_U_NVA_ARMY_PAIR(07,08,GREEN); +O_U_NVA_ARMY_PAIR(09,10,GREEN); +O_U_NVA_ARMY_PAIR(11,12,GREEN); +O_U_NVA_ARMY_PAIR(01,02,GREEN_FIELD); +O_U_NVA_ARMY_PAIR(03,04,GREEN_FIELD); +O_U_NVA_ARMY_PAIR(05,06,GREEN_FIELD); +O_U_NVA_ARMY_PAIR(07,08,GREEN_FIELD); +O_U_NVA_ARMY_PAIR(09,10,GREEN_FIELD); +O_U_NVA_ARMY_PAIR(11,12,GREEN_FIELD); // PL ARMY #define DARK 11 @@ -52,42 +52,42 @@ O_U_NVA_ARMY_PAIR(11,12,GREEN_FIELD) #define O_U_PL_ARMY(var,camo) vn_o_uniform_pl_army_##var##_##camo #define O_U_PL_ARMY_PAIR(down,up,camo) UNIFORM_BASE_O(O_U_PL_ARMY(down,camo),O_U_PL_ARMY(up,camo)) -O_U_PL_ARMY_PAIR(01,02,DARK) -O_U_PL_ARMY_PAIR(03,04,DARK) -O_U_PL_ARMY_PAIR(01,02,DARK_FIELD) -O_U_PL_ARMY_PAIR(03,04,DARK_FIELD) -O_U_PL_ARMY_PAIR(01,02,LIGHT) -O_U_PL_ARMY_PAIR(03,04,LIGHT) -O_U_PL_ARMY_PAIR(01,02,LIGHT_FIELD) -O_U_PL_ARMY_PAIR(03,04,LIGHT_FIELD) +O_U_PL_ARMY_PAIR(01,02,DARK); +O_U_PL_ARMY_PAIR(03,04,DARK); +O_U_PL_ARMY_PAIR(01,02,DARK_FIELD); +O_U_PL_ARMY_PAIR(03,04,DARK_FIELD); +O_U_PL_ARMY_PAIR(01,02,LIGHT); +O_U_PL_ARMY_PAIR(03,04,LIGHT); +O_U_PL_ARMY_PAIR(01,02,LIGHT_FIELD); +O_U_PL_ARMY_PAIR(03,04,LIGHT_FIELD); #define O_U(div,var,camo) vn_o_uniform_##div##_##var##_##camo #define O_U_PAIR(div,down,up,camo) UNIFORM_BASE_O(O_U(div,down,camo),O_U(div,up,camo)) // VC MF #define VC_MF 07 -O_U_PAIR(vc_mf,01,02,VC_MF) -O_U_PAIR(vc_mf,03,04,VC_MF) -O_U_PAIR(vc_mf,09,10,VC_MF) -O_U_PAIR(vc_mf,11,12,VC_MF) +O_U_PAIR(vc_mf,01,02,VC_MF); +O_U_PAIR(vc_mf,03,04,VC_MF); +O_U_PAIR(vc_mf,09,10,VC_MF); +O_U_PAIR(vc_mf,11,12,VC_MF); // VC REG -O_U_PAIR(vc_reg,11,12,08) -O_U_PAIR(vc_reg,11,12,09) -O_U_PAIR(vc_reg,11,12,10) +O_U_PAIR(vc_reg,11,12,08); +O_U_PAIR(vc_reg,11,12,09); +O_U_PAIR(vc_reg,11,12,10); // VC BLACK 01 BLACK_WHITE 02 GREY_TAN 03 BLUE 04 WHITE_BLACK 05 BLUE_WHITE 06 BLUE_GREY 07 -O_U_PAIR(vc,01,02,01) -O_U_PAIR(vc,03,04,01) -O_U_PAIR(vc,01,02,02) -O_U_PAIR(vc,03,04,02) -O_U_PAIR(vc,01,02,03) -O_U_PAIR(vc,03,04,03) -O_U_PAIR(vc,01,02,04) -O_U_PAIR(vc,03,04,04) -O_U_PAIR(vc,01,02,05) -O_U_PAIR(vc,03,04,05) -O_U_PAIR(vc,01,02,06) -O_U_PAIR(vc,03,04,06) -O_U_PAIR(vc,01,02,07) -O_U_PAIR(vc,03,04,07) +O_U_PAIR(vc,01,02,01); +O_U_PAIR(vc,03,04,01); +O_U_PAIR(vc,01,02,02); +O_U_PAIR(vc,03,04,02); +O_U_PAIR(vc,01,02,03); +O_U_PAIR(vc,03,04,03); +O_U_PAIR(vc,01,02,04); +O_U_PAIR(vc,03,04,04); +O_U_PAIR(vc,01,02,05); +O_U_PAIR(vc,03,04,05); +O_U_PAIR(vc,01,02,06); +O_U_PAIR(vc,03,04,06); +O_U_PAIR(vc,01,02,07); +O_U_PAIR(vc,03,04,07); diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp index f7aa497ff4a..592d502d4e3 100644 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp +++ b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp @@ -4,7 +4,7 @@ class className: vn_b_uniform_base {\ containerClass = "Supply70";\ mass = 70;\ };\ -}; +} class CfgWeapons { class Uniform_Base; @@ -12,16 +12,16 @@ class CfgWeapons { class ItemInfo; }; - S_70(vn_b_uniform_macv_04_01) - S_70(vn_b_uniform_macv_04_02) - S_70(vn_b_uniform_macv_04_05) - S_70(vn_b_uniform_macv_04_06) - S_70(vn_b_uniform_macv_04_07) - S_70(vn_b_uniform_macv_04_08) - S_70(vn_b_uniform_macv_04_15) - S_70(vn_b_uniform_macv_04_16) - S_70(vn_b_uniform_macv_04_17) - S_70(vn_b_uniform_macv_04_18) + S_70(vn_b_uniform_macv_04_01); + S_70(vn_b_uniform_macv_04_02); + S_70(vn_b_uniform_macv_04_05); + S_70(vn_b_uniform_macv_04_06); + S_70(vn_b_uniform_macv_04_07); + S_70(vn_b_uniform_macv_04_08); + S_70(vn_b_uniform_macv_04_15); + S_70(vn_b_uniform_macv_04_16); + S_70(vn_b_uniform_macv_04_17); + S_70(vn_b_uniform_macv_04_18); //// US Headgear @@ -32,10 +32,10 @@ class CfgWeapons { }; class vn_b_helmet_m1_20_01: vn_b_helmet_m1_14_01 { - MASS(12) + MASS(12); }; class vn_b_helmet_m1_20_02: vn_b_helmet_m1_20_01 { - MASS(12) + MASS(12); }; @@ -45,15 +45,15 @@ class CfgWeapons { class ItemInfo; }; class vn_b_helmet_t56_02_01: vn_b_helmet_t56_01_01 { - MASS(12) + MASS(12); }; class vn_b_helmet_t56_02_02: vn_b_helmet_t56_02_01 { - MASS(12) + MASS(12); }; class vn_b_helmet_t56_02_03: vn_b_helmet_t56_02_01 { - MASS(12) + MASS(12); }; //// NVA Headgear @@ -67,18 +67,18 @@ class CfgWeapons { }; // NVA Pilot Helmet with Goggles class vn_o_helmet_shl61_01: vn_o_headgear_base { - MASS(12) + MASS(12); }; class vn_o_helmet_shl61_02: vn_o_helmet_shl61_01 { - MASS(10) + MASS(10); }; // NVA Crew Helmet with Goggles class vn_o_helmet_tsh3_01: vn_o_headgear_base { - MASS(12) + MASS(12); }; class vn_o_helmet_tsh3_02: vn_o_helmet_tsh3_01 { - MASS(10) + MASS(10); }; @@ -88,7 +88,7 @@ class CfgWeapons { class ItemInfo; }; class vn_o_helmet_nva_05: vn_o_helmet_nva_01 { - MASS(12) + MASS(12); }; }; diff --git a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp index 65562da4807..bab07ff8f04 100644 --- a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp @@ -3,7 +3,6 @@ class EGVAR(wardrobe,base_H_goggles_on); class EGVAR(wardrobe,base_H_goggles_off); - class CfgGlasses { class G_Combat; class G_Combat_lxWS: G_Combat { @@ -14,9 +13,6 @@ class CfgGlasses { }; - - - class CfgWeapons { class ItemCore; @@ -44,28 +40,28 @@ class CfgWeapons { //// RF Helmets with Glasses class lxWS_H_PASGT_goggles_UN_F: HelmetBase { - MASS(32) + MASS(32); class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { modifiableTo[] = { "lxWS_H_PASGT_basic_UN_F" }; components[] = {"G_Combat_lxWS"}; }; }; class lxWS_H_PASGT_goggles_black_F: lxWS_H_PASGT_goggles_UN_F { - MASS(32) + MASS(32); class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { modifiableTo[] = { "H_PASGT_basic_black_F" }; components[] = {"G_Combat_lxWS"}; }; }; class lxWS_H_PASGT_goggles_olive_F: lxWS_H_PASGT_goggles_UN_F { - MASS(32) + MASS(32); class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { modifiableTo[] = { "H_PASGT_basic_olive_F" }; components[] = {"G_Combat_lxWS"}; }; }; class lxWS_H_PASGT_goggles_white_F: lxWS_H_PASGT_goggles_UN_F { - MASS(32) + MASS(32); class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { modifiableTo[] = { "H_PASGT_basic_white_F" }; components[] = {"G_Combat_lxWS"}; @@ -94,4 +90,3 @@ class CfgWeapons { }; }; }; - diff --git a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp index 48a23d42864..e071106faa2 100644 --- a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp @@ -24,7 +24,7 @@ class CN(04,COLOR): lxWS_H_turban_04_black {\ class ace_wardrobe: EGVAR(wardrobe,base) {\ modifiableTo[] = { QCN(01,COLOR), QCN(02,COLOR), QCN(03,COLOR) };\ };\ -}; +} #define COLORGROUP_SPECIAL(COLOR)\ @@ -37,7 +37,7 @@ class CN(03,COLOR): lxWS_H_turban_03_black {\ class ace_wardrobe: EGVAR(wardrobe,base) {\ modifiableTo[] = { QCN(02,COLOR) };\ };\ -}; +} // BASECLASS @@ -76,15 +76,15 @@ class lxWS_H_turban_04_black: lxWS_H_turban_01_black { }; // VARIATIONS -COLORGROUP(blue) -COLORGROUP(blue_una) -COLORGROUP(green) -COLORGROUP(red) -COLORGROUP(gray) -COLORGROUP(yellow) +COLORGROUP(blue); +COLORGROUP(blue_una); +COLORGROUP(green); +COLORGROUP(red); +COLORGROUP(gray); +COLORGROUP(yellow); // Special Variations -COLORGROUP_SPECIAL(green_pattern) +COLORGROUP_SPECIAL(green_pattern); // Super Special Manual blabla diff --git a/addons/wardrobe/functions/fnc_replace_container.sqf b/addons/wardrobe/functions/fnc_replace_container.sqf index 9de67da85af..797c3025ce9 100644 --- a/addons/wardrobe/functions/fnc_replace_container.sqf +++ b/addons/wardrobe/functions/fnc_replace_container.sqf @@ -28,9 +28,9 @@ private _loadout = [_player] call CBA_fnc_getLoadout; //// Handle Special Cases - Pre Replace // ACE Intel Items -INTEL_PRE(_hasDocument,acex_intelitems_document) -INTEL_PRE(_hasNotepad,acex_intelitems_notepad) -INTEL_PRE(_hasPhoto,acex_intelitems_photo) +INTEL_PRE(_hasDocument,acex_intelitems_document); +INTEL_PRE(_hasNotepad,acex_intelitems_notepad); +INTEL_PRE(_hasPhoto,acex_intelitems_photo); // ACE Overheating private _hasSpareBarrel = _magazineDetails findIf { _x#0 == "ACE_SpareBarrel" } > -1; @@ -52,9 +52,9 @@ switch (_case) do { //// Handle Special Cases - Post Replace // ACE Intel Items -INTEL_POST(_hasDocument,acex_intelitems_document) -INTEL_POST(_hasNotepad,acex_intelitems_notepad) -INTEL_POST(_hasPhoto,acex_intelitems_photo) +INTEL_POST(_hasDocument,acex_intelitems_document); +INTEL_POST(_hasNotepad,acex_intelitems_notepad); +INTEL_POST(_hasPhoto,acex_intelitems_photo); // ACE Overheating if (_hasSpareBarrel isEqualType [] ) then { diff --git a/addons/wardrobe/script_macros_wardrobe.hpp b/addons/wardrobe/script_macros_wardrobe.hpp index 238c4a0429d..d145ef346d9 100644 --- a/addons/wardrobe/script_macros_wardrobe.hpp +++ b/addons/wardrobe/script_macros_wardrobe.hpp @@ -9,29 +9,23 @@ // LSTRING for cba Settings #define SETLSTRING(key) [LSTRING(DOUBLES(set,key)),LSTRING(TRIPLES(set,key,desc))] +// QOL #define QQ(var1) QUOTE(QUOTE(var1)) - #define QADDON QUOTE(ADDON) -// Paths -#define PATH_TO_FUNC QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\functions) -#define PATH_TO_FUNC_SUB(var1) QUOTE(\MAINPREFIX\PREFIX\addons\COMPONENT\functions\var1) - - -// Config - -//// Adjust Weight of CfgWeapons Wearables. -#define MASS(var)\ -class ItemInfo: ItemInfo {\ - mass = var;\ -}; - // REPLACE #define INTEL_PRE(varName,className)\ private varName = _magazineDetails findIf { _x select 0 == QUOTE(className) } > -1;\ -if (varName) then { _hasDocument = [_player, QUOTE(className)] call CBA_fnc_getMagazineIndex apply { [_x] call FUNC(getIndexFromMagID) } }; +if (varName) then { _hasDocument = [_player, QUOTE(className)] call CBA_fnc_getMagazineIndex apply { [_x] call FUNC(getIndexFromMagID) } } #define INTEL_POST(varName,className)\ -if (varName isEqualType []) then { { [_x, varName select _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, QUOTE(className)] call CBA_fnc_getMagazineIndex ); }; +if (varName isEqualType []) then { { [_x, varName select _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, QUOTE(className)] call CBA_fnc_getMagazineIndex ); } + +// Config +//// Adjust Weight of CfgWeapons Wearables. +#define MASS(var)\ +class ItemInfo: ItemInfo {\ + mass = var;\ +} From ddaf9af32b434aaaa7c2655c982bf90bfe3d3ec6 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 8 Jan 2025 19:31:50 +0100 Subject: [PATCH 124/305] EOF new line --- addons/wardrobe/Baseclass.hpp | 2 +- addons/wardrobe/CfgEventHandlers.hpp | 2 +- addons/wardrobe/CfgWardrobe.hpp | 4 ++-- addons/wardrobe/XEH_PREP.hpp | 2 +- addons/wardrobe/config.cpp | 2 +- addons/wardrobe/data/attribution.md | 3 ++- addons/wardrobe/script_component.hpp | 2 +- 7 files changed, 9 insertions(+), 8 deletions(-) diff --git a/addons/wardrobe/Baseclass.hpp b/addons/wardrobe/Baseclass.hpp index 42d951adda5..0ba855dd7f4 100644 --- a/addons/wardrobe/Baseclass.hpp +++ b/addons/wardrobe/Baseclass.hpp @@ -76,4 +76,4 @@ class GVAR(base_H_goggles_on): GVAR(base) { class GVAR(base_H_goggles_off): GVAR(base) { gesture ="GestureWipeFace"; alternativeDisplayName = CSTRING(gogglesOff); -}; \ No newline at end of file +}; diff --git a/addons/wardrobe/CfgEventHandlers.hpp b/addons/wardrobe/CfgEventHandlers.hpp index 2f9c48aa546..b777f210098 100644 --- a/addons/wardrobe/CfgEventHandlers.hpp +++ b/addons/wardrobe/CfgEventHandlers.hpp @@ -8,4 +8,4 @@ class Extended_PostInit_EventHandlers { class ADDON { init = QUOTE(call COMPILE_SCRIPT(XEH_postInit)); }; -}; \ No newline at end of file +}; diff --git a/addons/wardrobe/CfgWardrobe.hpp b/addons/wardrobe/CfgWardrobe.hpp index b1740e5a47d..b7de9e608b9 100644 --- a/addons/wardrobe/CfgWardrobe.hpp +++ b/addons/wardrobe/CfgWardrobe.hpp @@ -1,8 +1,8 @@ + class CfgWeapons { #include "Uniforms.hpp" }; - class CfgGlasses { #include "Facewear.hpp" -}; \ No newline at end of file +}; diff --git a/addons/wardrobe/XEH_PREP.hpp b/addons/wardrobe/XEH_PREP.hpp index d3277cea11f..417a9cc8cb4 100644 --- a/addons/wardrobe/XEH_PREP.hpp +++ b/addons/wardrobe/XEH_PREP.hpp @@ -33,4 +33,4 @@ PREP(compare_container_maxLoad); // CBA Context Menu PREP(enable_contextMenu); PREP(do_nextVariant); -PREP(getNextVariant); \ No newline at end of file +PREP(getNextVariant); diff --git a/addons/wardrobe/config.cpp b/addons/wardrobe/config.cpp index cc109411521..966dd4a903e 100644 --- a/addons/wardrobe/config.cpp +++ b/addons/wardrobe/config.cpp @@ -28,4 +28,4 @@ class CfgPatches { #include "Baseclass.hpp" -#include "CfgWardrobe.hpp" \ No newline at end of file +#include "CfgWardrobe.hpp" diff --git a/addons/wardrobe/data/attribution.md b/addons/wardrobe/data/attribution.md index ffd4622c6b6..417747726ff 100644 --- a/addons/wardrobe/data/attribution.md +++ b/addons/wardrobe/data/attribution.md @@ -9,4 +9,5 @@ helmet_visor_05 Click of a Motorcycle Helmet Visor by rylandbrooks https://freesound.org/s/328103/ - License: Creative Commons 0 \ No newline at end of file + License: Creative Commons 0 + \ No newline at end of file diff --git a/addons/wardrobe/script_component.hpp b/addons/wardrobe/script_component.hpp index 3bfe0fd2d46..907b02485b8 100644 --- a/addons/wardrobe/script_component.hpp +++ b/addons/wardrobe/script_component.hpp @@ -15,4 +15,4 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" -#include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp" \ No newline at end of file +#include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp" From 77dbcddc19c7b6d2e7d0f31b01331ecee0aaa4b9 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 8 Jan 2025 19:32:03 +0100 Subject: [PATCH 125/305] macro; --- addons/wardrobe/CfgSounds.hpp | 16 ++++++++-------- addons/wardrobe/Uniforms.hpp | 15 +++++++-------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/addons/wardrobe/CfgSounds.hpp b/addons/wardrobe/CfgSounds.hpp index 72a856caed6..8fd5d3b4ed7 100644 --- a/addons/wardrobe/CfgSounds.hpp +++ b/addons/wardrobe/CfgSounds.hpp @@ -6,15 +6,15 @@ class GVAR(DOUBLES(base,dur)) {\ titles[] = { 0, "" };\ forceTitles = 0;\ titlesStructured = 0;\ -}; +} class CfgSounds { sounds[] = {}; - ENTRY(fabric,06) - ENTRY(fabric,07) - ENTRY(fabric,16) - ENTRY(fabric,20) - ENTRY(fabric,25) + ENTRY(fabric,06); + ENTRY(fabric,07); + ENTRY(fabric,16); + ENTRY(fabric,20); + ENTRY(fabric,25); - ENTRY(helmet_visor,05) -}; \ No newline at end of file + ENTRY(helmet_visor,05); +}; diff --git a/addons/wardrobe/Uniforms.hpp b/addons/wardrobe/Uniforms.hpp index 511fba3b967..f40cc377517 100644 --- a/addons/wardrobe/Uniforms.hpp +++ b/addons/wardrobe/Uniforms.hpp @@ -12,20 +12,19 @@ class class2: Uniform_Base {\ class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) {\ modifiableTo[] = { QUOTE(class1) };\ };\ -}; +} // Vanilla CTRG Uniform -UNIFORM_BASE(U_B_CTRG_1,U_B_CTRG_3) +UNIFORM_BASE(U_B_CTRG_1,U_B_CTRG_3); // AAF Fatigues -UNIFORM_BASE(U_I_CombatUniform,U_I_CombatUniform_shortsleeve) +UNIFORM_BASE(U_I_CombatUniform,U_I_CombatUniform_shortsleeve); // APEX CTRG Uniforms -UNIFORM_BASE(U_B_CTRG_Soldier_F,U_B_CTRG_Soldier_3_F) -UNIFORM_BASE(U_B_CTRG_Soldier_Arid_F,U_B_CTRG_Soldier_3_Arid_F) -UNIFORM_BASE(U_B_CTRG_Soldier_urb_1_F,U_B_CTRG_Soldier_urb_3_F) +UNIFORM_BASE(U_B_CTRG_Soldier_F,U_B_CTRG_Soldier_3_F); +UNIFORM_BASE(U_B_CTRG_Soldier_Arid_F,U_B_CTRG_Soldier_3_Arid_F); +UNIFORM_BASE(U_B_CTRG_Soldier_urb_1_F,U_B_CTRG_Soldier_urb_3_F); // Contact - LDF Fatigues -UNIFORM_BASE(U_I_E_Uniform_01_F,U_I_E_Uniform_01_shortsleeve_F) - +UNIFORM_BASE(U_I_E_Uniform_01_F,U_I_E_Uniform_01_shortsleeve_F); From e6c1b79e8f024a041a14bc560bf55e485c066fc0 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 9 Jan 2025 18:42:15 +0100 Subject: [PATCH 126/305] merged uniform fix into sog compat Since there appeared to be more items which needed some sort of config adjustment, might as well merge these into the normal compats as well --- .hemtt/launch.toml | 2 +- .hemtt/missions/Wardrobe.VR/mission.sqm | 3 + .../compat_sog_wardrobe/CfgWardrobe.hpp | 8 +- .../compat_sog_wardrobe/Facewear.hpp | 3 +- .../compat_sog_wardrobe/Helmets.hpp | 18 +++- .../compat_sog_wardrobe/Uniforms_B.hpp | 34 +++++- .../Uniforms.hpp | 102 ------------------ .../config.cpp | 22 ---- .../compat_sog_wardrobe_uniform_fix/readme.md | 10 -- .../script_component.hpp | 5 - 10 files changed, 57 insertions(+), 150 deletions(-) delete mode 100644 addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp delete mode 100644 addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp delete mode 100644 addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md delete mode 100644 addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp diff --git a/.hemtt/launch.toml b/.hemtt/launch.toml index 36d048e14e3..49610869621 100644 --- a/.hemtt/launch.toml +++ b/.hemtt/launch.toml @@ -53,6 +53,6 @@ mission = "Wardrobe.VR" dlc = [ # "Western Sahara", # "Reaction Forces", -# "S.O.G. Prairie Fire", + "S.O.G. Prairie Fire", # "gm" ] \ No newline at end of file diff --git a/.hemtt/missions/Wardrobe.VR/mission.sqm b/.hemtt/missions/Wardrobe.VR/mission.sqm index 1010aff970d..d3ab289f354 100644 --- a/.hemtt/missions/Wardrobe.VR/mission.sqm +++ b/.hemtt/missions/Wardrobe.VR/mission.sqm @@ -89,6 +89,9 @@ class ScenarioData { author="Overlord Zorn"; }; +class CustomAttributes +{ +}; class Mission { class Intel diff --git a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp index 07abc3fea55..0c7ea554e95 100644 --- a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp @@ -15,8 +15,12 @@ class EGVAR(wardrobe,base_H_goggles_off); class CfgWeapons { // Base Classes + class H_Booniehat_khk; class vn_b_headgear_base; - class vn_o_headgear_base; + class vn_o_headgear_base: H_Booniehat_khk { + class ItemInfo; + }; + #include "Helmets.hpp" #include "Booniehats.hpp" @@ -27,4 +31,4 @@ class CfgWeapons { class CfgGlasses { #include "Facewear.hpp" -}; +}; \ No newline at end of file diff --git a/addons/compat_sog/compat_sog_wardrobe/Facewear.hpp b/addons/compat_sog/compat_sog_wardrobe/Facewear.hpp index 65435cbde80..a042b76cd65 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Facewear.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Facewear.hpp @@ -100,4 +100,5 @@ class vn_o_acc_goggles_03: vn_glasses_base { modifiableTo[] = { "vn_o_acc_km32_01", "vn_o_acc_goggles_02" }; components[] = { "vn_o_acc_km32_01", "vn_o_acc_goggles_02"}; }; -}; + mass = 4; +}; \ No newline at end of file diff --git a/addons/compat_sog/compat_sog_wardrobe/Helmets.hpp b/addons/compat_sog/compat_sog_wardrobe/Helmets.hpp index 9f1fb7b961a..f08c966fae7 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Helmets.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Helmets.hpp @@ -19,7 +19,10 @@ class CN02(side,var1,var2): base_class_dn {\ } -// Base classes in CfgWeapons.hpp +class vn_b_helmet_m1_01_01: vn_b_headgear_base { + class ItemInfo; +}; + // Parent Version aph6 & svh4 #define base_class_up vn_b_headgear_base @@ -67,11 +70,11 @@ class vn_o_helmet_zsh3_02: vn_o_helmet_zsh3_01 { }; // Helmets with/without Goggles -class vn_b_helmet_m1_01_01; class vn_b_helmet_m1_14_01: vn_b_helmet_m1_01_01 { class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { modifiableTo[] = { "vn_b_helmet_m1_20_01" }; }; + }; class vn_b_helmet_m1_14_02: vn_b_helmet_m1_14_01 { class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { @@ -84,12 +87,14 @@ class vn_b_helmet_m1_20_01 : vn_b_helmet_m1_14_01 { modifiableTo[] = { "vn_b_helmet_m1_14_01" }; components[] = {"vn_b_acc_goggles_01"}; }; + MASS(12); }; class vn_b_helmet_m1_20_02 : vn_b_helmet_m1_20_01 { class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { modifiableTo[] = { "vn_b_helmet_m1_14_02" }; components[] = {"vn_b_acc_goggles_01"}; }; + MASS(12); }; @@ -100,12 +105,13 @@ class vn_o_helmet_shl61_01: vn_o_headgear_base { modifiableTo[] = { "vn_o_helmet_shl61_02" }; components[] = {"vn_o_acc_goggles_02"}; }; + MASS(12); }; // Without Goggles class vn_o_helmet_shl61_02: vn_o_helmet_shl61_01 { class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { modifiableTo[] = { "vn_o_helmet_shl61_01" }; - }; + };MASS(10); }; @@ -114,12 +120,14 @@ class vn_b_helmet_t56_01_01: vn_b_headgear_base { class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { modifiableTo[] = { "vn_b_helmet_t56_02_01" }; }; + class ItemInfo; }; class vn_b_helmet_t56_02_01: vn_b_helmet_t56_01_01 { class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { modifiableTo[] = { "vn_b_helmet_t56_01_01" }; components[] = {"vn_b_acc_goggles_01"}; }; + MASS(12); }; class vn_b_helmet_t56_01_02: vn_b_helmet_t56_01_01 { @@ -132,6 +140,7 @@ class vn_b_helmet_t56_02_02: vn_b_helmet_t56_02_01 { modifiableTo[] = { "vn_b_helmet_t56_01_02" }; components[] = {"vn_b_acc_goggles_01"}; }; + MASS(12); }; class vn_b_helmet_t56_01_03: vn_b_helmet_t56_01_01 { @@ -144,6 +153,7 @@ class vn_b_helmet_t56_02_03: vn_b_helmet_t56_02_01 { modifiableTo[] = { "vn_b_helmet_t56_01_03" }; components[] = {"vn_b_acc_goggles_01"}; }; + MASS(12); }; @@ -166,10 +176,12 @@ class vn_o_helmet_nva_01: vn_o_headgear_base { class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { modifiableTo[] = { "vn_o_helmet_nva_05" }; }; + class ItemInfo; }; class vn_o_helmet_nva_05: vn_o_helmet_nva_01 { class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { modifiableTo[] = { "vn_o_helmet_nva_01" }; components[] = {"vn_o_acc_goggles_02"}; }; + MASS(12); }; diff --git a/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp b/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp index b7252fac4e5..d062edb7a53 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp @@ -1,8 +1,19 @@ // CfgWeapons -class vn_b_uniform_base; +class Uniform_Base; +class vn_b_uniform_base: Uniform_Base { + class ItemInfo; +}; + // Macros +#define ITEMINFO_FIX()\ +class ItemInfo: ItemInfo {\ + containerClass = "Supply70";\ + mass = 70;\ +} + + #define UNIFORM_BASE_B(class1,class2)\ class class1: vn_b_uniform_base {\ class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) {\ @@ -15,9 +26,24 @@ class class2: vn_b_uniform_base {\ };\ } +#define UNIFORM_BASE_B_ITEMINFO_FIX(class1,class2)\ +class class1: vn_b_uniform_base {\ + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) {\ + modifiableTo[] = { QUOTE(class2) };\ + };\ +};\ +class class2: vn_b_uniform_base {\ + class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) {\ + modifiableTo[] = { QUOTE(class1) };\ + };\ + ITEMINFO_FIX();\ +} + #define B_U(div,var,camo) vn_b_uniform_##div##_##var##_##camo #define B_U_PAIR(div,down,up,camo) UNIFORM_BASE_B(B_U(div,down,camo),B_U(div,up,camo)) +#define B_U_PAIR_FIX(div,down,up,camo) UNIFORM_BASE_B_ITEMINFO_FIX(B_U(div,down,camo),B_U(div,up,camo)) + // Simple Variants // ACZAC @@ -54,15 +80,15 @@ UNIFORM_BASE_B(vn_b_uniform_seal_01_07,vn_b_uniform_seal_02_07); // macv 05 and 04 have inconsistency between them -> different uniform maxLoad. This likely will cause the player to loose items when the uniform is filled to the brim. Difference is 1lb which translates to 16~17x ace bandages or 1x 1l blood #define B_U_PAIR_SET(camo)\ B_U_PAIR(macv,02,03,camo);\ -B_U_PAIR(macv,05,04,camo) +B_U_PAIR_FIX(macv,05,04,camo) +B_U_PAIR_SET(OLIVE_FIELD); B_U_PAIR_SET(TIGER); B_U_PAIR_SET(TIGER_GREEN); -B_U_PAIR_SET(ERDL); B_U_PAIR_SET(ERDL_BROWN); B_U_PAIR_SET(OLIVE); -B_U_PAIR_SET(OLIVE_FIELD); B_U_PAIR_SET(LEOPARD); +B_U_PAIR_SET(ERDL); B_U_PAIR_SET(LIZARD); B_U_PAIR_SET(BDQ); B_U_PAIR_SET(FROG); diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp deleted file mode 100644 index 592d502d4e3..00000000000 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/Uniforms.hpp +++ /dev/null @@ -1,102 +0,0 @@ -#define S_70(className)\ -class className: vn_b_uniform_base {\ - class ItemInfo: ItemInfo {\ - containerClass = "Supply70";\ - mass = 70;\ - };\ -} - -class CfgWeapons { - class Uniform_Base; - class vn_b_uniform_base: Uniform_Base { - class ItemInfo; - }; - - S_70(vn_b_uniform_macv_04_01); - S_70(vn_b_uniform_macv_04_02); - S_70(vn_b_uniform_macv_04_05); - S_70(vn_b_uniform_macv_04_06); - S_70(vn_b_uniform_macv_04_07); - S_70(vn_b_uniform_macv_04_08); - S_70(vn_b_uniform_macv_04_15); - S_70(vn_b_uniform_macv_04_16); - S_70(vn_b_uniform_macv_04_17); - S_70(vn_b_uniform_macv_04_18); - - - //// US Headgear - // Helmets with Combat Goggles - class vn_b_helmet_m1_01_01; - class vn_b_helmet_m1_14_01: vn_b_helmet_m1_01_01 { - class ItemInfo; - }; - - class vn_b_helmet_m1_20_01: vn_b_helmet_m1_14_01 { - MASS(12); - }; - class vn_b_helmet_m1_20_02: vn_b_helmet_m1_20_01 { - MASS(12); - }; - - - // Crew Helmets with Goggles - class vn_b_headgear_base; - class vn_b_helmet_t56_01_01: vn_b_headgear_base { - class ItemInfo; - }; - class vn_b_helmet_t56_02_01: vn_b_helmet_t56_01_01 { - MASS(12); - }; - - class vn_b_helmet_t56_02_02: vn_b_helmet_t56_02_01 { - MASS(12); - }; - - class vn_b_helmet_t56_02_03: vn_b_helmet_t56_02_01 { - MASS(12); - }; - - //// NVA Headgear - - - - // NVA Gear usually has the Goggles Version be the parent version of the non-goggle version, meaning we have to "reset" the children to their previous mass. - class H_Booniehat_khk; - class vn_o_headgear_base: H_Booniehat_khk { - class ItemInfo; - }; - // NVA Pilot Helmet with Goggles - class vn_o_helmet_shl61_01: vn_o_headgear_base { - MASS(12); - }; - class vn_o_helmet_shl61_02: vn_o_helmet_shl61_01 { - MASS(10); - }; - - // NVA Crew Helmet with Goggles - class vn_o_helmet_tsh3_01: vn_o_headgear_base { - MASS(12); - }; - class vn_o_helmet_tsh3_02: vn_o_helmet_tsh3_01 { - MASS(10); - }; - - - - // NVA Pith helmet with Crew Goggles - class vn_o_helmet_nva_01: vn_o_headgear_base { - class ItemInfo; - }; - class vn_o_helmet_nva_05: vn_o_helmet_nva_01 { - MASS(12); - }; -}; - - -class CfgGlasses { - // VN Pilot Goggles + Mask - class vn_glasses_base; - class vn_o_acc_goggles_03: vn_glasses_base { - mass = 4; - }; -}; diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp deleted file mode 100644 index fa521d4051d..00000000000 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/config.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "script_component.hpp" - -class CfgPatches { - class SUBADDON { - name = COMPONENT_NAME; - units[] = {}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = { - "ace_wardrobe", - "vn_data_f" - }; - skipWhenMissingDependencies = 1; - author = ECSTRING(common,ACETeam); - authors[] = {"OverlordZorn [CVO]"}; - url = ECSTRING(main,URL); - VERSION_CONFIG; - addonRootClass = QUOTE(ADDON); - }; -}; - -#include "Uniforms.hpp" diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md deleted file mode 100644 index 9eadffa1447..00000000000 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/readme.md +++ /dev/null @@ -1,10 +0,0 @@ -The uniforms addressed in this sub-addon are the "sleeves rolled up" version of their "sleeves rolled down" counterpart. -The problem is, that the rolled up version are both 1 lb (0.453 kg) lighter and can carry 1 lb less. - -If we would ignore this, the player would run into situations where they would lose items by simply rolling up their sleeves. -To counter this, I increased the maxLoad of those items by 1 lb to be aligned with their counterpart. - - -Addition: -This also adjusts helmets with combat goggles due to a weight discrepancy. - diff --git a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp b/addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp deleted file mode 100644 index 845da92a822..00000000000 --- a/addons/compat_sog/compat_sog_wardrobe_uniform_fix/script_component.hpp +++ /dev/null @@ -1,5 +0,0 @@ -#define SUBCOMPONENT wardrobe_uniform_fix -#define SUBCOMPONENT_BEAUTIFIED Wardrobe -#include "..\script_component.hpp" - -#include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp" \ No newline at end of file From 43df2542882a26a833b7e8d3c2754ecaa1eb7751 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Fri, 10 Jan 2025 19:49:56 +0100 Subject: [PATCH 127/305] Update addons/wardrobe/functions/fnc_replace_other.sqf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- addons/wardrobe/functions/fnc_replace_other.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_replace_other.sqf b/addons/wardrobe/functions/fnc_replace_other.sqf index 4d14fb3364b..92797622476 100644 --- a/addons/wardrobe/functions/fnc_replace_other.sqf +++ b/addons/wardrobe/functions/fnc_replace_other.sqf @@ -2,7 +2,7 @@ /* * Author: OverlordZorn - * Function to replace a persons goggles/facewear. + * Function to replace a person's goggles/facewear. * * Arguments: * 0: Unit From c72b8e66bf8949584d891098e362d2081d7b6c07 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Fri, 10 Jan 2025 19:50:09 +0100 Subject: [PATCH 128/305] Update docs/wiki/framework/wardrobe-framework.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- docs/wiki/framework/wardrobe-framework.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index 0ad7cd88932..99a6324bfeb 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -19,7 +19,7 @@ The Wardrobe Addon gives the player the opportunity to change/modify their curre For example, if a uniform has a normal variant and a "Rolled-Up Sleeves" variant, the player will be able to use ether an ACE Self Interaction or the CBA Context Menu in the Inventory. -Since there is no reliable, common pattern in terms of class inheritence, not even within the same DLC, each possbile variant has to be defined individually within the classes config properties. +Since there is no reliable, common pattern in terms of class inheritance, not even within the same DLC, each possible variant has to be defined individually within the classes' config properties. ### 1.1 Components From 3b99ac2ebe0f4099c27910c3aa720ba3ecba4d66 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Fri, 10 Jan 2025 19:50:19 +0100 Subject: [PATCH 129/305] Update docs/wiki/framework/wardrobe-framework.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- docs/wiki/framework/wardrobe-framework.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index 99a6324bfeb..0a73a5c579b 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -32,7 +32,7 @@ More examples can be found below. ### 1.2 Config Guidelines -- An Container (Uniform, Vest, Backpack) should never change its maxLoad, unless there is a really good reason for it. This will result in the loss of items. +- A Container (Uniform, Vest, Backpack) should never change its `maxLoad`, unless there is a really good reason for it. This will result in the loss of items. - Variants should never "magically" add/remove parts of themselves, unless its handled through a component. - There should not be a difference in weight between the different variants unless compoents get added/removed. - For Example: `Mass of Helmet with Goggles = Mass of Helmet + Mass of Goggles.` From e5cf7a3e260ad83d9948e11105d0f83c2711bc1c Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Fri, 10 Jan 2025 19:50:29 +0100 Subject: [PATCH 130/305] Update docs/wiki/framework/wardrobe-framework.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- docs/wiki/framework/wardrobe-framework.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index 0a73a5c579b..fc78ee29ddc 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -39,7 +39,7 @@ More examples can be found below. ## 2. Config -Only directly defined Subclasses will be taken into account. A fully inherited subclass will be ignored and will not provide any interaction. The ace_wardrobe properties are to be found as a subclass of the item itself. Multiple base configs are designed at root of `configFile`. +Only directly defined Subclasses will be taken into account. A fully inherited subclass will be ignored and will not provide any interaction. The `ace_wardrobe` properties are to be found as a subclass of the item itself. Multiple base configs are designed at root of `configFile`. ## 2.1 Properties From 15124abb24e4a683da1e23a6780ee2bf6b543a01 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Fri, 10 Jan 2025 19:50:40 +0100 Subject: [PATCH 131/305] Update docs/wiki/framework/wardrobe-framework.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- docs/wiki/framework/wardrobe-framework.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index fc78ee29ddc..d8a8af7033d 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -46,14 +46,14 @@ Only directly defined Subclasses will be taken into account. A fully inherited s | Class Property | Data Type | Description | | -------------- | ----------- | ----------- | -| modifiableTo[] | Array of Classnames | possible Variants this item can be turned into. | -| components[] | Array of Classnames | Components the current variant contains within itself | -| sound[] | Array of CfgSound Entries | to be chosen by random when the action is performed | -| sound_timing | Number 0..1 | defines the point time relative to the duration when the sound is played | -| gesture | String of Classname | Gesture to be played when the action is performed | -| alternativePicture | String of path to icon | to be used instead of target variant picture | -| alternativeDisplayName | String | Will be used instead of the target variants displayname | -| duration | Number in seconds | Duration of action. Items are being replaced at the end. | +| `modifiableTo[]` | Array of Classnames | possible Variants this item can be turned into. | +| `components[]` | Array of Classnames | Components the current variant contains within itself | +| `sound[]` | Array of CfgSound Entries | to be chosen by random when the action is performed | +| `sound_timing` | Number 0..1 | defines the point time relative to the duration when the sound is played | +| `gesture` | String of Classname | Gesture to be played when the action is performed | +| `alternativePicture` | String of path to icon | to be used instead of target variant picture | +| `alternativeDisplayName` | String | Will be used instead of the target variants displayname | +| `duration` | Number in seconds | Duration of action. Items are being replaced at the end. | ### 2.2 Base Classes From 821aa3d0312dfe5631c4ba98d492ab2f4d0137c2 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Fri, 10 Jan 2025 19:50:48 +0100 Subject: [PATCH 132/305] Update addons/wardrobe/functions/fnc_replace_container.sqf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- addons/wardrobe/functions/fnc_replace_container.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_replace_container.sqf b/addons/wardrobe/functions/fnc_replace_container.sqf index 797c3025ce9..baffd697ec0 100644 --- a/addons/wardrobe/functions/fnc_replace_container.sqf +++ b/addons/wardrobe/functions/fnc_replace_container.sqf @@ -33,7 +33,7 @@ INTEL_PRE(_hasNotepad,acex_intelitems_notepad); INTEL_PRE(_hasPhoto,acex_intelitems_photo); // ACE Overheating -private _hasSpareBarrel = _magazineDetails findIf { _x#0 == "ACE_SpareBarrel" } > -1; +private _hasSpareBarrel = _magazineDetails findIf { _x#0 isEqualTo "ACE_SpareBarrel" } > -1; if (_hasSpareBarrel) then { _hasSpareBarrel = [_player, "ACE_SpareBarrel" ] call CBA_fnc_getMagazineIndex }; From b96e06cc43f11195f13ae34858e9bba53e811904 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Fri, 10 Jan 2025 19:51:03 +0100 Subject: [PATCH 133/305] Update addons/wardrobe/functions/fnc_replace.sqf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- addons/wardrobe/functions/fnc_replace.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 5982d30236b..df489586bcf 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -10,7 +10,7 @@ * 2: Action Params * - 0: Current Variant * - 0: Desired Variant - * 3: Replace Now? + * 3: Replace Now? (default: false) * * Return Value: * None From 77cc0deaada1d526d658a5eb0cc2929690d338a6 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Fri, 10 Jan 2025 19:52:53 +0100 Subject: [PATCH 134/305] applying @rautamiekka magic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- addons/wardrobe/functions/fnc_getIndexFromMagID.sqf | 2 +- docs/wiki/framework/wardrobe-framework.md | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf index 16a1b6e8d6f..f70989ddd89 100644 --- a/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf +++ b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf @@ -8,7 +8,7 @@ * 0: magazine ID * * Return Value: - * The return value + * The return value * * Example: * [_magID] call ace_wardrobe_fnc_getIndexFromMagID diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index d8a8af7033d..55802769237 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -199,7 +199,7 @@ class CfgWeapons { // BASECLASS class H_Shemag_khk; - // WS Turban with Balistic Mask + // WS Turban with Ballistic Mask class H_turban_02_mask_black_lxws: H_Shemag_khk { class ace_wardrobe: ace_wardrobe_base { modifiableTo[] = { "lxWS_H_turban_01_black", "lxWS_H_turban_02_black", "lxWS_H_turban_03_black", "lxWS_H_turban_04_black" }; @@ -280,7 +280,7 @@ class CfgGlasses { ## 5. Sounds -The following CfgSounds classes are integrated in ace_wardrobe and are the default sounds for the `ace_wardrobe_base` and `ace_wardrobe_base_H_visor_up`/`ace_wardrobe_base_H_visor_down` base classes. +The following `CfgSounds` classes are integrated in `ace_wardrobe` and are the default sounds for the `ace_wardrobe_base` and `ace_wardrobe_base_H_visor_up`/`ace_wardrobe_base_H_visor_down` base classes. ### 5.1 Integrated Sounds @@ -295,6 +295,6 @@ The number at the end of the classnames indicates the length of the file in 1/10 - `ace_wardrobe_helmet_visor_05` ## 6. Compatibility -Currently, ace_IntelItems and ace_overheating (spare barrels) are being directly supported. +Currently, `ace_IntelItems` and `ace_overheating` (spare barrels) are being directly supported. -If an addon or mod utilizes a magazines magazineID to handle additional data about an items carried by the player, then the process of modifying a wearable container (uniform, vest, backpack) to another variant will result in new magazineIDs for all magazines on the player. +If an addon or mod utilizes a magazine's `magazineID` to handle additional data about items carried by the player, then the process of modifying a wearable container (uniform, vest, backpack) to another variant will result in new `magazineID`s for all magazines on the player. From a998f8ef43027186aa7a102204066346f307f11b Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Fri, 10 Jan 2025 19:53:16 +0100 Subject: [PATCH 135/305] Update addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf b/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf index 38258a85c91..82809a400e0 100644 --- a/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf +++ b/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf @@ -5,7 +5,7 @@ * Debug - Function to retrieve all existing Wardrobe items. * * Arguments: - * 0: Return as Config? + * 0: Return as Config? (default: false) * * Return Value: * Array Wardobe Items, ether as Classname or as Config From 3a15926f307dfa5727c30e13aa9a5be3b05e7541 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Fri, 10 Jan 2025 19:55:11 +0100 Subject: [PATCH 136/305] more rautamiekka magic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- docs/wiki/framework/wardrobe-framework.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index 55802769237..b5c5296a38c 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -158,11 +158,11 @@ class ace_wardrobe_base_H_goggles_off: ace_wardrobe_base { ### 3.1 Linear Example -- first, we import the wardrobe base classes `ace_wardrobe_base_U_sleeves_down` and `ace_wardrobe_base_U_sleeves_up` at the root of `configFile`. -- The uniform we would like to configure is part of CfgWeapons and inherits from `Uniform_Base`. -- Then we edit the desired classes and create the `ace_wardrobe` subclass by inheriting from the partent base classes. +- First, we import the wardrobe base classes `ace_wardrobe_base_U_sleeves_down` and `ace_wardrobe_base_U_sleeves_up` at the root of `configFile`. +- The uniform we would like to configure is part of `CfgWeapons` and inherits from `Uniform_Base`. +- Then we edit the desired classes and create the `ace_wardrobe` subclass by inheriting from the parent base classes. - Afterwards, we define which variants this class can be modified to. -- This Example does not require the use of components since we're not adding or removing anything. +- This example does not require the use of components since we're not adding or removing anything. ```cpp // config.cpp class ace_wardrobe_base_U_sleeves_down; @@ -188,7 +188,7 @@ class CfgWeapons { }; }; ``` -### 3.2 Complex Example with partial use of components +### 3.2 Complex example with partial use of components ```cpp From 02a963c5334a1857ffd79b45968ed9060a7facb7 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 10 Jan 2025 20:00:43 +0100 Subject: [PATCH 137/305] rephrase comment --- docs/wiki/framework/wardrobe-framework.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index b5c5296a38c..7a7033f8e5e 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -210,28 +210,28 @@ class CfgWeapons { class lxWS_H_turban_01_black: H_Shemag_khk { class ace_wardrobe: ace_wardrobe_base { modifiableTo[] = { "lxWS_H_turban_02_black", "lxWS_H_turban_03_black", "lxWS_H_turban_04_black", "H_turban_02_mask_black_lxws" }; - components[] = { }; // not required to be defined since it empty array get inherited from the base parent. + components[] = { }; // not needed when empty - only shown as an examlpe for how/when to use components }; }; // WS Turban Variant 2 class lxWS_H_turban_02_black: lxWS_H_turban_01_black { class ace_wardrobe: ace_wardrobe_base { modifiableTo[] = { "lxWS_H_turban_01_black", "lxWS_H_turban_03_black", "lxWS_H_turban_04_black", "H_turban_02_mask_black_lxws" }; - components[] = { }; // not required to be defined since it empty array get inherited from the base parent. + components[] = { }; // not needed when empty - only shown as an examlpe for how/when to use components }; }; // WS Turban Variant 3 class lxWS_H_turban_03_black: lxWS_H_turban_01_black { class ace_wardrobe: ace_wardrobe_base { modifiableTo[] = { "lxWS_H_turban_01_black", "lxWS_H_turban_02_black", "lxWS_H_turban_04_black", "H_turban_02_mask_black_lxws" }; - components[] = { }; // not required to be defined since it empty array get inherited from the base parent. + components[] = { }; // not needed when empty - only shown as an examlpe for how/when to use components }; }; // WS Turban Variant 4 class lxWS_H_turban_04_black: lxWS_H_turban_01_black { class ace_wardrobe: ace_wardrobe_base { modifiableTo[] = { "lxWS_H_turban_01_black", "lxWS_H_turban_02_black", "lxWS_H_turban_03_black", "H_turban_02_mask_black_lxws" }; - components[] = { }; // not required to be defined since it empty array get inherited from the base parent. + components[] = { }; // not needed when empty - only shown as an examlpe for how/when to use components }; }; }; From 467c301fbefc2c0f7d929cde5c3cd7a190a10873 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Mon, 13 Jan 2025 20:34:58 +0100 Subject: [PATCH 138/305] Update docs/wiki/framework/wardrobe-framework.md Co-authored-by: Mike-MF --- docs/wiki/framework/wardrobe-framework.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index 7a7033f8e5e..4de00fa805c 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -210,7 +210,7 @@ class CfgWeapons { class lxWS_H_turban_01_black: H_Shemag_khk { class ace_wardrobe: ace_wardrobe_base { modifiableTo[] = { "lxWS_H_turban_02_black", "lxWS_H_turban_03_black", "lxWS_H_turban_04_black", "H_turban_02_mask_black_lxws" }; - components[] = { }; // not needed when empty - only shown as an examlpe for how/when to use components + components[] = { }; // not needed when empty - only shown as an example for how/when to use components }; }; // WS Turban Variant 2 From a763e2f74bb13045cd21752d30e8e6f74b1eeee6 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Mon, 13 Jan 2025 20:35:05 +0100 Subject: [PATCH 139/305] Update docs/wiki/framework/wardrobe-framework.md Co-authored-by: Mike-MF --- docs/wiki/framework/wardrobe-framework.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index 4de00fa805c..11e82e30865 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -231,7 +231,7 @@ class CfgWeapons { class lxWS_H_turban_04_black: lxWS_H_turban_01_black { class ace_wardrobe: ace_wardrobe_base { modifiableTo[] = { "lxWS_H_turban_01_black", "lxWS_H_turban_02_black", "lxWS_H_turban_03_black", "H_turban_02_mask_black_lxws" }; - components[] = { }; // not needed when empty - only shown as an examlpe for how/when to use components + components[] = { }; // not needed when empty - only shown as an example for how/when to use components }; }; }; From 1105045916981ea5ad294ead3cc0292e1dd7b4dd Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Mon, 13 Jan 2025 20:35:14 +0100 Subject: [PATCH 140/305] Update docs/wiki/framework/wardrobe-framework.md Co-authored-by: Mike-MF --- docs/wiki/framework/wardrobe-framework.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index 11e82e30865..e4a05b98239 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -224,7 +224,7 @@ class CfgWeapons { class lxWS_H_turban_03_black: lxWS_H_turban_01_black { class ace_wardrobe: ace_wardrobe_base { modifiableTo[] = { "lxWS_H_turban_01_black", "lxWS_H_turban_02_black", "lxWS_H_turban_04_black", "H_turban_02_mask_black_lxws" }; - components[] = { }; // not needed when empty - only shown as an examlpe for how/when to use components + components[] = { }; // not needed when empty - only shown as an example for how/when to use components }; }; // WS Turban Variant 4 From 0549fce262afc829e6b5828411a3c8ac9f32eeb1 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Mon, 13 Jan 2025 20:35:21 +0100 Subject: [PATCH 141/305] Update docs/wiki/framework/wardrobe-framework.md Co-authored-by: Mike-MF --- docs/wiki/framework/wardrobe-framework.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index e4a05b98239..fda3f4ff1a7 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -217,7 +217,7 @@ class CfgWeapons { class lxWS_H_turban_02_black: lxWS_H_turban_01_black { class ace_wardrobe: ace_wardrobe_base { modifiableTo[] = { "lxWS_H_turban_01_black", "lxWS_H_turban_03_black", "lxWS_H_turban_04_black", "H_turban_02_mask_black_lxws" }; - components[] = { }; // not needed when empty - only shown as an examlpe for how/when to use components + components[] = { }; // not needed when empty - only shown as an example for how/when to use components }; }; // WS Turban Variant 3 From 01bc4da9242f904bc3533abd9a42538afa012ace Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 25 Mar 2025 23:39:20 +0100 Subject: [PATCH 142/305] renamed licence file --- addons/wardrobe/data/{attribution.md => LICENCE.md} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename addons/wardrobe/data/{attribution.md => LICENCE.md} (71%) diff --git a/addons/wardrobe/data/attribution.md b/addons/wardrobe/data/LICENCE.md similarity index 71% rename from addons/wardrobe/data/attribution.md rename to addons/wardrobe/data/LICENCE.md index 417747726ff..4dba9467e72 100644 --- a/addons/wardrobe/data/attribution.md +++ b/addons/wardrobe/data/LICENCE.md @@ -7,7 +7,7 @@ License: Creative Commons 0 helmet_visor_05 Click of a Motorcycle Helmet Visor - by rylandbrooks - https://freesound.org/s/328103/ - License: Creative Commons 0 +by rylandbrooks +https://freesound.org/s/328103/ +License: Creative Commons 0 \ No newline at end of file From 636e091c394ee130797d4fc47b24462835f7d610 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 27 Apr 2025 15:30:29 +0200 Subject: [PATCH 143/305] use cba fnc instead of own event --- addons/wardrobe/XEH_postInit.sqf | 14 -------------- addons/wardrobe/functions/fnc_replace.sqf | 4 ++-- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/addons/wardrobe/XEH_postInit.sqf b/addons/wardrobe/XEH_postInit.sqf index cece4f6f968..02b8be0674c 100644 --- a/addons/wardrobe/XEH_postInit.sqf +++ b/addons/wardrobe/XEH_postInit.sqf @@ -2,17 +2,3 @@ [ QGVAR(EH_updateMagIDs), FUNC(spareBarrel_updateMagIDs) ] call CBA_fnc_addEventHandler; -[ - QGVAR(EH_say3d), - { - params [["_source", objNull, [objNull]],["_sound",[""],["", []]]]; - if (_sound isEqualType [] && {_sound#0 == ""} || {_sound isEqualType "" && {_sound == ""}}) exitWith {}; - _sound params [ - "_className", - ["_distance", 50, [0]], - ["_pitch", 0.95 + random 0.1, [0]] - ]; - _source say3D [_className, _distance, _pitch]; - nil - } -] call CBA_fnc_addEventHandler; diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index df489586bcf..813a855561a 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -81,8 +81,8 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 private _sound = [_cfg_tgt >> QADDON >> "sound"] call FUNC(getCfgDataRandom); if (_sound != "") then { [ - CBA_fnc_globalEvent, - [QGVAR(EH_say3d), [_unit,_sound]], + CBA_fnc_globalSay3D, + [_unit, "_sound", nil, true, true], (getNumber (_cfg_tgt>> QADDON >> "sound_timing") max 0 min 1) * _duration ] call CBA_fnc_waitAndExecute; }; From fe80be0df3a84d524dcebf0b3c982c158a3fba33 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 27 Apr 2025 17:32:21 +0200 Subject: [PATCH 144/305] removed unneeded macros --- .../functions/fnc_addActions_condition.sqf | 2 +- addons/wardrobe/functions/fnc_getAction_Icon.sqf | 2 +- addons/wardrobe/functions/fnc_getAction_Name.sqf | 2 +- .../functions/fnc_getItems_modifiableTo.sqf | 2 +- addons/wardrobe/functions/fnc_isModifiable.sqf | 2 +- addons/wardrobe/functions/fnc_replace.sqf | 8 ++++---- addons/wardrobe/initSettings.inc.sqf | 4 ++-- addons/wardrobe/script_macros_wardrobe.hpp | 16 ---------------- 8 files changed, 11 insertions(+), 27 deletions(-) diff --git a/addons/wardrobe/functions/fnc_addActions_condition.sqf b/addons/wardrobe/functions/fnc_addActions_condition.sqf index d4561680cba..dc8cb11d91e 100644 --- a/addons/wardrobe/functions/fnc_addActions_condition.sqf +++ b/addons/wardrobe/functions/fnc_addActions_condition.sqf @@ -18,7 +18,7 @@ params ["_player"]; -missionNamespace getVariable [QSET(enable_action), false] +missionNamespace getVariable [QGVAR(set_enable_action), false] && { count ([_player] call FUNC(getItems_modifiable_current)) > 0 diff --git a/addons/wardrobe/functions/fnc_getAction_Icon.sqf b/addons/wardrobe/functions/fnc_getAction_Icon.sqf index 8cda6ab602a..94a7a81eaa1 100644 --- a/addons/wardrobe/functions/fnc_getAction_Icon.sqf +++ b/addons/wardrobe/functions/fnc_getAction_Icon.sqf @@ -20,5 +20,5 @@ params [ ["_cfg", configNull, [configNull] ] ]; if (isNull _cfg) exitWith {}; -private _altDispIcon = getText (_cfg >> QADDON >> "alternativePicture"); +private _altDispIcon = getText (_cfg >> QUOTE(ADDON) >> "alternativePicture"); if (_altDispIcon isEqualTo "") then { getText (_cfg >> "picture") } else { _altDispIcon } diff --git a/addons/wardrobe/functions/fnc_getAction_Name.sqf b/addons/wardrobe/functions/fnc_getAction_Name.sqf index 679d39ee4b8..0c51dcf67d5 100644 --- a/addons/wardrobe/functions/fnc_getAction_Name.sqf +++ b/addons/wardrobe/functions/fnc_getAction_Name.sqf @@ -18,5 +18,5 @@ params [ ["_cfg", configNull, [configNull] ] ]; -private _altDispName = getText (_cfg >> QADDON >> "alternativeDisplayName"); +private _altDispName = getText (_cfg >> QUOTE(ADDON) >> "alternativeDisplayName"); if (_altDispName isEqualTo "") then { getText (_cfg >> "displayName") } else { _altDispName }; diff --git a/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf b/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf index bbfef931543..bc2e34e9cc9 100644 --- a/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf +++ b/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf @@ -18,4 +18,4 @@ params ["_cfg_current"]; -[_cfg_current >> QADDON >> "modifiableTo"] call BIS_fnc_getCfgDataArray apply { [_x] call CBA_fnc_getItemConfig } select { !isNull _x } +[_cfg_current >> QUOTE(ADDON) >> "modifiableTo"] call BIS_fnc_getCfgDataArray apply { [_x] call CBA_fnc_getItemConfig } select { !isNull _x } diff --git a/addons/wardrobe/functions/fnc_isModifiable.sqf b/addons/wardrobe/functions/fnc_isModifiable.sqf index 9ca0fd3f256..55b888ac39a 100644 --- a/addons/wardrobe/functions/fnc_isModifiable.sqf +++ b/addons/wardrobe/functions/fnc_isModifiable.sqf @@ -24,4 +24,4 @@ params [ if (isNull _cfg) exitWith {false}; // Checks if the config has the property without it being inherited(!) -count ( QUOTE(configName _x isEqualTo QQ(ace_wardrobe)) configClasses _cfg ) > 0 +count ( QUOTE(configName _x isEqualTo QUOTE(QUOTE(ace_wardrobe))) configClasses _cfg ) > 0 diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 813a855561a..d64cb6e51c1 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -25,7 +25,7 @@ params ["_target", "_unit", "_actionParams", ["_replaceNow", false, [true]]]; _actionParams params ["_cfg_origin", "_cfg_tgt"]; // Duration of the "animation" -private _duration = getNumber (_cfg_tgt>> QADDON >> "duration"); +private _duration = getNumber (_cfg_tgt>> QUOTE(ADDON) >> "duration"); if (_replaceNow) then { _duration = 0; }; // Replace the Main Item. @@ -75,15 +75,15 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 //// Handle Effects // Animation/Gestures -[ _unit, getText (_cfg_tgt >> QADDON >> "gesture") ] call ace_common_fnc_doGesture; +[ _unit, getText (_cfg_tgt >> QUOTE(ADDON) >> "gesture") ] call ace_common_fnc_doGesture; // Plays Random Sound At the Beginning -private _sound = [_cfg_tgt >> QADDON >> "sound"] call FUNC(getCfgDataRandom); +private _sound = [_cfg_tgt >> QUOTE(ADDON) >> "sound"] call FUNC(getCfgDataRandom); if (_sound != "") then { [ CBA_fnc_globalSay3D, [_unit, "_sound", nil, true, true], - (getNumber (_cfg_tgt>> QADDON >> "sound_timing") max 0 min 1) * _duration + (getNumber (_cfg_tgt>> QUOTE(ADDON) >> "sound_timing") max 0 min 1) * _duration ] call CBA_fnc_waitAndExecute; }; diff --git a/addons/wardrobe/initSettings.inc.sqf b/addons/wardrobe/initSettings.inc.sqf index d22a804bebc..0468ab8b88b 100644 --- a/addons/wardrobe/initSettings.inc.sqf +++ b/addons/wardrobe/initSettings.inc.sqf @@ -1,5 +1,5 @@ [ - QSET(enable_action), + QGVAR(set_enable_action), "CHECKBOX", LSTRING(enable_action), [LSTRING(set_cat_main)], @@ -10,7 +10,7 @@ ] call CBA_fnc_addSetting; [ - QSET(enable_contextMenu), + QGVAR(set_enable_contextMenu), "CHECKBOX", LSTRING(enable_contextMenu), [LSTRING(set_cat_main)], diff --git a/addons/wardrobe/script_macros_wardrobe.hpp b/addons/wardrobe/script_macros_wardrobe.hpp index d145ef346d9..c97c9bac544 100644 --- a/addons/wardrobe/script_macros_wardrobe.hpp +++ b/addons/wardrobe/script_macros_wardrobe.hpp @@ -1,19 +1,3 @@ -// CBA Settings -#define SET(var1) TRIPLES(ADDON,set,var1) -#define QSET(var1) QUOTE(SET(var1)) -#define QQSET(var1) QQ(SET(var1)) -#define ESET(var1,var2) TRIPLES(DOUBLES(PREFIX,var1),SET,var2) -#define QESET(var1,var2) QUOTE(ESET(var1,var2)) -#define QQESET(var1,var2) QQ(ESET(var1,var2)) - -// LSTRING for cba Settings -#define SETLSTRING(key) [LSTRING(DOUBLES(set,key)),LSTRING(TRIPLES(set,key,desc))] - -// QOL -#define QQ(var1) QUOTE(QUOTE(var1)) -#define QADDON QUOTE(ADDON) - - // REPLACE #define INTEL_PRE(varName,className)\ private varName = _magazineDetails findIf { _x select 0 == QUOTE(className) } > -1;\ From d39ace29cd5f496d06b0b1f300fdc0b15ed905fd Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 27 Apr 2025 18:09:17 +0200 Subject: [PATCH 145/305] fix stringtable keys --- addons/wardrobe/stringtable.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml index 98c59311ddc..05a5c92f2a9 100644 --- a/addons/wardrobe/stringtable.xml +++ b/addons/wardrobe/stringtable.xml @@ -8,11 +8,11 @@ - + ACE Interaction Aktivieren ACE Interaction - + CBA Context Menu Aktiviere CBA Context Menu From 79b71cfe2b8ed492f527aa348170ca9b0ae232c9 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 27 Apr 2025 18:27:10 +0200 Subject: [PATCH 146/305] .ogg: \data\ -> data\sounds\ + License/Author --- AUTHORS.txt | 2 ++ LICENSE | 2 ++ addons/wardrobe/CfgSounds.hpp | 2 +- addons/wardrobe/data/LICENCE.md | 14 ++++++-------- addons/wardrobe/data/{ => sounds}/fabric_06.ogg | Bin addons/wardrobe/data/{ => sounds}/fabric_07.ogg | Bin addons/wardrobe/data/{ => sounds}/fabric_16.ogg | Bin addons/wardrobe/data/{ => sounds}/fabric_20.ogg | Bin addons/wardrobe/data/{ => sounds}/fabric_25.ogg | Bin .../data/{ => sounds}/helmet_visor_05.ogg | Bin 10 files changed, 11 insertions(+), 9 deletions(-) rename addons/wardrobe/data/{ => sounds}/fabric_06.ogg (100%) rename addons/wardrobe/data/{ => sounds}/fabric_07.ogg (100%) rename addons/wardrobe/data/{ => sounds}/fabric_16.ogg (100%) rename addons/wardrobe/data/{ => sounds}/fabric_20.ogg (100%) rename addons/wardrobe/data/{ => sounds}/fabric_25.ogg (100%) rename addons/wardrobe/data/{ => sounds}/helmet_visor_05.ogg (100%) diff --git a/AUTHORS.txt b/AUTHORS.txt index 7b29ce58159..2a75be5e584 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -120,6 +120,7 @@ Hawkins Head Hybrid V Hypoxic +IENBA JasperRab JDT john681611 @@ -166,6 +167,7 @@ RcINS Riccardo Petricca Robert Boklahánics ruPaladin +rylandbrooks Rutger "RedBery" Meijering sancron Schwaggot diff --git a/LICENSE b/LICENSE index f748d222de4..fb490b63d1e 100644 --- a/LICENSE +++ b/LICENSE @@ -29,6 +29,8 @@ to that license instead. - ARMA PUBLIC LICENSE (\addons\apl) - CreativeCommons Attributions 3.0 (\addons\fastroping\data\sounds) + - CreativeCommons Zero 1.0 Universal (\addons\wardrobe\data\sounds) + ============================================================================ Full GNU General Public License Text ============================================================================ diff --git a/addons/wardrobe/CfgSounds.hpp b/addons/wardrobe/CfgSounds.hpp index 8fd5d3b4ed7..50be94518f1 100644 --- a/addons/wardrobe/CfgSounds.hpp +++ b/addons/wardrobe/CfgSounds.hpp @@ -2,7 +2,7 @@ #define ENTRY(base,dur)\ class GVAR(DOUBLES(base,dur)) {\ name = QUOTE(base dur);\ - sound[] = { QPATHTOF(data\DOUBLES(base,dur)##.ogg), 1, 1, 100 };\ + sound[] = { QPATHTOF(data\sounds\DOUBLES(base,dur)##.ogg), 1, 1, 100 };\ titles[] = { 0, "" };\ forceTitles = 0;\ titlesStructured = 0;\ diff --git a/addons/wardrobe/data/LICENCE.md b/addons/wardrobe/data/LICENCE.md index 4dba9467e72..dda75028571 100644 --- a/addons/wardrobe/data/LICENCE.md +++ b/addons/wardrobe/data/LICENCE.md @@ -1,13 +1,11 @@ -fabric_06, fabric_07, fabric_16, fabric_20, fabric_25 -Nylon Jacket or Raincoat +## Nylon Jacket or Raincoat by IENBA https://freesound.org/s/658410/ -License: Creative Commons 0 +License: [Creative Commons 0](https://creativecommons.org/publicdomain/zero/1.0/) +Files: `fabric_06.ogg`, `fabric_07.ogg`, `fabric_16.ogg`, `fabric_20.ogg`, `fabric_25.ogg` -helmet_visor_05 - -Click of a Motorcycle Helmet Visor +## Click of a Motorcycle Helmet Visor by rylandbrooks https://freesound.org/s/328103/ -License: Creative Commons 0 - \ No newline at end of file +License: [Creative Commons 0](https://creativecommons.org/publicdomain/zero/1.0/) +Files: `helmet_visor_05.ogg`e \ No newline at end of file diff --git a/addons/wardrobe/data/fabric_06.ogg b/addons/wardrobe/data/sounds/fabric_06.ogg similarity index 100% rename from addons/wardrobe/data/fabric_06.ogg rename to addons/wardrobe/data/sounds/fabric_06.ogg diff --git a/addons/wardrobe/data/fabric_07.ogg b/addons/wardrobe/data/sounds/fabric_07.ogg similarity index 100% rename from addons/wardrobe/data/fabric_07.ogg rename to addons/wardrobe/data/sounds/fabric_07.ogg diff --git a/addons/wardrobe/data/fabric_16.ogg b/addons/wardrobe/data/sounds/fabric_16.ogg similarity index 100% rename from addons/wardrobe/data/fabric_16.ogg rename to addons/wardrobe/data/sounds/fabric_16.ogg diff --git a/addons/wardrobe/data/fabric_20.ogg b/addons/wardrobe/data/sounds/fabric_20.ogg similarity index 100% rename from addons/wardrobe/data/fabric_20.ogg rename to addons/wardrobe/data/sounds/fabric_20.ogg diff --git a/addons/wardrobe/data/fabric_25.ogg b/addons/wardrobe/data/sounds/fabric_25.ogg similarity index 100% rename from addons/wardrobe/data/fabric_25.ogg rename to addons/wardrobe/data/sounds/fabric_25.ogg diff --git a/addons/wardrobe/data/helmet_visor_05.ogg b/addons/wardrobe/data/sounds/helmet_visor_05.ogg similarity index 100% rename from addons/wardrobe/data/helmet_visor_05.ogg rename to addons/wardrobe/data/sounds/helmet_visor_05.ogg From 7b29d9a7b542e2b7f8a0d3931c5bd12e56c9f246 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 27 Apr 2025 19:36:44 +0200 Subject: [PATCH 147/305] fix string -> locVar --- addons/wardrobe/functions/fnc_replace.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index d64cb6e51c1..f24cd53e7f9 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -82,7 +82,7 @@ private _sound = [_cfg_tgt >> QUOTE(ADDON) >> "sound"] call FUNC(getCfgDataRando if (_sound != "") then { [ CBA_fnc_globalSay3D, - [_unit, "_sound", nil, true, true], + [_unit, _sound, nil, true, true], (getNumber (_cfg_tgt>> QUOTE(ADDON) >> "sound_timing") max 0 min 1) * _duration ] call CBA_fnc_waitAndExecute; }; From ff35d604939fe9b9456262fc98669534800fc705 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 27 Apr 2025 19:44:02 +0200 Subject: [PATCH 148/305] str_ace_w -> STR_ACE_W --- addons/wardrobe/stringtable.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml index 05a5c92f2a9..38a2e1ad8fa 100644 --- a/addons/wardrobe/stringtable.xml +++ b/addons/wardrobe/stringtable.xml @@ -8,11 +8,11 @@ - + ACE Interaction Aktivieren ACE Interaction - + CBA Context Menu Aktiviere CBA Context Menu From 289b21db4469eed2813dfde9a5fd7a7c650275a3 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 28 Apr 2025 15:17:04 +0200 Subject: [PATCH 149/305] _hasDocument -> varName --- addons/wardrobe/script_macros_wardrobe.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/script_macros_wardrobe.hpp b/addons/wardrobe/script_macros_wardrobe.hpp index c97c9bac544..1be30f4fd38 100644 --- a/addons/wardrobe/script_macros_wardrobe.hpp +++ b/addons/wardrobe/script_macros_wardrobe.hpp @@ -1,7 +1,7 @@ // REPLACE #define INTEL_PRE(varName,className)\ private varName = _magazineDetails findIf { _x select 0 == QUOTE(className) } > -1;\ -if (varName) then { _hasDocument = [_player, QUOTE(className)] call CBA_fnc_getMagazineIndex apply { [_x] call FUNC(getIndexFromMagID) } } +if (varName) then { varName = [_player, QUOTE(className)] call CBA_fnc_getMagazineIndex apply { [_x] call FUNC(getIndexFromMagID) } } #define INTEL_POST(varName,className)\ if (varName isEqualType []) then { { [_x, varName select _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, QUOTE(className)] call CBA_fnc_getMagazineIndex ); } From 936ec8354d5bd9dedcad1e76cd982a3ff27178f2 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 28 Apr 2025 16:21:47 +0200 Subject: [PATCH 150/305] added comment --- addons/wardrobe/functions/fnc_replace.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index f24cd53e7f9..59b8d6f72d5 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -89,7 +89,7 @@ if (_sound != "") then { // Notification private _notify_img = getText (_cfg_tgt >> "picture"); -if !(".paa" in _notify_img) then { _notify_img = [_notify_img,"paa"] joinString "." }; +if !(".paa" in _notify_img) then { _notify_img = [_notify_img,"paa"] joinString "." }; // Some vanilla items dont have the .paa and cba notify will display the path as a string without the .paa [ CBA_fnc_notify, [[ _notify_img, 4], [getText (_cfg_tgt >> "displayName")], true ], _duration * 1.2 ] call CBA_fnc_waitAndExecute; nil From b296338a5fffcfcb0f9284db4b6c884ea164015f Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 28 Apr 2025 16:22:26 +0200 Subject: [PATCH 151/305] cba notify -> ace displayTextStructured --- addons/wardrobe/functions/fnc_do_nextVariant.sqf | 11 ++++++----- addons/wardrobe/stringtable.xml | 7 +++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/addons/wardrobe/functions/fnc_do_nextVariant.sqf b/addons/wardrobe/functions/fnc_do_nextVariant.sqf index dd7ab23312d..bdac5f1d736 100644 --- a/addons/wardrobe/functions/fnc_do_nextVariant.sqf +++ b/addons/wardrobe/functions/fnc_do_nextVariant.sqf @@ -32,11 +32,12 @@ private _canModifyTo = [_unit, _current_cfg, _cfg_tgt, false] call FUNC(canModif if !(_canModifyTo) exitWith { [ - [LLSTRING(cannotSwitchTo)], - [getText (_cfg_tgt >> "displayName")], - [LLSTRING(missingComponents)], - true - ] call CBA_fnc_notify; + [ + LLSTRING(missingComponents), + getText (_cfg_tgt >> "displayName") + ], + 2.5 + ] call EFUNC(common,displayTextStructured); }; [_unit, _unit, [_current_cfg, _cfg_tgt], true] call FUNC(replace); diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml index 38a2e1ad8fa..03692a0910c 100644 --- a/addons/wardrobe/stringtable.xml +++ b/addons/wardrobe/stringtable.xml @@ -60,12 +60,11 @@ - - Cannot switch to - - due to missing components + Cannot switch to<br/>%1<br/>due to missing components + + From 8ccff70383e36b39145e1293a2c237dd2893fbb3 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 28 Apr 2025 16:43:03 +0200 Subject: [PATCH 152/305] empty lines --- addons/wardrobe/stringtable.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml index 03692a0910c..5037eb9fd43 100644 --- a/addons/wardrobe/stringtable.xml +++ b/addons/wardrobe/stringtable.xml @@ -66,5 +66,3 @@ - - From acfe28e763a30bf8de00e8d5597cc2cb616d0d99 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 2 May 2025 05:28:12 +0200 Subject: [PATCH 153/305] config rework - core features done --- .hemtt/launch.toml | 2 +- .hemtt/missions/Wardrobe.VR/mission.sqm | 3 -- .../{Baseclass.hpp => BaseClasses.hpp} | 5 +- addons/wardrobe/CfgSounds.hpp | 2 +- addons/wardrobe/CfgWardrobe.hpp | 34 ++++++++++++-- addons/wardrobe/Uniforms.hpp | 29 +++--------- addons/wardrobe/XEH_PREP.hpp | 8 ++-- addons/wardrobe/config.cpp | 2 - .../functions/fnc_addActions_children.sqf | 4 +- ...ction_Icon.sqf => fnc_addActions_icon.sqf} | 3 +- ...ction_Name.sqf => fnc_addActions_name.sqf} | 2 +- .../fnc_clearOnClosed_InteractionMenu.sqf | 2 +- .../functions/fnc_compare_components.sqf | 4 +- .../fnc_compare_container_maxLoad.sqf | 44 +++++++++++++++--- .../functions/fnc_enable_contextMenu.sqf | 2 +- .../functions/fnc_getItems_modifiableTo.sqf | 5 ++ .../wardrobe/functions/fnc_isModifiable.sqf | 8 +++- ...nextVariant.sqf => fnc_nextVariant_do.sqf} | 4 +- ...extVariant.sqf => fnc_nextVariant_get.sqf} | 2 +- addons/wardrobe/functions/fnc_replace.sqf | 10 ++-- addons/wardrobe/script_macros_wardrobe.hpp | 46 +++++++++++++++++++ 21 files changed, 158 insertions(+), 63 deletions(-) rename addons/wardrobe/{Baseclass.hpp => BaseClasses.hpp} (96%) rename addons/wardrobe/functions/{fnc_getAction_Icon.sqf => fnc_addActions_icon.sqf} (84%) rename addons/wardrobe/functions/{fnc_getAction_Name.sqf => fnc_addActions_name.sqf} (83%) rename addons/wardrobe/functions/{fnc_do_nextVariant.sqf => fnc_nextVariant_do.sqf} (91%) rename addons/wardrobe/functions/{fnc_getNextVariant.sqf => fnc_nextVariant_get.sqf} (96%) diff --git a/.hemtt/launch.toml b/.hemtt/launch.toml index c188b8478f9..e1f85042c36 100644 --- a/.hemtt/launch.toml +++ b/.hemtt/launch.toml @@ -61,6 +61,6 @@ mission = "Wardrobe.VR" dlc = [ # "Western Sahara", # "Reaction Forces", - "S.O.G. Prairie Fire", +# "S.O.G. Prairie Fire", # "gm" ] \ No newline at end of file diff --git a/.hemtt/missions/Wardrobe.VR/mission.sqm b/.hemtt/missions/Wardrobe.VR/mission.sqm index d3ab289f354..1010aff970d 100644 --- a/.hemtt/missions/Wardrobe.VR/mission.sqm +++ b/.hemtt/missions/Wardrobe.VR/mission.sqm @@ -89,9 +89,6 @@ class ScenarioData { author="Overlord Zorn"; }; -class CustomAttributes -{ -}; class Mission { class Intel diff --git a/addons/wardrobe/Baseclass.hpp b/addons/wardrobe/BaseClasses.hpp similarity index 96% rename from addons/wardrobe/Baseclass.hpp rename to addons/wardrobe/BaseClasses.hpp index 0ba855dd7f4..5656285ac77 100644 --- a/addons/wardrobe/Baseclass.hpp +++ b/addons/wardrobe/BaseClasses.hpp @@ -2,7 +2,10 @@ class GVAR(base) { - modifiableTo[] = {""}; + // modifiableTo[] = {""}; // Old version + + class modifiableTo { + }; // describes the components of the current item. // When the current wearable is being changed into something, that does not have these diff --git a/addons/wardrobe/CfgSounds.hpp b/addons/wardrobe/CfgSounds.hpp index 50be94518f1..7e7703a4b2a 100644 --- a/addons/wardrobe/CfgSounds.hpp +++ b/addons/wardrobe/CfgSounds.hpp @@ -2,7 +2,7 @@ #define ENTRY(base,dur)\ class GVAR(DOUBLES(base,dur)) {\ name = QUOTE(base dur);\ - sound[] = { QPATHTOF(data\sounds\DOUBLES(base,dur)##.ogg), 1, 1, 100 };\ + sound[] = { QPATHTOF(data\sounds\##DOUBLES(base,dur)##.ogg), 1, 1, 100 };\ titles[] = { 0, "" };\ forceTitles = 0;\ titlesStructured = 0;\ diff --git a/addons/wardrobe/CfgWardrobe.hpp b/addons/wardrobe/CfgWardrobe.hpp index b7de9e608b9..4a8f3ee08a2 100644 --- a/addons/wardrobe/CfgWardrobe.hpp +++ b/addons/wardrobe/CfgWardrobe.hpp @@ -1,8 +1,34 @@ -class CfgWeapons { - #include "Uniforms.hpp" -}; - +/* class CfgGlasses { #include "Facewear.hpp" }; +*/ + +// The new way :sigh: + +class ADDON { + #include "BaseClasses.hpp" + #include "Uniforms.hpp" + + // Balaclava, black + class G_Balaclava_blk: EGVAR(wardrobe,base) { + class modifiableTo { + class G_Balaclava_lowprofile; + class G_Balaclava_combat; + }; + components[] = { "G_Balaclava_blk" }; + }; + class G_Balaclava_combat: EGVAR(wardrobe,base) { + class modifiableTo { + class G_Balaclava_blk; + }; + components[] = {"G_Balaclava_blk", "G_Combat"}; + }; + class G_Balaclava_lowprofile: EGVAR(wardrobe,base) { + class modifiableTo { + class G_Balaclava_blk; + }; + components[] = { "G_Balaclava_blk", "G_Lowprofile" }; + }; +}; diff --git a/addons/wardrobe/Uniforms.hpp b/addons/wardrobe/Uniforms.hpp index f40cc377517..9a089578446 100644 --- a/addons/wardrobe/Uniforms.hpp +++ b/addons/wardrobe/Uniforms.hpp @@ -1,30 +1,13 @@ -// CfgWeapons -class Uniform_Base; - -// Macros -#define UNIFORM_BASE(class1,class2)\ -class class1: Uniform_Base {\ - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) {\ - modifiableTo[] = { QUOTE(class2) };\ - };\ -};\ -class class2: Uniform_Base {\ - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) {\ - modifiableTo[] = { QUOTE(class1) };\ - };\ -} - - // Vanilla CTRG Uniform -UNIFORM_BASE(U_B_CTRG_1,U_B_CTRG_3); +UNIFORM_SLEEVES(U_B_CTRG_1,U_B_CTRG_3); // AAF Fatigues -UNIFORM_BASE(U_I_CombatUniform,U_I_CombatUniform_shortsleeve); +UNIFORM_SLEEVES(U_I_CombatUniform,U_I_CombatUniform_shortsleeve); // APEX CTRG Uniforms -UNIFORM_BASE(U_B_CTRG_Soldier_F,U_B_CTRG_Soldier_3_F); -UNIFORM_BASE(U_B_CTRG_Soldier_Arid_F,U_B_CTRG_Soldier_3_Arid_F); -UNIFORM_BASE(U_B_CTRG_Soldier_urb_1_F,U_B_CTRG_Soldier_urb_3_F); +UNIFORM_SLEEVES(U_B_CTRG_Soldier_F,U_B_CTRG_Soldier_3_F); +UNIFORM_SLEEVES(U_B_CTRG_Soldier_Arid_F,U_B_CTRG_Soldier_3_Arid_F); +UNIFORM_SLEEVES(U_B_CTRG_Soldier_urb_1_F,U_B_CTRG_Soldier_urb_3_F); // Contact - LDF Fatigues -UNIFORM_BASE(U_I_E_Uniform_01_F,U_I_E_Uniform_01_shortsleeve_F); +UNIFORM_SLEEVES(U_I_E_Uniform_01_F,U_I_E_Uniform_01_shortsleeve_F); diff --git a/addons/wardrobe/XEH_PREP.hpp b/addons/wardrobe/XEH_PREP.hpp index 417a9cc8cb4..d78f799904e 100644 --- a/addons/wardrobe/XEH_PREP.hpp +++ b/addons/wardrobe/XEH_PREP.hpp @@ -19,8 +19,8 @@ PREP(spareBarrel_updateMagIDs); PREP(addActions); PREP(addActions_condition); PREP(addActions_children); -PREP(getAction_Name); -PREP(getAction_Icon); +PREP(addActions_name); +PREP(addActions_icon); // Cache PREP(cache_get); PREP(cache_set); @@ -32,5 +32,5 @@ PREP(getAllWardrobeItems); PREP(compare_container_maxLoad); // CBA Context Menu PREP(enable_contextMenu); -PREP(do_nextVariant); -PREP(getNextVariant); +PREP(nextVariant_do); +PREP(nextVariant_get); diff --git a/addons/wardrobe/config.cpp b/addons/wardrobe/config.cpp index 966dd4a903e..3805571af9c 100644 --- a/addons/wardrobe/config.cpp +++ b/addons/wardrobe/config.cpp @@ -26,6 +26,4 @@ class CfgPatches { #include "CfgVehicles.hpp" #include "CfgSounds.hpp" -#include "Baseclass.hpp" - #include "CfgWardrobe.hpp" diff --git a/addons/wardrobe/functions/fnc_addActions_children.sqf b/addons/wardrobe/functions/fnc_addActions_children.sqf index 3f40fed0097..670acf779e8 100644 --- a/addons/wardrobe/functions/fnc_addActions_children.sqf +++ b/addons/wardrobe/functions/fnc_addActions_children.sqf @@ -30,8 +30,8 @@ private _actions = []; private _cfg_target = _x; private _aceAction = [ configName _cfg_target, - [_cfg_target] call FUNC(getAction_Name), - [_cfg_target] call FUNC(getAction_Icon), + [_cfg_target] call FUNC(addActions_name), + [_cfg_target] call FUNC(addActions_icon), FUNC(replace), {true}, {}, diff --git a/addons/wardrobe/functions/fnc_getAction_Icon.sqf b/addons/wardrobe/functions/fnc_addActions_icon.sqf similarity index 84% rename from addons/wardrobe/functions/fnc_getAction_Icon.sqf rename to addons/wardrobe/functions/fnc_addActions_icon.sqf index 94a7a81eaa1..d4c82a24eec 100644 --- a/addons/wardrobe/functions/fnc_getAction_Icon.sqf +++ b/addons/wardrobe/functions/fnc_addActions_icon.sqf @@ -20,5 +20,6 @@ params [ ["_cfg", configNull, [configNull] ] ]; if (isNull _cfg) exitWith {}; -private _altDispIcon = getText (_cfg >> QUOTE(ADDON) >> "alternativePicture"); +private _altDispIcon = getText (configFile >> QUOTE(ADDON) >> configName _cfg >> "alternativePicture"); if (_altDispIcon isEqualTo "") then { getText (_cfg >> "picture") } else { _altDispIcon } + diff --git a/addons/wardrobe/functions/fnc_getAction_Name.sqf b/addons/wardrobe/functions/fnc_addActions_name.sqf similarity index 83% rename from addons/wardrobe/functions/fnc_getAction_Name.sqf rename to addons/wardrobe/functions/fnc_addActions_name.sqf index 0c51dcf67d5..9383c885534 100644 --- a/addons/wardrobe/functions/fnc_getAction_Name.sqf +++ b/addons/wardrobe/functions/fnc_addActions_name.sqf @@ -18,5 +18,5 @@ params [ ["_cfg", configNull, [configNull] ] ]; -private _altDispName = getText (_cfg >> QUOTE(ADDON) >> "alternativeDisplayName"); +private _altDispName = getText (configFile >> QUOTE(ADDON) >> configName _cfg >> "alternativeDisplayName"); if (_altDispName isEqualTo "") then { getText (_cfg >> "displayName") } else { _altDispName }; diff --git a/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf b/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf index f7e54eef1cf..79dabc92aa7 100644 --- a/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf +++ b/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf @@ -2,7 +2,7 @@ /* * Author: OverlordZorn - * Function to request the clearing of the cache on closing of the menu + * Function to request the clearing of the cache upon closing of the menu * * Arguments: * 0: The first argument diff --git a/addons/wardrobe/functions/fnc_compare_components.sqf b/addons/wardrobe/functions/fnc_compare_components.sqf index 6271f1ffbc4..582d48cb1cc 100644 --- a/addons/wardrobe/functions/fnc_compare_components.sqf +++ b/addons/wardrobe/functions/fnc_compare_components.sqf @@ -21,8 +21,8 @@ params ["_cfg_origin", "_cfg_tgt"]; -private _current = getArray (_cfg_origin >> "ace_wardrobe" >> "components"); -private _needed = getArray (_cfg_tgt >> "ace_wardrobe" >> "components"); +private _current = getArray (configFile >> QUOTE(ADDON) >> configName _cfg_origin >> "components"); +private _needed = getArray (configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "components"); private _missing = []; diff --git a/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf b/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf index 65c5d988dff..a8feca4be74 100644 --- a/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf +++ b/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf @@ -2,7 +2,8 @@ /* * Author: OverlordZorn - * WIP - This function will compare the maxLoad of all modifiable Items with its modifiableTo Variants and will provide an RPT output. + * This debug function will compare the maxLoad of all modifiable Items with its modifiableTo Variants and will provide an RPT output. + * WIP! * * Arguments: * None @@ -13,7 +14,7 @@ * Example: * [] call ace_wardrobe_fnc_compare_container_maxLoad * - * Public: yes + * Public: no */ // TODO @@ -27,19 +28,50 @@ private _allWardrobeItems = [true] call FUNC(getAllWardrobeItems) select { }; private _established = []; +private _index = 0; +private _missmatches = []; + +LOG_SYS("CompareMaxLoad","========================================================================================================"); +LOG_SYS("CompareMaxLoad",QUOTE(Comparing PREFIX COMPONENT containers maximumLoad)); +LOG_SYS("CompareMaxLoad","========================================================================================================"); { private _origin_cfg = _x; private _origin_className = configName _origin_cfg; + private _origin_maxLoad = getNumber (configFile >> "CfgVehicles" >> getText (_origin_cfg >> "ItemInfo" >> "containerClass") >> "maximumLoad"); - if (_origin_className in _established) then { continue }; _established pushBack _origin_className; - private _targets = [_origin] call FUNC(getItems_modifiableTo); + private _targets = [_origin_cfg] call FUNC(getItems_modifiableTo); - // formulate - + { + private _target_cfg = _x; + private _target_className = configName _target_cfg; + private _target_maxLoad = getNumber (configFile >> "CfgVehicles" >> getText (_target_cfg >> "ItemInfo" >> "containerClass") >> "maximumLoad"); + + if (_target_className in _established) then { continue }; + _established pushBack _target_className; + private _missmatch = _target_maxLoad isNotEqualTo _origin_maxLoad; + private _string = format ["%6 - [%5] [%2|%4] %1 vs %3", _origin_className,_origin_maxLoad,_target_className,_target_maxLoad,["Nominal", "Missmatch Detected!"] select _missmatch, _index]; + if (_missmatch) then { _missmatches pushBack [_origin_className,_origin_maxLoad,_target_className,_target_maxLoad]; }; + + LOG_SYS("CompareMaxLoad",_string); + ADD(_index,1); + } forEach _targets; } forEach _allWardrobeItems; + +LOG_SYS("CompareMaxLoad","DONE"); +LOG_SYS("CompareMaxLoad","========================================================================================================"); +_str = format ["%1 missmatches detected!", count _missmatches]; +LOG_SYS("CompareMaxLoad",_str); + +if (count _missmatches > 0) then { + LOG_SYS("CompareMaxLoad","========================================================================================================"); + { LOG_SYS("CompareMaxLoad",str _x); } forEach _missmatches; +}; +LOG_SYS("CompareMaxLoad","========================================================================================================"); +LOG_SYS("CompareMaxLoad","END"); +LOG_SYS("CompareMaxLoad","========================================================================================================"); \ No newline at end of file diff --git a/addons/wardrobe/functions/fnc_enable_contextMenu.sqf b/addons/wardrobe/functions/fnc_enable_contextMenu.sqf index 87410477159..0e0cd519fcd 100644 --- a/addons/wardrobe/functions/fnc_enable_contextMenu.sqf +++ b/addons/wardrobe/functions/fnc_enable_contextMenu.sqf @@ -32,7 +32,7 @@ if (_enable && {!(missionNamespace getVariable [QGVAR(contextmenu_enabled), fals {true}, {true} ], - FUNC(do_nextVariant), + FUNC(nextVariant_do), false, [] ] call CBA_fnc_addItemContextMenuOption; diff --git a/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf b/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf index bc2e34e9cc9..5729641a040 100644 --- a/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf +++ b/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf @@ -18,4 +18,9 @@ params ["_cfg_current"]; +/* OLD [_cfg_current >> QUOTE(ADDON) >> "modifiableTo"] call BIS_fnc_getCfgDataArray apply { [_x] call CBA_fnc_getItemConfig } select { !isNull _x } +*/ + +"true" configClasses (configFile >> QUOTE(ADDON) >> configName _cfg_current >> "modifiableTo") apply { [configName _x] call CBA_fnc_getItemConfig } select { !isNull _x } + diff --git a/addons/wardrobe/functions/fnc_isModifiable.sqf b/addons/wardrobe/functions/fnc_isModifiable.sqf index 55b888ac39a..f3bc7a8e4cb 100644 --- a/addons/wardrobe/functions/fnc_isModifiable.sqf +++ b/addons/wardrobe/functions/fnc_isModifiable.sqf @@ -2,8 +2,7 @@ /* * Author: OverlordZorn - * Function to check if the provided wearable Item (Config) item is defined as a modifiable Wardrobe Item. - * Will not return true on fully inherited "ace_wardrobe" subclass + * Function to check if the provided wearable Item (Config) can be modified through ace_wardrobe. * * Arguments: * 0: Wearable Item @@ -23,5 +22,10 @@ params [ if (isNull _cfg) exitWith {false}; + +/* old // Checks if the config has the property without it being inherited(!) count ( QUOTE(configName _x isEqualTo QUOTE(QUOTE(ace_wardrobe))) configClasses _cfg ) > 0 +*/ + +isClass (configFile >> QUOTE(ADDON) >> configName _cfg) \ No newline at end of file diff --git a/addons/wardrobe/functions/fnc_do_nextVariant.sqf b/addons/wardrobe/functions/fnc_nextVariant_do.sqf similarity index 91% rename from addons/wardrobe/functions/fnc_do_nextVariant.sqf rename to addons/wardrobe/functions/fnc_nextVariant_do.sqf index bdac5f1d736..02613d3d8fe 100644 --- a/addons/wardrobe/functions/fnc_do_nextVariant.sqf +++ b/addons/wardrobe/functions/fnc_nextVariant_do.sqf @@ -15,7 +15,7 @@ * nothing * * Example: - * [_unit, _container, _item, _slot, _params] call ace_wardrobe_fnc_do_nextVariant + * [_unit, _container, _item, _slot, _params] call ace_wardrobe_fnc_nextVariant_do; * * Public: No */ @@ -24,7 +24,7 @@ params ["_unit", "_container", "_item", "_slot", "_params"]; private _current_cfg = [_item] call cba_fnc_getItemConfig; -private _cfg_tgt = [ _current_cfg ] call FUNC(getNextVariant); +private _cfg_tgt = [ _current_cfg ] call FUNC(nextVariant_get); if (_cfg_tgt isEqualTo false) exitWith {}; diff --git a/addons/wardrobe/functions/fnc_getNextVariant.sqf b/addons/wardrobe/functions/fnc_nextVariant_get.sqf similarity index 96% rename from addons/wardrobe/functions/fnc_getNextVariant.sqf rename to addons/wardrobe/functions/fnc_nextVariant_get.sqf index 5ff9894fa3f..5f919c1ef71 100644 --- a/addons/wardrobe/functions/fnc_getNextVariant.sqf +++ b/addons/wardrobe/functions/fnc_nextVariant_get.sqf @@ -14,7 +14,7 @@ * Desired Variant * * Example: - * [_cfg_current] call ace_wardrobe_fnc_getNextVariant + * [_cfg_current] call ace_wardrobe_fnc_nextVariant_get * * Public: No */ diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 59b8d6f72d5..ad0b8f9e7e7 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -25,7 +25,7 @@ params ["_target", "_unit", "_actionParams", ["_replaceNow", false, [true]]]; _actionParams params ["_cfg_origin", "_cfg_tgt"]; // Duration of the "animation" -private _duration = getNumber (_cfg_tgt>> QUOTE(ADDON) >> "duration"); +private _duration = getNumber (configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "duration"); if (_replaceNow) then { _duration = 0; }; // Replace the Main Item. @@ -75,21 +75,21 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 //// Handle Effects // Animation/Gestures -[ _unit, getText (_cfg_tgt >> QUOTE(ADDON) >> "gesture") ] call ace_common_fnc_doGesture; +[ _unit, getText (configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "gesture") ] call ace_common_fnc_doGesture; // Plays Random Sound At the Beginning -private _sound = [_cfg_tgt >> QUOTE(ADDON) >> "sound"] call FUNC(getCfgDataRandom); +private _sound = [configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "sound"] call FUNC(getCfgDataRandom); if (_sound != "") then { [ CBA_fnc_globalSay3D, [_unit, _sound, nil, true, true], - (getNumber (_cfg_tgt>> QUOTE(ADDON) >> "sound_timing") max 0 min 1) * _duration + (getNumber (configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "sound_timing") max 0 min 1) * _duration ] call CBA_fnc_waitAndExecute; }; // Notification private _notify_img = getText (_cfg_tgt >> "picture"); if !(".paa" in _notify_img) then { _notify_img = [_notify_img,"paa"] joinString "." }; // Some vanilla items dont have the .paa and cba notify will display the path as a string without the .paa -[ CBA_fnc_notify, [[ _notify_img, 4], [getText (_cfg_tgt >> "displayName")], true ], _duration * 1.2 ] call CBA_fnc_waitAndExecute; +[ ace_common_fnc_displayTextStructured, [["
%2",_notify_img, getText (_cfg_tgt >> "displayName")], 4], _duration * 1.2 ] call CBA_fnc_waitAndExecute; nil diff --git a/addons/wardrobe/script_macros_wardrobe.hpp b/addons/wardrobe/script_macros_wardrobe.hpp index 1be30f4fd38..7ed64b0e739 100644 --- a/addons/wardrobe/script_macros_wardrobe.hpp +++ b/addons/wardrobe/script_macros_wardrobe.hpp @@ -13,3 +13,49 @@ if (varName isEqualType []) then { { [_x, varName select _forEachIndex] call FUN class ItemInfo: ItemInfo {\ mass = var;\ } + + +// CfgWardrobe Base Uniform Macro +// Uniform Sleeves Up/Down +#define BASIC(variant1,variant2,base1,base2)\ +class variant1: base1 {\ + class modifiableTo {\ + class variant2;\ + };\ +};\ +class variant2: base2 {\ + class modifiableTo {\ + class variant1;\ + };\ +} + +#define BASIC_COMPONENT(variantWith,variantWithout,baseWith,baseWithout,component)\ +class variantWith: baseWith {\ + class modifiableTo {\ + class variantWithout;\ + };\ + components[] = {QUOTE(component)};\ +};\ +class variantWithout: baseWithout {\ + class modifiableTo {\ + class variantWith;\ + };\ +} + +// Basic +#define UNIFORM_SLEEVES(variantSleevesDown,variantSleevesUp)\ +BASIC(variantSleevesDown,variantSleevesUp,EGVAR(wardrobe,base_U_sleeves_down),EGVAR(wardrobe,base_U_sleeves_up)) + +#define UNIFORM_GLOVES(variantGlovesOn,variantGlovesOff)\ +BASIC(variantGlovesOn,variantGlovesOff,EGVAR(wardrobe,base_U_gloves_on),EGVAR(wardrobe,base_U_gloves_off)) + +#define UNIFORM_JACKET(variantJacketOpen,variantJacketClosed)\ +BASIC(variantJacketOpen,variantJacketClosed,EGVAR(wardrobe,base_U_jacket_open),EGVAR(wardrobe,base_U_jacket_closed)) + +#define HELMET_VISOR(variantVisorUp,variantVisorDown)\ +BASIC(variantVisorUp,variantVisorDown,EGVAR(wardrobe,base_H_visor_up),EGVAR(wardrobe,base_H_visor_down)) + +// Basic Component +#define HELMET_GOGGLES(variantGogglesOn,variantGogglesOff,component)\ +BASIC_COMPONENT(variantGogglesOn,variantGogglesOff,EGVAR(wardrobe,base_H_goggles_on),EGVAR(wardrobe,base_H_goggles_off),component) + From 06be6c9da56b153ab7f3851087f88adff67c39dd Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 5 May 2025 14:48:58 +0200 Subject: [PATCH 154/305] vanilla compat complete --- addons/wardrobe/CfgWardrobe.hpp | 22 +--- addons/wardrobe/Facewear.hpp | 185 +++++++++++++++++--------------- 2 files changed, 97 insertions(+), 110 deletions(-) diff --git a/addons/wardrobe/CfgWardrobe.hpp b/addons/wardrobe/CfgWardrobe.hpp index 4a8f3ee08a2..60d0043d513 100644 --- a/addons/wardrobe/CfgWardrobe.hpp +++ b/addons/wardrobe/CfgWardrobe.hpp @@ -10,25 +10,5 @@ class CfgGlasses { class ADDON { #include "BaseClasses.hpp" #include "Uniforms.hpp" - - // Balaclava, black - class G_Balaclava_blk: EGVAR(wardrobe,base) { - class modifiableTo { - class G_Balaclava_lowprofile; - class G_Balaclava_combat; - }; - components[] = { "G_Balaclava_blk" }; - }; - class G_Balaclava_combat: EGVAR(wardrobe,base) { - class modifiableTo { - class G_Balaclava_blk; - }; - components[] = {"G_Balaclava_blk", "G_Combat"}; - }; - class G_Balaclava_lowprofile: EGVAR(wardrobe,base) { - class modifiableTo { - class G_Balaclava_blk; - }; - components[] = { "G_Balaclava_blk", "G_Lowprofile" }; - }; + #include "Facewear.hpp" }; diff --git a/addons/wardrobe/Facewear.hpp b/addons/wardrobe/Facewear.hpp index 75f4a68de40..62a19894971 100644 --- a/addons/wardrobe/Facewear.hpp +++ b/addons/wardrobe/Facewear.hpp @@ -1,130 +1,137 @@ -// CfgGlasses - -// Parents -class None; -class G_WirelessEarpiece_base_F; -class G_EyeProtectors_base_F; - // Common Components -class G_Lowprofile: None { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "G_Balaclava_lowprofile" }; - components[] = {"G_Lowprofile"}; +class G_Lowprofile: EGVAR(wardrobe,base) { + class modifiableTo { + class G_Balaclava_lowprofile; }; + components[] = { "G_Lowprofile" }; }; -class G_Combat: None { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "G_Balaclava_combat", "G_Balaclava_TI_G_blk_F", "G_Balaclava_TI_G_tna_F" }; - components[] = {"G_Combat"}; +class G_Combat: EGVAR(wardrobe,base) { + class modifiableTo { + class G_Balaclava_combat; + class G_Balaclava_TI_G_blk_F; + class G_Balaclava_TI_G_tna_F; }; + components[] = { "G_Combat" }; }; - -class G_Aviator: None { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "G_Bandanna_aviator" }; - components[] = {"G_Aviator"}; +class G_Aviator: EGVAR(wardrobe,base) { + class modifiableTo { + class G_Bandanna_aviator; }; + components[] = { "G_Aviator" }; }; -class G_Shades_Black: None { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "G_Bandanna_shades" }; - components[] = {"G_Shades_Black"}; +class G_Shades_Black: EGVAR(wardrobe,base) { + class modifiableTo { + class G_Bandanna_shades; }; + components[] = { "G_Shades_Black" }; }; // Balaclava, black -class G_Balaclava_blk: None { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "G_Balaclava_lowprofile", "G_Balaclava_combat" }; - components[] = { "G_Balaclava_blk" }; +class G_Balaclava_blk: EGVAR(wardrobe,base) { + class modifiableTo { + class G_Balaclava_lowprofile; + class G_Balaclava_combat; }; + components[] = { "G_Balaclava_blk" }; }; -class G_Balaclava_combat: G_Balaclava_blk { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "G_Balaclava_blk" }; - components[] = {"G_Balaclava_blk", "G_Combat"}; +class G_Balaclava_combat: EGVAR(wardrobe,base) { + class modifiableTo { + class G_Balaclava_blk; }; + components[] = { "G_Balaclava_blk", "G_Combat" }; }; -class G_Balaclava_lowprofile: G_Balaclava_blk { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "G_Balaclava_blk" }; - components[] = { "G_Balaclava_blk", "G_Lowprofile" }; +class G_Balaclava_lowprofile: EGVAR(wardrobe,base) { + class modifiableTo { + class G_Balaclava_blk; }; + components[] = { "G_Balaclava_blk", "G_Lowprofile" }; }; + // Stealth Balaclava, black -class G_Balaclava_TI_blk_F: None { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "G_Balaclava_TI_G_blk_F" }; - components[] = { "G_Balaclava_TI_blk_F" }; +class G_Balaclava_TI_blk_F: EGVAR(wardrobe,base) { + class modifiableTo { + class G_Balaclava_TI_G_blk_F; }; + components[] = { "G_Balaclava_TI_blk_F" }; }; -class G_Balaclava_TI_G_blk_F: G_Balaclava_TI_blk_F { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "G_Balaclava_TI_blk_F" }; - components[] = { "G_Balaclava_TI_blk_F", "G_Combat" }; - }; +class G_Balaclava_TI_G_blk_F: EGVAR(wardrobe,base) { + class modifiableTo { + class G_Balaclava_TI_blk_F; + }; + components[] = { "G_Balaclava_TI_blk_F", "G_Combat" }; }; + // Stealth Balaclava, green(tanoa) -class G_Balaclava_TI_tna_F: G_Balaclava_TI_blk_F { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "G_Balaclava_TI_G_tna_F" }; - components[] = { "G_Balaclava_TI_tna_F" }; +class G_Balaclava_TI_tna_F: EGVAR(wardrobe,base) { + class modifiableTo { + class G_Balaclava_TI_G_tna_F; }; + components[] = { "G_Balaclava_TI_tna_F" }; }; -class G_Balaclava_TI_G_tna_F: G_Balaclava_TI_tna_F { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "G_Balaclava_TI_tna_F" }; - components[] = { "G_Balaclava_TI_tna_F", "G_Combat" }; - }; +class G_Balaclava_TI_G_tna_F: EGVAR(wardrobe,base) { + class modifiableTo { + class G_Balaclava_TI_tna_F; + }; + components[] = { "G_Balaclava_TI_tna_F", "G_Combat" }; }; + // Bandana, Black -class G_Bandanna_blk: G_Balaclava_blk { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "G_Bandanna_aviator", "G_Bandanna_sport", "G_Bandanna_shades" }; - components[] = { "G_Bandanna_blk" }; +class G_Bandanna_blk: EGVAR(wardrobe,base) { + class modifiableTo { + class G_Bandanna_aviator; + class G_Bandanna_sport; + class G_Bandanna_shades; }; + components[] = { "G_Bandanna_blk" }; }; -class G_Bandanna_shades: G_Bandanna_blk { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "G_Bandanna_blk", "G_Shades_Black" }; - components[] = { "G_Bandanna_blk", "G_Shades_Black" }; - }; -}; -class G_Bandanna_sport: G_Bandanna_shades { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "G_Bandanna_blk", "G_Sport_Blackred" }; - components[] = { "G_Bandanna_blk", "G_Sport_Blackred" }; - }; -}; -class G_Bandanna_aviator: G_Bandanna_shades { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "G_Bandanna_blk", "G_Aviator" }; - components[] = { "G_Bandanna_blk", "G_Aviator" }; - }; +class G_Bandanna_shades: EGVAR(wardrobe,base) { + + class modifiableTo { + class G_Bandanna_blk; + class G_Shades_Black; + }; + components[] = { "G_Bandanna_blk", "G_Shades_Black" }; +}; +class G_Bandanna_sport: EGVAR(wardrobe,base) { + class modifiableTo { + class G_Bandanna_blk; + class G_Sport_Blackred; + }; + components[] = { "G_Bandanna_blk", "G_Sport_Blackred"}; +}; +class G_Bandanna_aviator: EGVAR(wardrobe,base) { + class modifiableTo { + class G_Bandanna_blk; + class G_Aviator; + }; + components[] = { "G_Bandanna_blk", "G_Aviator" }; }; // Eye Protector -class G_EyeProtectors_F: G_EyeProtectors_base_F { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "G_EyeProtectors_Earpiece_F" }; - components[] = { "G_EyeProtectors_F" }; - }; +class G_EyeProtectors_F: EGVAR(wardrobe,base) { + class modifiableTo { + class G_EyeProtectors_Earpiece_F; + }; + components[] = { "G_EyeProtectors_F" }; }; -class G_EyeProtectors_Earpiece_F: G_EyeProtectors_base_F { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "G_EyeProtectors_F", "G_WirelessEarpiece_F" }; - components[] = { "G_EyeProtectors_F", "G_WirelessEarpiece_F" }; + +class G_EyeProtectors_Earpiece_F: EGVAR(wardrobe,base) { + class modifiableTo { + class G_EyeProtectors_F; + class G_WirelessEarpiece_F; }; + components[] = { "G_EyeProtectors_F", "G_WirelessEarpiece_F" }; }; -class G_WirelessEarpiece_F: G_WirelessEarpiece_base_F { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "G_EyeProtectors_Earpiece_F" }; - components[] = { "G_WirelessEarpiece_F" }; - }; + +class G_WirelessEarpiece_F: EGVAR(wardrobe,base) { + class modifiableTo { + class G_EyeProtectors_Earpiece_F; + }; + components[] = { "G_WirelessEarpiece_F" }; }; From c85f5b54f2c25b397ec5e997e0820a53823dd60f Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 5 May 2025 14:52:15 +0200 Subject: [PATCH 155/305] getCfgDataRandom -> CBA --- addons/wardrobe/XEH_PREP.hpp | 2 -- .../functions/fnc_getCfgDataRandom.sqf | 28 ------------------- addons/wardrobe/functions/fnc_replace.sqf | 2 +- 3 files changed, 1 insertion(+), 31 deletions(-) delete mode 100644 addons/wardrobe/functions/fnc_getCfgDataRandom.sqf diff --git a/addons/wardrobe/XEH_PREP.hpp b/addons/wardrobe/XEH_PREP.hpp index d78f799904e..f86a1191b25 100644 --- a/addons/wardrobe/XEH_PREP.hpp +++ b/addons/wardrobe/XEH_PREP.hpp @@ -25,8 +25,6 @@ PREP(addActions_icon); PREP(cache_get); PREP(cache_set); PREP(clearOnClosed_InteractionMenu); -// Config -PREP(getCfgDataRandom); // Debug PREP(getAllWardrobeItems); PREP(compare_container_maxLoad); diff --git a/addons/wardrobe/functions/fnc_getCfgDataRandom.sqf b/addons/wardrobe/functions/fnc_getCfgDataRandom.sqf deleted file mode 100644 index 9be9e65d03a..00000000000 --- a/addons/wardrobe/functions/fnc_getCfgDataRandom.sqf +++ /dev/null @@ -1,28 +0,0 @@ -#include "../script_component.hpp" - -/* - * Author: OverlordZorn - * This function extracts data from a config property. If it is an Array, it will select a random entry from the array, otherwise it will simply return the provided data. - * - * Arguments: - * 0: configPath - * - * Return Value: - * Value - * - * Example: - * [_cfg] call ace_wardrobe_fnc_getCfgDataRandom - * - * Public: yes - */ - -params [ - [ "_cfg", configNull, [configNull] ] -]; - -if (_cfg isEqualTo configNull) exitWith {nil}; - -private _data = [_cfg] call BIS_fnc_getCfgData; -if (_data isEqualType []) then { _data = selectRandom _data }; - -_data diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index ad0b8f9e7e7..e47eb15a453 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -78,7 +78,7 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 [ _unit, getText (configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "gesture") ] call ace_common_fnc_doGesture; // Plays Random Sound At the Beginning -private _sound = [configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "sound"] call FUNC(getCfgDataRandom); +private _sound = [configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "sound"] call cba_fnc_getCfgDataRandom ; if (_sound != "") then { [ CBA_fnc_globalSay3D, From 1fc0e5a31243cc700efb3e457ee9ddcd27c192a7 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 5 May 2025 15:19:52 +0200 Subject: [PATCH 156/305] rm whitespace --- addons/wardrobe/functions/fnc_replace.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index e47eb15a453..1064cc9c307 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -78,7 +78,7 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 [ _unit, getText (configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "gesture") ] call ace_common_fnc_doGesture; // Plays Random Sound At the Beginning -private _sound = [configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "sound"] call cba_fnc_getCfgDataRandom ; +private _sound = [configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "sound"] call cba_fnc_getCfgDataRandom; if (_sound != "") then { [ CBA_fnc_globalSay3D, From 7f40aeee1a9a60f3b0528e8125d3b2dd04c450c2 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 5 May 2025 19:56:22 +0200 Subject: [PATCH 157/305] Update launch.toml --- .hemtt/launch.toml | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/.hemtt/launch.toml b/.hemtt/launch.toml index e1f85042c36..e738fc365bc 100644 --- a/.hemtt/launch.toml +++ b/.hemtt/launch.toml @@ -51,16 +51,35 @@ workshop = [ ] [Wardrobe] -extends = "rhs" +extends = "default" +mission = "Wardrobe.VR" workshop = [ "2369477168", # Advanced Developer Tools "1779063631", # ZEN # "623475643", # eden enhanced ] -mission = "Wardrobe.VR" -dlc = [ -# "Western Sahara", -# "Reaction Forces", -# "S.O.G. Prairie Fire", -# "gm" -] \ No newline at end of file + +[Wardrobe_gm] +extends = "Wardrobe" +dlc = ["gm"] + +[Wardrobe_ws] +extends = "Wardrobe" +dlc = ["Western Sahara"] + +[Wardrobe_rf] +extends = "Wardrobe" +dlc = ["Reaction Forces"] + +[Wardrobe_sog] +extends = "Wardrobe" +dlc = ["S.O.G. Prairie Fire"] + +[Wardrobe_rhs] +extends = "Wardrobe" +workshop = [ + "843425103", # RHS AFRF Workshop ID + "843577117", # RHS USAF Workshop ID + "843593391", # RHS GREF Workshop ID + "843632231", # RHS SAF Workshop ID +] From 170e7124775f0b801b37b42b8e3aa809a05aa606 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 5 May 2025 19:56:44 +0200 Subject: [PATCH 158/305] Update script_macros_wardrobe.hpp --- addons/wardrobe/script_macros_wardrobe.hpp | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/addons/wardrobe/script_macros_wardrobe.hpp b/addons/wardrobe/script_macros_wardrobe.hpp index 7ed64b0e739..dc51db354d6 100644 --- a/addons/wardrobe/script_macros_wardrobe.hpp +++ b/addons/wardrobe/script_macros_wardrobe.hpp @@ -42,6 +42,28 @@ class variantWithout: baseWithout {\ };\ } +#define BASIC_COMBO(Combo,ComboBase,Variant1,Variant1Base,Variant2,Variant2Base)\ +class Combo: ComboBase {\ + class modifiableTo {\ + class Variant1;\ + class Variant2;\ + };\ + components[] = { QUOTE(Variant1), QUOTE(Variant2) };\ +};\ +class Variant1: Variant1Base {\ + class modifiableTo {\ + class Combo;\ + };\ + components[] = { QUOTE(Variant1) };\ +};\ +class Variant2: Variant2Base {\ + class modifiableTo {\ + class Combo;\ + };\ + components[] = { QUOTE(Variant2) };\ +} + + // Basic #define UNIFORM_SLEEVES(variantSleevesDown,variantSleevesUp)\ BASIC(variantSleevesDown,variantSleevesUp,EGVAR(wardrobe,base_U_sleeves_down),EGVAR(wardrobe,base_U_sleeves_up)) @@ -59,3 +81,6 @@ BASIC(variantVisorUp,variantVisorDown,EGVAR(wardrobe,base_H_visor_up),EGVAR(ward #define HELMET_GOGGLES(variantGogglesOn,variantGogglesOff,component)\ BASIC_COMPONENT(variantGogglesOn,variantGogglesOff,EGVAR(wardrobe,base_H_goggles_on),EGVAR(wardrobe,base_H_goggles_off),component) +// Basic Combo +#define HELMET_CAP_COMBO(Combo,Helmet,Cap)\ +BASIC_COMBO(Combo,EGVAR(wardrobe,base),Helmet,EGVAR(wardrobe,base),Cap,EGVAR(wardrobe,base)) \ No newline at end of file From 8f1bf061f70db6f51fe3f49c626d0b85629f04f1 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 5 May 2025 19:56:54 +0200 Subject: [PATCH 159/305] GM Compats --- .../compat_gm_wardrobe/CfgWardrobe.hpp | 8 +- .../CfgWardrobe_Helmets.hpp | 69 ++++++ .../CfgWardrobe_Uniform.hpp | 69 ++++++ .../compat_gm/compat_gm_wardrobe/Helmets.hpp | 92 +------- .../compat_gm/compat_gm_wardrobe/Uniforms.hpp | 214 ------------------ 5 files changed, 152 insertions(+), 300 deletions(-) create mode 100644 addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Helmets.hpp create mode 100644 addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Uniform.hpp delete mode 100644 addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp diff --git a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp index 704f461fcfa..f9bd2deb47f 100644 --- a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp @@ -13,7 +13,13 @@ class EGVAR(wardrobe,base_U_gloves_off); class EGVAR(wardrobe,base_H_goggles_on); class EGVAR(wardrobe,base_H_goggles_off); +// Adjust Mass of Objects for consistency's sake class CfgWeapons { #include "Helmets.hpp" - #include "Uniforms.hpp" }; + +// Actual CfgWardrobe Compat +class ace_wardrobe { + #include "CfgWardrobe_Helmets.hpp" + #include "CfgWardrobe_Uniform.hpp" +}; \ No newline at end of file diff --git a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Helmets.hpp b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Helmets.hpp new file mode 100644 index 00000000000..158ccf45baa --- /dev/null +++ b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Helmets.hpp @@ -0,0 +1,69 @@ +// Helmet Visor +//HELMET_VISOR(variantVisorUp,variantVisorDown) + +HELMET_VISOR(gm_ge_bgs_headgear_psh77_cover_up_smp,gm_ge_bgs_headgear_psh77_cover_down_smp); +HELMET_VISOR(gm_ge_bgs_headgear_psh77_cover_up_str,gm_ge_bgs_headgear_psh77_cover_down_str); +HELMET_VISOR(gm_ge_headgear_psh77_up_oli,gm_ge_headgear_psh77_down_oli); + + +// Hemlet with Goggles +//HELMET_GOGGLES(variantGogglesOn,variantGogglesOff,component) + +HELMET_GOGGLES(gm_ge_headgear_m92_cover_glasses_win,gm_ge_headgear_m92_cover_win,gm_ge_facewear_dustglasses); +HELMET_GOGGLES(gm_ge_headgear_m92_cover_glasses_oli,gm_ge_headgear_m92_cover_oli,gm_ge_facewear_dustglasses); +HELMET_GOGGLES(gm_ge_headgear_m92_cover_glasses_blk,gm_ge_headgear_m92_cover_blk,gm_ge_facewear_dustglasses); + +HELMET_GOGGLES(gm_ge_headgear_m92_glasses_trp,gm_ge_headgear_m92_trp,gm_ge_facewear_dustglasses); +HELMET_GOGGLES(gm_ge_headgear_m92_glasses_flk,gm_ge_headgear_m92_flk,gm_ge_facewear_dustglasses); + +HELMET_GOGGLES(gm_ge_bgs_headgear_m38_72_goggles_bgr,gm_ge_bgs_headgear_m38_72_bgr,gm_ge_facewear_acidgoggles); + + +// Caps with "Slung" M62 Helmets +// HELMET_CAP_COMBO(Combo,Helmet,Cap) + + +// Helmet Only +class gm_ge_headgear_m62_net: EGVAR(wardrobe,base) { + class modifiableTo { + class gm_ge_headgear_sidecap_80_m62_oli; + class gm_ge_headgear_hat_80_m62_oli; + }; + components[] = {"gm_ge_headgear_m62_net"}; +}; + + +// Hats only +class gm_ge_headgear_hat_80_oli: EGVAR(wardrobe,base) { + class modifiableTo { + class gm_ge_headgear_hat_80_m62_oli; + }; + components[] = {"gm_ge_headgear_hat_80_oli"}; +}; + +class gm_ge_headgear_sidecap_80_oli: EGVAR(wardrobe,base) { + class modifiableTo { + class gm_ge_headgear_sidecap_80_m62_oli; + }; + components[] = {"gm_ge_headgear_sidecap_80_oli"}; +}; + +// Hats + Helmets + +class gm_ge_headgear_hat_80_m62_oli: EGVAR(wardrobe,base) { + class modifiableTo { + class gm_ge_headgear_hat_80_oli; + class gm_ge_headgear_m62_net; + }; + components[] = {"gm_ge_headgear_hat_80_oli","gm_ge_headgear_m62_net"}; +}; + + + +class gm_ge_headgear_sidecap_80_m62_oli: EGVAR(wardrobe,base) { + class modifiableTo { + class gm_ge_headgear_sidecap_80_oli; + class gm_ge_headgear_m62_net; + }; + components[] = {"gm_ge_headgear_sidecap_80_oli","gm_ge_headgear_m62_net"}; +}; \ No newline at end of file diff --git a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Uniform.hpp b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Uniform.hpp new file mode 100644 index 00000000000..56c999d075f --- /dev/null +++ b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Uniform.hpp @@ -0,0 +1,69 @@ +// CfgWeapons +// Sleeves +// UNIFORM_SLEEVES(variantSleevesDown,variantSleevesUp); + +UNIFORM_SLEEVES(gm_ge_bgs_uniform_special_80_grn,gm_ge_bgs_uniform_special_rolled_80_grn); +UNIFORM_SLEEVES(gm_ge_bgs_uniform_special_80_blk,gm_ge_bgs_uniform_special_rolled_80_blk); + +UNIFORM_SLEEVES(gm_ge_army_uniform_pilot_sar,gm_ge_army_uniform_pilot_rolled_sar); +UNIFORM_SLEEVES(gm_ge_army_uniform_pilot_oli,gm_ge_army_uniform_pilot_rolled_oli); + +UNIFORM_SLEEVES(gm_ge_pol_uniform_pilot_grn,gm_ge_pol_uniform_pilot_rolled_grn); + +UNIFORM_SLEEVES(gm_ge_uniform_pilot_commando_oli,gm_ge_uniform_pilot_commando_rolled_oli); +UNIFORM_SLEEVES(gm_ge_uniform_pilot_commando_gry,gm_ge_uniform_pilot_commando_rolled_gry); +UNIFORM_SLEEVES(gm_ge_uniform_pilot_commando_blk,gm_ge_uniform_pilot_commando_rolled_blk); + +UNIFORM_SLEEVES(gm_pl_army_uniform_soldier_80_frog,gm_pl_army_uniform_soldier_rolled_80_frog); +UNIFORM_SLEEVES(gm_pl_army_uniform_soldier_80_moro,gm_pl_army_uniform_soldier_rolled_80_moro); + +UNIFORM_SLEEVES(gm_ge_uniform_soldier_90_trp,gm_ge_uniform_soldier_rolled_90_trp); +UNIFORM_SLEEVES(gm_ge_uniform_soldier_90_flk,gm_ge_uniform_soldier_rolled_90_flk); + + +// Sleeves +// #define UNIFORM_GLOVES(variantGlovesOn,variantGlovesOff) +UNIFORM_GLOVES(gm_gc_army_uniform_soldier_gloves_80_str,gm_gc_army_uniform_soldier_80_str); +UNIFORM_GLOVES(gm_ge_army_uniform_soldier_gloves_80_ols,gm_ge_army_uniform_soldier_80_ols); + + +// Gloves, Sleeves Up and Base Variant +// Manual configuration +class gm_xx_uniform_soldier_bdu_80_wdl: EGVAR(wardrobe,base_U_gloves_on) { + class modifiableTo { + class gm_xx_uniform_soldier_bdu_rolled_80_wdl; + class gm_xx_uniform_soldier_bdu_nogloves_80_wdl; + }; +}; +class gm_xx_uniform_soldier_bdu_rolled_80_wdl: EGVAR(wardrobe,base_U_sleeves_up) { + class modifiableTo { + class gm_xx_uniform_soldier_bdu_80_wdl; + class gm_xx_uniform_soldier_bdu_nogloves_80_wdl; + }; +}; +class gm_xx_uniform_soldier_bdu_nogloves_80_wdl: EGVAR(wardrobe,base) { + class modifiableTo { + class gm_xx_uniform_soldier_bdu_80_wdl; + class gm_xx_uniform_soldier_bdu_rolled_80_wdl; + }; +}; + + +class gm_xx_uniform_soldier_bdu_80_oli: EGVAR(wardrobe,base_U_gloves_on) { + class modifiableTo { + class gm_xx_uniform_soldier_bdu_rolled_80_oli; + class gm_xx_uniform_soldier_bdu_nogloves_80_oli; + }; +}; +class gm_xx_uniform_soldier_bdu_rolled_80_oli: EGVAR(wardrobe,base_U_sleeves_up) { + class modifiableTo { + class gm_xx_uniform_soldier_bdu_80_oli; + class gm_xx_uniform_soldier_bdu_nogloves_80_oli; + }; +}; +class gm_xx_uniform_soldier_bdu_nogloves_80_oli: EGVAR(wardrobe,base) { + class modifiableTo { + class gm_xx_uniform_soldier_bdu_80_oli; + class gm_xx_uniform_soldier_bdu_rolled_80_oli; + }; +}; diff --git a/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp b/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp index 06b7fea1f5a..715e5c4ecb3 100644 --- a/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp @@ -1,57 +1,10 @@ // CfgWeapons -// Base Classes -class gm_ge_headgear_psh77_cover_down_base; -class gm_ge_headgear_psh77_cover_up_base; -class gm_ge_headgear_psh77_down_base; -class gm_ge_headgear_psh77_up_base; - -class gm_ge_bgs_headgear_psh77_cover_down_smp: gm_ge_headgear_psh77_cover_down_base { - class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) { - modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_up_smp" }; - }; -}; -class gm_ge_bgs_headgear_psh77_cover_up_smp: gm_ge_headgear_psh77_cover_up_base { - class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up) { - modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_down_smp" }; - }; -}; -class gm_ge_bgs_headgear_psh77_cover_down_str: gm_ge_headgear_psh77_cover_down_base { - class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) { - modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_up_str" }; - }; -}; -class gm_ge_bgs_headgear_psh77_cover_up_str: gm_ge_headgear_psh77_cover_up_base { - class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up) { - modifiableTo[] = { "gm_ge_bgs_headgear_psh77_cover_down_str" }; - }; -}; -class gm_ge_headgear_psh77_down_oli: gm_ge_headgear_psh77_down_base { - class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) { - modifiableTo[] = { "gm_ge_headgear_psh77_up_oli" }; - }; -}; -class gm_ge_headgear_psh77_up_oli: gm_ge_headgear_psh77_up_base { - class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up) { - modifiableTo[] = { "gm_ge_headgear_psh77_down_oli" }; - }; -}; - -#define GM_Helmet_Glasses(classWith,classWithout,baseWith,baseWithout,goggles)\ +#define GM_Helmet_Glasses(classWith,baseWith)\ class classWith: baseWith {\ - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) {\ - modifiableTo[] = { QUOTE(classWithout) };\ - components[] = { QUOTE(goggles) };\ - };\ MASS(11);\ -};\ -class classWithout: baseWithout {\ - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) {\ - modifiableTo[] = { QUOTE(classWith) };\ - };\ } - class gm_ge_headgear_m92_base; class gm_ge_headgear_m92_cover_base; @@ -63,12 +16,12 @@ class gm_ge_headgear_m92_cover_glasses_base: gm_ge_headgear_m92_base { class ItemInfo; }; -GM_Helmet_Glasses(gm_ge_headgear_m92_cover_glasses_win,gm_ge_headgear_m92_cover_win,gm_ge_headgear_m92_cover_glasses_base,gm_ge_headgear_m92_cover_base,gm_ge_facewear_dustglasses); -GM_Helmet_Glasses(gm_ge_headgear_m92_cover_glasses_oli,gm_ge_headgear_m92_cover_oli,gm_ge_headgear_m92_cover_glasses_base,gm_ge_headgear_m92_cover_base,gm_ge_facewear_dustglasses); -GM_Helmet_Glasses(gm_ge_headgear_m92_cover_glasses_blk,gm_ge_headgear_m92_cover_blk,gm_ge_headgear_m92_cover_glasses_base,gm_ge_headgear_m92_cover_base,gm_ge_facewear_dustglasses); +GM_Helmet_Glasses(gm_ge_headgear_m92_cover_glasses_win,gm_ge_headgear_m92_cover_glasses_base); +GM_Helmet_Glasses(gm_ge_headgear_m92_cover_glasses_oli,gm_ge_headgear_m92_cover_glasses_base); +GM_Helmet_Glasses(gm_ge_headgear_m92_cover_glasses_blk,gm_ge_headgear_m92_cover_glasses_base); -GM_Helmet_Glasses(gm_ge_headgear_m92_glasses_trp,gm_ge_headgear_m92_trp,gm_ge_headgear_m92_glasses_base,gm_ge_headgear_m92_base,gm_ge_facewear_dustglasses); -GM_Helmet_Glasses(gm_ge_headgear_m92_glasses_flk,gm_ge_headgear_m92_flk,gm_ge_headgear_m92_glasses_base,gm_ge_headgear_m92_base,gm_ge_facewear_dustglasses); +GM_Helmet_Glasses(gm_ge_headgear_m92_glasses_trp,gm_ge_headgear_m92_glasses_base); +GM_Helmet_Glasses(gm_ge_headgear_m92_glasses_flk,gm_ge_headgear_m92_glasses_base); class gm_headgear_armored_base; @@ -76,7 +29,7 @@ class gm_ge_headgear_m38_72_base; class gm_ge_headgear_m38_72_goggles_base: gm_headgear_armored_base { class ItemInfo; }; -GM_Helmet_Glasses(gm_ge_bgs_headgear_m38_72_goggles_bgr,gm_ge_bgs_headgear_m38_72_bgr,gm_ge_headgear_m38_72_goggles_base,gm_ge_headgear_m38_72_base,gm_ge_facewear_acidgoggles); +GM_Helmet_Glasses(gm_ge_bgs_headgear_m38_72_goggles_bgr,gm_ge_headgear_m38_72_goggles_base); // Caps with M62 Helmets // Base Classes @@ -90,41 +43,10 @@ class gm_ge_headgear_sidecap_80_base: gm_ge_headgear_sidecap_base { class ItemInfo; }; -// Helmet Only -class gm_ge_headgear_m62_base; -class gm_ge_headgear_m62_net: gm_ge_headgear_m62_base { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = {"gm_ge_headgear_hgm_ge_headgear_sidecap_80_m62_oliat_80_oli", "gm_ge_headgear_hat_80_m62_oli"}; - components[] = {"gm_ge_headgear_m62_net"}; - }; -}; - -// Hats only -class gm_ge_headgear_hat_80_oli: gm_ge_headgear_hat_80_base { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = {"gm_ge_headgear_hat_80_m62_oli"}; - components[] = {"gm_ge_headgear_hat_80_oli"}; - }; -}; -class gm_ge_headgear_sidecap_80_oli: gm_ge_headgear_sidecap_80_base { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = {"gm_ge_headgear_sidecap_80_m62_oli"}; - components[] = {"gm_ge_headgear_sidecap_80_oli"}; - }; -}; - // Hats + Helmets class gm_ge_headgear_hat_80_m62_oli: gm_ge_headgear_hat_80_base { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = {"gm_ge_headgear_hat_80_oli","gm_ge_headgear_m62_net"}; - components[] = {"gm_ge_headgear_hat_80_oli","gm_ge_headgear_m62_net"}; - }; MASS(20); }; class gm_ge_headgear_sidecap_80_m62_oli: gm_ge_headgear_sidecap_80_base { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = {"gm_ge_headgear_sidecap_80_oli","gm_ge_headgear_m62_net"}; - components[] = {"gm_ge_headgear_sidecap_80_oli","gm_ge_headgear_m62_net"}; - }; MASS(20); }; diff --git a/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp b/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp deleted file mode 100644 index 6a548d214e6..00000000000 --- a/addons/compat_gm/compat_gm_wardrobe/Uniforms.hpp +++ /dev/null @@ -1,214 +0,0 @@ -// CfgWeapons - -// Sleeves - -class gm_ge_bgs_uniform_special_80_base; -class gm_ge_bgs_uniform_special_rolled_80_base; - -class gm_ge_bgs_uniform_special_80_grn: gm_ge_bgs_uniform_special_80_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { "gm_ge_bgs_uniform_special_rolled_80_grn" }; - }; -}; -class gm_ge_bgs_uniform_special_rolled_80_grn: gm_ge_bgs_uniform_special_rolled_80_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { "gm_ge_bgs_uniform_special_80_grn" }; - }; -}; - -class gm_ge_bgs_uniform_special_80_blk: gm_ge_bgs_uniform_special_80_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { "gm_ge_bgs_uniform_special_rolled_80_blk" }; - }; -}; -class gm_ge_bgs_uniform_special_rolled_80_blk: gm_ge_bgs_uniform_special_rolled_80_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { "gm_ge_bgs_uniform_special_80_blk" }; - }; -}; - - -class gm_ge_army_uniform_pilot_base; -class gm_ge_army_uniform_pilot_rolled_base; - -class gm_ge_army_uniform_pilot_sar: gm_ge_army_uniform_pilot_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { "gm_ge_army_uniform_pilot_rolled_sar" }; - }; -}; -class gm_ge_army_uniform_pilot_rolled_sar: gm_ge_army_uniform_pilot_rolled_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { "gm_ge_army_uniform_pilot_sar" }; - }; -}; - -class gm_ge_army_uniform_pilot_oli: gm_ge_army_uniform_pilot_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { "gm_ge_army_uniform_pilot_oli" }; - }; -}; -class gm_ge_army_uniform_pilot_rolled_oli: gm_ge_army_uniform_pilot_rolled_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { "gm_ge_army_uniform_pilot_rolled_oli" }; - }; -}; - -class gm_ge_pol_uniform_pilot_grn: gm_ge_army_uniform_pilot_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { "gm_ge_pol_uniform_pilot_rolled_grn" }; - }; -}; -class gm_ge_pol_uniform_pilot_rolled_grn: gm_ge_army_uniform_pilot_rolled_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { "gm_ge_pol_uniform_pilot_grn" }; - }; -}; - -class gm_ge_uniform_pilot_commando_base; -class gm_ge_uniform_pilot_commando_rolled_base; - -class gm_ge_uniform_pilot_commando_oli: gm_ge_uniform_pilot_commando_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { "gm_ge_uniform_pilot_commando_rolled_oli" }; - }; -}; -class gm_ge_uniform_pilot_commando_rolled_oli: gm_ge_uniform_pilot_commando_rolled_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { "gm_ge_uniform_pilot_commando_oli" }; - }; -}; - -class gm_ge_uniform_pilot_commando_gry: gm_ge_uniform_pilot_commando_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { "gm_ge_uniform_pilot_commando_rolled_gry" }; - }; -}; -class gm_ge_uniform_pilot_commando_rolled_gry: gm_ge_uniform_pilot_commando_rolled_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { "gm_ge_uniform_pilot_commando_gry" }; - }; -}; - -class gm_ge_uniform_pilot_commando_blk: gm_ge_uniform_pilot_commando_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { "gm_ge_uniform_pilot_commando_rolled_blk" }; - }; -}; -class gm_ge_uniform_pilot_commando_rolled_blk: gm_ge_uniform_pilot_commando_rolled_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { "gm_ge_uniform_pilot_commando_blk" }; - }; -}; - -class gm_pl_uniform_soldier_80_base; - -class gm_pl_army_uniform_soldier_80_frog: gm_pl_uniform_soldier_80_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { "gm_pl_army_uniform_soldier_rolled_80_frog" }; - }; -}; -class gm_pl_army_uniform_soldier_rolled_80_frog: gm_pl_uniform_soldier_80_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { "gm_pl_army_uniform_soldier_80_frog" }; - }; -}; - -class gm_pl_army_uniform_soldier_80_moro: gm_pl_uniform_soldier_80_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { "gm_pl_army_uniform_soldier_rolled_80_moro" }; - }; -}; -class gm_pl_army_uniform_soldier_rolled_80_moro: gm_pl_uniform_soldier_80_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { "gm_pl_army_uniform_soldier_80_moro" }; - }; -}; - - -class gm_ge_uniform_soldier_90_base; - -class gm_ge_uniform_soldier_90_trp: gm_ge_uniform_soldier_90_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { "gm_ge_uniform_soldier_rolled_90_trp" }; - }; -}; -class gm_ge_uniform_soldier_rolled_90_trp: gm_ge_uniform_soldier_90_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { "gm_ge_uniform_soldier_90_trp" }; - }; -}; - -class gm_ge_uniform_soldier_90_flk: gm_ge_uniform_soldier_90_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) { - modifiableTo[] = { "gm_ge_uniform_soldier_rolled_90_flk" }; - }; -}; -class gm_ge_uniform_soldier_rolled_90_flk: gm_ge_uniform_soldier_90_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { "gm_ge_uniform_soldier_90_flk" }; - }; -}; - - -// Gloves - -class gm_gc_uniform_soldier_80_base; -class gm_gc_army_uniform_soldier_gloves_80_str: gm_gc_uniform_soldier_80_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_gloves_on) { - modifiableTo[] = { "gm_gc_army_uniform_soldier_80_str" }; - }; -}; -class gm_gc_army_uniform_soldier_80_str: gm_gc_uniform_soldier_80_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_gloves_off) { - modifiableTo[] = { "gm_gc_army_uniform_soldier_gloves_80_str" }; - }; -}; - -class gm_ge_uniform_soldier_80_base; -class gm_ge_army_uniform_soldier_gloves_80_ols: gm_ge_uniform_soldier_80_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_gloves_on) { - modifiableTo[] = { "gm_ge_army_uniform_soldier_80_ols" }; - }; -}; -class gm_ge_army_uniform_soldier_80_ols: gm_ge_uniform_soldier_80_base { - class ace_wardrobe: EGVAR(wardrobe,base_U_gloves_off) { - modifiableTo[] = { "gm_ge_army_uniform_soldier_gloves_80_ols" }; - }; -}; - - -// Mixed case -> Base Interaction -class gm_ge_army_uniform_soldier_bdu_80_wdl; -class gm_ge_army_uniform_soldier_bdu_rolled_80_wdl; - -class gm_xx_uniform_soldier_bdu_80_wdl: gm_ge_army_uniform_soldier_bdu_80_wdl { - class ace_wardrobe: EGVAR(wardrobe,base_U_gloves_on) { - modifiableTo[] = { "gm_xx_uniform_soldier_bdu_rolled_80_wdl", "gm_xx_uniform_soldier_bdu_nogloves_80_wdl" }; - }; -}; -class gm_xx_uniform_soldier_bdu_rolled_80_wdl: gm_ge_army_uniform_soldier_bdu_rolled_80_wdl { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { "gm_xx_uniform_soldier_bdu_80_wdl", "gm_xx_uniform_soldier_bdu_nogloves_80_wdl" }; - }; -}; -class gm_xx_uniform_soldier_bdu_nogloves_80_wdl: gm_ge_army_uniform_soldier_bdu_80_wdl { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "gm_xx_uniform_soldier_bdu_80_wdl", "gm_xx_uniform_soldier_bdu_rolled_80_wdl" }; - }; -}; - -class gm_xx_uniform_soldier_bdu_80_oli: gm_ge_army_uniform_soldier_bdu_80_wdl { - class ace_wardrobe: EGVAR(wardrobe,base_U_gloves_on) { - modifiableTo[] = { "gm_xx_uniform_soldier_bdu_rolled_80_oli", "gm_xx_uniform_soldier_bdu_nogloves_80_oli" }; - }; -}; -class gm_xx_uniform_soldier_bdu_rolled_80_oli: gm_ge_army_uniform_soldier_bdu_rolled_80_wdl { - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) { - modifiableTo[] = { "gm_xx_uniform_soldier_bdu_80_oli", "gm_xx_uniform_soldier_bdu_nogloves_80_oli" }; - }; -}; -class gm_xx_uniform_soldier_bdu_nogloves_80_oli: gm_ge_army_uniform_soldier_bdu_80_wdl { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "gm_xx_uniform_soldier_bdu_80_oli", "gm_xx_uniform_soldier_bdu_rolled_80_oli" }; - }; -}; From 22e82cf19fcf5f5324cf09ecc2ec243eb232fa86 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 5 May 2025 20:54:41 +0200 Subject: [PATCH 160/305] include BaseClasses_Import.hpp + a bit of cleanup and a new base class (mask on/off) --- .../compat_gm_wardrobe/CfgWardrobe.hpp | 15 +-------------- .../compat_rf_wardrobe/CfgWardrobe.hpp | 8 +------- .../compat_sog_wardrobe/CfgWardrobe.hpp | 15 +-------------- .../compat_ws_wardrobe/CfgWardrobe.hpp | 4 +--- addons/wardrobe/BaseClasses.hpp | 12 ++++++++++++ addons/wardrobe/BaseClasses_Import.hpp | 19 +++++++++++++++++++ addons/wardrobe/CfgWardrobe.hpp | 9 --------- addons/wardrobe/script_macros_wardrobe.hpp | 10 ++++++++-- 8 files changed, 43 insertions(+), 49 deletions(-) create mode 100644 addons/wardrobe/BaseClasses_Import.hpp diff --git a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp index f9bd2deb47f..0e98a40c0e8 100644 --- a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp @@ -1,17 +1,4 @@ -// Import Base Classes -class EGVAR(wardrobe,base); - -class EGVAR(wardrobe,base_H_visor_up); -class EGVAR(wardrobe,base_H_visor_down); - -class EGVAR(wardrobe,base_U_sleeves_up); -class EGVAR(wardrobe,base_U_sleeves_down); - -class EGVAR(wardrobe,base_U_gloves_on); -class EGVAR(wardrobe,base_U_gloves_off); - -class EGVAR(wardrobe,base_H_goggles_on); -class EGVAR(wardrobe,base_H_goggles_off); +#include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" // Adjust Mass of Objects for consistency's sake class CfgWeapons { diff --git a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp index 10ae7cb65aa..dffb6077722 100644 --- a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp @@ -1,10 +1,4 @@ -class EGVAR(wardrobe,base); -class EGVAR(wardrobe,base_U_sleeves_up); -class EGVAR(wardrobe,base_U_sleeves_down); -class EGVAR(wardrobe,base_U_jacket_open); -class EGVAR(wardrobe,base_U_jacket_closed); -class EGVAR(wardrobe,base_H_visor_up); -class EGVAR(wardrobe,base_H_visor_down); +#include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" class CfgWeapons { diff --git a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp index 0c7ea554e95..d51c32999ba 100644 --- a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp @@ -1,17 +1,4 @@ - - -class EGVAR(wardrobe,base); - -class EGVAR(wardrobe,base_H_visor_up); -class EGVAR(wardrobe,base_H_visor_down); - -class EGVAR(wardrobe,base_U_sleeves_up); -class EGVAR(wardrobe,base_U_sleeves_down); - -class EGVAR(wardrobe,base_H_goggles_on); -class EGVAR(wardrobe,base_H_goggles_off); - - +#include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" class CfgWeapons { // Base Classes diff --git a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp index bab07ff8f04..f4e624d31db 100644 --- a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp @@ -1,6 +1,4 @@ -class EGVAR(wardrobe,base); -class EGVAR(wardrobe,base_H_goggles_on); -class EGVAR(wardrobe,base_H_goggles_off); +#include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" class CfgGlasses { diff --git a/addons/wardrobe/BaseClasses.hpp b/addons/wardrobe/BaseClasses.hpp index 5656285ac77..bfd780566a4 100644 --- a/addons/wardrobe/BaseClasses.hpp +++ b/addons/wardrobe/BaseClasses.hpp @@ -80,3 +80,15 @@ class GVAR(base_H_goggles_off): GVAR(base) { gesture ="GestureWipeFace"; alternativeDisplayName = CSTRING(gogglesOff); }; + + +// Common Base Class for Headgear with a Mask on and Mask Off variant +class GVAR(base_H_mask_on): GVAR(base) { + gesture ="GestureWipeFace"; + alternativeDisplayName = CSTRING(maskOn); +}; + +class GVAR(base_H_mask_off): GVAR(base) { + gesture ="GestureWipeFace"; + alternativeDisplayName = CSTRING(maskOff); +}; diff --git a/addons/wardrobe/BaseClasses_Import.hpp b/addons/wardrobe/BaseClasses_Import.hpp new file mode 100644 index 00000000000..aeae84bdeff --- /dev/null +++ b/addons/wardrobe/BaseClasses_Import.hpp @@ -0,0 +1,19 @@ +class EGVAR(wardrobe,base); + +class EGVAR(wardrobe,base_H_visor_up); +class EGVAR(wardrobe,base_H_visor_down); + +class EGVAR(wardrobe,base_H_goggles_on); +class EGVAR(wardrobe,base_H_goggles_off); + +class EGVAR(wardrobe,base_H_mask_on); +class EGVAR(wardrobe,base_H_mask_off); + +class EGVAR(wardrobe,base_U_sleeves_up); +class EGVAR(wardrobe,base_U_sleeves_down); + +class EGVAR(wardrobe,base_U_gloves_on); +class EGVAR(wardrobe,base_U_gloves_off); + +class EGVAR(wardrobe,base_U_jacket_open); +class EGVAR(wardrobe,base_U_jacket_closed); diff --git a/addons/wardrobe/CfgWardrobe.hpp b/addons/wardrobe/CfgWardrobe.hpp index 60d0043d513..fc56b8dfcb9 100644 --- a/addons/wardrobe/CfgWardrobe.hpp +++ b/addons/wardrobe/CfgWardrobe.hpp @@ -1,12 +1,3 @@ - -/* -class CfgGlasses { - #include "Facewear.hpp" -}; -*/ - -// The new way :sigh: - class ADDON { #include "BaseClasses.hpp" #include "Uniforms.hpp" diff --git a/addons/wardrobe/script_macros_wardrobe.hpp b/addons/wardrobe/script_macros_wardrobe.hpp index dc51db354d6..d5c5f8d646f 100644 --- a/addons/wardrobe/script_macros_wardrobe.hpp +++ b/addons/wardrobe/script_macros_wardrobe.hpp @@ -64,7 +64,10 @@ class Variant2: Variant2Base {\ } -// Basic +// Basic Setups without the use of Components +#define BASE_PAIR(variant1,variant2)\ +BASIC(variant1,variant2,EGVAR(wardrobe,base),EGVAR(wardrobe,base)) + #define UNIFORM_SLEEVES(variantSleevesDown,variantSleevesUp)\ BASIC(variantSleevesDown,variantSleevesUp,EGVAR(wardrobe,base_U_sleeves_down),EGVAR(wardrobe,base_U_sleeves_up)) @@ -77,7 +80,10 @@ BASIC(variantJacketOpen,variantJacketClosed,EGVAR(wardrobe,base_U_jacket_open),E #define HELMET_VISOR(variantVisorUp,variantVisorDown)\ BASIC(variantVisorUp,variantVisorDown,EGVAR(wardrobe,base_H_visor_up),EGVAR(wardrobe,base_H_visor_down)) -// Basic Component +#define HELMET_MASK(variantMaskOn,variantMaskOff)\ +BASIC(variantMaskOn,variantMaskOff,EGVAR(wardrobe,base_H_mask_on),EGVAR(wardrobe,base_H_mask_off)) + +// Basic Setups with the use of Component #define HELMET_GOGGLES(variantGogglesOn,variantGogglesOff,component)\ BASIC_COMPONENT(variantGogglesOn,variantGogglesOff,EGVAR(wardrobe,base_H_goggles_on),EGVAR(wardrobe,base_H_goggles_off),component) From c08767a20a9b35db502b7a42db6f3435f7748b34 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 5 May 2025 23:09:41 +0200 Subject: [PATCH 161/305] fix base class import --- addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp | 8 ++++---- addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp | 7 +++++-- addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp | 9 ++++++--- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp index 0e98a40c0e8..8c5ab2b9cca 100644 --- a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp @@ -1,5 +1,3 @@ -#include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" - // Adjust Mass of Objects for consistency's sake class CfgWeapons { #include "Helmets.hpp" @@ -7,6 +5,8 @@ class CfgWeapons { // Actual CfgWardrobe Compat class ace_wardrobe { - #include "CfgWardrobe_Helmets.hpp" - #include "CfgWardrobe_Uniform.hpp" + #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" + + #include "CfgWardrobe_Helmets.hpp" + #include "CfgWardrobe_Uniform.hpp" }; \ No newline at end of file diff --git a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp index dffb6077722..c8095ce0ec9 100644 --- a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp @@ -1,5 +1,4 @@ -#include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" - +/* class CfgWeapons { //// Helmets @@ -108,3 +107,7 @@ class CfgWeapons }; }; }; +*/ +class ace_wardrobe { + #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" +}; \ No newline at end of file diff --git a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp index f4e624d31db..fb8d90bc90c 100644 --- a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp @@ -1,6 +1,4 @@ -#include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" - - +/* class CfgGlasses { class G_Combat; class G_Combat_lxWS: G_Combat { @@ -88,3 +86,8 @@ class CfgWeapons { }; }; }; +*/ +class ace_wardrobe { + #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" + +}; \ No newline at end of file From c98dccd947d47317523b217e16f2eb7484046dfa Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 5 May 2025 23:12:59 +0200 Subject: [PATCH 162/305] sog compat --- .../compat_sog_wardrobe/Booniehats.hpp | 112 ------------ .../compat_sog_wardrobe/CfgWardrobe.hpp | 24 ++- .../CfgWardrobe_Booniehats.hpp | 151 ++++++++++++++++ .../CfgWardrobe_Facewear.hpp | 64 +++++++ .../CfgWardrobe_Helmets.hpp | 166 ++++++++++++++++++ .../CfgWardrobe_Uniforms_B.hpp | 54 ++++++ .../CfgWardrobe_Uniforms_O.hpp | 78 ++++++++ .../compat_sog_wardrobe/Facewear.hpp | 101 +---------- .../compat_sog_wardrobe/Helmets.hpp | 141 +-------------- .../compat_sog_wardrobe/Uniforms_B.hpp | 54 +----- .../compat_sog_wardrobe/Uniforms_O.hpp | 117 +++--------- 11 files changed, 560 insertions(+), 502 deletions(-) delete mode 100644 addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp create mode 100644 addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Booniehats.hpp create mode 100644 addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Facewear.hpp create mode 100644 addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Helmets.hpp create mode 100644 addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Uniforms_B.hpp create mode 100644 addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Uniforms_O.hpp diff --git a/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp b/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp deleted file mode 100644 index 9cc5a49843c..00000000000 --- a/addons/compat_sog/compat_sog_wardrobe/Booniehats.hpp +++ /dev/null @@ -1,112 +0,0 @@ -// CfgWeapons - -// Variations -// 01 sides up 02 normal 03 front up 04 l side up 05 r side up -// 06-08 anzac -// 09 rebel - not compatible -//Colors -// 01 green 02 tiger 03 black 04 spray 05 tiger green 06 erdl brown 07 leopard 08 erdl -// 09 gray <- Fuck this - inheritance is fucking horrible as fuck. - - -// Macros -#define CN(variation,color) vn_b_boonie_##variation##_##color -#define QCN(variation,color) QUOTE(CN(variation,color)) - -// Base Boonie -#define CAMO_BASE 01 - -class CN(02,CAMO_BASE): vn_b_headgear_base { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { QCN(01,CAMO_BASE), QCN(03,CAMO_BASE), QCN(04,CAMO_BASE), QCN(05,CAMO_BASE) }; - }; -}; -class CN(01,CAMO_BASE): CN(02,CAMO_BASE) { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { QCN(02,CAMO_BASE), QCN(03,CAMO_BASE), QCN(04,CAMO_BASE), QCN(05,CAMO_BASE) }; - }; -}; -class CN(03,CAMO_BASE): CN(02,CAMO_BASE) { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { QCN(01,CAMO_BASE), QCN(02,CAMO_BASE), QCN(04,CAMO_BASE), QCN(05,CAMO_BASE) }; - }; -}; -class CN(04,CAMO_BASE): CN(02,CAMO_BASE) { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { QCN(01,CAMO_BASE), QCN(02,CAMO_BASE), QCN(03,CAMO_BASE), QCN(05,CAMO_BASE) }; - }; -}; -class CN(05,CAMO_BASE): CN(02,CAMO_BASE) { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { QCN(01,CAMO_BASE), QCN(02,CAMO_BASE), QCN(03,CAMO_BASE), QCN(04,CAMO_BASE) }; - }; -}; - - -#define CN_COLORS(CAMO)\ -class CN(02,CAMO): CN(02,01) {\ - class ace_wardrobe: EGVAR(wardrobe,base) {\ - modifiableTo[] = { QCN(01,CAMO), QCN(03,CAMO), QCN(04,CAMO), QCN(05,CAMO) };\ - };\ -};\ -class CN(01,CAMO): CN(02,CAMO) {\ - class ace_wardrobe: EGVAR(wardrobe,base) {\ - modifiableTo[] = { QCN(02,CAMO), QCN(03,CAMO), QCN(04,CAMO), QCN(05,CAMO) };\ - };\ -};\ -class CN(03,CAMO): CN(02,CAMO) {\ - class ace_wardrobe: EGVAR(wardrobe,base) {\ - modifiableTo[] = { QCN(01,CAMO), QCN(02,CAMO), QCN(04,CAMO), QCN(05,CAMO) };\ - };\ -};\ -class CN(04,CAMO): CN(02,CAMO) {\ - class ace_wardrobe: EGVAR(wardrobe,base) {\ - modifiableTo[] = { QCN(01,CAMO), QCN(02,CAMO), QCN(03,CAMO), QCN(05,CAMO) };\ - };\ -};\ -class CN(05,CAMO): CN(02,CAMO) {\ - class ace_wardrobe: EGVAR(wardrobe,base) {\ - modifiableTo[] = { QCN(01,CAMO), QCN(02,CAMO), QCN(03,CAMO), QCN(04,CAMO) };\ - };\ -} - -CN_COLORS(02); -CN_COLORS(03); -CN_COLORS(04); -CN_COLORS(05); - - -// Base classes in CfgWeapons.hpp -// 06-08 anzac - -class CN(06,01): CN(02,01) { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { QCN(07,01), QCN(08,01) }; - }; -}; -class CN(07,01): CN(06,01) { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { QCN(06,VAR), QCN(08,01) }; - }; -}; -class CN(08,01): CN(06,01) { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { QCN(06,01), QCN(07,01) }; - }; -}; - -class CN(06,02): CN(06,01) { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { QCN(07,02), QCN(08,02) }; - }; -}; -class CN(07,02): CN(06,01) { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { QCN(06,02), QCN(08,02) }; - }; -}; -class CN(08,02): CN(06,01) { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { QCN(06,02), QCN(07,02) }; - }; -}; diff --git a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp index d51c32999ba..a90cef6a5f0 100644 --- a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp @@ -1,5 +1,5 @@ -#include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" +// Adjust Mass of Objects for consistency's sake class CfgWeapons { // Base Classes class H_Booniehat_khk; @@ -7,15 +7,23 @@ class CfgWeapons { class vn_o_headgear_base: H_Booniehat_khk { class ItemInfo; }; - - #include "Helmets.hpp" - #include "Booniehats.hpp" #include "Uniforms_B.hpp" - #include "Uniforms_O.hpp" + // #include "Uniforms_O.hpp" // ToDo }; - - class CfgGlasses { #include "Facewear.hpp" -}; \ No newline at end of file +}; + + +// Actual CfgWardrobe Compat +class ace_wardrobe { + #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" + + #include "CfgWardrobe_Booniehats.hpp" + #include "CfgWardrobe_Facewear.hpp" + #include "CfgWardrobe_Helmets.hpp" + + #include "CfgWardrobe_Uniforms_B.hpp" + #include "CfgWardrobe_Uniforms_O.hpp" +}; diff --git a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Booniehats.hpp b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Booniehats.hpp new file mode 100644 index 00000000000..d7b0c52496a --- /dev/null +++ b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Booniehats.hpp @@ -0,0 +1,151 @@ +// CfgWeapons + +// Variations +// 01 sides up 02 normal 03 front up 04 l side up 05 r side up +// 06-08 anzac +// 09 rebel - not compatible +//Colors +// 01 green 02 tiger 03 black 04 spray 05 tiger green 06 erdl brown 07 leopard 08 erdl +// 09 gray <- Fuck this - inheritance is fucking horrible as fuck. + + +// Macros +#define CN(variation,color) vn_b_boonie_##variation##_##color + +// Base Boonie +#define CAMO_BASE 01 + +class CN(02,CAMO_BASE): EGVAR(wardrobe,base) { + class modifiableTo { + class CN(01,CAMO_BASE); + class CN(03,CAMO_BASE); + class CN(04,CAMO_BASE); + class CN(05,CAMO_BASE); + }; +}; + +class CN(01,CAMO_BASE): EGVAR(wardrobe,base) { + class modifiableTo { + class CN(02,CAMO_BASE); + class CN(03,CAMO_BASE); + class CN(04,CAMO_BASE); + class CN(05,CAMO_BASE); + }; +}; + +class CN(03,CAMO_BASE): EGVAR(wardrobe,base) { + class modifiableTo { + class CN(01,CAMO_BASE); + class CN(02,CAMO_BASE); + class CN(04,CAMO_BASE); + class CN(05,CAMO_BASE); + }; +}; +class CN(04,CAMO_BASE): EGVAR(wardrobe,base) { + class modifiableTo { + class CN(01,CAMO_BASE); + class CN(02,CAMO_BASE); + class CN(03,CAMO_BASE); + class CN(05,CAMO_BASE); + }; +}; +class CN(05,CAMO_BASE): EGVAR(wardrobe,base) { + class modifiableTo { + class CN(01,CAMO_BASE); + class CN(02,CAMO_BASE); + class CN(03,CAMO_BASE); + class CN(04,CAMO_BASE); + }; +}; + + + +#define CN_COLORS(CAMO)\ +class CN(02,CAMO): EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class CN(01,CAMO);\ + class CN(03,CAMO);\ + class CN(04,CAMO);\ + class CN(05,CAMO);\ + };\ +};\ +class CN(01,CAMO): EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class CN(02,CAMO);\ + class CN(03,CAMO);\ + class CN(04,CAMO);\ + class CN(05,CAMO);\ + };\ +};\ +class CN(03,CAMO): EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class CN(01,CAMO);\ + class CN(02,CAMO);\ + class CN(04,CAMO);\ + class CN(05,CAMO);\ + };\ +};\ +class CN(04,CAMO): EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class CN(01,CAMO);\ + class CN(02,CAMO);\ + class CN(03,CAMO);\ + class CN(05,CAMO);\ + };\ +};\ +class CN(05,CAMO): EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class CN(01,CAMO);\ + class CN(02,CAMO);\ + class CN(03,CAMO);\ + class CN(04,CAMO);\ + };\ +} + + +CN_COLORS(02); +CN_COLORS(03); +CN_COLORS(04); +CN_COLORS(05); + + +// Base classes in CfgWeapons.hpp +// 06-08 anzac + +class CN(06,01): EGVAR(wardrobe,base) { + class modifiableTo { + class CN(07,01); + class CN(08,01); + }; +}; +class CN(07,01): EGVAR(wardrobe,base) { + class modifiableTo { + class CN(06,VAR); + class CN(08,01); + }; +}; +class CN(08,01): EGVAR(wardrobe,base) { + class modifiableTo { + class CN(06,01); + class CN(07,01); + }; +}; + +class CN(06,02): EGVAR(wardrobe,base) { + class modifiableTo { + class CN(07,02); + class CN(08,02); + }; +}; +class CN(07,02): EGVAR(wardrobe,base) { + class modifiableTo { + class CN(06,02); + class CN(08,02); + }; +}; +class CN(08,02): EGVAR(wardrobe,base) { + class modifiableTo { + class CN(06,02); + class CN(07,02); + }; +}; \ No newline at end of file diff --git a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Facewear.hpp b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Facewear.hpp new file mode 100644 index 00000000000..7a50301d1f2 --- /dev/null +++ b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Facewear.hpp @@ -0,0 +1,64 @@ +BASE_PAIR(vn_b_acc_rag_01,vn_b_acc_rag_02); +BASE_PAIR(vn_b_acc_towel_01,vn_b_acc_towel_02); + +HELMET_MASK(vn_b_acc_ms22001_01,vn_b_acc_ms22001_02); + + +// 2 Bandana Variants with same Aviators +class vn_b_aviator: EGVAR(wardrobe,base) { + class modifiableTo { + class vn_b_bandana_a; + }; + components[] = {"vn_b_aviator"}; +}; +class vn_o_bandana_b: EGVAR(wardrobe,base) { + class modifiableTo { + class vn_b_bandana_a; + }; + components[] = {"vn_o_bandana_b"}; +}; +class vn_b_bandana_a: EGVAR(wardrobe,base) { + class modifiableTo { + class vn_b_aviator; + class vn_o_bandana_b; + }; + components[] = {"vn_b_aviator", "vn_o_bandana_b"}; +}; + + +// Glasses used by Helmets +// US Combat Goggles, used by vn_b_helmet_m1_20_01 & vn_b_helmet_m1_20_02 +class vn_b_acc_goggles_01: EGVAR(wardrobe,base) { + components[] = {"vn_b_acc_goggles_01"}; +}; + +// VN Pilot Glasses + Mask +// Pilot Mask +class vn_o_acc_km32_01: EGVAR(wardrobe,base) { + class modifiableTo { + class vn_o_acc_goggles_03; + }; + components[] = {"vn_o_acc_km32_01"}; +}; + +// VN Crew Goggles +class vn_o_acc_goggles_01: EGVAR(wardrobe,base) { + components[] = {"vn_o_acc_goggles_01"}; +}; + +// Goggles +class vn_o_acc_goggles_02: EGVAR(wardrobe,base) { + class modifiableTo { + class vn_o_acc_goggles_03; + }; + components[] = {"vn_o_acc_goggles_02"}; +}; + +// Goggles with Mask +class vn_o_acc_goggles_03: EGVAR(wardrobe,base) { + class modifiableTo { + class vn_o_acc_km32_01; + class vn_o_acc_goggles_02; + }; + components[] = { "vn_o_acc_km32_01", "vn_o_acc_goggles_02"}; +}; diff --git a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Helmets.hpp b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Helmets.hpp new file mode 100644 index 00000000000..5c227d70e85 --- /dev/null +++ b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Helmets.hpp @@ -0,0 +1,166 @@ +// CfgWeapons + + +// Macros +#define CN01(side,var1,var2) vn_##side##_helmet_##var1##_01_##var2 +#define CN02(side,var1,var2) vn_##side##_helmet_##var1##_02_##var2 + + +#define HELMET_VARIANT(side,var1,var2)\ +class CN01(side,var1,var2): EGVAR(wardrobe,base_H_visor_up) {\ + class modifiableTo {\ + class CN02(side,var1,var2);\ + };\ +};\ +class CN02(side,var1,var2): EGVAR(wardrobe,base_H_visor_down) {\ + class modifiableTo {\ + class CN01(side,var1,var2);\ + };\ +} + + +// Parent Version aph6 & svh4 +#define base_class_up vn_b_headgear_base +#define base_class_dn vn_b_headgear_base +HELMET_VARIANT(b,aph6,01); +HELMET_VARIANT(b,svh4,01); + +// Child Version aph6 +#undef base_class_up +#undef base_class_dn +#define base_class_up CN01(b,aph6,01) +#define base_class_dn CN02(b,aph6,01) + +HELMET_VARIANT(b,aph6,02); +HELMET_VARIANT(b,aph6,03); +HELMET_VARIANT(b,aph6,04); +HELMET_VARIANT(b,aph6,05); + +// Child Version svh4 +#undef base_class_up +#undef base_class_dn +#define base_class_up CN01(b,svh4,01) +#define base_class_dn CN02(b,svh4,01) + +HELMET_VARIANT(b,svh4,02); +HELMET_VARIANT(b,svh4,03); +HELMET_VARIANT(b,svh4,04); +HELMET_VARIANT(b,svh4,05); +HELMET_VARIANT(b,svh4,06); + +#undef base_class_up +#undef base_class_dn + + +// Special Case zsh3 +HELMET_VISOR(vn_o_helmet_zsh3_01,vn_o_helmet_zsh3_02); + +// Helmets with/without Goggles +class vn_b_helmet_m1_14_01: EGVAR(wardrobe,base_H_goggles_off) { + class modifiableTo { + class vn_b_helmet_m1_20_01; + }; +}; + +class vn_b_helmet_m1_14_02: EGVAR(wardrobe,base_H_goggles_off) { + class modifiableTo { + class vn_b_helmet_m1_20_02; + }; +}; + +class vn_b_helmet_m1_20_01: EGVAR(wardrobe,base_H_goggles_on) { + class modifiableTo { + class vn_b_helmet_m1_14_01; + }; + components[] = {"vn_b_acc_goggles_01"}; +}; +class vn_b_helmet_m1_20_02: EGVAR(wardrobe,base_H_goggles_on) { + class modifiableTo { + class vn_b_helmet_m1_14_02; + }; + components[] = {"vn_b_acc_goggles_01"}; +}; + + +//// VN Pilot Helmet +// With Goggles +class vn_o_helmet_shl61_01: EGVAR(wardrobe,base_H_goggles_on) { + class modifiableTo { + class vn_o_helmet_shl61_02; + }; + components[] = {"vn_o_acc_goggles_02"}; +}; +// Without Goggles +class vn_o_helmet_shl61_02: EGVAR(wardrobe,base_H_goggles_off) { + class modifiableTo { + class vn_o_helmet_shl61_01; + }; +}; + + +// US Vic Crew Helmets +class vn_b_helmet_t56_01_01: EGVAR(wardrobe,base_H_goggles_off) { + class modifiableTo { + class vn_b_helmet_t56_02_01; + }; +}; + +class vn_b_helmet_t56_02_01: EGVAR(wardrobe,base_H_goggles_on) { + class modifiableTo { + class vn_b_helmet_t56_01_01; + }; + components[] = {"vn_b_acc_goggles_01"}; +}; + +class vn_b_helmet_t56_01_02: EGVAR(wardrobe,base_H_goggles_off) { + class modifiableTo { + class vn_b_helmet_t56_02_02; + }; +}; +class vn_b_helmet_t56_02_02: EGVAR(wardrobe,base_H_goggles_on) { + class modifiableTo { + class vn_b_helmet_t56_01_02; + }; + components[] = {"vn_b_acc_goggles_01"}; +}; + +class vn_b_helmet_t56_01_03: EGVAR(wardrobe,base_H_goggles_off) { + class modifiableTo { + class vn_b_helmet_t56_02_03; + }; +}; +class vn_b_helmet_t56_02_03: EGVAR(wardrobe,base_H_goggles_on) { + class modifiableTo { + class vn_b_helmet_t56_01_03; + }; + components[] = {"vn_b_acc_goggles_01"}; +}; + + +// VN Vic Crew Helmet // 1 with goggles +// vn_o_acc_goggles_01 +class vn_o_helmet_tsh3_01: EGVAR(wardrobe,base_H_goggles_on) { + class modifiableTo { + class vn_o_helmet_tsh3_02; + }; + components[] = {"vn_o_acc_goggles_01"}; +}; +class vn_o_helmet_tsh3_02: EGVAR(wardrobe,base_H_goggles_off) { + class modifiableTo { + class vn_o_helmet_tsh3_01; + }; +}; + +// VN Pith Helmet with Crew Goggles +class vn_o_helmet_nva_01: EGVAR(wardrobe,base_H_goggles_off) { + class modifiableTo { + class vn_o_helmet_nva_05; + }; +}; +class ItemInfo; +class vn_o_helmet_nva_05: EGVAR(wardrobe,base_H_goggles_on) { + class modifiableTo { + class vn_o_helmet_nva_01; + }; + components[] = {"vn_o_acc_goggles_02"}; +}; diff --git a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Uniforms_B.hpp b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Uniforms_B.hpp new file mode 100644 index 00000000000..328776d5bb3 --- /dev/null +++ b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Uniforms_B.hpp @@ -0,0 +1,54 @@ +// #define B_U(div,var,camo) vn_b_uniform_##div##_##var##_##camo +#define B_U_PAIR(div,down,up,camo) UNIFORM_SLEEVES(B_U(div,down,camo),B_U(div,up,camo)) + +// Simple Variants +// ACZAC +UNIFORM_SLEEVES(vn_b_uniform_aus_01_01,vn_b_uniform_aus_02_01); +UNIFORM_SLEEVES(vn_b_uniform_aus_03_01,vn_b_uniform_aus_04_01); +UNIFORM_SLEEVES(vn_b_uniform_aus_05_01,vn_b_uniform_aus_06_01); +UNIFORM_SLEEVES(vn_b_uniform_aus_07_01,vn_b_uniform_aus_08_01); +UNIFORM_SLEEVES(vn_b_uniform_aus_09_01,vn_b_uniform_aus_10_01); + +// NZ +UNIFORM_SLEEVES(vn_b_uniform_NZ_01_01,vn_b_uniform_NZ_02_01); +UNIFORM_SLEEVES(vn_b_uniform_NZ_03_01,vn_b_uniform_NZ_04_01); +UNIFORM_SLEEVES(vn_b_uniform_NZ_05_01,vn_b_uniform_NZ_06_01); + +// SEAL STUFF +UNIFORM_SLEEVES(vn_b_uniform_seal_01_01,vn_b_uniform_seal_02_01); +UNIFORM_SLEEVES(vn_b_uniform_seal_01_02,vn_b_uniform_seal_02_02); +UNIFORM_SLEEVES(vn_b_uniform_seal_01_05,vn_b_uniform_seal_02_05); +UNIFORM_SLEEVES(vn_b_uniform_seal_01_06,vn_b_uniform_seal_02_06); +UNIFORM_SLEEVES(vn_b_uniform_seal_01_07,vn_b_uniform_seal_02_07); + +// MACV +/* +// previously defined in Uniforms_B.hpp +#define OLIVE_FIELD 01 +#define TIGER 02 +#define TIGER_GREEN 05 +#define ERDL_BROWN 06 +#define OLIVE 07 +#define LEOPARD 08 +#define ERDL 15 +#define LIZARD 16 +#define BDQ 17 +#define FROG 18 +*/ + +// macv 05 and 04 are inconsistent: different uniform maxLoad. can cause loss of items when the uniform is filled. Difference is 1lb which translates to 16~17x ace bandages or 1x 1l blood +#undef B_U_PAIR_SET // previously defined in Uniforms_B.hpp +#define B_U_PAIR_SET(camo)\ +B_U_PAIR(macv,02,03,camo);\ +B_U_PAIR(macv,05,04,camo) + +B_U_PAIR_SET(OLIVE_FIELD); +B_U_PAIR_SET(TIGER); +B_U_PAIR_SET(TIGER_GREEN); +B_U_PAIR_SET(ERDL_BROWN); +B_U_PAIR_SET(OLIVE); +B_U_PAIR_SET(LEOPARD); +B_U_PAIR_SET(ERDL); +B_U_PAIR_SET(LIZARD); +B_U_PAIR_SET(BDQ); +B_U_PAIR_SET(FROG); diff --git a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Uniforms_O.hpp b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Uniforms_O.hpp new file mode 100644 index 00000000000..2aab3dda004 --- /dev/null +++ b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Uniforms_O.hpp @@ -0,0 +1,78 @@ +// NVA Sailors +UNIFORM_SLEEVES(vn_o_uniform_nva_navy_01,vn_o_uniform_nva_navy_03); +UNIFORM_SLEEVES(vn_o_uniform_nva_navy_02,vn_o_uniform_nva_navy_04); + +// NVA_Army_AA_BB +// brown: 01,02 03,04 | GREEN: 01..12 +#define BROWN 01 +#define BROWN_FIELD 02 +#define GREEN 03 +#define GREEN_FIELD 04 +#define O_U_NVA_ARMY(var,camo) vn_o_uniform_nva_army_##var##_##camo +#define O_U_NVA_ARMY_PAIR(down,up,camo) UNIFORM_SLEEVES(O_U_NVA_ARMY(down,camo),O_U_NVA_ARMY(up,camo)) + +O_U_NVA_ARMY_PAIR(01,02,BROWN); +O_U_NVA_ARMY_PAIR(03,04,BROWN); +O_U_NVA_ARMY_PAIR(01,02,BROWN_FIELD); +O_U_NVA_ARMY_PAIR(03,04,BROWN_FIELD); + +O_U_NVA_ARMY_PAIR(01,02,GREEN); +O_U_NVA_ARMY_PAIR(03,04,GREEN); +O_U_NVA_ARMY_PAIR(05,06,GREEN); +O_U_NVA_ARMY_PAIR(07,08,GREEN); +O_U_NVA_ARMY_PAIR(09,10,GREEN); +O_U_NVA_ARMY_PAIR(11,12,GREEN); +O_U_NVA_ARMY_PAIR(01,02,GREEN_FIELD); +O_U_NVA_ARMY_PAIR(03,04,GREEN_FIELD); +O_U_NVA_ARMY_PAIR(05,06,GREEN_FIELD); +O_U_NVA_ARMY_PAIR(07,08,GREEN_FIELD); +O_U_NVA_ARMY_PAIR(09,10,GREEN_FIELD); +O_U_NVA_ARMY_PAIR(11,12,GREEN_FIELD); + +// PL ARMY +#define DARK 11 +#define DARK_FIELD 12 +#define LIGHT 13 +#define LIGHT_FIELD 14 +#define O_U_PL_ARMY(var,camo) vn_o_uniform_pl_army_##var##_##camo +#define O_U_PL_ARMY_PAIR(down,up,camo) UNIFORM_SLEEVES(O_U_PL_ARMY(down,camo),O_U_PL_ARMY(up,camo)) + +O_U_PL_ARMY_PAIR(01,02,DARK); +O_U_PL_ARMY_PAIR(03,04,DARK); +O_U_PL_ARMY_PAIR(01,02,DARK_FIELD); +O_U_PL_ARMY_PAIR(03,04,DARK_FIELD); +O_U_PL_ARMY_PAIR(01,02,LIGHT); +O_U_PL_ARMY_PAIR(03,04,LIGHT); +O_U_PL_ARMY_PAIR(01,02,LIGHT_FIELD); +O_U_PL_ARMY_PAIR(03,04,LIGHT_FIELD); + + +#define O_U(div,var,camo) vn_o_uniform_##div##_##var##_##camo +#define O_U_PAIR(div,down,up,camo) UNIFORM_SLEEVES(O_U(div,down,camo),O_U(div,up,camo)) +// VC MF +#define VC_MF 07 +O_U_PAIR(vc_mf,01,02,VC_MF); +O_U_PAIR(vc_mf,03,04,VC_MF); +O_U_PAIR(vc_mf,09,10,VC_MF); +O_U_PAIR(vc_mf,11,12,VC_MF); + +// VC REG +O_U_PAIR(vc_reg,11,12,08); +O_U_PAIR(vc_reg,11,12,09); +O_U_PAIR(vc_reg,11,12,10); + +// VC BLACK 01 BLACK_WHITE 02 GREY_TAN 03 BLUE 04 WHITE_BLACK 05 BLUE_WHITE 06 BLUE_GREY 07 +O_U_PAIR(vc,01,02,01); +O_U_PAIR(vc,03,04,01); +O_U_PAIR(vc,01,02,02); +O_U_PAIR(vc,03,04,02); +O_U_PAIR(vc,01,02,03); +O_U_PAIR(vc,03,04,03); +O_U_PAIR(vc,01,02,04); +O_U_PAIR(vc,03,04,04); +O_U_PAIR(vc,01,02,05); +O_U_PAIR(vc,03,04,05); +O_U_PAIR(vc,01,02,06); +O_U_PAIR(vc,03,04,06); +O_U_PAIR(vc,01,02,07); +O_U_PAIR(vc,03,04,07); diff --git a/addons/compat_sog/compat_sog_wardrobe/Facewear.hpp b/addons/compat_sog/compat_sog_wardrobe/Facewear.hpp index a042b76cd65..5671aeca7d4 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Facewear.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Facewear.hpp @@ -1,104 +1,5 @@ -// Common Base -class vn_glasses_base; - - -// Scarf -class vn_b_acc_rag_01: vn_glasses_base { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "vn_b_acc_rag_02" }; - }; -}; -class vn_b_acc_rag_02: vn_b_acc_rag_01 { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "vn_b_acc_rag_01" }; - }; -}; - - -// Towel -class vn_b_acc_towel_01: vn_b_acc_rag_02 { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "vn_b_acc_towel_02" }; - }; -}; -class vn_b_acc_towel_02: vn_b_acc_towel_01 { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "vn_b_acc_towel_01" }; - }; -}; - - -// Pilot Air Mask -class vn_b_acc_ms22001_01: vn_glasses_base { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "vn_b_acc_ms22001_02" }; - alternativeDisplayName = ECSTRING(wardrobe,maskOn); - }; -}; -class vn_b_acc_ms22001_02: vn_b_acc_ms22001_01 { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "vn_b_acc_ms22001_01" }; - alternativeDisplayName = ECSTRING(wardrobe,maskOff); - }; -}; - -// Bandana + Aviators -class vn_b_aviator: vn_glasses_base { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "vn_b_bandana_a" }; - components[] = {"vn_b_aviator"}; - }; -}; - -class vn_o_bandana_b: vn_glasses_base { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "vn_b_bandana_a" }; - components[] = {"vn_o_bandana_b"}; - }; -}; - -class vn_b_bandana_a: vn_o_bandana_b { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "vn_b_aviator", "vn_o_bandana_b" }; - components[] = {"vn_b_aviator", "vn_o_bandana_b"}; - }; -}; - - - -// US Combat Goggles, used by vn_b_helmet_m1_20_01 & vn_b_helmet_m1_20_02 -class vn_b_acc_goggles_01: vn_glasses_base { - class ace_wardrobe: EGVAR(wardrobe,base) { - components[] = {"vn_b_acc_goggles_01"}; - }; -}; - -// VN Pilot Glasses + Mask -// Pilot Mask -class vn_o_acc_km32_01: vn_glasses_base { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "vn_o_acc_goggles_03" }; - components[] = {"vn_o_acc_km32_01"}; - }; -}; -// VN Crew Goggles -class vn_o_acc_goggles_01: vn_glasses_base { - class ace_wardrobe: EGVAR(wardrobe,base) { - components[] = {"vn_o_acc_goggles_01"}; - }; -}; -// Goggles -class vn_o_acc_goggles_02: vn_glasses_base { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "vn_o_acc_goggles_03" }; - components[] = {"vn_o_acc_goggles_02"}; - }; -}; // Goggles with Mask +class vn_glasses_base; class vn_o_acc_goggles_03: vn_glasses_base { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "vn_o_acc_km32_01", "vn_o_acc_goggles_02" }; - components[] = { "vn_o_acc_km32_01", "vn_o_acc_goggles_02"}; - }; mass = 4; }; \ No newline at end of file diff --git a/addons/compat_sog/compat_sog_wardrobe/Helmets.hpp b/addons/compat_sog/compat_sog_wardrobe/Helmets.hpp index f08c966fae7..87ca2963664 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Helmets.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Helmets.hpp @@ -1,99 +1,17 @@ // CfgWeapons - -// Macros -#define CN01(side,var1,var2) vn_##side##_helmet_##var1##_01_##var2 -#define CN02(side,var1,var2) vn_##side##_helmet_##var1##_02_##var2 - - -#define HELMET_VARIANT(side,var1,var2)\ -class CN01(side,var1,var2): base_class_up {\ - class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up) {\ - modifiableTo[] = { QUOTE(CN02(side,var1,var2)) };\ - };\ -};\ -class CN02(side,var1,var2): base_class_dn {\ - class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) {\ - modifiableTo[] = { QUOTE(CN01(side,var1,var2)) };\ - };\ -} - - class vn_b_helmet_m1_01_01: vn_b_headgear_base { class ItemInfo; }; - -// Parent Version aph6 & svh4 -#define base_class_up vn_b_headgear_base -#define base_class_dn vn_b_headgear_base -HELMET_VARIANT(b,aph6,01); -HELMET_VARIANT(b,svh4,01); - -// Child Version aph6 -#undef base_class_up -#undef base_class_dn -#define base_class_up CN01(b,aph6,01) -#define base_class_dn CN02(b,aph6,01) - -HELMET_VARIANT(b,aph6,02); -HELMET_VARIANT(b,aph6,03); -HELMET_VARIANT(b,aph6,04); -HELMET_VARIANT(b,aph6,05); - -// Child Version svh4 -#undef base_class_up -#undef base_class_dn -#define base_class_up CN01(b,svh4,01) -#define base_class_dn CN02(b,svh4,01) - -HELMET_VARIANT(b,svh4,02); -HELMET_VARIANT(b,svh4,03); -HELMET_VARIANT(b,svh4,04); -HELMET_VARIANT(b,svh4,05); -HELMET_VARIANT(b,svh4,06); - -#undef base_class_up -#undef base_class_dn - - -// Special Case zsh3 -class vn_o_helmet_zsh3_01: vn_o_headgear_base { - class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up) { - modifiableTo[] = { "vn_o_helmet_zsh3_02" }; - }; -}; -class vn_o_helmet_zsh3_02: vn_o_helmet_zsh3_01 { - class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) { - modifiableTo[] = { "vn_o_helmet_zsh3_01" }; - }; -}; - // Helmets with/without Goggles -class vn_b_helmet_m1_14_01: vn_b_helmet_m1_01_01 { - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { - modifiableTo[] = { "vn_b_helmet_m1_20_01" }; - }; - -}; -class vn_b_helmet_m1_14_02: vn_b_helmet_m1_14_01 { - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { - modifiableTo[] = { "vn_b_helmet_m1_20_02" }; - }; -}; +class vn_b_helmet_m1_14_01: vn_b_helmet_m1_01_01 {}; + class vn_b_helmet_m1_20_01 : vn_b_helmet_m1_14_01 { - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { - modifiableTo[] = { "vn_b_helmet_m1_14_01" }; - components[] = {"vn_b_acc_goggles_01"}; - }; MASS(12); }; class vn_b_helmet_m1_20_02 : vn_b_helmet_m1_20_01 { - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { - modifiableTo[] = { "vn_b_helmet_m1_14_02" }; - components[] = {"vn_b_acc_goggles_01"}; - }; MASS(12); }; @@ -101,87 +19,34 @@ class vn_b_helmet_m1_20_02 : vn_b_helmet_m1_20_01 { //// VN Pilot Helmet // With Goggles class vn_o_helmet_shl61_01: vn_o_headgear_base { - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { - modifiableTo[] = { "vn_o_helmet_shl61_02" }; - components[] = {"vn_o_acc_goggles_02"}; - }; MASS(12); }; // Without Goggles class vn_o_helmet_shl61_02: vn_o_helmet_shl61_01 { - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { - modifiableTo[] = { "vn_o_helmet_shl61_01" }; - };MASS(10); + MASS(10); }; // US Vic Crew Helmets class vn_b_helmet_t56_01_01: vn_b_headgear_base { - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { - modifiableTo[] = { "vn_b_helmet_t56_02_01" }; - }; class ItemInfo; }; class vn_b_helmet_t56_02_01: vn_b_helmet_t56_01_01 { - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { - modifiableTo[] = { "vn_b_helmet_t56_01_01" }; - components[] = {"vn_b_acc_goggles_01"}; - }; MASS(12); }; -class vn_b_helmet_t56_01_02: vn_b_helmet_t56_01_01 { - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { - modifiableTo[] = { "vn_b_helmet_t56_02_02" }; - }; -}; class vn_b_helmet_t56_02_02: vn_b_helmet_t56_02_01 { - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { - modifiableTo[] = { "vn_b_helmet_t56_01_02" }; - components[] = {"vn_b_acc_goggles_01"}; - }; MASS(12); }; -class vn_b_helmet_t56_01_03: vn_b_helmet_t56_01_01 { - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { - modifiableTo[] = { "vn_b_helmet_t56_02_03" }; - }; -}; class vn_b_helmet_t56_02_03: vn_b_helmet_t56_02_01 { - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { - modifiableTo[] = { "vn_b_helmet_t56_01_03" }; - components[] = {"vn_b_acc_goggles_01"}; - }; MASS(12); }; - -// VN Vic Crew Helmet // 1 with goggles -// vn_o_acc_goggles_01 -class vn_o_helmet_tsh3_01: vn_o_headgear_base { - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { - modifiableTo[] = { "vn_o_helmet_tsh3_02" }; - components[] = {"vn_o_acc_goggles_01"}; - }; -}; -class vn_o_helmet_tsh3_02: vn_o_helmet_tsh3_01 { - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { - modifiableTo[] = { "vn_o_helmet_tsh3_01" }; - }; -}; - // VN Pith Helmet with Crew Goggles class vn_o_helmet_nva_01: vn_o_headgear_base { - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { - modifiableTo[] = { "vn_o_helmet_nva_05" }; - }; class ItemInfo; }; class vn_o_helmet_nva_05: vn_o_helmet_nva_01 { - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { - modifiableTo[] = { "vn_o_helmet_nva_01" }; - components[] = {"vn_o_acc_goggles_02"}; - }; MASS(12); }; diff --git a/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp b/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp index d062edb7a53..6d636be9db1 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp @@ -1,11 +1,8 @@ -// CfgWeapons - class Uniform_Base; class vn_b_uniform_base: Uniform_Base { class ItemInfo; }; - // Macros #define ITEMINFO_FIX()\ class ItemInfo: ItemInfo {\ @@ -13,57 +10,13 @@ class ItemInfo: ItemInfo {\ mass = 70;\ } - -#define UNIFORM_BASE_B(class1,class2)\ -class class1: vn_b_uniform_base {\ - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) {\ - modifiableTo[] = { QUOTE(class2) };\ - };\ -};\ -class class2: vn_b_uniform_base {\ - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) {\ - modifiableTo[] = { QUOTE(class1) };\ - };\ -} - -#define UNIFORM_BASE_B_ITEMINFO_FIX(class1,class2)\ -class class1: vn_b_uniform_base {\ - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) {\ - modifiableTo[] = { QUOTE(class2) };\ - };\ -};\ +#define UNIFORM_BASE_B_ITEMINFO_FIX(class2)\ class class2: vn_b_uniform_base {\ - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) {\ - modifiableTo[] = { QUOTE(class1) };\ - };\ ITEMINFO_FIX();\ } #define B_U(div,var,camo) vn_b_uniform_##div##_##var##_##camo -#define B_U_PAIR(div,down,up,camo) UNIFORM_BASE_B(B_U(div,down,camo),B_U(div,up,camo)) - -#define B_U_PAIR_FIX(div,down,up,camo) UNIFORM_BASE_B_ITEMINFO_FIX(B_U(div,down,camo),B_U(div,up,camo)) - - -// Simple Variants -// ACZAC -UNIFORM_BASE_B(vn_b_uniform_aus_01_01,vn_b_uniform_aus_02_01); -UNIFORM_BASE_B(vn_b_uniform_aus_03_01,vn_b_uniform_aus_04_01); -UNIFORM_BASE_B(vn_b_uniform_aus_05_01,vn_b_uniform_aus_06_01); -UNIFORM_BASE_B(vn_b_uniform_aus_07_01,vn_b_uniform_aus_08_01); -UNIFORM_BASE_B(vn_b_uniform_aus_09_01,vn_b_uniform_aus_10_01); - -// NZ -UNIFORM_BASE_B(vn_b_uniform_NZ_01_01,vn_b_uniform_NZ_02_01); -UNIFORM_BASE_B(vn_b_uniform_NZ_03_01,vn_b_uniform_NZ_04_01); -UNIFORM_BASE_B(vn_b_uniform_NZ_05_01,vn_b_uniform_NZ_06_01); - -// SEAL STUFF -UNIFORM_BASE_B(vn_b_uniform_seal_01_01,vn_b_uniform_seal_02_01); -UNIFORM_BASE_B(vn_b_uniform_seal_01_02,vn_b_uniform_seal_02_02); -UNIFORM_BASE_B(vn_b_uniform_seal_01_05,vn_b_uniform_seal_02_05); -UNIFORM_BASE_B(vn_b_uniform_seal_01_06,vn_b_uniform_seal_02_06); -UNIFORM_BASE_B(vn_b_uniform_seal_01_07,vn_b_uniform_seal_02_07); +#define B_U_PAIR_FIX(div,up,camo) UNIFORM_BASE_B_ITEMINFO_FIX(B_U(div,up,camo)) // MACV #define OLIVE_FIELD 01 @@ -79,8 +32,7 @@ UNIFORM_BASE_B(vn_b_uniform_seal_01_07,vn_b_uniform_seal_02_07); // macv 05 and 04 have inconsistency between them -> different uniform maxLoad. This likely will cause the player to loose items when the uniform is filled to the brim. Difference is 1lb which translates to 16~17x ace bandages or 1x 1l blood #define B_U_PAIR_SET(camo)\ -B_U_PAIR(macv,02,03,camo);\ -B_U_PAIR_FIX(macv,05,04,camo) +B_U_PAIR_FIX(macv,04,camo) B_U_PAIR_SET(OLIVE_FIELD); B_U_PAIR_SET(TIGER); diff --git a/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp b/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp index f4b20fca32e..8b34cf4dd53 100644 --- a/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp @@ -1,93 +1,24 @@ -class vn_o_uniform_base; - -#define UNIFORM_BASE_O(class1,class2)\ -class class1: vn_o_uniform_base {\ - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) {\ - modifiableTo[] = { QUOTE(class2) };\ - };\ -};\ -class class2: vn_o_uniform_base {\ - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) {\ - modifiableTo[] = { QUOTE(class1) };\ - };\ -} - -// OPFOR - -// NVA Sailors -UNIFORM_BASE_O(vn_o_uniform_nva_navy_01,vn_o_uniform_nva_navy_03); -UNIFORM_BASE_O(vn_o_uniform_nva_navy_02,vn_o_uniform_nva_navy_04); - -// NVA_Army_AA_BB -// brown: 01,02 03,04 | GREEN: 01..12 -#define BROWN 01 -#define BROWN_FIELD 02 -#define GREEN 03 -#define GREEN_FIELD 04 -#define O_U_NVA_ARMY(var,camo) vn_o_uniform_nva_army_##var##_##camo -#define O_U_NVA_ARMY_PAIR(down,up,camo) UNIFORM_BASE_O(O_U_NVA_ARMY(down,camo),O_U_NVA_ARMY(up,camo)) -O_U_NVA_ARMY_PAIR(01,02,BROWN); -O_U_NVA_ARMY_PAIR(03,04,BROWN); -O_U_NVA_ARMY_PAIR(01,02,BROWN_FIELD); -O_U_NVA_ARMY_PAIR(03,04,BROWN_FIELD); - -O_U_NVA_ARMY_PAIR(01,02,GREEN); -O_U_NVA_ARMY_PAIR(03,04,GREEN); -O_U_NVA_ARMY_PAIR(05,06,GREEN); -O_U_NVA_ARMY_PAIR(07,08,GREEN); -O_U_NVA_ARMY_PAIR(09,10,GREEN); -O_U_NVA_ARMY_PAIR(11,12,GREEN); -O_U_NVA_ARMY_PAIR(01,02,GREEN_FIELD); -O_U_NVA_ARMY_PAIR(03,04,GREEN_FIELD); -O_U_NVA_ARMY_PAIR(05,06,GREEN_FIELD); -O_U_NVA_ARMY_PAIR(07,08,GREEN_FIELD); -O_U_NVA_ARMY_PAIR(09,10,GREEN_FIELD); -O_U_NVA_ARMY_PAIR(11,12,GREEN_FIELD); - -// PL ARMY -#define DARK 11 -#define DARK_FIELD 12 -#define LIGHT 13 -#define LIGHT_FIELD 14 -#define O_U_PL_ARMY(var,camo) vn_o_uniform_pl_army_##var##_##camo -#define O_U_PL_ARMY_PAIR(down,up,camo) UNIFORM_BASE_O(O_U_PL_ARMY(down,camo),O_U_PL_ARMY(up,camo)) - -O_U_PL_ARMY_PAIR(01,02,DARK); -O_U_PL_ARMY_PAIR(03,04,DARK); -O_U_PL_ARMY_PAIR(01,02,DARK_FIELD); -O_U_PL_ARMY_PAIR(03,04,DARK_FIELD); -O_U_PL_ARMY_PAIR(01,02,LIGHT); -O_U_PL_ARMY_PAIR(03,04,LIGHT); -O_U_PL_ARMY_PAIR(01,02,LIGHT_FIELD); -O_U_PL_ARMY_PAIR(03,04,LIGHT_FIELD); - - -#define O_U(div,var,camo) vn_o_uniform_##div##_##var##_##camo -#define O_U_PAIR(div,down,up,camo) UNIFORM_BASE_O(O_U(div,down,camo),O_U(div,up,camo)) -// VC MF -#define VC_MF 07 -O_U_PAIR(vc_mf,01,02,VC_MF); -O_U_PAIR(vc_mf,03,04,VC_MF); -O_U_PAIR(vc_mf,09,10,VC_MF); -O_U_PAIR(vc_mf,11,12,VC_MF); - -// VC REG -O_U_PAIR(vc_reg,11,12,08); -O_U_PAIR(vc_reg,11,12,09); -O_U_PAIR(vc_reg,11,12,10); - -// VC BLACK 01 BLACK_WHITE 02 GREY_TAN 03 BLUE 04 WHITE_BLACK 05 BLUE_WHITE 06 BLUE_GREY 07 -O_U_PAIR(vc,01,02,01); -O_U_PAIR(vc,03,04,01); -O_U_PAIR(vc,01,02,02); -O_U_PAIR(vc,03,04,02); -O_U_PAIR(vc,01,02,03); -O_U_PAIR(vc,03,04,03); -O_U_PAIR(vc,01,02,04); -O_U_PAIR(vc,03,04,04); -O_U_PAIR(vc,01,02,05); -O_U_PAIR(vc,03,04,05); -O_U_PAIR(vc,01,02,06); -O_U_PAIR(vc,03,04,06); -O_U_PAIR(vc,01,02,07); -O_U_PAIR(vc,03,04,07); +// ToDo: adjust container maximumLoad to 60 for the following classes +vn_o_uniform_nva_army_02_01 +vn_o_uniform_nva_army_02_02 +vn_o_uniform_nva_army_02_03 +vn_o_uniform_nva_army_02_04 +vn_o_uniform_vc_mf_02_07 +vn_o_uniform_nva_army_04_01 +vn_o_uniform_nva_army_04_02 +vn_o_uniform_nva_army_04_03 +vn_o_uniform_nva_army_04_04 +vn_o_uniform_vc_mf_04_07 +vn_o_uniform_nva_army_06_03 +vn_o_uniform_nva_army_06_04 +vn_o_uniform_nva_army_08_03 +vn_o_uniform_nva_army_08_04 +vn_o_uniform_nva_army_10_03 +vn_o_uniform_nva_army_10_04 +vn_o_uniform_vc_mf_10_07 +vn_o_uniform_nva_army_12_03 +vn_o_uniform_nva_army_12_04 +vn_o_uniform_vc_mf_12_07 +vn_o_uniform_vc_reg_12_08 +vn_o_uniform_vc_reg_12_09 +vn_o_uniform_vc_reg_12_10 \ No newline at end of file From 12134273bf194e3d4fb6c4c16f2cca478afd14b5 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Mon, 5 May 2025 23:26:07 +0200 Subject: [PATCH 163/305] Update addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf b/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf index a8feca4be74..f0c5d28dbf5 100644 --- a/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf +++ b/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf @@ -68,7 +68,7 @@ LOG_SYS("CompareMaxLoad","====================================================== _str = format ["%1 missmatches detected!", count _missmatches]; LOG_SYS("CompareMaxLoad",_str); -if (count _missmatches > 0) then { +if (_missmatches isNotEqualTo []) then { LOG_SYS("CompareMaxLoad","========================================================================================================"); { LOG_SYS("CompareMaxLoad",str _x); } forEach _missmatches; }; From cf96393a716c461bb1e7f1bcee276eea430cd15c Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Mon, 5 May 2025 23:26:25 +0200 Subject: [PATCH 164/305] Update addons/wardrobe/functions/fnc_enable_contextMenu.sqf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- addons/wardrobe/functions/fnc_enable_contextMenu.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_enable_contextMenu.sqf b/addons/wardrobe/functions/fnc_enable_contextMenu.sqf index 0e0cd519fcd..fc78427f302 100644 --- a/addons/wardrobe/functions/fnc_enable_contextMenu.sqf +++ b/addons/wardrobe/functions/fnc_enable_contextMenu.sqf @@ -2,7 +2,7 @@ /* * Author: OverlordZorn - * CBA Setting - On Setting Changed - Function to activate the Wardrobe related CBA Context Menu Options + * CBA Setting - On Setting Changed - Function to activate the Wardrobe-related CBA Context Menu Options * * Arguments: * 0: CBA Setting Value From d44d0158da52d6f7cc93e37ec2efb18b4089d08f Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Mon, 5 May 2025 23:26:39 +0200 Subject: [PATCH 165/305] Update addons/wardrobe/functions/fnc_replace.sqf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- addons/wardrobe/functions/fnc_replace.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 1064cc9c307..38b93ef3459 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -52,7 +52,7 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 // Add Surplus [_cfg_origin, _cfg_tgt] call FUNC(compare_components) params ["_missing", "_surplus"]; { - if (configName _cfg_tgt != _x) then { + if (configName _cfg_tgt isNotEqualTo toLowerANSI _x) then { if ( isClass (configFile >> "CfgGlasses" >> _x) && { goggles _unit == "" } ) then { _unit addGoggles _x; } else { From 82a06d4ea25a36d56969b5f118383bf689ac6605 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Mon, 5 May 2025 23:26:55 +0200 Subject: [PATCH 166/305] Update addons/wardrobe/functions/fnc_replace.sqf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- addons/wardrobe/functions/fnc_replace.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 38b93ef3459..4ad2e157004 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -53,7 +53,7 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 [_cfg_origin, _cfg_tgt] call FUNC(compare_components) params ["_missing", "_surplus"]; { if (configName _cfg_tgt isNotEqualTo toLowerANSI _x) then { - if ( isClass (configFile >> "CfgGlasses" >> _x) && { goggles _unit == "" } ) then { + if ( isClass (configFile >> "CfgGlasses" >> _x) && { goggles _unit isEqualTo "" } ) then { _unit addGoggles _x; } else { [_unit, _x, true] call CBA_fnc_addItem; From a36291f6abe69e1c9a08f59404b7b99051524934 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Mon, 5 May 2025 23:27:06 +0200 Subject: [PATCH 167/305] Update addons/wardrobe/functions/fnc_nextVariant_get.sqf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- addons/wardrobe/functions/fnc_nextVariant_get.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_nextVariant_get.sqf b/addons/wardrobe/functions/fnc_nextVariant_get.sqf index 5f919c1ef71..c43cc58877c 100644 --- a/addons/wardrobe/functions/fnc_nextVariant_get.sqf +++ b/addons/wardrobe/functions/fnc_nextVariant_get.sqf @@ -46,7 +46,7 @@ private _remaining = _modifiableTo_cfg - _history_cfg; // Returns ether a random remaining item or alternatively, a random one from the complete array. -private _return = if (count _remaining > 0) then { +private _return = if (_remaining isNotEqualTo []) then { selectRandom _remaining } else { // _history_cfg select { !(_x in _modifiableTo_cfg) }; From 88e91446c840f405269fa00a298c5d4b0a88f857 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Mon, 5 May 2025 23:27:19 +0200 Subject: [PATCH 168/305] Update addons/wardrobe/functions/fnc_replace.sqf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- addons/wardrobe/functions/fnc_replace.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 4ad2e157004..1f3f6cd04d7 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -63,7 +63,7 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 // Remove Missing { - if (configName _cfg_origin != _x) then { + if (configName _cfg_origin isNotEqualTo toLowerANSI _x) then { switch (true) do { case (goggles _unit == _x): { removeGoggles _unit; }; From 75760296b11d889c29c780a2b507a73d9d18f475 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Mon, 5 May 2025 23:27:29 +0200 Subject: [PATCH 169/305] Update addons/wardrobe/functions/fnc_nextVariant_get.sqf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- addons/wardrobe/functions/fnc_nextVariant_get.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_nextVariant_get.sqf b/addons/wardrobe/functions/fnc_nextVariant_get.sqf index c43cc58877c..750e1db1e52 100644 --- a/addons/wardrobe/functions/fnc_nextVariant_get.sqf +++ b/addons/wardrobe/functions/fnc_nextVariant_get.sqf @@ -24,7 +24,7 @@ params ["_cfg_current"]; private _modifiableTo_cfg = [_cfg_current, false] call FUNC(getItems_modifiableTo); -if (count _modifiableTo_cfg == 0) exitWith {false}; +if (_modifiableTo_cfg isEqualTo []) exitWith {false}; private _history_cfg = missionNamespace getVariable [QGVAR(variant_history_cfg), "404"]; From 0d42edd2dce098c5851fb452ad3b3c5b4595b57b Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Mon, 5 May 2025 23:27:40 +0200 Subject: [PATCH 170/305] Update addons/wardrobe/functions/fnc_replace.sqf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- addons/wardrobe/functions/fnc_replace.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 1f3f6cd04d7..0a689ea0ea3 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -79,7 +79,7 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 // Plays Random Sound At the Beginning private _sound = [configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "sound"] call cba_fnc_getCfgDataRandom; -if (_sound != "") then { +if (_sound isNotEqualTo "") then { [ CBA_fnc_globalSay3D, [_unit, _sound, nil, true, true], From 947fee5fa969949ecf52141eaa9b14e44c60244c Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Mon, 5 May 2025 23:31:32 +0200 Subject: [PATCH 171/305] Update addons/wardrobe/functions/fnc_replace.sqf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jouni Järvinen --- addons/wardrobe/functions/fnc_replace.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 0a689ea0ea3..e2fe1d1b472 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -66,7 +66,7 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 if (configName _cfg_origin isNotEqualTo toLowerANSI _x) then { switch (true) do { - case (goggles _unit == _x): { removeGoggles _unit; }; + case (goggles _unit isEqualTo toLowerANSI _x): { removeGoggles _unit; }; default { [_unit, _x] call CBA_fnc_removeItem; }; }; }; From f908a7a9c5dee92647742a5904d948b2ce7caaa2 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 6 May 2025 00:55:02 +0200 Subject: [PATCH 172/305] missmatch -> mismatch --- .../functions/fnc_compare_container_maxLoad.sqf | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf b/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf index a8feca4be74..cb0511a2d52 100644 --- a/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf +++ b/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf @@ -29,7 +29,7 @@ private _allWardrobeItems = [true] call FUNC(getAllWardrobeItems) select { private _established = []; private _index = 0; -private _missmatches = []; +private _mismatches = []; LOG_SYS("CompareMaxLoad","========================================================================================================"); LOG_SYS("CompareMaxLoad",QUOTE(Comparing PREFIX COMPONENT containers maximumLoad)); @@ -53,10 +53,10 @@ LOG_SYS("CompareMaxLoad","====================================================== if (_target_className in _established) then { continue }; _established pushBack _target_className; - private _missmatch = _target_maxLoad isNotEqualTo _origin_maxLoad; - private _string = format ["%6 - [%5] [%2|%4] %1 vs %3", _origin_className,_origin_maxLoad,_target_className,_target_maxLoad,["Nominal", "Missmatch Detected!"] select _missmatch, _index]; + private _mismatch = _target_maxLoad isNotEqualTo _origin_maxLoad; + private _string = format ["%6 - [%5] [%2|%4] %1 vs %3", _origin_className,_origin_maxLoad,_target_className,_target_maxLoad,["Nominal", "Mismatch Detected!"] select _mismatch, _index]; - if (_missmatch) then { _missmatches pushBack [_origin_className,_origin_maxLoad,_target_className,_target_maxLoad]; }; + if (_mismatch) then { _mismatches pushBack [_origin_className,_origin_maxLoad,_target_className,_target_maxLoad]; }; LOG_SYS("CompareMaxLoad",_string); ADD(_index,1); @@ -65,12 +65,12 @@ LOG_SYS("CompareMaxLoad","====================================================== LOG_SYS("CompareMaxLoad","DONE"); LOG_SYS("CompareMaxLoad","========================================================================================================"); -_str = format ["%1 missmatches detected!", count _missmatches]; +_str = format ["%1 mismatches detected!", count _mismatches]; LOG_SYS("CompareMaxLoad",_str); -if (count _missmatches > 0) then { +if (count _mismatches > 0) then { LOG_SYS("CompareMaxLoad","========================================================================================================"); - { LOG_SYS("CompareMaxLoad",str _x); } forEach _missmatches; + { LOG_SYS("CompareMaxLoad",str _x); } forEach _mismatches; }; LOG_SYS("CompareMaxLoad","========================================================================================================"); LOG_SYS("CompareMaxLoad","END"); From 47f8db4b5a565c0c4dbc83042722c25fe391730c Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 6 May 2025 00:55:16 +0200 Subject: [PATCH 173/305] ws compat --- .../compat_ws_wardrobe/CfgWardrobe.hpp | 94 +--------- .../CfgWardrobe_Headgear.hpp | 22 +++ .../CfgWardrobe_Turbans.hpp | 169 ++++++++++++++++++ .../compat_ws_wardrobe/CfgWeapons.hpp | 30 ++++ .../compat_ws/compat_ws_wardrobe/Turbans.hpp | 122 ------------- 5 files changed, 227 insertions(+), 210 deletions(-) create mode 100644 addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Headgear.hpp create mode 100644 addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Turbans.hpp create mode 100644 addons/compat_ws/compat_ws_wardrobe/CfgWeapons.hpp diff --git a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp index fb8d90bc90c..ba59a6cc991 100644 --- a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp @@ -1,93 +1,11 @@ -/* -class CfgGlasses { - class G_Combat; - class G_Combat_lxWS: G_Combat { - class ace_wardrobe: EGVAR(wardrobe,base) { - components[] = {"G_Combat_lxWS"}; - }; - }; -}; - - class CfgWeapons { - - class ItemCore; - class HelmetBase: ItemCore { - class ItemInfo; - }; - - #include "Turbans.hpp" - - // Cap (Ion) Forward and Reversed - class lxWS_H_CapB_rvs_blk; - class lxWS_H_CapB_rvs_blk_ION: lxWS_H_CapB_rvs_blk { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "H_Cap_headphones_ion_lxws" }; - }; - }; - class H_Cap_headphones_ion_lxws: lxWS_H_CapB_rvs_blk_ION { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "lxWS_H_CapB_rvs_blk_ION" }; - }; - }; - - // Helmets - class H_PASGT_basic_base_F; - - //// RF Helmets with Glasses - class lxWS_H_PASGT_goggles_UN_F: HelmetBase { - MASS(32); - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { - modifiableTo[] = { "lxWS_H_PASGT_basic_UN_F" }; - components[] = {"G_Combat_lxWS"}; - }; - }; - class lxWS_H_PASGT_goggles_black_F: lxWS_H_PASGT_goggles_UN_F { - MASS(32); - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { - modifiableTo[] = { "H_PASGT_basic_black_F" }; - components[] = {"G_Combat_lxWS"}; - }; - }; - class lxWS_H_PASGT_goggles_olive_F: lxWS_H_PASGT_goggles_UN_F { - MASS(32); - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { - modifiableTo[] = { "H_PASGT_basic_olive_F" }; - components[] = {"G_Combat_lxWS"}; - }; - }; - class lxWS_H_PASGT_goggles_white_F: lxWS_H_PASGT_goggles_UN_F { - MASS(32); - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_on) { - modifiableTo[] = { "H_PASGT_basic_white_F" }; - components[] = {"G_Combat_lxWS"}; - }; - }; - - // Without - class lxWS_H_PASGT_basic_UN_F: HelmetBase { - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { - modifiableTo[] = { "lxWS_H_PASGT_goggles_UN_F" }; - }; - }; - class H_PASGT_basic_black_F: H_PASGT_basic_base_F { - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { - modifiableTo[] = { "lxWS_H_PASGT_goggles_black_F" }; - }; - }; - class H_PASGT_basic_olive_F: H_PASGT_basic_base_F { - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { - modifiableTo[] = { "lxWS_H_PASGT_goggles_olive_F" }; - }; - }; - class H_PASGT_basic_white_F: H_PASGT_basic_base_F { - class ace_wardrobe: EGVAR(wardrobe,base_H_goggles_off) { - modifiableTo[] = { "lxWS_H_PASGT_goggles_white_F" }; - }; - }; + #include "CfgWeapons.hpp" }; -*/ + class ace_wardrobe { #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" -}; \ No newline at end of file + #include "CfgWardrobe_Turbans.hpp" + #include "CfgWardrobe_Headgear.hpp" + +}; diff --git a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Headgear.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Headgear.hpp new file mode 100644 index 00000000000..109172d78d2 --- /dev/null +++ b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Headgear.hpp @@ -0,0 +1,22 @@ +// Cap (Ion) Forward and Reversed +class lxWS_H_CapB_rvs_blk_ION: EGVAR(wardrobe,base) { + class modifiableTo { + class H_Cap_headphones_ion_lxws; + }; +}; +class H_Cap_headphones_ion_lxws: EGVAR(wardrobe,base) { + class modifiableTo { + class lxWS_H_CapB_rvs_blk_ION; + }; +}; + +//// RF Helmets with Glasses +HELMET_GOGGLES(lxWS_H_PASGT_goggles_UN_F,lxWS_H_PASGT_basic_UN_F,G_Combat_lxWS); +HELMET_GOGGLES(lxWS_H_PASGT_goggles_black_F,H_PASGT_basic_black_F,G_Combat_lxWS); +HELMET_GOGGLES(lxWS_H_PASGT_goggles_olive_F,H_PASGT_basic_olive_F,G_Combat_lxWS); +HELMET_GOGGLES(lxWS_H_PASGT_goggles_white_F,H_PASGT_basic_white_F,G_Combat_lxWS); + +//Component +class G_Combat_lxWS: EGVAR(wardrobe,base) { + components[] = {"G_Combat_lxWS"}; +}; \ No newline at end of file diff --git a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Turbans.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Turbans.hpp new file mode 100644 index 00000000000..4b5250e09f6 --- /dev/null +++ b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Turbans.hpp @@ -0,0 +1,169 @@ +// Custom Base Class +class EGVAR(wardrobe,turban): EGVAR(wardrobe,base) { + gesture ="GestureWipeFace"; +}; + +// MACROS +#define CN(version,color) lxWS_H_turban_##version##_##color + +#define COLORGROUP(COLOR)\ +class CN(01,COLOR): EGVAR(wardrobe,turban) {\ + class modifiableTo {\ + class CN(02,COLOR);\ + class CN(03,COLOR);\ + class CN(04,COLOR);\ + };\ +};\ +class CN(02,COLOR): EGVAR(wardrobe,turban) {\ + class modifiableTo {\ + class CN(01,COLOR);\ + class CN(03,COLOR);\ + class CN(04,COLOR);\ + };\ +};\ +class CN(03,COLOR): EGVAR(wardrobe,turban) {\ + class modifiableTo {\ + class CN(01,COLOR);\ + class CN(02,COLOR);\ + class CN(04,COLOR);\ + };\ +};\ +class CN(04,COLOR): EGVAR(wardrobe,turban) {\ + class modifiableTo {\ + class CN(01,COLOR);\ + class CN(02,COLOR);\ + class CN(03,COLOR);\ + };\ +} + + +#define COLORGROUP_SPECIAL(COLOR)\ +class CN(02,COLOR): EGVAR(wardrobe,turban) {\ + class modifiableTo {\ + class CN(03,COLOR);\ + };\ +};\ +class CN(03,COLOR): EGVAR(wardrobe,turban) {\ + class modifiableTo {\ + class CN(02,COLOR);\ + };\ +} + + +// BASECLASS +class H_turban_02_mask_black_lxws: EGVAR(wardrobe,turban) { + class modifiableTo { + class CN(01,black); + class CN(02,black); + class CN(03,black); + class CN(04,black); + }; + components[] = { "lxWS_H_bmask_base" }; +}; + + +class lxWS_H_turban_01_black: EGVAR(wardrobe,turban) { + class modifiableTo { + class CN(02,black); + class CN(03,black); + class CN(04,black); + class H_turban_02_mask_black_lxws; + }; +}; +class lxWS_H_turban_02_black: EGVAR(wardrobe,turban) { + class modifiableTo { + class CN(01,black); + class CN(03,black); + class CN(04,black); + class H_turban_02_mask_black_lxws; + }; +}; +class lxWS_H_turban_03_black: EGVAR(wardrobe,turban) { + class modifiableTo { + class CN(01,black); + class CN(02,black); + class CN(04,black); + class H_turban_02_mask_black_lxws; + }; +}; +class lxWS_H_turban_04_black: EGVAR(wardrobe,turban) { + class modifiableTo { + class CN(01,black); + class CN(02,black); + class CN(03,black); + class H_turban_02_mask_black_lxws; + }; +}; + + +// VARIATIONS +COLORGROUP(blue); +COLORGROUP(blue_una); +COLORGROUP(green); +COLORGROUP(red); +COLORGROUP(gray); +COLORGROUP(yellow); + + +// Special Variations +COLORGROUP_SPECIAL(green_pattern); + + + +// Super Special Manual blabla +class H_turban_02_mask_snake_lxws: EGVAR(wardrobe,turban) { + class modifiableTo { + class CN(01,sand); + class CN(02,sand); + class CN(03,sand); + class CN(04,sand); + class H_turban_02_mask_hex_lxws; + }; + components[] = {"H_bmask_snake_lxws"}; +}; +class H_turban_02_mask_hex_lxws: EGVAR(wardrobe,turban) { + class modifiableTo { + class CN(01,sand); + class CN(02,sand); + class CN(03,sand); + class CN(04,sand); + class H_turban_02_mask_snake_lxws; + }; + components[] = {"lxWS_H_bmask_hex"}; +}; +class lxWS_H_turban_01_sand: EGVAR(wardrobe,turban) { + class modifiableTo { + class CN(02,sand); + class CN(03,sand); + class CN(04,sand); + class H_turban_02_mask_snake_lxws; + class H_turban_02_mask_hex_lxws; + }; +}; +class lxWS_H_turban_02_sand: EGVAR(wardrobe,turban) { + class modifiableTo { + class CN(01,sand); + class CN(03,sand); + class CN(04,sand); + class H_turban_02_mask_snake_lxws; + class H_turban_02_mask_hex_lxws; + }; +}; +class lxWS_H_turban_03_sand: EGVAR(wardrobe,turban) { + class modifiableTo { + class CN(01,sand); + class CN(02,sand); + class CN(04,sand); + class H_turban_02_mask_snake_lxws; + class H_turban_02_mask_hex_lxws; + }; +}; +class lxWS_H_turban_04_sand: EGVAR(wardrobe,turban) { + class modifiableTo { + class CN(01,sand); + class CN(02,sand); + class CN(03,sand); + class H_turban_02_mask_snake_lxws; + class H_turban_02_mask_hex_lxws; + }; +}; diff --git a/addons/compat_ws/compat_ws_wardrobe/CfgWeapons.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWeapons.hpp new file mode 100644 index 00000000000..64227bf0aec --- /dev/null +++ b/addons/compat_ws/compat_ws_wardrobe/CfgWeapons.hpp @@ -0,0 +1,30 @@ + +class ItemCore; +class HelmetBase: ItemCore { + class ItemInfo; +}; + +// CfgWeapons +// BASECLASS +class H_Shemag_khk; +class HeadgearItem; + +class H_turban_02_mask_black_lxws: H_Shemag_khk { + class ItemInfo: HeadgearItem { + mass = 26; + }; +}; + +//// RF Helmets with Glasses +class lxWS_H_PASGT_goggles_UN_F: HelmetBase { + MASS(32); +}; +class lxWS_H_PASGT_goggles_black_F: lxWS_H_PASGT_goggles_UN_F { + MASS(32); +}; +class lxWS_H_PASGT_goggles_olive_F: lxWS_H_PASGT_goggles_UN_F { + MASS(32); +}; +class lxWS_H_PASGT_goggles_white_F: lxWS_H_PASGT_goggles_UN_F { + MASS(32); +}; diff --git a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp index e071106faa2..e69de29bb2d 100644 --- a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp @@ -1,122 +0,0 @@ -// CfgWeapons - -// MACROS -#define CN(version,color) lxWS_H_turban_##version##_##color -#define QCN(version,color) QUOTE(CN(version,color)) - -#define COLORGROUP(COLOR)\ -class CN(01,COLOR): lxWS_H_turban_01_black {\ - class ace_wardrobe: EGVAR(wardrobe,base) {\ - modifiableTo[] = { QCN(02,COLOR), QCN(03,COLOR), QCN(04,COLOR) };\ - };\ -};\ -class CN(02,COLOR): lxWS_H_turban_02_black {\ - class ace_wardrobe: EGVAR(wardrobe,base) {\ - modifiableTo[] = { QCN(01,COLOR), QCN(03,COLOR), QCN(04,COLOR) };\ - };\ -};\ -class CN(03,COLOR): lxWS_H_turban_03_black {\ - class ace_wardrobe: EGVAR(wardrobe,base) {\ - modifiableTo[] = { QCN(01,COLOR), QCN(02,COLOR), QCN(04,COLOR) };\ - };\ -};\ -class CN(04,COLOR): lxWS_H_turban_04_black {\ - class ace_wardrobe: EGVAR(wardrobe,base) {\ - modifiableTo[] = { QCN(01,COLOR), QCN(02,COLOR), QCN(03,COLOR) };\ - };\ -} - - -#define COLORGROUP_SPECIAL(COLOR)\ -class CN(02,COLOR): lxWS_H_turban_02_green {\ - class ace_wardrobe: EGVAR(wardrobe,base) {\ - modifiableTo[] = { QCN(03,COLOR) };\ - };\ -};\ -class CN(03,COLOR): lxWS_H_turban_03_black {\ - class ace_wardrobe: EGVAR(wardrobe,base) {\ - modifiableTo[] = { QCN(02,COLOR) };\ - };\ -} - - -// BASECLASS -class H_Shemag_khk; -class HeadgearItem; - -class H_turban_02_mask_black_lxws: H_Shemag_khk { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(03,black), QCN(04,black) }; - components[] = { "lxWS_H_bmask_base" }; - }; - class ItemInfo: HeadgearItem { - mass = 26; - }; -}; - -class lxWS_H_turban_01_black: H_Shemag_khk { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { QCN(02,black), QCN(03,black), QCN(04,black), "H_turban_02_mask_black_lxws" }; - }; -}; -class lxWS_H_turban_02_black: lxWS_H_turban_01_black { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { QCN(01,black), QCN(03,black), QCN(04,black), "H_turban_02_mask_black_lxws" }; - }; -}; -class lxWS_H_turban_03_black: lxWS_H_turban_01_black { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(04,black), "H_turban_02_mask_black_lxws" }; - }; -}; -class lxWS_H_turban_04_black: lxWS_H_turban_01_black { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { QCN(01,black), QCN(02,black), QCN(03,black), "H_turban_02_mask_black_lxws" }; - }; -}; - -// VARIATIONS -COLORGROUP(blue); -COLORGROUP(blue_una); -COLORGROUP(green); -COLORGROUP(red); -COLORGROUP(gray); -COLORGROUP(yellow); - -// Special Variations -COLORGROUP_SPECIAL(green_pattern); - - -// Super Special Manual blabla -class H_turban_02_mask_snake_lxws: H_turban_02_mask_black_lxws { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_hex_lxws" }; - components[] = {"H_bmask_snake_lxws"}; - }; -}; -class H_turban_02_mask_hex_lxws: H_turban_02_mask_black_lxws { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws" }; - components[] = {"lxWS_H_bmask_hex"}; - }; -}; -class lxWS_H_turban_01_sand: lxWS_H_turban_01_black { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { QCN(02,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; - }; -}; -class lxWS_H_turban_02_sand: lxWS_H_turban_02_black { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { QCN(01,sand), QCN(03,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; - }; -}; -class lxWS_H_turban_03_sand: lxWS_H_turban_03_black { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(04,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; - }; -}; -class lxWS_H_turban_04_sand: lxWS_H_turban_04_black { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { QCN(01,sand), QCN(02,sand), QCN(03,sand), "H_turban_02_mask_snake_lxws", "H_turban_02_mask_hex_lxws" }; - }; -}; \ No newline at end of file From 8ddc196f9baf394709c83cde81eea0ad02e7e7be Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 6 May 2025 01:09:50 +0200 Subject: [PATCH 174/305] compat_rf --- .../compat_rf_wardrobe/CfgWardrobe.hpp | 113 +----------------- .../CfgWardrobe_Helmets.hpp | 19 +++ .../CfgWardrobe_Uniforms.hpp | 10 ++ 3 files changed, 32 insertions(+), 110 deletions(-) create mode 100644 addons/compat_rf/compat_rf_wardrobe/CfgWardrobe_Helmets.hpp create mode 100644 addons/compat_rf/compat_rf_wardrobe/CfgWardrobe_Uniforms.hpp diff --git a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp index c8095ce0ec9..95356ffb9cf 100644 --- a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp @@ -1,113 +1,6 @@ -/* -class CfgWeapons -{ - //// Helmets - // Macros - #define CN(color) H_HelmetHeavy_##color##_RF - #define CN_VU(color) H_HelmetHeavy_VisorUp_##color##_RF - - #define HELMET_VARIANT(color)\ - class CN(color): H_HelmetHeavy_Black_RF {\ - class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) {\ - modifiableTo[] = { QUOTE(CN_VU(color)) };\ - };\ - };\ - class CN_VU(color): H_HelmetHeavy_VisorUp_Black_RF {\ - class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up){\ - modifiableTo[] = { QUOTE(CN(color)) };\ - };\ - } - - // Base Classes - class H_HelmetAggressor_F; - - class H_HelmetHeavy_Black_RF: H_HelmetAggressor_F { - class ace_wardrobe: EGVAR(wardrobe,base_H_visor_down) { - modifiableTo[] = { "H_HelmetHeavy_VisorUp_Black_RF" }; - }; - }; - class H_HelmetHeavy_VisorUp_Black_RF: H_HelmetHeavy_Black_RF { - class ace_wardrobe: EGVAR(wardrobe,base_H_visor_up){ - modifiableTo[] = { "H_HelmetHeavy_Black_RF" }; - }; - }; - // Variants - HELMET_VARIANT(Hex); - HELMET_VARIANT(GHex); - HELMET_VARIANT(Sand); - HELMET_VARIANT(Olive); - HELMET_VARIANT(White); - - //// Uniforms - class Uniform_Base; - - // Macros - #define UNIFORM_BASE(class1,class2)\ - class class1: Uniform_Base {\ - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_down) {\ - modifiableTo[] = { QUOTE(class2) };\ - };\ - };\ - class class2: Uniform_Base {\ - class ace_wardrobe: EGVAR(wardrobe,base_U_sleeves_up) {\ - modifiableTo[] = { QUOTE(class1) };\ - };\ - } - - // Sleeves up/down - UNIFORM_BASE(U_C_FirefighterFatigues_RF,U_C_FirefighterFatigues_RolledUp_RF); - UNIFORM_BASE(U_BG_Guerrilla_6_1,U_BG_Guerrilla_RF); - - - // Pilot Jackets - class U_C_PilotJacket_black_RF: Uniform_Base { - class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_closed) { - modifiableTo[] = { "U_C_PilotJacket_open_black_RF" }; - }; - }; - class U_C_PilotJacket_open_black_RF: U_C_PilotJacket_black_RF { - class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_open) { - modifiableTo[] = { "U_C_PilotJacket_black_RF" }; - }; - }; - - class U_C_PilotJacket_brown_RF: U_C_PilotJacket_black_RF { - class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_closed) { - modifiableTo[] = { "U_C_PilotJacket_open_brown_RF" }; - }; - }; - class U_C_PilotJacket_open_brown_RF: U_C_PilotJacket_brown_RF { - class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_open) { - modifiableTo[] = { "U_C_PilotJacket_brown_RF" }; - }; - }; - - class U_C_PilotJacket_lbrown_RF: U_C_PilotJacket_black_RF { - class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_closed) { - modifiableTo[] = { "U_C_PilotJacket_open_lbrown_RF" }; - }; - }; - class U_C_PilotJacket_open_lbrown_RF: U_C_PilotJacket_lbrown_RF { - class ace_wardrobe: EGVAR(wardrobe,base_U_jacket_open) { - modifiableTo[] = { "U_C_PilotJacket_lbrown_RF" }; - }; - }; - - - // Cap (Ion) Forward and Reversed - class lxWS_H_CapB_rvs_blk; - class lxWS_H_CapB_rvs_blk_ION: lxWS_H_CapB_rvs_blk { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "H_Cap_headphones_ion_lxws" }; - }; - }; - class H_Cap_headphones_ion_lxws: lxWS_H_CapB_rvs_blk_ION { - class ace_wardrobe: EGVAR(wardrobe,base) { - modifiableTo[] = { "lxWS_H_CapB_rvs_blk_ION" }; - }; - }; -}; -*/ class ace_wardrobe { #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" + + #include "CfgWardrobe_Helmets.hpp" + #include "CfgWardrobe_Uniforms.hpp" }; \ No newline at end of file diff --git a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe_Helmets.hpp b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe_Helmets.hpp new file mode 100644 index 00000000000..a6aa304ef34 --- /dev/null +++ b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe_Helmets.hpp @@ -0,0 +1,19 @@ +//// Helmets +// Macros +#define CN(color) H_HelmetHeavy_##color##_RF +#define CN_VU(color) H_HelmetHeavy_VisorUp_##color##_RF + +#define HELMET_VARIANT(color)\ +HELMET_VISOR(CN_VU(color),CN(color)) + +HELMET_VISOR(H_HelmetHeavy_VisorUp_Black_RF,H_HelmetHeavy_Black_RF); + +// Variants +HELMET_VARIANT(Hex); +HELMET_VARIANT(GHex); +HELMET_VARIANT(Sand); +HELMET_VARIANT(Olive); +HELMET_VARIANT(White); + +// Cap (Ion) Forward and Reversed +BASE_PAIR(lxWS_H_CapB_rvs_blk_ION,H_Cap_headphones_ion_lxws); \ No newline at end of file diff --git a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe_Uniforms.hpp b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe_Uniforms.hpp new file mode 100644 index 00000000000..4a78ed5b377 --- /dev/null +++ b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe_Uniforms.hpp @@ -0,0 +1,10 @@ +// Sleeves up/down +UNIFORM_SLEEVES(U_C_FirefighterFatigues_RF,U_C_FirefighterFatigues_RolledUp_RF); +UNIFORM_SLEEVES(U_BG_Guerrilla_6_1,U_BG_Guerrilla_RF); + +// Pilot Jackets +UNIFORM_JACKET(variantJacketOpen,variantJacketClosed); + +UNIFORM_JACKET(U_C_PilotJacket_open_black_RF,U_C_PilotJacket_black_RF); +UNIFORM_JACKET(U_C_PilotJacket_open_brown_RF,U_C_PilotJacket_brown_RF); +UNIFORM_JACKET(U_C_PilotJacket_open_lbrown_RF,U_C_PilotJacket_lbrown_RF); \ No newline at end of file From e6c2cfd80db8aa2327e9d55cd9967bafe38356aa Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Tue, 6 May 2025 01:34:32 +0200 Subject: [PATCH 175/305] Update addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf Co-authored-by: PabstMirror --- addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf b/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf index f4509647ce1..08faea9589f 100644 --- a/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf +++ b/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf @@ -65,7 +65,7 @@ LOG_SYS("CompareMaxLoad","====================================================== LOG_SYS("CompareMaxLoad","DONE"); LOG_SYS("CompareMaxLoad","========================================================================================================"); -_str = format ["%1 mismatches detected!", count _mismatches]; +private _str = format ["%1 mismatches detected!", count _mismatches]; LOG_SYS("CompareMaxLoad",_str); if (_mismatches isNotEqualTo []) then { From 594d95b678bfff411878810e40460a4f094d1748 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Tue, 6 May 2025 01:34:50 +0200 Subject: [PATCH 176/305] Update addons/wardrobe/functions/fnc_addActions_children.sqf Co-authored-by: PabstMirror --- addons/wardrobe/functions/fnc_addActions_children.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_addActions_children.sqf b/addons/wardrobe/functions/fnc_addActions_children.sqf index 670acf779e8..96a4013d2de 100644 --- a/addons/wardrobe/functions/fnc_addActions_children.sqf +++ b/addons/wardrobe/functions/fnc_addActions_children.sqf @@ -36,7 +36,7 @@ private _actions = []; {true}, {}, [_cfg_origin, _cfg_target] - ] call ace_interact_menu_fnc_createAction; + ] call EFUNC(interact_menu,createAction); _actions pushBack [_aceAction, [], _target]; } forEach _newItems; From b1226dd397c54545902c9a37cd7481aacbd88c17 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Tue, 6 May 2025 01:35:04 +0200 Subject: [PATCH 177/305] Update addons/wardrobe/functions/fnc_replace.sqf Co-authored-by: PabstMirror --- addons/wardrobe/functions/fnc_replace.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index e2fe1d1b472..2d49e1bfcad 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -75,7 +75,7 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 //// Handle Effects // Animation/Gestures -[ _unit, getText (configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "gesture") ] call ace_common_fnc_doGesture; +[ _unit, getText (configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "gesture") ] call EFUNC(common,doGesture); // Plays Random Sound At the Beginning private _sound = [configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "sound"] call cba_fnc_getCfgDataRandom; From ad38371ed7bcfb1f082cb5a6b12b05cec8590f81 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Tue, 6 May 2025 01:35:16 +0200 Subject: [PATCH 178/305] Update addons/wardrobe/functions/fnc_addActions.sqf Co-authored-by: PabstMirror --- addons/wardrobe/functions/fnc_addActions.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_addActions.sqf b/addons/wardrobe/functions/fnc_addActions.sqf index 3f781a81423..655b2b8c197 100644 --- a/addons/wardrobe/functions/fnc_addActions.sqf +++ b/addons/wardrobe/functions/fnc_addActions.sqf @@ -32,7 +32,7 @@ private _actions = []; {true}, FUNC(addActions_children), [_cfg, _x#1] - ] call ace_interact_menu_fnc_createAction; + ] call EFUNC(interact_menu,createAction); _actions pushBack [_aceAction, [], _target]; } forEach _modifiableItems; From 8254b19deabd1302e415f8669cf9c386e3b92114 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Tue, 6 May 2025 01:37:07 +0200 Subject: [PATCH 179/305] Update addons/wardrobe/functions/fnc_addActions.sqf Co-authored-by: PabstMirror --- addons/wardrobe/functions/fnc_addActions.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_addActions.sqf b/addons/wardrobe/functions/fnc_addActions.sqf index 655b2b8c197..0c5573a3951 100644 --- a/addons/wardrobe/functions/fnc_addActions.sqf +++ b/addons/wardrobe/functions/fnc_addActions.sqf @@ -33,7 +33,7 @@ private _actions = []; FUNC(addActions_children), [_cfg, _x#1] ] call EFUNC(interact_menu,createAction); - _actions pushBack [_aceAction, [], _target]; + _actions pushBack [_aceAction, [], _unit]; } forEach _modifiableItems; From cd1ab874f22c2383056757de8e2a69593501614c Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 6 May 2025 01:49:57 +0200 Subject: [PATCH 180/305] Update launch.toml --- .hemtt/launch.toml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.hemtt/launch.toml b/.hemtt/launch.toml index e738fc365bc..f338a08f711 100644 --- a/.hemtt/launch.toml +++ b/.hemtt/launch.toml @@ -83,3 +83,12 @@ workshop = [ "843593391", # RHS GREF Workshop ID "843632231", # RHS SAF Workshop ID ] + +[Wardrobe_cdlc] +extends = "Wardrobe" +dlc = [ + "vn", + "gm", + "rf", + "ws", +] From 3fc7e11a84a662e49b153a31f2e1bb84c8247cb8 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 6 May 2025 01:50:03 +0200 Subject: [PATCH 181/305] Update fnc_addActions.sqf --- addons/wardrobe/functions/fnc_addActions.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_addActions.sqf b/addons/wardrobe/functions/fnc_addActions.sqf index 3f781a81423..acf00c6e0eb 100644 --- a/addons/wardrobe/functions/fnc_addActions.sqf +++ b/addons/wardrobe/functions/fnc_addActions.sqf @@ -33,7 +33,7 @@ private _actions = []; FUNC(addActions_children), [_cfg, _x#1] ] call ace_interact_menu_fnc_createAction; - _actions pushBack [_aceAction, [], _target]; + _actions pushBack [_aceAction, [], _unit]; } forEach _modifiableItems; From bd6abcf7a888b450d70cdb415b2c5c853c679ada Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 6 May 2025 15:04:20 +0200 Subject: [PATCH 182/305] gm compat cleanup --- addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp | 4 ---- .../compat_gm_wardrobe/{Helmets.hpp => CfgWeapons.hpp} | 6 ++++-- addons/compat_gm/compat_gm_wardrobe/config.cpp | 6 ++++++ 3 files changed, 10 insertions(+), 6 deletions(-) rename addons/compat_gm/compat_gm_wardrobe/{Helmets.hpp => CfgWeapons.hpp} (88%) diff --git a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp index 8c5ab2b9cca..6798281da92 100644 --- a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp @@ -1,7 +1,3 @@ -// Adjust Mass of Objects for consistency's sake -class CfgWeapons { - #include "Helmets.hpp" -}; // Actual CfgWardrobe Compat class ace_wardrobe { diff --git a/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp b/addons/compat_gm/compat_gm_wardrobe/CfgWeapons.hpp similarity index 88% rename from addons/compat_gm/compat_gm_wardrobe/Helmets.hpp rename to addons/compat_gm/compat_gm_wardrobe/CfgWeapons.hpp index 715e5c4ecb3..c89c0e8537d 100644 --- a/addons/compat_gm/compat_gm_wardrobe/Helmets.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/CfgWeapons.hpp @@ -1,7 +1,8 @@ // CfgWeapons -#define GM_Helmet_Glasses(classWith,baseWith)\ -class classWith: baseWith {\ +// Increase mass of helmets with glasses by mass of glasses +#define GM_Helmet_Glasses(Classname,BaseClass)\ +class Classname: BaseClass {\ MASS(11);\ } @@ -43,6 +44,7 @@ class gm_ge_headgear_sidecap_80_base: gm_ge_headgear_sidecap_base { class ItemInfo; }; +// Increase mass of helmets with hat by mass of hat // Hats + Helmets class gm_ge_headgear_hat_80_m62_oli: gm_ge_headgear_hat_80_base { MASS(20); diff --git a/addons/compat_gm/compat_gm_wardrobe/config.cpp b/addons/compat_gm/compat_gm_wardrobe/config.cpp index 1045ac7f1b5..23cd443beea 100644 --- a/addons/compat_gm/compat_gm_wardrobe/config.cpp +++ b/addons/compat_gm/compat_gm_wardrobe/config.cpp @@ -19,4 +19,10 @@ class CfgPatches { }; }; +// Adjust Mass of Objects for consistency's sake +class CfgWeapons { + #include "CfgWeapons.hpp" +}; + + #include "CfgWardrobe.hpp" From 71323f2edbe2c67d942720529c16914657406bc6 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 6 May 2025 15:14:29 +0200 Subject: [PATCH 183/305] compat ws cleanup --- .../compat_ws_wardrobe/CfgWardrobe.hpp | 5 -- .../CfgWardrobe_Headgear.hpp | 2 +- .../CfgWardrobe_Turbans.hpp | 35 ++++++------- .../compat_ws_wardrobe/CfgWeapons.hpp | 49 ++++++++++--------- .../compat_ws/compat_ws_wardrobe/config.cpp | 1 + 5 files changed, 45 insertions(+), 47 deletions(-) diff --git a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp index ba59a6cc991..07947b4ad01 100644 --- a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp @@ -1,11 +1,6 @@ -class CfgWeapons { - #include "CfgWeapons.hpp" -}; - class ace_wardrobe { #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" #include "CfgWardrobe_Turbans.hpp" #include "CfgWardrobe_Headgear.hpp" - }; diff --git a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Headgear.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Headgear.hpp index 109172d78d2..2db5b7926bb 100644 --- a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Headgear.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Headgear.hpp @@ -19,4 +19,4 @@ HELMET_GOGGLES(lxWS_H_PASGT_goggles_white_F,H_PASGT_basic_white_F,G_Combat_lxWS) //Component class G_Combat_lxWS: EGVAR(wardrobe,base) { components[] = {"G_Combat_lxWS"}; -}; \ No newline at end of file +}; diff --git a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Turbans.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Turbans.hpp index 4b5250e09f6..d53f08637fe 100644 --- a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Turbans.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Turbans.hpp @@ -50,7 +50,23 @@ class CN(03,COLOR): EGVAR(wardrobe,turban) {\ } -// BASECLASS +// VARIATIONS +COLORGROUP(blue); +COLORGROUP(blue_una); +COLORGROUP(green); +COLORGROUP(red); +COLORGROUP(gray); +COLORGROUP(yellow); + + +// Special Variations +COLORGROUP_SPECIAL(green_pattern); + + + +// Turbans with face protection mask + +// Black with black mask class H_turban_02_mask_black_lxws: EGVAR(wardrobe,turban) { class modifiableTo { class CN(01,black); @@ -95,22 +111,7 @@ class lxWS_H_turban_04_black: EGVAR(wardrobe,turban) { }; }; - -// VARIATIONS -COLORGROUP(blue); -COLORGROUP(blue_una); -COLORGROUP(green); -COLORGROUP(red); -COLORGROUP(gray); -COLORGROUP(yellow); - - -// Special Variations -COLORGROUP_SPECIAL(green_pattern); - - - -// Super Special Manual blabla +// Sand with 2 different Masks class H_turban_02_mask_snake_lxws: EGVAR(wardrobe,turban) { class modifiableTo { class CN(01,sand); diff --git a/addons/compat_ws/compat_ws_wardrobe/CfgWeapons.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWeapons.hpp index 64227bf0aec..3c1d12b793e 100644 --- a/addons/compat_ws/compat_ws_wardrobe/CfgWeapons.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/CfgWeapons.hpp @@ -1,30 +1,31 @@ +class CfgWeapons { -class ItemCore; -class HelmetBase: ItemCore { - class ItemInfo; -}; + // BASECLASSES + class ItemCore; + class HelmetBase: ItemCore { + class ItemInfo; + }; -// CfgWeapons -// BASECLASS -class H_Shemag_khk; -class HeadgearItem; + class H_Shemag_khk; + class HeadgearItem; -class H_turban_02_mask_black_lxws: H_Shemag_khk { - class ItemInfo: HeadgearItem { - mass = 26; + class H_turban_02_mask_black_lxws: H_Shemag_khk { + class ItemInfo: HeadgearItem { + mass = 26; + }; }; -}; -//// RF Helmets with Glasses -class lxWS_H_PASGT_goggles_UN_F: HelmetBase { - MASS(32); -}; -class lxWS_H_PASGT_goggles_black_F: lxWS_H_PASGT_goggles_UN_F { - MASS(32); -}; -class lxWS_H_PASGT_goggles_olive_F: lxWS_H_PASGT_goggles_UN_F { - MASS(32); -}; -class lxWS_H_PASGT_goggles_white_F: lxWS_H_PASGT_goggles_UN_F { - MASS(32); + //// RF Helmets with Glasses, adjust mass by adding weight of glasses + class lxWS_H_PASGT_goggles_UN_F: HelmetBase { + MASS(32); + }; + class lxWS_H_PASGT_goggles_black_F: lxWS_H_PASGT_goggles_UN_F { + MASS(32); + }; + class lxWS_H_PASGT_goggles_olive_F: lxWS_H_PASGT_goggles_UN_F { + MASS(32); + }; + class lxWS_H_PASGT_goggles_white_F: lxWS_H_PASGT_goggles_UN_F { + MASS(32); + }; }; diff --git a/addons/compat_ws/compat_ws_wardrobe/config.cpp b/addons/compat_ws/compat_ws_wardrobe/config.cpp index f5df153e6a4..36eea5bf147 100644 --- a/addons/compat_ws/compat_ws_wardrobe/config.cpp +++ b/addons/compat_ws/compat_ws_wardrobe/config.cpp @@ -19,4 +19,5 @@ class CfgPatches { }; }; +#include "CfgWeapons.hpp" #include "CfgWardrobe.hpp" From 69e71f8dc6b03970d094a85cb24d621c84ccd95f Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 6 May 2025 15:16:26 +0200 Subject: [PATCH 184/305] compat sog cleanup + adj maxLoad of o uniforms --- .../compat_sog_wardrobe/CfgGlasses.hpp | 7 + .../compat_sog_wardrobe/CfgWardrobe.hpp | 19 --- .../CfgWardrobe_Booniehats.hpp | 2 +- .../compat_sog_wardrobe/CfgWeapons.hpp | 151 ++++++++++++++++++ .../compat_sog_wardrobe/Facewear.hpp | 5 - .../compat_sog_wardrobe/Helmets.hpp | 52 ------ .../compat_sog_wardrobe/Uniforms_B.hpp | 46 ------ .../compat_sog_wardrobe/Uniforms_O.hpp | 24 --- .../compat_sog/compat_sog_wardrobe/config.cpp | 4 + 9 files changed, 163 insertions(+), 147 deletions(-) create mode 100644 addons/compat_sog/compat_sog_wardrobe/CfgGlasses.hpp create mode 100644 addons/compat_sog/compat_sog_wardrobe/CfgWeapons.hpp delete mode 100644 addons/compat_sog/compat_sog_wardrobe/Facewear.hpp delete mode 100644 addons/compat_sog/compat_sog_wardrobe/Helmets.hpp delete mode 100644 addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp delete mode 100644 addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp diff --git a/addons/compat_sog/compat_sog_wardrobe/CfgGlasses.hpp b/addons/compat_sog/compat_sog_wardrobe/CfgGlasses.hpp new file mode 100644 index 00000000000..a72424db221 --- /dev/null +++ b/addons/compat_sog/compat_sog_wardrobe/CfgGlasses.hpp @@ -0,0 +1,7 @@ +class CfgGlasses { + // Goggles with Mask + class vn_glasses_base; + class vn_o_acc_goggles_03: vn_glasses_base { + mass = 4; + }; +}; diff --git a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp index a90cef6a5f0..414d89d3b0e 100644 --- a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp @@ -1,22 +1,3 @@ - -// Adjust Mass of Objects for consistency's sake -class CfgWeapons { - // Base Classes - class H_Booniehat_khk; - class vn_b_headgear_base; - class vn_o_headgear_base: H_Booniehat_khk { - class ItemInfo; - }; - #include "Helmets.hpp" - #include "Uniforms_B.hpp" - // #include "Uniforms_O.hpp" // ToDo -}; -class CfgGlasses { - #include "Facewear.hpp" -}; - - -// Actual CfgWardrobe Compat class ace_wardrobe { #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" diff --git a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Booniehats.hpp b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Booniehats.hpp index d7b0c52496a..b0f0d622d44 100644 --- a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Booniehats.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Booniehats.hpp @@ -148,4 +148,4 @@ class CN(08,02): EGVAR(wardrobe,base) { class CN(06,02); class CN(07,02); }; -}; \ No newline at end of file +}; diff --git a/addons/compat_sog/compat_sog_wardrobe/CfgWeapons.hpp b/addons/compat_sog/compat_sog_wardrobe/CfgWeapons.hpp new file mode 100644 index 00000000000..b62b2ad938e --- /dev/null +++ b/addons/compat_sog/compat_sog_wardrobe/CfgWeapons.hpp @@ -0,0 +1,151 @@ +class CfgWeapons { + + // Headgear + class H_Booniehat_khk; + class vn_b_headgear_base; + class vn_o_headgear_base: H_Booniehat_khk { + class ItemInfo; + }; + + class vn_b_helmet_m1_01_01: vn_b_headgear_base { + class ItemInfo; + }; + + // Helmets with/without Goggles + class vn_b_helmet_m1_14_01: vn_b_helmet_m1_01_01 {}; + + + class vn_b_helmet_m1_20_01 : vn_b_helmet_m1_14_01 { + MASS(12); + }; + class vn_b_helmet_m1_20_02 : vn_b_helmet_m1_20_01 { + MASS(12); + }; + + + //// VN Pilot Helmet + // With Goggles + class vn_o_helmet_shl61_01: vn_o_headgear_base { + MASS(12); + }; + // Without Goggles + class vn_o_helmet_shl61_02: vn_o_helmet_shl61_01 { + MASS(10); + }; + + + // US Vic Crew Helmets + class vn_b_helmet_t56_01_01: vn_b_headgear_base { + class ItemInfo; + }; + class vn_b_helmet_t56_02_01: vn_b_helmet_t56_01_01 { + MASS(12); + }; + + class vn_b_helmet_t56_02_02: vn_b_helmet_t56_02_01 { + MASS(12); + }; + + class vn_b_helmet_t56_02_03: vn_b_helmet_t56_02_01 { + MASS(12); + }; + + // VN Pith Helmet with Crew Goggles + class vn_o_helmet_nva_01: vn_o_headgear_base { + class ItemInfo; + }; + class vn_o_helmet_nva_05: vn_o_helmet_nva_01 { + MASS(12); + }; + + + // Uniform + // Common Uniform Base Class + class Uniform_Base; + + // BLUFOR Uniform Base Class + class vn_b_uniform_base: Uniform_Base { + class ItemInfo; + }; + + // BLUFOR Uniform Macros + #define ITEMINFO_FIX(num)\ + class ItemInfo: ItemInfo {\ + containerClass = QUOTE(Supply##num);\ + mass = num;\ + } + + #define UNIFORM_BASE_B_ITEMINFO_FIX(class2)\ + class class2: vn_b_uniform_base {\ + ITEMINFO_FIX(70);\ + } + + #define B_U(div,var,camo) vn_b_uniform_##div##_##var##_##camo + #define B_U_FIX(div,up,camo) UNIFORM_BASE_B_ITEMINFO_FIX(B_U(div,up,camo)) + + // MACV + #define OLIVE_FIELD 01 + #define TIGER 02 + #define TIGER_GREEN 05 + #define ERDL_BROWN 06 + #define OLIVE 07 + #define LEOPARD 08 + #define ERDL 15 + #define LIZARD 16 + #define BDQ 17 + #define FROG 18 + + // macv 05 and 04 have inconsistency between them -> different uniform maxLoad. This likely will cause the player to loose items when the uniform is filled to the brim. Difference is 1lb which translates to 16~17x ace bandages or 1x 1l blood + B_U_FIX(macv,04,OLIVE_FIELD); + B_U_FIX(macv,04,TIGER); + B_U_FIX(macv,04,TIGER_GREEN); + B_U_FIX(macv,04,ERDL_BROWN); + B_U_FIX(macv,04,OLIVE); + B_U_FIX(macv,04,LEOPARD); + B_U_FIX(macv,04,ERDL); + B_U_FIX(macv,04,LIZARD); + B_U_FIX(macv,04,BDQ); + B_U_FIX(macv,04,FROG); + + // OPFOR Uniform Base Class + class vn_o_uniform_base: Uniform_Base { + class ItemInfo; + }; + + // OPFOR Uniform Macro + #define UNIFORM_BASE_O_ITEMINFO_FIX(classname)\ + class classname: vn_o_uniform_base {\ + ITEMINFO_FIX(60);\ + } + + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_nva_army_02_01); + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_nva_army_02_02); + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_nva_army_02_03); + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_nva_army_02_04); + + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_nva_army_04_01); + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_nva_army_04_02); + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_nva_army_04_03); + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_nva_army_04_04); + + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_nva_army_06_03); + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_nva_army_06_04); + + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_nva_army_08_03); + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_nva_army_08_04); + + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_nva_army_10_03); + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_nva_army_10_04); + + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_nva_army_12_03); + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_nva_army_12_04); + + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_vc_reg_12_08); + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_vc_reg_12_09); + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_vc_reg_12_10); + + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_vc_mf_02_07); + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_vc_mf_04_07); + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_vc_mf_10_07); + UNIFORM_BASE_O_ITEMINFO_FIX(vn_o_uniform_vc_mf_12_07); +}; diff --git a/addons/compat_sog/compat_sog_wardrobe/Facewear.hpp b/addons/compat_sog/compat_sog_wardrobe/Facewear.hpp deleted file mode 100644 index 5671aeca7d4..00000000000 --- a/addons/compat_sog/compat_sog_wardrobe/Facewear.hpp +++ /dev/null @@ -1,5 +0,0 @@ -// Goggles with Mask -class vn_glasses_base; -class vn_o_acc_goggles_03: vn_glasses_base { - mass = 4; -}; \ No newline at end of file diff --git a/addons/compat_sog/compat_sog_wardrobe/Helmets.hpp b/addons/compat_sog/compat_sog_wardrobe/Helmets.hpp deleted file mode 100644 index 87ca2963664..00000000000 --- a/addons/compat_sog/compat_sog_wardrobe/Helmets.hpp +++ /dev/null @@ -1,52 +0,0 @@ -// CfgWeapons - -class vn_b_helmet_m1_01_01: vn_b_headgear_base { - class ItemInfo; -}; - -// Helmets with/without Goggles -class vn_b_helmet_m1_14_01: vn_b_helmet_m1_01_01 {}; - - -class vn_b_helmet_m1_20_01 : vn_b_helmet_m1_14_01 { - MASS(12); -}; -class vn_b_helmet_m1_20_02 : vn_b_helmet_m1_20_01 { - MASS(12); -}; - - -//// VN Pilot Helmet -// With Goggles -class vn_o_helmet_shl61_01: vn_o_headgear_base { - MASS(12); -}; -// Without Goggles -class vn_o_helmet_shl61_02: vn_o_helmet_shl61_01 { - MASS(10); -}; - - -// US Vic Crew Helmets -class vn_b_helmet_t56_01_01: vn_b_headgear_base { - class ItemInfo; -}; -class vn_b_helmet_t56_02_01: vn_b_helmet_t56_01_01 { - MASS(12); -}; - -class vn_b_helmet_t56_02_02: vn_b_helmet_t56_02_01 { - MASS(12); -}; - -class vn_b_helmet_t56_02_03: vn_b_helmet_t56_02_01 { - MASS(12); -}; - -// VN Pith Helmet with Crew Goggles -class vn_o_helmet_nva_01: vn_o_headgear_base { - class ItemInfo; -}; -class vn_o_helmet_nva_05: vn_o_helmet_nva_01 { - MASS(12); -}; diff --git a/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp b/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp deleted file mode 100644 index 6d636be9db1..00000000000 --- a/addons/compat_sog/compat_sog_wardrobe/Uniforms_B.hpp +++ /dev/null @@ -1,46 +0,0 @@ -class Uniform_Base; -class vn_b_uniform_base: Uniform_Base { - class ItemInfo; -}; - -// Macros -#define ITEMINFO_FIX()\ -class ItemInfo: ItemInfo {\ - containerClass = "Supply70";\ - mass = 70;\ -} - -#define UNIFORM_BASE_B_ITEMINFO_FIX(class2)\ -class class2: vn_b_uniform_base {\ - ITEMINFO_FIX();\ -} - -#define B_U(div,var,camo) vn_b_uniform_##div##_##var##_##camo -#define B_U_PAIR_FIX(div,up,camo) UNIFORM_BASE_B_ITEMINFO_FIX(B_U(div,up,camo)) - -// MACV -#define OLIVE_FIELD 01 -#define TIGER 02 -#define TIGER_GREEN 05 -#define ERDL_BROWN 06 -#define OLIVE 07 -#define LEOPARD 08 -#define ERDL 15 -#define LIZARD 16 -#define BDQ 17 -#define FROG 18 - -// macv 05 and 04 have inconsistency between them -> different uniform maxLoad. This likely will cause the player to loose items when the uniform is filled to the brim. Difference is 1lb which translates to 16~17x ace bandages or 1x 1l blood -#define B_U_PAIR_SET(camo)\ -B_U_PAIR_FIX(macv,04,camo) - -B_U_PAIR_SET(OLIVE_FIELD); -B_U_PAIR_SET(TIGER); -B_U_PAIR_SET(TIGER_GREEN); -B_U_PAIR_SET(ERDL_BROWN); -B_U_PAIR_SET(OLIVE); -B_U_PAIR_SET(LEOPARD); -B_U_PAIR_SET(ERDL); -B_U_PAIR_SET(LIZARD); -B_U_PAIR_SET(BDQ); -B_U_PAIR_SET(FROG); diff --git a/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp b/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp deleted file mode 100644 index 8b34cf4dd53..00000000000 --- a/addons/compat_sog/compat_sog_wardrobe/Uniforms_O.hpp +++ /dev/null @@ -1,24 +0,0 @@ -// ToDo: adjust container maximumLoad to 60 for the following classes -vn_o_uniform_nva_army_02_01 -vn_o_uniform_nva_army_02_02 -vn_o_uniform_nva_army_02_03 -vn_o_uniform_nva_army_02_04 -vn_o_uniform_vc_mf_02_07 -vn_o_uniform_nva_army_04_01 -vn_o_uniform_nva_army_04_02 -vn_o_uniform_nva_army_04_03 -vn_o_uniform_nva_army_04_04 -vn_o_uniform_vc_mf_04_07 -vn_o_uniform_nva_army_06_03 -vn_o_uniform_nva_army_06_04 -vn_o_uniform_nva_army_08_03 -vn_o_uniform_nva_army_08_04 -vn_o_uniform_nva_army_10_03 -vn_o_uniform_nva_army_10_04 -vn_o_uniform_vc_mf_10_07 -vn_o_uniform_nva_army_12_03 -vn_o_uniform_nva_army_12_04 -vn_o_uniform_vc_mf_12_07 -vn_o_uniform_vc_reg_12_08 -vn_o_uniform_vc_reg_12_09 -vn_o_uniform_vc_reg_12_10 \ No newline at end of file diff --git a/addons/compat_sog/compat_sog_wardrobe/config.cpp b/addons/compat_sog/compat_sog_wardrobe/config.cpp index 108f13ae1be..451aa2a793b 100644 --- a/addons/compat_sog/compat_sog_wardrobe/config.cpp +++ b/addons/compat_sog/compat_sog_wardrobe/config.cpp @@ -19,4 +19,8 @@ class CfgPatches { }; }; +// Adjust Mass of Objects and/or containerSize for consistency's sake +#include "CfgWeapons.hpp" +#include "CfgGlasses.hpp" +// ace wardrobe compatibility #include "CfgWardrobe.hpp" From 706ba5ada7cf421f2425aaed8e77e7ecb8c5a36a Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 6 May 2025 15:21:39 +0200 Subject: [PATCH 185/305] gm compat cleanup --- .../compat_gm_wardrobe/CfgWardrobe.hpp | 4 +- .../CfgWardrobe_Helmets.hpp | 2 +- .../CfgWardrobe_Uniform.hpp | 7 +- .../compat_gm_wardrobe/CfgWeapons.hpp | 108 +++++++++--------- .../compat_gm/compat_gm_wardrobe/config.cpp | 8 +- 5 files changed, 63 insertions(+), 66 deletions(-) diff --git a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp index 6798281da92..01dcd739294 100644 --- a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp @@ -1,8 +1,6 @@ - -// Actual CfgWardrobe Compat class ace_wardrobe { #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" #include "CfgWardrobe_Helmets.hpp" #include "CfgWardrobe_Uniform.hpp" -}; \ No newline at end of file +}; diff --git a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Helmets.hpp b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Helmets.hpp index 158ccf45baa..01afad037f5 100644 --- a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Helmets.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Helmets.hpp @@ -66,4 +66,4 @@ class gm_ge_headgear_sidecap_80_m62_oli: EGVAR(wardrobe,base) { class gm_ge_headgear_m62_net; }; components[] = {"gm_ge_headgear_sidecap_80_oli","gm_ge_headgear_m62_net"}; -}; \ No newline at end of file +}; diff --git a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Uniform.hpp b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Uniform.hpp index 56c999d075f..2152cab95d4 100644 --- a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Uniform.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Uniform.hpp @@ -1,4 +1,3 @@ -// CfgWeapons // Sleeves // UNIFORM_SLEEVES(variantSleevesDown,variantSleevesUp); @@ -27,8 +26,8 @@ UNIFORM_GLOVES(gm_gc_army_uniform_soldier_gloves_80_str,gm_gc_army_uniform_soldi UNIFORM_GLOVES(gm_ge_army_uniform_soldier_gloves_80_ols,gm_ge_army_uniform_soldier_80_ols); -// Gloves, Sleeves Up and Base Variant -// Manual configuration +// Gloves, Sleeves Up and Base Variant -> Manual configuration +// Woodland Variant class gm_xx_uniform_soldier_bdu_80_wdl: EGVAR(wardrobe,base_U_gloves_on) { class modifiableTo { class gm_xx_uniform_soldier_bdu_rolled_80_wdl; @@ -48,7 +47,7 @@ class gm_xx_uniform_soldier_bdu_nogloves_80_wdl: EGVAR(wardrobe,base) { }; }; - +// Olive variant class gm_xx_uniform_soldier_bdu_80_oli: EGVAR(wardrobe,base_U_gloves_on) { class modifiableTo { class gm_xx_uniform_soldier_bdu_rolled_80_oli; diff --git a/addons/compat_gm/compat_gm_wardrobe/CfgWeapons.hpp b/addons/compat_gm/compat_gm_wardrobe/CfgWeapons.hpp index c89c0e8537d..5fad019ec0e 100644 --- a/addons/compat_gm/compat_gm_wardrobe/CfgWeapons.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/CfgWeapons.hpp @@ -1,54 +1,56 @@ -// CfgWeapons - -// Increase mass of helmets with glasses by mass of glasses -#define GM_Helmet_Glasses(Classname,BaseClass)\ -class Classname: BaseClass {\ - MASS(11);\ -} - -class gm_ge_headgear_m92_base; -class gm_ge_headgear_m92_cover_base; - -class gm_ge_headgear_m92_glasses_base: gm_ge_headgear_m92_base { - class ItemInfo; -}; - -class gm_ge_headgear_m92_cover_glasses_base: gm_ge_headgear_m92_base { - class ItemInfo; -}; - -GM_Helmet_Glasses(gm_ge_headgear_m92_cover_glasses_win,gm_ge_headgear_m92_cover_glasses_base); -GM_Helmet_Glasses(gm_ge_headgear_m92_cover_glasses_oli,gm_ge_headgear_m92_cover_glasses_base); -GM_Helmet_Glasses(gm_ge_headgear_m92_cover_glasses_blk,gm_ge_headgear_m92_cover_glasses_base); - -GM_Helmet_Glasses(gm_ge_headgear_m92_glasses_trp,gm_ge_headgear_m92_glasses_base); -GM_Helmet_Glasses(gm_ge_headgear_m92_glasses_flk,gm_ge_headgear_m92_glasses_base); - - -class gm_headgear_armored_base; -class gm_ge_headgear_m38_72_base; -class gm_ge_headgear_m38_72_goggles_base: gm_headgear_armored_base { - class ItemInfo; -}; -GM_Helmet_Glasses(gm_ge_bgs_headgear_m38_72_goggles_bgr,gm_ge_headgear_m38_72_goggles_base); - -// Caps with M62 Helmets -// Base Classes -class gm_ge_headgear_hat_base; - -class gm_ge_headgear_hat_80_base: gm_ge_headgear_hat_base { - class ItemInfo; -}; -class gm_ge_headgear_sidecap_base; -class gm_ge_headgear_sidecap_80_base: gm_ge_headgear_sidecap_base { - class ItemInfo; -}; - -// Increase mass of helmets with hat by mass of hat -// Hats + Helmets -class gm_ge_headgear_hat_80_m62_oli: gm_ge_headgear_hat_80_base { - MASS(20); -}; -class gm_ge_headgear_sidecap_80_m62_oli: gm_ge_headgear_sidecap_80_base { - MASS(20); +class CfgWeapons { + // Base Classes + class gm_ge_headgear_m92_base; + class gm_ge_headgear_m92_cover_base; + class gm_ge_headgear_m92_glasses_base: gm_ge_headgear_m92_base { + class ItemInfo; + }; + class gm_ge_headgear_m92_cover_glasses_base: gm_ge_headgear_m92_base { + class ItemInfo; + }; + + + // Increase mass of helmets with glasses by mass of glasses + #define GM_Helmet_Glasses(Classname,BaseClass)\ + class Classname: BaseClass {\ + MASS(11);\ + } + + GM_Helmet_Glasses(gm_ge_headgear_m92_cover_glasses_win,gm_ge_headgear_m92_cover_glasses_base); + GM_Helmet_Glasses(gm_ge_headgear_m92_cover_glasses_oli,gm_ge_headgear_m92_cover_glasses_base); + GM_Helmet_Glasses(gm_ge_headgear_m92_cover_glasses_blk,gm_ge_headgear_m92_cover_glasses_base); + + GM_Helmet_Glasses(gm_ge_headgear_m92_glasses_trp,gm_ge_headgear_m92_glasses_base); + GM_Helmet_Glasses(gm_ge_headgear_m92_glasses_flk,gm_ge_headgear_m92_glasses_base); + + + // Base Classes + class gm_headgear_armored_base; + class gm_ge_headgear_m38_72_base; + class gm_ge_headgear_m38_72_goggles_base: gm_headgear_armored_base { + class ItemInfo; + }; + + GM_Helmet_Glasses(gm_ge_bgs_headgear_m38_72_goggles_bgr,gm_ge_headgear_m38_72_goggles_base); + + + // Caps with M62 Helmets + // Base Classes + class gm_ge_headgear_hat_base; + + class gm_ge_headgear_hat_80_base: gm_ge_headgear_hat_base { + class ItemInfo; + }; + class gm_ge_headgear_sidecap_base; + class gm_ge_headgear_sidecap_80_base: gm_ge_headgear_sidecap_base { + class ItemInfo; + }; + + // Increase mass of helmets with hat by mass of hat + class gm_ge_headgear_hat_80_m62_oli: gm_ge_headgear_hat_80_base { + MASS(20); + }; + class gm_ge_headgear_sidecap_80_m62_oli: gm_ge_headgear_sidecap_80_base { + MASS(20); + }; }; diff --git a/addons/compat_gm/compat_gm_wardrobe/config.cpp b/addons/compat_gm/compat_gm_wardrobe/config.cpp index 23cd443beea..d6be6166e9e 100644 --- a/addons/compat_gm/compat_gm_wardrobe/config.cpp +++ b/addons/compat_gm/compat_gm_wardrobe/config.cpp @@ -19,10 +19,8 @@ class CfgPatches { }; }; -// Adjust Mass of Objects for consistency's sake -class CfgWeapons { - #include "CfgWeapons.hpp" -}; - +// Adjust Mass of Objects and/or containerSize for consistency's sake +#include "CfgWeapons.hpp" +// ace wardrobe compatibility #include "CfgWardrobe.hpp" From 05da5332e771f97e82cae9f12f1f40e869e38e04 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 6 May 2025 15:23:09 +0200 Subject: [PATCH 186/305] compat rf cleanup --- addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp | 2 +- addons/compat_rf/compat_rf_wardrobe/CfgWardrobe_Helmets.hpp | 2 +- addons/compat_rf/compat_rf_wardrobe/CfgWardrobe_Uniforms.hpp | 2 +- addons/compat_rf/compat_rf_wardrobe/config.cpp | 3 +++ 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp index 95356ffb9cf..5ed6ef222c5 100644 --- a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp @@ -3,4 +3,4 @@ class ace_wardrobe { #include "CfgWardrobe_Helmets.hpp" #include "CfgWardrobe_Uniforms.hpp" -}; \ No newline at end of file +}; diff --git a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe_Helmets.hpp b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe_Helmets.hpp index a6aa304ef34..952a22c25a6 100644 --- a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe_Helmets.hpp +++ b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe_Helmets.hpp @@ -16,4 +16,4 @@ HELMET_VARIANT(Olive); HELMET_VARIANT(White); // Cap (Ion) Forward and Reversed -BASE_PAIR(lxWS_H_CapB_rvs_blk_ION,H_Cap_headphones_ion_lxws); \ No newline at end of file +BASE_PAIR(lxWS_H_CapB_rvs_blk_ION,H_Cap_headphones_ion_lxws); diff --git a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe_Uniforms.hpp b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe_Uniforms.hpp index 4a78ed5b377..4af00222d94 100644 --- a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe_Uniforms.hpp +++ b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe_Uniforms.hpp @@ -7,4 +7,4 @@ UNIFORM_JACKET(variantJacketOpen,variantJacketClosed); UNIFORM_JACKET(U_C_PilotJacket_open_black_RF,U_C_PilotJacket_black_RF); UNIFORM_JACKET(U_C_PilotJacket_open_brown_RF,U_C_PilotJacket_brown_RF); -UNIFORM_JACKET(U_C_PilotJacket_open_lbrown_RF,U_C_PilotJacket_lbrown_RF); \ No newline at end of file +UNIFORM_JACKET(U_C_PilotJacket_open_lbrown_RF,U_C_PilotJacket_lbrown_RF); diff --git a/addons/compat_rf/compat_rf_wardrobe/config.cpp b/addons/compat_rf/compat_rf_wardrobe/config.cpp index 8039ddb493e..476e3563f58 100644 --- a/addons/compat_rf/compat_rf_wardrobe/config.cpp +++ b/addons/compat_rf/compat_rf_wardrobe/config.cpp @@ -19,4 +19,7 @@ class CfgPatches { }; }; +// Adjust Mass of Objects and/or containerSize for consistency's sake + +// ace wardrobe compatibility #include "CfgWardrobe.hpp" From c89fc8deca83b15fb998bd2b4df6c582696b1b23 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 6 May 2025 15:24:30 +0200 Subject: [PATCH 187/305] compat ws cleanup --- addons/compat_ws/compat_ws_wardrobe/Turbans.hpp | 0 addons/compat_ws/compat_ws_wardrobe/config.cpp | 3 +++ addons/compat_ws/compat_ws_wardrobe/script_component.hpp | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) delete mode 100644 addons/compat_ws/compat_ws_wardrobe/Turbans.hpp diff --git a/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp b/addons/compat_ws/compat_ws_wardrobe/Turbans.hpp deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/addons/compat_ws/compat_ws_wardrobe/config.cpp b/addons/compat_ws/compat_ws_wardrobe/config.cpp index 36eea5bf147..be549aea737 100644 --- a/addons/compat_ws/compat_ws_wardrobe/config.cpp +++ b/addons/compat_ws/compat_ws_wardrobe/config.cpp @@ -19,5 +19,8 @@ class CfgPatches { }; }; +// Adjust Mass of Objects and/or containerSize for consistency's sake #include "CfgWeapons.hpp" + +// ace wardrobe compatibility #include "CfgWardrobe.hpp" diff --git a/addons/compat_ws/compat_ws_wardrobe/script_component.hpp b/addons/compat_ws/compat_ws_wardrobe/script_component.hpp index 67ddb91ef0a..33ff700f410 100644 --- a/addons/compat_ws/compat_ws_wardrobe/script_component.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/script_component.hpp @@ -2,4 +2,4 @@ #define SUBCOMPONENT_BEAUTIFIED Wardrobe #include "..\script_component.hpp" -#include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp" \ No newline at end of file +#include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp" From 2b1e6b4af9e5fd3c373348c890bc238ec5ddad9d Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 6 May 2025 15:26:13 +0200 Subject: [PATCH 188/305] rephrasing --- addons/compat_gm/compat_gm_wardrobe/config.cpp | 4 ++-- addons/compat_rf/compat_rf_wardrobe/config.cpp | 4 ++-- addons/compat_sog/compat_sog_wardrobe/config.cpp | 4 ++-- addons/compat_ws/compat_ws_wardrobe/config.cpp | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/addons/compat_gm/compat_gm_wardrobe/config.cpp b/addons/compat_gm/compat_gm_wardrobe/config.cpp index d6be6166e9e..61027837c3c 100644 --- a/addons/compat_gm/compat_gm_wardrobe/config.cpp +++ b/addons/compat_gm/compat_gm_wardrobe/config.cpp @@ -19,8 +19,8 @@ class CfgPatches { }; }; -// Adjust Mass of Objects and/or containerSize for consistency's sake +// For Consistency: Adjust Mass/containerSize #include "CfgWeapons.hpp" -// ace wardrobe compatibility +// ACE Wardrobe #include "CfgWardrobe.hpp" diff --git a/addons/compat_rf/compat_rf_wardrobe/config.cpp b/addons/compat_rf/compat_rf_wardrobe/config.cpp index 476e3563f58..9cf1eba4ac6 100644 --- a/addons/compat_rf/compat_rf_wardrobe/config.cpp +++ b/addons/compat_rf/compat_rf_wardrobe/config.cpp @@ -19,7 +19,7 @@ class CfgPatches { }; }; -// Adjust Mass of Objects and/or containerSize for consistency's sake +// For Consistency: Adjust Mass/containerSize -// ace wardrobe compatibility +// ACE Wardrobe #include "CfgWardrobe.hpp" diff --git a/addons/compat_sog/compat_sog_wardrobe/config.cpp b/addons/compat_sog/compat_sog_wardrobe/config.cpp index 451aa2a793b..9ae248bd6be 100644 --- a/addons/compat_sog/compat_sog_wardrobe/config.cpp +++ b/addons/compat_sog/compat_sog_wardrobe/config.cpp @@ -19,8 +19,8 @@ class CfgPatches { }; }; -// Adjust Mass of Objects and/or containerSize for consistency's sake +// For Consistency: Adjust Mass/containerSize #include "CfgWeapons.hpp" #include "CfgGlasses.hpp" -// ace wardrobe compatibility +// ACE Wardrobe #include "CfgWardrobe.hpp" diff --git a/addons/compat_ws/compat_ws_wardrobe/config.cpp b/addons/compat_ws/compat_ws_wardrobe/config.cpp index be549aea737..4065a90f8ea 100644 --- a/addons/compat_ws/compat_ws_wardrobe/config.cpp +++ b/addons/compat_ws/compat_ws_wardrobe/config.cpp @@ -19,8 +19,8 @@ class CfgPatches { }; }; -// Adjust Mass of Objects and/or containerSize for consistency's sake +// For Consistency: Adjust Mass/containerSize #include "CfgWeapons.hpp" -// ace wardrobe compatibility +// ACE Wardrobe #include "CfgWardrobe.hpp" From 2927aba2efe6e08fc63855e01a8f0025ccf9a726 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 6 May 2025 17:06:18 +0200 Subject: [PATCH 189/305] Update wardrobe-framework.md --- docs/wiki/framework/wardrobe-framework.md | 207 ++++++++++------------ 1 file changed, 92 insertions(+), 115 deletions(-) diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index fda3f4ff1a7..955464744ab 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -19,7 +19,7 @@ The Wardrobe Addon gives the player the opportunity to change/modify their curre For example, if a uniform has a normal variant and a "Rolled-Up Sleeves" variant, the player will be able to use ether an ACE Self Interaction or the CBA Context Menu in the Inventory. -Since there is no reliable, common pattern in terms of class inheritance, not even within the same DLC, each possible variant has to be defined individually within the classes' config properties. +Since there is no reliable, common patterns in terms of class inheritance, not even within the same DLC, each possible variant has to be defined individually within `configFile >> "ace_wardrobe"`. ### 1.1 Components @@ -46,7 +46,7 @@ Only directly defined Subclasses will be taken into account. A fully inherited s | Class Property | Data Type | Description | | -------------- | ----------- | ----------- | -| `modifiableTo[]` | Array of Classnames | possible Variants this item can be turned into. | +| `modifiableTo` | Subclasses | possible Variants this item can be turned into. | | `components[]` | Array of Classnames | Components the current variant contains within itself | | `sound[]` | Array of CfgSound Entries | to be chosen by random when the action is performed | | `sound_timing` | Number 0..1 | defines the point time relative to the duration when the sound is played | @@ -57,28 +57,31 @@ Only directly defined Subclasses will be taken into account. A fully inherited s ### 2.2 Base Classes -#### 2.2.1 Base +All base classes can be found in `addons\wardrobe\BaseClasses.hpp` +#### 2.2.1 Base ```cpp // root of configFile -class ace_wardrobe_base { +class ace_wardrobe { + class ace_wardrobe_base { - modifiableTo[] = {""}; + class modifiableTo {}; - components[] = {}; + components[] = {}; - // Supports Multiple Sounds, will pick one by random. - sound[] = { "ace_wardrobe_fabric_06", "ace_wardrobe_fabric_07", "ace_wardrobe_fabric_16", "ace_wardrobe_fabric_20", "ace_wardrobe_fabric_25"}; - sound_timing = 0; // [0..1] 0 at the start of the action, 0.5 half way during the duration of the action - always, if completed or not. 1 at the end, only when completed. + // Supports Multiple Sounds, will pick one by random. + sound[] = { "ace_wardrobe_fabric_06", "ace_wardrobe_fabric_07", "ace_wardrobe_fabric_16", "ace_wardrobe_fabric_20", "ace_wardrobe_fabric_25"}; + sound_timing = 0; // [0..1] 0 at the start of the action, 0.5 half way during the duration of the action - always, if completed or not. 1 at the end, only when completed. - // Gesture - gesture = "Gear"; + // Gesture + gesture = "Gear"; - // These will be read from the Target Class, so for example, the uniformclass with the rolled up sleaves, it should say "Roll Up Sleeves" - alternativePicture = ""; - alternativeDisplayName = ""; + // These will be read from the Target Class, so for example, the uniformclass with the rolled up sleaves, it should say "Roll Up Sleeves" + alternativePicture = ""; + alternativeDisplayName = ""; - duration = 1; // Minimum Value: 1 - Anything above will produce a progressbar. + duration = 1; // Minimum Value: 1 - Anything above will produce a progressbar. + }; }; ``` @@ -153,137 +156,102 @@ class ace_wardrobe_base_H_goggles_off: ace_wardrobe_base { }; ``` +## 3. Porting - Ease of Use +### 3.1 Macros +To streamline the configuration of compatible items a set of macro's can be found here `addons\wardrobe\script_macros_wardrobe.hpp` -## 3. Examples - -### 3.1 Linear Example +### 3.2 BaseClasses +All pre-configured base classes can be imported by simply including the following file `"\z\ace\addons\wardrobe\BaseClasses_Import.hpp"` +### 3.3 Example +```cpp +#include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp +class ace_wardrobe { + #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" -- First, we import the wardrobe base classes `ace_wardrobe_base_U_sleeves_down` and `ace_wardrobe_base_U_sleeves_up` at the root of `configFile`. -- The uniform we would like to configure is part of `CfgWeapons` and inherits from `Uniform_Base`. -- Then we edit the desired classes and create the `ace_wardrobe` subclass by inheriting from the parent base classes. -- Afterwards, we define which variants this class can be modified to. -- This example does not require the use of components since we're not adding or removing anything. + // Begin to define your configs ... +}; +``` +## 4. Configuration Examples +### 4.1 Simple Example - Uniform Sleeves - No requirement for Components ```cpp -// config.cpp -class ace_wardrobe_base_U_sleeves_down; -class ace_wardrobe_base_U_sleeves_up; - -class CfgWeapons { - class Uniform_Base; - - // Sleeves Down Variant - class U_B_CTRG_1: Uniform_Base { - class ace_wardrobe: ace_wardrobe_base_U_sleeves_down { - modifiableTo[] = { "U_B_CTRG_3" }; - components[] = {}; +class ace_wardrobe { + #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" + + class U_B_CTRG_1: ace_wardrobe_base_U_sleeves_down { + components[] = {}; + class modifiableTo { + class U_B_CTRG_3; }; }; - // Sleeves Up Variant - class U_B_CTRG_3: Uniform_Base { - class ace_wardrobe: ace_wardrobe_base_U_sleeves_up { - modifiableTo[] = { "U_B_CTRG_1" }; - components[] = {}; + class U_B_CTRG_3: ace_wardrobe_base_U_sleeves_up { + components[] = {}; + class modifiableTo { + class U_B_CTRG_1; }; }; }; -``` -### 3.2 Complex example with partial use of components - +``` +### 4.2 Advanced Example - Balaclava with Combat Glasses - Partial use of Components ```cpp -// config.cpp -class ace_wardrobe_base; - -class CfgWeapons { - // BASECLASS - class H_Shemag_khk; - - // WS Turban with Ballistic Mask - class H_turban_02_mask_black_lxws: H_Shemag_khk { - class ace_wardrobe: ace_wardrobe_base { - modifiableTo[] = { "lxWS_H_turban_01_black", "lxWS_H_turban_02_black", "lxWS_H_turban_03_black", "lxWS_H_turban_04_black" }; - components[] = { "lxWS_H_bmask_base" }; - }; - }; - // WS Turban Variant 1 - class lxWS_H_turban_01_black: H_Shemag_khk { - class ace_wardrobe: ace_wardrobe_base { - modifiableTo[] = { "lxWS_H_turban_02_black", "lxWS_H_turban_03_black", "lxWS_H_turban_04_black", "H_turban_02_mask_black_lxws" }; - components[] = { }; // not needed when empty - only shown as an example for how/when to use components - }; - }; - // WS Turban Variant 2 - class lxWS_H_turban_02_black: lxWS_H_turban_01_black { - class ace_wardrobe: ace_wardrobe_base { - modifiableTo[] = { "lxWS_H_turban_01_black", "lxWS_H_turban_03_black", "lxWS_H_turban_04_black", "H_turban_02_mask_black_lxws" }; - components[] = { }; // not needed when empty - only shown as an example for how/when to use components +class ace_wardrobe { + #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" + + class G_Balaclava: ace_wardrobe_base { + class modifiableTo { + class G_Balaclava_lowprofile; }; + components[] = {}; }; - // WS Turban Variant 3 - class lxWS_H_turban_03_black: lxWS_H_turban_01_black { - class ace_wardrobe: ace_wardrobe_base { - modifiableTo[] = { "lxWS_H_turban_01_black", "lxWS_H_turban_02_black", "lxWS_H_turban_04_black", "H_turban_02_mask_black_lxws" }; - components[] = { }; // not needed when empty - only shown as an example for how/when to use components - }; + + class G_Lowprofile: ace_wardrobe_base { + components[] = { "G_Lowprofile" }; }; - // WS Turban Variant 4 - class lxWS_H_turban_04_black: lxWS_H_turban_01_black { - class ace_wardrobe: ace_wardrobe_base { - modifiableTo[] = { "lxWS_H_turban_01_black", "lxWS_H_turban_02_black", "lxWS_H_turban_03_black", "H_turban_02_mask_black_lxws" }; - components[] = { }; // not needed when empty - only shown as an example for how/when to use components + + class G_Balaclava_lowprofile: ace_wardrobe_base { + class modifiableTo { + class G_Balaclava; }; + components[] = { "G_Lowprofile" }; }; }; - ``` - - -### 3.3 Complex Example with thorough use of components - +### 4.3 Complex Example - Bandana with Aviators - Complex use of Multiple Components ```cpp -// config.cpp -class ace_wardrobe_base; - -class CfgGlasses { - class None; - class G_Balaclava_blk; - class G_Bandanna_shades; - - // Aviator Sunglasses - class G_Aviator: None { - class ace_wardrobe: ace_wardrobe_base { - modifiableTo[] = { "G_Bandanna_aviator" }; - components[] = {"G_Aviator"}; +class ace_wardrobe { + #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" + + class G_Bandanna_blk: ace_wardrobe_base { + class modifiableTo { + class G_Bandanna_aviator; + class G_Aviator; }; + components[] = {"G_Bandanna_blk"}; }; - // Bandana, Black with Aviator Sunglasses - class G_Bandanna_aviator: G_Bandanna_shades { - class ace_wardrobe: ace_wardrobe_base { - modifiableTo[] = { "G_Bandanna_blk", "G_Aviator" }; - components[] = { "G_Bandanna_blk", "G_Aviator" }; + + class G_Aviator: ace_wardrobe_base { + class modifiableTo { + class G_Bandanna_aviator; }; + + components[] = { "G_Aviator" }; }; - // Bandana, Black - class G_Bandanna_blk: G_Balaclava_blk { - class ace_wardrobe: ace_wardrobe_base { - modifiableTo[] = { "G_Bandanna_aviator" }; - components[] = { "G_Bandanna_blk" }; + + class G_Bandanna_aviator: ace_wardrobe_base { + class modifiableTo { + class G_Bandanna_blk; + class G_Aviator; }; + components[] = { "G_Aviator", "G_Bandanna_blk" }; }; }; ``` -## 4. Addon Settings - - - ## 5. Sounds - The following `CfgSounds` classes are integrated in `ace_wardrobe` and are the default sounds for the `ace_wardrobe_base` and `ace_wardrobe_base_H_visor_up`/`ace_wardrobe_base_H_visor_down` base classes. ### 5.1 Integrated Sounds - The number at the end of the classnames indicates the length of the file in 1/10th seconds. 10 -> 1 sec, 15 -> 1.5sec, ... @@ -295,6 +263,15 @@ The number at the end of the classnames indicates the length of the file in 1/10 - `ace_wardrobe_helmet_visor_05` ## 6. Compatibility + +## 6.1 MagzineID Currently, `ace_IntelItems` and `ace_overheating` (spare barrels) are being directly supported. -If an addon or mod utilizes a magazine's `magazineID` to handle additional data about items carried by the player, then the process of modifying a wearable container (uniform, vest, backpack) to another variant will result in new `magazineID`s for all magazines on the player. +If an addon or mod utilizes a magazine's `magazineID` to handle additional data about items carried by the player, then the process of modifying a wearable container (uniform, vest, backpack) to another variant will result in new `magazineID`s for all magazines on the player and therefore, require special handling within ace_wardrobe functions. + +There *might* be some changes coming to how arma handles the `setUnitLoadout` which could resolve the need for this. + +## 6.2 Container Size - Uniform, Vest, Backpack +When the player changes from one container item to another through the wardrobe action and the container's `maximumLoad` is smaller then previously, the player risks the loss of items carried inside said container. + +Therefore, the function `[] call ace_wardrobe_fnc_compare_container_maxLoad` can be used to compare the item's maximumLoad. The result will be dumped into the .rpt. \ No newline at end of file From 5e72377e1c945b2e91c3557ca04036462fcc71c4 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 6 May 2025 17:17:26 +0200 Subject: [PATCH 190/305] Update wardrobe-framework.md --- docs/wiki/framework/wardrobe-framework.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index 955464744ab..ffdf3e8f61c 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -33,8 +33,11 @@ More examples can be found below. ### 1.2 Config Guidelines - A Container (Uniform, Vest, Backpack) should never change its `maxLoad`, unless there is a really good reason for it. This will result in the loss of items. -- Variants should never "magically" add/remove parts of themselves, unless its handled through a component. -- There should not be a difference in weight between the different variants unless compoents get added/removed. +- Variants should not "magically" add/remove parts to/from themselves, unless its handled through a component, especially when they add protection or functionality. + - Do: Uniforms with and without Gloves should be fine in most cases, as they are cosmetical and dont break continuity/logic. + - Do: Helmets with integral flip-down visors. + - Don't: Helmet with additional armor or face protector without the requirement of some component that will be removed from the inventory. +- There should not be a difference in weight or container capacity between the different variants unless compoents get added/removed. - For Example: `Mass of Helmet with Goggles = Mass of Helmet + Mass of Goggles.` ## 2. Config From 5a14fa5c4cf502124483aa58e48950ec21a36155 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 8 May 2025 20:55:32 +0200 Subject: [PATCH 191/305] hemtt ln snort --- addons/wardrobe/stringtable.xml | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml index 5037eb9fd43..9e4cdffb81c 100644 --- a/addons/wardrobe/stringtable.xml +++ b/addons/wardrobe/stringtable.xml @@ -1,22 +1,6 @@ - - - ACE Wardrobe - ACE Gaderobe - - - - - ACE Interaction - Aktivieren ACE Interaction - - - CBA Context Menu - Aktiviere CBA Context Menu - - Wardrobe @@ -64,5 +48,21 @@ Cannot switch to<br/>%1<br/>due to missing components + + + ACE Interaction + Aktivieren ACE Interaction + + + CBA Context Menu + Aktiviere CBA Context Menu + + + + + ACE Wardrobe + ACE Gaderobe + + From d33c95c743f168640ba4617d21c63616838c7a6c Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 9 May 2025 13:08:42 +0200 Subject: [PATCH 192/305] init --- .../compat_cup_wardrobe/CfgWardrobe.hpp | 5 ++++ .../CfgWardrobe_Headgear.hpp | 0 .../compat_cup_wardrobe/CfgWeapons.hpp | 3 +++ .../compat_cup_wardrobe/config.cpp | 26 +++++++++++++++++++ .../compat_cup_wardrobe/script_component.hpp | 5 ++++ 5 files changed, 39 insertions(+) create mode 100644 addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp create mode 100644 addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Headgear.hpp create mode 100644 addons/compat_cup_units/compat_cup_wardrobe/CfgWeapons.hpp create mode 100644 addons/compat_cup_units/compat_cup_wardrobe/config.cpp create mode 100644 addons/compat_cup_units/compat_cup_wardrobe/script_component.hpp diff --git a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp new file mode 100644 index 00000000000..6f746b0a292 --- /dev/null +++ b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp @@ -0,0 +1,5 @@ +class ace_wardrobe { + #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" + + #include "CfgWardrobe_Headgear.hpp" +}; diff --git a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Headgear.hpp b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Headgear.hpp new file mode 100644 index 00000000000..e69de29bb2d diff --git a/addons/compat_cup_units/compat_cup_wardrobe/CfgWeapons.hpp b/addons/compat_cup_units/compat_cup_wardrobe/CfgWeapons.hpp new file mode 100644 index 00000000000..9d03783519e --- /dev/null +++ b/addons/compat_cup_units/compat_cup_wardrobe/CfgWeapons.hpp @@ -0,0 +1,3 @@ +class CfgWeapons { + +}; diff --git a/addons/compat_cup_units/compat_cup_wardrobe/config.cpp b/addons/compat_cup_units/compat_cup_wardrobe/config.cpp new file mode 100644 index 00000000000..abd9043b186 --- /dev/null +++ b/addons/compat_cup_units/compat_cup_wardrobe/config.cpp @@ -0,0 +1,26 @@ +#include "script_component.hpp" + +class CfgPatches { + class SUBADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = { + "CUP_Creatures_People_LoadOrder" + "ace_wardrobe", + }; + skipWhenMissingDependencies = 1; + author = ECSTRING(common,ACETeam); + authors[] = {"Andx [TTT]", "OverlordZorn [CVO]"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + addonRootClass = QUOTE(ADDON); + }; +}; + +// For Consistency: Adjust Mass/containerSize +// #include "CfgWeapons.hpp" + +// ACE Wardrobe +#include "CfgWardrobe.hpp" diff --git a/addons/compat_cup_units/compat_cup_wardrobe/script_component.hpp b/addons/compat_cup_units/compat_cup_wardrobe/script_component.hpp new file mode 100644 index 00000000000..33ff700f410 --- /dev/null +++ b/addons/compat_cup_units/compat_cup_wardrobe/script_component.hpp @@ -0,0 +1,5 @@ +#define SUBCOMPONENT wardrobe +#define SUBCOMPONENT_BEAUTIFIED Wardrobe +#include "..\script_component.hpp" + +#include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp" From 683ce60ce77bc69e6be5bc76370d0bf201e0b3f4 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 9 May 2025 13:20:12 +0200 Subject: [PATCH 193/305] fix array --- addons/compat_cup_units/compat_cup_wardrobe/config.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/compat_cup_units/compat_cup_wardrobe/config.cpp b/addons/compat_cup_units/compat_cup_wardrobe/config.cpp index abd9043b186..0a38782486b 100644 --- a/addons/compat_cup_units/compat_cup_wardrobe/config.cpp +++ b/addons/compat_cup_units/compat_cup_wardrobe/config.cpp @@ -7,8 +7,8 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = { - "CUP_Creatures_People_LoadOrder" "ace_wardrobe", + "CUP_Creatures_People_LoadOrder" }; skipWhenMissingDependencies = 1; author = ECSTRING(common,ACETeam); From bc69dba2dcceb39b623efbc8e1577abf3b16b1f9 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 11 May 2025 18:55:06 +0200 Subject: [PATCH 194/305] comments --- addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf | 2 +- addons/wardrobe/functions/fnc_replace.sqf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf b/addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf index 3d498395b55..4c4ab2d3755 100644 --- a/addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf +++ b/addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf @@ -2,7 +2,7 @@ /* * Author: OverlordZorn - * Function to retrieve currently worn, modifiable items. Return can be cached for the duration of the interaction menu. + * Function to retrieve currently worn, modifiable items. Return can be cached - for the duration of the interaction menu. * * Arguments: * 0: Unit diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 2d49e1bfcad..405b766e283 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -26,7 +26,7 @@ _actionParams params ["_cfg_origin", "_cfg_tgt"]; // Duration of the "animation" private _duration = getNumber (configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "duration"); -if (_replaceNow) then { _duration = 0; }; +if (_replaceNow) then { _duration = 0; }; // needed for cba context menu - avoid potential duplications and such // Replace the Main Item. private _additionalParams = ""; From f8d07b11b45cd4fa4a4ec5c1daed3316135bd329 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 11 May 2025 19:28:53 +0200 Subject: [PATCH 195/305] new attribute: `alternativeComponent` --- addons/wardrobe/BaseClasses.hpp | 2 ++ .../functions/fnc_compare_components.sqf | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/addons/wardrobe/BaseClasses.hpp b/addons/wardrobe/BaseClasses.hpp index bfd780566a4..3ef3f4ddfbe 100644 --- a/addons/wardrobe/BaseClasses.hpp +++ b/addons/wardrobe/BaseClasses.hpp @@ -23,6 +23,8 @@ class GVAR(base) { alternativeDisplayName = ""; duration = 1; // Minimum Value: 1 - Anything above will produce a progressbar. + + alternativeComponent = ""; // To be used as an alternative for components where the intended component is from another addon/mod in case the source addon is not loaded. }; // Common Base Class for Uniforms with Sleeves Up/Down Variants diff --git a/addons/wardrobe/functions/fnc_compare_components.sqf b/addons/wardrobe/functions/fnc_compare_components.sqf index 582d48cb1cc..33ed72b4798 100644 --- a/addons/wardrobe/functions/fnc_compare_components.sqf +++ b/addons/wardrobe/functions/fnc_compare_components.sqf @@ -21,8 +21,20 @@ params ["_cfg_origin", "_cfg_tgt"]; -private _current = getArray (configFile >> QUOTE(ADDON) >> configName _cfg_origin >> "components"); -private _needed = getArray (configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "components"); +private _checkAlternativeComponent = { + // Check if item is present within current modpack. + // If not, will look-up if item is defined within ace_Wardrobe and has an alternativeComponent defined. + // If not, the component will be fully ignored. + if ([_x] call CBA_fnc_getItemConfig isEqualTo configNull) then { + getText (configFile >> QUOTE(ADDON) >> _return >> "alternativeComponent"); + } else { + _x + }; +}; + + +private _current = getArray (configFile >> QUOTE(ADDON) >> configName _cfg_origin >> "components") apply _checkAlternativeComponent select {_x isNotEqualTo ""}; +private _needed = getArray (configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "components") apply _checkAlternativeComponent select {_x isNotEqualTo ""}; private _missing = []; From fc552a48df2affdd0445dc85e63f41b156bc0654 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 11 May 2025 19:32:07 +0200 Subject: [PATCH 196/305] alternativeComponent -> fallbackComponent --- addons/wardrobe/BaseClasses.hpp | 2 +- addons/wardrobe/functions/fnc_compare_components.sqf | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/wardrobe/BaseClasses.hpp b/addons/wardrobe/BaseClasses.hpp index 3ef3f4ddfbe..fa1c4f2929d 100644 --- a/addons/wardrobe/BaseClasses.hpp +++ b/addons/wardrobe/BaseClasses.hpp @@ -24,7 +24,7 @@ class GVAR(base) { duration = 1; // Minimum Value: 1 - Anything above will produce a progressbar. - alternativeComponent = ""; // To be used as an alternative for components where the intended component is from another addon/mod in case the source addon is not loaded. + fallbackComponent = ""; // To be used as an alternative for components where the intended component is from another addon/mod in case the source addon is not loaded. }; // Common Base Class for Uniforms with Sleeves Up/Down Variants diff --git a/addons/wardrobe/functions/fnc_compare_components.sqf b/addons/wardrobe/functions/fnc_compare_components.sqf index 33ed72b4798..cb3731e4c09 100644 --- a/addons/wardrobe/functions/fnc_compare_components.sqf +++ b/addons/wardrobe/functions/fnc_compare_components.sqf @@ -21,20 +21,20 @@ params ["_cfg_origin", "_cfg_tgt"]; -private _checkAlternativeComponent = { +private _checkfallbackComponent = { // Check if item is present within current modpack. - // If not, will look-up if item is defined within ace_Wardrobe and has an alternativeComponent defined. + // If not, will look-up if item is defined within ace_Wardrobe and has an fallbackComponent defined. // If not, the component will be fully ignored. if ([_x] call CBA_fnc_getItemConfig isEqualTo configNull) then { - getText (configFile >> QUOTE(ADDON) >> _return >> "alternativeComponent"); + getText (configFile >> QUOTE(ADDON) >> _return >> "fallbackComponent"); } else { _x }; }; -private _current = getArray (configFile >> QUOTE(ADDON) >> configName _cfg_origin >> "components") apply _checkAlternativeComponent select {_x isNotEqualTo ""}; -private _needed = getArray (configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "components") apply _checkAlternativeComponent select {_x isNotEqualTo ""}; +private _current = getArray (configFile >> QUOTE(ADDON) >> configName _cfg_origin >> "components") apply _checkfallbackComponent select {_x isNotEqualTo ""}; +private _needed = getArray (configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "components") apply _checkfallbackComponent select {_x isNotEqualTo ""}; private _missing = []; From 71e7eca6305106884eecad30759c1f229dba1bfd Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 11 May 2025 20:49:41 +0200 Subject: [PATCH 197/305] fix fallback check --- addons/wardrobe/functions/fnc_compare_components.sqf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/wardrobe/functions/fnc_compare_components.sqf b/addons/wardrobe/functions/fnc_compare_components.sqf index cb3731e4c09..0fc043ea9cd 100644 --- a/addons/wardrobe/functions/fnc_compare_components.sqf +++ b/addons/wardrobe/functions/fnc_compare_components.sqf @@ -25,11 +25,11 @@ private _checkfallbackComponent = { // Check if item is present within current modpack. // If not, will look-up if item is defined within ace_Wardrobe and has an fallbackComponent defined. // If not, the component will be fully ignored. - if ([_x] call CBA_fnc_getItemConfig isEqualTo configNull) then { - getText (configFile >> QUOTE(ADDON) >> _return >> "fallbackComponent"); - } else { - _x + private _return = _x; + if ([_return] call CBA_fnc_getItemConfig isEqualTo configNull) then { + _return = getText (configFile >> QUOTE(ADDON) >> _return >> "fallbackComponent"); }; + _return }; From f097a97f985a4bddca57bd6e4ed9ebd88b0e9d34 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 11 May 2025 20:55:57 +0200 Subject: [PATCH 198/305] Update fnc_compare_components.sqf --- addons/wardrobe/functions/fnc_compare_components.sqf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/wardrobe/functions/fnc_compare_components.sqf b/addons/wardrobe/functions/fnc_compare_components.sqf index 0fc043ea9cd..8d1df673b6a 100644 --- a/addons/wardrobe/functions/fnc_compare_components.sqf +++ b/addons/wardrobe/functions/fnc_compare_components.sqf @@ -25,11 +25,11 @@ private _checkfallbackComponent = { // Check if item is present within current modpack. // If not, will look-up if item is defined within ace_Wardrobe and has an fallbackComponent defined. // If not, the component will be fully ignored. - private _return = _x; - if ([_return] call CBA_fnc_getItemConfig isEqualTo configNull) then { - _return = getText (configFile >> QUOTE(ADDON) >> _return >> "fallbackComponent"); + if (isNull ([_x] call CBA_fnc_getItemConfig)) then { + getText (configFile >> QUOTE(ADDON) >> _x >> "fallbackComponent"); + } else { + _x }; - _return }; From cda61471cad2c9fd5416c5fda6f342234c8385cd Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 11 May 2025 21:28:59 +0200 Subject: [PATCH 199/305] remove toLowerANSI breaks existing code --- addons/wardrobe/functions/fnc_replace.sqf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 405b766e283..c0431acb706 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -52,7 +52,7 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 // Add Surplus [_cfg_origin, _cfg_tgt] call FUNC(compare_components) params ["_missing", "_surplus"]; { - if (configName _cfg_tgt isNotEqualTo toLowerANSI _x) then { + if (configName _cfg_tgt isNotEqualTo _x) then { if ( isClass (configFile >> "CfgGlasses" >> _x) && { goggles _unit isEqualTo "" } ) then { _unit addGoggles _x; } else { @@ -63,10 +63,10 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 // Remove Missing { - if (configName _cfg_origin isNotEqualTo toLowerANSI _x) then { + if (configName _cfg_origin isNotEqualTo _x) then { switch (true) do { - case (goggles _unit isEqualTo toLowerANSI _x): { removeGoggles _unit; }; + case (goggles _unit isEqualTo _x): { removeGoggles _unit; }; default { [_unit, _x] call CBA_fnc_removeItem; }; }; }; From c2c0a5d347fcd425be37b42b895d5bd4eaebb2e4 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 11 May 2025 21:59:02 +0200 Subject: [PATCH 200/305] debug line removed --- addons/wardrobe/functions/fnc_spareBarrel_updateMagIDs.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_spareBarrel_updateMagIDs.sqf b/addons/wardrobe/functions/fnc_spareBarrel_updateMagIDs.sqf index 843c04bb009..23b05e85117 100644 --- a/addons/wardrobe/functions/fnc_spareBarrel_updateMagIDs.sqf +++ b/addons/wardrobe/functions/fnc_spareBarrel_updateMagIDs.sqf @@ -21,7 +21,7 @@ if (!isServer) exitWith {}; params ["_old_magIDs", "_new_magIDs"]; -if (count _old_magIDs != count _new_magIDs) exitWith { ERROR_2("Not Equal Number of magID's provided: %1 - %2",_old_magIDs,_new_magIDs); systemChat "Errorrrrrrrrrrr"; }; +if (count _old_magIDs != count _new_magIDs) exitWith { ERROR_2("Not Equal Number of magID's provided: %1 - %2",_old_magIDs,_new_magIDs); }; private _map = EGVAR(overheating,storedSpareBarrels); From 48df33f7df7981c578f21eec41ffbf36eb6b914c Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 11 May 2025 23:11:47 +0200 Subject: [PATCH 201/305] cleanup --- addons/wardrobe/functions/fnc_isModifiable.sqf | 6 ------ 1 file changed, 6 deletions(-) diff --git a/addons/wardrobe/functions/fnc_isModifiable.sqf b/addons/wardrobe/functions/fnc_isModifiable.sqf index f3bc7a8e4cb..21b3200f3d8 100644 --- a/addons/wardrobe/functions/fnc_isModifiable.sqf +++ b/addons/wardrobe/functions/fnc_isModifiable.sqf @@ -22,10 +22,4 @@ params [ if (isNull _cfg) exitWith {false}; - -/* old -// Checks if the config has the property without it being inherited(!) -count ( QUOTE(configName _x isEqualTo QUOTE(QUOTE(ace_wardrobe))) configClasses _cfg ) > 0 -*/ - isClass (configFile >> QUOTE(ADDON) >> configName _cfg) \ No newline at end of file From ed60fc7e4c5b72f5d52c50e13caead45221a5db6 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 11 May 2025 23:11:55 +0200 Subject: [PATCH 202/305] Update fnc_nextVariant_get.sqf --- addons/wardrobe/functions/fnc_nextVariant_get.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/wardrobe/functions/fnc_nextVariant_get.sqf b/addons/wardrobe/functions/fnc_nextVariant_get.sqf index 750e1db1e52..f54546711c4 100644 --- a/addons/wardrobe/functions/fnc_nextVariant_get.sqf +++ b/addons/wardrobe/functions/fnc_nextVariant_get.sqf @@ -44,6 +44,7 @@ if (_history_cfg isEqualTo "404") then { private _remaining = _modifiableTo_cfg - _history_cfg; +_remaining = _remaining select { [ace_player, _cfg_current, _x] call ace_wardrobe_fnc_canModifyTo }; // Returns ether a random remaining item or alternatively, a random one from the complete array. private _return = if (_remaining isNotEqualTo []) then { From 1a939dbc9ace7039e813ac42029a45a1e8b986f5 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 12 May 2025 15:44:03 +0200 Subject: [PATCH 203/305] grammar/typo's etc --- addons/wardrobe/functions/fnc_addActions.sqf | 2 +- addons/wardrobe/functions/fnc_nextVariant_get.sqf | 2 +- docs/wiki/framework/wardrobe-framework.md | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/addons/wardrobe/functions/fnc_addActions.sqf b/addons/wardrobe/functions/fnc_addActions.sqf index 0c5573a3951..00222a17d53 100644 --- a/addons/wardrobe/functions/fnc_addActions.sqf +++ b/addons/wardrobe/functions/fnc_addActions.sqf @@ -6,7 +6,7 @@ * Each Modifiable Item will have its own children in regard of the items it can be changed towards. * * Arguments: - * 0: The Unit who's wearable shall be changed - usually the player themselves + * 0: The Unit whose wearable shall be changed - usually the player themselves * * Return Value: * Array of ACE Child Actions diff --git a/addons/wardrobe/functions/fnc_nextVariant_get.sqf b/addons/wardrobe/functions/fnc_nextVariant_get.sqf index f54546711c4..fa9f9add11b 100644 --- a/addons/wardrobe/functions/fnc_nextVariant_get.sqf +++ b/addons/wardrobe/functions/fnc_nextVariant_get.sqf @@ -3,7 +3,7 @@ /* * Author: OverlordZorn * Context Menu - Return config the "next" variant - if multiple Variants are defined, it will choose randomly. - * Maintains a Histroy of the current and chosen variants as long as the Inventory is open. + * Maintains a History of the current and chosen variants as long as the Inventory is open. * Already used variants from the History will be removed from the availabe options. * Once all options have been exhausted, the history will be purged and start over. * diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index ffdf3e8f61c..9981e0b1500 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -33,11 +33,11 @@ More examples can be found below. ### 1.2 Config Guidelines - A Container (Uniform, Vest, Backpack) should never change its `maxLoad`, unless there is a really good reason for it. This will result in the loss of items. -- Variants should not "magically" add/remove parts to/from themselves, unless its handled through a component, especially when they add protection or functionality. - - Do: Uniforms with and without Gloves should be fine in most cases, as they are cosmetical and dont break continuity/logic. +- Variants should not "magically" add/remove parts to/from themselves, unless it's handled through a component, especially when they add protection or functionality. + - Do: Uniforms with and without Gloves should be fine in most cases, as they are cosmetical and don't break continuity/logic. - Do: Helmets with integral flip-down visors. - Don't: Helmet with additional armor or face protector without the requirement of some component that will be removed from the inventory. -- There should not be a difference in weight or container capacity between the different variants unless compoents get added/removed. +- There should not be a difference in weight or container capacity between the different variants unless components get added/removed. - For Example: `Mass of Helmet with Goggles = Mass of Helmet + Mass of Goggles.` ## 2. Config @@ -268,13 +268,13 @@ The number at the end of the classnames indicates the length of the file in 1/10 ## 6. Compatibility ## 6.1 MagzineID -Currently, `ace_IntelItems` and `ace_overheating` (spare barrels) are being directly supported. +Currently, `ace_intelitems` and `ace_overheating` (spare barrels) are being directly supported. -If an addon or mod utilizes a magazine's `magazineID` to handle additional data about items carried by the player, then the process of modifying a wearable container (uniform, vest, backpack) to another variant will result in new `magazineID`s for all magazines on the player and therefore, require special handling within ace_wardrobe functions. +If an addon or mod utilizes a magazine's `magazineID` to handle additional data about items carried by the player, then the process of modifying a wearable container (uniform, vest, backpack) to another variant will result in new `magazineID`s for all magazines on the player and therefore, require special handling within `ace_wardrobe` functions. -There *might* be some changes coming to how arma handles the `setUnitLoadout` which could resolve the need for this. +There *might* be some changes coming from Bi regarding how arma handles the `setUnitLoadout` which could resolve the need for this. ## 6.2 Container Size - Uniform, Vest, Backpack When the player changes from one container item to another through the wardrobe action and the container's `maximumLoad` is smaller then previously, the player risks the loss of items carried inside said container. -Therefore, the function `[] call ace_wardrobe_fnc_compare_container_maxLoad` can be used to compare the item's maximumLoad. The result will be dumped into the .rpt. \ No newline at end of file +Therefore, the function `[] call ace_wardrobe_fnc_compare_container_maxLoad` can be used to compare the item's `maximumLoad`. The result will be dumped into the .rpt. \ No newline at end of file From 1571d4fdd2f802f258ccc70fc3c5ece1679987a0 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 12 May 2025 15:48:14 +0200 Subject: [PATCH 204/305] add `fallbackComponent` to docs --- docs/wiki/framework/wardrobe-framework.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index 9981e0b1500..f533099ca66 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -45,7 +45,7 @@ More examples can be found below. Only directly defined Subclasses will be taken into account. A fully inherited subclass will be ignored and will not provide any interaction. The `ace_wardrobe` properties are to be found as a subclass of the item itself. Multiple base configs are designed at root of `configFile`. ## 2.1 Properties - +All supported Properties can be found within the `ace_wardrobe_base` baseclass. | Class Property | Data Type | Description | | -------------- | ----------- | ----------- | @@ -57,6 +57,7 @@ Only directly defined Subclasses will be taken into account. A fully inherited s | `alternativePicture` | String of path to icon | to be used instead of target variant picture | | `alternativeDisplayName` | String | Will be used instead of the target variants displayname | | `duration` | Number in seconds | Duration of action. Items are being replaced at the end. | +| `fallbackComponent` | String of Classname | Fallback for Components that are not present within the same mod/addon. Example: RHS AFRF helmets use `rhs_ess_black` goggles, which are only part of USAF. fallbackComponent can be used to default to a vanilla alternative. | ### 2.2 Base Classes @@ -84,6 +85,9 @@ class ace_wardrobe { alternativeDisplayName = ""; duration = 1; // Minimum Value: 1 - Anything above will produce a progressbar. + + fallbackComponent = ""; // To be used as an alternative for components where the intended component is from another addon/mod in case the source addon is not loaded. + }; }; From 36965e2d2398d68dd161e650543466d1c7194393 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 12 May 2025 16:23:22 +0200 Subject: [PATCH 205/305] add API: Force Disable --- .../functions/fnc_addActions_condition.sqf | 11 ++++++++--- .../functions/fnc_enable_contextMenu.sqf | 4 ++-- docs/wiki/framework/wardrobe-framework.md | 17 ++++++++++++++++- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/addons/wardrobe/functions/fnc_addActions_condition.sqf b/addons/wardrobe/functions/fnc_addActions_condition.sqf index dc8cb11d91e..e35a92e4e68 100644 --- a/addons/wardrobe/functions/fnc_addActions_condition.sqf +++ b/addons/wardrobe/functions/fnc_addActions_condition.sqf @@ -18,8 +18,13 @@ params ["_player"]; -missionNamespace getVariable [QGVAR(set_enable_action), false] +isNil QGVAR(api_disable) && -{ - count ([_player] call FUNC(getItems_modifiable_current)) > 0 +{ + missionNamespace getVariable [QGVAR(set_enable_action), false] + && + { + count ([_player] call FUNC(getItems_modifiable_current)) > 0 + } } + diff --git a/addons/wardrobe/functions/fnc_enable_contextMenu.sqf b/addons/wardrobe/functions/fnc_enable_contextMenu.sqf index fc78427f302..8af1a696bb0 100644 --- a/addons/wardrobe/functions/fnc_enable_contextMenu.sqf +++ b/addons/wardrobe/functions/fnc_enable_contextMenu.sqf @@ -29,8 +29,8 @@ if (_enable && {!(missionNamespace getVariable [QGVAR(contextmenu_enabled), fals [], QPATHTOF(data\wardrobe_logo.paa), [ - {true}, - {true} + { isNil QGVAR(api_disable) }, + { isNil QGVAR(api_disable) } ], FUNC(nextVariant_do), false, diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index f533099ca66..a9256855785 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -281,4 +281,19 @@ There *might* be some changes coming from Bi regarding how arma handles the `set ## 6.2 Container Size - Uniform, Vest, Backpack When the player changes from one container item to another through the wardrobe action and the container's `maximumLoad` is smaller then previously, the player risks the loss of items carried inside said container. -Therefore, the function `[] call ace_wardrobe_fnc_compare_container_maxLoad` can be used to compare the item's `maximumLoad`. The result will be dumped into the .rpt. \ No newline at end of file +Therefore, the function `[] call ace_wardrobe_fnc_compare_container_maxLoad` can be used to compare the item's `maximumLoad`. The result will be dumped into the .rpt. + +## 7. API +Missionmakers can choose to force disable the the wardrobe system individually or globally by defining the global variable `ace_wardrobe_api_disable`. +It will be checked if `ace_wardrobe_api_disable` defined or not. The value does not matter. + +```sqf +// Disables Ace Wardrobe on the current mashine. +missionNamespace setVariable ["ace_wardrobe_api_disable", true]; + +// Disables Ace Wardobe globally, JIP-compatible. +missionNamespace setVariable ["ace_wardrobe_api_disable", true, true]; + +// Re-Enable Ace Wardrobe globally, JIP-compatible. +missionNamespace setVariable ["ace_wardrobe_api_disable", nil, true]; +``` \ No newline at end of file From fbcf8741ffddbee15b0eaad3cc13276f7c0c66c0 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 12 May 2025 22:08:53 +0200 Subject: [PATCH 206/305] @Andx667 compats --- .../compat_cup_wardrobe/CfgWardrobe.hpp | 4 +- .../CfgWardrobe_Goggles.hpp | 14 + .../CfgWardrobe_Headgear.hpp | 190 ++++++ .../CfgWardrobe_Uniforms.hpp | 588 ++++++++++++++++++ .../compat_cup_wardrobe/CfgWeapons.hpp | 3 - .../compat_cup_wardrobe/config.cpp | 6 +- .../compat_cup_wardrobe/script_component.hpp | 2 +- 7 files changed, 799 insertions(+), 8 deletions(-) create mode 100644 addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Goggles.hpp create mode 100644 addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Uniforms.hpp delete mode 100644 addons/compat_cup_units/compat_cup_wardrobe/CfgWeapons.hpp diff --git a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp index 6f746b0a292..8df38fc6c20 100644 --- a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp @@ -1,5 +1,7 @@ class ace_wardrobe { #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" + #include "CfgWardrobe_Uniforms.hpp" #include "CfgWardrobe_Headgear.hpp" -}; + #include "CfgWardrobe_Goggles.hpp" +}; \ No newline at end of file diff --git a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Goggles.hpp b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Goggles.hpp new file mode 100644 index 00000000000..77f9f104af8 --- /dev/null +++ b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Goggles.hpp @@ -0,0 +1,14 @@ +// Balaclava +BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_Sage_1,CUP_G_RUS_Ratnik_Balaclava_Sage_2); +BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_Olive_1,CUP_G_RUS_Ratnik_Balaclava_Olive_2); +BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_Green_1,CUP_G_RUS_Ratnik_Balaclava_Green_2); +BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_Green_3,CUP_G_RUS_Ratnik_Balaclava_Green_4); +BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_EMR_Autumn_1,CUP_G_RUS_Ratnik_Balaclava_EMR_Autumn_2); +BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_EMR_Summer_1,CUP_G_RUS_Ratnik_Balaclava_EMR_Summer_2); +BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_Desert_1,CUP_G_RUS_Ratnik_Balaclava_Desert_2); +BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_Desert_3,CUP_G_RUS_Ratnik_Balaclava_Desert_4); +BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_A_Tacs_3,CUP_G_RUS_Ratnik_Balaclava_A_Tacs_4); +BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_A_Tacs_1,CUP_G_RUS_Ratnik_Balaclava_A_Tacs_2); + +// ToDO +// Scarf + ESS Combos \ No newline at end of file diff --git a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Headgear.hpp b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Headgear.hpp index e69de29bb2d..e053896c892 100644 --- a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Headgear.hpp +++ b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Headgear.hpp @@ -0,0 +1,190 @@ +// Macros +#define CUP_HELMET_2_ESS(HelmetBase,HelmetGoggles1,HelmetGoggles2,Goggles)\ +class HelmetBase : EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class HelmetGoggles1;\ + class HelmetGoggles2;\ + };\ +};\ +class HelmetGoggles1 : EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class HelmetBase;\ + };\ + components[] = {QUOTE(Goggles)};\ +};\ +class HelmetGoggles2 : EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class HelmetBase;\ + };\ + components[] = {QUOTE(Goggles)};\ +} + +#define CUP_HELMET_3_ESS(HelmetBase,HelmetGoggles1,HelmetGoggles2,HelmetGoggles3,Goggles)\ +CUP_HELMET_2_ESS(HelmetBase,HelmetGoggles1,HelmetGoggles2,Goggles);\ +class HelmetGoggles3 : EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class HelmetBase;\ + };\ + components[] = {QUOTE(Goggles)};\ +} + +#define CUP_BAF_MK6(HelmetBase,HelmetGlasses,HelmetGoggles,HelmetNetting,Glasses,Goggles)\ +class HelmetBase : EGVAR(wardrobe,base_H_goggles_off) {\ + class modifiableTo {\ + class HelmetGlasses;\ + class HelmetGoggles;\ + };\ +};\ +class HelmetGlasses : EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class HelmetBase;\ + class HelmetNetting;\ + };\ + components[] = {QUOTE(Glasses)};\ +};\ +class HelmetGoggles : EGVAR(wardrobe,base_H_goggles_on) {\ + class modifiableTo {\ + class HelmetBase;\ + };\ + components[] = {QUOTE(Goggles)};\ +};\ +class HelmetNetting : EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class HelmetGlasses;\ + };\ + components[] = {};\ +} + +// Russian HELMET 6B27 +HELMET_GOGGLES(CUP_H_RUS_6B27_cover_BeigeDigital,CUP_H_RUS_6B27_cover_BeigeDigital_goggles,CUP_G_ESS_BLK); +HELMET_GOGGLES(CUP_H_RUS_6B27_cover_BeigeDigital_headset,CUP_H_RUS_6B27_cover_BeigeDigital_headset_goggles,CUP_G_ESS_BLK); +HELMET_GOGGLES(CUP_H_RUS_6B27_cover,CUP_H_RUS_6B46,CUP_G_ESS_BLK); +HELMET_GOGGLES(CUP_H_RUS_6B27_cover_headset,CUP_H_RUS_6B27_cover_headset_goggles,CUP_G_ESS_BLK); +HELMET_GOGGLES(CUP_H_RUS_6B27,CUP_H_RUS_6B27_goggles,CUP_G_ESS_BLK); +HELMET_GOGGLES(CUP_H_RUS_6B27_headset,CUP_H_RUS_6B27_headset_goggles,CUP_G_ESS_BLK); + +// Russian HELMET 6B47 +// most of the these have no fitting goggles within CUP CUP_G_ESS_BLK +// Simple Cases +HELMET_GOGGLES(CUP_H_RUS_6B47_Desert_1,CUP_H_RUS_6B47_6B34C_Desert_1,CUP_G_ESS_BLK); +HELMET_GOGGLES(CUP_H_RUS_6B47_NV_Desert_1,CUP_H_RUS_6B47_NV_6B34C_Desert_1,CUP_G_ESS_BLK); +HELMET_GOGGLES(CUP_H_RUS_6B47_Summer,CUP_H_RUS_6B47_6B34C_Summer,CUP_G_ESS_BLK); +HELMET_GOGGLES(CUP_H_RUS_6B47_NV_Summer,CUP_H_RUS_6B47_NV_6B34C_Summer,CUP_G_ESS_BLK); +HELMET_GOGGLES(CUP_H_RUS_6B47_Winter,CUP_H_RUS_6B47_6B34C_Winter,CUP_G_ESS_BLK); +HELMET_GOGGLES(CUP_H_RUS_6B47_NV_Winter,CUP_H_RUS_6B47_NV_6B34C_Winter,CUP_G_ESS_BLK); +HELMET_GOGGLES(CUP_H_RUS_6B47_desert,CUP_H_RUS_6B47_goggles_desert,CUP_G_ESS_BLK); +HELMET_GOGGLES(CUP_H_RUS_6B47_SF_headset_black,CUP_H_RUS_6B47_SF_headset_goggles_black,CUP_G_ESS_BLK); +HELMET_GOGGLES(CUP_H_RUS_6B47_SF_headset_desert,CUP_H_RUS_6B47_SF_headset_goggles_desert,CUP_G_ESS_BLK); +HELMET_GOGGLES(CUP_H_RUS_6B47_SF_headset,CUP_H_RUS_6B47_SF,CUP_G_ESS_BLK); + +HELMET_GOGGLES(CUP_H_RUS_ZSH_1,CUP_H_RUS_ZSH_1_Goggles,CUP_G_ESS_BLK); + +//Advanced Cases + +// Russian Altyn +HELMET_VISOR(CUP_H_RUS_Altyn_Shield_Up_black,CUP_H_RUS_Altyn_Shield_Down_black); +HELMET_VISOR(CUP_H_RUS_Altyn_Shield_Up,CUP_H_RUS_Altyn_Shield_Down); +HELMET_VISOR(CUP_H_RUS_Altyn_Shield_Up_khaki,CUP_H_RUS_Altyn_Shield_Down_khaki); +HELMET_GOGGLES(CUP_H_RUS_Altyn_black,CUP_H_RUS_Altyn_Goggles_black,CUP_G_ESS_BLK); +HELMET_GOGGLES(CUP_H_RUS_Altyn,CUP_H_RUS_Altyn_Goggles,CUP_G_ESS_BLK); +HELMET_GOGGLES(CUP_H_RUS_Altyn_khaki,CUP_H_RUS_Altyn_Goggles_khaki,CUP_G_ESS_BLK); + +HELMET_VISOR(CUP_H_RUS_K6_3_Shield_Up_black,CUP_H_RUS_K6_3_Shield_Down_black); +HELMET_VISOR(CUP_H_RUS_K6_3_Shield_Up,CUP_H_RUS_K6_3_Shield_Down); +HELMET_VISOR(CUP_H_RUS_K6_3_Shield_Up_khaki,CUP_H_RUS_K6_3_Shield_Down_khaki); +HELMET_GOGGLES(CUP_H_RUS_K6_3_black,CUP_H_RUS_K6_3_Goggles_black,CUP_G_ESS_BLK); +HELMET_GOGGLES(CUP_H_RUS_K6_3,CUP_H_RUS_K6_3_Goggles,CUP_G_ESS_BLK); +HELMET_GOGGLES(CUP_H_RUS_K6_3_khaki,CUP_H_RUS_K6_3_Goggles_khaki,CUP_G_ESS_BLK); + +// Horizon Island Legion +CUP_HELMET_2_ESS(CUP_H_HIL_HelmetACH_CCE,CUP_H_HIL_HelmetACH_GCovered_CCE,CUP_H_HIL_HelmetACH_ESS_CCE,CUP_G_ESS_BLK); +CUP_HELMET_2_ESS(CUP_H_HIL_HelmetACH_Headset_CCE,CUP_H_HIL_HelmetACH_GCovered_Headset_CCE,CUP_H_HIL_HelmetACH_ESS_Headset_CCE,CUP_G_ESS_BLK); +CUP_HELMET_2_ESS(CUP_H_HIL_HelmetACH_TTS,CUP_H_HIL_HelmetACH_GCovered_TTS,CUP_H_HIL_HelmetACH_ESS_TTS,CUP_G_ESS_BLK); +CUP_HELMET_2_ESS(CUP_H_HIL_HelmetACH_Headset_TTS,CUP_H_HIL_HelmetACH_GCovered_Headset_TTS,CUP_H_HIL_HelmetACH_ESS_Headset_TTS,CUP_G_ESS_BLK); + +//Armed Forces of Ukraine +CUP_HELMET_2_ESS(CUP_H_AFU_HelmetACH_MM_14,CUP_H_AFU_HelmetACH_GCOVERED_MM_14,CUP_H_AFU_HelmetACH_ESS_MM_14,CUP_G_ESS_BLK); +CUP_HELMET_2_ESS(CUP_H_AFU_HelmetACH_Headset_MM_14,CUP_H_AFU_HelmetACH_GCOVERED_Headset_MM_14,CUP_H_AFU_HelmetACH_ESS_Headset_MM_14,CUP_G_ESS_BLK); + +// US Army +// ToDo make more complex +// CUP_HELMET_2_ESS(CUP_H_USArmy_HelmetACH_OCP,CUP_H_USArmy_HelmetACH_GCOVERED_OCP,CUP_H_USArmy_HelmetACH_ESS_OCP,CUP_G_ESS_KHK); +// CUP_HELMET_2_ESS(CUP_H_USArmy_HelmetACH_Headset_OCP,CUP_H_USArmy_HelmetACH_GCOVERED_Headset_OCP,CUP_H_USArmy_HelmetACH_ESS_OCP,CUP_G_ESS_KHK); +CUP_HELMET_2_ESS(CUP_H_USArmy_HelmetACH_OEFCP,CUP_H_USArmy_HelmetACH_GCOVERED_OEFCP,CUP_H_USArmy_HelmetACH_ESS_OEFCP,CUP_G_ESS_CBR); +CUP_HELMET_2_ESS(CUP_H_USArmy_HelmetACH_Headset_OEFCP,CUP_H_USArmy_HelmetACH_GCOVERED_Headset_OEFCP,CUP_H_USArmy_HelmetACH_ESS_Headset_OEFCP,CUP_G_ESS_CBR); +CUP_HELMET_2_ESS(CUP_H_USArmy_HelmetACH_UCP,CUP_H_USArmy_HelmetACH_GCOVERED_UCP,CUP_H_USArmy_HelmetACH_ESS_UCP,CUP_G_ESS_RGR); +CUP_HELMET_2_ESS(CUP_H_USArmy_HelmetACH_Headset_UCP,CUP_H_USArmy_HelmetACH_GCOVERED_Headset_UCP,CUP_H_USArmy_HelmetACH_ESS_Headset_UCP,CUP_G_ESS_RGR); + +HELMET_GOGGLES(CUP_H_USArmy_Helmet_Protec,CUP_H_USArmy_Helmet_Protec_Gog,CUP_G_ESS_BLK); + +CUP_HELMET_2_ESS(CUP_H_PASGTv2_NVG_WDL_GG_CB,CUP_H_PASGTv2_NVG_WDL_CF,CUP_H_PASGTv2_NVG_WDL_GG,CUP_G_ESS_BLK); +CUP_HELMET_2_ESS(CUP_H_PASGTv2_WDL,CUP_H_PASGTv2_WDL_GG,CUP_H_PASGTv2_WDL_CF,CUP_G_ESS_BLK); + +// British Armed Forces +BASE_PAIR(CUP_H_BAF_PARA_PRROVER_BERET,CUP_H_BAF_PARA_PRRUNDER_BERET); + +CUP_BAF_MK6(CUP_H_BAF_MTP_Mk6_EMPTY_PRR,CUP_H_BAF_MTP_Mk6_GLASS_PRR,CUP_H_BAF_MTP_Mk6_GOGGLES_PRR,CUP_H_BAF_MTP_Mk6_NETTING_PRR,G_Lowprofile,CUP_G_ESS_CBR); +CUP_BAF_MK6(CUP_H_BAF_DDPM_Mk6_EMPTY_PRR,CUP_H_BAF_DDPM_Mk6_GLASS_PRR,CUP_H_BAF_DDPM_Mk6_GOGGLES_PRR,CUP_H_BAF_DDPM_Mk6_NETTING_PRR,G_Lowprofile,CUP_G_ESS_CBR); +CUP_BAF_MK6(CUP_H_BAF_DPM_Mk6_EMPTY_PRR,CUP_H_BAF_DPM_Mk6_GLASS_PRR,CUP_H_BAF_DPM_Mk6_GOGGLES_PRR,CUP_H_BAF_DPM_Mk6_NETTING_PRR,G_Lowprofile,CUP_G_ESS_CBR); + +// MK7 MTP +class CUP_H_BAF_MTP_Mk7 : EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_H_BAF_MTP_Mk7_PRR_SCRIM_B; + class CUP_H_BAF_MTP_Mk7_PRR_SCRIM_A; + }; +}; +class CUP_H_BAF_MTP_Mk7_PRR_SCRIM_A : EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_H_BAF_MTP_Mk7; + }; +}; +class CUP_H_BAF_MTP_Mk7_PRR_SCRIM_B : EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_H_BAF_MTP_Mk7; + }; +}; + +// Army of the Czech Republic +BASE_PAIR(CUP_H_CZ_Booniehat_vz95_des,CUP_H_CZ_Booniehat_fold_des); +BASE_PAIR(CUP_H_CZ_Hat03,CUP_H_CZ_Hat02); + +HELMET_GOGGLES(CUP_H_CZ_Helmet01,CUP_H_CZ_Helmet02,CUP_G_ESS_BLK_Ember); +HELMET_GOGGLES(CUP_H_CZ_Helmet03,CUP_H_CZ_Helmet04,CUP_G_ESS_BLK_Ember); +HELMET_GOGGLES(CUP_H_CZ_Helmet07,CUP_H_CZCUP_H_CZ_Helmet08_Helmet02,CUP_G_ESS_BLK_Ember); +HELMET_GOGGLES(CUP_H_CZ_Helmet10,CUP_H_CZ_Helmet09,CUP_G_ESS_BLK_Ember); + +// PMC +BASE_PAIR(CUP_H_PMC_Cap_Burberry,CUP_H_PMC_Cap_Back_Burberry); +BASE_PAIR(CUP_H_PMC_Cap_PRR_Burberry,CUP_H_PMC_Cap_Back_PRR_Burberry); +BASE_PAIR(CUP_H_PMC_Cap_Grey,CUP_H_PMC_Cap_Back_Grey); +BASE_PAIR(CUP_H_PMC_Cap_PRR_Grey,CUP_H_PMC_CCUP_H_PMC_Cap_Back_PRR_Greyap_Back_Grey); +BASE_PAIR(CUP_H_PMC_Cap_EP_Grey,CUP_H_PMC_Cap_Back_EP_Grey); +BASE_PAIR(CUP_H_PMC_Cap_PRR_Tan,CUP_H_PMC_Cap_Back_PRR_Tan); +BASE_PAIR(CUP_H_PMC_Cap_EP_Tan,CUP_H_PMC_Cap_Back_EP_Tan); +BASE_PAIR(CUP_H_PMC_Cap_Tan,CUP_H_PMC_Cap_Back_Tan); + +// German Armed Forces +CUP_HELMET_3_ESS(CUP_H_Ger_M92,CUP_H_Ger_M92_GG,CUP_H_Ger_M92_GG_CB,CUP_H_Ger_M92_GG_CF,CUP_G_ESS_BLK); +CUP_HELMET_3_ESS(CUP_H_Ger_M92_Black,CUP_H_Ger_M92_Black_GG,CUP_H_Ger_M92_Black_GG_CB,CUP_H_Ger_M92_Black_GG_CF,CUP_G_ESS_BLK); +CUP_HELMET_3_ESS(CUP_H_Ger_M92_Cover,CUP_H_Ger_M92_Cover_GG,CUP_H_Ger_M92_Cover_GG_CB,CUP_H_Ger_M92_Cover_GG_CF,CUP_G_ESS_BLK); +CUP_HELMET_3_ESS(CUP_H_Ger_M92_RGR,CUP_H_Ger_M92_RGR_GG,CUP_H_Ger_M92_RGR_GG_CB,CUP_H_Ger_M92_RGR_GG_CF,CUP_G_ESS_BLK); +CUP_HELMET_3_ESS(CUP_H_Ger_M92_Tan,CUP_H_Ger_M92_Tan_GG,CUP_H_Ger_M92_Tan_GG_CB,CUP_H_Ger_M92_Tan_GG_CF,CUP_G_ESS_BLK); +CUP_HELMET_3_ESS(CUP_H_Ger_M92_Cover_Trop,CUP_H_Ger_M92_Cover_Trop_GG,CUP_H_Ger_M92_Cover_Trop_GG_CB,CUP_H_Ger_M92_Cover_Trop_GG_CF,CUP_G_ESS_BLK); + +// Takistani Turban +BASE_PAIR(CUP_H_TKI_Lungee_Open_01,CUP_H_TKI_Lungee_01); +BASE_PAIR(CUP_H_TKI_Lungee_Open_02,CUP_H_TKI_Lungee_02); +BASE_PAIR(CUP_H_TKI_Lungee_Open_03,CUP_H_TKI_Lungee_03); +BASE_PAIR(CUP_H_TKI_Lungee_Open_04,CUP_H_TKI_Lungee_04); +BASE_PAIR(CUP_H_TKI_Lungee_Open_05,CUP_H_TKI_Lungee_05); +BASE_PAIR(CUP_H_TKI_Lungee_Open_06,CUP_H_TKI_Lungee_06); + +// Russian Pilot HELMET +HELMET_VISOR(CUP_H_RUS_ZSH_Shield_Up,CUP_H_RUS_ZSH_Shield_Down); + +// Helicopter Helmets +HELMET_VISOR(CUP_H_SPH4,CUP_H_SPH4_visor); +HELMET_VISOR(CUP_H_SPH4_khaki,CUP_H_SPH4_khaki_visor); +HELMET_VISOR(CUP_H_SPH4_grey,CUP_H_SPH4_grey_visor); +HELMET_VISOR(CUP_H_SPH4_green,CUP_H_SPH4_green_visor); \ No newline at end of file diff --git a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Uniforms.hpp b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Uniforms.hpp new file mode 100644 index 00000000000..0992d9fa475 --- /dev/null +++ b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Uniforms.hpp @@ -0,0 +1,588 @@ +// Macros +#define CUP_UNIFORM_TSHIRT(tshirtBase,tshirtGloves,tshirtKnee)\ +class tshirtBase : EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class tshirtGloves;\ + class tshirtKnee;\ + };\ +};\ +class tshirtGloves : EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class tshirtBase;\ + };\ +};\ +class tshirtKnee : EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class tshirtBase;\ + };\ +} + +#define CUP_UNIFORM_3(uniformBase,uniformVariant1,uniformVariant2)\ +class uniformBase : EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class uniformVariant1;\ + class uniformVariant2;\ + };\ +};\ +class uniformVariant1 : EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class uniformBase;\ + };\ +};\ +class uniformVariant2 : EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class uniformBase;\ + };\ +} + +#define CUP_UNIFORM_4(uniformBase,uniformVariant1,uniformVariant2,uniformVariant3)\ +CUP_UNIFORM_3(uniformBase,uniformVariant1,uniformVariant2);\ +class uniformVariant3 : EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class uniformBase;\ + };\ +} + +#define CUP_UNIFORM_BAF(uniformBase,uniformGLoves,uniformKneepad,uniformGlovesKneepad,uniformRolled,uniformRolledGloves,uniformRolledKneepad)\ +class uniformBase: EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class uniformGLoves;\ + class uniformKneepad;\ + class uniformRolled;\ + };\ +};\ +class uniformGLoves: EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class uniformGlovesKneepad;\ + class uniformRolledGloves;\ + class uniformBase;\ + };\ +};\ +class uniformKneepad: EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class uniformGlovesKneepad;\ + class uniformRolledKneepad;\ + class uniformBase;\ + };\ +};\ +class uniformGlovesKneepad: EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class uniformGLoves;\ + class uniformKneepad;\ + };\ +};\ +class uniformRolled: EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class uniformBase;\ + class uniformRolledGloves;\ + class uniformRolledKneepad;\ + };\ +};\ +class uniformRolledKneepad: EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class uniformRolled;\ + class uniformKneepad;\ + };\ +};\ +class uniformRolledGloves: EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class uniformRolled;\ + class uniformGLoves;\ + };\ +} + +#define CUP_UNIFORM_GLOVES_KNEEPAD_ROLLED(uniformBase,uniformGLoves,uniformKneepad,uniformGlovesKneepad,uniformRolled,uniformRolledGloves,uniformRolledKneepad,uniformRolledGlovesKneepad)\ +class uniformBase: EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class uniformGLoves;\ + class uniformKneepad;\ + class uniformRolled;\ + };\ +};\ +class uniformGLoves: EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class uniformGlovesKneepad;\ + class uniformRolledGloves;\ + class uniformBase;\ + };\ +};\ +class uniformKneepad: EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class uniformGlovesKneepad;\ + class uniformRolledKneepad;\ + class uniformBase;\ + };\ +};\ +class uniformGlovesKneepad: EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class uniformGLoves;\ + class uniformKneepad;\ + class uniformRolledGlovesKneepad;\ + };\ +};\ +class uniformRolled: EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class uniformRolledGloves;\ + class uniformRolledKneepad;\ + class uniformBase;\ + };\ +};\ +class uniformRolledGloves: EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class uniformRolled;\ + class uniformRolledGlovesKneepad;\ + };\ +};\ +class uniformRolledKneepad: EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class uniformRolled;\ + class uniformRolledGlovesKneepad;\ + };\ +};\ +class uniformRolledGlovesKneepad: EGVAR(wardrobe,base) {\ + class modifiableTo {\ + class uniformRolledKneepad;\ + class uniformRolledGloves;\ + };\ +} + +//Army of the Czech Republic +UNIFORM_SLEEVES(CUP_U_B_CZ_DST_NoKneepads,CUP_U_B_CZ_DST_Kneepads_Sleeve); +UNIFORM_SLEEVES(CUP_U_B_CZ_DST_Kneepads,CUP_U_B_CZ_DST_Kneepads_Gloves); +UNIFORM_SLEEVES(CUP_U_B_CZ_WDL_NoKneepads,CUP_U_B_CZ_WDL_Kneepads_Gloves); + +//Armed Forces of the Russian Federation +UNIFORM_SLEEVES(CUP_U_O_RUS_BeigeDigital_MSV,CUP_U_O_RUS_BeigeDigital_MSV_rolled_up); +UNIFORM_SLEEVES(CUP_U_O_RUS_BeigeDigital_MSV_gloves_pads,CUP_U_O_RUS_BeigeDigital_MSV_rolled_up_gloves_pads); +UNIFORM_SLEEVES(CUP_U_O_RUS_EMR_1,CUP_U_O_RUS_EMR_2); +UNIFORM_SLEEVES(CUP_U_O_RUS_Flora_1,CUP_U_O_RUS_Flora_2); +UNIFORM_SLEEVES(CUP_U_O_RUS_EMR_1_VDV,CUP_U_O_RUS_EMR_2_VDV); +UNIFORM_SLEEVES(CUP_U_O_RUS_EMR_VDV_gloves_pads,CUP_U_O_RUS_EMR_VDV_rolled_up_gloves_pads); +UNIFORM_SLEEVES(CUP_U_O_RUS_KSOR_VDV,CUP_U_O_RUS_KSOR_VDV_rolled_up); +UNIFORM_SLEEVES(CUP_U_O_RUS_KSOR_VDV_gloves_pads,CUP_U_O_RUS_KSOR_VDV_rolled_up_gloves_pads); +// ToDo Complex variant +// UNIFORM_SLEEVES(CUP_U_O_RUS_VSR93_VDV,CUP_U_O_RUS_VSR93_VDV_rolled_up); +// UNIFORM_SLEEVES(CUP_U_O_RUS_VSR93_VDV_rolled_up,CUP_U_O_RUS_VSR93_VDV_rolled_up_gloves2); +// UNIFORM_SLEEVES(CUP_U_O_RUS_VSR98_VDV,CUP_U_O_RUS_VSR98_VDV_rolled_up); +// UNIFORM_SLEEVES(CUP_U_O_RUS_VSR98_VDV_rolled_up,CUP_U_O_RUS_VSR98_VDV_rolled_up_gloves2); +UNIFORM_SLEEVES(CUP_U_O_RUS_M88_MSV,CUP_U_O_RUS_M88_MSV_rolled_up); +UNIFORM_SLEEVES(CUP_U_O_RUS_M88_VDV,CUP_U_O_RUS_M88_VDV_rolled_up); + +class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_1: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_2; + class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_3; + class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_4; + }; +}; +class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_2: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_1; + }; +}; +class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_3: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_1; + }; +}; +class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_4: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_1; + }; +}; + +//CUP_U_O_RUS_VSR93_MSV -> CUP_U_O_RUS_VSR93_worn_gloves_MSV +UNIFORM_SLEEVES(CUP_U_O_RUS_VSR93_MSV,CUP_U_O_RUS_VSR93_MSV_rolled_up); + +//CUP_U_O_RUS_VSR98_worn_MSV ->CUP_U_O_RUS_VSR98_worn_MSV_rolled_up +//CUP_U_O_RUS_VSR98_worn_MSV -> CUP_U_O_RUS_VSR98_worn_gloves_MSV +UNIFORM_SLEEVES(CUP_U_O_RUS_VSR98_MSV,CUP_U_O_RUS_VSR98_MSV_rolled_up); + +//CUP_U_O_RUS_Flora_1_VDV -> CUP_U_O_RUS_Flora_2_VDV +//CUP_U_O_RUS_Flora_1_VDV -> CUP_U_O_RUS_Flora_3 + +//CUP_U_O_RUS_VSR98_worn_VDV -> CUP_U_O_RUS_VSR98_worn_gloves_VDV +//CUP_U_O_RUS_VSR98_worn_VDV -> CUP_U_O_RUS_VSR98_worn_VDV_rolled_up +//CUP_U_O_RUS_VSR98_worn_VDV_rolled_up -> CUP_U_O_RUS_VSR98_worn_VDV_rolled_up_gloves2 +//CUP_U_O_RUS_VSR98_worn_VDV_rolled_up_gloves2 -> CUP_U_O_RUS_VSR98_worn_gloves_VDV + +// ToDo MACRO +class CUP_U_O_RUS_Soldier_VKPO_Desert_1: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Desert_2; + class CUP_U_O_RUS_Soldier_VKPO_Desert_3; + class CUP_U_O_RUS_Soldier_VKPO_Desert_4; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_1; + }; +}; +class CUP_U_O_RUS_Soldier_VKPO_Desert_2: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Desert_1; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_2; + }; +}; +class CUP_U_O_RUS_Soldier_VKPO_Desert_3: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Desert_1; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_3; + }; +}; +class CUP_U_O_RUS_Soldier_VKPO_Desert_4: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Desert_1; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_4; + }; +}; +class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_1: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Desert_1; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_2; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_3; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_4; + }; +}; +class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_2: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Desert_1; + class CUP_U_O_RUS_Soldier_VKPO_Desert_2; + }; +}; +class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_3: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Desert_1; + class CUP_U_O_RUS_Soldier_VKPO_Desert_3; + }; +}; +class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_4: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Desert_1; + class CUP_U_O_RUS_Soldier_VKPO_Desert_4; + }; +}; + +class CUP_U_O_RUS_Soldier_VKPO_Summer_1: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Summer_2; + class CUP_U_O_RUS_Soldier_VKPO_Summer_3; + class CUP_U_O_RUS_Soldier_VKPO_Summer_4; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_1; + }; +}; +class CUP_U_O_RUS_Soldier_VKPO_Summer_2: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Summer_1; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_2; + }; +}; +class CUP_U_O_RUS_Soldier_VKPO_Summer_3: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Summer_1; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_3; + }; +}; +class CUP_U_O_RUS_Soldier_VKPO_Summer_4: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Summer_1; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_4; + }; +}; +class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_1: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Summer_1; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_2; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_3; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_4; + }; +}; +class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_2: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Summer_1; + class CUP_U_O_RUS_Soldier_VKPO_Summer_2; + }; +}; +class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_3: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Summer_1; + class CUP_U_O_RUS_Soldier_VKPO_Summer_3; + }; +}; +class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_4: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Summer_1; + class CUP_U_O_RUS_Soldier_VKPO_Summer_4; + }; +}; + +class CUP_U_O_RUS_Soldier_VKPO_Winter_1: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Winter_2; + class CUP_U_O_RUS_Soldier_VKPO_Winter_3; + class CUP_U_O_RUS_Soldier_VKPO_Winter_4; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_1; + }; +}; +class CUP_U_O_RUS_Soldier_VKPO_Winter_2: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Winter_1; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_2; + }; +}; +class CUP_U_O_RUS_Soldier_VKPO_Winter_3: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Winter_1; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_3; + }; +}; +class CUP_U_O_RUS_Soldier_VKPO_Winter_4: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Winter_1; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_4; + }; +}; +class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_1: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Winter_1; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_2; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_3; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_4; + }; +}; +class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_2: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Winter_1; + class CUP_U_O_RUS_Soldier_VKPO_Winter_2; + }; +}; +class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_3: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Winter_1; + class CUP_U_O_RUS_Soldier_VKPO_Winter_3; + }; +}; +class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_4: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_O_RUS_Soldier_VKPO_Winter_1; + class CUP_U_O_RUS_Soldier_VKPO_Winter_4; + }; +}; + +// Armed Forces of Ukraine +CUP_UNIFORM_GLOVES_KNEEPAD_ROLLED(CUP_U_B_AFU_ACU_M14,CUP_U_B_AFU_ACU_Gloves_M14,CUP_U_B_AFU_ACU_Kneepad_M14,CUP_U_B_AFU_ACU_Kneepad_Gloves_M14,CUP_U_B_AFU_ACU_Rolled_M14,CUP_U_B_AFU_ACU_Rolled_Gloves_M14,CUP_U_B_AFU_ACU_Kneepad_Rolled_M14,CUP_U_B_AFU_ACU_Kneepad_Rolled_Gloves_M14); + +// Gorka +CUP_UNIFORM_3(CUP_U_O_RUS_Gorka_Green,CUP_U_O_RUS_Gorka_Green_gloves2,CUP_U_O_RUS_Gorka_Green_gloves_kneepads); +CUP_UNIFORM_3(CUP_U_O_RUS_Gorka_Partizan_A,CUP_U_O_RUS_Gorka_Partizan_A_gloves2,CUP_U_O_RUS_Gorka_Partizan_A_gloves_kneepads); +CUP_UNIFORM_3(CUP_U_O_RUS_Gorka_Partizan,CUP_U_O_RUS_Gorka_Partizan_gloves2,CUP_U_O_RUS_Gorka_Partizan_gloves_kneepads); + +// British Armed Forces +CUP_UNIFORM_TSHIRT(CUP_U_B_BAF_MTP_UBACSTSHIRT,CUP_U_B_BAF_MTP_UBACSTSHIRT_Gloves,CUP_U_B_BAF_MTP_UBACSTSHIRTKNEE); +CUP_UNIFORM_TSHIRT(CUP_U_B_BAF_DPM_UBACSTSHIRT,CUP_U_B_BAF_DPM_UBACSTSHIRT_Gloves,CUP_U_B_BAF_DPM_UBACSTSHIRTKNEE); +CUP_UNIFORM_TSHIRT(CUP_U_B_BAF_DDPM_UBACSTSHIRT,CUP_U_B_BAF_DDPM_UBACSTSHIRT_Gloves,CUP_U_B_BAF_DDPM_UBACSTSHIRTKNEE); + +CUP_UNIFORM_BAF(CUP_U_B_BAF_MTP_UBACSLONG,CUP_U_B_BAF_MTP_UBACSLONG_Gloves,CUP_U_B_BAF_MTP_UBACSLONGKNEE,CUP_U_B_BAF_MTP_UBACSLONGKNEE_Gloves,CUP_U_B_BAF_MTP_UBACSROLLED,CUP_U_B_BAF_MTP_UBACSROLLED_Gloves,CUP_U_B_BAF_MTP_UBACSROLLEDKNEE); +CUP_UNIFORM_BAF(CUP_U_B_BAF_DPM_UBACSLONG,CUP_U_B_BAF_DPM_UBACSLONG_Gloves,CUP_U_B_BAF_DPM_UBACSLONGKNEE,CUP_U_B_BAF_DPM_UBACSLONGKNEE_Gloves,CUP_U_B_BAF_DPM_UBACSROLLED,CUP_U_B_BAF_DPM_UBACSROLLED_Gloves,CUP_U_B_BAF_DPM_UBACSROLLEDKNEE); +CUP_UNIFORM_BAF(CUP_U_B_BAF_DDPM_UBACSLONG,CUP_U_B_BAF_DDPM_UBACSLONG_Gloves,CUP_U_B_BAF_DDPM_UBACSLONGKNEE,CUP_U_B_BAF_DDPM_UBACSLONGKNEE_Gloves,CUP_U_B_BAF_DDPM_UBACSROLLED,CUP_U_B_BAF_DDPM_UBACSROLLED_Gloves,CUP_U_B_BAF_DDPM_UBACSROLLEDKNEE); + +// Crye +UNIFORM_SLEEVES(CUP_U_CRYE_ATACSAU_Full,CUP_U_CRYE_ATACSAU_Roll); +UNIFORM_SLEEVES(CUP_U_CRYE_ATACSFG_Full,CUP_U_CRYE_ATACSFG_Roll); +UNIFORM_SLEEVES(CUP_U_CRYE_BLK_Full,CUP_U_CRYE_BLK_Roll); +UNIFORM_SLEEVES(CUP_U_CRYE_BLK_RUS_Full,CUP_U_CRYE_BLK_RUS_Roll); +UNIFORM_SLEEVES(CUP_U_CRYE_MCAM_NP_Full,CUP_U_CRYE_MCAM_NP_Roll); +UNIFORM_SLEEVES(CUP_U_CRYE_MCAM_RUS_Full,CUP_U_CRYE_MCAM_RUS_Roll); +UNIFORM_SLEEVES(CUP_U_CRYE_MCAM_NP2_Full,CUP_U_CRYE_MCAM_NP2_Roll); +UNIFORM_SLEEVES(CUP_U_CRYE_MCAM_RUS2_Full,CUP_U_CRYE_MCAM_RUS2_Roll); +UNIFORM_SLEEVES(CUP_U_CRYE_V1_Full,CUP_U_CRYE_V1_Roll); +UNIFORM_SLEEVES(CUP_U_CRYE_V2_Full,CUP_U_CRYE_V2_Roll); +UNIFORM_SLEEVES(CUP_U_CRYE_V3_Full,CUP_U_CRYE_V3_Roll); +UNIFORM_SLEEVES(CUP_U_CRYE_RGR_Full,CUP_U_CRYE_RGR_Roll); +UNIFORM_SLEEVES(CUP_U_CRYE_RGR_US_Full,CUP_U_CRYE_RGR_US_Roll); +UNIFORM_SLEEVES(CUP_U_CRYE_TAN_Full,CUP_U_CRYE_TAN_Roll); +UNIFORM_SLEEVES(CUP_U_CRYE_TAN_US_Full,CUP_U_CRYE_TAN_US_Roll); +UNIFORM_SLEEVES(CUP_U_B_GER_Fleck_Crye,CUP_U_B_GER_Fleck_Crye2); +UNIFORM_SLEEVES(CUP_U_B_GER_Crye,CUP_U_B_GER_Crye2); + +// German Army +CUP_UNIFORM_GLOVES_KNEEPAD_ROLLED(CUP_U_B_GER_Tropentarn_5,CUP_U_B_GER_Tropentarn_6,CUP_U_B_GER_Tropentarn_1,CUP_U_B_GER_Tropentarn_2,CUP_U_B_GER_Tropentarn_8,CUP_U_B_GER_Tropentarn_7,CUP_U_B_GER_Tropentarn_4,CUP_U_B_GER_Tropentarn_3); +CUP_UNIFORM_GLOVES_KNEEPAD_ROLLED(CUP_U_B_GER_Flecktarn_5,CUP_U_B_GER_Flecktarn_6,CUP_U_B_GER_Flecktarn_1,CUP_U_B_GER_Flecktarn_2,CUP_U_B_GER_Flecktarn_8,CUP_U_B_GER_Flecktarn_7,CUP_U_B_GER_Flecktarn_4,CUP_U_B_GER_Flecktarn_3); + +// Horizon Island Legion +CUP_UNIFORM_GLOVES_KNEEPAD_ROLLED(CUP_U_B_HIL_ACU_CCE,CUP_U_B_HIL_ACU_Gloves_CCE,CUP_U_B_HIL_ACU_Kneepad_CCE,CUP_U_B_HIL_ACU_Kneepad_Gloves_CCE,CUP_U_B_HIL_ACU_Rolled_CCE,CUP_U_B_HIL_ACU_Rolled_Gloves_CCE,CUP_U_B_HIL_ACU_Kneepad_Rolled_CCE,CUP_U_B_HIL_ACU_Kneepad_Rolled_Gloves_CCE); +CUP_UNIFORM_GLOVES_KNEEPAD_ROLLED(CUP_U_B_HIL_ACU_TTS,CUP_U_B_HIL_ACU_Gloves_TTS,CUP_U_B_HIL_ACU_Kneepad_TTS,CUP_U_B_HIL_ACU_Kneepad_Gloves_TTS,CUP_U_B_HIL_ACU_Rolled_TTS,CUP_U_B_HIL_ACU_Rolled_Gloves_TTS,CUP_U_B_HIL_ACU_Kneepad_Rolled_TTS,CUP_U_B_HIL_ACU_Kneepad_Rolled_Gloves_TTS); + +// Chernarussian Defence Force +UNIFORM_SLEEVES(CUP_U_B_CDF_DST_1,CUP_U_B_CDF_DST_2); +UNIFORM_SLEEVES(CUP_U_B_CDF_FST_1,CUP_U_B_CDF_FST_2); +UNIFORM_SLEEVES(CUP_U_B_CDF_MNT_1,CUP_U_B_CDF_MNT_2); +UNIFORM_GLOVES(CUP_U_B_CDF_SNW_1,CUP_U_B_CDF_SNW_2); + +// Rebels +BASE_PAIR(CUP_U_I_GUE_Anorak_01,CUP_U_I_GUE_Anorak_03); +BASE_PAIR(CUP_U_I_GUE_Flecktarn2,CUP_U_I_GUE_Flecktarn3); + +// PMC +BASE_PAIR(CUP_I_B_PMC_Unit_30,CUP_I_B_PMC_Unit_29); +BASE_PAIR(CUP_I_B_PMC_Unit_27,CUP_I_B_PMC_Unit_26); +BASE_PAIR(CUP_I_B_PMC_Unit_25,CUP_I_B_PMC_Unit_18); +BASE_PAIR(CUP_I_B_PMC_Unit_34,CUP_I_B_PMC_Unit_33); + +//Royal Army Corps of Sahrani +BASE_PAIR(CUP_U_I_RACS_Desert_1,CUP_U_I_RACS_Desert_2); +BASE_PAIR(CUP_U_I_RACS_mech_1,CUP_U_I_RACS_mech_2); +BASE_PAIR(CUP_U_I_RACS_Urban_1,CUP_U_I_RACS_Urban_2); +BASE_PAIR(CUP_U_I_RACS_WDL_1,CUP_U_I_RACS_WDL_2); + +// US Army +BASE_PAIR(CUP_U_B_USArmy_Base,CUP_U_B_USArmy_TwoKnee); +CUP_UNIFORM_GLOVES_KNEEPAD_ROLLED(CUP_U_B_USArmy_ACU_OCP,CUP_U_B_USArmy_ACU_Gloves_OCP,CUP_U_B_USArmy_ACU_Kneepad_OCP,CUP_U_B_USArmy_ACU_Kneepad_Gloves_OCP,CUP_U_B_USArmy_ACU_Rolled_OCP,CUP_U_B_USArmy_ACU_Rolled_Gloves_OCP,CUP_U_B_USArmy_ACU_Kneepad_Rolled_OCP,CUP_U_B_USArmy_ACU_Kneepad_Rolled_Gloves_OCP); +CUP_UNIFORM_GLOVES_KNEEPAD_ROLLED(CUP_U_B_USArmy_ACU_OEFCP,CUP_U_B_USArmy_ACU_Gloves_OEFCP,CUP_U_B_USArmy_ACU_Kneepad_OEFCP,CUP_U_B_USArmy_ACU_Kneepad_Gloves_OEFCP,CUP_U_B_USArmy_ACU_Rolled_OEFCP,CUP_U_B_USArmy_ACU_Rolled_Gloves_OEFCP,CUP_U_B_USArmy_ACU_Kneepad_Rolled_OEFCP,CUP_U_B_USArmy_ACU_Kneepad_Rolled_Gloves_OEFCP); +CUP_UNIFORM_GLOVES_KNEEPAD_ROLLED(CUP_U_B_USArmy_ACU_UCP,CUP_U_B_USArmy_ACU_Gloves_UCP,CUP_U_B_USArmy_ACU_Kneepad_UCP,CUP_U_B_USArmy_ACU_Kneepad_Gloves_UCP,CUP_U_B_USArmy_ACU_Rolled_UCP,CUP_U_B_USArmy_ACU_Rolled_Gloves_UCP,CUP_U_B_USArmy_ACU_Kneepad_Rolled_UCP,CUP_U_B_USArmy_ACU_Kneepad_Rolled_Gloves_UCP); + +// USMC +class CUP_U_B_USMC_MCCUU: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_B_USMC_MCCUU_gloves; + class CUP_U_B_USMC_MCCUU_pads; + class CUP_U_B_USMC_MCCUU_roll; + }; +}; +class CUP_U_B_USMC_MCCUU_gloves: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_B_USMC_MCCUU_roll_gloves; + class CUP_U_B_USMC_MCCUU_pads_gloves; + class CUP_U_B_USMC_MCCUU; + }; +}; +class CUP_U_B_USMC_MCCUU_pads_gloves: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_B_USMC_MCCUU_roll_pads; + class CUP_U_B_USMC_MCCUU_pads_gloves; + class CUP_U_B_USMC_MCCUU; + }; +}; +class CUP_U_B_USMC_MCCUU_roll: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_B_USMC_MCCUU_roll_2; + class CUP_U_B_USMC_MCCUU_roll_gloves; + class CUP_U_B_USMC_MCCUU_roll_pads; + class CUP_U_B_USMC_MCCUU; + }; +}; +class CUP_U_B_USMC_MCCUU_roll_gloves: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_B_USMC_MCCUU_roll_2_gloves; + class CUP_U_B_USMC_MCCUU_gloves; + class CUP_U_B_USMC_MCCUU_roll_pads_gloves; + class CUP_U_B_USMC_MCCUU_roll; + }; +}; +class CUP_U_B_USMC_MCCUU_roll_pads: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_B_USMC_MCCUU_roll_2_pads; + class CUP_U_B_USMC_MCCUU_pads; + class CUP_U_B_USMC_MCCUU_roll_pads_gloves; + class CUP_U_B_USMC_MCCUU_roll; + }; +}; +class CUP_U_B_USMC_MCCUU_roll_2: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_B_USMC_MCCUU_roll_2_gloves; + class CUP_U_B_USMC_MCCUU_roll_2_pads; + class CUP_U_B_USMC_MCCUU_roll; + }; +}; +class CUP_U_B_USMC_MCCUU_roll_2_gloves: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_B_USMC_MCCUU_roll_2; + class CUP_U_B_USMC_MCCUU_roll_2_pads_gloves; + class CUP_U_B_USMC_MCCUU_roll_gloves; + }; +}; +class CUP_U_B_USMC_MCCUU_roll_2_pads: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_B_USMC_MCCUU_roll_2; + class CUP_U_B_USMC_MCCUU_roll_2_pads_gloves; + class CUP_U_B_USMC_MCCUU_roll_pads; + }; +}; +class CUP_U_B_USMC_MCCUU_roll_2_pads_gloves: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_B_USMC_MCCUU_roll_2_pads; + class CUP_U_B_USMC_MCCUU_roll_2_gloves; + class CUP_U_B_USMC_MCCUU_roll_pads_gloves; + }; +}; + +class CUP_U_B_USMC_MCCUU_des: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_B_USMC_MCCUU_des_gloves; + class CUP_U_B_USMC_MCCUU_des_pads; + class CUP_U_B_USMC_MCCUU_des_roll; + }; +}; +class CUP_U_B_USMC_MCCUU_des_gloves: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_B_USMC_MCCUU_des_roll_gloves; + class CUP_U_B_USMC_MCCUU_des_pads_gloves; + class CUP_U_B_USMC_MCCUU_des; + }; +}; +class CUP_U_B_USMC_MCCUU_des_pads_gloves: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_B_USMC_MCCUU_des_roll_pads; + class CUP_U_B_USMC_MCCUU_des_pads_gloves; + class CUP_U_B_USMC_MCCUU_des; + }; +}; +class CUP_U_B_USMC_MCCUU_des_roll: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_B_USMC_MCCUU_des_roll_2; + class CUP_U_B_USMC_MCCUU_des_roll_gloves; + class CUP_U_B_USMC_MCCUU_des_roll_pads; + class CUP_U_B_USMC_MCCUU_des; + }; +}; +class CUP_U_B_USMC_MCCUU_des_roll_gloves: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_B_USMC_MCCUU_des_roll_2_gloves; + class CUP_U_B_USMC_MCCUU_des_gloves; + class CUP_U_B_USMC_MCCUU_des_roll_pads_gloves; + class CUP_U_B_USMC_MCCUU_des_roll; + }; +}; +class CUP_U_B_USMC_MCCUU_des_roll_pads: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_B_USMC_MCCUU_des_roll_2_pads; + class CUP_U_B_USMC_MCCUU_des_pads; + class CUP_U_B_USMC_MCCUU_des_roll_pads_gloves; + class CUP_U_B_USMC_MCCUU_des_roll; + }; +}; +class CUP_U_B_USMC_MCCUU_des_roll_2: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_B_USMC_MCCUU_des_roll_2_gloves; + class CUP_U_B_USMC_MCCUU_des_roll_2_pads; + class CUP_U_B_USMC_MCCUU_des_roll; + }; +}; +class CUP_U_B_USMC_MCCUU_des_roll_2_gloves: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_B_USMC_MCCUU_des_roll_2; + class CUP_U_B_USMC_MCCUU_des_roll_2_pads_gloves; + class CUP_U_B_USMC_MCCUU_des_roll_gloves; + }; +}; +class CUP_U_B_USMC_MCCUU_des_roll_2_pads: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_B_USMC_MCCUU_des_roll_2; + class CUP_U_B_USMC_MCCUU_des_roll_2_pads_gloves; + class CUP_U_B_USMC_MCCUU_des_roll_pads; + }; +}; +class CUP_U_B_USMC_MCCUU_des_roll_2_pads_gloves: EGVAR(wardrobe,base) { + class modifiableTo { + class CUP_U_B_USMC_MCCUU_des_roll_2_pads; + class CUP_U_B_USMC_MCCUU_des_roll_2_gloves; + class CUP_U_B_USMC_MCCUU_des_roll_pads_gloves; + }; +}; \ No newline at end of file diff --git a/addons/compat_cup_units/compat_cup_wardrobe/CfgWeapons.hpp b/addons/compat_cup_units/compat_cup_wardrobe/CfgWeapons.hpp deleted file mode 100644 index 9d03783519e..00000000000 --- a/addons/compat_cup_units/compat_cup_wardrobe/CfgWeapons.hpp +++ /dev/null @@ -1,3 +0,0 @@ -class CfgWeapons { - -}; diff --git a/addons/compat_cup_units/compat_cup_wardrobe/config.cpp b/addons/compat_cup_units/compat_cup_wardrobe/config.cpp index 0a38782486b..7a647a2b2cf 100644 --- a/addons/compat_cup_units/compat_cup_wardrobe/config.cpp +++ b/addons/compat_cup_units/compat_cup_wardrobe/config.cpp @@ -12,7 +12,7 @@ class CfgPatches { }; skipWhenMissingDependencies = 1; author = ECSTRING(common,ACETeam); - authors[] = {"Andx [TTT]", "OverlordZorn [CVO]"}; + authors[] = {"OverlordZorn [CVO]", "Andx [TTT]"}; url = ECSTRING(main,URL); VERSION_CONFIG; addonRootClass = QUOTE(ADDON); @@ -20,7 +20,7 @@ class CfgPatches { }; // For Consistency: Adjust Mass/containerSize -// #include "CfgWeapons.hpp" +//#include "CfgWeapons.hpp" // ACE Wardrobe -#include "CfgWardrobe.hpp" +#include "CfgWardrobe.hpp" \ No newline at end of file diff --git a/addons/compat_cup_units/compat_cup_wardrobe/script_component.hpp b/addons/compat_cup_units/compat_cup_wardrobe/script_component.hpp index 33ff700f410..67ddb91ef0a 100644 --- a/addons/compat_cup_units/compat_cup_wardrobe/script_component.hpp +++ b/addons/compat_cup_units/compat_cup_wardrobe/script_component.hpp @@ -2,4 +2,4 @@ #define SUBCOMPONENT_BEAUTIFIED Wardrobe #include "..\script_component.hpp" -#include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp" +#include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp" \ No newline at end of file From 2ef8be99480127373bd37851f91dc21ca561ee69 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 12 May 2025 22:28:18 +0200 Subject: [PATCH 207/305] Update CfgWardrobe_Headgear.hpp --- .../compat_cup_wardrobe/CfgWardrobe_Headgear.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Headgear.hpp b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Headgear.hpp index e053896c892..0da029d54d5 100644 --- a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Headgear.hpp +++ b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Headgear.hpp @@ -187,4 +187,5 @@ HELMET_VISOR(CUP_H_RUS_ZSH_Shield_Up,CUP_H_RUS_ZSH_Shield_Down); HELMET_VISOR(CUP_H_SPH4,CUP_H_SPH4_visor); HELMET_VISOR(CUP_H_SPH4_khaki,CUP_H_SPH4_khaki_visor); HELMET_VISOR(CUP_H_SPH4_grey,CUP_H_SPH4_grey_visor); -HELMET_VISOR(CUP_H_SPH4_green,CUP_H_SPH4_green_visor); \ No newline at end of file +HELMET_VISOR(CUP_H_SPH4_green,CUP_H_SPH4_green_visor); + From 78dbf9a80ecd5f901b83869493f1d8bff4ebcc0b Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 12 May 2025 22:28:34 +0200 Subject: [PATCH 208/305] Update CfgWardrobe_Goggles.hpp --- .../compat_cup_wardrobe/CfgWardrobe_Goggles.hpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Goggles.hpp b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Goggles.hpp index 77f9f104af8..df2d12a5cc6 100644 --- a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Goggles.hpp +++ b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Goggles.hpp @@ -1,14 +1,20 @@ // Balaclava BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_Sage_1,CUP_G_RUS_Ratnik_Balaclava_Sage_2); + BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_Olive_1,CUP_G_RUS_Ratnik_Balaclava_Olive_2); + BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_Green_1,CUP_G_RUS_Ratnik_Balaclava_Green_2); BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_Green_3,CUP_G_RUS_Ratnik_Balaclava_Green_4); + BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_EMR_Autumn_1,CUP_G_RUS_Ratnik_Balaclava_EMR_Autumn_2); + BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_EMR_Summer_1,CUP_G_RUS_Ratnik_Balaclava_EMR_Summer_2); + BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_Desert_1,CUP_G_RUS_Ratnik_Balaclava_Desert_2); BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_Desert_3,CUP_G_RUS_Ratnik_Balaclava_Desert_4); -BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_A_Tacs_3,CUP_G_RUS_Ratnik_Balaclava_A_Tacs_4); + BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_A_Tacs_1,CUP_G_RUS_Ratnik_Balaclava_A_Tacs_2); +BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_A_Tacs_3,CUP_G_RUS_Ratnik_Balaclava_A_Tacs_4); // ToDO -// Scarf + ESS Combos \ No newline at end of file +// Scarf + ESS Combos From 06884c993519dedcc987c4eae3820b6fbcca1924 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 12 May 2025 22:28:45 +0200 Subject: [PATCH 209/305] Update CfgWardrobe.hpp --- addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp index 8df38fc6c20..af05b3b3200 100644 --- a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp @@ -4,4 +4,4 @@ class ace_wardrobe { #include "CfgWardrobe_Uniforms.hpp" #include "CfgWardrobe_Headgear.hpp" #include "CfgWardrobe_Goggles.hpp" -}; \ No newline at end of file +}; From c1576ec43394d564040785ec38d15e985a0646dd Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 12 May 2025 22:53:54 +0200 Subject: [PATCH 210/305] basic_pair -> base_pair --- .../CfgWardrobe_Goggles.hpp | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Goggles.hpp b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Goggles.hpp index df2d12a5cc6..13ad4664193 100644 --- a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Goggles.hpp +++ b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Goggles.hpp @@ -1,20 +1,19 @@ -// Balaclava -BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_Sage_1,CUP_G_RUS_Ratnik_Balaclava_Sage_2); +BASE_PAIR(CUP_G_RUS_Ratnik_Balaclava_Sage_1,CUP_G_RUS_Ratnik_Balaclava_Sage_2); -BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_Olive_1,CUP_G_RUS_Ratnik_Balaclava_Olive_2); +BASE_PAIR(CUP_G_RUS_Ratnik_Balaclava_Olive_1,CUP_G_RUS_Ratnik_Balaclava_Olive_2); -BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_Green_1,CUP_G_RUS_Ratnik_Balaclava_Green_2); -BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_Green_3,CUP_G_RUS_Ratnik_Balaclava_Green_4); +BASE_PAIR(CUP_G_RUS_Ratnik_Balaclava_Green_1,CUP_G_RUS_Ratnik_Balaclava_Green_2); +BASE_PAIR(CUP_G_RUS_Ratnik_Balaclava_Green_3,CUP_G_RUS_Ratnik_Balaclava_Green_4); -BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_EMR_Autumn_1,CUP_G_RUS_Ratnik_Balaclava_EMR_Autumn_2); +BASE_PAIR(CUP_G_RUS_Ratnik_Balaclava_EMR_Autumn_1,CUP_G_RUS_Ratnik_Balaclava_EMR_Autumn_2); -BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_EMR_Summer_1,CUP_G_RUS_Ratnik_Balaclava_EMR_Summer_2); +BASE_PAIR(CUP_G_RUS_Ratnik_Balaclava_EMR_Summer_1,CUP_G_RUS_Ratnik_Balaclava_EMR_Summer_2); -BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_Desert_1,CUP_G_RUS_Ratnik_Balaclava_Desert_2); -BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_Desert_3,CUP_G_RUS_Ratnik_Balaclava_Desert_4); +BASE_PAIR(CUP_G_RUS_Ratnik_Balaclava_Desert_1,CUP_G_RUS_Ratnik_Balaclava_Desert_2); +BASE_PAIR(CUP_G_RUS_Ratnik_Balaclava_Desert_3,CUP_G_RUS_Ratnik_Balaclava_Desert_4); -BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_A_Tacs_1,CUP_G_RUS_Ratnik_Balaclava_A_Tacs_2); -BASIC_PAIR(CUP_G_RUS_Ratnik_Balaclava_A_Tacs_3,CUP_G_RUS_Ratnik_Balaclava_A_Tacs_4); +BASE_PAIR(CUP_G_RUS_Ratnik_Balaclava_A_Tacs_3,CUP_G_RUS_Ratnik_Balaclava_A_Tacs_4); +BASE_PAIR(CUP_G_RUS_Ratnik_Balaclava_A_Tacs_1,CUP_G_RUS_Ratnik_Balaclava_A_Tacs_2); // ToDO // Scarf + ESS Combos From d7a72340727fbe65272607922fab803e44cb75fc Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 13 May 2025 11:45:36 +0200 Subject: [PATCH 211/305] player -> ace_player --- addons/wardrobe/functions/fnc_nextVariant_get.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_nextVariant_get.sqf b/addons/wardrobe/functions/fnc_nextVariant_get.sqf index fa9f9add11b..72289296c40 100644 --- a/addons/wardrobe/functions/fnc_nextVariant_get.sqf +++ b/addons/wardrobe/functions/fnc_nextVariant_get.sqf @@ -35,7 +35,7 @@ if (_history_cfg isEqualTo "404") then { missionNamespace setVariable [QGVAR(variant_history_cfg), _history_cfg]; - player addEventHandler ["InventoryClosed", { + ACE_player addEventHandler ["InventoryClosed", { missionNamespace setVariable [QGVAR(variant_history_cfg), nil ]; player removeEventHandler [_thisEvent, _thisEventhandler]; }]; From daa12084275acd3af95b07bf81df130f2aa1ca11 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 13 May 2025 12:01:09 +0200 Subject: [PATCH 212/305] _fnc_ -> FUNC() --- addons/wardrobe/functions/fnc_nextVariant_get.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_nextVariant_get.sqf b/addons/wardrobe/functions/fnc_nextVariant_get.sqf index 72289296c40..772dc2c51ac 100644 --- a/addons/wardrobe/functions/fnc_nextVariant_get.sqf +++ b/addons/wardrobe/functions/fnc_nextVariant_get.sqf @@ -44,7 +44,7 @@ if (_history_cfg isEqualTo "404") then { private _remaining = _modifiableTo_cfg - _history_cfg; -_remaining = _remaining select { [ace_player, _cfg_current, _x] call ace_wardrobe_fnc_canModifyTo }; +_remaining = _remaining select { [ace_player, _cfg_current, _x] call FUNC(canModifyTo) }; // Returns ether a random remaining item or alternatively, a random one from the complete array. private _return = if (_remaining isNotEqualTo []) then { From 60e3382a26c866c96b4b545f6657a3044ca14365 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 13 May 2025 12:02:27 +0200 Subject: [PATCH 213/305] rm [] and cba->CBA --- addons/wardrobe/functions/fnc_nextVariant_do.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_nextVariant_do.sqf b/addons/wardrobe/functions/fnc_nextVariant_do.sqf index 02613d3d8fe..c2990007323 100644 --- a/addons/wardrobe/functions/fnc_nextVariant_do.sqf +++ b/addons/wardrobe/functions/fnc_nextVariant_do.sqf @@ -22,7 +22,7 @@ params ["_unit", "_container", "_item", "_slot", "_params"]; -private _current_cfg = [_item] call cba_fnc_getItemConfig; +private _current_cfg = _item call CBA_fnc_getItemConfig; private _cfg_tgt = [ _current_cfg ] call FUNC(nextVariant_get); From 0050e72b2f6b13c70d0c5ed5af1ceb1ba2918195 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 13 May 2025 12:04:10 +0200 Subject: [PATCH 214/305] -> !isNull _cfg && {isClass...} --- addons/wardrobe/functions/fnc_isModifiable.sqf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/wardrobe/functions/fnc_isModifiable.sqf b/addons/wardrobe/functions/fnc_isModifiable.sqf index 21b3200f3d8..912eb6a5145 100644 --- a/addons/wardrobe/functions/fnc_isModifiable.sqf +++ b/addons/wardrobe/functions/fnc_isModifiable.sqf @@ -21,5 +21,4 @@ params [ ]; -if (isNull _cfg) exitWith {false}; -isClass (configFile >> QUOTE(ADDON) >> configName _cfg) \ No newline at end of file +!isNull _cfg && { isClass (configFile >> QUOTE(ADDON) >> configName _cfg) } From bd15a031a572d905180bc575df50bf632d66bfb4 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Tue, 13 May 2025 12:04:54 +0200 Subject: [PATCH 215/305] Update addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Booniehats.hpp Co-authored-by: Grim <69561145+LinkIsGrim@users.noreply.github.com> --- .../compat_sog/compat_sog_wardrobe/CfgWardrobe_Booniehats.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Booniehats.hpp b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Booniehats.hpp index b0f0d622d44..905e9749251 100644 --- a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Booniehats.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Booniehats.hpp @@ -6,7 +6,7 @@ // 09 rebel - not compatible //Colors // 01 green 02 tiger 03 black 04 spray 05 tiger green 06 erdl brown 07 leopard 08 erdl -// 09 gray <- Fuck this - inheritance is fucking horrible as fuck. +// 09 gray <- inheritance is horrible. // Macros From 7b6d87f990af111c39c57051d7e80aae2cf69fad Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 13 May 2025 12:50:33 +0200 Subject: [PATCH 216/305] snake_case -> camelCase --- addons/wardrobe/CfgVehicles.hpp | 2 +- addons/wardrobe/XEH_PREP.hpp | 38 ++++++------ addons/wardrobe/XEH_postInit.sqf | 2 +- addons/wardrobe/functions/fnc_addActions.sqf | 4 +- ...hildren.sqf => fnc_addActionsChildren.sqf} | 14 ++--- ...dition.sqf => fnc_addActionsCondition.sqf} | 6 +- ...ctions_icon.sqf => fnc_addActionsIcon.sqf} | 2 +- ...ctions_name.sqf => fnc_addActionsName.sqf} | 2 +- .../{fnc_cache_get.sqf => fnc_cacheGet.sqf} | 2 +- .../{fnc_cache_set.sqf => fnc_cacheSet.sqf} | 2 +- addons/wardrobe/functions/fnc_canModifyTo.sqf | 10 +-- ...f => fnc_clearOnClosedInteractionMenu.sqf} | 10 +-- ...mponents.sqf => fnc_compareComponents.sqf} | 8 +-- ...ad.sqf => fnc_compareContainerMaxLoad.sqf} | 30 ++++----- ...textMenu.sqf => fnc_enableContextMenu.sqf} | 8 +-- ...c_getItems_all.sqf => fnc_getItemsAll.sqf} | 6 +- ..._all.sqf => fnc_getItemsModifiableAll.sqf} | 16 ++--- ....sqf => fnc_getItemsModifiableCurrent.sqf} | 14 ++--- .../functions/fnc_getItems_modifiableTo.sqf | 8 +-- ...xtVariant_do.sqf => fnc_nextVariantDo.sqf} | 14 ++--- .../wardrobe/functions/fnc_nextVariantGet.sqf | 61 +++++++++++++++++++ .../functions/fnc_nextVariant_get.sqf | 61 ------------------- addons/wardrobe/functions/fnc_replace.sqf | 38 ++++++------ ...container.sqf => fnc_replaceContainer.sqf} | 14 ++--- ...replace_other.sqf => fnc_replaceOther.sqf} | 8 +-- ...Ds.sqf => fnc_spareBarrelUpdateMagIDs.sqf} | 10 +-- addons/wardrobe/initSettings.inc.sqf | 6 +- 27 files changed, 198 insertions(+), 198 deletions(-) rename addons/wardrobe/functions/{fnc_addActions_children.sqf => fnc_addActionsChildren.sqf} (70%) rename addons/wardrobe/functions/{fnc_addActions_condition.sqf => fnc_addActionsCondition.sqf} (65%) rename addons/wardrobe/functions/{fnc_addActions_icon.sqf => fnc_addActionsIcon.sqf} (92%) rename addons/wardrobe/functions/{fnc_addActions_name.sqf => fnc_addActionsName.sqf} (90%) rename addons/wardrobe/functions/{fnc_cache_get.sqf => fnc_cacheGet.sqf} (98%) rename addons/wardrobe/functions/{fnc_cache_set.sqf => fnc_cacheSet.sqf} (85%) rename addons/wardrobe/functions/{fnc_clearOnClosed_InteractionMenu.sqf => fnc_clearOnClosedInteractionMenu.sqf} (67%) rename addons/wardrobe/functions/{fnc_compare_components.sqf => fnc_compareComponents.sqf} (79%) rename addons/wardrobe/functions/{fnc_compare_container_maxLoad.sqf => fnc_compareContainerMaxLoad.sqf} (63%) rename addons/wardrobe/functions/{fnc_enable_contextMenu.sqf => fnc_enableContextMenu.sqf} (79%) rename addons/wardrobe/functions/{fnc_getItems_all.sqf => fnc_getItemsAll.sqf} (74%) rename addons/wardrobe/functions/{fnc_getItems_modifiable_all.sqf => fnc_getItemsModifiableAll.sqf} (61%) rename addons/wardrobe/functions/{fnc_getItems_modifiable_current.sqf => fnc_getItemsModifiableCurrent.sqf} (62%) rename addons/wardrobe/functions/{fnc_nextVariant_do.sqf => fnc_nextVariantDo.sqf} (61%) create mode 100644 addons/wardrobe/functions/fnc_nextVariantGet.sqf delete mode 100644 addons/wardrobe/functions/fnc_nextVariant_get.sqf rename addons/wardrobe/functions/{fnc_replace_container.sqf => fnc_replaceContainer.sqf} (71%) rename addons/wardrobe/functions/{fnc_replace_other.sqf => fnc_replaceOther.sqf} (64%) rename addons/wardrobe/functions/{fnc_spareBarrel_updateMagIDs.sqf => fnc_spareBarrelUpdateMagIDs.sqf} (58%) diff --git a/addons/wardrobe/CfgVehicles.hpp b/addons/wardrobe/CfgVehicles.hpp index c24fa239e63..b35640a39b1 100644 --- a/addons/wardrobe/CfgVehicles.hpp +++ b/addons/wardrobe/CfgVehicles.hpp @@ -6,7 +6,7 @@ class CfgVehicles { class ADDON { displayName = CSTRING(actionTitle); // Text shown to user icon = QPATHTOF(data\wardrobe_logo.paa); - condition = QUOTE([_player] call FUNC(addActions_condition)); + condition = QUOTE([_player] call FUNC(addActionsCondition)); statement = ""; insertChildren = QUOTE([_player] call FUNC(addActions)); exceptions[] = {"isNotSwimming","isNotSitting"}; diff --git a/addons/wardrobe/XEH_PREP.hpp b/addons/wardrobe/XEH_PREP.hpp index f86a1191b25..0339cea87ef 100644 --- a/addons/wardrobe/XEH_PREP.hpp +++ b/addons/wardrobe/XEH_PREP.hpp @@ -1,34 +1,34 @@ PREP(isModifiable); -PREP(compare_components); +PREP(compareComponents); PREP(canModifyTo); // ace_intel PREP(getIndexFromMagID); PREP(setIndexForMagID); // getItems -PREP(getItems_all); -PREP(getItems_modifiable_all); -PREP(getItems_modifiable_current); -PREP(getItems_modifiableTo); +PREP(getItemsAll); +PREP(getItemsModifiable_all); +PREP(getItemsModifiable_current); +PREP(getItemsModifiableTo); // Replace PREP(replace); -PREP(replace_other); -PREP(replace_container); +PREP(replaceOther); +PREP(replaceContainer); // Compat -PREP(spareBarrel_updateMagIDs); +PREP(spareBarrelUpdateMagIDs); // Ace Actions PREP(addActions); -PREP(addActions_condition); -PREP(addActions_children); -PREP(addActions_name); -PREP(addActions_icon); +PREP(addActionsCondition); +PREP(addActionsChildren); +PREP(addActionsName); +PREP(addActionsIcon); // Cache -PREP(cache_get); -PREP(cache_set); -PREP(clearOnClosed_InteractionMenu); +PREP(cacheGet); +PREP(cacheSet); +PREP(clearOnClosedInteractionMenu); // Debug PREP(getAllWardrobeItems); -PREP(compare_container_maxLoad); +PREP(compareContainerMaxLoad); // CBA Context Menu -PREP(enable_contextMenu); -PREP(nextVariant_do); -PREP(nextVariant_get); +PREP(enableContextMenu); +PREP(nextVariantDo); +PREP(nextVariantGet); diff --git a/addons/wardrobe/XEH_postInit.sqf b/addons/wardrobe/XEH_postInit.sqf index 02b8be0674c..05a4f653a5a 100644 --- a/addons/wardrobe/XEH_postInit.sqf +++ b/addons/wardrobe/XEH_postInit.sqf @@ -1,4 +1,4 @@ #include "script_component.hpp" -[ QGVAR(EH_updateMagIDs), FUNC(spareBarrel_updateMagIDs) ] call CBA_fnc_addEventHandler; +[ QGVAR(EH_updateMagIDs), FUNC(spareBarrelUpdateMagIDs) ] call CBA_fnc_addEventHandler; diff --git a/addons/wardrobe/functions/fnc_addActions.sqf b/addons/wardrobe/functions/fnc_addActions.sqf index 00222a17d53..2d1385ed3a6 100644 --- a/addons/wardrobe/functions/fnc_addActions.sqf +++ b/addons/wardrobe/functions/fnc_addActions.sqf @@ -20,7 +20,7 @@ params ["_unit"]; -private _modifiableItems = [_unit] call FUNC(getItems_modifiable_current); +private _modifiableItems = [_unit] call FUNC(getItemsModifiableCurrent); private _actions = []; { private _cfg = _x#0; @@ -30,7 +30,7 @@ private _actions = []; getText (_cfg >> "picture"), {}, {true}, - FUNC(addActions_children), + FUNC(addActionsChildren), [_cfg, _x#1] ] call EFUNC(interact_menu,createAction); _actions pushBack [_aceAction, [], _unit]; diff --git a/addons/wardrobe/functions/fnc_addActions_children.sqf b/addons/wardrobe/functions/fnc_addActionsChildren.sqf similarity index 70% rename from addons/wardrobe/functions/fnc_addActions_children.sqf rename to addons/wardrobe/functions/fnc_addActionsChildren.sqf index 96a4013d2de..6d503ae1598 100644 --- a/addons/wardrobe/functions/fnc_addActions_children.sqf +++ b/addons/wardrobe/functions/fnc_addActionsChildren.sqf @@ -15,27 +15,27 @@ * Array of ACE Child Actions * * Example: - * _this call ace_wardrobe_fnc_addActions_children + * _this call ace_wardrobe_fnc_addActionsChildren * * Public: No */ params ["_target", "_player", "_actionParams"]; -_actionParams params ["_cfg_origin", "_newItems"]; +_actionParams params ["_cfgOrigin", "_newItems"]; private _actions = []; { - private _cfg_target = _x; + private _cfgTarget = _x; private _aceAction = [ - configName _cfg_target, - [_cfg_target] call FUNC(addActions_name), - [_cfg_target] call FUNC(addActions_icon), + configName _cfgTarget, + [_cfgTarget] call FUNC(addActionsName), + [_cfgTarget] call FUNC(addActionsIcon), FUNC(replace), {true}, {}, - [_cfg_origin, _cfg_target] + [_cfgOrigin, _cfgTarget] ] call EFUNC(interact_menu,createAction); _actions pushBack [_aceAction, [], _target]; diff --git a/addons/wardrobe/functions/fnc_addActions_condition.sqf b/addons/wardrobe/functions/fnc_addActionsCondition.sqf similarity index 65% rename from addons/wardrobe/functions/fnc_addActions_condition.sqf rename to addons/wardrobe/functions/fnc_addActionsCondition.sqf index e35a92e4e68..6a6affd56ee 100644 --- a/addons/wardrobe/functions/fnc_addActions_condition.sqf +++ b/addons/wardrobe/functions/fnc_addActionsCondition.sqf @@ -11,7 +11,7 @@ * condition * * Example: - * [_player] call ace_wardrobe_fnc_addActions_condition + * [_player] call ace_wardrobe_fnc_addActionsCondition * * Public: No */ @@ -21,10 +21,10 @@ params ["_player"]; isNil QGVAR(api_disable) && { - missionNamespace getVariable [QGVAR(set_enable_action), false] + missionNamespace getVariable [QGVAR(set_enableAction), false] && { - count ([_player] call FUNC(getItems_modifiable_current)) > 0 + count ([_player] call FUNC(getItemsModifiableCurrent)) > 0 } } diff --git a/addons/wardrobe/functions/fnc_addActions_icon.sqf b/addons/wardrobe/functions/fnc_addActionsIcon.sqf similarity index 92% rename from addons/wardrobe/functions/fnc_addActions_icon.sqf rename to addons/wardrobe/functions/fnc_addActionsIcon.sqf index d4c82a24eec..68738fd19f8 100644 --- a/addons/wardrobe/functions/fnc_addActions_icon.sqf +++ b/addons/wardrobe/functions/fnc_addActionsIcon.sqf @@ -11,7 +11,7 @@ * Path to Icon or "" * * Example: - * [_cfg] call ace_wardrobe_fnc_getAction_Icon + * [_cfg] call ace_wardrobe_fnc_getActionIcon * * Public: No */ diff --git a/addons/wardrobe/functions/fnc_addActions_name.sqf b/addons/wardrobe/functions/fnc_addActionsName.sqf similarity index 90% rename from addons/wardrobe/functions/fnc_addActions_name.sqf rename to addons/wardrobe/functions/fnc_addActionsName.sqf index 9383c885534..6cb88489ddb 100644 --- a/addons/wardrobe/functions/fnc_addActions_name.sqf +++ b/addons/wardrobe/functions/fnc_addActionsName.sqf @@ -11,7 +11,7 @@ * The return value * * Example: - * ['something', player] call ace_wardrobe_fnc_getAction_Name + * ['something', player] call ace_wardrobe_fnc_getActionName * * Public: No */ diff --git a/addons/wardrobe/functions/fnc_cache_get.sqf b/addons/wardrobe/functions/fnc_cacheGet.sqf similarity index 98% rename from addons/wardrobe/functions/fnc_cache_get.sqf rename to addons/wardrobe/functions/fnc_cacheGet.sqf index ba8d74ae5a4..5dba9c565d3 100644 --- a/addons/wardrobe/functions/fnc_cache_get.sqf +++ b/addons/wardrobe/functions/fnc_cacheGet.sqf @@ -13,7 +13,7 @@ * * * Example: - * ["tag_loadout", { getUnitLoadout player }] call ace_wardrobe_fnc_cache_get + * ["tag_loadout", { getUnitLoadout player }] call ace_wardrobe_fnc_cacheGet * * Public: Yes */ diff --git a/addons/wardrobe/functions/fnc_cache_set.sqf b/addons/wardrobe/functions/fnc_cacheSet.sqf similarity index 85% rename from addons/wardrobe/functions/fnc_cache_set.sqf rename to addons/wardrobe/functions/fnc_cacheSet.sqf index 7640c9d7e3e..f91c213959d 100644 --- a/addons/wardrobe/functions/fnc_cache_set.sqf +++ b/addons/wardrobe/functions/fnc_cacheSet.sqf @@ -12,7 +12,7 @@ * success * * Example: - * ['tag_myKey', ["some","data"]] call ace_wardrobe_fnc_cache_set + * ['tag_myKey', ["some","data"]] call ace_wardrobe_fnc_cacheSet * * Public: Yes */ diff --git a/addons/wardrobe/functions/fnc_canModifyTo.sqf b/addons/wardrobe/functions/fnc_canModifyTo.sqf index 8e7dfce0d88..92612f197d6 100644 --- a/addons/wardrobe/functions/fnc_canModifyTo.sqf +++ b/addons/wardrobe/functions/fnc_canModifyTo.sqf @@ -8,21 +8,21 @@ * 0: Unit * 1: Current Variant * 2: Desired Variant - * 3: Cache Result of fnc_getitems_all (default: true) + * 3: Cache Result of fnc_getitemsAll (default: true) * * Return Value: * The return value * * Example: - * [_unit, _cfg_origin, _cfg_target] call ace_wardrobe_fnc_canModifyTo + * [_unit, _cfgOrigin, _cfgTarget] call ace_wardrobe_fnc_canModifyTo * * Public: No */ -params ["_unit", "_cfg_origin", "_cfg_target", ["_cache", true, [true]]]; +params ["_unit", "_cfgOrigin", "_cfgTarget", ["_cache", true, [true]]]; -[_cfg_origin, _cfg_target] call FUNC(compare_components) params ["_missing", "_surplus"]; +[_cfgOrigin, _cfgTarget] call FUNC(compareComponents) params ["_missing", "_surplus"]; -private _currentItems = [_unit, _cache] call FUNC(getItems_all); +private _currentItems = [_unit, _cache] call FUNC(getItemsAll); count ( _missing select { ! (_x in _currentItems) } ) == 0 diff --git a/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf b/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf similarity index 67% rename from addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf rename to addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf index 79dabc92aa7..eefd25c9d2b 100644 --- a/addons/wardrobe/functions/fnc_clearOnClosed_InteractionMenu.sqf +++ b/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf @@ -11,14 +11,14 @@ * None * * Example: - * ["tag_myDataEntry"] call ace_wardrobe_fnc_clearOnClosed_InteractionMenu + * ["tag_myDataEntry"] call ace_wardrobe_fnc_clearOnClosedInteractionMenu * * Public: yes */ params [ ["_key", "", [""]] ]; -private _queue = missionNamespace getVariable [QGVAR(menu_clear_queue), "404"]; +private _queue = missionNamespace getVariable [QGVAR((menuClearQueue)), "404"]; if (_queue isEqualTo "404") then { _queue = []; @@ -27,13 +27,13 @@ if (_queue isEqualTo "404") then { { if (_this isNotEqualTo [1]) exitWith {}; - { GVAR(cache) deleteAt _x } forEach ( missionNamespace getVariable [QGVAR(menu_clear_queue), [] ] ); + { GVAR(cache) deleteAt _x } forEach ( missionNamespace getVariable [QGVAR((menuClearQueue)), [] ] ); - missionNamespace setVariable [QGVAR(menu_clear_queue), nil ]; + missionNamespace setVariable [QGVAR((menuClearQueue)), nil ]; [_thisType, _thisId] call CBA_fnc_removeEventHandler; } ] call CBA_fnc_addEventHandlerArgs; - missionNamespace setVariable [QGVAR(menu_clear_queue), _queue]; + missionNamespace setVariable [QGVAR((menuClearQueue)), _queue]; }; _queue pushBackUnique _key; diff --git a/addons/wardrobe/functions/fnc_compare_components.sqf b/addons/wardrobe/functions/fnc_compareComponents.sqf similarity index 79% rename from addons/wardrobe/functions/fnc_compare_components.sqf rename to addons/wardrobe/functions/fnc_compareComponents.sqf index 8d1df673b6a..51e0f03de27 100644 --- a/addons/wardrobe/functions/fnc_compare_components.sqf +++ b/addons/wardrobe/functions/fnc_compareComponents.sqf @@ -14,12 +14,12 @@ * - configs of surplus components * * Example: - * [_cfg_origin, _cfg_tgt] call ace_wardrobe_fnc_compare_components + * [_cfgOrigin, _cfgTarget] call ace_wardrobe_fnc_compareComponents * * Public: No */ -params ["_cfg_origin", "_cfg_tgt"]; +params ["_cfgOrigin", "_cfgTarget"]; private _checkfallbackComponent = { // Check if item is present within current modpack. @@ -33,8 +33,8 @@ private _checkfallbackComponent = { }; -private _current = getArray (configFile >> QUOTE(ADDON) >> configName _cfg_origin >> "components") apply _checkfallbackComponent select {_x isNotEqualTo ""}; -private _needed = getArray (configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "components") apply _checkfallbackComponent select {_x isNotEqualTo ""}; +private _current = getArray (configFile >> QUOTE(ADDON) >> configName _cfgOrigin >> "components") apply _checkfallbackComponent select {_x isNotEqualTo ""}; +private _needed = getArray (configFile >> QUOTE(ADDON) >> configName _cfgTarget >> "components") apply _checkfallbackComponent select {_x isNotEqualTo ""}; private _missing = []; diff --git a/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf b/addons/wardrobe/functions/fnc_compareContainerMaxLoad.sqf similarity index 63% rename from addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf rename to addons/wardrobe/functions/fnc_compareContainerMaxLoad.sqf index 08faea9589f..7ed19c7a625 100644 --- a/addons/wardrobe/functions/fnc_compare_container_maxLoad.sqf +++ b/addons/wardrobe/functions/fnc_compareContainerMaxLoad.sqf @@ -12,7 +12,7 @@ * None * * Example: - * [] call ace_wardrobe_fnc_compare_container_maxLoad + * [] call ace_wardrobe_fnc_compareContainerMaxLoad * * Public: no */ @@ -36,27 +36,27 @@ LOG_SYS("CompareMaxLoad",QUOTE(Comparing PREFIX COMPONENT containers maximumLoad LOG_SYS("CompareMaxLoad","========================================================================================================"); { - private _origin_cfg = _x; - private _origin_className = configName _origin_cfg; - private _origin_maxLoad = getNumber (configFile >> "CfgVehicles" >> getText (_origin_cfg >> "ItemInfo" >> "containerClass") >> "maximumLoad"); + private _cfgOrigin = _x; + private _originClassName = configName _cfgOrigin; + private _originMaxLoad = getNumber (configFile >> "CfgVehicles" >> getText (_cfgOrigin >> "ItemInfo" >> "containerClass") >> "maximumLoad"); - if (_origin_className in _established) then { continue }; - _established pushBack _origin_className; + if (_originClassName in _established) then { continue }; + _established pushBack _originClassName; - private _targets = [_origin_cfg] call FUNC(getItems_modifiableTo); + private _targets = [_cfgOrigin] call FUNC(getItemsModifiableTo); { - private _target_cfg = _x; - private _target_className = configName _target_cfg; - private _target_maxLoad = getNumber (configFile >> "CfgVehicles" >> getText (_target_cfg >> "ItemInfo" >> "containerClass") >> "maximumLoad"); + private _targetCfg = _x; + private _targetClassName = configName _targetCfg; + private _targetMaxLoad = getNumber (configFile >> "CfgVehicles" >> getText (_targetCfg >> "ItemInfo" >> "containerClass") >> "maximumLoad"); - if (_target_className in _established) then { continue }; - _established pushBack _target_className; + if (_targetClassName in _established) then { continue }; + _established pushBack _targetClassName; - private _mismatch = _target_maxLoad isNotEqualTo _origin_maxLoad; - private _string = format ["%6 - [%5] [%2|%4] %1 vs %3", _origin_className,_origin_maxLoad,_target_className,_target_maxLoad,["Nominal", "Mismatch Detected!"] select _mismatch, _index]; + private _mismatch = _targetMaxLoad isNotEqualTo _originMaxLoad; + private _string = format ["%6 - [%5] [%2|%4] %1 vs %3", _originClassName,_originMaxLoad,_targetClassName,_targetMaxLoad,["Nominal", "Mismatch Detected!"] select _mismatch, _index]; - if (_mismatch) then { _mismatches pushBack [_origin_className,_origin_maxLoad,_target_className,_target_maxLoad]; }; + if (_mismatch) then { _mismatches pushBack [_originClassName,_originMaxLoad,_targetClassName,_targetMaxLoad]; }; LOG_SYS("CompareMaxLoad",_string); ADD(_index,1); diff --git a/addons/wardrobe/functions/fnc_enable_contextMenu.sqf b/addons/wardrobe/functions/fnc_enableContextMenu.sqf similarity index 79% rename from addons/wardrobe/functions/fnc_enable_contextMenu.sqf rename to addons/wardrobe/functions/fnc_enableContextMenu.sqf index 8af1a696bb0..1fe49312e51 100644 --- a/addons/wardrobe/functions/fnc_enable_contextMenu.sqf +++ b/addons/wardrobe/functions/fnc_enableContextMenu.sqf @@ -11,7 +11,7 @@ * None * * Example: - * [true] call ace_wardrobe_fnc_enable_contextMenu + * [true] call ace_wardrobe_fnc_enableContextMenu * * Public: No */ @@ -19,8 +19,8 @@ params [["_enable", true, [true]]]; -if (_enable && {!(missionNamespace getVariable [QGVAR(contextmenu_enabled), false])}) then { - missionNamespace setVariable [QGVAR(contextmenu_enabled), true]; +if (_enable && {!(missionNamespace getVariable [QGVAR(contextmenuEnabled), false])}) then { + missionNamespace setVariable [QGVAR(contextmenuEnabled), true]; [ "#ALL", @@ -32,7 +32,7 @@ if (_enable && {!(missionNamespace getVariable [QGVAR(contextmenu_enabled), fals { isNil QGVAR(api_disable) }, { isNil QGVAR(api_disable) } ], - FUNC(nextVariant_do), + FUNC(nextVariantDo), false, [] ] call CBA_fnc_addItemContextMenuOption; diff --git a/addons/wardrobe/functions/fnc_getItems_all.sqf b/addons/wardrobe/functions/fnc_getItemsAll.sqf similarity index 74% rename from addons/wardrobe/functions/fnc_getItems_all.sqf rename to addons/wardrobe/functions/fnc_getItemsAll.sqf index 29e6165e957..b6fccd5b9c9 100644 --- a/addons/wardrobe/functions/fnc_getItems_all.sqf +++ b/addons/wardrobe/functions/fnc_getItemsAll.sqf @@ -12,7 +12,7 @@ * All Items of the Unit * * Example: - * [player, false] call ace_wardrobe_fnc_getItems_all + * [player, false] call ace_wardrobe_fnc_getItemsAll * * Public: No */ @@ -26,8 +26,8 @@ params [ private _code = { flatten getUnitLoadout _unit select { _x isEqualType "" && { _x != ""}}; }; private _caching = { - ["items_all"] call FUNC(clearOnClosed_InteractionMenu); - ["items_all", _code] call FUNC(cache_get); // returns the result + ["items_all"] call FUNC(clearOnClosedInteractionMenu); + ["items_all", _code] call FUNC(cacheGet); // returns the result }; if (_cache) then _caching else _code; diff --git a/addons/wardrobe/functions/fnc_getItems_modifiable_all.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf similarity index 61% rename from addons/wardrobe/functions/fnc_getItems_modifiable_all.sqf rename to addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf index 021d56bd76d..a0991cba1c8 100644 --- a/addons/wardrobe/functions/fnc_getItems_modifiable_all.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf @@ -12,7 +12,7 @@ * modifiable Items of the Unit * * Example: - * [player, false] call ace_wardrobe_fnc_getItems_modifiable_all + * [player, false] call ace_wardrobe_fnc_getItemsModifiableAll * * Public: Yes */ @@ -25,21 +25,21 @@ params [ private _code = { - [_unit] call FUNC(getItems_all) + [_unit] call FUNC(getItemsAll) apply { [_x] call CBA_fnc_getItemConfig } select { [_x] call FUNC(isModifiable) } apply - { [_x, [_x] call FUNC(getItems_modifiableTo) ] } + { [_x, [_x] call FUNC(getItemsModifiableTo) ] } select { count (_x#1) > 0 } apply { - private _origin_cfg = _x#0; + private _cfgOrigin = _x#0; [ - _origin_cfg, - _x#1 select { [_unit, _origin_cfg, _x] call FUNC(canModifyTo) } + _cfgOrigin, + _x#1 select { [_unit, _cfgOrigin, _x] call FUNC(canModifyTo) } ] } select @@ -47,8 +47,8 @@ private _code = { }; private _caching = { - ["items_modifiable_all"] call FUNC(clearOnClosed_InteractionMenu); - ["items_modifiable_all", _code] call FUNC(cache_get); // returns the result + ["items_modifiable_all"] call FUNC(clearOnClosedInteractionMenu); + ["items_modifiable_all", _code] call FUNC(cacheGet); // returns the result }; if (_cache) then _caching else _code; diff --git a/addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf similarity index 62% rename from addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf rename to addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf index 4c4ab2d3755..c06913abcfa 100644 --- a/addons/wardrobe/functions/fnc_getItems_modifiable_current.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf @@ -12,7 +12,7 @@ * modifiable Items of the Unit * * Example: - * [player, false] call ace_wardrobe_fnc_getItems_modifiable_current + * [player, false] call ace_wardrobe_fnc_getItemsModifiableCurrent * * Public: Yes */ @@ -31,15 +31,15 @@ private _code = { select { [_x] call FUNC(isModifiable) } apply - { [_x, [_x] call FUNC(getItems_modifiableTo) ] } // will return an array, even if the target variants are not available. + { [_x, [_x] call FUNC(getItemsModifiableTo) ] } // will return an array, even if the target variants are not available. select { count (_x#1) > 0 } apply { - private _origin_cfg = _x#0; + private _cfgOrigin = _x#0; [ - _origin_cfg, - _x#1 select { [_unit, _origin_cfg, _x] call FUNC(canModifyTo) } + _cfgOrigin, + _x#1 select { [_unit, _cfgOrigin, _x] call FUNC(canModifyTo) } ] } select @@ -48,8 +48,8 @@ private _code = { private _caching = { - ["items_modifiable_current"] call FUNC(clearOnClosed_InteractionMenu); - ["items_modifiable_current", _code] call FUNC(cache_get); // returns the result + ["items_modifiable_current"] call FUNC(clearOnClosedInteractionMenu); + ["items_modifiable_current", _code] call FUNC(cacheGet); // returns the result }; if (_cache) then _caching else _code; diff --git a/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf b/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf index 5729641a040..160591a4a7c 100644 --- a/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf +++ b/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf @@ -11,16 +11,16 @@ * Array of all possible variants as config * * Example: - * [_cfg_current] call ace_wardrobe_fnc_getItems_modifiableTo + * [_cfgCurrent] call ace_wardrobe_fnc_getItemsModifiableTo * * Public: No */ -params ["_cfg_current"]; +params ["_cfgCurrent"]; /* OLD -[_cfg_current >> QUOTE(ADDON) >> "modifiableTo"] call BIS_fnc_getCfgDataArray apply { [_x] call CBA_fnc_getItemConfig } select { !isNull _x } +[_cfgCurrent >> QUOTE(ADDON) >> "modifiableTo"] call BIS_fnc_getCfgDataArray apply { [_x] call CBA_fnc_getItemConfig } select { !isNull _x } */ -"true" configClasses (configFile >> QUOTE(ADDON) >> configName _cfg_current >> "modifiableTo") apply { [configName _x] call CBA_fnc_getItemConfig } select { !isNull _x } +"true" configClasses (configFile >> QUOTE(ADDON) >> configName _cfgCurrent >> "modifiableTo") apply { [configName _x] call CBA_fnc_getItemConfig } select { !isNull _x } diff --git a/addons/wardrobe/functions/fnc_nextVariant_do.sqf b/addons/wardrobe/functions/fnc_nextVariantDo.sqf similarity index 61% rename from addons/wardrobe/functions/fnc_nextVariant_do.sqf rename to addons/wardrobe/functions/fnc_nextVariantDo.sqf index c2990007323..937fea9ac01 100644 --- a/addons/wardrobe/functions/fnc_nextVariant_do.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantDo.sqf @@ -15,31 +15,31 @@ * nothing * * Example: - * [_unit, _container, _item, _slot, _params] call ace_wardrobe_fnc_nextVariant_do; + * [_unit, _container, _item, _slot, _params] call ace_wardrobe_fnc_nextVariantDo; * * Public: No */ params ["_unit", "_container", "_item", "_slot", "_params"]; -private _current_cfg = _item call CBA_fnc_getItemConfig; +private _cfgCurrent = _item call CBA_fnc_getItemConfig; -private _cfg_tgt = [ _current_cfg ] call FUNC(nextVariant_get); +private _cfgTarget = [ _cfgCurrent ] call FUNC(nextVariantGet); -if (_cfg_tgt isEqualTo false) exitWith {}; +if (_cfgTarget isEqualTo false) exitWith {}; -private _canModifyTo = [_unit, _current_cfg, _cfg_tgt, false] call FUNC(canModifyTo); +private _canModifyTo = [_unit, _cfgCurrent, _cfgTarget, false] call FUNC(canModifyTo); if !(_canModifyTo) exitWith { [ [ LLSTRING(missingComponents), - getText (_cfg_tgt >> "displayName") + getText (_cfgTarget >> "displayName") ], 2.5 ] call EFUNC(common,displayTextStructured); }; -[_unit, _unit, [_current_cfg, _cfg_tgt], true] call FUNC(replace); +[_unit, _unit, [_cfgCurrent, _cfgTarget], true] call FUNC(replace); nil diff --git a/addons/wardrobe/functions/fnc_nextVariantGet.sqf b/addons/wardrobe/functions/fnc_nextVariantGet.sqf new file mode 100644 index 00000000000..69079d1b5ea --- /dev/null +++ b/addons/wardrobe/functions/fnc_nextVariantGet.sqf @@ -0,0 +1,61 @@ +#include "../script_component.hpp" + +/* + * Author: OverlordZorn + * Context Menu - Return config the "next" variant - if multiple Variants are defined, it will choose randomly. + * Maintains a History of the current and chosen variants as long as the Inventory is open. + * Already used variants from the History will be removed from the availabe options. + * Once all options have been exhausted, the history will be purged and start over. + * + * Arguments: + * 0: Current Variant + * + * Return Value: + * Desired Variant + * + * Example: + * [_cfgCurrent] call ace_wardrobe_fnc_nextVariantGet + * + * Public: No + */ + + +params ["_cfgCurrent"]; + +private _cfgModifiableTo = [_cfgCurrent, false] call FUNC(getItemsModifiableTo); + +if (_cfgModifiableTo isEqualTo []) exitWith {false}; + +private _cfgHistory = missionNamespace getVariable [QGVAR(variantHistory), ""]; + +if (_cfgHistory isEqualTo "") then { + + _cfgHistory = []; + _cfgHistory pushBackUnique _cfgCurrent; + + missionNamespace setVariable [QGVAR(variantHistory), _cfgHistory]; + + ACE_player addEventHandler ["InventoryClosed", { + missionNamespace setVariable [QGVAR(variantHistory), nil ]; + player removeEventHandler [_thisEvent, _thisEventhandler]; + }]; +}; + + +private _remaining = _cfgModifiableTo - _cfgHistory; + +_remaining = _remaining select { [ace_player, _cfgCurrent, _x] call FUNC(canModifyTo) }; + +// Returns ether a random remaining item or alternatively, a random one from the complete array. +private _return = if (_remaining isNotEqualTo []) then { + selectRandom _remaining +} else { + // _cfgHistory select { !(_x in _cfgModifiableTo) }; + _cfgHistory = []; + missionNamespace setVariable [QGVAR(variantHistory), [] ]; + _cfgHistory pushBackUnique _cfgCurrent; + selectRandom _cfgModifiableTo; +}; + +_cfgHistory pushBackUnique _return; +_return diff --git a/addons/wardrobe/functions/fnc_nextVariant_get.sqf b/addons/wardrobe/functions/fnc_nextVariant_get.sqf deleted file mode 100644 index 772dc2c51ac..00000000000 --- a/addons/wardrobe/functions/fnc_nextVariant_get.sqf +++ /dev/null @@ -1,61 +0,0 @@ -#include "../script_component.hpp" - -/* - * Author: OverlordZorn - * Context Menu - Return config the "next" variant - if multiple Variants are defined, it will choose randomly. - * Maintains a History of the current and chosen variants as long as the Inventory is open. - * Already used variants from the History will be removed from the availabe options. - * Once all options have been exhausted, the history will be purged and start over. - * - * Arguments: - * 0: Current Variant - * - * Return Value: - * Desired Variant - * - * Example: - * [_cfg_current] call ace_wardrobe_fnc_nextVariant_get - * - * Public: No - */ - - -params ["_cfg_current"]; - -private _modifiableTo_cfg = [_cfg_current, false] call FUNC(getItems_modifiableTo); - -if (_modifiableTo_cfg isEqualTo []) exitWith {false}; - -private _history_cfg = missionNamespace getVariable [QGVAR(variant_history_cfg), "404"]; - -if (_history_cfg isEqualTo "404") then { - - _history_cfg = []; - _history_cfg pushBackUnique _cfg_current; - - missionNamespace setVariable [QGVAR(variant_history_cfg), _history_cfg]; - - ACE_player addEventHandler ["InventoryClosed", { - missionNamespace setVariable [QGVAR(variant_history_cfg), nil ]; - player removeEventHandler [_thisEvent, _thisEventhandler]; - }]; -}; - - -private _remaining = _modifiableTo_cfg - _history_cfg; - -_remaining = _remaining select { [ace_player, _cfg_current, _x] call FUNC(canModifyTo) }; - -// Returns ether a random remaining item or alternatively, a random one from the complete array. -private _return = if (_remaining isNotEqualTo []) then { - selectRandom _remaining -} else { - // _history_cfg select { !(_x in _modifiableTo_cfg) }; - _history_cfg = []; - missionNamespace setVariable [QGVAR(variant_history_cfg), [] ]; - _history_cfg pushBackUnique _cfg_current; - selectRandom _modifiableTo_cfg; -}; - -_history_cfg pushBackUnique _return; -_return diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index c0431acb706..b2950311b86 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -22,37 +22,37 @@ */ params ["_target", "_unit", "_actionParams", ["_replaceNow", false, [true]]]; -_actionParams params ["_cfg_origin", "_cfg_tgt"]; +_actionParams params ["_cfgOrigin", "_cfgTarget"]; // Duration of the "animation" -private _duration = getNumber (configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "duration"); +private _duration = getNumber (configFile >> QUOTE(ADDON) >> configName _cfgTarget >> "duration"); if (_replaceNow) then { _duration = 0; }; // needed for cba context menu - avoid potential duplications and such // Replace the Main Item. private _additionalParams = ""; -private _typeNumber = getNumber (_cfg_origin >> "ItemInfo" >> "type"); +private _typeNumber = getNumber (_cfgOrigin >> "ItemInfo" >> "type"); private _replaceCode = switch ( _typeNumber ) do { - case TYPE_HEADGEAR: { _additionalParams = "HEADGEAR"; FUNC(replace_other) }; - case TYPE_UNIFORM: { _additionalParams = "UNIFORM"; FUNC(replace_container) }; - case TYPE_VEST: { _additionalParams = "VEST"; FUNC(replace_container) }; - case TYPE_BACKPACK: { _additionalParams = "BACKPACK"; FUNC(replace_container) }; + case TYPE_HEADGEAR: { _additionalParams = "HEADGEAR"; FUNC(replaceOther) }; + case TYPE_UNIFORM: { _additionalParams = "UNIFORM"; FUNC(replaceContainer) }; + case TYPE_VEST: { _additionalParams = "VEST"; FUNC(replaceContainer) }; + case TYPE_BACKPACK: { _additionalParams = "BACKPACK"; FUNC(replaceContainer) }; default { // CfgGlasses items do not have a ItemInfo Subclass and therefore, not TypeNumber. switch (true) do { - case (isClass (configFile >> "CfgGlasses" >> configName _cfg_origin)): { _additionalParams = "FACEWEAR"; FUNC(replace_other) }; + case (isClass (configFile >> "CfgGlasses" >> configName _cfgOrigin)): { _additionalParams = "FACEWEAR"; FUNC(replaceOther) }; default { false }; }; }; }; -if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 - %2",_typeNumber,configName _cfg_origin); }; -[ _replaceCode, [_unit, _cfg_origin, _cfg_tgt, _additionalParams ], _duration] call CBA_fnc_waitAndExecute; +if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 - %2",_typeNumber,configName _cfgOrigin); }; +[ _replaceCode, [_unit, _cfgOrigin, _cfgTarget, _additionalParams ], _duration] call CBA_fnc_waitAndExecute; //// Handle Components // Add Surplus -[_cfg_origin, _cfg_tgt] call FUNC(compare_components) params ["_missing", "_surplus"]; +[_cfgOrigin, _cfgTarget] call FUNC(compareComponents) params ["_missing", "_surplus"]; { - if (configName _cfg_tgt isNotEqualTo _x) then { + if (configName _cfgTarget isNotEqualTo _x) then { if ( isClass (configFile >> "CfgGlasses" >> _x) && { goggles _unit isEqualTo "" } ) then { _unit addGoggles _x; } else { @@ -63,7 +63,7 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 // Remove Missing { - if (configName _cfg_origin isNotEqualTo _x) then { + if (configName _cfgOrigin isNotEqualTo _x) then { switch (true) do { case (goggles _unit isEqualTo _x): { removeGoggles _unit; }; @@ -75,21 +75,21 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 //// Handle Effects // Animation/Gestures -[ _unit, getText (configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "gesture") ] call EFUNC(common,doGesture); +[ _unit, getText (configFile >> QUOTE(ADDON) >> configName _cfgTarget >> "gesture") ] call EFUNC(common,doGesture); // Plays Random Sound At the Beginning -private _sound = [configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "sound"] call cba_fnc_getCfgDataRandom; +private _sound = [configFile >> QUOTE(ADDON) >> configName _cfgTarget >> "sound"] call cba_fnc_getCfgDataRandom; if (_sound isNotEqualTo "") then { [ CBA_fnc_globalSay3D, [_unit, _sound, nil, true, true], - (getNumber (configFile >> QUOTE(ADDON) >> configName _cfg_tgt >> "sound_timing") max 0 min 1) * _duration + (getNumber (configFile >> QUOTE(ADDON) >> configName _cfgTarget >> "sound_timing") max 0 min 1) * _duration ] call CBA_fnc_waitAndExecute; }; // Notification -private _notify_img = getText (_cfg_tgt >> "picture"); -if !(".paa" in _notify_img) then { _notify_img = [_notify_img,"paa"] joinString "." }; // Some vanilla items dont have the .paa and cba notify will display the path as a string without the .paa -[ ace_common_fnc_displayTextStructured, [["
%2",_notify_img, getText (_cfg_tgt >> "displayName")], 4], _duration * 1.2 ] call CBA_fnc_waitAndExecute; +private _imgNotify = getText (_cfgTarget >> "picture"); +if !(".paa" in _imgNotify) then { _imgNotify = [_imgNotify,"paa"] joinString "." }; // Some vanilla items dont have the .paa and cba notify will display the path as a string without the .paa +[ ace_common_fnc_displayTextStructured, [["
%2",_imgNotify, getText (_cfgTarget >> "displayName")], 4], _duration * 1.2 ] call CBA_fnc_waitAndExecute; nil diff --git a/addons/wardrobe/functions/fnc_replace_container.sqf b/addons/wardrobe/functions/fnc_replaceContainer.sqf similarity index 71% rename from addons/wardrobe/functions/fnc_replace_container.sqf rename to addons/wardrobe/functions/fnc_replaceContainer.sqf index baffd697ec0..bb2bce6d4e8 100644 --- a/addons/wardrobe/functions/fnc_replace_container.sqf +++ b/addons/wardrobe/functions/fnc_replaceContainer.sqf @@ -14,12 +14,12 @@ * None * * Example: - * [_player, _cfg_origin, _cfg_tgt, _case] call ace_wardrobe_fnc_replace_uniform + * [_player, _cfgOrigin, _cfgTarget, _case] call ace_wardrobe_fnc_replaceContainer * * Public: No */ -params ["_player", "_cfg_origin", "_cfg_tgt", "_case"]; +params ["_player", "_cfgOrigin", "_cfgTarget", "_case"]; toFixed 0; private _magazineDetails = (magazinesAmmoFull _player) apply { [_x#0, _x#-2, _x#-1] }; @@ -40,9 +40,9 @@ if (_hasSpareBarrel) then { _hasSpareBarrel = [_player, "ACE_SpareBarrel" ] call //// Replace Wearable // Change Wearable switch (_case) do { - case "UNIFORM": { _loadout # 0 # 3 set [0, configName _cfg_tgt]; }; - case "VEST": { _loadout # 0 # 4 set [0, configName _cfg_tgt]; }; - case "BACKPACK": { _loadout # 0 # 5 set [0, configName _cfg_tgt]; }; + case "UNIFORM": { _loadout # 0 # 3 set [0, configName _cfgTarget]; }; + case "VEST": { _loadout # 0 # 4 set [0, configName _cfgTarget]; }; + case "BACKPACK": { _loadout # 0 # 5 set [0, configName _cfgTarget]; }; default { ERROR_1("Case undefined: %1",_case); }; }; @@ -58,6 +58,6 @@ INTEL_POST(_hasPhoto,acex_intelitems_photo); // ACE Overheating if (_hasSpareBarrel isEqualType [] ) then { - private _SpareBarrel_new_MagIDs = [_player, "ACE_SpareBarrel"] call CBA_fnc_getMagazineIndex; - [QGVAR(EH_updateMagIDs), [_hasSpareBarrel, _SpareBarrel_new_MagIDs]] call CBA_fnc_serverEvent; + private _newMagIDsSpareBarrel = [_player, "ACE_SpareBarrel"] call CBA_fnc_getMagazineIndex; + [QGVAR(EH_updateMagIDs), [_hasSpareBarrel, _newMagIDsSpareBarrel]] call CBA_fnc_serverEvent; }; diff --git a/addons/wardrobe/functions/fnc_replace_other.sqf b/addons/wardrobe/functions/fnc_replaceOther.sqf similarity index 64% rename from addons/wardrobe/functions/fnc_replace_other.sqf rename to addons/wardrobe/functions/fnc_replaceOther.sqf index 92797622476..cc34f4bb5b2 100644 --- a/addons/wardrobe/functions/fnc_replace_other.sqf +++ b/addons/wardrobe/functions/fnc_replaceOther.sqf @@ -13,20 +13,20 @@ * None * * Example: - * [_player, _cfg_origin, _cfg_tgt] call ace_wardrobe_fnc_replace_facewear + * [_player, _cfgOrigin, _cfgTarget] call ace_wardrobe_fnc_replaceOther * * Public: No */ -params ["_player", "_cfg_origin", "_cfg_tgt", "_additionalParams"]; +params ["_player", "_cfgOrigin", "_cfgTarget", "_additionalParams"]; switch (_additionalParams) do { case "HEADGEAR": { removeHeadgear _player; - _player addHeadgear configName _cfg_tgt; + _player addHeadgear configName _cfgTarget; }; case "FACEWEAR": { removeGoggles _player; - _player addGoggles configName _cfg_tgt; + _player addGoggles configName _cfgTarget; }; }; diff --git a/addons/wardrobe/functions/fnc_spareBarrel_updateMagIDs.sqf b/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf similarity index 58% rename from addons/wardrobe/functions/fnc_spareBarrel_updateMagIDs.sqf rename to addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf index 23b05e85117..8ce63755653 100644 --- a/addons/wardrobe/functions/fnc_spareBarrel_updateMagIDs.sqf +++ b/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf @@ -12,22 +12,22 @@ * The return value * * Example: - * [_old, _new] call ace_wardrobe_fnc_spareBarrel_updateMagIDs + * [_old, _new] call ace_wardrobe_fnc_spareBarrelUpdateMagIDs * * Public: No */ if (!isServer) exitWith {}; -params ["_old_magIDs", "_new_magIDs"]; +params ["_oldMagIDs", "_newMagIDs"]; -if (count _old_magIDs != count _new_magIDs) exitWith { ERROR_2("Not Equal Number of magID's provided: %1 - %2",_old_magIDs,_new_magIDs); }; +if (count _oldMagIDs != count _newMagIDs) exitWith { ERROR_2("Not Equal Number of magID's provided: %1 - %2",_oldMagIDs,_newMagIDs); }; private _map = EGVAR(overheating,storedSpareBarrels); { private _oldID = _x; if !(_oldID in _map) then { continue }; - _map set [ _new_magIDs # _forEachIndex , _map deleteAt _oldID ]; + _map set [ _newMagIDs # _forEachIndex , _map deleteAt _oldID ]; -} forEach _old_magIDs; \ No newline at end of file +} forEach _oldMagIDs; \ No newline at end of file diff --git a/addons/wardrobe/initSettings.inc.sqf b/addons/wardrobe/initSettings.inc.sqf index 0468ab8b88b..f6d67398630 100644 --- a/addons/wardrobe/initSettings.inc.sqf +++ b/addons/wardrobe/initSettings.inc.sqf @@ -1,5 +1,5 @@ [ - QGVAR(set_enable_action), + QGVAR(set_enableAction), "CHECKBOX", LSTRING(enable_action), [LSTRING(set_cat_main)], @@ -10,12 +10,12 @@ ] call CBA_fnc_addSetting; [ - QGVAR(set_enable_contextMenu), + QGVAR(set_enableContextMenu), "CHECKBOX", LSTRING(enable_contextMenu), [LSTRING(set_cat_main)], true, 1, - FUNC(enable_contextMenu), + FUNC(enableContextMenu), true ] call CBA_fnc_addSetting; From 8f13b84505449bf08353583db7de07efeaec62d4 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 13 May 2025 12:59:41 +0200 Subject: [PATCH 217/305] "404" -> nil --- addons/wardrobe/functions/fnc_cacheGet.sqf | 12 ++++++------ addons/wardrobe/functions/fnc_cacheSet.sqf | 4 ++-- .../functions/fnc_clearOnClosedInteractionMenu.sqf | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/addons/wardrobe/functions/fnc_cacheGet.sqf b/addons/wardrobe/functions/fnc_cacheGet.sqf index 5dba9c565d3..3c12ba5baa9 100644 --- a/addons/wardrobe/functions/fnc_cacheGet.sqf +++ b/addons/wardrobe/functions/fnc_cacheGet.sqf @@ -2,14 +2,14 @@ /* * Author: OverlordZorn - * To retrieve a value from the database. returns "404" if not stored or, when provided, will execute the alternative code and return and store said result + * To retrieve a value from the database. returns nil if not stored or, when provided, will execute the alternative code and return and store said result * * Arguments: * 0: Key * 1: Code to run when there is no value stored (optional) * * Return Value: - * Return or "404" if no entry found and no code provided + * Return or nil if no entry found and no code provided * * * Example: @@ -19,10 +19,10 @@ */ -params [ [ "_key", "", [""] ], [ "_else", "404", [{}] ] ]; +params [ [ "_key", "", [""] ], [ "_else", nil, [{}] ] ]; -if (_else isEqualTo "404") then { - GVAR(cache) getOrDefault [_key, "404"]; +if (isNil "_else") then { + GVAR(cache) getOrDefault [_key, nil]; } else { GVAR(cache) getOrDefaultCall [_key, _else, true]; -}; \ No newline at end of file +}; diff --git a/addons/wardrobe/functions/fnc_cacheSet.sqf b/addons/wardrobe/functions/fnc_cacheSet.sqf index f91c213959d..8a40757afd0 100644 --- a/addons/wardrobe/functions/fnc_cacheSet.sqf +++ b/addons/wardrobe/functions/fnc_cacheSet.sqf @@ -19,9 +19,9 @@ -params [ ["_key", "", [""] ], ["_value", "404"] ]; +params [ ["_key", "", [""] ], ["_value", nil] ]; -if (_value isEqualTo "404") exitWith { false }; +if (isNil "_value") exitWith { false }; GVAR(cache) set [_key, _value]; diff --git a/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf b/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf index eefd25c9d2b..8307229180a 100644 --- a/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf +++ b/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf @@ -18,9 +18,9 @@ params [ ["_key", "", [""]] ]; -private _queue = missionNamespace getVariable [QGVAR((menuClearQueue)), "404"]; +private _queue = missionNamespace getVariable [QGVAR((menuClearQueue)), ""]; -if (_queue isEqualTo "404") then { +if (_queue isEqualTo "") then { _queue = []; [ "ace_interactMenuClosed", From a66f0735c246e8902a327a19a25c694b4051c86a Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 13 May 2025 13:27:42 +0200 Subject: [PATCH 218/305] BaseClasses_Import -> IMPORT_BASE_CLASSES; --- .../compat_gm_wardrobe/CfgWardrobe.hpp | 2 +- .../compat_rf_wardrobe/CfgWardrobe.hpp | 2 +- .../compat_sog_wardrobe/CfgWardrobe.hpp | 2 +- .../compat_ws_wardrobe/CfgWardrobe.hpp | 2 +- addons/wardrobe/BaseClasses_Import.hpp | 19 ------------------- addons/wardrobe/script_macros_wardrobe.hpp | 17 +++++++++++++++++ docs/wiki/framework/wardrobe-framework.md | 14 +++++++------- 7 files changed, 28 insertions(+), 30 deletions(-) delete mode 100644 addons/wardrobe/BaseClasses_Import.hpp diff --git a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp index 01dcd739294..e4c7f2f9d38 100644 --- a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe.hpp @@ -1,5 +1,5 @@ class ace_wardrobe { - #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" + IMPORT_BASE_CLASSES; #include "CfgWardrobe_Helmets.hpp" #include "CfgWardrobe_Uniform.hpp" diff --git a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp index 5ed6ef222c5..41cda7e1824 100644 --- a/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_rf/compat_rf_wardrobe/CfgWardrobe.hpp @@ -1,5 +1,5 @@ class ace_wardrobe { - #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" + IMPORT_BASE_CLASSES; #include "CfgWardrobe_Helmets.hpp" #include "CfgWardrobe_Uniforms.hpp" diff --git a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp index 414d89d3b0e..8fc4c6a18e0 100644 --- a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe.hpp @@ -1,5 +1,5 @@ class ace_wardrobe { - #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" + IMPORT_BASE_CLASSES; #include "CfgWardrobe_Booniehats.hpp" #include "CfgWardrobe_Facewear.hpp" diff --git a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp index 07947b4ad01..88b4b573539 100644 --- a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe.hpp @@ -1,5 +1,5 @@ class ace_wardrobe { - #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" + IMPORT_BASE_CLASSES; #include "CfgWardrobe_Turbans.hpp" #include "CfgWardrobe_Headgear.hpp" diff --git a/addons/wardrobe/BaseClasses_Import.hpp b/addons/wardrobe/BaseClasses_Import.hpp deleted file mode 100644 index aeae84bdeff..00000000000 --- a/addons/wardrobe/BaseClasses_Import.hpp +++ /dev/null @@ -1,19 +0,0 @@ -class EGVAR(wardrobe,base); - -class EGVAR(wardrobe,base_H_visor_up); -class EGVAR(wardrobe,base_H_visor_down); - -class EGVAR(wardrobe,base_H_goggles_on); -class EGVAR(wardrobe,base_H_goggles_off); - -class EGVAR(wardrobe,base_H_mask_on); -class EGVAR(wardrobe,base_H_mask_off); - -class EGVAR(wardrobe,base_U_sleeves_up); -class EGVAR(wardrobe,base_U_sleeves_down); - -class EGVAR(wardrobe,base_U_gloves_on); -class EGVAR(wardrobe,base_U_gloves_off); - -class EGVAR(wardrobe,base_U_jacket_open); -class EGVAR(wardrobe,base_U_jacket_closed); diff --git a/addons/wardrobe/script_macros_wardrobe.hpp b/addons/wardrobe/script_macros_wardrobe.hpp index d5c5f8d646f..beeaa5443d2 100644 --- a/addons/wardrobe/script_macros_wardrobe.hpp +++ b/addons/wardrobe/script_macros_wardrobe.hpp @@ -1,3 +1,20 @@ +// IMPORT BASE CLASSES +#define IMPORT_BASE_CLASSES\ +class EGVAR(wardrobe,base);\ +class EGVAR(wardrobe,base_H_visor_up);\ +class EGVAR(wardrobe,base_H_visor_down);\ +class EGVAR(wardrobe,base_H_goggles_on);\ +class EGVAR(wardrobe,base_H_goggles_off);\ +class EGVAR(wardrobe,base_H_mask_on);\ +class EGVAR(wardrobe,base_H_mask_off);\ +class EGVAR(wardrobe,base_U_sleeves_up);\ +class EGVAR(wardrobe,base_U_sleeves_down);\ +class EGVAR(wardrobe,base_U_gloves_on);\ +class EGVAR(wardrobe,base_U_gloves_off);\ +class EGVAR(wardrobe,base_U_jacket_open);\ +class EGVAR(wardrobe,base_U_jacket_closed) + + // REPLACE #define INTEL_PRE(varName,className)\ private varName = _magazineDetails findIf { _x select 0 == QUOTE(className) } > -1;\ diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index a9256855785..c92df99eb29 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -168,12 +168,12 @@ class ace_wardrobe_base_H_goggles_off: ace_wardrobe_base { To streamline the configuration of compatible items a set of macro's can be found here `addons\wardrobe\script_macros_wardrobe.hpp` ### 3.2 BaseClasses -All pre-configured base classes can be imported by simply including the following file `"\z\ace\addons\wardrobe\BaseClasses_Import.hpp"` +All pre-configured base classes can be imported by simply using the `IMPORT_BASE_CLASSES;` macro. ### 3.3 Example ```cpp -#include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp +#include "\z\ace\addons\wardrobe\script_macros_wardrobe.hpp" class ace_wardrobe { - #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" + IMPORT_BASE_CLASSES; // Begin to define your configs ... }; @@ -182,7 +182,7 @@ class ace_wardrobe { ### 4.1 Simple Example - Uniform Sleeves - No requirement for Components ```cpp class ace_wardrobe { - #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" + IMPORT_BASE_CLASSES; class U_B_CTRG_1: ace_wardrobe_base_U_sleeves_down { components[] = {}; @@ -203,7 +203,7 @@ class ace_wardrobe { ### 4.2 Advanced Example - Balaclava with Combat Glasses - Partial use of Components ```cpp class ace_wardrobe { - #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" + IMPORT_BASE_CLASSES; class G_Balaclava: ace_wardrobe_base { class modifiableTo { @@ -227,7 +227,7 @@ class ace_wardrobe { ### 4.3 Complex Example - Bandana with Aviators - Complex use of Multiple Components ```cpp class ace_wardrobe { - #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" + IMPORT_BASE_CLASSES; class G_Bandanna_blk: ace_wardrobe_base { class modifiableTo { @@ -281,7 +281,7 @@ There *might* be some changes coming from Bi regarding how arma handles the `set ## 6.2 Container Size - Uniform, Vest, Backpack When the player changes from one container item to another through the wardrobe action and the container's `maximumLoad` is smaller then previously, the player risks the loss of items carried inside said container. -Therefore, the function `[] call ace_wardrobe_fnc_compare_container_maxLoad` can be used to compare the item's `maximumLoad`. The result will be dumped into the .rpt. +Therefore, the function `[] call ace_wardrobe_fnc_compareContainerMaxLoad` can be used to compare the item's `maximumLoad`. The result will be dumped into the .rpt. ## 7. API Missionmakers can choose to force disable the the wardrobe system individually or globally by defining the global variable `ace_wardrobe_api_disable`. From 714fe80629727f9189516ea773e9569b1bccb46c Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 13 May 2025 13:30:56 +0200 Subject: [PATCH 219/305] EOF --- addons/wardrobe/XEH_postInit.sqf | 1 - addons/wardrobe/data/LICENCE.md | 2 +- addons/wardrobe/functions/fnc_addActionsCondition.sqf | 1 - addons/wardrobe/functions/fnc_addActionsIcon.sqf | 1 - addons/wardrobe/functions/fnc_compareContainerMaxLoad.sqf | 2 +- addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf | 1 - addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf | 2 +- addons/wardrobe/script_macros_wardrobe.hpp | 2 +- 8 files changed, 4 insertions(+), 8 deletions(-) diff --git a/addons/wardrobe/XEH_postInit.sqf b/addons/wardrobe/XEH_postInit.sqf index 05a4f653a5a..ca640a4ef49 100644 --- a/addons/wardrobe/XEH_postInit.sqf +++ b/addons/wardrobe/XEH_postInit.sqf @@ -1,4 +1,3 @@ #include "script_component.hpp" [ QGVAR(EH_updateMagIDs), FUNC(spareBarrelUpdateMagIDs) ] call CBA_fnc_addEventHandler; - diff --git a/addons/wardrobe/data/LICENCE.md b/addons/wardrobe/data/LICENCE.md index dda75028571..20cb9c43e9d 100644 --- a/addons/wardrobe/data/LICENCE.md +++ b/addons/wardrobe/data/LICENCE.md @@ -8,4 +8,4 @@ Files: `fabric_06.ogg`, `fabric_07.ogg`, `fabric_16.ogg`, `fabric_20.ogg`, `fabr by rylandbrooks https://freesound.org/s/328103/ License: [Creative Commons 0](https://creativecommons.org/publicdomain/zero/1.0/) -Files: `helmet_visor_05.ogg`e \ No newline at end of file +Files: `helmet_visor_05.ogg` diff --git a/addons/wardrobe/functions/fnc_addActionsCondition.sqf b/addons/wardrobe/functions/fnc_addActionsCondition.sqf index 6a6affd56ee..f3c4572d958 100644 --- a/addons/wardrobe/functions/fnc_addActionsCondition.sqf +++ b/addons/wardrobe/functions/fnc_addActionsCondition.sqf @@ -27,4 +27,3 @@ isNil QGVAR(api_disable) count ([_player] call FUNC(getItemsModifiableCurrent)) > 0 } } - diff --git a/addons/wardrobe/functions/fnc_addActionsIcon.sqf b/addons/wardrobe/functions/fnc_addActionsIcon.sqf index 68738fd19f8..58f16354875 100644 --- a/addons/wardrobe/functions/fnc_addActionsIcon.sqf +++ b/addons/wardrobe/functions/fnc_addActionsIcon.sqf @@ -22,4 +22,3 @@ if (isNull _cfg) exitWith {}; private _altDispIcon = getText (configFile >> QUOTE(ADDON) >> configName _cfg >> "alternativePicture"); if (_altDispIcon isEqualTo "") then { getText (_cfg >> "picture") } else { _altDispIcon } - diff --git a/addons/wardrobe/functions/fnc_compareContainerMaxLoad.sqf b/addons/wardrobe/functions/fnc_compareContainerMaxLoad.sqf index 7ed19c7a625..f28f32cc38f 100644 --- a/addons/wardrobe/functions/fnc_compareContainerMaxLoad.sqf +++ b/addons/wardrobe/functions/fnc_compareContainerMaxLoad.sqf @@ -74,4 +74,4 @@ if (_mismatches isNotEqualTo []) then { }; LOG_SYS("CompareMaxLoad","========================================================================================================"); LOG_SYS("CompareMaxLoad","END"); -LOG_SYS("CompareMaxLoad","========================================================================================================"); \ No newline at end of file +LOG_SYS("CompareMaxLoad","========================================================================================================"); diff --git a/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf b/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf index 160591a4a7c..1b13eb13b9d 100644 --- a/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf +++ b/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf @@ -23,4 +23,3 @@ params ["_cfgCurrent"]; */ "true" configClasses (configFile >> QUOTE(ADDON) >> configName _cfgCurrent >> "modifiableTo") apply { [configName _x] call CBA_fnc_getItemConfig } select { !isNull _x } - diff --git a/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf b/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf index 8ce63755653..b51368fce3e 100644 --- a/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf +++ b/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf @@ -30,4 +30,4 @@ private _map = EGVAR(overheating,storedSpareBarrels); if !(_oldID in _map) then { continue }; _map set [ _newMagIDs # _forEachIndex , _map deleteAt _oldID ]; -} forEach _oldMagIDs; \ No newline at end of file +} forEach _oldMagIDs; diff --git a/addons/wardrobe/script_macros_wardrobe.hpp b/addons/wardrobe/script_macros_wardrobe.hpp index beeaa5443d2..dabd7f155e6 100644 --- a/addons/wardrobe/script_macros_wardrobe.hpp +++ b/addons/wardrobe/script_macros_wardrobe.hpp @@ -106,4 +106,4 @@ BASIC_COMPONENT(variantGogglesOn,variantGogglesOff,EGVAR(wardrobe,base_H_goggles // Basic Combo #define HELMET_CAP_COMBO(Combo,Helmet,Cap)\ -BASIC_COMBO(Combo,EGVAR(wardrobe,base),Helmet,EGVAR(wardrobe,base),Cap,EGVAR(wardrobe,base)) \ No newline at end of file +BASIC_COMBO(Combo,EGVAR(wardrobe,base),Helmet,EGVAR(wardrobe,base),Cap,EGVAR(wardrobe,base)) From 847bbc4488d167ad96e7511dbac6203ea99f96e3 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 13 May 2025 13:59:11 +0200 Subject: [PATCH 220/305] compareMaxLoad -> /dev/ --- .../compareContainerMaxLoad.sqf} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename addons/wardrobe/{functions/fnc_compareContainerMaxLoad.sqf => dev/compareContainerMaxLoad.sqf} (93%) diff --git a/addons/wardrobe/functions/fnc_compareContainerMaxLoad.sqf b/addons/wardrobe/dev/compareContainerMaxLoad.sqf similarity index 93% rename from addons/wardrobe/functions/fnc_compareContainerMaxLoad.sqf rename to addons/wardrobe/dev/compareContainerMaxLoad.sqf index f28f32cc38f..ae0becedc76 100644 --- a/addons/wardrobe/functions/fnc_compareContainerMaxLoad.sqf +++ b/addons/wardrobe/dev/compareContainerMaxLoad.sqf @@ -2,7 +2,7 @@ /* * Author: OverlordZorn - * This debug function will compare the maxLoad of all modifiable Items with its modifiableTo Variants and will provide an RPT output. + * This debug script will compare the maxLoad of all modifiable Items with its modifiableTo Variants and will provide an RPT output. * WIP! * * Arguments: @@ -11,8 +11,8 @@ * Return Value: * None * - * Example: - * [] call ace_wardrobe_fnc_compareContainerMaxLoad + * Example: execVM "\z\ace\addons\wardrobe\dev\compareContainerMaxLoad.sqf"; + * * * Public: no */ From 9c07e4020a5b8c88b4a25db7d99a0adf331fdcc0 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 13 May 2025 16:58:26 +0200 Subject: [PATCH 221/305] rm comments --- addons/wardrobe/dev/compareContainerMaxLoad.sqf | 3 --- 1 file changed, 3 deletions(-) diff --git a/addons/wardrobe/dev/compareContainerMaxLoad.sqf b/addons/wardrobe/dev/compareContainerMaxLoad.sqf index ae0becedc76..a05e689bdbb 100644 --- a/addons/wardrobe/dev/compareContainerMaxLoad.sqf +++ b/addons/wardrobe/dev/compareContainerMaxLoad.sqf @@ -3,7 +3,6 @@ /* * Author: OverlordZorn * This debug script will compare the maxLoad of all modifiable Items with its modifiableTo Variants and will provide an RPT output. - * WIP! * * Arguments: * None @@ -17,8 +16,6 @@ * Public: no */ -// TODO - private _allWardrobeItems = [true] call FUNC(getAllWardrobeItems) select { switch ( getNumber (_x >> "ItemInfo" >> "type") ) do { case TYPE_GOGGLE: { false; }; From b24a75b6f6567241d97b1b665ff1f3e2a0c6517f Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 13 May 2025 16:58:40 +0200 Subject: [PATCH 222/305] missed snake --- addons/wardrobe/XEH_PREP.hpp | 5 ++--- ...etItems_modifiableTo.sqf => fnc_getItemsModifiableTo.sqf} | 0 2 files changed, 2 insertions(+), 3 deletions(-) rename addons/wardrobe/functions/{fnc_getItems_modifiableTo.sqf => fnc_getItemsModifiableTo.sqf} (100%) diff --git a/addons/wardrobe/XEH_PREP.hpp b/addons/wardrobe/XEH_PREP.hpp index 0339cea87ef..70c078e5386 100644 --- a/addons/wardrobe/XEH_PREP.hpp +++ b/addons/wardrobe/XEH_PREP.hpp @@ -6,8 +6,8 @@ PREP(getIndexFromMagID); PREP(setIndexForMagID); // getItems PREP(getItemsAll); -PREP(getItemsModifiable_all); -PREP(getItemsModifiable_current); +PREP(getItemsModifiableAll); +PREP(getItemsModifiableCurrent); PREP(getItemsModifiableTo); // Replace PREP(replace); @@ -27,7 +27,6 @@ PREP(cacheSet); PREP(clearOnClosedInteractionMenu); // Debug PREP(getAllWardrobeItems); -PREP(compareContainerMaxLoad); // CBA Context Menu PREP(enableContextMenu); PREP(nextVariantDo); diff --git a/addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf similarity index 100% rename from addons/wardrobe/functions/fnc_getItems_modifiableTo.sqf rename to addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf From f26a21a0b3a9a56e6593d92f54c4db44df6e18fe Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 15 May 2025 16:35:47 +0200 Subject: [PATCH 223/305] remove set, api and eh + remove api_disable fully --- addons/wardrobe/XEH_postInit.sqf | 2 +- .../functions/fnc_addActionsCondition.sqf | 10 +++------- .../functions/fnc_enableContextMenu.sqf | 4 ++-- .../wardrobe/functions/fnc_replaceContainer.sqf | 2 +- addons/wardrobe/initSettings.inc.sqf | 4 ++-- docs/wiki/framework/wardrobe-framework.md | 17 +---------------- 6 files changed, 10 insertions(+), 29 deletions(-) diff --git a/addons/wardrobe/XEH_postInit.sqf b/addons/wardrobe/XEH_postInit.sqf index ca640a4ef49..5947862becf 100644 --- a/addons/wardrobe/XEH_postInit.sqf +++ b/addons/wardrobe/XEH_postInit.sqf @@ -1,3 +1,3 @@ #include "script_component.hpp" -[ QGVAR(EH_updateMagIDs), FUNC(spareBarrelUpdateMagIDs) ] call CBA_fnc_addEventHandler; +[ QGVAR(updateMagIDs), FUNC(spareBarrelUpdateMagIDs) ] call CBA_fnc_addEventHandler; diff --git a/addons/wardrobe/functions/fnc_addActionsCondition.sqf b/addons/wardrobe/functions/fnc_addActionsCondition.sqf index f3c4572d958..7db40ecd895 100644 --- a/addons/wardrobe/functions/fnc_addActionsCondition.sqf +++ b/addons/wardrobe/functions/fnc_addActionsCondition.sqf @@ -18,12 +18,8 @@ params ["_player"]; -isNil QGVAR(api_disable) +missionNamespace getVariable [QGVAR(enableAction), false] && -{ - missionNamespace getVariable [QGVAR(set_enableAction), false] - && - { - count ([_player] call FUNC(getItemsModifiableCurrent)) > 0 - } +{ + count ([_player] call FUNC(getItemsModifiableCurrent)) > 0 } diff --git a/addons/wardrobe/functions/fnc_enableContextMenu.sqf b/addons/wardrobe/functions/fnc_enableContextMenu.sqf index 1fe49312e51..153054fea61 100644 --- a/addons/wardrobe/functions/fnc_enableContextMenu.sqf +++ b/addons/wardrobe/functions/fnc_enableContextMenu.sqf @@ -29,8 +29,8 @@ if (_enable && {!(missionNamespace getVariable [QGVAR(contextmenuEnabled), false [], QPATHTOF(data\wardrobe_logo.paa), [ - { isNil QGVAR(api_disable) }, - { isNil QGVAR(api_disable) } + { GVAR(enableContextMenu) }, + { GVAR(enableContextMenu) } ], FUNC(nextVariantDo), false, diff --git a/addons/wardrobe/functions/fnc_replaceContainer.sqf b/addons/wardrobe/functions/fnc_replaceContainer.sqf index bb2bce6d4e8..e15dd3c2e05 100644 --- a/addons/wardrobe/functions/fnc_replaceContainer.sqf +++ b/addons/wardrobe/functions/fnc_replaceContainer.sqf @@ -59,5 +59,5 @@ INTEL_POST(_hasPhoto,acex_intelitems_photo); // ACE Overheating if (_hasSpareBarrel isEqualType [] ) then { private _newMagIDsSpareBarrel = [_player, "ACE_SpareBarrel"] call CBA_fnc_getMagazineIndex; - [QGVAR(EH_updateMagIDs), [_hasSpareBarrel, _newMagIDsSpareBarrel]] call CBA_fnc_serverEvent; + [QGVAR(updateMagIDs), [_hasSpareBarrel, _newMagIDsSpareBarrel]] call CBA_fnc_serverEvent; }; diff --git a/addons/wardrobe/initSettings.inc.sqf b/addons/wardrobe/initSettings.inc.sqf index f6d67398630..80aedf21d80 100644 --- a/addons/wardrobe/initSettings.inc.sqf +++ b/addons/wardrobe/initSettings.inc.sqf @@ -1,5 +1,5 @@ [ - QGVAR(set_enableAction), + QGVAR(enableAction), "CHECKBOX", LSTRING(enable_action), [LSTRING(set_cat_main)], @@ -10,7 +10,7 @@ ] call CBA_fnc_addSetting; [ - QGVAR(set_enableContextMenu), + QGVAR(enableContextMenu), "CHECKBOX", LSTRING(enable_contextMenu), [LSTRING(set_cat_main)], diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index c92df99eb29..a02ca44dbeb 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -281,19 +281,4 @@ There *might* be some changes coming from Bi regarding how arma handles the `set ## 6.2 Container Size - Uniform, Vest, Backpack When the player changes from one container item to another through the wardrobe action and the container's `maximumLoad` is smaller then previously, the player risks the loss of items carried inside said container. -Therefore, the function `[] call ace_wardrobe_fnc_compareContainerMaxLoad` can be used to compare the item's `maximumLoad`. The result will be dumped into the .rpt. - -## 7. API -Missionmakers can choose to force disable the the wardrobe system individually or globally by defining the global variable `ace_wardrobe_api_disable`. -It will be checked if `ace_wardrobe_api_disable` defined or not. The value does not matter. - -```sqf -// Disables Ace Wardrobe on the current mashine. -missionNamespace setVariable ["ace_wardrobe_api_disable", true]; - -// Disables Ace Wardobe globally, JIP-compatible. -missionNamespace setVariable ["ace_wardrobe_api_disable", true, true]; - -// Re-Enable Ace Wardrobe globally, JIP-compatible. -missionNamespace setVariable ["ace_wardrobe_api_disable", nil, true]; -``` \ No newline at end of file +Therefore, the function `[] call ace_wardrobe_fnc_compareContainerMaxLoad` can be used to compare the item's `maximumLoad`. The result will be dumped into the .rpt. \ No newline at end of file From e66c34c2a27e1aea2445754adf4e68776c28114e Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 15 May 2025 16:40:29 +0200 Subject: [PATCH 224/305] Update initSettings.inc.sqf --- addons/wardrobe/initSettings.inc.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/initSettings.inc.sqf b/addons/wardrobe/initSettings.inc.sqf index 80aedf21d80..0167c05f63e 100644 --- a/addons/wardrobe/initSettings.inc.sqf +++ b/addons/wardrobe/initSettings.inc.sqf @@ -17,5 +17,5 @@ true, 1, FUNC(enableContextMenu), - true + false ] call CBA_fnc_addSetting; From 103adee53e62980cddeb11bf81764e89f753aba2 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 22 May 2025 22:50:05 +0200 Subject: [PATCH 225/305] [_xyz] call -> _xyz call --- addons/wardrobe/CfgVehicles.hpp | 4 ++-- addons/wardrobe/dev/compareContainerMaxLoad.sqf | 4 ++-- addons/wardrobe/functions/fnc_addActions.sqf | 4 ++-- addons/wardrobe/functions/fnc_addActionsChildren.sqf | 4 ++-- addons/wardrobe/functions/fnc_addActionsCondition.sqf | 2 +- addons/wardrobe/functions/fnc_addActionsIcon.sqf | 2 +- addons/wardrobe/functions/fnc_addActionsName.sqf | 2 +- addons/wardrobe/functions/fnc_compareComponents.sqf | 2 +- addons/wardrobe/functions/fnc_enableContextMenu.sqf | 2 +- addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf | 4 ++-- addons/wardrobe/functions/fnc_getIndexFromMagID.sqf | 2 +- addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf | 9 ++++----- .../wardrobe/functions/fnc_getItemsModifiableCurrent.sqf | 6 +++--- addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf | 2 +- addons/wardrobe/functions/fnc_isModifiable.sqf | 2 +- addons/wardrobe/functions/fnc_nextVariantGet.sqf | 2 +- addons/wardrobe/functions/fnc_replaceContainer.sqf | 2 +- addons/wardrobe/script_macros_wardrobe.hpp | 2 +- 18 files changed, 28 insertions(+), 29 deletions(-) diff --git a/addons/wardrobe/CfgVehicles.hpp b/addons/wardrobe/CfgVehicles.hpp index b35640a39b1..f6730946746 100644 --- a/addons/wardrobe/CfgVehicles.hpp +++ b/addons/wardrobe/CfgVehicles.hpp @@ -6,9 +6,9 @@ class CfgVehicles { class ADDON { displayName = CSTRING(actionTitle); // Text shown to user icon = QPATHTOF(data\wardrobe_logo.paa); - condition = QUOTE([_player] call FUNC(addActionsCondition)); + condition = QUOTE(_player call FUNC(addActionsCondition)); statement = ""; - insertChildren = QUOTE([_player] call FUNC(addActions)); + insertChildren = QUOTE(_player call FUNC(addActions)); exceptions[] = {"isNotSwimming","isNotSitting"}; }; }; diff --git a/addons/wardrobe/dev/compareContainerMaxLoad.sqf b/addons/wardrobe/dev/compareContainerMaxLoad.sqf index a05e689bdbb..2ed13231230 100644 --- a/addons/wardrobe/dev/compareContainerMaxLoad.sqf +++ b/addons/wardrobe/dev/compareContainerMaxLoad.sqf @@ -16,7 +16,7 @@ * Public: no */ -private _allWardrobeItems = [true] call FUNC(getAllWardrobeItems) select { +private _allWardrobeItems = true call FUNC(getAllWardrobeItems) select { switch ( getNumber (_x >> "ItemInfo" >> "type") ) do { case TYPE_GOGGLE: { false; }; case TYPE_HEADGEAR: { false; }; @@ -40,7 +40,7 @@ LOG_SYS("CompareMaxLoad","====================================================== if (_originClassName in _established) then { continue }; _established pushBack _originClassName; - private _targets = [_cfgOrigin] call FUNC(getItemsModifiableTo); + private _targets = _cfgOrigin call FUNC(getItemsModifiableTo); { private _targetCfg = _x; diff --git a/addons/wardrobe/functions/fnc_addActions.sqf b/addons/wardrobe/functions/fnc_addActions.sqf index 2d1385ed3a6..bc8c388d29c 100644 --- a/addons/wardrobe/functions/fnc_addActions.sqf +++ b/addons/wardrobe/functions/fnc_addActions.sqf @@ -12,7 +12,7 @@ * Array of ACE Child Actions * * Example: - * [_player] call ace_wardrobe_fnc_addActions + * _player call ace_wardrobe_fnc_addActions * * Public: No */ @@ -20,7 +20,7 @@ params ["_unit"]; -private _modifiableItems = [_unit] call FUNC(getItemsModifiableCurrent); +private _modifiableItems = _unit call FUNC(getItemsModifiableCurrent); private _actions = []; { private _cfg = _x#0; diff --git a/addons/wardrobe/functions/fnc_addActionsChildren.sqf b/addons/wardrobe/functions/fnc_addActionsChildren.sqf index 6d503ae1598..3d1b8e26024 100644 --- a/addons/wardrobe/functions/fnc_addActionsChildren.sqf +++ b/addons/wardrobe/functions/fnc_addActionsChildren.sqf @@ -30,8 +30,8 @@ private _actions = []; private _cfgTarget = _x; private _aceAction = [ configName _cfgTarget, - [_cfgTarget] call FUNC(addActionsName), - [_cfgTarget] call FUNC(addActionsIcon), + _cfgTarget call FUNC(addActionsName), + _cfgTarget call FUNC(addActionsIcon), FUNC(replace), {true}, {}, diff --git a/addons/wardrobe/functions/fnc_addActionsCondition.sqf b/addons/wardrobe/functions/fnc_addActionsCondition.sqf index 7db40ecd895..9b8ead95508 100644 --- a/addons/wardrobe/functions/fnc_addActionsCondition.sqf +++ b/addons/wardrobe/functions/fnc_addActionsCondition.sqf @@ -11,7 +11,7 @@ * condition * * Example: - * [_player] call ace_wardrobe_fnc_addActionsCondition + * _player call ace_wardrobe_fnc_addActionsCondition * * Public: No */ diff --git a/addons/wardrobe/functions/fnc_addActionsIcon.sqf b/addons/wardrobe/functions/fnc_addActionsIcon.sqf index 58f16354875..6c832485135 100644 --- a/addons/wardrobe/functions/fnc_addActionsIcon.sqf +++ b/addons/wardrobe/functions/fnc_addActionsIcon.sqf @@ -11,7 +11,7 @@ * Path to Icon or "" * * Example: - * [_cfg] call ace_wardrobe_fnc_getActionIcon + * _cfg call ace_wardrobe_fnc_getActionIcon * * Public: No */ diff --git a/addons/wardrobe/functions/fnc_addActionsName.sqf b/addons/wardrobe/functions/fnc_addActionsName.sqf index 6cb88489ddb..f4f82dfb17d 100644 --- a/addons/wardrobe/functions/fnc_addActionsName.sqf +++ b/addons/wardrobe/functions/fnc_addActionsName.sqf @@ -11,7 +11,7 @@ * The return value * * Example: - * ['something', player] call ace_wardrobe_fnc_getActionName + * _cfg call ace_wardrobe_fnc_getActionsName * * Public: No */ diff --git a/addons/wardrobe/functions/fnc_compareComponents.sqf b/addons/wardrobe/functions/fnc_compareComponents.sqf index 51e0f03de27..acb51f7a216 100644 --- a/addons/wardrobe/functions/fnc_compareComponents.sqf +++ b/addons/wardrobe/functions/fnc_compareComponents.sqf @@ -25,7 +25,7 @@ private _checkfallbackComponent = { // Check if item is present within current modpack. // If not, will look-up if item is defined within ace_Wardrobe and has an fallbackComponent defined. // If not, the component will be fully ignored. - if (isNull ([_x] call CBA_fnc_getItemConfig)) then { + if (isNull (_x call CBA_fnc_getItemConfig)) then { getText (configFile >> QUOTE(ADDON) >> _x >> "fallbackComponent"); } else { _x diff --git a/addons/wardrobe/functions/fnc_enableContextMenu.sqf b/addons/wardrobe/functions/fnc_enableContextMenu.sqf index 153054fea61..4513c8c9c6c 100644 --- a/addons/wardrobe/functions/fnc_enableContextMenu.sqf +++ b/addons/wardrobe/functions/fnc_enableContextMenu.sqf @@ -11,7 +11,7 @@ * None * * Example: - * [true] call ace_wardrobe_fnc_enableContextMenu + * true call ace_wardrobe_fnc_enableContextMenu * * Public: No */ diff --git a/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf b/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf index 82809a400e0..7dcf034bc05 100644 --- a/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf +++ b/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf @@ -11,7 +11,7 @@ * Array Wardobe Items, ether as Classname or as Config * * Example: - * [true] call ace_wardrobe_fnc_getAllWardrobeItems; + * true call ace_wardrobe_fnc_getAllWardrobeItems; * [this, flatten ([] call ace_wardrobe_fnc_getAllWardrobeItems)] call ace_arsenal_fnc_initBox; * * Public: Yes @@ -20,6 +20,6 @@ params [["_asConfig", false, [true]]]; -private _return = flatten ( ["CfgWeapons", "CfgGlasses"] apply { ( QUOTE([_x] call FUNC(isModifiable)) configClasses (configFile >> _x) ) } ); +private _return = flatten ( ["CfgWeapons", "CfgGlasses"] apply { ( QUOTE(_x call FUNC(isModifiable)) configClasses (configFile >> _x) ) } ); if (_asConfig) then { _return } else { _return apply { configName _x } } diff --git a/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf index f70989ddd89..c31a44a5945 100644 --- a/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf +++ b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf @@ -11,7 +11,7 @@ * The return value * * Example: - * [_magID] call ace_wardrobe_fnc_getIndexFromMagID + * _magID call ace_wardrobe_fnc_getIndexFromMagID * * Public: Yes */ diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf index a0991cba1c8..84e7cd6c0a4 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf @@ -25,15 +25,14 @@ params [ private _code = { - [_unit] call FUNC(getItemsAll) + _unit call FUNC(getItemsAll) apply - { [_x] call CBA_fnc_getItemConfig } + { _x call CBA_fnc_getItemConfig } select - { [_x] call FUNC(isModifiable) } + { _x call FUNC(isModifiable) } apply - { [_x, [_x] call FUNC(getItemsModifiableTo) ] } + { [_x, _x call FUNC(getItemsModifiableTo) ] } select - { count (_x#1) > 0 } apply { private _cfgOrigin = _x#0; diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf index c06913abcfa..6f03266ce1d 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf @@ -27,11 +27,11 @@ private _code = { ( [headgear _unit, goggles _unit, uniform _unit, vest _unit, backpack _unit] - [""] ) apply - { [_x] call CBA_fnc_getItemConfig } + { _x call CBA_fnc_getItemConfig } select - { [_x] call FUNC(isModifiable) } + { _x call FUNC(isModifiable) } apply - { [_x, [_x] call FUNC(getItemsModifiableTo) ] } // will return an array, even if the target variants are not available. + { [_x, _x call FUNC(getItemsModifiableTo) ] } // will return an array, even if the target variants are not available. select { count (_x#1) > 0 } apply diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf index 1b13eb13b9d..42d1fa070c9 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf @@ -11,7 +11,7 @@ * Array of all possible variants as config * * Example: - * [_cfgCurrent] call ace_wardrobe_fnc_getItemsModifiableTo + * _cfgCurrent call ace_wardrobe_fnc_getItemsModifiableTo * * Public: No */ diff --git a/addons/wardrobe/functions/fnc_isModifiable.sqf b/addons/wardrobe/functions/fnc_isModifiable.sqf index 912eb6a5145..f051dc391c4 100644 --- a/addons/wardrobe/functions/fnc_isModifiable.sqf +++ b/addons/wardrobe/functions/fnc_isModifiable.sqf @@ -11,7 +11,7 @@ * The return value * * Example: - * [_cfg] call ace_wardrobe_fnc_isModifiable + * _cfg call ace_wardrobe_fnc_isModifiable * * Public: No */ diff --git a/addons/wardrobe/functions/fnc_nextVariantGet.sqf b/addons/wardrobe/functions/fnc_nextVariantGet.sqf index 69079d1b5ea..978c58d8c4d 100644 --- a/addons/wardrobe/functions/fnc_nextVariantGet.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantGet.sqf @@ -14,7 +14,7 @@ * Desired Variant * * Example: - * [_cfgCurrent] call ace_wardrobe_fnc_nextVariantGet + * _cfgCurrent call ace_wardrobe_fnc_nextVariantGet * * Public: No */ diff --git a/addons/wardrobe/functions/fnc_replaceContainer.sqf b/addons/wardrobe/functions/fnc_replaceContainer.sqf index e15dd3c2e05..689b8de5772 100644 --- a/addons/wardrobe/functions/fnc_replaceContainer.sqf +++ b/addons/wardrobe/functions/fnc_replaceContainer.sqf @@ -23,7 +23,7 @@ params ["_player", "_cfgOrigin", "_cfgTarget", "_case"]; toFixed 0; private _magazineDetails = (magazinesAmmoFull _player) apply { [_x#0, _x#-2, _x#-1] }; -private _loadout = [_player] call CBA_fnc_getLoadout; +private _loadout = _player call CBA_fnc_getLoadout; //// Handle Special Cases - Pre Replace diff --git a/addons/wardrobe/script_macros_wardrobe.hpp b/addons/wardrobe/script_macros_wardrobe.hpp index dabd7f155e6..aa10fe8655e 100644 --- a/addons/wardrobe/script_macros_wardrobe.hpp +++ b/addons/wardrobe/script_macros_wardrobe.hpp @@ -18,7 +18,7 @@ class EGVAR(wardrobe,base_U_jacket_closed) // REPLACE #define INTEL_PRE(varName,className)\ private varName = _magazineDetails findIf { _x select 0 == QUOTE(className) } > -1;\ -if (varName) then { varName = [_player, QUOTE(className)] call CBA_fnc_getMagazineIndex apply { [_x] call FUNC(getIndexFromMagID) } } +if (varName) then { varName = [_player, QUOTE(className)] call CBA_fnc_getMagazineIndex apply { _x call FUNC(getIndexFromMagID) } } #define INTEL_POST(varName,className)\ if (varName isEqualType []) then { { [_x, varName select _forEachIndex] call FUNC(setIndexForMagID); } forEach ( [_player, QUOTE(className)] call CBA_fnc_getMagazineIndex ); } From 39e712e78ea39323d22bb85721b58cc06d5fa876 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 22 May 2025 22:51:36 +0200 Subject: [PATCH 226/305] rm empty line and old code --- addons/wardrobe/BaseClasses.hpp | 2 -- addons/wardrobe/dev/compareContainerMaxLoad.sqf | 1 - addons/wardrobe/functions/fnc_addActions.sqf | 1 - addons/wardrobe/functions/fnc_addActionsChildren.sqf | 1 - addons/wardrobe/functions/fnc_addActionsCondition.sqf | 1 - addons/wardrobe/functions/fnc_addActionsIcon.sqf | 1 - addons/wardrobe/functions/fnc_addActionsName.sqf | 1 - addons/wardrobe/functions/fnc_cacheGet.sqf | 1 - addons/wardrobe/functions/fnc_cacheSet.sqf | 1 - addons/wardrobe/functions/fnc_canModifyTo.sqf | 1 - .../wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf | 1 - addons/wardrobe/functions/fnc_compareComponents.sqf | 1 - addons/wardrobe/functions/fnc_enableContextMenu.sqf | 1 - addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf | 1 - addons/wardrobe/functions/fnc_getIndexFromMagID.sqf | 1 - addons/wardrobe/functions/fnc_getItemsAll.sqf | 1 - addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf | 1 - addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf | 1 - addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf | 5 ----- addons/wardrobe/functions/fnc_isModifiable.sqf | 1 - addons/wardrobe/functions/fnc_nextVariantDo.sqf | 1 - addons/wardrobe/functions/fnc_nextVariantGet.sqf | 1 - addons/wardrobe/functions/fnc_replace.sqf | 1 - addons/wardrobe/functions/fnc_replaceContainer.sqf | 1 - addons/wardrobe/functions/fnc_replaceOther.sqf | 1 - addons/wardrobe/functions/fnc_setIndexForMagID.sqf | 1 - addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf | 1 - 27 files changed, 32 deletions(-) diff --git a/addons/wardrobe/BaseClasses.hpp b/addons/wardrobe/BaseClasses.hpp index fa1c4f2929d..c53ffc2af85 100644 --- a/addons/wardrobe/BaseClasses.hpp +++ b/addons/wardrobe/BaseClasses.hpp @@ -2,8 +2,6 @@ class GVAR(base) { - // modifiableTo[] = {""}; // Old version - class modifiableTo { }; diff --git a/addons/wardrobe/dev/compareContainerMaxLoad.sqf b/addons/wardrobe/dev/compareContainerMaxLoad.sqf index 2ed13231230..28e42fa6d90 100644 --- a/addons/wardrobe/dev/compareContainerMaxLoad.sqf +++ b/addons/wardrobe/dev/compareContainerMaxLoad.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * This debug script will compare the maxLoad of all modifiable Items with its modifiableTo Variants and will provide an RPT output. diff --git a/addons/wardrobe/functions/fnc_addActions.sqf b/addons/wardrobe/functions/fnc_addActions.sqf index bc8c388d29c..c4c1df7ea75 100644 --- a/addons/wardrobe/functions/fnc_addActions.sqf +++ b/addons/wardrobe/functions/fnc_addActions.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * This function creates children for the main wardrobe action - one for every modifiable Item. diff --git a/addons/wardrobe/functions/fnc_addActionsChildren.sqf b/addons/wardrobe/functions/fnc_addActionsChildren.sqf index 3d1b8e26024..b4afbd3afbb 100644 --- a/addons/wardrobe/functions/fnc_addActionsChildren.sqf +++ b/addons/wardrobe/functions/fnc_addActionsChildren.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * Function to create the ace action children, one for each possible variant of the current item. diff --git a/addons/wardrobe/functions/fnc_addActionsCondition.sqf b/addons/wardrobe/functions/fnc_addActionsCondition.sqf index 9b8ead95508..db2ab29d039 100644 --- a/addons/wardrobe/functions/fnc_addActionsCondition.sqf +++ b/addons/wardrobe/functions/fnc_addActionsCondition.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * Condition check: Is wardrobe enabled & if the player has an item that can be modified diff --git a/addons/wardrobe/functions/fnc_addActionsIcon.sqf b/addons/wardrobe/functions/fnc_addActionsIcon.sqf index 6c832485135..4ac402cf770 100644 --- a/addons/wardrobe/functions/fnc_addActionsIcon.sqf +++ b/addons/wardrobe/functions/fnc_addActionsIcon.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * This Function checks if the Target Item has an alternative Picture for the Action, if not, it returns the picture property diff --git a/addons/wardrobe/functions/fnc_addActionsName.sqf b/addons/wardrobe/functions/fnc_addActionsName.sqf index f4f82dfb17d..6e296cc47ca 100644 --- a/addons/wardrobe/functions/fnc_addActionsName.sqf +++ b/addons/wardrobe/functions/fnc_addActionsName.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * This Function checks if the Target Item has an Alternative String for the Action, if not, it returns the displayName property diff --git a/addons/wardrobe/functions/fnc_cacheGet.sqf b/addons/wardrobe/functions/fnc_cacheGet.sqf index 3c12ba5baa9..be971831e83 100644 --- a/addons/wardrobe/functions/fnc_cacheGet.sqf +++ b/addons/wardrobe/functions/fnc_cacheGet.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * To retrieve a value from the database. returns nil if not stored or, when provided, will execute the alternative code and return and store said result diff --git a/addons/wardrobe/functions/fnc_cacheSet.sqf b/addons/wardrobe/functions/fnc_cacheSet.sqf index 8a40757afd0..07c1e742199 100644 --- a/addons/wardrobe/functions/fnc_cacheSet.sqf +++ b/addons/wardrobe/functions/fnc_cacheSet.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * Function to store a value behind a key into the addons cache diff --git a/addons/wardrobe/functions/fnc_canModifyTo.sqf b/addons/wardrobe/functions/fnc_canModifyTo.sqf index 92612f197d6..b8eeca405e6 100644 --- a/addons/wardrobe/functions/fnc_canModifyTo.sqf +++ b/addons/wardrobe/functions/fnc_canModifyTo.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * Condition Check if the unit can modify from current variant to target variant. Checks and compares components. diff --git a/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf b/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf index 8307229180a..058115747a2 100644 --- a/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf +++ b/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * Function to request the clearing of the cache upon closing of the menu diff --git a/addons/wardrobe/functions/fnc_compareComponents.sqf b/addons/wardrobe/functions/fnc_compareComponents.sqf index acb51f7a216..a76e091089a 100644 --- a/addons/wardrobe/functions/fnc_compareComponents.sqf +++ b/addons/wardrobe/functions/fnc_compareComponents.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * Function to compare the components of the current and target wearables. diff --git a/addons/wardrobe/functions/fnc_enableContextMenu.sqf b/addons/wardrobe/functions/fnc_enableContextMenu.sqf index 4513c8c9c6c..e7dc98323a1 100644 --- a/addons/wardrobe/functions/fnc_enableContextMenu.sqf +++ b/addons/wardrobe/functions/fnc_enableContextMenu.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * CBA Setting - On Setting Changed - Function to activate the Wardrobe-related CBA Context Menu Options diff --git a/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf b/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf index 7dcf034bc05..4209fa93a6a 100644 --- a/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf +++ b/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * Debug - Function to retrieve all existing Wardrobe items. diff --git a/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf index c31a44a5945..72b632d0fe5 100644 --- a/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf +++ b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * function to return the data index based of the magazine ID diff --git a/addons/wardrobe/functions/fnc_getItemsAll.sqf b/addons/wardrobe/functions/fnc_getItemsAll.sqf index b6fccd5b9c9..b24954afb3d 100644 --- a/addons/wardrobe/functions/fnc_getItemsAll.sqf +++ b/addons/wardrobe/functions/fnc_getItemsAll.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * Retrieves a list of all items of unit - can be cached for the duration of the ace interaction. diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf index 84e7cd6c0a4..45e63d23df5 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * Function to retrieve modifiable items of a unit. Can be cached for the duration of the interaction menu. diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf index 6f03266ce1d..271f3a4cbab 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * Function to retrieve currently worn, modifiable items. Return can be cached - for the duration of the interaction menu. diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf index 42d1fa070c9..5a1244e0393 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * Function to return an array the config of desired target items. Also checks if those items exist: CBA_fnc_getItemConfig returns configNull when item not found. @@ -18,8 +17,4 @@ params ["_cfgCurrent"]; -/* OLD -[_cfgCurrent >> QUOTE(ADDON) >> "modifiableTo"] call BIS_fnc_getCfgDataArray apply { [_x] call CBA_fnc_getItemConfig } select { !isNull _x } -*/ - "true" configClasses (configFile >> QUOTE(ADDON) >> configName _cfgCurrent >> "modifiableTo") apply { [configName _x] call CBA_fnc_getItemConfig } select { !isNull _x } diff --git a/addons/wardrobe/functions/fnc_isModifiable.sqf b/addons/wardrobe/functions/fnc_isModifiable.sqf index f051dc391c4..108789cdf4f 100644 --- a/addons/wardrobe/functions/fnc_isModifiable.sqf +++ b/addons/wardrobe/functions/fnc_isModifiable.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * Function to check if the provided wearable Item (Config) can be modified through ace_wardrobe. diff --git a/addons/wardrobe/functions/fnc_nextVariantDo.sqf b/addons/wardrobe/functions/fnc_nextVariantDo.sqf index 937fea9ac01..c53cd65acc8 100644 --- a/addons/wardrobe/functions/fnc_nextVariantDo.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantDo.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * Statement of CBA Context Menu Entry - Request the Next Variant. diff --git a/addons/wardrobe/functions/fnc_nextVariantGet.sqf b/addons/wardrobe/functions/fnc_nextVariantGet.sqf index 978c58d8c4d..1a5ba2713a6 100644 --- a/addons/wardrobe/functions/fnc_nextVariantGet.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantGet.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * Context Menu - Return config the "next" variant - if multiple Variants are defined, it will choose randomly. diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index b2950311b86..d248fa101d8 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * Ace Action Statement - Removes the modifiableItem and replaces it with the target item diff --git a/addons/wardrobe/functions/fnc_replaceContainer.sqf b/addons/wardrobe/functions/fnc_replaceContainer.sqf index 689b8de5772..629ace716aa 100644 --- a/addons/wardrobe/functions/fnc_replaceContainer.sqf +++ b/addons/wardrobe/functions/fnc_replaceContainer.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * Function to replace a persons Uniform while maintaining the content of the uniform. diff --git a/addons/wardrobe/functions/fnc_replaceOther.sqf b/addons/wardrobe/functions/fnc_replaceOther.sqf index cc34f4bb5b2..1a37d5ad98c 100644 --- a/addons/wardrobe/functions/fnc_replaceOther.sqf +++ b/addons/wardrobe/functions/fnc_replaceOther.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * Function to replace a person's goggles/facewear. diff --git a/addons/wardrobe/functions/fnc_setIndexForMagID.sqf b/addons/wardrobe/functions/fnc_setIndexForMagID.sqf index 187076ad39e..87b439ba38d 100644 --- a/addons/wardrobe/functions/fnc_setIndexForMagID.sqf +++ b/addons/wardrobe/functions/fnc_setIndexForMagID.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * Sets the data-index for a magID diff --git a/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf b/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf index b51368fce3e..a81e62608c9 100644 --- a/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf +++ b/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf @@ -1,5 +1,4 @@ #include "../script_component.hpp" - /* * Author: OverlordZorn * Function to update ACE Overheating's Serverside SpareBarrel DataBase with new MagIDs. From 35e35b787316c91fd35c8767f9a212aa31ba8f76 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 22 May 2025 22:51:50 +0200 Subject: [PATCH 227/305] fix order --- addons/wardrobe/config.cpp | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/addons/wardrobe/config.cpp b/addons/wardrobe/config.cpp index 3805571af9c..5f98a57931a 100644 --- a/addons/wardrobe/config.cpp +++ b/addons/wardrobe/config.cpp @@ -3,21 +3,18 @@ class CfgPatches { class ADDON { name = COMPONENT_NAME; - author = ECSTRING(common,ACETeam); - authors[] = {"OverlordZorn [CVO]"}; - url = ECSTRING(main,URL); - - VERSION_CONFIG; + units[] = {}; + weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = { "ace_interact_menu", "ace_goggles" }; skipWhenMissingDependencies = 1; - - units[] = {}; - weapons[] = {}; + author = ECSTRING(common,ACETeam); + authors[] = {"OverlordZorn [CVO]"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; }; }; From 590271516d9a177b1a315335f71a48ab5d6f1711 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 22 May 2025 22:53:31 +0200 Subject: [PATCH 228/305] count >/== 0 -> isEqualTo [] --- addons/wardrobe/functions/fnc_addActions.sqf | 2 +- addons/wardrobe/functions/fnc_addActionsCondition.sqf | 2 +- addons/wardrobe/functions/fnc_canModifyTo.sqf | 2 +- addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf | 3 ++- addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf | 4 ++-- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/addons/wardrobe/functions/fnc_addActions.sqf b/addons/wardrobe/functions/fnc_addActions.sqf index c4c1df7ea75..aee9f24084c 100644 --- a/addons/wardrobe/functions/fnc_addActions.sqf +++ b/addons/wardrobe/functions/fnc_addActions.sqf @@ -5,7 +5,7 @@ * Each Modifiable Item will have its own children in regard of the items it can be changed towards. * * Arguments: - * 0: The Unit whose wearable shall be changed - usually the player themselves + * 0: Unit * * Return Value: * Array of ACE Child Actions diff --git a/addons/wardrobe/functions/fnc_addActionsCondition.sqf b/addons/wardrobe/functions/fnc_addActionsCondition.sqf index db2ab29d039..a7d5841699d 100644 --- a/addons/wardrobe/functions/fnc_addActionsCondition.sqf +++ b/addons/wardrobe/functions/fnc_addActionsCondition.sqf @@ -20,5 +20,5 @@ params ["_player"]; missionNamespace getVariable [QGVAR(enableAction), false] && { - count ([_player] call FUNC(getItemsModifiableCurrent)) > 0 + _player call FUNC(getItemsModifiableCurrent) isEqualTo [] } diff --git a/addons/wardrobe/functions/fnc_canModifyTo.sqf b/addons/wardrobe/functions/fnc_canModifyTo.sqf index b8eeca405e6..0568dca9fa1 100644 --- a/addons/wardrobe/functions/fnc_canModifyTo.sqf +++ b/addons/wardrobe/functions/fnc_canModifyTo.sqf @@ -24,4 +24,4 @@ params ["_unit", "_cfgOrigin", "_cfgTarget", ["_cache", true, [true]]]; private _currentItems = [_unit, _cache] call FUNC(getItemsAll); -count ( _missing select { ! (_x in _currentItems) } ) == 0 +_missing select { ! (_x in _currentItems) } isEqualTo [] \ No newline at end of file diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf index 45e63d23df5..92d753e6ae2 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf @@ -32,6 +32,7 @@ private _code = { apply { [_x, _x call FUNC(getItemsModifiableTo) ] } select + { (_x#1) isNotEqualTo [] } apply { private _cfgOrigin = _x#0; @@ -41,7 +42,7 @@ private _code = { ] } select - { count (_x#1) > 0 } + { (_x#1) isNotEqualTo [] } }; private _caching = { diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf index 271f3a4cbab..549ba1a8dc4 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf @@ -32,7 +32,7 @@ private _code = { apply { [_x, _x call FUNC(getItemsModifiableTo) ] } // will return an array, even if the target variants are not available. select - { count (_x#1) > 0 } + { (_x#1) isNotEqualTo [] } apply { private _cfgOrigin = _x#0; @@ -42,7 +42,7 @@ private _code = { ] } select - { count (_x#1) > 0 } + { (_x#1) isNotEqualTo [] } }; From 78fbd9d506c4c636098772488498cbc86a43eb44 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 22 May 2025 22:55:29 +0200 Subject: [PATCH 229/305] rm (( )) + GVAR = nil + ace_player --- .../functions/fnc_clearOnClosedInteractionMenu.sqf | 8 ++++---- addons/wardrobe/functions/fnc_nextVariantGet.sqf | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf b/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf index 058115747a2..c06ecb79315 100644 --- a/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf +++ b/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf @@ -17,7 +17,7 @@ params [ ["_key", "", [""]] ]; -private _queue = missionNamespace getVariable [QGVAR((menuClearQueue)), ""]; +private _queue = missionNamespace getVariable [QGVAR(menuClearQueue), ""]; if (_queue isEqualTo "") then { _queue = []; @@ -26,13 +26,13 @@ if (_queue isEqualTo "") then { { if (_this isNotEqualTo [1]) exitWith {}; - { GVAR(cache) deleteAt _x } forEach ( missionNamespace getVariable [QGVAR((menuClearQueue)), [] ] ); + { GVAR(cache) deleteAt _x } forEach ( missionNamespace getVariable [QGVAR(menuClearQueue), [] ] ); - missionNamespace setVariable [QGVAR((menuClearQueue)), nil ]; + GVAR(menuClearQueue) = nil; [_thisType, _thisId] call CBA_fnc_removeEventHandler; } ] call CBA_fnc_addEventHandlerArgs; - missionNamespace setVariable [QGVAR((menuClearQueue)), _queue]; + missionNamespace setVariable [QGVAR(menuClearQueue), _queue]; }; _queue pushBackUnique _key; diff --git a/addons/wardrobe/functions/fnc_nextVariantGet.sqf b/addons/wardrobe/functions/fnc_nextVariantGet.sqf index 1a5ba2713a6..69e4c5add8b 100644 --- a/addons/wardrobe/functions/fnc_nextVariantGet.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantGet.sqf @@ -35,15 +35,15 @@ if (_cfgHistory isEqualTo "") then { missionNamespace setVariable [QGVAR(variantHistory), _cfgHistory]; ACE_player addEventHandler ["InventoryClosed", { - missionNamespace setVariable [QGVAR(variantHistory), nil ]; - player removeEventHandler [_thisEvent, _thisEventhandler]; + GVAR(variantHistory) = nil; + ACE_player removeEventHandler [_thisEvent, _thisEventhandler]; }]; }; private _remaining = _cfgModifiableTo - _cfgHistory; -_remaining = _remaining select { [ace_player, _cfgCurrent, _x] call FUNC(canModifyTo) }; +_remaining = _remaining select { [ACE_player, _cfgCurrent, _x] call FUNC(canModifyTo) }; // Returns ether a random remaining item or alternatively, a random one from the complete array. private _return = if (_remaining isNotEqualTo []) then { From 42c0362df4f4fe80456181fbf2e587d6f0781aa7 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 22 May 2025 22:59:13 +0200 Subject: [PATCH 230/305] capitalization, typo, wording, grammar, etc. --- addons/wardrobe/BaseClasses.hpp | 16 +++--- .../functions/fnc_getAllWardrobeItems.sqf | 2 +- .../wardrobe/functions/fnc_nextVariantGet.sqf | 2 +- addons/wardrobe/functions/fnc_replace.sqf | 6 +-- docs/wiki/framework/wardrobe-framework.md | 52 +++++++++---------- 5 files changed, 39 insertions(+), 39 deletions(-) diff --git a/addons/wardrobe/BaseClasses.hpp b/addons/wardrobe/BaseClasses.hpp index c53ffc2af85..05c3fb7ec8c 100644 --- a/addons/wardrobe/BaseClasses.hpp +++ b/addons/wardrobe/BaseClasses.hpp @@ -16,16 +16,16 @@ class GVAR(base) { // Gesture gesture = "Gear"; - // These will be read from the Target Class, so for example, the uniformclass with the rolled up sleaves, it should say "Roll Up Sleeves" + // These will be read from the target class, so for example, the uniformclass with the rolled up sleaves, it should say "Roll Up Sleeves" alternativePicture = ""; alternativeDisplayName = ""; - duration = 1; // Minimum Value: 1 - Anything above will produce a progressbar. + duration = 1; // Minimum value: 1 - Anything above will produce a progressbar. fallbackComponent = ""; // To be used as an alternative for components where the intended component is from another addon/mod in case the source addon is not loaded. }; -// Common Base Class for Uniforms with Sleeves Up/Down Variants +// Common base class for uniforms with sleeves up/down variants class GVAR(base_U_sleeves_up): GVAR(base) { alternativeDisplayName = CSTRING(sleevesUp); }; @@ -33,7 +33,7 @@ class GVAR(base_U_sleeves_down): GVAR(base) { alternativeDisplayName = CSTRING(sleevesDown); }; -// Common Base Class for Uniforms with Gloves On/Off Variants +// Common base class for uniforms with gloves on/off variants class GVAR(base_U_gloves_on): GVAR(base) { alternativeDisplayName = CSTRING(glovesOn); }; @@ -41,7 +41,7 @@ class GVAR(base_U_gloves_off): GVAR(base) { alternativeDisplayName = CSTRING(glovesOff); }; -// Common Base Class for Uniforms who are open/closed in the front +// Common base class for uniforms who are open/closed in the front class GVAR(base_U_jacket_open): GVAR(base) { alternativeDisplayName = CSTRING(jacketOpen); }; @@ -49,7 +49,7 @@ class GVAR(base_U_jacket_closed): GVAR(base) { alternativeDisplayName = CSTRING(jacketClose); }; -// Common Base Class for Helmets with a Visor that can be flipped up or down +// Common base class for helmets with a visor that can be flipped up or down class GVAR(base_H_visor_up): GVAR(base) { duration = 0.25; gesture ="gestureNod"; @@ -70,7 +70,7 @@ class GVAR(base_H_visor_down): GVAR(base) { alternativeDisplayName = CSTRING(visorDown); }; -// Common Base Class for Headgear with goggles that can be used as a facewear item. +// Common base class for headgear with goggles that can be used as a facewear item. class GVAR(base_H_goggles_on): GVAR(base) { gesture ="GestureWipeFace"; alternativeDisplayName = CSTRING(gogglesOn); @@ -82,7 +82,7 @@ class GVAR(base_H_goggles_off): GVAR(base) { }; -// Common Base Class for Headgear with a Mask on and Mask Off variant +// Common base class for headgear with a mask on/off variant class GVAR(base_H_mask_on): GVAR(base) { gesture ="GestureWipeFace"; alternativeDisplayName = CSTRING(maskOn); diff --git a/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf b/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf index 4209fa93a6a..fcafed9ca39 100644 --- a/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf +++ b/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf @@ -7,7 +7,7 @@ * 0: Return as Config? (default: false) * * Return Value: - * Array Wardobe Items, ether as Classname or as Config + * Array Wardobe Items, either as Classname or as Config * * Example: * true call ace_wardrobe_fnc_getAllWardrobeItems; diff --git a/addons/wardrobe/functions/fnc_nextVariantGet.sqf b/addons/wardrobe/functions/fnc_nextVariantGet.sqf index 69e4c5add8b..f41a5dc7209 100644 --- a/addons/wardrobe/functions/fnc_nextVariantGet.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantGet.sqf @@ -45,7 +45,7 @@ private _remaining = _cfgModifiableTo - _cfgHistory; _remaining = _remaining select { [ACE_player, _cfgCurrent, _x] call FUNC(canModifyTo) }; -// Returns ether a random remaining item or alternatively, a random one from the complete array. +// Returns either a random remaining item or alternatively, a random one from the complete array. private _return = if (_remaining isNotEqualTo []) then { selectRandom _remaining } else { diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index d248fa101d8..3deaf411100 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -77,7 +77,7 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 [ _unit, getText (configFile >> QUOTE(ADDON) >> configName _cfgTarget >> "gesture") ] call EFUNC(common,doGesture); // Plays Random Sound At the Beginning -private _sound = [configFile >> QUOTE(ADDON) >> configName _cfgTarget >> "sound"] call cba_fnc_getCfgDataRandom; +private _sound = [configFile >> QUOTE(ADDON) >> configName _cfgTarget >> "sound"] call CBA_fnc_getCfgDataRandom; if (_sound isNotEqualTo "") then { [ CBA_fnc_globalSay3D, @@ -88,7 +88,7 @@ if (_sound isNotEqualTo "") then { // Notification private _imgNotify = getText (_cfgTarget >> "picture"); -if !(".paa" in _imgNotify) then { _imgNotify = [_imgNotify,"paa"] joinString "." }; // Some vanilla items dont have the .paa and cba notify will display the path as a string without the .paa -[ ace_common_fnc_displayTextStructured, [["
%2",_imgNotify, getText (_cfgTarget >> "displayName")], 4], _duration * 1.2 ] call CBA_fnc_waitAndExecute; +if !(".paa" in _imgNotify) then { _imgNotify = [_imgNotify, "paa"] joinString "." }; // Some vanilla items dont have the .paa and cba notify will display the path as a string without the .paa +[EFUNC(common,displayTextStructured), [["
%2", _imgNotify, getText (_cfgTarget >> "displayName")], 4], _duration * 1.2] call CBA_fnc_waitAndExecute; nil diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index a02ca44dbeb..99f4a41c6ff 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -15,9 +15,9 @@ version: ## 1. Overview -The Wardrobe Addon gives the player the opportunity to change/modify their current wearables into different variants. +The Wardrobe addon gives the player the opportunity to change/modify their current wearables into different variants. -For example, if a uniform has a normal variant and a "Rolled-Up Sleeves" variant, the player will be able to use ether an ACE Self Interaction or the CBA Context Menu in the Inventory. +For example, if a uniform has a normal variant and a "rolled-Up sleeves" variant, the player will be able to use ether an ACE Self Interaction or the CBA Context Menu in the inventory. Since there is no reliable, common patterns in terms of class inheritance, not even within the same DLC, each possible variant has to be defined individually within `configFile >> "ace_wardrobe"`. @@ -26,38 +26,38 @@ Since there is no reliable, common patterns in terms of class inheritance, not e Components are an optional assistance to define a group of variants where a variant is made of one or more components. For example, a bandanna with sunglasses would have the the bandanna and the sunglasses as components, while the bandanna and sunglasses themself only have themselves as a component. -If the player switches from a variant with more components to a variant with less components, the surplus components will be deposited in their inventory. Vise Versa, if the player wants to change from a variant with less components to a variant with more components, they are required to have the missing components in their inventory, which will be removed on conversion. +If the player switches from a variant with more components to a variant with less components, the surplus components will be deposited in their inventory. Vice Versa, if the player wants to change from a variant with less components to a variant with more components, they are required to have the missing components in their inventory, which will be removed on conversion. More examples can be found below. ### 1.2 Config Guidelines -- A Container (Uniform, Vest, Backpack) should never change its `maxLoad`, unless there is a really good reason for it. This will result in the loss of items. +- A Container (uniform, vest, backpack) should never change its `maximumLoad`, unless there is a really good reason for it. This will result in the loss of items. - Variants should not "magically" add/remove parts to/from themselves, unless it's handled through a component, especially when they add protection or functionality. - - Do: Uniforms with and without Gloves should be fine in most cases, as they are cosmetical and don't break continuity/logic. + - Do: Uniforms with and without gloves should be fine in most cases, as they are cosmetical and don't break continuity/logic. - Do: Helmets with integral flip-down visors. - Don't: Helmet with additional armor or face protector without the requirement of some component that will be removed from the inventory. - There should not be a difference in weight or container capacity between the different variants unless components get added/removed. - - For Example: `Mass of Helmet with Goggles = Mass of Helmet + Mass of Goggles.` + - For Example: `Mass of helmet with goggles = mass of helmet + mass of goggles.` ## 2. Config -Only directly defined Subclasses will be taken into account. A fully inherited subclass will be ignored and will not provide any interaction. The `ace_wardrobe` properties are to be found as a subclass of the item itself. Multiple base configs are designed at root of `configFile`. +Only directly defined subclasses will be taken into account. A fully inherited subclass will be ignored and will not provide any interaction. The `ace_wardrobe` properties are to be found as a subclass of the item itself. Multiple base configs are designed at root of `configFile`. ## 2.1 Properties All supported Properties can be found within the `ace_wardrobe_base` baseclass. | Class Property | Data Type | Description | | -------------- | ----------- | ----------- | -| `modifiableTo` | Subclasses | possible Variants this item can be turned into. | +| `modifiableTo` | Subclasses | Possible variants this item can be turned into. | | `components[]` | Array of Classnames | Components the current variant contains within itself | -| `sound[]` | Array of CfgSound Entries | to be chosen by random when the action is performed | -| `sound_timing` | Number 0..1 | defines the point time relative to the duration when the sound is played | +| `sound[]` | Array of CfgSound Entries | To be chosen by random when the action is performed | +| `sound_timing` | Number 0..1 | Defines the point time relative to the duration when the sound is played | | `gesture` | String of Classname | Gesture to be played when the action is performed | -| `alternativePicture` | String of path to icon | to be used instead of target variant picture | +| `alternativePicture` | String of path to icon | To be used instead of target variant picture | | `alternativeDisplayName` | String | Will be used instead of the target variants displayname | | `duration` | Number in seconds | Duration of action. Items are being replaced at the end. | -| `fallbackComponent` | String of Classname | Fallback for Components that are not present within the same mod/addon. Example: RHS AFRF helmets use `rhs_ess_black` goggles, which are only part of USAF. fallbackComponent can be used to default to a vanilla alternative. | +| `fallbackComponent` | String of Classname | Fallback for components that are not present within the same mod/addon. Example: RHS AFRF helmets use `rhs_ess_black` goggles, which are only part of USAF. `fallbackComponent` can be used to default to a vanilla alternative. | ### 2.2 Base Classes @@ -73,18 +73,18 @@ class ace_wardrobe { components[] = {}; - // Supports Multiple Sounds, will pick one by random. + // Supports multiple sounds, will pick one by random. sound[] = { "ace_wardrobe_fabric_06", "ace_wardrobe_fabric_07", "ace_wardrobe_fabric_16", "ace_wardrobe_fabric_20", "ace_wardrobe_fabric_25"}; sound_timing = 0; // [0..1] 0 at the start of the action, 0.5 half way during the duration of the action - always, if completed or not. 1 at the end, only when completed. // Gesture gesture = "Gear"; - // These will be read from the Target Class, so for example, the uniformclass with the rolled up sleaves, it should say "Roll Up Sleeves" + // These will be read from the target class, so for example, the uniformclass with the rolled up sleaves, it should say "roll up sleeves" alternativePicture = ""; alternativeDisplayName = ""; - duration = 1; // Minimum Value: 1 - Anything above will produce a progressbar. + duration = 1; // Minimum value: 1 - Anything above will produce a progressbar. fallbackComponent = ""; // To be used as an alternative for components where the intended component is from another addon/mod in case the source addon is not loaded. @@ -94,7 +94,7 @@ class ace_wardrobe { ``` #### 2.2.2 Base Uniform Sleeves Up / Down -Common Base Class for Uniforms with Sleeves Up/Down Variants +Common base class for uniforms with Sleeves up/down variants ```cpp class ace_wardrobe_base_U_sleeves_up: ace_wardrobe_base { alternativeDisplayName = CSTRING(sleevesUp); @@ -104,7 +104,7 @@ class ace_wardrobe_base_U_sleeves_down: ace_wardrobe_base { }; ``` #### 2.2.3 Base Uniform Gloves On / Off -Common Base Class for Uniforms with Gloves On/Off Variants +Common base class for uniforms with gloves on/off variants ```cpp class ace_wardrobe_base_U_gloves_on: ace_wardrobe_base { alternativeDisplayName = CSTRING(glovesOn); @@ -114,7 +114,7 @@ class ace_wardrobe_base_U_gloves_off: ace_wardrobe_base { }; ``` #### 2.2.4 Base Uniform Jacket Open / Closed -Common Base Class for Uniforms who are open/closed in the front +Common base class for uniforms who are open/closed in the front ```cpp class ace_wardrobe_base_U_jacket_open: ace_wardrobe_base { alternativeDisplayName = CSTRING(jacketOpen); @@ -125,7 +125,7 @@ class ace_wardrobe_base_U_jacket_closed: ace_wardrobe_base { ``` #### 2.2.5 Base Helmet Visor Up / Down -Common Base Class for Helmets with a Visor that can be flipped up or down. +Common base class for helmets with a visor that can be flipped up or down. Here, the duration is carefully timed to be aligned with the "click" of the soun. ```cpp @@ -150,7 +150,7 @@ class ace_wardrobe_base_H_visor_down: ace_wardrobe_base { }; ``` #### 2.2.6 Base Headgear with Goggles on / off -Common Base Class for Headgear with goggles that can be used as a facewear item. +Common base class for headgear with goggles that can be used as a facewear item. ```cpp class ace_wardrobe_base_H_goggles_on: ace_wardrobe_base { gesture ="GestureWipeFace"; @@ -178,8 +178,8 @@ class ace_wardrobe { // Begin to define your configs ... }; ``` -## 4. Configuration Examples -### 4.1 Simple Example - Uniform Sleeves - No requirement for Components +## 4. Configuration examples +### 4.1 Simple Example - Uniform sleeves - No requirement for components ```cpp class ace_wardrobe { IMPORT_BASE_CLASSES; @@ -200,7 +200,7 @@ class ace_wardrobe { }; ``` -### 4.2 Advanced Example - Balaclava with Combat Glasses - Partial use of Components +### 4.2 Advanced example - Balaclava with combat glasses - Partial use of components ```cpp class ace_wardrobe { IMPORT_BASE_CLASSES; @@ -224,7 +224,7 @@ class ace_wardrobe { }; }; ``` -### 4.3 Complex Example - Bandana with Aviators - Complex use of Multiple Components +### 4.3 Complex example - Bandana with aviators - Complex use of multiple components ```cpp class ace_wardrobe { IMPORT_BASE_CLASSES; @@ -276,9 +276,9 @@ Currently, `ace_intelitems` and `ace_overheating` (spare barrels) are being dire If an addon or mod utilizes a magazine's `magazineID` to handle additional data about items carried by the player, then the process of modifying a wearable container (uniform, vest, backpack) to another variant will result in new `magazineID`s for all magazines on the player and therefore, require special handling within `ace_wardrobe` functions. -There *might* be some changes coming from Bi regarding how arma handles the `setUnitLoadout` which could resolve the need for this. +There *might* be some changes coming from BI regarding how arma handles the `setUnitLoadout` which could resolve the need for this. ## 6.2 Container Size - Uniform, Vest, Backpack When the player changes from one container item to another through the wardrobe action and the container's `maximumLoad` is smaller then previously, the player risks the loss of items carried inside said container. -Therefore, the function `[] call ace_wardrobe_fnc_compareContainerMaxLoad` can be used to compare the item's `maximumLoad`. The result will be dumped into the .rpt. \ No newline at end of file +Therefore, the debug script found at `addons\wardrobe\dev\compareContainerMaxLoad.sqf` can be used to compare the item's `maximumLoad`. The result will be dumped into the .rpt. From 81225aebec591ca69e7213a95be78d74dddbc4b5 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 23 May 2025 01:17:38 +0200 Subject: [PATCH 231/305] cleanup --- .hemtt/launch.toml | 26 +++++++++---------- .../wardrobe/dev/compareContainerMaxLoad.sqf | 2 +- addons/wardrobe/functions/fnc_addActions.sqf | 2 +- .../functions/fnc_addActionsChildren.sqf | 10 +++---- .../functions/fnc_addActionsCondition.sqf | 2 +- .../wardrobe/functions/fnc_addActionsIcon.sqf | 4 +-- .../wardrobe/functions/fnc_addActionsName.sqf | 2 +- addons/wardrobe/functions/fnc_cacheGet.sqf | 2 +- addons/wardrobe/functions/fnc_cacheSet.sqf | 2 +- addons/wardrobe/functions/fnc_canModifyTo.sqf | 6 ++--- .../fnc_clearOnClosedInteractionMenu.sqf | 2 +- .../functions/fnc_compareComponents.sqf | 8 +++--- .../functions/fnc_enableContextMenu.sqf | 2 +- .../functions/fnc_getAllWardrobeItems.sqf | 4 +-- .../functions/fnc_getIndexFromMagID.sqf | 4 +-- .../functions/fnc_getItemsModifiableTo.sqf | 2 +- .../wardrobe/functions/fnc_isModifiable.sqf | 4 +-- .../wardrobe/functions/fnc_nextVariantDo.sqf | 4 +-- .../wardrobe/functions/fnc_nextVariantGet.sqf | 10 +++---- addons/wardrobe/functions/fnc_replace.sqf | 15 ++++++----- .../functions/fnc_replaceContainer.sqf | 6 ++--- .../wardrobe/functions/fnc_replaceOther.sqf | 4 +-- .../functions/fnc_spareBarrelUpdateMagIDs.sqf | 10 ++++--- 23 files changed, 68 insertions(+), 65 deletions(-) diff --git a/.hemtt/launch.toml b/.hemtt/launch.toml index 23a11dc3d75..f0277316c2e 100644 --- a/.hemtt/launch.toml +++ b/.hemtt/launch.toml @@ -56,7 +56,7 @@ workshop = [ "1369691841", # Community Factions Project ] -[Wardrobe] +[wardrobe] extends = "default" mission = "Wardrobe.VR" workshop = [ @@ -65,24 +65,24 @@ workshop = [ # "623475643", # eden enhanced ] -[Wardrobe_gm] -extends = "Wardrobe" +[wardrobe_gm] +extends = "wardrobe" dlc = ["gm"] -[Wardrobe_ws] -extends = "Wardrobe" +[wardrobe_ws] +extends = "wardrobe" dlc = ["Western Sahara"] -[Wardrobe_rf] -extends = "Wardrobe" +[wardrobe_rf] +extends = "wardrobe" dlc = ["Reaction Forces"] -[Wardrobe_sog] -extends = "Wardrobe" +[wardrobe_sog] +extends = "wardrobe" dlc = ["S.O.G. Prairie Fire"] -[Wardrobe_rhs] -extends = "Wardrobe" +[wardrobe_rhs] +extends = "wardrobe" workshop = [ "843425103", # RHS AFRF Workshop ID "843577117", # RHS USAF Workshop ID @@ -90,8 +90,8 @@ workshop = [ "843632231", # RHS SAF Workshop ID ] -[Wardrobe_cdlc] -extends = "Wardrobe" +[wardrobe_cdlc] +extends = "wardrobe" dlc = [ "vn", "gm", diff --git a/addons/wardrobe/dev/compareContainerMaxLoad.sqf b/addons/wardrobe/dev/compareContainerMaxLoad.sqf index 28e42fa6d90..8d6f2f7070a 100644 --- a/addons/wardrobe/dev/compareContainerMaxLoad.sqf +++ b/addons/wardrobe/dev/compareContainerMaxLoad.sqf @@ -1,7 +1,7 @@ #include "../script_component.hpp" /* * Author: OverlordZorn - * This debug script will compare the maxLoad of all modifiable Items with its modifiableTo Variants and will provide an RPT output. + * This debug script will compare the maxLoad of all modifiable Items with its modifiableTo variants and will provide an RPT output. * * Arguments: * None diff --git a/addons/wardrobe/functions/fnc_addActions.sqf b/addons/wardrobe/functions/fnc_addActions.sqf index aee9f24084c..0eccb7133c9 100644 --- a/addons/wardrobe/functions/fnc_addActions.sqf +++ b/addons/wardrobe/functions/fnc_addActions.sqf @@ -8,7 +8,7 @@ * 0: Unit * * Return Value: - * Array of ACE Child Actions + * ACE actions * * Example: * _player call ace_wardrobe_fnc_addActions diff --git a/addons/wardrobe/functions/fnc_addActionsChildren.sqf b/addons/wardrobe/functions/fnc_addActionsChildren.sqf index b4afbd3afbb..2be846511f8 100644 --- a/addons/wardrobe/functions/fnc_addActionsChildren.sqf +++ b/addons/wardrobe/functions/fnc_addActionsChildren.sqf @@ -4,14 +4,14 @@ * Function to create the ace action children, one for each possible variant of the current item. * * Arguments: - * 0: target - * 1: player + * 0: Target + * 1: Player * 2: Multiple input types - * - 0: Current Variant - * - 1: Array of Configs Possible Variants + * - 0: Current variant + * - 1: Array of configs possible variants * * Return Value: - * Array of ACE Child Actions + * Array of ace child actions * * Example: * _this call ace_wardrobe_fnc_addActionsChildren diff --git a/addons/wardrobe/functions/fnc_addActionsCondition.sqf b/addons/wardrobe/functions/fnc_addActionsCondition.sqf index a7d5841699d..a0b384c8ef0 100644 --- a/addons/wardrobe/functions/fnc_addActionsCondition.sqf +++ b/addons/wardrobe/functions/fnc_addActionsCondition.sqf @@ -4,7 +4,7 @@ * Condition check: Is wardrobe enabled & if the player has an item that can be modified * * Arguments: - * 0: _player from the Ace Action + * 0: Player * * Return Value: * condition diff --git a/addons/wardrobe/functions/fnc_addActionsIcon.sqf b/addons/wardrobe/functions/fnc_addActionsIcon.sqf index 4ac402cf770..fb7ad4c0c19 100644 --- a/addons/wardrobe/functions/fnc_addActionsIcon.sqf +++ b/addons/wardrobe/functions/fnc_addActionsIcon.sqf @@ -4,10 +4,10 @@ * This Function checks if the Target Item has an alternative Picture for the Action, if not, it returns the picture property * * Arguments: - * 0: Config of desired Variant + * 0: Config of desired variant * * Return Value: - * Path to Icon or "" + * Path to icon or "" * * Example: * _cfg call ace_wardrobe_fnc_getActionIcon diff --git a/addons/wardrobe/functions/fnc_addActionsName.sqf b/addons/wardrobe/functions/fnc_addActionsName.sqf index 6e296cc47ca..79604e6d47c 100644 --- a/addons/wardrobe/functions/fnc_addActionsName.sqf +++ b/addons/wardrobe/functions/fnc_addActionsName.sqf @@ -4,7 +4,7 @@ * This Function checks if the Target Item has an Alternative String for the Action, if not, it returns the displayName property * * Arguments: - * 0: Desired Variant + * 0: Desired variant * * Return Value: * The return value diff --git a/addons/wardrobe/functions/fnc_cacheGet.sqf b/addons/wardrobe/functions/fnc_cacheGet.sqf index be971831e83..262d2bedc1c 100644 --- a/addons/wardrobe/functions/fnc_cacheGet.sqf +++ b/addons/wardrobe/functions/fnc_cacheGet.sqf @@ -1,7 +1,7 @@ #include "../script_component.hpp" /* * Author: OverlordZorn - * To retrieve a value from the database. returns nil if not stored or, when provided, will execute the alternative code and return and store said result + * To retrieve a value from the database. returns nil if not stored or, when provided, will execute the alternative code. Result will be stored and returned. * * Arguments: * 0: Key diff --git a/addons/wardrobe/functions/fnc_cacheSet.sqf b/addons/wardrobe/functions/fnc_cacheSet.sqf index 07c1e742199..c38b60891bc 100644 --- a/addons/wardrobe/functions/fnc_cacheSet.sqf +++ b/addons/wardrobe/functions/fnc_cacheSet.sqf @@ -8,7 +8,7 @@ * 1: Value * * Return Value: - * success + * Success * * Example: * ['tag_myKey', ["some","data"]] call ace_wardrobe_fnc_cacheSet diff --git a/addons/wardrobe/functions/fnc_canModifyTo.sqf b/addons/wardrobe/functions/fnc_canModifyTo.sqf index 0568dca9fa1..eac9de1617d 100644 --- a/addons/wardrobe/functions/fnc_canModifyTo.sqf +++ b/addons/wardrobe/functions/fnc_canModifyTo.sqf @@ -5,12 +5,12 @@ * * Arguments: * 0: Unit - * 1: Current Variant - * 2: Desired Variant + * 1: Current variant + * 2: Desired variant * 3: Cache Result of fnc_getitemsAll (default: true) * * Return Value: - * The return value + * Result * * Example: * [_unit, _cfgOrigin, _cfgTarget] call ace_wardrobe_fnc_canModifyTo diff --git a/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf b/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf index c06ecb79315..148e591aa32 100644 --- a/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf +++ b/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf @@ -4,7 +4,7 @@ * Function to request the clearing of the cache upon closing of the menu * * Arguments: - * 0: The first argument + * 0: Key * * Return Value: * None diff --git a/addons/wardrobe/functions/fnc_compareComponents.sqf b/addons/wardrobe/functions/fnc_compareComponents.sqf index a76e091089a..630593de0a1 100644 --- a/addons/wardrobe/functions/fnc_compareComponents.sqf +++ b/addons/wardrobe/functions/fnc_compareComponents.sqf @@ -4,13 +4,13 @@ * Function to compare the components of the current and target wearables. * * Arguments: - * 0: current variant - * 1: desired variant + * 0: Current variant + * 1: Desired variant * * Return Value: * Nested array - * - configs of missing components - * - configs of surplus components + * - Configs of missing components + * - Configs of surplus components * * Example: * [_cfgOrigin, _cfgTarget] call ace_wardrobe_fnc_compareComponents diff --git a/addons/wardrobe/functions/fnc_enableContextMenu.sqf b/addons/wardrobe/functions/fnc_enableContextMenu.sqf index e7dc98323a1..b9fa7b04cc7 100644 --- a/addons/wardrobe/functions/fnc_enableContextMenu.sqf +++ b/addons/wardrobe/functions/fnc_enableContextMenu.sqf @@ -24,7 +24,7 @@ if (_enable && {!(missionNamespace getVariable [QGVAR(contextmenuEnabled), false [ "#ALL", "CLOTHES", - "Switch to next Variant", + "Switch to next variant", [], QPATHTOF(data\wardrobe_logo.paa), [ diff --git a/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf b/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf index fcafed9ca39..4204d1bc1a1 100644 --- a/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf +++ b/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf @@ -4,10 +4,10 @@ * Debug - Function to retrieve all existing Wardrobe items. * * Arguments: - * 0: Return as Config? (default: false) + * 0: Return as config? (default: false) * * Return Value: - * Array Wardobe Items, either as Classname or as Config + * Wardobe items, either as classname or config * * Example: * true call ace_wardrobe_fnc_getAllWardrobeItems; diff --git a/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf index 72b632d0fe5..b4828209d8f 100644 --- a/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf +++ b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf @@ -4,10 +4,10 @@ * function to return the data index based of the magazine ID * * Arguments: - * 0: magazine ID + * 0: Magazine ID * * Return Value: - * The return value + * Index * * Example: * _magID call ace_wardrobe_fnc_getIndexFromMagID diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf index 5a1244e0393..fc27cc26f7f 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf @@ -4,7 +4,7 @@ * Function to return an array the config of desired target items. Also checks if those items exist: CBA_fnc_getItemConfig returns configNull when item not found. * * Arguments: - * 0: Current Variant + * 0: Current variant * * Return Value: * Array of all possible variants as config diff --git a/addons/wardrobe/functions/fnc_isModifiable.sqf b/addons/wardrobe/functions/fnc_isModifiable.sqf index 108789cdf4f..acc023b725c 100644 --- a/addons/wardrobe/functions/fnc_isModifiable.sqf +++ b/addons/wardrobe/functions/fnc_isModifiable.sqf @@ -4,10 +4,10 @@ * Function to check if the provided wearable Item (Config) can be modified through ace_wardrobe. * * Arguments: - * 0: Wearable Item + * 0: Wearable item * * Return Value: - * The return value + * Result * * Example: * _cfg call ace_wardrobe_fnc_isModifiable diff --git a/addons/wardrobe/functions/fnc_nextVariantDo.sqf b/addons/wardrobe/functions/fnc_nextVariantDo.sqf index c53cd65acc8..12330ef2106 100644 --- a/addons/wardrobe/functions/fnc_nextVariantDo.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantDo.sqf @@ -1,7 +1,7 @@ #include "../script_component.hpp" /* * Author: OverlordZorn - * Statement of CBA Context Menu Entry - Request the Next Variant. + * Statement of CBA Context Menu Entry - Request the next variant. * * Arguments: * 0: Player @@ -11,7 +11,7 @@ * 4: Arguments * * Return Value: - * nothing + * None * * Example: * [_unit, _container, _item, _slot, _params] call ace_wardrobe_fnc_nextVariantDo; diff --git a/addons/wardrobe/functions/fnc_nextVariantGet.sqf b/addons/wardrobe/functions/fnc_nextVariantGet.sqf index f41a5dc7209..016d8d8c111 100644 --- a/addons/wardrobe/functions/fnc_nextVariantGet.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantGet.sqf @@ -1,16 +1,16 @@ #include "../script_component.hpp" /* * Author: OverlordZorn - * Context Menu - Return config the "next" variant - if multiple Variants are defined, it will choose randomly. - * Maintains a History of the current and chosen variants as long as the Inventory is open. - * Already used variants from the History will be removed from the availabe options. + * Context Menu - Return config the "next" variant - if multiple variants are defined, it will choose randomly. + * Maintains a history of the current and chosen variants as long as the inventory is open. + * Already used variants from the hstory will be removed from the availabe options. * Once all options have been exhausted, the history will be purged and start over. * * Arguments: - * 0: Current Variant + * 0: Current variant * * Return Value: - * Desired Variant + * Desired variant * * Example: * _cfgCurrent call ace_wardrobe_fnc_nextVariantGet diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 3deaf411100..fa9c59d65ea 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -4,11 +4,11 @@ * Ace Action Statement - Removes the modifiableItem and replaces it with the target item * * Arguments: - * 0: Action Target - * 1: Action Player - * 2: Action Params - * - 0: Current Variant - * - 0: Desired Variant + * 0: Action target + * 1: Action player + * 2: Action params + * - 0: Current variant + * - 0: Desired variant * 3: Replace Now? (default: false) * * Return Value: @@ -47,9 +47,10 @@ private _replaceCode = switch ( _typeNumber ) do { if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 - %2",_typeNumber,configName _cfgOrigin); }; [ _replaceCode, [_unit, _cfgOrigin, _cfgTarget, _additionalParams ], _duration] call CBA_fnc_waitAndExecute; -//// Handle Components -// Add Surplus +//// Handle components [_cfgOrigin, _cfgTarget] call FUNC(compareComponents) params ["_missing", "_surplus"]; + +// Add Surplus { if (configName _cfgTarget isNotEqualTo _x) then { if ( isClass (configFile >> "CfgGlasses" >> _x) && { goggles _unit isEqualTo "" } ) then { diff --git a/addons/wardrobe/functions/fnc_replaceContainer.sqf b/addons/wardrobe/functions/fnc_replaceContainer.sqf index 629ace716aa..3d4ebf99c7a 100644 --- a/addons/wardrobe/functions/fnc_replaceContainer.sqf +++ b/addons/wardrobe/functions/fnc_replaceContainer.sqf @@ -5,8 +5,8 @@ * * Arguments: * 0: Unit - * 1: Current Variant - * 2: Desired Variant + * 1: Current variant + * 2: Desired variant * 2: Type of Wearable Container * * Return Value: @@ -56,7 +56,7 @@ INTEL_POST(_hasNotepad,acex_intelitems_notepad); INTEL_POST(_hasPhoto,acex_intelitems_photo); // ACE Overheating -if (_hasSpareBarrel isEqualType [] ) then { +if (_hasSpareBarrel isEqualType []) then { private _newMagIDsSpareBarrel = [_player, "ACE_SpareBarrel"] call CBA_fnc_getMagazineIndex; [QGVAR(updateMagIDs), [_hasSpareBarrel, _newMagIDsSpareBarrel]] call CBA_fnc_serverEvent; }; diff --git a/addons/wardrobe/functions/fnc_replaceOther.sqf b/addons/wardrobe/functions/fnc_replaceOther.sqf index 1a37d5ad98c..6b5159bfc5a 100644 --- a/addons/wardrobe/functions/fnc_replaceOther.sqf +++ b/addons/wardrobe/functions/fnc_replaceOther.sqf @@ -5,8 +5,8 @@ * * Arguments: * 0: Unit - * 1: Current Variant - * 2: Desired Variant + * 1: Current variant + * 2: Desired variant * * Return Value: * None diff --git a/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf b/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf index a81e62608c9..f14b2ecfd41 100644 --- a/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf +++ b/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf @@ -1,14 +1,14 @@ #include "../script_component.hpp" /* * Author: OverlordZorn - * Function to update ACE Overheating's Serverside SpareBarrel DataBase with new MagIDs. + * Function to update ACE Overheating's serverside spareBarrel database with new magIDs. * * Arguments: - * 0: old magIDs - * 1: new magIDs + * 0: Old magIDs + * 1: New magIDs * * Return Value: - * The return value + * None * * Example: * [_old, _new] call ace_wardrobe_fnc_spareBarrelUpdateMagIDs @@ -30,3 +30,5 @@ private _map = EGVAR(overheating,storedSpareBarrels); _map set [ _newMagIDs # _forEachIndex , _map deleteAt _oldID ]; } forEach _oldMagIDs; + +nil From dfbeda225116dd57ce2f927bf112df6cb62608ee Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 25 May 2025 17:27:03 +0200 Subject: [PATCH 232/305] Update fnc_clearOnClosedInteractionMenu.sqf --- .../fnc_clearOnClosedInteractionMenu.sqf | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf b/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf index 148e591aa32..2b2d58556c2 100644 --- a/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf +++ b/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf @@ -17,10 +17,9 @@ params [ ["_key", "", [""]] ]; -private _queue = missionNamespace getVariable [QGVAR(menuClearQueue), ""]; -if (_queue isEqualTo "") then { - _queue = []; +if (isNil QGVAR(menuClearQueue)) then { + [ "ace_interactMenuClosed", { @@ -32,9 +31,13 @@ if (_queue isEqualTo "") then { [_thisType, _thisId] call CBA_fnc_removeEventHandler; } ] call CBA_fnc_addEventHandlerArgs; - missionNamespace setVariable [QGVAR(menuClearQueue), _queue]; -}; -_queue pushBackUnique _key; + GVAR(menuClearQueue) = [_key]; + +} else { + + GVAR(menuClearQueue) pushBackUnique _key; + +}; nil From ef0ef9ee959655bacd4ce19d545ebee3fa6d4905 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 25 May 2025 17:52:56 +0200 Subject: [PATCH 233/305] getAllWardrobeItems -> /dev/ --- .hemtt/missions/Wardrobe.VR/mission.sqm | 21 ++++++++-------- addons/wardrobe/XEH_PREP.hpp | 2 -- .../wardrobe/dev/compareContainerMaxLoad.sqf | 2 +- addons/wardrobe/dev/getAllWardrobeItems.sqf | 20 ++++++++++++++++ .../functions/fnc_getAllWardrobeItems.sqf | 24 ------------------- 5 files changed, 32 insertions(+), 37 deletions(-) create mode 100644 addons/wardrobe/dev/getAllWardrobeItems.sqf delete mode 100644 addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf diff --git a/.hemtt/missions/Wardrobe.VR/mission.sqm b/.hemtt/missions/Wardrobe.VR/mission.sqm index 1010aff970d..f5dcb1929d7 100644 --- a/.hemtt/missions/Wardrobe.VR/mission.sqm +++ b/.hemtt/missions/Wardrobe.VR/mission.sqm @@ -12,10 +12,10 @@ class EditorData }; class Camera { - pos[]={10.750697,7.5298214,-16.120056}; - dir[]={0.78896397,-0.42873386,-0.44013983}; - up[]={0.37441224,0.90343088,-0.20887361}; - aside[]={-0.48718709,-1.4901161e-08,-0.87329757}; + pos[]={27.77986,9.3148928,-11.992753}; + dir[]={-0.82791728,-0.44389084,-0.34282935}; + up[]={-0.41012207,0.89607823,-0.16982619}; + aside[]={-0.38258561,-4.6566129e-09,0.92392808}; }; }; binarizationWanted=0; @@ -118,7 +118,7 @@ class Mission dataType="Object"; class PositionInfo { - position[]={16,5,-12}; + position[]={20,5,-16}; }; side="Empty"; flags=4; @@ -133,13 +133,14 @@ class Mission dataType="Object"; class PositionInfo { - position[]={17.833,5.2840548,-13.012}; + position[]={16,5.2840548,-14}; + angles[]={0,4.7497735,-0}; }; side="Empty"; flags=4; class Attributes { - init="[this, flatten ([] call ACE_WARDROBE_fnc_getAllWardrobeItems)] call ace_arsenal_fnc_initBox;"; + init="[this, call compile preprocessFileLineNumbers 'z\ace\addons\wardrobe\dev\getAllWardrobeItems.sqf'] call ace_arsenal_fnc_initBox;"; }; id=197; type="ACE_Box_Ammo"; @@ -269,8 +270,8 @@ class Mission dataType="Object"; class PositionInfo { - position[]={18.822828,5,-13.759856}; - angles[]={0,1.0776811,0}; + position[]={18,5,-14}; + angles[]={-0,1.0776811,0}; }; side="Empty"; flags=4; @@ -285,7 +286,7 @@ class Mission dataType="Object"; class PositionInfo { - position[]={17.528999,5.0073819,-17.298}; + position[]={20,5.0073819,-18}; }; side="Empty"; flags=4; diff --git a/addons/wardrobe/XEH_PREP.hpp b/addons/wardrobe/XEH_PREP.hpp index 70c078e5386..3e9272fac06 100644 --- a/addons/wardrobe/XEH_PREP.hpp +++ b/addons/wardrobe/XEH_PREP.hpp @@ -25,8 +25,6 @@ PREP(addActionsIcon); PREP(cacheGet); PREP(cacheSet); PREP(clearOnClosedInteractionMenu); -// Debug -PREP(getAllWardrobeItems); // CBA Context Menu PREP(enableContextMenu); PREP(nextVariantDo); diff --git a/addons/wardrobe/dev/compareContainerMaxLoad.sqf b/addons/wardrobe/dev/compareContainerMaxLoad.sqf index 8d6f2f7070a..5c90c6dc35d 100644 --- a/addons/wardrobe/dev/compareContainerMaxLoad.sqf +++ b/addons/wardrobe/dev/compareContainerMaxLoad.sqf @@ -15,7 +15,7 @@ * Public: no */ -private _allWardrobeItems = true call FUNC(getAllWardrobeItems) select { +private _allWardrobeItems = flatten ( ["CfgWeapons", "CfgGlasses"] apply { ( QUOTE(_x call FUNC(isModifiable)) configClasses (configFile >> _x) ) } ) select { switch ( getNumber (_x >> "ItemInfo" >> "type") ) do { case TYPE_GOGGLE: { false; }; case TYPE_HEADGEAR: { false; }; diff --git a/addons/wardrobe/dev/getAllWardrobeItems.sqf b/addons/wardrobe/dev/getAllWardrobeItems.sqf new file mode 100644 index 00000000000..0d442f41bc2 --- /dev/null +++ b/addons/wardrobe/dev/getAllWardrobeItems.sqf @@ -0,0 +1,20 @@ +#include "../script_component.hpp" +/* + * Author: OverlordZorn + * Debug - Script to retrieve all existing Wardrobe items. + * + * Arguments: + * None + * + * Return Value: + * Wardobe items, either as classname or config + * + * Example: + * true call ace_wardrobe_fnc_getAllWardrobeItems; + * call compile preprocessFileLineNumbers "z\ace\addons\wardrobe\dev\getAllWardrobeItems.sqf"; + * + * Public: Yes + */ + + +flatten ( ["CfgWeapons", "CfgGlasses"] apply { ( QUOTE(_x call FUNC(isModifiable)) configClasses (configFile >> _x) ) } ) apply { configName _x } diff --git a/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf b/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf deleted file mode 100644 index 4204d1bc1a1..00000000000 --- a/addons/wardrobe/functions/fnc_getAllWardrobeItems.sqf +++ /dev/null @@ -1,24 +0,0 @@ -#include "../script_component.hpp" -/* - * Author: OverlordZorn - * Debug - Function to retrieve all existing Wardrobe items. - * - * Arguments: - * 0: Return as config? (default: false) - * - * Return Value: - * Wardobe items, either as classname or config - * - * Example: - * true call ace_wardrobe_fnc_getAllWardrobeItems; - * [this, flatten ([] call ace_wardrobe_fnc_getAllWardrobeItems)] call ace_arsenal_fnc_initBox; - * - * Public: Yes - */ - - -params [["_asConfig", false, [true]]]; - -private _return = flatten ( ["CfgWeapons", "CfgGlasses"] apply { ( QUOTE(_x call FUNC(isModifiable)) configClasses (configFile >> _x) ) } ); - -if (_asConfig) then { _return } else { _return apply { configName _x } } From 0184d400b8750adb30e2da4b2223b7d40edd9e28 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Sun, 25 May 2025 18:10:08 +0200 Subject: [PATCH 234/305] Update docs/wiki/framework/wardrobe-framework.md Co-authored-by: johnb432 <58661205+johnb432@users.noreply.github.com> --- docs/wiki/framework/wardrobe-framework.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index 99f4a41c6ff..3003e17bbc2 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -24,7 +24,7 @@ Since there is no reliable, common patterns in terms of class inheritance, not e ### 1.1 Components Components are an optional assistance to define a group of variants where a variant is made of one or more components. -For example, a bandanna with sunglasses would have the the bandanna and the sunglasses as components, while the bandanna and sunglasses themself only have themselves as a component. +For example, a bandana with sunglasses would have the the bandana and the sunglasses as components, while the bandana and sunglasses only have themselves as a component. If the player switches from a variant with more components to a variant with less components, the surplus components will be deposited in their inventory. Vice Versa, if the player wants to change from a variant with less components to a variant with more components, they are required to have the missing components in their inventory, which will be removed on conversion. From 8d1026124e11e82907f7dbc8760b1d29b20d36d5 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 25 May 2025 18:12:33 +0200 Subject: [PATCH 235/305] Fix Logic: isEqualTo -> isNotEqualTo --- addons/wardrobe/functions/fnc_addActionsCondition.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_addActionsCondition.sqf b/addons/wardrobe/functions/fnc_addActionsCondition.sqf index a0b384c8ef0..58833d1d50b 100644 --- a/addons/wardrobe/functions/fnc_addActionsCondition.sqf +++ b/addons/wardrobe/functions/fnc_addActionsCondition.sqf @@ -20,5 +20,5 @@ params ["_player"]; missionNamespace getVariable [QGVAR(enableAction), false] && { - _player call FUNC(getItemsModifiableCurrent) isEqualTo [] + _player call FUNC(getItemsModifiableCurrent) isNotEqualTo [] } From 3bead58f187aac538ae11b8398fbdfe9ef2f9c6e Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 25 May 2025 18:21:06 +0200 Subject: [PATCH 236/305] Update wardrobe-framework.md --- docs/wiki/framework/wardrobe-framework.md | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index 3003e17bbc2..3e1523d380a 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -30,16 +30,6 @@ If the player switches from a variant with more components to a variant with les More examples can be found below. -### 1.2 Config Guidelines - -- A Container (uniform, vest, backpack) should never change its `maximumLoad`, unless there is a really good reason for it. This will result in the loss of items. -- Variants should not "magically" add/remove parts to/from themselves, unless it's handled through a component, especially when they add protection or functionality. - - Do: Uniforms with and without gloves should be fine in most cases, as they are cosmetical and don't break continuity/logic. - - Do: Helmets with integral flip-down visors. - - Don't: Helmet with additional armor or face protector without the requirement of some component that will be removed from the inventory. -- There should not be a difference in weight or container capacity between the different variants unless components get added/removed. - - For Example: `Mass of helmet with goggles = mass of helmet + mass of goggles.` - ## 2. Config Only directly defined subclasses will be taken into account. A fully inherited subclass will be ignored and will not provide any interaction. The `ace_wardrobe` properties are to be found as a subclass of the item itself. Multiple base configs are designed at root of `configFile`. From 58c0a665107e0a922e65b6adf027e2995d507cca Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Tue, 3 Jun 2025 02:36:02 +0200 Subject: [PATCH 237/305] Update addons/wardrobe/stringtable.xml Co-authored-by: johnb432 <58661205+johnb432@users.noreply.github.com> --- addons/wardrobe/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml index 9e4cdffb81c..37e6e6f7e07 100644 --- a/addons/wardrobe/stringtable.xml +++ b/addons/wardrobe/stringtable.xml @@ -4,7 +4,7 @@ Wardrobe - Gaderobe + Garderobe Take gloves off From 28c7d1b898896c079d49d02c9ea5a9b56359cb83 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Tue, 3 Jun 2025 02:36:29 +0200 Subject: [PATCH 238/305] Update addons/wardrobe/stringtable.xml Co-authored-by: johnb432 <58661205+johnb432@users.noreply.github.com> --- addons/wardrobe/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml index 37e6e6f7e07..72af807c05e 100644 --- a/addons/wardrobe/stringtable.xml +++ b/addons/wardrobe/stringtable.xml @@ -61,7 +61,7 @@ ACE Wardrobe - ACE Gaderobe + ACE Garderobe From 1a215bec721f7070dc40b55c8b8a3eaef366f840 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Tue, 3 Jun 2025 02:36:52 +0200 Subject: [PATCH 239/305] Update addons/wardrobe/initSettings.inc.sqf Co-authored-by: johnb432 <58661205+johnb432@users.noreply.github.com> --- addons/wardrobe/initSettings.inc.sqf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/wardrobe/initSettings.inc.sqf b/addons/wardrobe/initSettings.inc.sqf index 0167c05f63e..10365db3940 100644 --- a/addons/wardrobe/initSettings.inc.sqf +++ b/addons/wardrobe/initSettings.inc.sqf @@ -16,6 +16,5 @@ [LSTRING(set_cat_main)], true, 1, - FUNC(enableContextMenu), - false + LINKFUNC(enableContextMenu) ] call CBA_fnc_addSetting; From 31b47a0d755512624fab1da1092a5933f93733b6 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Tue, 3 Jun 2025 13:31:43 +0200 Subject: [PATCH 240/305] Update addons/wardrobe/functions/fnc_canModifyTo.sqf Co-authored-by: johnb432 <58661205+johnb432@users.noreply.github.com> --- addons/wardrobe/functions/fnc_canModifyTo.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_canModifyTo.sqf b/addons/wardrobe/functions/fnc_canModifyTo.sqf index eac9de1617d..6041cba73f7 100644 --- a/addons/wardrobe/functions/fnc_canModifyTo.sqf +++ b/addons/wardrobe/functions/fnc_canModifyTo.sqf @@ -24,4 +24,4 @@ params ["_unit", "_cfgOrigin", "_cfgTarget", ["_cache", true, [true]]]; private _currentItems = [_unit, _cache] call FUNC(getItemsAll); -_missing select { ! (_x in _currentItems) } isEqualTo [] \ No newline at end of file +_missing select { ! (_x in _currentItems) } isEqualTo [] // return From f077e0e257711baa526a0ebd2bdcbdeb6658d31d Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Tue, 3 Jun 2025 13:32:38 +0200 Subject: [PATCH 241/305] Update addons/wardrobe/functions/fnc_replace.sqf Co-authored-by: johnb432 <58661205+johnb432@users.noreply.github.com> --- addons/wardrobe/functions/fnc_replace.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index fa9c59d65ea..c9078498698 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -89,7 +89,7 @@ if (_sound isNotEqualTo "") then { // Notification private _imgNotify = getText (_cfgTarget >> "picture"); -if !(".paa" in _imgNotify) then { _imgNotify = [_imgNotify, "paa"] joinString "." }; // Some vanilla items dont have the .paa and cba notify will display the path as a string without the .paa +if !(".paa" in _imgNotify) then { _imgNotify = _imgNotify + ".paa }; // some vanilla items dont have the .paa and cba notify will display the path as a string without the .paa [EFUNC(common,displayTextStructured), [["
%2", _imgNotify, getText (_cfgTarget >> "displayName")], 4], _duration * 1.2] call CBA_fnc_waitAndExecute; nil From abc7ce5f1dc8976c4976419420ce4a21961c95ef Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 3 Jun 2025 13:37:45 +0200 Subject: [PATCH 242/305] fix capitalization --- .../functions/fnc_compareComponents.sqf | 6 +++--- .../wardrobe/functions/fnc_nextVariantGet.sqf | 2 +- addons/wardrobe/functions/fnc_replace.sqf | 20 +++++++++---------- .../functions/fnc_replaceContainer.sqf | 18 ++++++++--------- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/addons/wardrobe/functions/fnc_compareComponents.sqf b/addons/wardrobe/functions/fnc_compareComponents.sqf index 630593de0a1..42534ac847d 100644 --- a/addons/wardrobe/functions/fnc_compareComponents.sqf +++ b/addons/wardrobe/functions/fnc_compareComponents.sqf @@ -21,9 +21,9 @@ params ["_cfgOrigin", "_cfgTarget"]; private _checkfallbackComponent = { - // Check if item is present within current modpack. - // If not, will look-up if item is defined within ace_Wardrobe and has an fallbackComponent defined. - // If not, the component will be fully ignored. + // check if item is present within current modpack. + // if not, will look-up if item is defined within ace_Wardrobe and has an fallbackComponent defined. + // if not, the component will be fully ignored. if (isNull (_x call CBA_fnc_getItemConfig)) then { getText (configFile >> QUOTE(ADDON) >> _x >> "fallbackComponent"); } else { diff --git a/addons/wardrobe/functions/fnc_nextVariantGet.sqf b/addons/wardrobe/functions/fnc_nextVariantGet.sqf index 016d8d8c111..351968ff45e 100644 --- a/addons/wardrobe/functions/fnc_nextVariantGet.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantGet.sqf @@ -45,7 +45,7 @@ private _remaining = _cfgModifiableTo - _cfgHistory; _remaining = _remaining select { [ACE_player, _cfgCurrent, _x] call FUNC(canModifyTo) }; -// Returns either a random remaining item or alternatively, a random one from the complete array. +// returns either a random remaining item or alternatively, a random one from the complete array. private _return = if (_remaining isNotEqualTo []) then { selectRandom _remaining } else { diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index fa9c59d65ea..ae98e4e5b81 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -23,11 +23,11 @@ params ["_target", "_unit", "_actionParams", ["_replaceNow", false, [true]]]; _actionParams params ["_cfgOrigin", "_cfgTarget"]; -// Duration of the "animation" +// duration of the "animation" private _duration = getNumber (configFile >> QUOTE(ADDON) >> configName _cfgTarget >> "duration"); if (_replaceNow) then { _duration = 0; }; // needed for cba context menu - avoid potential duplications and such -// Replace the Main Item. +// replace the Main Item. private _additionalParams = ""; private _typeNumber = getNumber (_cfgOrigin >> "ItemInfo" >> "type"); private _replaceCode = switch ( _typeNumber ) do { @@ -36,7 +36,7 @@ private _replaceCode = switch ( _typeNumber ) do { case TYPE_VEST: { _additionalParams = "VEST"; FUNC(replaceContainer) }; case TYPE_BACKPACK: { _additionalParams = "BACKPACK"; FUNC(replaceContainer) }; default { - // CfgGlasses items do not have a ItemInfo Subclass and therefore, not TypeNumber. + // CfgGlasses items do not have a ItemInfo subclass and therefore, not typeNumber. switch (true) do { case (isClass (configFile >> "CfgGlasses" >> configName _cfgOrigin)): { _additionalParams = "FACEWEAR"; FUNC(replaceOther) }; default { false }; @@ -47,10 +47,10 @@ private _replaceCode = switch ( _typeNumber ) do { if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 - %2",_typeNumber,configName _cfgOrigin); }; [ _replaceCode, [_unit, _cfgOrigin, _cfgTarget, _additionalParams ], _duration] call CBA_fnc_waitAndExecute; -//// Handle components +//// handle components [_cfgOrigin, _cfgTarget] call FUNC(compareComponents) params ["_missing", "_surplus"]; -// Add Surplus +// add surplus { if (configName _cfgTarget isNotEqualTo _x) then { if ( isClass (configFile >> "CfgGlasses" >> _x) && { goggles _unit isEqualTo "" } ) then { @@ -61,7 +61,7 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 }; } forEach _surplus; -// Remove Missing +// remove missing { if (configName _cfgOrigin isNotEqualTo _x) then { @@ -73,11 +73,11 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 } forEach _missing; -//// Handle Effects -// Animation/Gestures +//// handle effects +// animation/gestures [ _unit, getText (configFile >> QUOTE(ADDON) >> configName _cfgTarget >> "gesture") ] call EFUNC(common,doGesture); -// Plays Random Sound At the Beginning +// plays random sound at the beginning private _sound = [configFile >> QUOTE(ADDON) >> configName _cfgTarget >> "sound"] call CBA_fnc_getCfgDataRandom; if (_sound isNotEqualTo "") then { [ @@ -87,7 +87,7 @@ if (_sound isNotEqualTo "") then { ] call CBA_fnc_waitAndExecute; }; -// Notification +// notification private _imgNotify = getText (_cfgTarget >> "picture"); if !(".paa" in _imgNotify) then { _imgNotify = [_imgNotify, "paa"] joinString "." }; // Some vanilla items dont have the .paa and cba notify will display the path as a string without the .paa [EFUNC(common,displayTextStructured), [["
%2", _imgNotify, getText (_cfgTarget >> "displayName")], 4], _duration * 1.2] call CBA_fnc_waitAndExecute; diff --git a/addons/wardrobe/functions/fnc_replaceContainer.sqf b/addons/wardrobe/functions/fnc_replaceContainer.sqf index 3d4ebf99c7a..9803c7106b8 100644 --- a/addons/wardrobe/functions/fnc_replaceContainer.sqf +++ b/addons/wardrobe/functions/fnc_replaceContainer.sqf @@ -25,19 +25,19 @@ private _magazineDetails = (magazinesAmmoFull _player) apply { [_x#0, _x#-2, _x# private _loadout = _player call CBA_fnc_getLoadout; -//// Handle Special Cases - Pre Replace -// ACE Intel Items +//// handle special cases - pre replace +// ace intel items INTEL_PRE(_hasDocument,acex_intelitems_document); INTEL_PRE(_hasNotepad,acex_intelitems_notepad); INTEL_PRE(_hasPhoto,acex_intelitems_photo); -// ACE Overheating +// ace overheating private _hasSpareBarrel = _magazineDetails findIf { _x#0 isEqualTo "ACE_SpareBarrel" } > -1; if (_hasSpareBarrel) then { _hasSpareBarrel = [_player, "ACE_SpareBarrel" ] call CBA_fnc_getMagazineIndex }; -//// Replace Wearable -// Change Wearable +//// replace wearable +// change wearable switch (_case) do { case "UNIFORM": { _loadout # 0 # 3 set [0, configName _cfgTarget]; }; case "VEST": { _loadout # 0 # 4 set [0, configName _cfgTarget]; }; @@ -45,17 +45,17 @@ switch (_case) do { default { ERROR_1("Case undefined: %1",_case); }; }; -// Apply new Loadout +// apply new loadout [_player, _loadout] call CBA_fnc_setLoadout; -//// Handle Special Cases - Post Replace -// ACE Intel Items +//// handle special cases - post replace +// ace intel items INTEL_POST(_hasDocument,acex_intelitems_document); INTEL_POST(_hasNotepad,acex_intelitems_notepad); INTEL_POST(_hasPhoto,acex_intelitems_photo); -// ACE Overheating +// ace overheating if (_hasSpareBarrel isEqualType []) then { private _newMagIDsSpareBarrel = [_player, "ACE_SpareBarrel"] call CBA_fnc_getMagazineIndex; [QGVAR(updateMagIDs), [_hasSpareBarrel, _newMagIDsSpareBarrel]] call CBA_fnc_serverEvent; From 7be9256688194e342bb386a9e6f961bd615d1213 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 3 Jun 2025 13:41:58 +0200 Subject: [PATCH 243/305] configName x -> _classX --- addons/wardrobe/functions/fnc_replace.sqf | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index ae98e4e5b81..d8fffe3c21a 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -23,8 +23,11 @@ params ["_target", "_unit", "_actionParams", ["_replaceNow", false, [true]]]; _actionParams params ["_cfgOrigin", "_cfgTarget"]; +private _classTarget = configName _cfgTarget; +private _classOrigin = configName _cfgOrigin; + // duration of the "animation" -private _duration = getNumber (configFile >> QUOTE(ADDON) >> configName _cfgTarget >> "duration"); +private _duration = getNumber (configFile >> QUOTE(ADDON) >> _classTarget >> "duration"); if (_replaceNow) then { _duration = 0; }; // needed for cba context menu - avoid potential duplications and such // replace the Main Item. @@ -38,13 +41,13 @@ private _replaceCode = switch ( _typeNumber ) do { default { // CfgGlasses items do not have a ItemInfo subclass and therefore, not typeNumber. switch (true) do { - case (isClass (configFile >> "CfgGlasses" >> configName _cfgOrigin)): { _additionalParams = "FACEWEAR"; FUNC(replaceOther) }; + case (isClass (configFile >> "CfgGlasses" >> _classOrigin)): { _additionalParams = "FACEWEAR"; FUNC(replaceOther) }; default { false }; }; }; }; -if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 - %2",_typeNumber,configName _cfgOrigin); }; +if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 - %2",_typeNumber,_classOrigin); }; [ _replaceCode, [_unit, _cfgOrigin, _cfgTarget, _additionalParams ], _duration] call CBA_fnc_waitAndExecute; //// handle components @@ -52,7 +55,7 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 // add surplus { - if (configName _cfgTarget isNotEqualTo _x) then { + if (_classTarget isNotEqualTo _x) then { if ( isClass (configFile >> "CfgGlasses" >> _x) && { goggles _unit isEqualTo "" } ) then { _unit addGoggles _x; } else { @@ -63,7 +66,7 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 // remove missing { - if (configName _cfgOrigin isNotEqualTo _x) then { + if (_classOrigin isNotEqualTo _x) then { switch (true) do { case (goggles _unit isEqualTo _x): { removeGoggles _unit; }; @@ -75,15 +78,15 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 //// handle effects // animation/gestures -[ _unit, getText (configFile >> QUOTE(ADDON) >> configName _cfgTarget >> "gesture") ] call EFUNC(common,doGesture); +[ _unit, getText (configFile >> QUOTE(ADDON) >> _classTarget >> "gesture") ] call EFUNC(common,doGesture); // plays random sound at the beginning -private _sound = [configFile >> QUOTE(ADDON) >> configName _cfgTarget >> "sound"] call CBA_fnc_getCfgDataRandom; +private _sound = [configFile >> QUOTE(ADDON) >> _classTarget >> "sound"] call CBA_fnc_getCfgDataRandom; if (_sound isNotEqualTo "") then { [ CBA_fnc_globalSay3D, [_unit, _sound, nil, true, true], - (getNumber (configFile >> QUOTE(ADDON) >> configName _cfgTarget >> "sound_timing") max 0 min 1) * _duration + (getNumber (configFile >> QUOTE(ADDON) >> _classTarget >> "sound_timing") max 0 min 1) * _duration ] call CBA_fnc_waitAndExecute; }; From 094ca8ab4cbcea441261f39f678d21c97a5c987b Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Tue, 3 Jun 2025 13:44:01 +0200 Subject: [PATCH 244/305] Update addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf Co-authored-by: johnb432 <58661205+johnb432@users.noreply.github.com> --- addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf b/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf index f14b2ecfd41..859a5a8b169 100644 --- a/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf +++ b/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf @@ -28,7 +28,6 @@ private _map = EGVAR(overheating,storedSpareBarrels); private _oldID = _x; if !(_oldID in _map) then { continue }; _map set [ _newMagIDs # _forEachIndex , _map deleteAt _oldID ]; - } forEach _oldMagIDs; nil From 3d1e3138d0e72ff67cebd602e1843eef5c64ec81 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 3 Jun 2025 13:57:06 +0200 Subject: [PATCH 245/305] fixes within fnc_replace - _additionalParams -> _equipmentType - rm unneeded error - rm unused params - fix fnc headers --- addons/wardrobe/functions/fnc_replace.sqf | 14 +++++++------- addons/wardrobe/functions/fnc_replaceContainer.sqf | 12 +++++------- addons/wardrobe/functions/fnc_replaceOther.sqf | 12 ++++++------ .../functions/fnc_spareBarrelUpdateMagIDs.sqf | 1 - 4 files changed, 18 insertions(+), 21 deletions(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 590960a606d..b6cfe0b9336 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -31,24 +31,24 @@ private _duration = getNumber (configFile >> QUOTE(ADDON) >> _classTarget >> "du if (_replaceNow) then { _duration = 0; }; // needed for cba context menu - avoid potential duplications and such // replace the Main Item. -private _additionalParams = ""; +private _equipmentType = ""; private _typeNumber = getNumber (_cfgOrigin >> "ItemInfo" >> "type"); private _replaceCode = switch ( _typeNumber ) do { - case TYPE_HEADGEAR: { _additionalParams = "HEADGEAR"; FUNC(replaceOther) }; - case TYPE_UNIFORM: { _additionalParams = "UNIFORM"; FUNC(replaceContainer) }; - case TYPE_VEST: { _additionalParams = "VEST"; FUNC(replaceContainer) }; - case TYPE_BACKPACK: { _additionalParams = "BACKPACK"; FUNC(replaceContainer) }; + case TYPE_HEADGEAR: { _equipmentType = "HEADGEAR"; FUNC(replaceOther) }; + case TYPE_UNIFORM: { _equipmentType = "UNIFORM"; FUNC(replaceContainer) }; + case TYPE_VEST: { _equipmentType = "VEST"; FUNC(replaceContainer) }; + case TYPE_BACKPACK: { _equipmentType = "BACKPACK"; FUNC(replaceContainer) }; default { // CfgGlasses items do not have a ItemInfo subclass and therefore, not typeNumber. switch (true) do { - case (isClass (configFile >> "CfgGlasses" >> _classOrigin)): { _additionalParams = "FACEWEAR"; FUNC(replaceOther) }; + case (isClass (configFile >> "CfgGlasses" >> _classOrigin)): { _equipmentType = "FACEWEAR"; FUNC(replaceOther) }; default { false }; }; }; }; if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 - %2",_typeNumber,_classOrigin); }; -[ _replaceCode, [_unit, _cfgOrigin, _cfgTarget, _additionalParams ], _duration] call CBA_fnc_waitAndExecute; +[ _replaceCode, [_unit, _cfgTarget, _equipmentType ], _duration] call CBA_fnc_waitAndExecute; //// handle components [_cfgOrigin, _cfgTarget] call FUNC(compareComponents) params ["_missing", "_surplus"]; diff --git a/addons/wardrobe/functions/fnc_replaceContainer.sqf b/addons/wardrobe/functions/fnc_replaceContainer.sqf index 9803c7106b8..ba9cd0ae8dd 100644 --- a/addons/wardrobe/functions/fnc_replaceContainer.sqf +++ b/addons/wardrobe/functions/fnc_replaceContainer.sqf @@ -5,20 +5,19 @@ * * Arguments: * 0: Unit - * 1: Current variant - * 2: Desired variant - * 2: Type of Wearable Container + * 1: Desired variant + * 2: Type of wearable container * * Return Value: * None * * Example: - * [_player, _cfgOrigin, _cfgTarget, _case] call ace_wardrobe_fnc_replaceContainer + * [_player, _cfgTarget, _equipmentType] call ace_wardrobe_fnc_replaceContainer * * Public: No */ -params ["_player", "_cfgOrigin", "_cfgTarget", "_case"]; +params ["_player", "_cfgTarget", "_equipmentType"]; toFixed 0; private _magazineDetails = (magazinesAmmoFull _player) apply { [_x#0, _x#-2, _x#-1] }; @@ -38,11 +37,10 @@ if (_hasSpareBarrel) then { _hasSpareBarrel = [_player, "ACE_SpareBarrel" ] call //// replace wearable // change wearable -switch (_case) do { +switch (_equipmentType) do { case "UNIFORM": { _loadout # 0 # 3 set [0, configName _cfgTarget]; }; case "VEST": { _loadout # 0 # 4 set [0, configName _cfgTarget]; }; case "BACKPACK": { _loadout # 0 # 5 set [0, configName _cfgTarget]; }; - default { ERROR_1("Case undefined: %1",_case); }; }; // apply new loadout diff --git a/addons/wardrobe/functions/fnc_replaceOther.sqf b/addons/wardrobe/functions/fnc_replaceOther.sqf index 6b5159bfc5a..7eeb9423a0b 100644 --- a/addons/wardrobe/functions/fnc_replaceOther.sqf +++ b/addons/wardrobe/functions/fnc_replaceOther.sqf @@ -4,22 +4,22 @@ * Function to replace a person's goggles/facewear. * * Arguments: - * 0: Unit - * 1: Current variant - * 2: Desired variant + * 0: Unit + * 1: Desired variant + * 2: Type of wearable container * * Return Value: * None * * Example: - * [_player, _cfgOrigin, _cfgTarget] call ace_wardrobe_fnc_replaceOther + * [_player, _cfgTarget, _equipmentType] call ace_wardrobe_fnc_replaceOther * * Public: No */ -params ["_player", "_cfgOrigin", "_cfgTarget", "_additionalParams"]; +params ["_player", "_cfgTarget", "_equipmentType"]; -switch (_additionalParams) do { +switch (_equipmentType) do { case "HEADGEAR": { removeHeadgear _player; _player addHeadgear configName _cfgTarget; diff --git a/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf b/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf index f14b2ecfd41..859a5a8b169 100644 --- a/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf +++ b/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf @@ -28,7 +28,6 @@ private _map = EGVAR(overheating,storedSpareBarrels); private _oldID = _x; if !(_oldID in _map) then { continue }; _map set [ _newMagIDs # _forEachIndex , _map deleteAt _oldID ]; - } forEach _oldMagIDs; nil From 77cf8cde76972e5abc945c343782a98510600aaf Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 3 Jun 2025 13:58:06 +0200 Subject: [PATCH 246/305] missing " --- addons/wardrobe/functions/fnc_replace.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index b6cfe0b9336..e65830a69ca 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -92,7 +92,7 @@ if (_sound isNotEqualTo "") then { // notification private _imgNotify = getText (_cfgTarget >> "picture"); -if !(".paa" in _imgNotify) then { _imgNotify = _imgNotify + ".paa }; // some vanilla items dont have the .paa and cba notify will display the path as a string without the .paa +if !(".paa" in _imgNotify) then { _imgNotify = _imgNotify + ".paa" }; // some vanilla items dont have the .paa and cba notify will display the path as a string without the .paa [EFUNC(common,displayTextStructured), [["
%2", _imgNotify, getText (_cfgTarget >> "displayName")], 4], _duration * 1.2] call CBA_fnc_waitAndExecute; nil From 45e84d59211166b6fc421d3731e0fce136b2edb2 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 3 Jun 2025 14:11:34 +0200 Subject: [PATCH 247/305] fnc headers. capitalization and punctuation --- addons/wardrobe/functions/fnc_addActions.sqf | 4 ++-- addons/wardrobe/functions/fnc_addActionsCondition.sqf | 2 +- addons/wardrobe/functions/fnc_addActionsIcon.sqf | 2 +- addons/wardrobe/functions/fnc_addActionsName.sqf | 2 +- addons/wardrobe/functions/fnc_cacheGet.sqf | 2 +- addons/wardrobe/functions/fnc_cacheSet.sqf | 2 +- addons/wardrobe/functions/fnc_canModifyTo.sqf | 4 ++-- .../wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf | 2 +- addons/wardrobe/functions/fnc_enableContextMenu.sqf | 2 +- addons/wardrobe/functions/fnc_getIndexFromMagID.sqf | 2 +- addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf | 2 +- addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf | 2 +- addons/wardrobe/functions/fnc_isModifiable.sqf | 2 +- addons/wardrobe/functions/fnc_nextVariantDo.sqf | 2 +- addons/wardrobe/functions/fnc_nextVariantGet.sqf | 4 ++-- addons/wardrobe/functions/fnc_replace.sqf | 2 +- addons/wardrobe/functions/fnc_replaceContainer.sqf | 2 +- 17 files changed, 20 insertions(+), 20 deletions(-) diff --git a/addons/wardrobe/functions/fnc_addActions.sqf b/addons/wardrobe/functions/fnc_addActions.sqf index 0eccb7133c9..3c4b5856886 100644 --- a/addons/wardrobe/functions/fnc_addActions.sqf +++ b/addons/wardrobe/functions/fnc_addActions.sqf @@ -1,8 +1,8 @@ #include "../script_component.hpp" /* * Author: OverlordZorn - * This function creates children for the main wardrobe action - one for every modifiable Item. - * Each Modifiable Item will have its own children in regard of the items it can be changed towards. + * This function creates children for the main wardrobe action - one for every modifiable item. + * Each modifiable item will have its own children in regard of the items it can be changed towards. * * Arguments: * 0: Unit diff --git a/addons/wardrobe/functions/fnc_addActionsCondition.sqf b/addons/wardrobe/functions/fnc_addActionsCondition.sqf index 58833d1d50b..3e72dc32b62 100644 --- a/addons/wardrobe/functions/fnc_addActionsCondition.sqf +++ b/addons/wardrobe/functions/fnc_addActionsCondition.sqf @@ -1,7 +1,7 @@ #include "../script_component.hpp" /* * Author: OverlordZorn - * Condition check: Is wardrobe enabled & if the player has an item that can be modified + * Condition check: Is wardrobe enabled & if the player has an item that can be modified. * * Arguments: * 0: Player diff --git a/addons/wardrobe/functions/fnc_addActionsIcon.sqf b/addons/wardrobe/functions/fnc_addActionsIcon.sqf index fb7ad4c0c19..e15a17ba0b2 100644 --- a/addons/wardrobe/functions/fnc_addActionsIcon.sqf +++ b/addons/wardrobe/functions/fnc_addActionsIcon.sqf @@ -1,7 +1,7 @@ #include "../script_component.hpp" /* * Author: OverlordZorn - * This Function checks if the Target Item has an alternative Picture for the Action, if not, it returns the picture property + * This function checks if the target item has an alternative picture for the action, if not, it returns the picture property. * * Arguments: * 0: Config of desired variant diff --git a/addons/wardrobe/functions/fnc_addActionsName.sqf b/addons/wardrobe/functions/fnc_addActionsName.sqf index 79604e6d47c..e502eddd630 100644 --- a/addons/wardrobe/functions/fnc_addActionsName.sqf +++ b/addons/wardrobe/functions/fnc_addActionsName.sqf @@ -1,7 +1,7 @@ #include "../script_component.hpp" /* * Author: OverlordZorn - * This Function checks if the Target Item has an Alternative String for the Action, if not, it returns the displayName property + * This function checks if the target item has an alternative String for the action, if not, it returns the displayName property. * * Arguments: * 0: Desired variant diff --git a/addons/wardrobe/functions/fnc_cacheGet.sqf b/addons/wardrobe/functions/fnc_cacheGet.sqf index 262d2bedc1c..204c515327e 100644 --- a/addons/wardrobe/functions/fnc_cacheGet.sqf +++ b/addons/wardrobe/functions/fnc_cacheGet.sqf @@ -1,7 +1,7 @@ #include "../script_component.hpp" /* * Author: OverlordZorn - * To retrieve a value from the database. returns nil if not stored or, when provided, will execute the alternative code. Result will be stored and returned. + * To retrieve a value from the database. Returns nil if not stored or, when provided, will execute the alternative code. Result will be stored and returned. * * Arguments: * 0: Key diff --git a/addons/wardrobe/functions/fnc_cacheSet.sqf b/addons/wardrobe/functions/fnc_cacheSet.sqf index c38b60891bc..25b9f0c80cd 100644 --- a/addons/wardrobe/functions/fnc_cacheSet.sqf +++ b/addons/wardrobe/functions/fnc_cacheSet.sqf @@ -1,7 +1,7 @@ #include "../script_component.hpp" /* * Author: OverlordZorn - * Function to store a value behind a key into the addons cache + * Function to store a value behind a key into the addons cache. * * Arguments: * 0: Key diff --git a/addons/wardrobe/functions/fnc_canModifyTo.sqf b/addons/wardrobe/functions/fnc_canModifyTo.sqf index 6041cba73f7..d00185ecb12 100644 --- a/addons/wardrobe/functions/fnc_canModifyTo.sqf +++ b/addons/wardrobe/functions/fnc_canModifyTo.sqf @@ -1,13 +1,13 @@ #include "../script_component.hpp" /* * Author: OverlordZorn - * Condition Check if the unit can modify from current variant to target variant. Checks and compares components. + * Condition check if the unit can modify from current variant to target variant. Checks and compares components. * * Arguments: * 0: Unit * 1: Current variant * 2: Desired variant - * 3: Cache Result of fnc_getitemsAll (default: true) + * 3: Cache the result of fnc_getitemsAll (default: true) * * Return Value: * Result diff --git a/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf b/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf index 2b2d58556c2..ab8af5c8eb1 100644 --- a/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf +++ b/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf @@ -1,7 +1,7 @@ #include "../script_component.hpp" /* * Author: OverlordZorn - * Function to request the clearing of the cache upon closing of the menu + * Function to request the clearing of the cache upon closing of the menu. * * Arguments: * 0: Key diff --git a/addons/wardrobe/functions/fnc_enableContextMenu.sqf b/addons/wardrobe/functions/fnc_enableContextMenu.sqf index b9fa7b04cc7..58a1a8ee8f2 100644 --- a/addons/wardrobe/functions/fnc_enableContextMenu.sqf +++ b/addons/wardrobe/functions/fnc_enableContextMenu.sqf @@ -1,7 +1,7 @@ #include "../script_component.hpp" /* * Author: OverlordZorn - * CBA Setting - On Setting Changed - Function to activate the Wardrobe-related CBA Context Menu Options + * CBA Setting - on setting changed - function to activate the wardrobe-related cba context menu options. * * Arguments: * 0: CBA Setting Value diff --git a/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf index b4828209d8f..421d32f99ab 100644 --- a/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf +++ b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf @@ -1,7 +1,7 @@ #include "../script_component.hpp" /* * Author: OverlordZorn - * function to return the data index based of the magazine ID + * Function to return the data index based of the magazine ID. * * Arguments: * 0: Magazine ID diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf index 92d753e6ae2..9dc456c04a2 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf @@ -8,7 +8,7 @@ * 1: Cache Return? * * Return Value: - * modifiable Items of the Unit + * Modifiable items of the unit * * Example: * [player, false] call ace_wardrobe_fnc_getItemsModifiableAll diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf index 549ba1a8dc4..4e1d140e0f6 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf @@ -5,7 +5,7 @@ * * Arguments: * 0: Unit - * 1: Cache Return? + * 1: Cache return? * * Return Value: * modifiable Items of the Unit diff --git a/addons/wardrobe/functions/fnc_isModifiable.sqf b/addons/wardrobe/functions/fnc_isModifiable.sqf index acc023b725c..84d49a78876 100644 --- a/addons/wardrobe/functions/fnc_isModifiable.sqf +++ b/addons/wardrobe/functions/fnc_isModifiable.sqf @@ -1,7 +1,7 @@ #include "../script_component.hpp" /* * Author: OverlordZorn - * Function to check if the provided wearable Item (Config) can be modified through ace_wardrobe. + * Function to check if the provided wearable item (Config) can be modified through ace_wardrobe. * * Arguments: * 0: Wearable item diff --git a/addons/wardrobe/functions/fnc_nextVariantDo.sqf b/addons/wardrobe/functions/fnc_nextVariantDo.sqf index 12330ef2106..c64a966238a 100644 --- a/addons/wardrobe/functions/fnc_nextVariantDo.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantDo.sqf @@ -1,7 +1,7 @@ #include "../script_component.hpp" /* * Author: OverlordZorn - * Statement of CBA Context Menu Entry - Request the next variant. + * Statement of cba context menu entry. Requests the next variant. * * Arguments: * 0: Player diff --git a/addons/wardrobe/functions/fnc_nextVariantGet.sqf b/addons/wardrobe/functions/fnc_nextVariantGet.sqf index 351968ff45e..856f6d6eff9 100644 --- a/addons/wardrobe/functions/fnc_nextVariantGet.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantGet.sqf @@ -1,10 +1,10 @@ #include "../script_component.hpp" /* * Author: OverlordZorn - * Context Menu - Return config the "next" variant - if multiple variants are defined, it will choose randomly. + * Context Menu. Return config of the "next" variant - if multiple variants are defined, it will choose randomly. * Maintains a history of the current and chosen variants as long as the inventory is open. * Already used variants from the hstory will be removed from the availabe options. - * Once all options have been exhausted, the history will be purged and start over. + * Once all options have been exhausted, the history will be reset. * * Arguments: * 0: Current variant diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index e65830a69ca..672e3f92bff 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -1,7 +1,7 @@ #include "../script_component.hpp" /* * Author: OverlordZorn - * Ace Action Statement - Removes the modifiableItem and replaces it with the target item + * Ace action statement. Removes the modifiableItem and replaces it with the target item. * * Arguments: * 0: Action target diff --git a/addons/wardrobe/functions/fnc_replaceContainer.sqf b/addons/wardrobe/functions/fnc_replaceContainer.sqf index ba9cd0ae8dd..faf6c8982b5 100644 --- a/addons/wardrobe/functions/fnc_replaceContainer.sqf +++ b/addons/wardrobe/functions/fnc_replaceContainer.sqf @@ -1,7 +1,7 @@ #include "../script_component.hpp" /* * Author: OverlordZorn - * Function to replace a persons Uniform while maintaining the content of the uniform. + * Function to replace a units wearable container while maintaining the content of the container. * * Arguments: * 0: Unit From d4a1d8aa37f7cc10e147b3189206ac3c9522474e Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 3 Jun 2025 14:14:48 +0200 Subject: [PATCH 248/305] fnc-header-param-type upperCase --- addons/wardrobe/functions/fnc_addActionsChildren.sqf | 2 +- addons/wardrobe/functions/fnc_canModifyTo.sqf | 4 ++-- addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf | 2 +- addons/wardrobe/functions/fnc_isModifiable.sqf | 2 +- addons/wardrobe/functions/fnc_replaceContainer.sqf | 2 +- addons/wardrobe/functions/fnc_replaceOther.sqf | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/wardrobe/functions/fnc_addActionsChildren.sqf b/addons/wardrobe/functions/fnc_addActionsChildren.sqf index 2be846511f8..27c8aed9b7e 100644 --- a/addons/wardrobe/functions/fnc_addActionsChildren.sqf +++ b/addons/wardrobe/functions/fnc_addActionsChildren.sqf @@ -7,7 +7,7 @@ * 0: Target * 1: Player * 2: Multiple input types - * - 0: Current variant + * - 0: Current variant * - 1: Array of configs possible variants * * Return Value: diff --git a/addons/wardrobe/functions/fnc_canModifyTo.sqf b/addons/wardrobe/functions/fnc_canModifyTo.sqf index d00185ecb12..9ff675f29be 100644 --- a/addons/wardrobe/functions/fnc_canModifyTo.sqf +++ b/addons/wardrobe/functions/fnc_canModifyTo.sqf @@ -5,8 +5,8 @@ * * Arguments: * 0: Unit - * 1: Current variant - * 2: Desired variant + * 1: Current variant + * 2: Desired variant * 3: Cache the result of fnc_getitemsAll (default: true) * * Return Value: diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf index fc27cc26f7f..8bd415e4bfb 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf @@ -4,7 +4,7 @@ * Function to return an array the config of desired target items. Also checks if those items exist: CBA_fnc_getItemConfig returns configNull when item not found. * * Arguments: - * 0: Current variant + * 0: Current variant * * Return Value: * Array of all possible variants as config diff --git a/addons/wardrobe/functions/fnc_isModifiable.sqf b/addons/wardrobe/functions/fnc_isModifiable.sqf index 84d49a78876..eecd4db4fcc 100644 --- a/addons/wardrobe/functions/fnc_isModifiable.sqf +++ b/addons/wardrobe/functions/fnc_isModifiable.sqf @@ -4,7 +4,7 @@ * Function to check if the provided wearable item (Config) can be modified through ace_wardrobe. * * Arguments: - * 0: Wearable item + * 0: Wearable item * * Return Value: * Result diff --git a/addons/wardrobe/functions/fnc_replaceContainer.sqf b/addons/wardrobe/functions/fnc_replaceContainer.sqf index faf6c8982b5..d7bdb42d9c6 100644 --- a/addons/wardrobe/functions/fnc_replaceContainer.sqf +++ b/addons/wardrobe/functions/fnc_replaceContainer.sqf @@ -4,7 +4,7 @@ * Function to replace a units wearable container while maintaining the content of the container. * * Arguments: - * 0: Unit + * 0: Unit * 1: Desired variant * 2: Type of wearable container * diff --git a/addons/wardrobe/functions/fnc_replaceOther.sqf b/addons/wardrobe/functions/fnc_replaceOther.sqf index 7eeb9423a0b..61fda4e6a54 100644 --- a/addons/wardrobe/functions/fnc_replaceOther.sqf +++ b/addons/wardrobe/functions/fnc_replaceOther.sqf @@ -4,7 +4,7 @@ * Function to replace a person's goggles/facewear. * * Arguments: - * 0: Unit + * 0: Unit * 1: Desired variant * 2: Type of wearable container * From 591dbd028ee5757c797573a46c542f62549381cf Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 3 Jun 2025 14:45:10 +0200 Subject: [PATCH 249/305] //// -> // --- addons/wardrobe/functions/fnc_replace.sqf | 4 ++-- addons/wardrobe/functions/fnc_replaceContainer.sqf | 7 +++---- addons/wardrobe/script_macros_wardrobe.hpp | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 672e3f92bff..adf1cc69d25 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -50,7 +50,7 @@ private _replaceCode = switch ( _typeNumber ) do { if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 - %2",_typeNumber,_classOrigin); }; [ _replaceCode, [_unit, _cfgTarget, _equipmentType ], _duration] call CBA_fnc_waitAndExecute; -//// handle components +// handle components [_cfgOrigin, _cfgTarget] call FUNC(compareComponents) params ["_missing", "_surplus"]; // add surplus @@ -76,7 +76,7 @@ if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 } forEach _missing; -//// handle effects +// handle effects // animation/gestures [ _unit, getText (configFile >> QUOTE(ADDON) >> _classTarget >> "gesture") ] call EFUNC(common,doGesture); diff --git a/addons/wardrobe/functions/fnc_replaceContainer.sqf b/addons/wardrobe/functions/fnc_replaceContainer.sqf index d7bdb42d9c6..0b3d8ee5e5d 100644 --- a/addons/wardrobe/functions/fnc_replaceContainer.sqf +++ b/addons/wardrobe/functions/fnc_replaceContainer.sqf @@ -24,7 +24,7 @@ private _magazineDetails = (magazinesAmmoFull _player) apply { [_x#0, _x#-2, _x# private _loadout = _player call CBA_fnc_getLoadout; -//// handle special cases - pre replace +// handle special cases - pre replace // ace intel items INTEL_PRE(_hasDocument,acex_intelitems_document); INTEL_PRE(_hasNotepad,acex_intelitems_notepad); @@ -35,8 +35,7 @@ private _hasSpareBarrel = _magazineDetails findIf { _x#0 isEqualTo "ACE_SpareBar if (_hasSpareBarrel) then { _hasSpareBarrel = [_player, "ACE_SpareBarrel" ] call CBA_fnc_getMagazineIndex }; -//// replace wearable -// change wearable +// replace wearable switch (_equipmentType) do { case "UNIFORM": { _loadout # 0 # 3 set [0, configName _cfgTarget]; }; case "VEST": { _loadout # 0 # 4 set [0, configName _cfgTarget]; }; @@ -47,7 +46,7 @@ switch (_equipmentType) do { [_player, _loadout] call CBA_fnc_setLoadout; -//// handle special cases - post replace +// handle special cases - post replace // ace intel items INTEL_POST(_hasDocument,acex_intelitems_document); INTEL_POST(_hasNotepad,acex_intelitems_notepad); diff --git a/addons/wardrobe/script_macros_wardrobe.hpp b/addons/wardrobe/script_macros_wardrobe.hpp index aa10fe8655e..3f8c2c1a251 100644 --- a/addons/wardrobe/script_macros_wardrobe.hpp +++ b/addons/wardrobe/script_macros_wardrobe.hpp @@ -25,7 +25,7 @@ if (varName isEqualType []) then { { [_x, varName select _forEachIndex] call FUN // Config -//// Adjust Weight of CfgWeapons Wearables. +// Adjust Weight of CfgWeapons Wearables. #define MASS(var)\ class ItemInfo: ItemInfo {\ mass = var;\ From 8d3d522df9d00fd3ff2b423d4a23287a9fd2c232 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 3 Jun 2025 14:49:08 +0200 Subject: [PATCH 250/305] rm "." from comments --- addons/wardrobe/BaseClasses.hpp | 12 ++++++------ addons/wardrobe/functions/fnc_compareComponents.sqf | 6 +++--- .../functions/fnc_getItemsModifiableCurrent.sqf | 2 +- addons/wardrobe/functions/fnc_nextVariantGet.sqf | 2 +- addons/wardrobe/functions/fnc_replace.sqf | 4 ++-- addons/wardrobe/functions/fnc_replaceContainer.sqf | 2 +- addons/wardrobe/script_macros_wardrobe.hpp | 2 +- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/addons/wardrobe/BaseClasses.hpp b/addons/wardrobe/BaseClasses.hpp index 05c3fb7ec8c..ed1b6a1f4cc 100644 --- a/addons/wardrobe/BaseClasses.hpp +++ b/addons/wardrobe/BaseClasses.hpp @@ -5,13 +5,13 @@ class GVAR(base) { class modifiableTo { }; - // describes the components of the current item. + // describes the components of the current item // When the current wearable is being changed into something, that does not have these components[] = {}; - // Supports Multiple Sounds, will pick one by random. + // Supports Multiple Sounds, will pick one by random sound[] = {CN_SOUND(fabric,06),CN_SOUND(fabric,07),CN_SOUND(fabric,16),CN_SOUND(fabric,20),CN_SOUND(fabric,25)}; - sound_timing = 0; // [0..1] 0 at the start of the action, 0.5 half way during the duration of the action - always, if completed or not. 1 at the end, only when completed. + sound_timing = 0; // [0..1] 0 at the start of the action, 0.5 half way during the duration of the action - always, if completed or not. 1 at the end, only when completed // Gesture gesture = "Gear"; @@ -20,9 +20,9 @@ class GVAR(base) { alternativePicture = ""; alternativeDisplayName = ""; - duration = 1; // Minimum value: 1 - Anything above will produce a progressbar. + duration = 1; // Minimum value: 1 - Anything above will produce a progressbar - fallbackComponent = ""; // To be used as an alternative for components where the intended component is from another addon/mod in case the source addon is not loaded. + fallbackComponent = ""; // To be used as an alternative for components where the intended component is from another addon/mod in case the source addon is not loaded }; // Common base class for uniforms with sleeves up/down variants @@ -70,7 +70,7 @@ class GVAR(base_H_visor_down): GVAR(base) { alternativeDisplayName = CSTRING(visorDown); }; -// Common base class for headgear with goggles that can be used as a facewear item. +// Common base class for headgear with goggles that can be used as a facewear item class GVAR(base_H_goggles_on): GVAR(base) { gesture ="GestureWipeFace"; alternativeDisplayName = CSTRING(gogglesOn); diff --git a/addons/wardrobe/functions/fnc_compareComponents.sqf b/addons/wardrobe/functions/fnc_compareComponents.sqf index 42534ac847d..de5ef6b908f 100644 --- a/addons/wardrobe/functions/fnc_compareComponents.sqf +++ b/addons/wardrobe/functions/fnc_compareComponents.sqf @@ -21,9 +21,9 @@ params ["_cfgOrigin", "_cfgTarget"]; private _checkfallbackComponent = { - // check if item is present within current modpack. - // if not, will look-up if item is defined within ace_Wardrobe and has an fallbackComponent defined. - // if not, the component will be fully ignored. + // check if item is present within current modpack + // if not, will look-up if item is defined within ace_Wardrobe and has an fallbackComponent defined + // if not, the component will be fully ignored if (isNull (_x call CBA_fnc_getItemConfig)) then { getText (configFile >> QUOTE(ADDON) >> _x >> "fallbackComponent"); } else { diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf index 4e1d140e0f6..64c245e6988 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf @@ -30,7 +30,7 @@ private _code = { select { _x call FUNC(isModifiable) } apply - { [_x, _x call FUNC(getItemsModifiableTo) ] } // will return an array, even if the target variants are not available. + { [_x, _x call FUNC(getItemsModifiableTo) ] } // will return an array, even if the target variants are not available select { (_x#1) isNotEqualTo [] } apply diff --git a/addons/wardrobe/functions/fnc_nextVariantGet.sqf b/addons/wardrobe/functions/fnc_nextVariantGet.sqf index 856f6d6eff9..aaf7fd6b700 100644 --- a/addons/wardrobe/functions/fnc_nextVariantGet.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantGet.sqf @@ -45,7 +45,7 @@ private _remaining = _cfgModifiableTo - _cfgHistory; _remaining = _remaining select { [ACE_player, _cfgCurrent, _x] call FUNC(canModifyTo) }; -// returns either a random remaining item or alternatively, a random one from the complete array. +// returns either a random remaining item or alternatively, a random one from the complete array private _return = if (_remaining isNotEqualTo []) then { selectRandom _remaining } else { diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index adf1cc69d25..76815f4eec3 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -30,7 +30,7 @@ private _classOrigin = configName _cfgOrigin; private _duration = getNumber (configFile >> QUOTE(ADDON) >> _classTarget >> "duration"); if (_replaceNow) then { _duration = 0; }; // needed for cba context menu - avoid potential duplications and such -// replace the Main Item. +// replace the Main Item private _equipmentType = ""; private _typeNumber = getNumber (_cfgOrigin >> "ItemInfo" >> "type"); private _replaceCode = switch ( _typeNumber ) do { @@ -39,7 +39,7 @@ private _replaceCode = switch ( _typeNumber ) do { case TYPE_VEST: { _equipmentType = "VEST"; FUNC(replaceContainer) }; case TYPE_BACKPACK: { _equipmentType = "BACKPACK"; FUNC(replaceContainer) }; default { - // CfgGlasses items do not have a ItemInfo subclass and therefore, not typeNumber. + // CfgGlasses items do not have a ItemInfo subclass and therefore, not typeNumber switch (true) do { case (isClass (configFile >> "CfgGlasses" >> _classOrigin)): { _equipmentType = "FACEWEAR"; FUNC(replaceOther) }; default { false }; diff --git a/addons/wardrobe/functions/fnc_replaceContainer.sqf b/addons/wardrobe/functions/fnc_replaceContainer.sqf index 0b3d8ee5e5d..029e6eca92a 100644 --- a/addons/wardrobe/functions/fnc_replaceContainer.sqf +++ b/addons/wardrobe/functions/fnc_replaceContainer.sqf @@ -31,7 +31,7 @@ INTEL_PRE(_hasNotepad,acex_intelitems_notepad); INTEL_PRE(_hasPhoto,acex_intelitems_photo); // ace overheating -private _hasSpareBarrel = _magazineDetails findIf { _x#0 isEqualTo "ACE_SpareBarrel" } > -1; +private _hasSpareBarrel = _magazineDetails findIf { _x#0 == "ACE_SpareBarrel" } > -1; if (_hasSpareBarrel) then { _hasSpareBarrel = [_player, "ACE_SpareBarrel" ] call CBA_fnc_getMagazineIndex }; diff --git a/addons/wardrobe/script_macros_wardrobe.hpp b/addons/wardrobe/script_macros_wardrobe.hpp index 3f8c2c1a251..5998526b3c9 100644 --- a/addons/wardrobe/script_macros_wardrobe.hpp +++ b/addons/wardrobe/script_macros_wardrobe.hpp @@ -25,7 +25,7 @@ if (varName isEqualType []) then { { [_x, varName select _forEachIndex] call FUN // Config -// Adjust Weight of CfgWeapons Wearables. +// Adjust Weight of CfgWeapons Wearables #define MASS(var)\ class ItemInfo: ItemInfo {\ mass = var;\ From 99238d27f3566793fcb9fd22aefe89302e8c8c36 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 3 Jun 2025 14:50:41 +0200 Subject: [PATCH 251/305] false -> {} --- addons/wardrobe/functions/fnc_replace.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 76815f4eec3..d63b3cfc3a1 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -42,12 +42,12 @@ private _replaceCode = switch ( _typeNumber ) do { // CfgGlasses items do not have a ItemInfo subclass and therefore, not typeNumber switch (true) do { case (isClass (configFile >> "CfgGlasses" >> _classOrigin)): { _equipmentType = "FACEWEAR"; FUNC(replaceOther) }; - default { false }; + default { {} }; }; }; }; -if (_replaceCode isEqualType false) exitWith { ERROR_2("typeNumber undefined: %1 - %2",_typeNumber,_classOrigin); }; +if (_replaceCode isEqualTo {}) exitWith { ERROR_2("typeNumber undefined: %1 - %2",_typeNumber,_classOrigin); }; [ _replaceCode, [_unit, _cfgTarget, _equipmentType ], _duration] call CBA_fnc_waitAndExecute; // handle components From 94c3e949355a6d9e38a09880ba4ce41e34605ec4 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 3 Jun 2025 22:58:11 +0200 Subject: [PATCH 252/305] _player -> _unit & rm unused params --- .../wardrobe/functions/fnc_addActionsChildren.sqf | 2 +- addons/wardrobe/functions/fnc_canModifyTo.sqf | 2 +- addons/wardrobe/functions/fnc_nextVariantDo.sqf | 2 +- addons/wardrobe/functions/fnc_replace.sqf | 2 +- addons/wardrobe/functions/fnc_replaceContainer.sqf | 14 +++++++------- addons/wardrobe/functions/fnc_replaceOther.sqf | 12 ++++++------ 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/addons/wardrobe/functions/fnc_addActionsChildren.sqf b/addons/wardrobe/functions/fnc_addActionsChildren.sqf index 27c8aed9b7e..2ec05867bdd 100644 --- a/addons/wardrobe/functions/fnc_addActionsChildren.sqf +++ b/addons/wardrobe/functions/fnc_addActionsChildren.sqf @@ -19,7 +19,7 @@ * Public: No */ -params ["_target", "_player", "_actionParams"]; +params ["_target", "", "_actionParams"]; _actionParams params ["_cfgOrigin", "_newItems"]; diff --git a/addons/wardrobe/functions/fnc_canModifyTo.sqf b/addons/wardrobe/functions/fnc_canModifyTo.sqf index 9ff675f29be..74186254b8b 100644 --- a/addons/wardrobe/functions/fnc_canModifyTo.sqf +++ b/addons/wardrobe/functions/fnc_canModifyTo.sqf @@ -20,7 +20,7 @@ params ["_unit", "_cfgOrigin", "_cfgTarget", ["_cache", true, [true]]]; -[_cfgOrigin, _cfgTarget] call FUNC(compareComponents) params ["_missing", "_surplus"]; +[_cfgOrigin, _cfgTarget] call FUNC(compareComponents) params ["_missing", ""]; private _currentItems = [_unit, _cache] call FUNC(getItemsAll); diff --git a/addons/wardrobe/functions/fnc_nextVariantDo.sqf b/addons/wardrobe/functions/fnc_nextVariantDo.sqf index c64a966238a..98c3db75199 100644 --- a/addons/wardrobe/functions/fnc_nextVariantDo.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantDo.sqf @@ -19,7 +19,7 @@ * Public: No */ -params ["_unit", "_container", "_item", "_slot", "_params"]; +params ["_unit", "", "_item", "", ""]; private _cfgCurrent = _item call CBA_fnc_getItemConfig; diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index d63b3cfc3a1..d2121c59a52 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -20,7 +20,7 @@ * Public: No */ -params ["_target", "_unit", "_actionParams", ["_replaceNow", false, [true]]]; +params ["", "_unit", "_actionParams", ["_replaceNow", false, [true]]]; _actionParams params ["_cfgOrigin", "_cfgTarget"]; private _classTarget = configName _cfgTarget; diff --git a/addons/wardrobe/functions/fnc_replaceContainer.sqf b/addons/wardrobe/functions/fnc_replaceContainer.sqf index 029e6eca92a..ca18b378019 100644 --- a/addons/wardrobe/functions/fnc_replaceContainer.sqf +++ b/addons/wardrobe/functions/fnc_replaceContainer.sqf @@ -12,16 +12,16 @@ * None * * Example: - * [_player, _cfgTarget, _equipmentType] call ace_wardrobe_fnc_replaceContainer + * [_unit, _cfgTarget, _equipmentType] call ace_wardrobe_fnc_replaceContainer * * Public: No */ -params ["_player", "_cfgTarget", "_equipmentType"]; +params ["_unit", "_cfgTarget", "_equipmentType"]; toFixed 0; -private _magazineDetails = (magazinesAmmoFull _player) apply { [_x#0, _x#-2, _x#-1] }; -private _loadout = _player call CBA_fnc_getLoadout; +private _magazineDetails = (magazinesAmmoFull _unit) apply { [_x#0, _x#-2, _x#-1] }; +private _loadout = _unit call CBA_fnc_getLoadout; // handle special cases - pre replace @@ -32,7 +32,7 @@ INTEL_PRE(_hasPhoto,acex_intelitems_photo); // ace overheating private _hasSpareBarrel = _magazineDetails findIf { _x#0 == "ACE_SpareBarrel" } > -1; -if (_hasSpareBarrel) then { _hasSpareBarrel = [_player, "ACE_SpareBarrel" ] call CBA_fnc_getMagazineIndex }; +if (_hasSpareBarrel) then { _hasSpareBarrel = [_unit, "ACE_SpareBarrel" ] call CBA_fnc_getMagazineIndex }; // replace wearable @@ -43,7 +43,7 @@ switch (_equipmentType) do { }; // apply new loadout -[_player, _loadout] call CBA_fnc_setLoadout; +[_unit, _loadout] call CBA_fnc_setLoadout; // handle special cases - post replace @@ -54,6 +54,6 @@ INTEL_POST(_hasPhoto,acex_intelitems_photo); // ace overheating if (_hasSpareBarrel isEqualType []) then { - private _newMagIDsSpareBarrel = [_player, "ACE_SpareBarrel"] call CBA_fnc_getMagazineIndex; + private _newMagIDsSpareBarrel = [_unit, "ACE_SpareBarrel"] call CBA_fnc_getMagazineIndex; [QGVAR(updateMagIDs), [_hasSpareBarrel, _newMagIDsSpareBarrel]] call CBA_fnc_serverEvent; }; diff --git a/addons/wardrobe/functions/fnc_replaceOther.sqf b/addons/wardrobe/functions/fnc_replaceOther.sqf index 61fda4e6a54..f8519331134 100644 --- a/addons/wardrobe/functions/fnc_replaceOther.sqf +++ b/addons/wardrobe/functions/fnc_replaceOther.sqf @@ -12,20 +12,20 @@ * None * * Example: - * [_player, _cfgTarget, _equipmentType] call ace_wardrobe_fnc_replaceOther + * [_unit, _cfgTarget, _equipmentType] call ace_wardrobe_fnc_replaceOther * * Public: No */ -params ["_player", "_cfgTarget", "_equipmentType"]; +params ["_unit", "_cfgTarget", "_equipmentType"]; switch (_equipmentType) do { case "HEADGEAR": { - removeHeadgear _player; - _player addHeadgear configName _cfgTarget; + removeHeadgear _unit; + _unit addHeadgear configName _cfgTarget; }; case "FACEWEAR": { - removeGoggles _player; - _player addGoggles configName _cfgTarget; + removeGoggles _unit; + _unit addGoggles configName _cfgTarget; }; }; From 66cfd5856903cf8f17db74e6074f13ad9650eb14 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 3 Jun 2025 23:07:59 +0200 Subject: [PATCH 253/305] remaining upperCase comment --- addons/wardrobe/functions/fnc_replace.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index d2121c59a52..b0832b44817 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -30,7 +30,7 @@ private _classOrigin = configName _cfgOrigin; private _duration = getNumber (configFile >> QUOTE(ADDON) >> _classTarget >> "duration"); if (_replaceNow) then { _duration = 0; }; // needed for cba context menu - avoid potential duplications and such -// replace the Main Item +// replace the main Item private _equipmentType = ""; private _typeNumber = getNumber (_cfgOrigin >> "ItemInfo" >> "type"); private _replaceCode = switch ( _typeNumber ) do { From e95912511a048b3883edeab262a93a6df6ad3343 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 3 Jun 2025 23:11:26 +0200 Subject: [PATCH 254/305] params -> single line --- addons/wardrobe/functions/fnc_getIndexFromMagID.sqf | 4 +--- addons/wardrobe/functions/fnc_getItemsAll.sqf | 5 +---- addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf | 5 +---- addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf | 5 +---- addons/wardrobe/functions/fnc_isModifiable.sqf | 4 +--- addons/wardrobe/functions/fnc_setIndexForMagID.sqf | 5 +---- 6 files changed, 6 insertions(+), 22 deletions(-) diff --git a/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf index 421d32f99ab..94ed3d67933 100644 --- a/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf +++ b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf @@ -15,9 +15,7 @@ * Public: Yes */ -params [ - ["_magazineID", "", [""] ] -]; +params [ ["_magazineID", "", [""] ] ]; if !(_magazineID in allVariables EGVAR(intelItems,intelMap)) exitWith { -1 }; diff --git a/addons/wardrobe/functions/fnc_getItemsAll.sqf b/addons/wardrobe/functions/fnc_getItemsAll.sqf index b24954afb3d..e05ddbd0643 100644 --- a/addons/wardrobe/functions/fnc_getItemsAll.sqf +++ b/addons/wardrobe/functions/fnc_getItemsAll.sqf @@ -16,10 +16,7 @@ * Public: No */ -params [ - ["_unit", objNull, [objNull]], - ["_cache", true, [true]] -]; +params [ ["_unit", objNull, [objNull]], ["_cache", true, [true]] ]; private _code = { flatten getUnitLoadout _unit select { _x isEqualType "" && { _x != ""}}; }; diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf index 9dc456c04a2..ce2185223c2 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf @@ -16,10 +16,7 @@ * Public: Yes */ -params [ - ["_unit", objNull, [objNull]], - ["_cache", true, [true]] -]; +params [ ["_unit", objNull, [objNull]], ["_cache", true, [true]] ]; private _code = { diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf index 64c245e6988..5dd436fa6be 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf @@ -16,10 +16,7 @@ * Public: Yes */ -params [ - ["_unit", objNull, [objNull]], - ["_cache", true, [true]] -]; +params [ ["_unit", objNull, [objNull]], ["_cache", true, [true]] ]; private _code = { diff --git a/addons/wardrobe/functions/fnc_isModifiable.sqf b/addons/wardrobe/functions/fnc_isModifiable.sqf index eecd4db4fcc..a19c046920c 100644 --- a/addons/wardrobe/functions/fnc_isModifiable.sqf +++ b/addons/wardrobe/functions/fnc_isModifiable.sqf @@ -15,9 +15,7 @@ * Public: No */ -params [ - ["_cfg", configNull, [configNull]] -]; +params [ ["_cfg", configNull, [configNull]] ]; !isNull _cfg && { isClass (configFile >> QUOTE(ADDON) >> configName _cfg) } diff --git a/addons/wardrobe/functions/fnc_setIndexForMagID.sqf b/addons/wardrobe/functions/fnc_setIndexForMagID.sqf index 87b439ba38d..da09f8160fd 100644 --- a/addons/wardrobe/functions/fnc_setIndexForMagID.sqf +++ b/addons/wardrobe/functions/fnc_setIndexForMagID.sqf @@ -16,10 +16,7 @@ * Public: No */ -params [ - ["_magID", "", [""]], - ["_index", 0, [0]] -]; +params [ ["_magID", "", [""]], ["_index", 0, [0]] ]; if (_index == -1) exitWith {}; From 260429a5f2c933fae9a5114e758c94f54eb2aee7 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 3 Jun 2025 23:14:04 +0200 Subject: [PATCH 255/305] rm default params and made settings not global --- addons/wardrobe/initSettings.inc.sqf | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/addons/wardrobe/initSettings.inc.sqf b/addons/wardrobe/initSettings.inc.sqf index 10365db3940..9bb1962c240 100644 --- a/addons/wardrobe/initSettings.inc.sqf +++ b/addons/wardrobe/initSettings.inc.sqf @@ -3,10 +3,7 @@ "CHECKBOX", LSTRING(enable_action), [LSTRING(set_cat_main)], - true, - 1, - {}, - false + true ] call CBA_fnc_addSetting; [ @@ -15,6 +12,6 @@ LSTRING(enable_contextMenu), [LSTRING(set_cat_main)], true, - 1, + 0, LINKFUNC(enableContextMenu) ] call CBA_fnc_addSetting; From 60d137ca188a311292fadbca0712bf5af0554f5b Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 3 Jun 2025 23:21:39 +0200 Subject: [PATCH 256/305] rm surplus empty lines --- addons/wardrobe/dev/getAllWardrobeItems.sqf | 1 - addons/wardrobe/functions/fnc_addActions.sqf | 2 -- addons/wardrobe/functions/fnc_addActionsChildren.sqf | 2 -- addons/wardrobe/functions/fnc_cacheGet.sqf | 1 - addons/wardrobe/functions/fnc_cacheSet.sqf | 2 -- .../wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf | 6 ------ addons/wardrobe/functions/fnc_compareComponents.sqf | 1 - addons/wardrobe/functions/fnc_enableContextMenu.sqf | 1 - addons/wardrobe/functions/fnc_getItemsAll.sqf | 1 - addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf | 2 -- addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf | 2 -- addons/wardrobe/functions/fnc_isModifiable.sqf | 1 - addons/wardrobe/functions/fnc_nextVariantGet.sqf | 2 -- addons/wardrobe/functions/fnc_replace.sqf | 2 -- addons/wardrobe/functions/fnc_replaceContainer.sqf | 3 --- 15 files changed, 29 deletions(-) diff --git a/addons/wardrobe/dev/getAllWardrobeItems.sqf b/addons/wardrobe/dev/getAllWardrobeItems.sqf index 0d442f41bc2..18b72a4a0be 100644 --- a/addons/wardrobe/dev/getAllWardrobeItems.sqf +++ b/addons/wardrobe/dev/getAllWardrobeItems.sqf @@ -16,5 +16,4 @@ * Public: Yes */ - flatten ( ["CfgWeapons", "CfgGlasses"] apply { ( QUOTE(_x call FUNC(isModifiable)) configClasses (configFile >> _x) ) } ) apply { configName _x } diff --git a/addons/wardrobe/functions/fnc_addActions.sqf b/addons/wardrobe/functions/fnc_addActions.sqf index 3c4b5856886..62ea7c579cf 100644 --- a/addons/wardrobe/functions/fnc_addActions.sqf +++ b/addons/wardrobe/functions/fnc_addActions.sqf @@ -18,7 +18,6 @@ params ["_unit"]; - private _modifiableItems = _unit call FUNC(getItemsModifiableCurrent); private _actions = []; { @@ -33,7 +32,6 @@ private _actions = []; [_cfg, _x#1] ] call EFUNC(interact_menu,createAction); _actions pushBack [_aceAction, [], _unit]; - } forEach _modifiableItems; _actions diff --git a/addons/wardrobe/functions/fnc_addActionsChildren.sqf b/addons/wardrobe/functions/fnc_addActionsChildren.sqf index 2ec05867bdd..b476f2f9485 100644 --- a/addons/wardrobe/functions/fnc_addActionsChildren.sqf +++ b/addons/wardrobe/functions/fnc_addActionsChildren.sqf @@ -22,7 +22,6 @@ params ["_target", "", "_actionParams"]; _actionParams params ["_cfgOrigin", "_newItems"]; - private _actions = []; { @@ -37,7 +36,6 @@ private _actions = []; [_cfgOrigin, _cfgTarget] ] call EFUNC(interact_menu,createAction); _actions pushBack [_aceAction, [], _target]; - } forEach _newItems; _actions diff --git a/addons/wardrobe/functions/fnc_cacheGet.sqf b/addons/wardrobe/functions/fnc_cacheGet.sqf index 204c515327e..e782562ed32 100644 --- a/addons/wardrobe/functions/fnc_cacheGet.sqf +++ b/addons/wardrobe/functions/fnc_cacheGet.sqf @@ -17,7 +17,6 @@ * Public: Yes */ - params [ [ "_key", "", [""] ], [ "_else", nil, [{}] ] ]; if (isNil "_else") then { diff --git a/addons/wardrobe/functions/fnc_cacheSet.sqf b/addons/wardrobe/functions/fnc_cacheSet.sqf index 25b9f0c80cd..ab9473af697 100644 --- a/addons/wardrobe/functions/fnc_cacheSet.sqf +++ b/addons/wardrobe/functions/fnc_cacheSet.sqf @@ -16,8 +16,6 @@ * Public: Yes */ - - params [ ["_key", "", [""] ], ["_value", nil] ]; if (isNil "_value") exitWith { false }; diff --git a/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf b/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf index ab8af5c8eb1..d0632ec7cbd 100644 --- a/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf +++ b/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf @@ -17,9 +17,7 @@ params [ ["_key", "", [""]] ]; - if (isNil QGVAR(menuClearQueue)) then { - [ "ace_interactMenuClosed", { @@ -31,13 +29,9 @@ if (isNil QGVAR(menuClearQueue)) then { [_thisType, _thisId] call CBA_fnc_removeEventHandler; } ] call CBA_fnc_addEventHandlerArgs; - GVAR(menuClearQueue) = [_key]; - } else { - GVAR(menuClearQueue) pushBackUnique _key; - }; nil diff --git a/addons/wardrobe/functions/fnc_compareComponents.sqf b/addons/wardrobe/functions/fnc_compareComponents.sqf index de5ef6b908f..317edfdba58 100644 --- a/addons/wardrobe/functions/fnc_compareComponents.sqf +++ b/addons/wardrobe/functions/fnc_compareComponents.sqf @@ -31,7 +31,6 @@ private _checkfallbackComponent = { }; }; - private _current = getArray (configFile >> QUOTE(ADDON) >> configName _cfgOrigin >> "components") apply _checkfallbackComponent select {_x isNotEqualTo ""}; private _needed = getArray (configFile >> QUOTE(ADDON) >> configName _cfgTarget >> "components") apply _checkfallbackComponent select {_x isNotEqualTo ""}; diff --git a/addons/wardrobe/functions/fnc_enableContextMenu.sqf b/addons/wardrobe/functions/fnc_enableContextMenu.sqf index 58a1a8ee8f2..88ab0edcea1 100644 --- a/addons/wardrobe/functions/fnc_enableContextMenu.sqf +++ b/addons/wardrobe/functions/fnc_enableContextMenu.sqf @@ -15,7 +15,6 @@ * Public: No */ - params [["_enable", true, [true]]]; if (_enable && {!(missionNamespace getVariable [QGVAR(contextmenuEnabled), false])}) then { diff --git a/addons/wardrobe/functions/fnc_getItemsAll.sqf b/addons/wardrobe/functions/fnc_getItemsAll.sqf index e05ddbd0643..671cecf1f2b 100644 --- a/addons/wardrobe/functions/fnc_getItemsAll.sqf +++ b/addons/wardrobe/functions/fnc_getItemsAll.sqf @@ -18,7 +18,6 @@ params [ ["_unit", objNull, [objNull]], ["_cache", true, [true]] ]; - private _code = { flatten getUnitLoadout _unit select { _x isEqualType "" && { _x != ""}}; }; private _caching = { diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf index ce2185223c2..6ec48bb3673 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf @@ -18,9 +18,7 @@ params [ ["_unit", objNull, [objNull]], ["_cache", true, [true]] ]; - private _code = { - _unit call FUNC(getItemsAll) apply { _x call CBA_fnc_getItemConfig } diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf index 5dd436fa6be..88b0e9987e5 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf @@ -18,9 +18,7 @@ params [ ["_unit", objNull, [objNull]], ["_cache", true, [true]] ]; - private _code = { - ( [headgear _unit, goggles _unit, uniform _unit, vest _unit, backpack _unit] - [""] ) apply { _x call CBA_fnc_getItemConfig } diff --git a/addons/wardrobe/functions/fnc_isModifiable.sqf b/addons/wardrobe/functions/fnc_isModifiable.sqf index a19c046920c..b4efce40cb7 100644 --- a/addons/wardrobe/functions/fnc_isModifiable.sqf +++ b/addons/wardrobe/functions/fnc_isModifiable.sqf @@ -17,5 +17,4 @@ params [ ["_cfg", configNull, [configNull]] ]; - !isNull _cfg && { isClass (configFile >> QUOTE(ADDON) >> configName _cfg) } diff --git a/addons/wardrobe/functions/fnc_nextVariantGet.sqf b/addons/wardrobe/functions/fnc_nextVariantGet.sqf index aaf7fd6b700..9e1fe132be2 100644 --- a/addons/wardrobe/functions/fnc_nextVariantGet.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantGet.sqf @@ -18,7 +18,6 @@ * Public: No */ - params ["_cfgCurrent"]; private _cfgModifiableTo = [_cfgCurrent, false] call FUNC(getItemsModifiableTo); @@ -40,7 +39,6 @@ if (_cfgHistory isEqualTo "") then { }]; }; - private _remaining = _cfgModifiableTo - _cfgHistory; _remaining = _remaining select { [ACE_player, _cfgCurrent, _x] call FUNC(canModifyTo) }; diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index b0832b44817..90b2d2be8a9 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -67,7 +67,6 @@ if (_replaceCode isEqualTo {}) exitWith { ERROR_2("typeNumber undefined: %1 - %2 // remove missing { if (_classOrigin isNotEqualTo _x) then { - switch (true) do { case (goggles _unit isEqualTo _x): { removeGoggles _unit; }; default { [_unit, _x] call CBA_fnc_removeItem; }; @@ -75,7 +74,6 @@ if (_replaceCode isEqualTo {}) exitWith { ERROR_2("typeNumber undefined: %1 - %2 }; } forEach _missing; - // handle effects // animation/gestures [ _unit, getText (configFile >> QUOTE(ADDON) >> _classTarget >> "gesture") ] call EFUNC(common,doGesture); diff --git a/addons/wardrobe/functions/fnc_replaceContainer.sqf b/addons/wardrobe/functions/fnc_replaceContainer.sqf index ca18b378019..38ca93bb628 100644 --- a/addons/wardrobe/functions/fnc_replaceContainer.sqf +++ b/addons/wardrobe/functions/fnc_replaceContainer.sqf @@ -23,7 +23,6 @@ toFixed 0; private _magazineDetails = (magazinesAmmoFull _unit) apply { [_x#0, _x#-2, _x#-1] }; private _loadout = _unit call CBA_fnc_getLoadout; - // handle special cases - pre replace // ace intel items INTEL_PRE(_hasDocument,acex_intelitems_document); @@ -34,7 +33,6 @@ INTEL_PRE(_hasPhoto,acex_intelitems_photo); private _hasSpareBarrel = _magazineDetails findIf { _x#0 == "ACE_SpareBarrel" } > -1; if (_hasSpareBarrel) then { _hasSpareBarrel = [_unit, "ACE_SpareBarrel" ] call CBA_fnc_getMagazineIndex }; - // replace wearable switch (_equipmentType) do { case "UNIFORM": { _loadout # 0 # 3 set [0, configName _cfgTarget]; }; @@ -45,7 +43,6 @@ switch (_equipmentType) do { // apply new loadout [_unit, _loadout] call CBA_fnc_setLoadout; - // handle special cases - post replace // ace intel items INTEL_POST(_hasDocument,acex_intelitems_document); From 4c624a53bb6c60aa4f7175afc3f6d379987ee007 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 3 Jun 2025 23:25:59 +0200 Subject: [PATCH 257/305] rm containers + ln sort --- addons/wardrobe/stringtable.xml | 118 +++++++++++++++----------------- 1 file changed, 55 insertions(+), 63 deletions(-) diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml index 72af807c05e..4ed9f14d458 100644 --- a/addons/wardrobe/stringtable.xml +++ b/addons/wardrobe/stringtable.xml @@ -1,68 +1,60 @@ - - - Wardrobe - Garderobe - - - Take gloves off - - - Wear gloves - - - Take goggles off - - - Put goggles on - - - Close Jacket - - - Open Jacket - - - Take mask off - - - Put mask on - - - Roll sleeves down - - - Roll sleeves up - - - Visor down - - - Visor up - - - - - Cannot switch to<br/>%1<br/>due to missing components - - - - - ACE Interaction - Aktivieren ACE Interaction - - - CBA Context Menu - Aktiviere CBA Context Menu - - - - - ACE Wardrobe - ACE Garderobe - - + + Wardrobe + Garderobe + + + ACE Interaction + Aktivieren ACE Interaction + + + CBA Context Menu + Aktiviere CBA Context Menu + + + Take gloves off + + + Wear gloves + + + Take goggles off + + + Put goggles on + + + Close Jacket + + + Open Jacket + + + Take mask off + + + Put mask on + + + Cannot switch to<br/>%1<br/>due to missing components + + + ACE Wardrobe + ACE Garderobe + + + Roll sleeves down + + + Roll sleeves up + + + Visor down + + + Visor up + From db69ba9e31a899c90b35cd172bc3cfc7952718ae Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 3 Jun 2025 23:28:50 +0200 Subject: [PATCH 258/305] stringtable key written out --- addons/wardrobe/initSettings.inc.sqf | 4 ++-- addons/wardrobe/stringtable.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/wardrobe/initSettings.inc.sqf b/addons/wardrobe/initSettings.inc.sqf index 9bb1962c240..2ffe716d976 100644 --- a/addons/wardrobe/initSettings.inc.sqf +++ b/addons/wardrobe/initSettings.inc.sqf @@ -2,7 +2,7 @@ QGVAR(enableAction), "CHECKBOX", LSTRING(enable_action), - [LSTRING(set_cat_main)], + [LSTRING(setting_category)], true ] call CBA_fnc_addSetting; @@ -10,7 +10,7 @@ QGVAR(enableContextMenu), "CHECKBOX", LSTRING(enable_contextMenu), - [LSTRING(set_cat_main)], + [LSTRING(setting_category)], true, 0, LINKFUNC(enableContextMenu) diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml index 4ed9f14d458..5daee77513e 100644 --- a/addons/wardrobe/stringtable.xml +++ b/addons/wardrobe/stringtable.xml @@ -40,7 +40,7 @@ Cannot switch to<br/>%1<br/>due to missing components - + ACE Wardrobe ACE Garderobe From a8af272a19bd95597f2229a5bb684f838c1f1891 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 3 Jun 2025 23:33:31 +0200 Subject: [PATCH 259/305] Update fnc_replace.sqf --- addons/wardrobe/functions/fnc_replace.sqf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 90b2d2be8a9..655594c35b8 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -27,8 +27,7 @@ private _classTarget = configName _cfgTarget; private _classOrigin = configName _cfgOrigin; // duration of the "animation" -private _duration = getNumber (configFile >> QUOTE(ADDON) >> _classTarget >> "duration"); -if (_replaceNow) then { _duration = 0; }; // needed for cba context menu - avoid potential duplications and such +private _duration = if (_replaceNow) then { 0 } else { getNumber (configFile >> QUOTE(ADDON) >> _classTarget >> "duration"); }; // _replaceNow needed for cba context menu to avoid potential duplications and such // replace the main Item private _equipmentType = ""; From 7f285e8c600aaa25ccaae94a6d313a199f73aa00 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Tue, 3 Jun 2025 23:34:57 +0200 Subject: [PATCH 260/305] Update addons/wardrobe/functions/fnc_replace.sqf Co-authored-by: johnb432 <58661205+johnb432@users.noreply.github.com> --- addons/wardrobe/functions/fnc_replace.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 655594c35b8..fe1b7480881 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -55,7 +55,7 @@ if (_replaceCode isEqualTo {}) exitWith { ERROR_2("typeNumber undefined: %1 - %2 // add surplus { if (_classTarget isNotEqualTo _x) then { - if ( isClass (configFile >> "CfgGlasses" >> _x) && { goggles _unit isEqualTo "" } ) then { + if ( goggles _unit isEqualTo "" && { isClass (configFile >> "CfgGlasses" >> _x) } ) then { _unit addGoggles _x; } else { [_unit, _x, true] call CBA_fnc_addItem; From 3014c47a9cc8a521e0d114aee30754c297887a11 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 3 Jun 2025 23:37:46 +0200 Subject: [PATCH 261/305] deboolifying variable --- .../functions/fnc_replaceContainer.sqf | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/addons/wardrobe/functions/fnc_replaceContainer.sqf b/addons/wardrobe/functions/fnc_replaceContainer.sqf index 38ca93bb628..2daf0d237e8 100644 --- a/addons/wardrobe/functions/fnc_replaceContainer.sqf +++ b/addons/wardrobe/functions/fnc_replaceContainer.sqf @@ -25,13 +25,13 @@ private _loadout = _unit call CBA_fnc_getLoadout; // handle special cases - pre replace // ace intel items -INTEL_PRE(_hasDocument,acex_intelitems_document); -INTEL_PRE(_hasNotepad,acex_intelitems_notepad); -INTEL_PRE(_hasPhoto,acex_intelitems_photo); +INTEL_PRE(_document,acex_intelitems_document); +INTEL_PRE(_notepad,acex_intelitems_notepad); +INTEL_PRE(_photo,acex_intelitems_photo); // ace overheating -private _hasSpareBarrel = _magazineDetails findIf { _x#0 == "ACE_SpareBarrel" } > -1; -if (_hasSpareBarrel) then { _hasSpareBarrel = [_unit, "ACE_SpareBarrel" ] call CBA_fnc_getMagazineIndex }; +private _spareBarrel = _magazineDetails findIf { _x#0 == "ACE_SpareBarrel" } > -1; +if (_spareBarrel) then { _spareBarrel = [_unit, "ACE_SpareBarrel" ] call CBA_fnc_getMagazineIndex }; // replace wearable switch (_equipmentType) do { @@ -45,12 +45,12 @@ switch (_equipmentType) do { // handle special cases - post replace // ace intel items -INTEL_POST(_hasDocument,acex_intelitems_document); -INTEL_POST(_hasNotepad,acex_intelitems_notepad); -INTEL_POST(_hasPhoto,acex_intelitems_photo); +INTEL_POST(_document,acex_intelitems_document); +INTEL_POST(_notepad,acex_intelitems_notepad); +INTEL_POST(_photo,acex_intelitems_photo); // ace overheating -if (_hasSpareBarrel isEqualType []) then { +if (_spareBarrel isEqualType []) then { private _newMagIDsSpareBarrel = [_unit, "ACE_SpareBarrel"] call CBA_fnc_getMagazineIndex; - [QGVAR(updateMagIDs), [_hasSpareBarrel, _newMagIDsSpareBarrel]] call CBA_fnc_serverEvent; + [QGVAR(updateMagIDs), [_spareBarrel, _newMagIDsSpareBarrel]] call CBA_fnc_serverEvent; }; From 6b8916ab5edc92f32f8a1e444fcd9f1ba8b863f2 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 3 Jun 2025 23:40:32 +0200 Subject: [PATCH 262/305] switch -> if --- addons/wardrobe/functions/fnc_replace.sqf | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index fe1b7480881..5c8cc7219b4 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -66,9 +66,10 @@ if (_replaceCode isEqualTo {}) exitWith { ERROR_2("typeNumber undefined: %1 - %2 // remove missing { if (_classOrigin isNotEqualTo _x) then { - switch (true) do { - case (goggles _unit isEqualTo _x): { removeGoggles _unit; }; - default { [_unit, _x] call CBA_fnc_removeItem; }; + if (goggles _unit isEqualTo _x) then { + removeGoggles _unit; + } else { + [_unit, _x] call CBA_fnc_removeItem; }; }; } forEach _missing; From 89b3558621cf896b621926c7d4f53aeb9d939141 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 3 Jun 2025 23:55:54 +0200 Subject: [PATCH 263/305] fix stringtable key --- addons/wardrobe/initSettings.inc.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/wardrobe/initSettings.inc.sqf b/addons/wardrobe/initSettings.inc.sqf index 2ffe716d976..73e5aaa0ffe 100644 --- a/addons/wardrobe/initSettings.inc.sqf +++ b/addons/wardrobe/initSettings.inc.sqf @@ -2,7 +2,7 @@ QGVAR(enableAction), "CHECKBOX", LSTRING(enable_action), - [LSTRING(setting_category)], + [LSTRING(setting_category_main)], true ] call CBA_fnc_addSetting; @@ -10,7 +10,7 @@ QGVAR(enableContextMenu), "CHECKBOX", LSTRING(enable_contextMenu), - [LSTRING(setting_category)], + [LSTRING(setting_category_main)], true, 0, LINKFUNC(enableContextMenu) From c003901077b44019aa6d18d6b4e185fa72c88a07 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 4 Jun 2025 22:38:46 +0200 Subject: [PATCH 264/305] add space after = --- .../compat_ws_wardrobe/CfgWardrobe_Turbans.hpp | 2 +- addons/wardrobe/BaseClasses.hpp | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Turbans.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Turbans.hpp index d53f08637fe..b4b9e0d2dfc 100644 --- a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Turbans.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Turbans.hpp @@ -1,6 +1,6 @@ // Custom Base Class class EGVAR(wardrobe,turban): EGVAR(wardrobe,base) { - gesture ="GestureWipeFace"; + gesture = "GestureWipeFace"; }; // MACROS diff --git a/addons/wardrobe/BaseClasses.hpp b/addons/wardrobe/BaseClasses.hpp index ed1b6a1f4cc..7c96425177b 100644 --- a/addons/wardrobe/BaseClasses.hpp +++ b/addons/wardrobe/BaseClasses.hpp @@ -52,7 +52,7 @@ class GVAR(base_U_jacket_closed): GVAR(base) { // Common base class for helmets with a visor that can be flipped up or down class GVAR(base_H_visor_up): GVAR(base) { duration = 0.25; - gesture ="gestureNod"; + gesture = "gestureNod"; sound[] = {CN_SOUND(helmet_visor,05)}; sound_timing = 0; @@ -62,7 +62,7 @@ class GVAR(base_H_visor_up): GVAR(base) { class GVAR(base_H_visor_down): GVAR(base) { duration = 0.25; - gesture ="gestureNod"; + gesture = "gestureNod"; sound[] = {CN_SOUND(helmet_visor,05)}; sound_timing = 0; @@ -72,23 +72,23 @@ class GVAR(base_H_visor_down): GVAR(base) { // Common base class for headgear with goggles that can be used as a facewear item class GVAR(base_H_goggles_on): GVAR(base) { - gesture ="GestureWipeFace"; + gesture = "GestureWipeFace"; alternativeDisplayName = CSTRING(gogglesOn); }; class GVAR(base_H_goggles_off): GVAR(base) { - gesture ="GestureWipeFace"; + gesture = "GestureWipeFace"; alternativeDisplayName = CSTRING(gogglesOff); }; // Common base class for headgear with a mask on/off variant class GVAR(base_H_mask_on): GVAR(base) { - gesture ="GestureWipeFace"; + gesture = "GestureWipeFace"; alternativeDisplayName = CSTRING(maskOn); }; class GVAR(base_H_mask_off): GVAR(base) { - gesture ="GestureWipeFace"; + gesture = "GestureWipeFace"; alternativeDisplayName = CSTRING(maskOff); }; From a0c318a8c0061c08b65001f9c8e42b7aeedb9cb8 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 4 Jun 2025 22:43:46 +0200 Subject: [PATCH 265/305] "," -> ", " --- addons/wardrobe/functions/fnc_cacheSet.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_cacheSet.sqf b/addons/wardrobe/functions/fnc_cacheSet.sqf index ab9473af697..dba02eeb584 100644 --- a/addons/wardrobe/functions/fnc_cacheSet.sqf +++ b/addons/wardrobe/functions/fnc_cacheSet.sqf @@ -11,7 +11,7 @@ * Success * * Example: - * ['tag_myKey', ["some","data"]] call ace_wardrobe_fnc_cacheSet + * ['tag_myKey', ["some", "data"]] call ace_wardrobe_fnc_cacheSet * * Public: Yes */ From 35c38e7d8eb54c4d62697c376a3d8e1af044e8a0 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 4 Jun 2025 22:45:57 +0200 Subject: [PATCH 266/305] sort prep a->z --- addons/wardrobe/XEH_PREP.hpp | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/addons/wardrobe/XEH_PREP.hpp b/addons/wardrobe/XEH_PREP.hpp index 3e9272fac06..cdddbcfe525 100644 --- a/addons/wardrobe/XEH_PREP.hpp +++ b/addons/wardrobe/XEH_PREP.hpp @@ -1,31 +1,24 @@ -PREP(isModifiable); -PREP(compareComponents); -PREP(canModifyTo); -// ace_intel -PREP(getIndexFromMagID); -PREP(setIndexForMagID); -// getItems -PREP(getItemsAll); -PREP(getItemsModifiableAll); -PREP(getItemsModifiableCurrent); -PREP(getItemsModifiableTo); -// Replace -PREP(replace); -PREP(replaceOther); -PREP(replaceContainer); -// Compat -PREP(spareBarrelUpdateMagIDs); -// Ace Actions PREP(addActions); PREP(addActionsCondition); PREP(addActionsChildren); -PREP(addActionsName); PREP(addActionsIcon); -// Cache +PREP(addActionsName); PREP(cacheGet); PREP(cacheSet); +PREP(canModifyTo); PREP(clearOnClosedInteractionMenu); -// CBA Context Menu +PREP(compareComponents); PREP(enableContextMenu); +PREP(getIndexFromMagID); +PREP(getItemsAll); +PREP(getItemsModifiableAll); +PREP(getItemsModifiableCurrent); +PREP(getItemsModifiableTo); +PREP(isModifiable); PREP(nextVariantDo); PREP(nextVariantGet); +PREP(replace); +PREP(replaceContainer); +PREP(replaceOther); +PREP(setIndexForMagID); +PREP(spareBarrelUpdateMagIDs); From a9637c26823941bf24ad76ad85ad8cdeb6b5188c Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Wed, 4 Jun 2025 22:46:55 +0200 Subject: [PATCH 267/305] sort includes Co-authored-by: johnb432 <58661205+johnb432@users.noreply.github.com> --- addons/wardrobe/config.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/addons/wardrobe/config.cpp b/addons/wardrobe/config.cpp index 5f98a57931a..980b19a577d 100644 --- a/addons/wardrobe/config.cpp +++ b/addons/wardrobe/config.cpp @@ -19,8 +19,6 @@ class CfgPatches { }; #include "CfgEventHandlers.hpp" - -#include "CfgVehicles.hpp" #include "CfgSounds.hpp" - +#include "CfgVehicles.hpp" #include "CfgWardrobe.hpp" From f53e6874d6f30187d0c844706132ab482d2b8bc7 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 4 Jun 2025 22:49:03 +0200 Subject: [PATCH 268/305] add linebreak --- addons/wardrobe/functions/fnc_addActions.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/wardrobe/functions/fnc_addActions.sqf b/addons/wardrobe/functions/fnc_addActions.sqf index 62ea7c579cf..b81548ea551 100644 --- a/addons/wardrobe/functions/fnc_addActions.sqf +++ b/addons/wardrobe/functions/fnc_addActions.sqf @@ -20,6 +20,7 @@ params ["_unit"]; private _modifiableItems = _unit call FUNC(getItemsModifiableCurrent); private _actions = []; + { private _cfg = _x#0; private _aceAction = [ From 683f7a2f4d71ca33d50ecf144ecae2fa1a211520 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 4 Jun 2025 22:53:51 +0200 Subject: [PATCH 269/305] rm dead code --- addons/wardrobe/functions/fnc_nextVariantGet.sqf | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_nextVariantGet.sqf b/addons/wardrobe/functions/fnc_nextVariantGet.sqf index 9e1fe132be2..e3e651c7b57 100644 --- a/addons/wardrobe/functions/fnc_nextVariantGet.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantGet.sqf @@ -47,7 +47,6 @@ _remaining = _remaining select { [ACE_player, _cfgCurrent, _x] call FUNC(canModi private _return = if (_remaining isNotEqualTo []) then { selectRandom _remaining } else { - // _cfgHistory select { !(_x in _cfgModifiableTo) }; _cfgHistory = []; missionNamespace setVariable [QGVAR(variantHistory), [] ]; _cfgHistory pushBackUnique _cfgCurrent; From 30b48ddf58c2e0914332eb74e86c491ea070b302 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Wed, 4 Jun 2025 22:55:30 +0200 Subject: [PATCH 270/305] rm ; for return statement Co-authored-by: johnb432 <58661205+johnb432@users.noreply.github.com> --- addons/wardrobe/functions/fnc_replace.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 5c8cc7219b4..67505a27909 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -27,7 +27,7 @@ private _classTarget = configName _cfgTarget; private _classOrigin = configName _cfgOrigin; // duration of the "animation" -private _duration = if (_replaceNow) then { 0 } else { getNumber (configFile >> QUOTE(ADDON) >> _classTarget >> "duration"); }; // _replaceNow needed for cba context menu to avoid potential duplications and such +private _duration = if (_replaceNow) then { 0 } else { getNumber (configFile >> QUOTE(ADDON) >> _classTarget >> "duration") }; // _replaceNow needed for cba context menu to avoid potential duplications and such // replace the main Item private _equipmentType = ""; From 6f8c53d44627d8e6d56a8a6fa4eb5e7e0c05c089 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 4 Jun 2025 23:11:09 +0200 Subject: [PATCH 271/305] improve readability --- addons/wardrobe/dev/getAllWardrobeItems.sqf | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/addons/wardrobe/dev/getAllWardrobeItems.sqf b/addons/wardrobe/dev/getAllWardrobeItems.sqf index 18b72a4a0be..49af4861854 100644 --- a/addons/wardrobe/dev/getAllWardrobeItems.sqf +++ b/addons/wardrobe/dev/getAllWardrobeItems.sqf @@ -16,4 +16,10 @@ * Public: Yes */ -flatten ( ["CfgWeapons", "CfgGlasses"] apply { ( QUOTE(_x call FUNC(isModifiable)) configClasses (configFile >> _x) ) } ) apply { configName _x } +private _return = []; + +{ + _return append (QUOTE(_x call FUNC(isModifiable)) configClasses (configFile >> _x)); +} forEach ["CfgWeapons", "CfgGlasses"]; + +_return apply { configName _x } // return From ebf0b33a533480b215add69642003b75ce2d2c23 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 4 Jun 2025 23:14:14 +0200 Subject: [PATCH 272/305] rm comment --- addons/wardrobe/dev/getAllWardrobeItems.sqf | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/wardrobe/dev/getAllWardrobeItems.sqf b/addons/wardrobe/dev/getAllWardrobeItems.sqf index 49af4861854..342774cb52e 100644 --- a/addons/wardrobe/dev/getAllWardrobeItems.sqf +++ b/addons/wardrobe/dev/getAllWardrobeItems.sqf @@ -10,7 +10,6 @@ * Wardobe items, either as classname or config * * Example: - * true call ace_wardrobe_fnc_getAllWardrobeItems; * call compile preprocessFileLineNumbers "z\ace\addons\wardrobe\dev\getAllWardrobeItems.sqf"; * * Public: Yes From 5eb71c05e46a8a68fab1a4a74835e7e6a089b295 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 4 Jun 2025 23:14:31 +0200 Subject: [PATCH 273/305] Update compareContainerMaxLoad.sqf --- addons/wardrobe/dev/compareContainerMaxLoad.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/wardrobe/dev/compareContainerMaxLoad.sqf b/addons/wardrobe/dev/compareContainerMaxLoad.sqf index 5c90c6dc35d..d2649e67d7e 100644 --- a/addons/wardrobe/dev/compareContainerMaxLoad.sqf +++ b/addons/wardrobe/dev/compareContainerMaxLoad.sqf @@ -15,8 +15,8 @@ * Public: no */ -private _allWardrobeItems = flatten ( ["CfgWeapons", "CfgGlasses"] apply { ( QUOTE(_x call FUNC(isModifiable)) configClasses (configFile >> _x) ) } ) select { - switch ( getNumber (_x >> "ItemInfo" >> "type") ) do { +private _allWardrobeItems = call compile preprocessFileLineNumbers "z\ace\addons\wardrobe\dev\getAllWardrobeItems.sqf" select { + switch (getNumber (_x >> "ItemInfo" >> "type")) do { case TYPE_GOGGLE: { false; }; case TYPE_HEADGEAR: { false; }; case default { true }; From 29d4e8a7b969b0a0d8ca79e42a92ed59d22914b4 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 4 Jun 2025 23:19:02 +0200 Subject: [PATCH 274/305] rm leading/trailing spaces inside () and [] --- addons/wardrobe/XEH_postInit.sqf | 2 +- addons/wardrobe/functions/fnc_addActionsIcon.sqf | 2 +- addons/wardrobe/functions/fnc_addActionsName.sqf | 2 +- addons/wardrobe/functions/fnc_cacheGet.sqf | 2 +- addons/wardrobe/functions/fnc_cacheSet.sqf | 2 +- .../functions/fnc_clearOnClosedInteractionMenu.sqf | 4 ++-- addons/wardrobe/functions/fnc_getIndexFromMagID.sqf | 2 +- addons/wardrobe/functions/fnc_getItemsAll.sqf | 2 +- addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf | 4 ++-- .../wardrobe/functions/fnc_getItemsModifiableCurrent.sqf | 6 +++--- addons/wardrobe/functions/fnc_isModifiable.sqf | 2 +- addons/wardrobe/functions/fnc_nextVariantDo.sqf | 2 +- addons/wardrobe/functions/fnc_nextVariantGet.sqf | 8 ++++---- addons/wardrobe/functions/fnc_replace.sqf | 8 ++++---- addons/wardrobe/functions/fnc_replaceContainer.sqf | 2 +- addons/wardrobe/functions/fnc_setIndexForMagID.sqf | 2 +- addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf | 2 +- 17 files changed, 27 insertions(+), 27 deletions(-) diff --git a/addons/wardrobe/XEH_postInit.sqf b/addons/wardrobe/XEH_postInit.sqf index 5947862becf..f73f6987ac7 100644 --- a/addons/wardrobe/XEH_postInit.sqf +++ b/addons/wardrobe/XEH_postInit.sqf @@ -1,3 +1,3 @@ #include "script_component.hpp" -[ QGVAR(updateMagIDs), FUNC(spareBarrelUpdateMagIDs) ] call CBA_fnc_addEventHandler; +[QGVAR(updateMagIDs), FUNC(spareBarrelUpdateMagIDs)] call CBA_fnc_addEventHandler; diff --git a/addons/wardrobe/functions/fnc_addActionsIcon.sqf b/addons/wardrobe/functions/fnc_addActionsIcon.sqf index e15a17ba0b2..1a6741ee67d 100644 --- a/addons/wardrobe/functions/fnc_addActionsIcon.sqf +++ b/addons/wardrobe/functions/fnc_addActionsIcon.sqf @@ -15,7 +15,7 @@ * Public: No */ -params [ ["_cfg", configNull, [configNull] ] ]; +params [["_cfg", configNull, [configNull]]]; if (isNull _cfg) exitWith {}; diff --git a/addons/wardrobe/functions/fnc_addActionsName.sqf b/addons/wardrobe/functions/fnc_addActionsName.sqf index e502eddd630..e08e8a055f5 100644 --- a/addons/wardrobe/functions/fnc_addActionsName.sqf +++ b/addons/wardrobe/functions/fnc_addActionsName.sqf @@ -15,7 +15,7 @@ * Public: No */ -params [ ["_cfg", configNull, [configNull] ] ]; +params [["_cfg", configNull, [configNull]]]; private _altDispName = getText (configFile >> QUOTE(ADDON) >> configName _cfg >> "alternativeDisplayName"); if (_altDispName isEqualTo "") then { getText (_cfg >> "displayName") } else { _altDispName }; diff --git a/addons/wardrobe/functions/fnc_cacheGet.sqf b/addons/wardrobe/functions/fnc_cacheGet.sqf index e782562ed32..0bc429a7b01 100644 --- a/addons/wardrobe/functions/fnc_cacheGet.sqf +++ b/addons/wardrobe/functions/fnc_cacheGet.sqf @@ -17,7 +17,7 @@ * Public: Yes */ -params [ [ "_key", "", [""] ], [ "_else", nil, [{}] ] ]; +params [["_key", "", [""]], ["_else", nil, [{}]]]; if (isNil "_else") then { GVAR(cache) getOrDefault [_key, nil]; diff --git a/addons/wardrobe/functions/fnc_cacheSet.sqf b/addons/wardrobe/functions/fnc_cacheSet.sqf index dba02eeb584..4f4ea684eaf 100644 --- a/addons/wardrobe/functions/fnc_cacheSet.sqf +++ b/addons/wardrobe/functions/fnc_cacheSet.sqf @@ -16,7 +16,7 @@ * Public: Yes */ -params [ ["_key", "", [""] ], ["_value", nil] ]; +params [["_key", "", [""]], ["_value", nil]]; if (isNil "_value") exitWith { false }; diff --git a/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf b/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf index d0632ec7cbd..d5bb7fe389b 100644 --- a/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf +++ b/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf @@ -15,7 +15,7 @@ * Public: yes */ -params [ ["_key", "", [""]] ]; +params [["_key", "", [""]]]; if (isNil QGVAR(menuClearQueue)) then { [ @@ -23,7 +23,7 @@ if (isNil QGVAR(menuClearQueue)) then { { if (_this isNotEqualTo [1]) exitWith {}; - { GVAR(cache) deleteAt _x } forEach ( missionNamespace getVariable [QGVAR(menuClearQueue), [] ] ); + { GVAR(cache) deleteAt _x } forEach (missionNamespace getVariable [QGVAR(menuClearQueue), []]); GVAR(menuClearQueue) = nil; [_thisType, _thisId] call CBA_fnc_removeEventHandler; diff --git a/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf index 94ed3d67933..a28bce2d035 100644 --- a/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf +++ b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf @@ -15,7 +15,7 @@ * Public: Yes */ -params [ ["_magazineID", "", [""] ] ]; +params [["_magazineID", "", [""]]]; if !(_magazineID in allVariables EGVAR(intelItems,intelMap)) exitWith { -1 }; diff --git a/addons/wardrobe/functions/fnc_getItemsAll.sqf b/addons/wardrobe/functions/fnc_getItemsAll.sqf index 671cecf1f2b..f402409cad7 100644 --- a/addons/wardrobe/functions/fnc_getItemsAll.sqf +++ b/addons/wardrobe/functions/fnc_getItemsAll.sqf @@ -16,7 +16,7 @@ * Public: No */ -params [ ["_unit", objNull, [objNull]], ["_cache", true, [true]] ]; +params [["_unit", objNull, [objNull]], ["_cache", true, [true]]]; private _code = { flatten getUnitLoadout _unit select { _x isEqualType "" && { _x != ""}}; }; diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf index 6ec48bb3673..aad1a3e456e 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf @@ -16,7 +16,7 @@ * Public: Yes */ -params [ ["_unit", objNull, [objNull]], ["_cache", true, [true]] ]; +params [["_unit", objNull, [objNull]], ["_cache", true, [true]]]; private _code = { _unit call FUNC(getItemsAll) @@ -25,7 +25,7 @@ private _code = { select { _x call FUNC(isModifiable) } apply - { [_x, _x call FUNC(getItemsModifiableTo) ] } + { [_x, _x call FUNC(getItemsModifiableTo)] } select { (_x#1) isNotEqualTo [] } apply diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf index 88b0e9987e5..ab797c59998 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf @@ -16,16 +16,16 @@ * Public: Yes */ -params [ ["_unit", objNull, [objNull]], ["_cache", true, [true]] ]; +params [["_unit", objNull, [objNull]], ["_cache", true, [true]]]; private _code = { - ( [headgear _unit, goggles _unit, uniform _unit, vest _unit, backpack _unit] - [""] ) + ([headgear _unit, goggles _unit, uniform _unit, vest _unit, backpack _unit] - [""]) apply { _x call CBA_fnc_getItemConfig } select { _x call FUNC(isModifiable) } apply - { [_x, _x call FUNC(getItemsModifiableTo) ] } // will return an array, even if the target variants are not available + { [_x, _x call FUNC(getItemsModifiableTo)] } // will return an array, even if the target variants are not available select { (_x#1) isNotEqualTo [] } apply diff --git a/addons/wardrobe/functions/fnc_isModifiable.sqf b/addons/wardrobe/functions/fnc_isModifiable.sqf index b4efce40cb7..4f3b113b1df 100644 --- a/addons/wardrobe/functions/fnc_isModifiable.sqf +++ b/addons/wardrobe/functions/fnc_isModifiable.sqf @@ -15,6 +15,6 @@ * Public: No */ -params [ ["_cfg", configNull, [configNull]] ]; +params [["_cfg", configNull, [configNull]]]; !isNull _cfg && { isClass (configFile >> QUOTE(ADDON) >> configName _cfg) } diff --git a/addons/wardrobe/functions/fnc_nextVariantDo.sqf b/addons/wardrobe/functions/fnc_nextVariantDo.sqf index 98c3db75199..99b74b0187b 100644 --- a/addons/wardrobe/functions/fnc_nextVariantDo.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantDo.sqf @@ -23,7 +23,7 @@ params ["_unit", "", "_item", "", ""]; private _cfgCurrent = _item call CBA_fnc_getItemConfig; -private _cfgTarget = [ _cfgCurrent ] call FUNC(nextVariantGet); +private _cfgTarget = [_cfgCurrent, _unit] call FUNC(nextVariantGet); if (_cfgTarget isEqualTo false) exitWith {}; diff --git a/addons/wardrobe/functions/fnc_nextVariantGet.sqf b/addons/wardrobe/functions/fnc_nextVariantGet.sqf index e3e651c7b57..a6ddc0f5b9c 100644 --- a/addons/wardrobe/functions/fnc_nextVariantGet.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantGet.sqf @@ -18,7 +18,7 @@ * Public: No */ -params ["_cfgCurrent"]; +params ["_cfgCurrent", "_unit"]; private _cfgModifiableTo = [_cfgCurrent, false] call FUNC(getItemsModifiableTo); @@ -33,7 +33,7 @@ if (_cfgHistory isEqualTo "") then { missionNamespace setVariable [QGVAR(variantHistory), _cfgHistory]; - ACE_player addEventHandler ["InventoryClosed", { + _unit addEventHandler ["InventoryClosed", { GVAR(variantHistory) = nil; ACE_player removeEventHandler [_thisEvent, _thisEventhandler]; }]; @@ -41,14 +41,14 @@ if (_cfgHistory isEqualTo "") then { private _remaining = _cfgModifiableTo - _cfgHistory; -_remaining = _remaining select { [ACE_player, _cfgCurrent, _x] call FUNC(canModifyTo) }; +_remaining = _remaining select { [_unit, _cfgCurrent, _x] call FUNC(canModifyTo) }; // returns either a random remaining item or alternatively, a random one from the complete array private _return = if (_remaining isNotEqualTo []) then { selectRandom _remaining } else { _cfgHistory = []; - missionNamespace setVariable [QGVAR(variantHistory), [] ]; + missionNamespace setVariable [QGVAR(variantHistory), []]; _cfgHistory pushBackUnique _cfgCurrent; selectRandom _cfgModifiableTo; }; diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 5c8cc7219b4..4eeaa9e75af 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -32,7 +32,7 @@ private _duration = if (_replaceNow) then { 0 } else { getNumber (configFile >> // replace the main Item private _equipmentType = ""; private _typeNumber = getNumber (_cfgOrigin >> "ItemInfo" >> "type"); -private _replaceCode = switch ( _typeNumber ) do { +private _replaceCode = switch (_typeNumber) do { case TYPE_HEADGEAR: { _equipmentType = "HEADGEAR"; FUNC(replaceOther) }; case TYPE_UNIFORM: { _equipmentType = "UNIFORM"; FUNC(replaceContainer) }; case TYPE_VEST: { _equipmentType = "VEST"; FUNC(replaceContainer) }; @@ -47,7 +47,7 @@ private _replaceCode = switch ( _typeNumber ) do { }; if (_replaceCode isEqualTo {}) exitWith { ERROR_2("typeNumber undefined: %1 - %2",_typeNumber,_classOrigin); }; -[ _replaceCode, [_unit, _cfgTarget, _equipmentType ], _duration] call CBA_fnc_waitAndExecute; +[_replaceCode, [_unit, _cfgTarget, _equipmentType], _duration] call CBA_fnc_waitAndExecute; // handle components [_cfgOrigin, _cfgTarget] call FUNC(compareComponents) params ["_missing", "_surplus"]; @@ -55,7 +55,7 @@ if (_replaceCode isEqualTo {}) exitWith { ERROR_2("typeNumber undefined: %1 - %2 // add surplus { if (_classTarget isNotEqualTo _x) then { - if ( goggles _unit isEqualTo "" && { isClass (configFile >> "CfgGlasses" >> _x) } ) then { + if (goggles _unit isEqualTo "" && { isClass (configFile >> "CfgGlasses" >> _x) }) then { _unit addGoggles _x; } else { [_unit, _x, true] call CBA_fnc_addItem; @@ -76,7 +76,7 @@ if (_replaceCode isEqualTo {}) exitWith { ERROR_2("typeNumber undefined: %1 - %2 // handle effects // animation/gestures -[ _unit, getText (configFile >> QUOTE(ADDON) >> _classTarget >> "gesture") ] call EFUNC(common,doGesture); +[_unit, getText (configFile >> QUOTE(ADDON) >> _classTarget >> "gesture")] call EFUNC(common,doGesture); // plays random sound at the beginning private _sound = [configFile >> QUOTE(ADDON) >> _classTarget >> "sound"] call CBA_fnc_getCfgDataRandom; diff --git a/addons/wardrobe/functions/fnc_replaceContainer.sqf b/addons/wardrobe/functions/fnc_replaceContainer.sqf index 2daf0d237e8..6f51c2094ec 100644 --- a/addons/wardrobe/functions/fnc_replaceContainer.sqf +++ b/addons/wardrobe/functions/fnc_replaceContainer.sqf @@ -31,7 +31,7 @@ INTEL_PRE(_photo,acex_intelitems_photo); // ace overheating private _spareBarrel = _magazineDetails findIf { _x#0 == "ACE_SpareBarrel" } > -1; -if (_spareBarrel) then { _spareBarrel = [_unit, "ACE_SpareBarrel" ] call CBA_fnc_getMagazineIndex }; +if (_spareBarrel) then { _spareBarrel = [_unit, "ACE_SpareBarrel"] call CBA_fnc_getMagazineIndex }; // replace wearable switch (_equipmentType) do { diff --git a/addons/wardrobe/functions/fnc_setIndexForMagID.sqf b/addons/wardrobe/functions/fnc_setIndexForMagID.sqf index da09f8160fd..7eecd9382e1 100644 --- a/addons/wardrobe/functions/fnc_setIndexForMagID.sqf +++ b/addons/wardrobe/functions/fnc_setIndexForMagID.sqf @@ -16,7 +16,7 @@ * Public: No */ -params [ ["_magID", "", [""]], ["_index", 0, [0]] ]; +params [["_magID", "", [""]], ["_index", 0, [0]]]; if (_index == -1) exitWith {}; diff --git a/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf b/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf index 859a5a8b169..eb3ac954d8d 100644 --- a/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf +++ b/addons/wardrobe/functions/fnc_spareBarrelUpdateMagIDs.sqf @@ -27,7 +27,7 @@ private _map = EGVAR(overheating,storedSpareBarrels); { private _oldID = _x; if !(_oldID in _map) then { continue }; - _map set [ _newMagIDs # _forEachIndex , _map deleteAt _oldID ]; + _map set [_newMagIDs # _forEachIndex , _map deleteAt _oldID]; } forEach _oldMagIDs; nil From 6d63060dabf1a6e46097156362131e370ad6c587 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 4 Jun 2025 23:32:52 +0200 Subject: [PATCH 275/305] Update fnc_replace.sqf --- addons/wardrobe/functions/fnc_replace.sqf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index d9102f6fb3a..7b22cb43380 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -33,10 +33,10 @@ private _duration = if (_replaceNow) then { 0 } else { getNumber (configFile >> private _equipmentType = ""; private _typeNumber = getNumber (_cfgOrigin >> "ItemInfo" >> "type"); private _replaceCode = switch (_typeNumber) do { - case TYPE_HEADGEAR: { _equipmentType = "HEADGEAR"; FUNC(replaceOther) }; - case TYPE_UNIFORM: { _equipmentType = "UNIFORM"; FUNC(replaceContainer) }; - case TYPE_VEST: { _equipmentType = "VEST"; FUNC(replaceContainer) }; - case TYPE_BACKPACK: { _equipmentType = "BACKPACK"; FUNC(replaceContainer) }; + case TYPE_HEADGEAR: { _equipmentType = "HEADGEAR"; LINKFUNC(replaceOther) }; + case TYPE_UNIFORM: { _equipmentType = "UNIFORM"; LINKFUNC(replaceContainer) }; + case TYPE_VEST: { _equipmentType = "VEST"; LINKFUNC(replaceContainer) }; + case TYPE_BACKPACK: { _equipmentType = "BACKPACK"; LINKFUNC(replaceContainer) }; default { // CfgGlasses items do not have a ItemInfo subclass and therefore, not typeNumber switch (true) do { From 9895157b5f8adab5ad93d695047e826aa5d27599 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 4 Jun 2025 23:47:00 +0200 Subject: [PATCH 276/305] isEqualTo "" -> isNil --- addons/wardrobe/functions/fnc_nextVariantGet.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/wardrobe/functions/fnc_nextVariantGet.sqf b/addons/wardrobe/functions/fnc_nextVariantGet.sqf index a6ddc0f5b9c..408a415861d 100644 --- a/addons/wardrobe/functions/fnc_nextVariantGet.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantGet.sqf @@ -24,9 +24,9 @@ private _cfgModifiableTo = [_cfgCurrent, false] call FUNC(getItemsModifiableTo); if (_cfgModifiableTo isEqualTo []) exitWith {false}; -private _cfgHistory = missionNamespace getVariable [QGVAR(variantHistory), ""]; +private _cfgHistory = missionNamespace getVariable [QGVAR(variantHistory), nil]; -if (_cfgHistory isEqualTo "") then { +if (isNil "_cfgHistory") then { _cfgHistory = []; _cfgHistory pushBackUnique _cfgCurrent; From 3480c79d1638603ec2b8744b9d4b9a3e6c31423c Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 4 Jun 2025 23:49:18 +0200 Subject: [PATCH 277/305] unify { } with leading/ending whitespace in .sqf --- addons/wardrobe/functions/fnc_addActions.sqf | 2 +- addons/wardrobe/functions/fnc_addActionsChildren.sqf | 2 +- addons/wardrobe/functions/fnc_addActionsIcon.sqf | 3 ++- addons/wardrobe/functions/fnc_compareComponents.sqf | 4 ++-- addons/wardrobe/functions/fnc_enableContextMenu.sqf | 2 +- addons/wardrobe/functions/fnc_getItemsAll.sqf | 2 +- addons/wardrobe/functions/fnc_replace.sqf | 6 +++--- 7 files changed, 11 insertions(+), 10 deletions(-) diff --git a/addons/wardrobe/functions/fnc_addActions.sqf b/addons/wardrobe/functions/fnc_addActions.sqf index b81548ea551..c747b316d4f 100644 --- a/addons/wardrobe/functions/fnc_addActions.sqf +++ b/addons/wardrobe/functions/fnc_addActions.sqf @@ -28,7 +28,7 @@ private _actions = []; getText (_cfg >> "displayName"), getText (_cfg >> "picture"), {}, - {true}, + { true }, FUNC(addActionsChildren), [_cfg, _x#1] ] call EFUNC(interact_menu,createAction); diff --git a/addons/wardrobe/functions/fnc_addActionsChildren.sqf b/addons/wardrobe/functions/fnc_addActionsChildren.sqf index b476f2f9485..64f9b05d25e 100644 --- a/addons/wardrobe/functions/fnc_addActionsChildren.sqf +++ b/addons/wardrobe/functions/fnc_addActionsChildren.sqf @@ -31,7 +31,7 @@ private _actions = []; _cfgTarget call FUNC(addActionsName), _cfgTarget call FUNC(addActionsIcon), FUNC(replace), - {true}, + { true }, {}, [_cfgOrigin, _cfgTarget] ] call EFUNC(interact_menu,createAction); diff --git a/addons/wardrobe/functions/fnc_addActionsIcon.sqf b/addons/wardrobe/functions/fnc_addActionsIcon.sqf index 1a6741ee67d..a1c84d657c4 100644 --- a/addons/wardrobe/functions/fnc_addActionsIcon.sqf +++ b/addons/wardrobe/functions/fnc_addActionsIcon.sqf @@ -20,4 +20,5 @@ params [["_cfg", configNull, [configNull]]]; if (isNull _cfg) exitWith {}; private _altDispIcon = getText (configFile >> QUOTE(ADDON) >> configName _cfg >> "alternativePicture"); -if (_altDispIcon isEqualTo "") then { getText (_cfg >> "picture") } else { _altDispIcon } + +if (_altDispIcon isEqualTo "") then { getText (_cfg >> "picture") } else { _altDispIcon } // return diff --git a/addons/wardrobe/functions/fnc_compareComponents.sqf b/addons/wardrobe/functions/fnc_compareComponents.sqf index 317edfdba58..52f443573e9 100644 --- a/addons/wardrobe/functions/fnc_compareComponents.sqf +++ b/addons/wardrobe/functions/fnc_compareComponents.sqf @@ -31,8 +31,8 @@ private _checkfallbackComponent = { }; }; -private _current = getArray (configFile >> QUOTE(ADDON) >> configName _cfgOrigin >> "components") apply _checkfallbackComponent select {_x isNotEqualTo ""}; -private _needed = getArray (configFile >> QUOTE(ADDON) >> configName _cfgTarget >> "components") apply _checkfallbackComponent select {_x isNotEqualTo ""}; +private _current = getArray (configFile >> QUOTE(ADDON) >> configName _cfgOrigin >> "components") apply _checkfallbackComponent select { _x isNotEqualTo "" }; +private _needed = getArray (configFile >> QUOTE(ADDON) >> configName _cfgTarget >> "components") apply _checkfallbackComponent select { _x isNotEqualTo "" }; private _missing = []; diff --git a/addons/wardrobe/functions/fnc_enableContextMenu.sqf b/addons/wardrobe/functions/fnc_enableContextMenu.sqf index 88ab0edcea1..2db50788793 100644 --- a/addons/wardrobe/functions/fnc_enableContextMenu.sqf +++ b/addons/wardrobe/functions/fnc_enableContextMenu.sqf @@ -17,7 +17,7 @@ params [["_enable", true, [true]]]; -if (_enable && {!(missionNamespace getVariable [QGVAR(contextmenuEnabled), false])}) then { +if (_enable && { !(missionNamespace getVariable [QGVAR(contextmenuEnabled), false]) }) then { missionNamespace setVariable [QGVAR(contextmenuEnabled), true]; [ diff --git a/addons/wardrobe/functions/fnc_getItemsAll.sqf b/addons/wardrobe/functions/fnc_getItemsAll.sqf index f402409cad7..7c192e04441 100644 --- a/addons/wardrobe/functions/fnc_getItemsAll.sqf +++ b/addons/wardrobe/functions/fnc_getItemsAll.sqf @@ -18,7 +18,7 @@ params [["_unit", objNull, [objNull]], ["_cache", true, [true]]]; -private _code = { flatten getUnitLoadout _unit select { _x isEqualType "" && { _x != ""}}; }; +private _code = { flatten getUnitLoadout _unit select { _x isEqualType "" && { _x != "" } }; }; private _caching = { ["items_all"] call FUNC(clearOnClosedInteractionMenu); diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 7b22cb43380..6cbf99d2ef1 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -34,9 +34,9 @@ private _equipmentType = ""; private _typeNumber = getNumber (_cfgOrigin >> "ItemInfo" >> "type"); private _replaceCode = switch (_typeNumber) do { case TYPE_HEADGEAR: { _equipmentType = "HEADGEAR"; LINKFUNC(replaceOther) }; - case TYPE_UNIFORM: { _equipmentType = "UNIFORM"; LINKFUNC(replaceContainer) }; - case TYPE_VEST: { _equipmentType = "VEST"; LINKFUNC(replaceContainer) }; - case TYPE_BACKPACK: { _equipmentType = "BACKPACK"; LINKFUNC(replaceContainer) }; + case TYPE_UNIFORM: { _equipmentType = "UNIFORM"; LINKFUNC(replaceContainer) }; + case TYPE_VEST: { _equipmentType = "VEST"; LINKFUNC(replaceContainer) }; + case TYPE_BACKPACK: { _equipmentType = "BACKPACK"; LINKFUNC(replaceContainer) }; default { // CfgGlasses items do not have a ItemInfo subclass and therefore, not typeNumber switch (true) do { From e96b65559361813b41a27e59d28a935fb0e2cc80 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 4 Jun 2025 23:49:29 +0200 Subject: [PATCH 278/305] return false -> configNull --- addons/wardrobe/functions/fnc_nextVariantGet.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_nextVariantGet.sqf b/addons/wardrobe/functions/fnc_nextVariantGet.sqf index 408a415861d..786336a163d 100644 --- a/addons/wardrobe/functions/fnc_nextVariantGet.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantGet.sqf @@ -22,7 +22,7 @@ params ["_cfgCurrent", "_unit"]; private _cfgModifiableTo = [_cfgCurrent, false] call FUNC(getItemsModifiableTo); -if (_cfgModifiableTo isEqualTo []) exitWith {false}; +if (_cfgModifiableTo isEqualTo []) exitWith { configNull }; private _cfgHistory = missionNamespace getVariable [QGVAR(variantHistory), nil]; From 38a9fe9d701d9d69c5b84d2ef1f9a63788470742 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 4 Jun 2025 23:49:38 +0200 Subject: [PATCH 279/305] FUNC -> LINKFUNC --- addons/wardrobe/functions/fnc_replace.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 6cbf99d2ef1..038b3805d7c 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -40,7 +40,7 @@ private _replaceCode = switch (_typeNumber) do { default { // CfgGlasses items do not have a ItemInfo subclass and therefore, not typeNumber switch (true) do { - case (isClass (configFile >> "CfgGlasses" >> _classOrigin)): { _equipmentType = "FACEWEAR"; FUNC(replaceOther) }; + case (isClass (configFile >> "CfgGlasses" >> _classOrigin)): { _equipmentType = "FACEWEAR"; LINKFUNC(replaceOther) }; default { {} }; }; }; From 42fdeb017f402291194b89188dcc03ccf2b74142 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 5 Jun 2025 00:14:19 +0200 Subject: [PATCH 280/305] use classname instead of config where possible Due to how previously all wardrobe info was stored inside the items config, before it got moved into configFile >> ACE_Wardrobe, alot of configs were not needed anymore and could be replaced directly with the classname. --- addons/wardrobe/functions/fnc_compareComponents.sqf | 6 +++--- addons/wardrobe/functions/fnc_replace.sqf | 4 ++-- addons/wardrobe/functions/fnc_replaceContainer.sqf | 13 +++++++------ addons/wardrobe/functions/fnc_replaceOther.sqf | 11 ++++++----- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/addons/wardrobe/functions/fnc_compareComponents.sqf b/addons/wardrobe/functions/fnc_compareComponents.sqf index 52f443573e9..79ae86972de 100644 --- a/addons/wardrobe/functions/fnc_compareComponents.sqf +++ b/addons/wardrobe/functions/fnc_compareComponents.sqf @@ -18,7 +18,7 @@ * Public: No */ -params ["_cfgOrigin", "_cfgTarget"]; +params ["_classOrigin", "_cfgTarget"]; private _checkfallbackComponent = { // check if item is present within current modpack @@ -31,8 +31,8 @@ private _checkfallbackComponent = { }; }; -private _current = getArray (configFile >> QUOTE(ADDON) >> configName _cfgOrigin >> "components") apply _checkfallbackComponent select { _x isNotEqualTo "" }; -private _needed = getArray (configFile >> QUOTE(ADDON) >> configName _cfgTarget >> "components") apply _checkfallbackComponent select { _x isNotEqualTo "" }; +private _current = getArray (configFile >> QUOTE(ADDON) >> _classOrigin >> "components") apply _checkfallbackComponent select { _x isNotEqualTo "" }; +private _needed = getArray (configFile >> QUOTE(ADDON) >> _classTarget >> "components") apply _checkfallbackComponent select { _x isNotEqualTo "" }; private _missing = []; diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 038b3805d7c..d30e4129bdb 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -47,10 +47,10 @@ private _replaceCode = switch (_typeNumber) do { }; if (_replaceCode isEqualTo {}) exitWith { ERROR_2("typeNumber undefined: %1 - %2",_typeNumber,_classOrigin); }; -[_replaceCode, [_unit, _cfgTarget, _equipmentType], _duration] call CBA_fnc_waitAndExecute; +[_replaceCode, [_unit, _classTarget, _equipmentType], _duration] call CBA_fnc_waitAndExecute; // handle components -[_cfgOrigin, _cfgTarget] call FUNC(compareComponents) params ["_missing", "_surplus"]; +[_classOrigin, _classTarget] call FUNC(compareComponents) params ["_missing", "_surplus"]; // add surplus { diff --git a/addons/wardrobe/functions/fnc_replaceContainer.sqf b/addons/wardrobe/functions/fnc_replaceContainer.sqf index 6f51c2094ec..5e5cf474f33 100644 --- a/addons/wardrobe/functions/fnc_replaceContainer.sqf +++ b/addons/wardrobe/functions/fnc_replaceContainer.sqf @@ -5,19 +5,20 @@ * * Arguments: * 0: Unit - * 1: Desired variant + * 1: Desired variant as classname * 2: Type of wearable container * * Return Value: * None * * Example: - * [_unit, _cfgTarget, _equipmentType] call ace_wardrobe_fnc_replaceContainer + * [player, "U_B_CTRG_3", UNIFORM] call ace_wardrobe_fnc_replaceContainer + * [player, "U_B_CTRG_1", UNIFORM] call ace_wardrobe_fnc_replaceContainer * * Public: No */ -params ["_unit", "_cfgTarget", "_equipmentType"]; +params ["_unit", "_classTarget", "_equipmentType"]; toFixed 0; private _magazineDetails = (magazinesAmmoFull _unit) apply { [_x#0, _x#-2, _x#-1] }; @@ -35,9 +36,9 @@ if (_spareBarrel) then { _spareBarrel = [_unit, "ACE_SpareBarrel"] call CBA_fnc_ // replace wearable switch (_equipmentType) do { - case "UNIFORM": { _loadout # 0 # 3 set [0, configName _cfgTarget]; }; - case "VEST": { _loadout # 0 # 4 set [0, configName _cfgTarget]; }; - case "BACKPACK": { _loadout # 0 # 5 set [0, configName _cfgTarget]; }; + case "UNIFORM": { _loadout # 0 # 3 set [0, _classTarget]; }; + case "VEST": { _loadout # 0 # 4 set [0, _classTarget]; }; + case "BACKPACK": { _loadout # 0 # 5 set [0, _classTarget]; }; }; // apply new loadout diff --git a/addons/wardrobe/functions/fnc_replaceOther.sqf b/addons/wardrobe/functions/fnc_replaceOther.sqf index f8519331134..2a91b614f8c 100644 --- a/addons/wardrobe/functions/fnc_replaceOther.sqf +++ b/addons/wardrobe/functions/fnc_replaceOther.sqf @@ -5,27 +5,28 @@ * * Arguments: * 0: Unit - * 1: Desired variant + * 1: Desired variant as classname * 2: Type of wearable container * * Return Value: * None * * Example: - * [_unit, _cfgTarget, _equipmentType] call ace_wardrobe_fnc_replaceOther + * [player, "G_Bandanna_blk", FACEWEAR] call ace_wardrobe_fnc_replaceOther + * [player, "G_Bandanna_aviator", FACEWEAR] call ace_wardrobe_fnc_replaceOther * * Public: No */ -params ["_unit", "_cfgTarget", "_equipmentType"]; +params ["_unit", "_classTarget", "_equipmentType"]; switch (_equipmentType) do { case "HEADGEAR": { removeHeadgear _unit; - _unit addHeadgear configName _cfgTarget; + _unit addHeadgear _classTarget; }; case "FACEWEAR": { removeGoggles _unit; - _unit addGoggles configName _cfgTarget; + _unit addGoggles _classTarget; }; }; From ea5b6263f4dc21cf6747bf30bd689f7107b521a2 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 5 Jun 2025 02:42:26 +0200 Subject: [PATCH 281/305] applicable examples --- addons/wardrobe/functions/fnc_addActions.sqf | 2 +- addons/wardrobe/functions/fnc_addActionsChildren.sqf | 2 +- addons/wardrobe/functions/fnc_addActionsCondition.sqf | 2 +- addons/wardrobe/functions/fnc_addActionsIcon.sqf | 2 +- addons/wardrobe/functions/fnc_addActionsName.sqf | 2 +- addons/wardrobe/functions/fnc_canModifyTo.sqf | 4 ++-- addons/wardrobe/functions/fnc_compareComponents.sqf | 4 ++-- addons/wardrobe/functions/fnc_getIndexFromMagID.sqf | 5 ++++- addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf | 2 +- addons/wardrobe/functions/fnc_isModifiable.sqf | 2 +- addons/wardrobe/functions/fnc_nextVariantDo.sqf | 2 +- addons/wardrobe/functions/fnc_nextVariantGet.sqf | 2 +- addons/wardrobe/functions/fnc_replace.sqf | 2 +- addons/wardrobe/functions/fnc_setIndexForMagID.sqf | 4 +++- 14 files changed, 21 insertions(+), 16 deletions(-) diff --git a/addons/wardrobe/functions/fnc_addActions.sqf b/addons/wardrobe/functions/fnc_addActions.sqf index c747b316d4f..e35b038d628 100644 --- a/addons/wardrobe/functions/fnc_addActions.sqf +++ b/addons/wardrobe/functions/fnc_addActions.sqf @@ -11,7 +11,7 @@ * ACE actions * * Example: - * _player call ace_wardrobe_fnc_addActions + * player call ace_wardrobe_fnc_addActions * * Public: No */ diff --git a/addons/wardrobe/functions/fnc_addActionsChildren.sqf b/addons/wardrobe/functions/fnc_addActionsChildren.sqf index 64f9b05d25e..53785bec3e1 100644 --- a/addons/wardrobe/functions/fnc_addActionsChildren.sqf +++ b/addons/wardrobe/functions/fnc_addActionsChildren.sqf @@ -14,7 +14,7 @@ * Array of ace child actions * * Example: - * _this call ace_wardrobe_fnc_addActionsChildren + * [player, nil, [configFile >> "CfgWeapons" >> "U_B_CTRG_1", [configFile >> "CfgWeapons" >> "U_B_CTRG_3"]]] call ace_wardrobe_fnc_addActionsChildren * * Public: No */ diff --git a/addons/wardrobe/functions/fnc_addActionsCondition.sqf b/addons/wardrobe/functions/fnc_addActionsCondition.sqf index 3e72dc32b62..af7a044afb6 100644 --- a/addons/wardrobe/functions/fnc_addActionsCondition.sqf +++ b/addons/wardrobe/functions/fnc_addActionsCondition.sqf @@ -10,7 +10,7 @@ * condition * * Example: - * _player call ace_wardrobe_fnc_addActionsCondition + * player call ace_wardrobe_fnc_addActionsCondition * * Public: No */ diff --git a/addons/wardrobe/functions/fnc_addActionsIcon.sqf b/addons/wardrobe/functions/fnc_addActionsIcon.sqf index a1c84d657c4..a61b7678e67 100644 --- a/addons/wardrobe/functions/fnc_addActionsIcon.sqf +++ b/addons/wardrobe/functions/fnc_addActionsIcon.sqf @@ -10,7 +10,7 @@ * Path to icon or "" * * Example: - * _cfg call ace_wardrobe_fnc_getActionIcon + * (configFile >> "CfgWeapons" >> "U_B_CTRG_1") call ace_wardrobe_fnc_getActionIcon * * Public: No */ diff --git a/addons/wardrobe/functions/fnc_addActionsName.sqf b/addons/wardrobe/functions/fnc_addActionsName.sqf index e08e8a055f5..f1fcac1bc01 100644 --- a/addons/wardrobe/functions/fnc_addActionsName.sqf +++ b/addons/wardrobe/functions/fnc_addActionsName.sqf @@ -10,7 +10,7 @@ * The return value * * Example: - * _cfg call ace_wardrobe_fnc_getActionsName + * (configFile >> "CfgWeapons" >> "U_B_CTRG_1") call ace_wardrobe_fnc_getActionsName * * Public: No */ diff --git a/addons/wardrobe/functions/fnc_canModifyTo.sqf b/addons/wardrobe/functions/fnc_canModifyTo.sqf index 74186254b8b..358941a4976 100644 --- a/addons/wardrobe/functions/fnc_canModifyTo.sqf +++ b/addons/wardrobe/functions/fnc_canModifyTo.sqf @@ -13,14 +13,14 @@ * Result * * Example: - * [_unit, _cfgOrigin, _cfgTarget] call ace_wardrobe_fnc_canModifyTo + * [player, configFile >> "CfgWeapons" >> "U_B_CTRG_1", configFile >> "CfgWeapons" >> "U_B_CTRG_3"] call ace_wardrobe_fnc_canModifyTo * * Public: No */ params ["_unit", "_cfgOrigin", "_cfgTarget", ["_cache", true, [true]]]; -[_cfgOrigin, _cfgTarget] call FUNC(compareComponents) params ["_missing", ""]; +[configName _cfgOrigin, configName _cfgTarget] call FUNC(compareComponents) params ["_missing", ""]; private _currentItems = [_unit, _cache] call FUNC(getItemsAll); diff --git a/addons/wardrobe/functions/fnc_compareComponents.sqf b/addons/wardrobe/functions/fnc_compareComponents.sqf index 79ae86972de..1eb0fa0658f 100644 --- a/addons/wardrobe/functions/fnc_compareComponents.sqf +++ b/addons/wardrobe/functions/fnc_compareComponents.sqf @@ -13,12 +13,12 @@ * - Configs of surplus components * * Example: - * [_cfgOrigin, _cfgTarget] call ace_wardrobe_fnc_compareComponents + * [G_Balaclava_blk, G_Balaclava_combat] call ace_wardrobe_fnc_compareComponents * * Public: No */ -params ["_classOrigin", "_cfgTarget"]; +params ["_classOrigin", "_classTarget"]; private _checkfallbackComponent = { // check if item is present within current modpack diff --git a/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf index a28bce2d035..252018d9902 100644 --- a/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf +++ b/addons/wardrobe/functions/fnc_getIndexFromMagID.sqf @@ -10,7 +10,10 @@ * Index * * Example: - * _magID call ace_wardrobe_fnc_getIndexFromMagID + * toFixed 0; + * private _magazineDetails = (magazinesAmmoFull player) apply { [_x#0, _x#-2, _x#-1] }; + * private _documents = _magazineDetails findIf { _x select 0 == "acex_intelitems_document" } > -1; + * if (_documents) then { _documents = [player, "acex_intelitems_document"] call CBA_fnc_getMagazineIndex apply { _x call ace_wardrobe_fnc_getIndexFromMagID } }; * * Public: Yes */ diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf index 8bd415e4bfb..ecb7da13954 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableTo.sqf @@ -10,7 +10,7 @@ * Array of all possible variants as config * * Example: - * _cfgCurrent call ace_wardrobe_fnc_getItemsModifiableTo + * (configFile >> "CfgWeapons" >> "U_B_CTRG_1") call ace_wardrobe_fnc_getItemsModifiableTo * * Public: No */ diff --git a/addons/wardrobe/functions/fnc_isModifiable.sqf b/addons/wardrobe/functions/fnc_isModifiable.sqf index 4f3b113b1df..2f024540737 100644 --- a/addons/wardrobe/functions/fnc_isModifiable.sqf +++ b/addons/wardrobe/functions/fnc_isModifiable.sqf @@ -10,7 +10,7 @@ * Result * * Example: - * _cfg call ace_wardrobe_fnc_isModifiable + * (configFile >> "CfgWeapons" >> "U_B_CTRG_1") call ace_wardrobe_fnc_isModifiable * * Public: No */ diff --git a/addons/wardrobe/functions/fnc_nextVariantDo.sqf b/addons/wardrobe/functions/fnc_nextVariantDo.sqf index 99b74b0187b..74d51acd1ee 100644 --- a/addons/wardrobe/functions/fnc_nextVariantDo.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantDo.sqf @@ -14,7 +14,7 @@ * None * * Example: - * [_unit, _container, _item, _slot, _params] call ace_wardrobe_fnc_nextVariantDo; + * [player, nil, G_Balaclava_combat] call ace_wardrobe_fnc_nextVariantDo; * * Public: No */ diff --git a/addons/wardrobe/functions/fnc_nextVariantGet.sqf b/addons/wardrobe/functions/fnc_nextVariantGet.sqf index 786336a163d..4666148b9d8 100644 --- a/addons/wardrobe/functions/fnc_nextVariantGet.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantGet.sqf @@ -13,7 +13,7 @@ * Desired variant * * Example: - * _cfgCurrent call ace_wardrobe_fnc_nextVariantGet + * [configFile >> "CfgWeapons" >> "U_B_CTRG_1", player] call ace_wardrobe_fnc_nextVariantGet * * Public: No */ diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index d30e4129bdb..69858d9828b 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -15,7 +15,7 @@ * None * * Example: - * _this call ace_wardrobe_fnc_replace + * [nil, player, [configFile >> "CfgWeapons" >> "U_B_CTRG_1", configFile >> "CfgWeapons" >> "U_B_CTRG_1"]] call ace_wardrobe_fnc_replace * * Public: No */ diff --git a/addons/wardrobe/functions/fnc_setIndexForMagID.sqf b/addons/wardrobe/functions/fnc_setIndexForMagID.sqf index 7eecd9382e1..d9e0565387c 100644 --- a/addons/wardrobe/functions/fnc_setIndexForMagID.sqf +++ b/addons/wardrobe/functions/fnc_setIndexForMagID.sqf @@ -11,7 +11,9 @@ * None * * Example: - * [_magID, _index] call ace_wardrobe_fnc_setIndexForMagID + * toFixed 0; + * private _magazineDetails = (magazinesAmmoFull player) apply { [_x#0, _x#-2, _x#-1] } select { _x#0 == "acex_intelitems_document" }; + * { [_x#1, 69] call ace_wardrobe_fnc_setIndexForMagID } forEach _magazineDetails; * * Public: No */ From 0092033cc0433400a190044273380a751d9deaf6 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 5 Jun 2025 02:58:23 +0200 Subject: [PATCH 282/305] _unit -> _player upon further thoughts i cannot think of a way where it would make sense to use the wardrobe framework to change the wearable for an ai unit. simply changing them via code directly is nearly always simpler and faster. --- addons/wardrobe/functions/fnc_addActions.sqf | 6 +++--- addons/wardrobe/functions/fnc_canModifyTo.sqf | 4 ++-- addons/wardrobe/functions/fnc_getItemsAll.sqf | 4 ++-- .../functions/fnc_getItemsModifiableAll.sqf | 6 +++--- .../fnc_getItemsModifiableCurrent.sqf | 6 +++--- .../wardrobe/functions/fnc_nextVariantDo.sqf | 8 ++++---- .../wardrobe/functions/fnc_nextVariantGet.sqf | 6 +++--- addons/wardrobe/functions/fnc_replace.sqf | 20 +++++++++---------- .../functions/fnc_replaceContainer.sqf | 12 +++++------ .../wardrobe/functions/fnc_replaceOther.sqf | 10 +++++----- 10 files changed, 41 insertions(+), 41 deletions(-) diff --git a/addons/wardrobe/functions/fnc_addActions.sqf b/addons/wardrobe/functions/fnc_addActions.sqf index e35b038d628..16ed0383a78 100644 --- a/addons/wardrobe/functions/fnc_addActions.sqf +++ b/addons/wardrobe/functions/fnc_addActions.sqf @@ -16,9 +16,9 @@ * Public: No */ -params ["_unit"]; +params ["_player"]; -private _modifiableItems = _unit call FUNC(getItemsModifiableCurrent); +private _modifiableItems = _player call FUNC(getItemsModifiableCurrent); private _actions = []; { @@ -32,7 +32,7 @@ private _actions = []; FUNC(addActionsChildren), [_cfg, _x#1] ] call EFUNC(interact_menu,createAction); - _actions pushBack [_aceAction, [], _unit]; + _actions pushBack [_aceAction, [], _player]; } forEach _modifiableItems; _actions diff --git a/addons/wardrobe/functions/fnc_canModifyTo.sqf b/addons/wardrobe/functions/fnc_canModifyTo.sqf index 358941a4976..c41d7e5d7b8 100644 --- a/addons/wardrobe/functions/fnc_canModifyTo.sqf +++ b/addons/wardrobe/functions/fnc_canModifyTo.sqf @@ -18,10 +18,10 @@ * Public: No */ -params ["_unit", "_cfgOrigin", "_cfgTarget", ["_cache", true, [true]]]; +params ["_player", "_cfgOrigin", "_cfgTarget", ["_cache", true, [true]]]; [configName _cfgOrigin, configName _cfgTarget] call FUNC(compareComponents) params ["_missing", ""]; -private _currentItems = [_unit, _cache] call FUNC(getItemsAll); +private _currentItems = [_player, _cache] call FUNC(getItemsAll); _missing select { ! (_x in _currentItems) } isEqualTo [] // return diff --git a/addons/wardrobe/functions/fnc_getItemsAll.sqf b/addons/wardrobe/functions/fnc_getItemsAll.sqf index 7c192e04441..c00cb10ae4b 100644 --- a/addons/wardrobe/functions/fnc_getItemsAll.sqf +++ b/addons/wardrobe/functions/fnc_getItemsAll.sqf @@ -16,9 +16,9 @@ * Public: No */ -params [["_unit", objNull, [objNull]], ["_cache", true, [true]]]; +params [["_player", objNull, [objNull]], ["_cache", true, [true]]]; -private _code = { flatten getUnitLoadout _unit select { _x isEqualType "" && { _x != "" } }; }; +private _code = { flatten getUnitLoadout _player select { _x isEqualType "" && { _x != "" } }; }; private _caching = { ["items_all"] call FUNC(clearOnClosedInteractionMenu); diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf index aad1a3e456e..119f4e17e15 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf @@ -16,10 +16,10 @@ * Public: Yes */ -params [["_unit", objNull, [objNull]], ["_cache", true, [true]]]; +params [["_player", objNull, [objNull]], ["_cache", true, [true]]]; private _code = { - _unit call FUNC(getItemsAll) + _player call FUNC(getItemsAll) apply { _x call CBA_fnc_getItemConfig } select @@ -33,7 +33,7 @@ private _code = { private _cfgOrigin = _x#0; [ _cfgOrigin, - _x#1 select { [_unit, _cfgOrigin, _x] call FUNC(canModifyTo) } + _x#1 select { [_player, _cfgOrigin, _x] call FUNC(canModifyTo) } ] } select diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf index ab797c59998..0ebf519b168 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf @@ -16,10 +16,10 @@ * Public: Yes */ -params [["_unit", objNull, [objNull]], ["_cache", true, [true]]]; +params [["_player", objNull, [objNull]], ["_cache", true, [true]]]; private _code = { - ([headgear _unit, goggles _unit, uniform _unit, vest _unit, backpack _unit] - [""]) + ([headgear _player, goggles _player, uniform _player, vest _player, backpack _player] - [""]) apply { _x call CBA_fnc_getItemConfig } select @@ -33,7 +33,7 @@ private _code = { private _cfgOrigin = _x#0; [ _cfgOrigin, - _x#1 select { [_unit, _cfgOrigin, _x] call FUNC(canModifyTo) } + _x#1 select { [_player, _cfgOrigin, _x] call FUNC(canModifyTo) } ] } select diff --git a/addons/wardrobe/functions/fnc_nextVariantDo.sqf b/addons/wardrobe/functions/fnc_nextVariantDo.sqf index 74d51acd1ee..c01d2c31fd1 100644 --- a/addons/wardrobe/functions/fnc_nextVariantDo.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantDo.sqf @@ -19,15 +19,15 @@ * Public: No */ -params ["_unit", "", "_item", "", ""]; +params ["_player", "", "_item", "", ""]; private _cfgCurrent = _item call CBA_fnc_getItemConfig; -private _cfgTarget = [_cfgCurrent, _unit] call FUNC(nextVariantGet); +private _cfgTarget = [_cfgCurrent, _player] call FUNC(nextVariantGet); if (_cfgTarget isEqualTo false) exitWith {}; -private _canModifyTo = [_unit, _cfgCurrent, _cfgTarget, false] call FUNC(canModifyTo); +private _canModifyTo = [_player, _cfgCurrent, _cfgTarget, false] call FUNC(canModifyTo); if !(_canModifyTo) exitWith { [ @@ -39,6 +39,6 @@ if !(_canModifyTo) exitWith { ] call EFUNC(common,displayTextStructured); }; -[_unit, _unit, [_cfgCurrent, _cfgTarget], true] call FUNC(replace); +[_player, _player, [_cfgCurrent, _cfgTarget], true] call FUNC(replace); nil diff --git a/addons/wardrobe/functions/fnc_nextVariantGet.sqf b/addons/wardrobe/functions/fnc_nextVariantGet.sqf index 4666148b9d8..69bbb4a39d8 100644 --- a/addons/wardrobe/functions/fnc_nextVariantGet.sqf +++ b/addons/wardrobe/functions/fnc_nextVariantGet.sqf @@ -18,7 +18,7 @@ * Public: No */ -params ["_cfgCurrent", "_unit"]; +params ["_cfgCurrent", "_player"]; private _cfgModifiableTo = [_cfgCurrent, false] call FUNC(getItemsModifiableTo); @@ -33,7 +33,7 @@ if (isNil "_cfgHistory") then { missionNamespace setVariable [QGVAR(variantHistory), _cfgHistory]; - _unit addEventHandler ["InventoryClosed", { + _player addEventHandler ["InventoryClosed", { GVAR(variantHistory) = nil; ACE_player removeEventHandler [_thisEvent, _thisEventhandler]; }]; @@ -41,7 +41,7 @@ if (isNil "_cfgHistory") then { private _remaining = _cfgModifiableTo - _cfgHistory; -_remaining = _remaining select { [_unit, _cfgCurrent, _x] call FUNC(canModifyTo) }; +_remaining = _remaining select { [_player, _cfgCurrent, _x] call FUNC(canModifyTo) }; // returns either a random remaining item or alternatively, a random one from the complete array private _return = if (_remaining isNotEqualTo []) then { diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 69858d9828b..501ddb54d55 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -20,7 +20,7 @@ * Public: No */ -params ["", "_unit", "_actionParams", ["_replaceNow", false, [true]]]; +params ["", "_player", "_actionParams", ["_replaceNow", false, [true]]]; _actionParams params ["_cfgOrigin", "_cfgTarget"]; private _classTarget = configName _cfgTarget; @@ -47,7 +47,7 @@ private _replaceCode = switch (_typeNumber) do { }; if (_replaceCode isEqualTo {}) exitWith { ERROR_2("typeNumber undefined: %1 - %2",_typeNumber,_classOrigin); }; -[_replaceCode, [_unit, _classTarget, _equipmentType], _duration] call CBA_fnc_waitAndExecute; +[_replaceCode, [_player, _classTarget, _equipmentType], _duration] call CBA_fnc_waitAndExecute; // handle components [_classOrigin, _classTarget] call FUNC(compareComponents) params ["_missing", "_surplus"]; @@ -55,10 +55,10 @@ if (_replaceCode isEqualTo {}) exitWith { ERROR_2("typeNumber undefined: %1 - %2 // add surplus { if (_classTarget isNotEqualTo _x) then { - if (goggles _unit isEqualTo "" && { isClass (configFile >> "CfgGlasses" >> _x) }) then { - _unit addGoggles _x; + if (goggles _player isEqualTo "" && { isClass (configFile >> "CfgGlasses" >> _x) }) then { + _player addGoggles _x; } else { - [_unit, _x, true] call CBA_fnc_addItem; + [_player, _x, true] call CBA_fnc_addItem; }; }; } forEach _surplus; @@ -66,24 +66,24 @@ if (_replaceCode isEqualTo {}) exitWith { ERROR_2("typeNumber undefined: %1 - %2 // remove missing { if (_classOrigin isNotEqualTo _x) then { - if (goggles _unit isEqualTo _x) then { - removeGoggles _unit; + if (goggles _player isEqualTo _x) then { + removeGoggles _player; } else { - [_unit, _x] call CBA_fnc_removeItem; + [_player, _x] call CBA_fnc_removeItem; }; }; } forEach _missing; // handle effects // animation/gestures -[_unit, getText (configFile >> QUOTE(ADDON) >> _classTarget >> "gesture")] call EFUNC(common,doGesture); +[_player, getText (configFile >> QUOTE(ADDON) >> _classTarget >> "gesture")] call EFUNC(common,doGesture); // plays random sound at the beginning private _sound = [configFile >> QUOTE(ADDON) >> _classTarget >> "sound"] call CBA_fnc_getCfgDataRandom; if (_sound isNotEqualTo "") then { [ CBA_fnc_globalSay3D, - [_unit, _sound, nil, true, true], + [_player, _sound, nil, true, true], (getNumber (configFile >> QUOTE(ADDON) >> _classTarget >> "sound_timing") max 0 min 1) * _duration ] call CBA_fnc_waitAndExecute; }; diff --git a/addons/wardrobe/functions/fnc_replaceContainer.sqf b/addons/wardrobe/functions/fnc_replaceContainer.sqf index 5e5cf474f33..8ba6180b2da 100644 --- a/addons/wardrobe/functions/fnc_replaceContainer.sqf +++ b/addons/wardrobe/functions/fnc_replaceContainer.sqf @@ -18,11 +18,11 @@ * Public: No */ -params ["_unit", "_classTarget", "_equipmentType"]; +params ["_player", "_classTarget", "_equipmentType"]; toFixed 0; -private _magazineDetails = (magazinesAmmoFull _unit) apply { [_x#0, _x#-2, _x#-1] }; -private _loadout = _unit call CBA_fnc_getLoadout; +private _magazineDetails = (magazinesAmmoFull _player) apply { [_x#0, _x#-2, _x#-1] }; +private _loadout = _player call CBA_fnc_getLoadout; // handle special cases - pre replace // ace intel items @@ -32,7 +32,7 @@ INTEL_PRE(_photo,acex_intelitems_photo); // ace overheating private _spareBarrel = _magazineDetails findIf { _x#0 == "ACE_SpareBarrel" } > -1; -if (_spareBarrel) then { _spareBarrel = [_unit, "ACE_SpareBarrel"] call CBA_fnc_getMagazineIndex }; +if (_spareBarrel) then { _spareBarrel = [_player, "ACE_SpareBarrel"] call CBA_fnc_getMagazineIndex }; // replace wearable switch (_equipmentType) do { @@ -42,7 +42,7 @@ switch (_equipmentType) do { }; // apply new loadout -[_unit, _loadout] call CBA_fnc_setLoadout; +[_player, _loadout] call CBA_fnc_setLoadout; // handle special cases - post replace // ace intel items @@ -52,6 +52,6 @@ INTEL_POST(_photo,acex_intelitems_photo); // ace overheating if (_spareBarrel isEqualType []) then { - private _newMagIDsSpareBarrel = [_unit, "ACE_SpareBarrel"] call CBA_fnc_getMagazineIndex; + private _newMagIDsSpareBarrel = [_player, "ACE_SpareBarrel"] call CBA_fnc_getMagazineIndex; [QGVAR(updateMagIDs), [_spareBarrel, _newMagIDsSpareBarrel]] call CBA_fnc_serverEvent; }; diff --git a/addons/wardrobe/functions/fnc_replaceOther.sqf b/addons/wardrobe/functions/fnc_replaceOther.sqf index 2a91b614f8c..f182c175743 100644 --- a/addons/wardrobe/functions/fnc_replaceOther.sqf +++ b/addons/wardrobe/functions/fnc_replaceOther.sqf @@ -18,15 +18,15 @@ * Public: No */ -params ["_unit", "_classTarget", "_equipmentType"]; +params ["_player", "_classTarget", "_equipmentType"]; switch (_equipmentType) do { case "HEADGEAR": { - removeHeadgear _unit; - _unit addHeadgear _classTarget; + removeHeadgear _player; + _player addHeadgear _classTarget; }; case "FACEWEAR": { - removeGoggles _unit; - _unit addGoggles _classTarget; + removeGoggles _player; + _player addGoggles _classTarget; }; }; From abe4172661e9d86298c2487a44c951d4c8b160c7 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 5 Jun 2025 03:20:27 +0200 Subject: [PATCH 283/305] added: directional display names --- .../functions/fnc_addActionsChildren.sqf | 2 +- .../wardrobe/functions/fnc_addActionsName.sqf | 22 ++++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/addons/wardrobe/functions/fnc_addActionsChildren.sqf b/addons/wardrobe/functions/fnc_addActionsChildren.sqf index 53785bec3e1..09cd9c53e73 100644 --- a/addons/wardrobe/functions/fnc_addActionsChildren.sqf +++ b/addons/wardrobe/functions/fnc_addActionsChildren.sqf @@ -28,7 +28,7 @@ private _actions = []; private _cfgTarget = _x; private _aceAction = [ configName _cfgTarget, - _cfgTarget call FUNC(addActionsName), + [_cfgOrigin, _cfgTarget] call FUNC(addActionsName), _cfgTarget call FUNC(addActionsIcon), FUNC(replace), { true }, diff --git a/addons/wardrobe/functions/fnc_addActionsName.sqf b/addons/wardrobe/functions/fnc_addActionsName.sqf index f1fcac1bc01..45eb5a66745 100644 --- a/addons/wardrobe/functions/fnc_addActionsName.sqf +++ b/addons/wardrobe/functions/fnc_addActionsName.sqf @@ -1,21 +1,33 @@ #include "../script_component.hpp" /* * Author: OverlordZorn - * This function checks if the target item has an alternative String for the action, if not, it returns the displayName property. + * This function checks if the target item has an directional or alternative display name for the action, if not, it returns the displayName property. * * Arguments: + * 0: Current variant * 0: Desired variant * * Return Value: * The return value * * Example: - * (configFile >> "CfgWeapons" >> "U_B_CTRG_1") call ace_wardrobe_fnc_getActionsName + * [(configFile >> "CfgWeapons" >> "U_B_CTRG_3"), (configFile >> "CfgWeapons" >> "U_B_CTRG_1")] call ace_wardrobe_fnc_getActionsName * * Public: No */ -params [["_cfg", configNull, [configNull]]]; +params ["_cfgOrigin", "_cfgTarget"]; -private _altDispName = getText (configFile >> QUOTE(ADDON) >> configName _cfg >> "alternativeDisplayName"); -if (_altDispName isEqualTo "") then { getText (_cfg >> "displayName") } else { _altDispName }; +private _classOrigin = configName _cfgOrigin; +private _classTarget = configName _cfgTarget; + +// Check if there is a "directional Display Name", meaning if there is a specific string when changing from a certain class to a certain class +private _directional = getText (configFile >> QUOTE(ADDON) >> _classOrigin >> "modifiableTo" >> _classTarget >> "directionalDisplayName"); +if (_directional isNotEqualTo "") exitWith { _directional }; + +// Check if there is an "alternative Display Name", defined by the ace_wardrobe base class +private _alternative = getText (configFile >> QUOTE(ADDON) >> _classTarget >> "alternativeDisplayName"); +if (_alternative isNotEqualTo "") exitWith { _alternative }; + +// return +getText (_cfgTarget >> "displayName") From c3466fabaf3141de2b94e3d3ccfd26a3635c1c82 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 5 Jun 2025 11:32:05 +0200 Subject: [PATCH 284/305] altDisplayName-> alternativeActionName --- addons/wardrobe/BaseClasses.hpp | 26 +++++++++---------- .../wardrobe/functions/fnc_addActionsName.sqf | 6 ++--- docs/wiki/framework/wardrobe-framework.md | 24 ++++++++--------- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/addons/wardrobe/BaseClasses.hpp b/addons/wardrobe/BaseClasses.hpp index 7c96425177b..eacdf6edd6a 100644 --- a/addons/wardrobe/BaseClasses.hpp +++ b/addons/wardrobe/BaseClasses.hpp @@ -18,7 +18,7 @@ class GVAR(base) { // These will be read from the target class, so for example, the uniformclass with the rolled up sleaves, it should say "Roll Up Sleeves" alternativePicture = ""; - alternativeDisplayName = ""; + alternativeActionName = ""; duration = 1; // Minimum value: 1 - Anything above will produce a progressbar @@ -27,26 +27,26 @@ class GVAR(base) { // Common base class for uniforms with sleeves up/down variants class GVAR(base_U_sleeves_up): GVAR(base) { - alternativeDisplayName = CSTRING(sleevesUp); + alternativeActionName = CSTRING(sleevesUp); }; class GVAR(base_U_sleeves_down): GVAR(base) { - alternativeDisplayName = CSTRING(sleevesDown); + alternativeActionName = CSTRING(sleevesDown); }; // Common base class for uniforms with gloves on/off variants class GVAR(base_U_gloves_on): GVAR(base) { - alternativeDisplayName = CSTRING(glovesOn); + alternativeActionName = CSTRING(glovesOn); }; class GVAR(base_U_gloves_off): GVAR(base) { - alternativeDisplayName = CSTRING(glovesOff); + alternativeActionName = CSTRING(glovesOff); }; // Common base class for uniforms who are open/closed in the front class GVAR(base_U_jacket_open): GVAR(base) { - alternativeDisplayName = CSTRING(jacketOpen); + alternativeActionName = CSTRING(jacketOpen); }; class GVAR(base_U_jacket_closed): GVAR(base) { - alternativeDisplayName = CSTRING(jacketClose); + alternativeActionName = CSTRING(jacketClose); }; // Common base class for helmets with a visor that can be flipped up or down @@ -57,7 +57,7 @@ class GVAR(base_H_visor_up): GVAR(base) { sound[] = {CN_SOUND(helmet_visor,05)}; sound_timing = 0; - alternativeDisplayName = CSTRING(visorUp); + alternativeActionName = CSTRING(visorUp); }; class GVAR(base_H_visor_down): GVAR(base) { @@ -67,28 +67,28 @@ class GVAR(base_H_visor_down): GVAR(base) { sound[] = {CN_SOUND(helmet_visor,05)}; sound_timing = 0; - alternativeDisplayName = CSTRING(visorDown); + alternativeActionName = CSTRING(visorDown); }; // Common base class for headgear with goggles that can be used as a facewear item class GVAR(base_H_goggles_on): GVAR(base) { gesture = "GestureWipeFace"; - alternativeDisplayName = CSTRING(gogglesOn); + alternativeActionName = CSTRING(gogglesOn); }; class GVAR(base_H_goggles_off): GVAR(base) { gesture = "GestureWipeFace"; - alternativeDisplayName = CSTRING(gogglesOff); + alternativeActionName = CSTRING(gogglesOff); }; // Common base class for headgear with a mask on/off variant class GVAR(base_H_mask_on): GVAR(base) { gesture = "GestureWipeFace"; - alternativeDisplayName = CSTRING(maskOn); + alternativeActionName = CSTRING(maskOn); }; class GVAR(base_H_mask_off): GVAR(base) { gesture = "GestureWipeFace"; - alternativeDisplayName = CSTRING(maskOff); + alternativeActionName = CSTRING(maskOff); }; diff --git a/addons/wardrobe/functions/fnc_addActionsName.sqf b/addons/wardrobe/functions/fnc_addActionsName.sqf index 45eb5a66745..e3584505d57 100644 --- a/addons/wardrobe/functions/fnc_addActionsName.sqf +++ b/addons/wardrobe/functions/fnc_addActionsName.sqf @@ -1,7 +1,7 @@ #include "../script_component.hpp" /* * Author: OverlordZorn - * This function checks if the target item has an directional or alternative display name for the action, if not, it returns the displayName property. + * This function checks if the target item has an directional or alternative action name for the action, if not, it returns the displayName property. * * Arguments: * 0: Current variant @@ -22,11 +22,11 @@ private _classOrigin = configName _cfgOrigin; private _classTarget = configName _cfgTarget; // Check if there is a "directional Display Name", meaning if there is a specific string when changing from a certain class to a certain class -private _directional = getText (configFile >> QUOTE(ADDON) >> _classOrigin >> "modifiableTo" >> _classTarget >> "directionalDisplayName"); +private _directional = getText (configFile >> QUOTE(ADDON) >> _classOrigin >> "modifiableTo" >> _classTarget >> "directionalActionName"); if (_directional isNotEqualTo "") exitWith { _directional }; // Check if there is an "alternative Display Name", defined by the ace_wardrobe base class -private _alternative = getText (configFile >> QUOTE(ADDON) >> _classTarget >> "alternativeDisplayName"); +private _alternative = getText (configFile >> QUOTE(ADDON) >> _classTarget >> "alternativeActionName"); if (_alternative isNotEqualTo "") exitWith { _alternative }; // return diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index 3e1523d380a..1e3840802d1 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -45,7 +45,7 @@ All supported Properties can be found within the `ace_wardrobe_base` baseclass. | `sound_timing` | Number 0..1 | Defines the point time relative to the duration when the sound is played | | `gesture` | String of Classname | Gesture to be played when the action is performed | | `alternativePicture` | String of path to icon | To be used instead of target variant picture | -| `alternativeDisplayName` | String | Will be used instead of the target variants displayname | +| `alternativeActionName` | String | Will be used instead of the target variants displayname | | `duration` | Number in seconds | Duration of action. Items are being replaced at the end. | | `fallbackComponent` | String of Classname | Fallback for components that are not present within the same mod/addon. Example: RHS AFRF helmets use `rhs_ess_black` goggles, which are only part of USAF. `fallbackComponent` can be used to default to a vanilla alternative. | @@ -72,7 +72,7 @@ class ace_wardrobe { // These will be read from the target class, so for example, the uniformclass with the rolled up sleaves, it should say "roll up sleeves" alternativePicture = ""; - alternativeDisplayName = ""; + alternativeActionName = ""; duration = 1; // Minimum value: 1 - Anything above will produce a progressbar. @@ -87,30 +87,30 @@ class ace_wardrobe { Common base class for uniforms with Sleeves up/down variants ```cpp class ace_wardrobe_base_U_sleeves_up: ace_wardrobe_base { - alternativeDisplayName = CSTRING(sleevesUp); + alternativeActionName = CSTRING(sleevesUp); }; class ace_wardrobe_base_U_sleeves_down: ace_wardrobe_base { - alternativeDisplayName = CSTRING(sleevesDown); + alternativeActionName = CSTRING(sleevesDown); }; ``` #### 2.2.3 Base Uniform Gloves On / Off Common base class for uniforms with gloves on/off variants ```cpp class ace_wardrobe_base_U_gloves_on: ace_wardrobe_base { - alternativeDisplayName = CSTRING(glovesOn); + alternativeActionName = CSTRING(glovesOn); }; class ace_wardrobe_base_U_gloves_off: ace_wardrobe_base { - alternativeDisplayName = CSTRING(glovesOff); + alternativeActionName = CSTRING(glovesOff); }; ``` #### 2.2.4 Base Uniform Jacket Open / Closed Common base class for uniforms who are open/closed in the front ```cpp class ace_wardrobe_base_U_jacket_open: ace_wardrobe_base { - alternativeDisplayName = CSTRING(jacketOpen); + alternativeActionName = CSTRING(jacketOpen); }; class ace_wardrobe_base_U_jacket_closed: ace_wardrobe_base { - alternativeDisplayName = CSTRING(jacketClose); + alternativeActionName = CSTRING(jacketClose); }; ``` @@ -126,7 +126,7 @@ class ace_wardrobe_base_H_visor_up: ace_wardrobe_base { sound[] = {CN_SOUND(helmet_visor,05)}; sound_timing = 0; - alternativeDisplayName = CSTRING(visorUp); + alternativeActionName = CSTRING(visorUp); }; class ace_wardrobe_base_H_visor_down: ace_wardrobe_base { @@ -136,7 +136,7 @@ class ace_wardrobe_base_H_visor_down: ace_wardrobe_base { sound[] = {"ace_wardrobe_05"}; sound_timing = 0; - alternativeDisplayName = CSTRING(visorDown); + alternativeActionName = CSTRING(visorDown); }; ``` #### 2.2.6 Base Headgear with Goggles on / off @@ -144,12 +144,12 @@ Common base class for headgear with goggles that can be used as a facewear item. ```cpp class ace_wardrobe_base_H_goggles_on: ace_wardrobe_base { gesture ="GestureWipeFace"; - alternativeDisplayName = CSTRING(gogglesOn); + alternativeActionName = CSTRING(gogglesOn); }; class ace_wardrobe_base_H_goggles_off: ace_wardrobe_base { gesture ="GestureWipeFace"; - alternativeDisplayName = CSTRING(gogglesOff); + alternativeActionName = CSTRING(gogglesOff); }; ``` From 694330a7c58d4571661f8dd19a6cd58f1449a463 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 5 Jun 2025 11:33:34 +0200 Subject: [PATCH 285/305] -> alternativeActionName --- addons/wardrobe/BaseClasses.hpp | 26 +++++++++++------------ docs/wiki/framework/wardrobe-framework.md | 24 ++++++++++----------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/addons/wardrobe/BaseClasses.hpp b/addons/wardrobe/BaseClasses.hpp index fa1c4f2929d..edf815a7111 100644 --- a/addons/wardrobe/BaseClasses.hpp +++ b/addons/wardrobe/BaseClasses.hpp @@ -20,7 +20,7 @@ class GVAR(base) { // These will be read from the Target Class, so for example, the uniformclass with the rolled up sleaves, it should say "Roll Up Sleeves" alternativePicture = ""; - alternativeDisplayName = ""; + alternativeActionName = ""; duration = 1; // Minimum Value: 1 - Anything above will produce a progressbar. @@ -29,26 +29,26 @@ class GVAR(base) { // Common Base Class for Uniforms with Sleeves Up/Down Variants class GVAR(base_U_sleeves_up): GVAR(base) { - alternativeDisplayName = CSTRING(sleevesUp); + alternativeActionName = CSTRING(sleevesUp); }; class GVAR(base_U_sleeves_down): GVAR(base) { - alternativeDisplayName = CSTRING(sleevesDown); + alternativeActionName = CSTRING(sleevesDown); }; // Common Base Class for Uniforms with Gloves On/Off Variants class GVAR(base_U_gloves_on): GVAR(base) { - alternativeDisplayName = CSTRING(glovesOn); + alternativeActionName = CSTRING(glovesOn); }; class GVAR(base_U_gloves_off): GVAR(base) { - alternativeDisplayName = CSTRING(glovesOff); + alternativeActionName = CSTRING(glovesOff); }; // Common Base Class for Uniforms who are open/closed in the front class GVAR(base_U_jacket_open): GVAR(base) { - alternativeDisplayName = CSTRING(jacketOpen); + alternativeActionName = CSTRING(jacketOpen); }; class GVAR(base_U_jacket_closed): GVAR(base) { - alternativeDisplayName = CSTRING(jacketClose); + alternativeActionName = CSTRING(jacketClose); }; // Common Base Class for Helmets with a Visor that can be flipped up or down @@ -59,7 +59,7 @@ class GVAR(base_H_visor_up): GVAR(base) { sound[] = {CN_SOUND(helmet_visor,05)}; sound_timing = 0; - alternativeDisplayName = CSTRING(visorUp); + alternativeActionName = CSTRING(visorUp); }; class GVAR(base_H_visor_down): GVAR(base) { @@ -69,28 +69,28 @@ class GVAR(base_H_visor_down): GVAR(base) { sound[] = {CN_SOUND(helmet_visor,05)}; sound_timing = 0; - alternativeDisplayName = CSTRING(visorDown); + alternativeActionName = CSTRING(visorDown); }; // Common Base Class for Headgear with goggles that can be used as a facewear item. class GVAR(base_H_goggles_on): GVAR(base) { gesture ="GestureWipeFace"; - alternativeDisplayName = CSTRING(gogglesOn); + alternativeActionName = CSTRING(gogglesOn); }; class GVAR(base_H_goggles_off): GVAR(base) { gesture ="GestureWipeFace"; - alternativeDisplayName = CSTRING(gogglesOff); + alternativeActionName = CSTRING(gogglesOff); }; // Common Base Class for Headgear with a Mask on and Mask Off variant class GVAR(base_H_mask_on): GVAR(base) { gesture ="GestureWipeFace"; - alternativeDisplayName = CSTRING(maskOn); + alternativeActionName = CSTRING(maskOn); }; class GVAR(base_H_mask_off): GVAR(base) { gesture ="GestureWipeFace"; - alternativeDisplayName = CSTRING(maskOff); + alternativeActionName = CSTRING(maskOff); }; diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index a9256855785..62e7197fcf1 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -55,7 +55,7 @@ All supported Properties can be found within the `ace_wardrobe_base` baseclass. | `sound_timing` | Number 0..1 | defines the point time relative to the duration when the sound is played | | `gesture` | String of Classname | Gesture to be played when the action is performed | | `alternativePicture` | String of path to icon | to be used instead of target variant picture | -| `alternativeDisplayName` | String | Will be used instead of the target variants displayname | +| `alternativeActionName` | String | Will be used instead of the target variants displayname | | `duration` | Number in seconds | Duration of action. Items are being replaced at the end. | | `fallbackComponent` | String of Classname | Fallback for Components that are not present within the same mod/addon. Example: RHS AFRF helmets use `rhs_ess_black` goggles, which are only part of USAF. fallbackComponent can be used to default to a vanilla alternative. | @@ -82,7 +82,7 @@ class ace_wardrobe { // These will be read from the Target Class, so for example, the uniformclass with the rolled up sleaves, it should say "Roll Up Sleeves" alternativePicture = ""; - alternativeDisplayName = ""; + alternativeActionName = ""; duration = 1; // Minimum Value: 1 - Anything above will produce a progressbar. @@ -97,30 +97,30 @@ class ace_wardrobe { Common Base Class for Uniforms with Sleeves Up/Down Variants ```cpp class ace_wardrobe_base_U_sleeves_up: ace_wardrobe_base { - alternativeDisplayName = CSTRING(sleevesUp); + alternativeActionName = CSTRING(sleevesUp); }; class ace_wardrobe_base_U_sleeves_down: ace_wardrobe_base { - alternativeDisplayName = CSTRING(sleevesDown); + alternativeActionName = CSTRING(sleevesDown); }; ``` #### 2.2.3 Base Uniform Gloves On / Off Common Base Class for Uniforms with Gloves On/Off Variants ```cpp class ace_wardrobe_base_U_gloves_on: ace_wardrobe_base { - alternativeDisplayName = CSTRING(glovesOn); + alternativeActionName = CSTRING(glovesOn); }; class ace_wardrobe_base_U_gloves_off: ace_wardrobe_base { - alternativeDisplayName = CSTRING(glovesOff); + alternativeActionName = CSTRING(glovesOff); }; ``` #### 2.2.4 Base Uniform Jacket Open / Closed Common Base Class for Uniforms who are open/closed in the front ```cpp class ace_wardrobe_base_U_jacket_open: ace_wardrobe_base { - alternativeDisplayName = CSTRING(jacketOpen); + alternativeActionName = CSTRING(jacketOpen); }; class ace_wardrobe_base_U_jacket_closed: ace_wardrobe_base { - alternativeDisplayName = CSTRING(jacketClose); + alternativeActionName = CSTRING(jacketClose); }; ``` @@ -136,7 +136,7 @@ class ace_wardrobe_base_H_visor_up: ace_wardrobe_base { sound[] = {CN_SOUND(helmet_visor,05)}; sound_timing = 0; - alternativeDisplayName = CSTRING(visorUp); + alternativeActionName = CSTRING(visorUp); }; class ace_wardrobe_base_H_visor_down: ace_wardrobe_base { @@ -146,7 +146,7 @@ class ace_wardrobe_base_H_visor_down: ace_wardrobe_base { sound[] = {"ace_wardrobe_05"}; sound_timing = 0; - alternativeDisplayName = CSTRING(visorDown); + alternativeActionName = CSTRING(visorDown); }; ``` #### 2.2.6 Base Headgear with Goggles on / off @@ -154,12 +154,12 @@ Common Base Class for Headgear with goggles that can be used as a facewear item. ```cpp class ace_wardrobe_base_H_goggles_on: ace_wardrobe_base { gesture ="GestureWipeFace"; - alternativeDisplayName = CSTRING(gogglesOn); + alternativeActionName = CSTRING(gogglesOn); }; class ace_wardrobe_base_H_goggles_off: ace_wardrobe_base { gesture ="GestureWipeFace"; - alternativeDisplayName = CSTRING(gogglesOff); + alternativeActionName = CSTRING(gogglesOff); }; ``` From 2cc4075174e3fe1c2d6bba6c0d38b6dfcc9fdf9c Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 5 Jun 2025 12:05:11 +0200 Subject: [PATCH 286/305] IMPORT_BASE_CLASSES(); --- addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp index af05b3b3200..44eb9a9e9cb 100644 --- a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp @@ -1,6 +1,6 @@ class ace_wardrobe { - #include "\z\ace\addons\wardrobe\BaseClasses_Import.hpp" - + IMPORT_BASE_CLASSES(); + #include "CfgWardrobe_Uniforms.hpp" #include "CfgWardrobe_Headgear.hpp" #include "CfgWardrobe_Goggles.hpp" From ac7d9869128502f3a1b0a90376fc7997fca9bad2 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 5 Jun 2025 12:08:03 +0200 Subject: [PATCH 287/305] IMPORT_BASE_CLASSES; --- .../compat_rhs_saf3/compat_rhs_saf3_wardrobe/CfgWardrobe.hpp | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 addons/compat_rhs_saf3/compat_rhs_saf3_wardrobe/CfgWardrobe.hpp diff --git a/addons/compat_rhs_saf3/compat_rhs_saf3_wardrobe/CfgWardrobe.hpp b/addons/compat_rhs_saf3/compat_rhs_saf3_wardrobe/CfgWardrobe.hpp new file mode 100644 index 00000000000..1f88ce6e539 --- /dev/null +++ b/addons/compat_rhs_saf3/compat_rhs_saf3_wardrobe/CfgWardrobe.hpp @@ -0,0 +1,4 @@ +class ace_wardrobe { + IMPORT_BASE_CLASSES; + #include "CfgWardrobe_Headgear.hpp" +}; From b09a57ebbe451e1a26b31a267524572eeecaaa53 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 5 Jun 2025 12:10:02 +0200 Subject: [PATCH 288/305] rm () --- addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp index 44eb9a9e9cb..e0dd135fb34 100644 --- a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp +++ b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe.hpp @@ -1,6 +1,6 @@ class ace_wardrobe { - IMPORT_BASE_CLASSES(); - + IMPORT_BASE_CLASSES; + #include "CfgWardrobe_Uniforms.hpp" #include "CfgWardrobe_Headgear.hpp" #include "CfgWardrobe_Goggles.hpp" From 983b61397bb242cf942062c94f55d061a5a683f2 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 6 Jun 2025 10:45:13 +0200 Subject: [PATCH 289/305] use positive index over negative --- addons/wardrobe/functions/fnc_replaceContainer.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/functions/fnc_replaceContainer.sqf b/addons/wardrobe/functions/fnc_replaceContainer.sqf index 8ba6180b2da..b089ac09303 100644 --- a/addons/wardrobe/functions/fnc_replaceContainer.sqf +++ b/addons/wardrobe/functions/fnc_replaceContainer.sqf @@ -21,7 +21,7 @@ params ["_player", "_classTarget", "_equipmentType"]; toFixed 0; -private _magazineDetails = (magazinesAmmoFull _player) apply { [_x#0, _x#-2, _x#-1] }; +private _magazineDetails = (magazinesAmmoFull _player) apply { [_x#0, _x#-2, _x#6] }; private _loadout = _player call CBA_fnc_getLoadout; // handle special cases - pre replace From 3c8274c7e8f33ac961e8a0c528e4903258f821af Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 6 Jun 2025 11:20:29 +0200 Subject: [PATCH 290/305] rm caching system --- .hemtt/launch.toml | 1 - addons/wardrobe/XEH_PREP.hpp | 3 -- addons/wardrobe/functions/fnc_cacheGet.sqf | 26 ---------- addons/wardrobe/functions/fnc_cacheSet.sqf | 25 ---------- .../fnc_clearOnClosedInteractionMenu.sqf | 37 -------------- addons/wardrobe/functions/fnc_getItemsAll.sqf | 11 +--- .../functions/fnc_getItemsModifiableAll.sqf | 49 ++++++++---------- .../fnc_getItemsModifiableCurrent.sqf | 50 ++++++++----------- 8 files changed, 42 insertions(+), 160 deletions(-) delete mode 100644 addons/wardrobe/functions/fnc_cacheGet.sqf delete mode 100644 addons/wardrobe/functions/fnc_cacheSet.sqf delete mode 100644 addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf diff --git a/.hemtt/launch.toml b/.hemtt/launch.toml index f0277316c2e..dcaf384adbe 100644 --- a/.hemtt/launch.toml +++ b/.hemtt/launch.toml @@ -98,4 +98,3 @@ dlc = [ "rf", "ws", ] - diff --git a/addons/wardrobe/XEH_PREP.hpp b/addons/wardrobe/XEH_PREP.hpp index cdddbcfe525..ba363ac181a 100644 --- a/addons/wardrobe/XEH_PREP.hpp +++ b/addons/wardrobe/XEH_PREP.hpp @@ -3,10 +3,7 @@ PREP(addActionsCondition); PREP(addActionsChildren); PREP(addActionsIcon); PREP(addActionsName); -PREP(cacheGet); -PREP(cacheSet); PREP(canModifyTo); -PREP(clearOnClosedInteractionMenu); PREP(compareComponents); PREP(enableContextMenu); PREP(getIndexFromMagID); diff --git a/addons/wardrobe/functions/fnc_cacheGet.sqf b/addons/wardrobe/functions/fnc_cacheGet.sqf deleted file mode 100644 index 0bc429a7b01..00000000000 --- a/addons/wardrobe/functions/fnc_cacheGet.sqf +++ /dev/null @@ -1,26 +0,0 @@ -#include "../script_component.hpp" -/* - * Author: OverlordZorn - * To retrieve a value from the database. Returns nil if not stored or, when provided, will execute the alternative code. Result will be stored and returned. - * - * Arguments: - * 0: Key - * 1: Code to run when there is no value stored (optional) - * - * Return Value: - * Return or nil if no entry found and no code provided - * - * - * Example: - * ["tag_loadout", { getUnitLoadout player }] call ace_wardrobe_fnc_cacheGet - * - * Public: Yes - */ - -params [["_key", "", [""]], ["_else", nil, [{}]]]; - -if (isNil "_else") then { - GVAR(cache) getOrDefault [_key, nil]; -} else { - GVAR(cache) getOrDefaultCall [_key, _else, true]; -}; diff --git a/addons/wardrobe/functions/fnc_cacheSet.sqf b/addons/wardrobe/functions/fnc_cacheSet.sqf deleted file mode 100644 index 4f4ea684eaf..00000000000 --- a/addons/wardrobe/functions/fnc_cacheSet.sqf +++ /dev/null @@ -1,25 +0,0 @@ -#include "../script_component.hpp" -/* - * Author: OverlordZorn - * Function to store a value behind a key into the addons cache. - * - * Arguments: - * 0: Key - * 1: Value - * - * Return Value: - * Success - * - * Example: - * ['tag_myKey', ["some", "data"]] call ace_wardrobe_fnc_cacheSet - * - * Public: Yes - */ - -params [["_key", "", [""]], ["_value", nil]]; - -if (isNil "_value") exitWith { false }; - -GVAR(cache) set [_key, _value]; - -true diff --git a/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf b/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf deleted file mode 100644 index d5bb7fe389b..00000000000 --- a/addons/wardrobe/functions/fnc_clearOnClosedInteractionMenu.sqf +++ /dev/null @@ -1,37 +0,0 @@ -#include "../script_component.hpp" -/* - * Author: OverlordZorn - * Function to request the clearing of the cache upon closing of the menu. - * - * Arguments: - * 0: Key - * - * Return Value: - * None - * - * Example: - * ["tag_myDataEntry"] call ace_wardrobe_fnc_clearOnClosedInteractionMenu - * - * Public: yes - */ - -params [["_key", "", [""]]]; - -if (isNil QGVAR(menuClearQueue)) then { - [ - "ace_interactMenuClosed", - { - if (_this isNotEqualTo [1]) exitWith {}; - - { GVAR(cache) deleteAt _x } forEach (missionNamespace getVariable [QGVAR(menuClearQueue), []]); - - GVAR(menuClearQueue) = nil; - [_thisType, _thisId] call CBA_fnc_removeEventHandler; - } - ] call CBA_fnc_addEventHandlerArgs; - GVAR(menuClearQueue) = [_key]; -} else { - GVAR(menuClearQueue) pushBackUnique _key; -}; - -nil diff --git a/addons/wardrobe/functions/fnc_getItemsAll.sqf b/addons/wardrobe/functions/fnc_getItemsAll.sqf index c00cb10ae4b..2e07aed4018 100644 --- a/addons/wardrobe/functions/fnc_getItemsAll.sqf +++ b/addons/wardrobe/functions/fnc_getItemsAll.sqf @@ -16,13 +16,6 @@ * Public: No */ -params [["_player", objNull, [objNull]], ["_cache", true, [true]]]; +params [["_player", objNull, [objNull]]]; -private _code = { flatten getUnitLoadout _player select { _x isEqualType "" && { _x != "" } }; }; - -private _caching = { - ["items_all"] call FUNC(clearOnClosedInteractionMenu); - ["items_all", _code] call FUNC(cacheGet); // returns the result -}; - -if (_cache) then _caching else _code; +flatten getUnitLoadout _player select { _x isEqualType "" && { _x != "" } } diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf index 119f4e17e15..8796c67eac8 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableAll.sqf @@ -16,33 +16,24 @@ * Public: Yes */ -params [["_player", objNull, [objNull]], ["_cache", true, [true]]]; +params [["_player", objNull, [objNull]]]; -private _code = { - _player call FUNC(getItemsAll) - apply - { _x call CBA_fnc_getItemConfig } - select - { _x call FUNC(isModifiable) } - apply - { [_x, _x call FUNC(getItemsModifiableTo)] } - select - { (_x#1) isNotEqualTo [] } - apply - { - private _cfgOrigin = _x#0; - [ - _cfgOrigin, - _x#1 select { [_player, _cfgOrigin, _x] call FUNC(canModifyTo) } - ] - } - select - { (_x#1) isNotEqualTo [] } -}; - -private _caching = { - ["items_modifiable_all"] call FUNC(clearOnClosedInteractionMenu); - ["items_modifiable_all", _code] call FUNC(cacheGet); // returns the result -}; - -if (_cache) then _caching else _code; +_player call FUNC(getItemsAll) +apply +{ _x call CBA_fnc_getItemConfig } +select +{ _x call FUNC(isModifiable) } +apply +{ [_x, _x call FUNC(getItemsModifiableTo)] } +select +{ (_x#1) isNotEqualTo [] } +apply +{ + private _cfgOrigin = _x#0; + [ + _cfgOrigin, + _x#1 select { [_player, _cfgOrigin, _x] call FUNC(canModifyTo) } + ] +} +select +{ (_x#1) isNotEqualTo [] } diff --git a/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf b/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf index 0ebf519b168..935915db1bf 100644 --- a/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf +++ b/addons/wardrobe/functions/fnc_getItemsModifiableCurrent.sqf @@ -16,34 +16,24 @@ * Public: Yes */ -params [["_player", objNull, [objNull]], ["_cache", true, [true]]]; +params [["_player", objNull, [objNull]]]; -private _code = { - ([headgear _player, goggles _player, uniform _player, vest _player, backpack _player] - [""]) - apply - { _x call CBA_fnc_getItemConfig } - select - { _x call FUNC(isModifiable) } - apply - { [_x, _x call FUNC(getItemsModifiableTo)] } // will return an array, even if the target variants are not available - select - { (_x#1) isNotEqualTo [] } - apply - { - private _cfgOrigin = _x#0; - [ - _cfgOrigin, - _x#1 select { [_player, _cfgOrigin, _x] call FUNC(canModifyTo) } - ] - } - select - { (_x#1) isNotEqualTo [] } -}; - - -private _caching = { - ["items_modifiable_current"] call FUNC(clearOnClosedInteractionMenu); - ["items_modifiable_current", _code] call FUNC(cacheGet); // returns the result -}; - -if (_cache) then _caching else _code; +([headgear _player, goggles _player, uniform _player, vest _player, backpack _player] - [""]) +apply +{ _x call CBA_fnc_getItemConfig } +select +{ _x call FUNC(isModifiable) } +apply +{ [_x, _x call FUNC(getItemsModifiableTo)] } // will return an array, even if the target variants are not available +select +{ (_x#1) isNotEqualTo [] } +apply +{ + private _cfgOrigin = _x#0; + [ + _cfgOrigin, + _x#1 select { [_player, _cfgOrigin, _x] call FUNC(canModifyTo) } + ] +} +select +{ (_x#1) isNotEqualTo [] } From 0c163528720af2e0759ca710c30965f7aede90c9 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 6 Jun 2025 13:15:17 +0200 Subject: [PATCH 291/305] added "in Progress" --- addons/wardrobe/CfgVehicles.hpp | 2 +- addons/wardrobe/XEH_preInit.sqf | 2 +- addons/wardrobe/data/hourglass_logo_ca.paa | Bin 0 -> 5625 bytes addons/wardrobe/data/hourglass_logo_ca.png | Bin 0 -> 5119 bytes addons/wardrobe/functions/fnc_addActions.sqf | 15 +++++++++++++-- addons/wardrobe/functions/fnc_replace.sqf | 7 +++++-- .../wardrobe/functions/fnc_replaceContainer.sqf | 4 ++++ addons/wardrobe/functions/fnc_replaceOther.sqf | 4 ++++ addons/wardrobe/stringtable.xml | 5 ++++- 9 files changed, 32 insertions(+), 7 deletions(-) create mode 100644 addons/wardrobe/data/hourglass_logo_ca.paa create mode 100644 addons/wardrobe/data/hourglass_logo_ca.png diff --git a/addons/wardrobe/CfgVehicles.hpp b/addons/wardrobe/CfgVehicles.hpp index f6730946746..72b1ae2df59 100644 --- a/addons/wardrobe/CfgVehicles.hpp +++ b/addons/wardrobe/CfgVehicles.hpp @@ -4,7 +4,7 @@ class CfgVehicles { class ACE_SelfActions { class ACE_Equipment { class ADDON { - displayName = CSTRING(actionTitle); // Text shown to user + displayName = CSTRING(action_title); // Text shown to user icon = QPATHTOF(data\wardrobe_logo.paa); condition = QUOTE(_player call FUNC(addActionsCondition)); statement = ""; diff --git a/addons/wardrobe/XEH_preInit.sqf b/addons/wardrobe/XEH_preInit.sqf index 6d5fd0a42f7..5b23501bdc0 100644 --- a/addons/wardrobe/XEH_preInit.sqf +++ b/addons/wardrobe/XEH_preInit.sqf @@ -8,6 +8,6 @@ PREP_RECOMPILE_END; #include "initSettings.inc.sqf" -missionNamespace setVariable [QGVAR(cache), createHashMap]; +missionNamespace setVariable [QGVAR(inProgress), false]; ADDON = true; diff --git a/addons/wardrobe/data/hourglass_logo_ca.paa b/addons/wardrobe/data/hourglass_logo_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..c049896b8ece03ced95dc2fe7ce386a097fc0182 GIT binary patch literal 5625 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 literal 0 HcmV?d00001 diff --git a/addons/wardrobe/functions/fnc_addActions.sqf b/addons/wardrobe/functions/fnc_addActions.sqf index 16ed0383a78..cb9451db091 100644 --- a/addons/wardrobe/functions/fnc_addActions.sqf +++ b/addons/wardrobe/functions/fnc_addActions.sqf @@ -18,9 +18,20 @@ params ["_player"]; -private _modifiableItems = _player call FUNC(getItemsModifiableCurrent); private _actions = []; +// create "a in Progress" placeholder while an previous wardrobe action is not done +private _aceAction = [ + QGVAR(inProgress), + LLSTRING(action_inProgress), + QPATHTOF(data\hourglass_logo_ca.paa), + { "" }, + { GVAR(inProgress) }, + { } +] call EFUNC(interact_menu,createAction); +_actions pushBack [_aceAction, [], _player]; + +private _modifiableItems = _player call FUNC(getItemsModifiableCurrent); { private _cfg = _x#0; private _aceAction = [ @@ -28,7 +39,7 @@ private _actions = []; getText (_cfg >> "displayName"), getText (_cfg >> "picture"), {}, - { true }, + { ! GVAR(inProgress) }, FUNC(addActionsChildren), [_cfg, _x#1] ] call EFUNC(interact_menu,createAction); diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 501ddb54d55..c9ae1ee2b3a 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -23,11 +23,15 @@ params ["", "_player", "_actionParams", ["_replaceNow", false, [true]]]; _actionParams params ["_cfgOrigin", "_cfgTarget"]; + private _classTarget = configName _cfgTarget; private _classOrigin = configName _cfgOrigin; // duration of the "animation" -private _duration = if (_replaceNow) then { 0 } else { getNumber (configFile >> QUOTE(ADDON) >> _classTarget >> "duration") }; // _replaceNow needed for cba context menu to avoid potential duplications and such +private _duration = if (_replaceNow) then { 0 } else { + GVAR(inProgress) = true; // temp action disabled + getNumber (configFile >> QUOTE(ADDON) >> _classTarget >> "duration") +}; // _replaceNow needed for cba context menu to avoid potential duplications and such // replace the main Item private _equipmentType = ""; @@ -45,7 +49,6 @@ private _replaceCode = switch (_typeNumber) do { }; }; }; - if (_replaceCode isEqualTo {}) exitWith { ERROR_2("typeNumber undefined: %1 - %2",_typeNumber,_classOrigin); }; [_replaceCode, [_player, _classTarget, _equipmentType], _duration] call CBA_fnc_waitAndExecute; diff --git a/addons/wardrobe/functions/fnc_replaceContainer.sqf b/addons/wardrobe/functions/fnc_replaceContainer.sqf index b089ac09303..e8d93acfe1f 100644 --- a/addons/wardrobe/functions/fnc_replaceContainer.sqf +++ b/addons/wardrobe/functions/fnc_replaceContainer.sqf @@ -55,3 +55,7 @@ if (_spareBarrel isEqualType []) then { private _newMagIDsSpareBarrel = [_player, "ACE_SpareBarrel"] call CBA_fnc_getMagazineIndex; [QGVAR(updateMagIDs), [_spareBarrel, _newMagIDsSpareBarrel]] call CBA_fnc_serverEvent; }; + +GVAR(inProgress) = false; // re-enable action + +nil diff --git a/addons/wardrobe/functions/fnc_replaceOther.sqf b/addons/wardrobe/functions/fnc_replaceOther.sqf index f182c175743..638b085e635 100644 --- a/addons/wardrobe/functions/fnc_replaceOther.sqf +++ b/addons/wardrobe/functions/fnc_replaceOther.sqf @@ -30,3 +30,7 @@ switch (_equipmentType) do { _player addGoggles _classTarget; }; }; + +GVAR(inProgress) = false; // re-enable action + +nil diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml index 5daee77513e..c97224232cc 100644 --- a/addons/wardrobe/stringtable.xml +++ b/addons/wardrobe/stringtable.xml @@ -1,7 +1,10 @@ - + + busy... + + Wardrobe Garderobe From ccd3ee9061d69a5f0ed3aafc9f997c8f2744bfaa Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 6 Jun 2025 13:26:21 +0200 Subject: [PATCH 292/305] custom hourglass icon -> a3 wait task icon --- addons/wardrobe/data/hourglass_logo_ca.paa | Bin 5625 -> 0 bytes addons/wardrobe/data/hourglass_logo_ca.png | Bin 5119 -> 0 bytes addons/wardrobe/functions/fnc_addActions.sqf | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 addons/wardrobe/data/hourglass_logo_ca.paa delete mode 100644 addons/wardrobe/data/hourglass_logo_ca.png diff --git a/addons/wardrobe/data/hourglass_logo_ca.paa b/addons/wardrobe/data/hourglass_logo_ca.paa deleted file mode 100644 index c049896b8ece03ced95dc2fe7ce386a097fc0182..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5625 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 diff --git a/addons/wardrobe/functions/fnc_addActions.sqf b/addons/wardrobe/functions/fnc_addActions.sqf index cb9451db091..86cb9b016b1 100644 --- a/addons/wardrobe/functions/fnc_addActions.sqf +++ b/addons/wardrobe/functions/fnc_addActions.sqf @@ -24,7 +24,7 @@ private _actions = []; private _aceAction = [ QGVAR(inProgress), LLSTRING(action_inProgress), - QPATHTOF(data\hourglass_logo_ca.paa), + "\A3\ui_f\data\igui\cfg\simpleTasks\types\wait_ca.paa", { "" }, { GVAR(inProgress) }, { } From 9a352644f9a749fbf5327c2e51d67534aa3b8151 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 6 Jun 2025 17:19:50 +0200 Subject: [PATCH 293/305] rm cba item context menu to seperate PR --- addons/wardrobe/XEH_PREP.hpp | 3 - .../functions/fnc_enableContextMenu.sqf | 37 ------------ .../wardrobe/functions/fnc_nextVariantDo.sqf | 44 -------------- .../wardrobe/functions/fnc_nextVariantGet.sqf | 57 ------------------- addons/wardrobe/initSettings.inc.sqf | 10 ---- 5 files changed, 151 deletions(-) delete mode 100644 addons/wardrobe/functions/fnc_enableContextMenu.sqf delete mode 100644 addons/wardrobe/functions/fnc_nextVariantDo.sqf delete mode 100644 addons/wardrobe/functions/fnc_nextVariantGet.sqf diff --git a/addons/wardrobe/XEH_PREP.hpp b/addons/wardrobe/XEH_PREP.hpp index ba363ac181a..d364f672604 100644 --- a/addons/wardrobe/XEH_PREP.hpp +++ b/addons/wardrobe/XEH_PREP.hpp @@ -5,15 +5,12 @@ PREP(addActionsIcon); PREP(addActionsName); PREP(canModifyTo); PREP(compareComponents); -PREP(enableContextMenu); PREP(getIndexFromMagID); PREP(getItemsAll); PREP(getItemsModifiableAll); PREP(getItemsModifiableCurrent); PREP(getItemsModifiableTo); PREP(isModifiable); -PREP(nextVariantDo); -PREP(nextVariantGet); PREP(replace); PREP(replaceContainer); PREP(replaceOther); diff --git a/addons/wardrobe/functions/fnc_enableContextMenu.sqf b/addons/wardrobe/functions/fnc_enableContextMenu.sqf deleted file mode 100644 index 2db50788793..00000000000 --- a/addons/wardrobe/functions/fnc_enableContextMenu.sqf +++ /dev/null @@ -1,37 +0,0 @@ -#include "../script_component.hpp" -/* - * Author: OverlordZorn - * CBA Setting - on setting changed - function to activate the wardrobe-related cba context menu options. - * - * Arguments: - * 0: CBA Setting Value - * - * Return Value: - * None - * - * Example: - * true call ace_wardrobe_fnc_enableContextMenu - * - * Public: No - */ - -params [["_enable", true, [true]]]; - -if (_enable && { !(missionNamespace getVariable [QGVAR(contextmenuEnabled), false]) }) then { - missionNamespace setVariable [QGVAR(contextmenuEnabled), true]; - - [ - "#ALL", - "CLOTHES", - "Switch to next variant", - [], - QPATHTOF(data\wardrobe_logo.paa), - [ - { GVAR(enableContextMenu) }, - { GVAR(enableContextMenu) } - ], - FUNC(nextVariantDo), - false, - [] - ] call CBA_fnc_addItemContextMenuOption; -}; diff --git a/addons/wardrobe/functions/fnc_nextVariantDo.sqf b/addons/wardrobe/functions/fnc_nextVariantDo.sqf deleted file mode 100644 index c01d2c31fd1..00000000000 --- a/addons/wardrobe/functions/fnc_nextVariantDo.sqf +++ /dev/null @@ -1,44 +0,0 @@ -#include "../script_component.hpp" -/* - * Author: OverlordZorn - * Statement of cba context menu entry. Requests the next variant. - * - * Arguments: - * 0: Player - * 1: Container - * 2: Classname - * 3: Slot - * 4: Arguments - * - * Return Value: - * None - * - * Example: - * [player, nil, G_Balaclava_combat] call ace_wardrobe_fnc_nextVariantDo; - * - * Public: No - */ - -params ["_player", "", "_item", "", ""]; - -private _cfgCurrent = _item call CBA_fnc_getItemConfig; - -private _cfgTarget = [_cfgCurrent, _player] call FUNC(nextVariantGet); - -if (_cfgTarget isEqualTo false) exitWith {}; - -private _canModifyTo = [_player, _cfgCurrent, _cfgTarget, false] call FUNC(canModifyTo); - -if !(_canModifyTo) exitWith { - [ - [ - LLSTRING(missingComponents), - getText (_cfgTarget >> "displayName") - ], - 2.5 - ] call EFUNC(common,displayTextStructured); -}; - -[_player, _player, [_cfgCurrent, _cfgTarget], true] call FUNC(replace); - -nil diff --git a/addons/wardrobe/functions/fnc_nextVariantGet.sqf b/addons/wardrobe/functions/fnc_nextVariantGet.sqf deleted file mode 100644 index 69bbb4a39d8..00000000000 --- a/addons/wardrobe/functions/fnc_nextVariantGet.sqf +++ /dev/null @@ -1,57 +0,0 @@ -#include "../script_component.hpp" -/* - * Author: OverlordZorn - * Context Menu. Return config of the "next" variant - if multiple variants are defined, it will choose randomly. - * Maintains a history of the current and chosen variants as long as the inventory is open. - * Already used variants from the hstory will be removed from the availabe options. - * Once all options have been exhausted, the history will be reset. - * - * Arguments: - * 0: Current variant - * - * Return Value: - * Desired variant - * - * Example: - * [configFile >> "CfgWeapons" >> "U_B_CTRG_1", player] call ace_wardrobe_fnc_nextVariantGet - * - * Public: No - */ - -params ["_cfgCurrent", "_player"]; - -private _cfgModifiableTo = [_cfgCurrent, false] call FUNC(getItemsModifiableTo); - -if (_cfgModifiableTo isEqualTo []) exitWith { configNull }; - -private _cfgHistory = missionNamespace getVariable [QGVAR(variantHistory), nil]; - -if (isNil "_cfgHistory") then { - - _cfgHistory = []; - _cfgHistory pushBackUnique _cfgCurrent; - - missionNamespace setVariable [QGVAR(variantHistory), _cfgHistory]; - - _player addEventHandler ["InventoryClosed", { - GVAR(variantHistory) = nil; - ACE_player removeEventHandler [_thisEvent, _thisEventhandler]; - }]; -}; - -private _remaining = _cfgModifiableTo - _cfgHistory; - -_remaining = _remaining select { [_player, _cfgCurrent, _x] call FUNC(canModifyTo) }; - -// returns either a random remaining item or alternatively, a random one from the complete array -private _return = if (_remaining isNotEqualTo []) then { - selectRandom _remaining -} else { - _cfgHistory = []; - missionNamespace setVariable [QGVAR(variantHistory), []]; - _cfgHistory pushBackUnique _cfgCurrent; - selectRandom _cfgModifiableTo; -}; - -_cfgHistory pushBackUnique _return; -_return diff --git a/addons/wardrobe/initSettings.inc.sqf b/addons/wardrobe/initSettings.inc.sqf index 73e5aaa0ffe..4ccb9285c50 100644 --- a/addons/wardrobe/initSettings.inc.sqf +++ b/addons/wardrobe/initSettings.inc.sqf @@ -5,13 +5,3 @@ [LSTRING(setting_category_main)], true ] call CBA_fnc_addSetting; - -[ - QGVAR(enableContextMenu), - "CHECKBOX", - LSTRING(enable_contextMenu), - [LSTRING(setting_category_main)], - true, - 0, - LINKFUNC(enableContextMenu) -] call CBA_fnc_addSetting; From 9d6cd6fe6851eb85eaa84b61030cb460ceb27aed Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Sat, 7 Jun 2025 11:58:43 +0200 Subject: [PATCH 294/305] Update docs/wiki/framework/wardrobe-framework.md Co-authored-by: johnb432 <58661205+johnb432@users.noreply.github.com> --- docs/wiki/framework/wardrobe-framework.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index 1e3840802d1..e72874fa487 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -266,8 +266,6 @@ Currently, `ace_intelitems` and `ace_overheating` (spare barrels) are being dire If an addon or mod utilizes a magazine's `magazineID` to handle additional data about items carried by the player, then the process of modifying a wearable container (uniform, vest, backpack) to another variant will result in new `magazineID`s for all magazines on the player and therefore, require special handling within `ace_wardrobe` functions. -There *might* be some changes coming from BI regarding how arma handles the `setUnitLoadout` which could resolve the need for this. - ## 6.2 Container Size - Uniform, Vest, Backpack When the player changes from one container item to another through the wardrobe action and the container's `maximumLoad` is smaller then previously, the player risks the loss of items carried inside said container. From bad4c0cd76e5fa56fea83fde640bbcebd5fcc720 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Sat, 7 Jun 2025 11:59:55 +0200 Subject: [PATCH 295/305] Update addons/wardrobe/stringtable.xml Co-authored-by: johnb432 <58661205+johnb432@users.noreply.github.com> --- addons/wardrobe/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml index c97224232cc..7b62c7f9d6a 100644 --- a/addons/wardrobe/stringtable.xml +++ b/addons/wardrobe/stringtable.xml @@ -2,7 +2,7 @@ - busy... + Busy... Wardrobe From a02ea4a9b28ead9f2b769584186dfa5c74eadd00 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 7 Jun 2025 12:04:57 +0200 Subject: [PATCH 296/305] _cfgWardrobeTarget --- addons/wardrobe/functions/fnc_replace.sqf | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index c9ae1ee2b3a..1a498d868a2 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -26,11 +26,12 @@ _actionParams params ["_cfgOrigin", "_cfgTarget"]; private _classTarget = configName _cfgTarget; private _classOrigin = configName _cfgOrigin; +private _cfgWardobeTarget = configFile >> QUOTE(ADDON) >> _classTarget; // duration of the "animation" private _duration = if (_replaceNow) then { 0 } else { GVAR(inProgress) = true; // temp action disabled - getNumber (configFile >> QUOTE(ADDON) >> _classTarget >> "duration") + getNumber (_cfgWardobeTarget >> "duration") }; // _replaceNow needed for cba context menu to avoid potential duplications and such // replace the main Item @@ -79,15 +80,15 @@ if (_replaceCode isEqualTo {}) exitWith { ERROR_2("typeNumber undefined: %1 - %2 // handle effects // animation/gestures -[_player, getText (configFile >> QUOTE(ADDON) >> _classTarget >> "gesture")] call EFUNC(common,doGesture); +[_player, getText (_cfgWardobeTargett >> "gesture")] call EFUNC(common,doGesture); // plays random sound at the beginning -private _sound = [configFile >> QUOTE(ADDON) >> _classTarget >> "sound"] call CBA_fnc_getCfgDataRandom; +private _sound = [_cfgWardobeTarget >> "sound"] call CBA_fnc_getCfgDataRandom; if (_sound isNotEqualTo "") then { [ CBA_fnc_globalSay3D, [_player, _sound, nil, true, true], - (getNumber (configFile >> QUOTE(ADDON) >> _classTarget >> "sound_timing") max 0 min 1) * _duration + (getNumber (_cfgWardobeTarget >> "sound_timing") max 0 min 1) * _duration ] call CBA_fnc_waitAndExecute; }; From 08d0f11f5dec85f455df46d076dc15f275c10f2a Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 7 Jun 2025 12:08:51 +0200 Subject: [PATCH 297/305] wiki and stringtable --- addons/wardrobe/stringtable.xml | 4 ---- docs/wiki/framework/wardrobe-framework.md | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/addons/wardrobe/stringtable.xml b/addons/wardrobe/stringtable.xml index 7b62c7f9d6a..79bd88a287e 100644 --- a/addons/wardrobe/stringtable.xml +++ b/addons/wardrobe/stringtable.xml @@ -12,10 +12,6 @@ ACE Interaction Aktivieren ACE Interaction - - CBA Context Menu - Aktiviere CBA Context Menu - Take gloves off diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index e72874fa487..af12021f5fa 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -17,7 +17,7 @@ version: The Wardrobe addon gives the player the opportunity to change/modify their current wearables into different variants. -For example, if a uniform has a normal variant and a "rolled-Up sleeves" variant, the player will be able to use ether an ACE Self Interaction or the CBA Context Menu in the inventory. +For example, if a uniform has a normal variant and a "rolled-Up sleeves" variant, the player will be able to use ether an ACE Self Interaction. Since there is no reliable, common patterns in terms of class inheritance, not even within the same DLC, each possible variant has to be defined individually within `configFile >> "ace_wardrobe"`. @@ -26,7 +26,7 @@ Since there is no reliable, common patterns in terms of class inheritance, not e Components are an optional assistance to define a group of variants where a variant is made of one or more components. For example, a bandana with sunglasses would have the the bandana and the sunglasses as components, while the bandana and sunglasses only have themselves as a component. -If the player switches from a variant with more components to a variant with less components, the surplus components will be deposited in their inventory. Vice Versa, if the player wants to change from a variant with less components to a variant with more components, they are required to have the missing components in their inventory, which will be removed on conversion. +If the player switches from a variant with more components to a variant with less components, the surplus components will be deposited in their inventory. On the other hand, if the player wants to change from a variant with less components to a variant with more components, they are required to have the missing components in their inventory, which will be removed on conversion. More examples can be found below. From e3cdd2136aa3de5f421bc26b45ad1b8ec7859056 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 7 Jun 2025 12:13:29 +0200 Subject: [PATCH 298/305] rm replaceNow --- addons/wardrobe/functions/fnc_replace.sqf | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/addons/wardrobe/functions/fnc_replace.sqf b/addons/wardrobe/functions/fnc_replace.sqf index 1a498d868a2..b5966bd69c5 100644 --- a/addons/wardrobe/functions/fnc_replace.sqf +++ b/addons/wardrobe/functions/fnc_replace.sqf @@ -9,7 +9,6 @@ * 2: Action params * - 0: Current variant * - 0: Desired variant - * 3: Replace Now? (default: false) * * Return Value: * None @@ -20,7 +19,7 @@ * Public: No */ -params ["", "_player", "_actionParams", ["_replaceNow", false, [true]]]; +params ["", "_player", "_actionParams"]; _actionParams params ["_cfgOrigin", "_cfgTarget"]; @@ -28,12 +27,12 @@ private _classTarget = configName _cfgTarget; private _classOrigin = configName _cfgOrigin; private _cfgWardobeTarget = configFile >> QUOTE(ADDON) >> _classTarget; -// duration of the "animation" -private _duration = if (_replaceNow) then { 0 } else { - GVAR(inProgress) = true; // temp action disabled - getNumber (_cfgWardobeTarget >> "duration") -}; // _replaceNow needed for cba context menu to avoid potential duplications and such +// temp action disabled +GVAR(inProgress) = true; +// duration of the "animation" +private _duration = getNumber (_cfgWardobeTarget >> "duration"); + // replace the main Item private _equipmentType = ""; private _typeNumber = getNumber (_cfgOrigin >> "ItemInfo" >> "type"); From ade1200329a04b0911536562c98cb060afac2473 Mon Sep 17 00:00:00 2001 From: OverlordZorn <56258612+OverlordZorn@users.noreply.github.com> Date: Sat, 7 Jun 2025 12:20:30 +0200 Subject: [PATCH 299/305] johno suggestions Co-authored-by: johnb432 <58661205+johnb432@users.noreply.github.com> --- addons/wardrobe/XEH_PREP.hpp | 2 +- addons/wardrobe/XEH_postInit.sqf | 2 +- addons/wardrobe/config.cpp | 4 ++-- addons/wardrobe/dev/compareContainerMaxLoad.sqf | 8 ++++---- addons/wardrobe/functions/fnc_addActionsName.sqf | 3 +-- addons/wardrobe/functions/fnc_canModifyTo.sqf | 4 ++-- addons/wardrobe/functions/fnc_compareComponents.sqf | 2 +- addons/wardrobe/functions/fnc_replaceContainer.sqf | 4 ++-- addons/wardrobe/functions/fnc_replaceOther.sqf | 4 ++-- 9 files changed, 16 insertions(+), 17 deletions(-) diff --git a/addons/wardrobe/XEH_PREP.hpp b/addons/wardrobe/XEH_PREP.hpp index d364f672604..349b541489f 100644 --- a/addons/wardrobe/XEH_PREP.hpp +++ b/addons/wardrobe/XEH_PREP.hpp @@ -1,6 +1,6 @@ PREP(addActions); -PREP(addActionsCondition); PREP(addActionsChildren); +PREP(addActionsCondition); PREP(addActionsIcon); PREP(addActionsName); PREP(canModifyTo); diff --git a/addons/wardrobe/XEH_postInit.sqf b/addons/wardrobe/XEH_postInit.sqf index f73f6987ac7..b839c8a8206 100644 --- a/addons/wardrobe/XEH_postInit.sqf +++ b/addons/wardrobe/XEH_postInit.sqf @@ -1,3 +1,3 @@ #include "script_component.hpp" -[QGVAR(updateMagIDs), FUNC(spareBarrelUpdateMagIDs)] call CBA_fnc_addEventHandler; +[QGVAR(updateMagIDs), LINKFUNC(spareBarrelUpdateMagIDs)] call CBA_fnc_addEventHandler; diff --git a/addons/wardrobe/config.cpp b/addons/wardrobe/config.cpp index 980b19a577d..fa87d857453 100644 --- a/addons/wardrobe/config.cpp +++ b/addons/wardrobe/config.cpp @@ -7,8 +7,8 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = { - "ace_interact_menu", - "ace_goggles" + "ace_goggles", + "ace_interact_menu" }; skipWhenMissingDependencies = 1; author = ECSTRING(common,ACETeam); diff --git a/addons/wardrobe/dev/compareContainerMaxLoad.sqf b/addons/wardrobe/dev/compareContainerMaxLoad.sqf index d2649e67d7e..6163d53ce7d 100644 --- a/addons/wardrobe/dev/compareContainerMaxLoad.sqf +++ b/addons/wardrobe/dev/compareContainerMaxLoad.sqf @@ -9,10 +9,10 @@ * Return Value: * None * - * Example: execVM "\z\ace\addons\wardrobe\dev\compareContainerMaxLoad.sqf"; - * + * Example: + * call compile preprocessFileLineNumbers "\z\ace\addons\wardrobe\dev\compareContainerMaxLoad.sqf"; * - * Public: no + * Public: No */ private _allWardrobeItems = call compile preprocessFileLineNumbers "z\ace\addons\wardrobe\dev\getAllWardrobeItems.sqf" select { @@ -55,7 +55,7 @@ LOG_SYS("CompareMaxLoad","====================================================== if (_mismatch) then { _mismatches pushBack [_originClassName,_originMaxLoad,_targetClassName,_targetMaxLoad]; }; LOG_SYS("CompareMaxLoad",_string); - ADD(_index,1); + INC(_index); } forEach _targets; } forEach _allWardrobeItems; diff --git a/addons/wardrobe/functions/fnc_addActionsName.sqf b/addons/wardrobe/functions/fnc_addActionsName.sqf index e3584505d57..69a9315f0ab 100644 --- a/addons/wardrobe/functions/fnc_addActionsName.sqf +++ b/addons/wardrobe/functions/fnc_addActionsName.sqf @@ -29,5 +29,4 @@ if (_directional isNotEqualTo "") exitWith { _directional }; private _alternative = getText (configFile >> QUOTE(ADDON) >> _classTarget >> "alternativeActionName"); if (_alternative isNotEqualTo "") exitWith { _alternative }; -// return -getText (_cfgTarget >> "displayName") +getText (_cfgTarget >> "displayName") // return diff --git a/addons/wardrobe/functions/fnc_canModifyTo.sqf b/addons/wardrobe/functions/fnc_canModifyTo.sqf index c41d7e5d7b8..de0124824c2 100644 --- a/addons/wardrobe/functions/fnc_canModifyTo.sqf +++ b/addons/wardrobe/functions/fnc_canModifyTo.sqf @@ -20,8 +20,8 @@ params ["_player", "_cfgOrigin", "_cfgTarget", ["_cache", true, [true]]]; -[configName _cfgOrigin, configName _cfgTarget] call FUNC(compareComponents) params ["_missing", ""]; +private _missing = ([configName _cfgOrigin, configName _cfgTarget] call FUNC(compareComponents)) select 0; private _currentItems = [_player, _cache] call FUNC(getItemsAll); -_missing select { ! (_x in _currentItems) } isEqualTo [] // return +_missing findIf { ! (_x in _currentItems) } != -1 // return diff --git a/addons/wardrobe/functions/fnc_compareComponents.sqf b/addons/wardrobe/functions/fnc_compareComponents.sqf index 1eb0fa0658f..446cd04b3be 100644 --- a/addons/wardrobe/functions/fnc_compareComponents.sqf +++ b/addons/wardrobe/functions/fnc_compareComponents.sqf @@ -25,7 +25,7 @@ private _checkfallbackComponent = { // if not, will look-up if item is defined within ace_Wardrobe and has an fallbackComponent defined // if not, the component will be fully ignored if (isNull (_x call CBA_fnc_getItemConfig)) then { - getText (configFile >> QUOTE(ADDON) >> _x >> "fallbackComponent"); + getText (configFile >> QUOTE(ADDON) >> _x >> "fallbackComponent") } else { _x }; diff --git a/addons/wardrobe/functions/fnc_replaceContainer.sqf b/addons/wardrobe/functions/fnc_replaceContainer.sqf index e8d93acfe1f..4922fa7d539 100644 --- a/addons/wardrobe/functions/fnc_replaceContainer.sqf +++ b/addons/wardrobe/functions/fnc_replaceContainer.sqf @@ -12,8 +12,8 @@ * None * * Example: - * [player, "U_B_CTRG_3", UNIFORM] call ace_wardrobe_fnc_replaceContainer - * [player, "U_B_CTRG_1", UNIFORM] call ace_wardrobe_fnc_replaceContainer + * [player, "U_B_CTRG_3", "UNIFORM"] call ace_wardrobe_fnc_replaceContainer + * [player, "U_B_CTRG_1", "UNIFORM"] call ace_wardrobe_fnc_replaceContainer * * Public: No */ diff --git a/addons/wardrobe/functions/fnc_replaceOther.sqf b/addons/wardrobe/functions/fnc_replaceOther.sqf index 638b085e635..61c5a19d7f5 100644 --- a/addons/wardrobe/functions/fnc_replaceOther.sqf +++ b/addons/wardrobe/functions/fnc_replaceOther.sqf @@ -12,8 +12,8 @@ * None * * Example: - * [player, "G_Bandanna_blk", FACEWEAR] call ace_wardrobe_fnc_replaceOther - * [player, "G_Bandanna_aviator", FACEWEAR] call ace_wardrobe_fnc_replaceOther + * [player, "G_Bandanna_blk", "FACEWEAR"] call ace_wardrobe_fnc_replaceOther + * [player, "G_Bandanna_aviator", "FACEWEAR"] call ace_wardrobe_fnc_replaceOther * * Public: No */ From 9850380379ef0c9b0b1383e617c478cfa3c50809 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 7 Jun 2025 12:26:14 +0200 Subject: [PATCH 300/305] fix debug fnc's --- addons/wardrobe/dev/compareContainerMaxLoad.sqf | 2 +- addons/wardrobe/dev/getAllWardrobeItems.sqf | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/addons/wardrobe/dev/compareContainerMaxLoad.sqf b/addons/wardrobe/dev/compareContainerMaxLoad.sqf index 6163d53ce7d..965c6687e95 100644 --- a/addons/wardrobe/dev/compareContainerMaxLoad.sqf +++ b/addons/wardrobe/dev/compareContainerMaxLoad.sqf @@ -15,7 +15,7 @@ * Public: No */ -private _allWardrobeItems = call compile preprocessFileLineNumbers "z\ace\addons\wardrobe\dev\getAllWardrobeItems.sqf" select { +private _allWardrobeItems = [true] call compile preprocessFileLineNumbers "z\ace\addons\wardrobe\dev\getAllWardrobeItems.sqf" select { switch (getNumber (_x >> "ItemInfo" >> "type")) do { case TYPE_GOGGLE: { false; }; case TYPE_HEADGEAR: { false; }; diff --git a/addons/wardrobe/dev/getAllWardrobeItems.sqf b/addons/wardrobe/dev/getAllWardrobeItems.sqf index 342774cb52e..83b0c5c4c00 100644 --- a/addons/wardrobe/dev/getAllWardrobeItems.sqf +++ b/addons/wardrobe/dev/getAllWardrobeItems.sqf @@ -12,13 +12,19 @@ * Example: * call compile preprocessFileLineNumbers "z\ace\addons\wardrobe\dev\getAllWardrobeItems.sqf"; * - * Public: Yes + * Public: No */ +params ["_asConfig", false, [false]]; + private _return = []; { _return append (QUOTE(_x call FUNC(isModifiable)) configClasses (configFile >> _x)); } forEach ["CfgWeapons", "CfgGlasses"]; -_return apply { configName _x } // return +if (_asConfig) then { + _return apply { configName _x } // return +} else { + _return +} From 951a7c2ab6652ec7eddd8fc34be346ac2fa8c631 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 7 Jun 2025 12:28:42 +0200 Subject: [PATCH 301/305] header --- addons/wardrobe/dev/getAllWardrobeItems.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/wardrobe/dev/getAllWardrobeItems.sqf b/addons/wardrobe/dev/getAllWardrobeItems.sqf index 83b0c5c4c00..944a97800e4 100644 --- a/addons/wardrobe/dev/getAllWardrobeItems.sqf +++ b/addons/wardrobe/dev/getAllWardrobeItems.sqf @@ -4,7 +4,7 @@ * Debug - Script to retrieve all existing Wardrobe items. * * Arguments: - * None + * _asConfig (Default: false) * * Return Value: * Wardobe items, either as classname or config From eb1ce6f58e179e6baf8e1ecf72315d74dfecf702 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 7 Jun 2025 12:30:34 +0200 Subject: [PATCH 302/305] rm unused param --- addons/wardrobe/functions/fnc_canModifyTo.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/wardrobe/functions/fnc_canModifyTo.sqf b/addons/wardrobe/functions/fnc_canModifyTo.sqf index de0124824c2..4e8aac76be5 100644 --- a/addons/wardrobe/functions/fnc_canModifyTo.sqf +++ b/addons/wardrobe/functions/fnc_canModifyTo.sqf @@ -18,10 +18,10 @@ * Public: No */ -params ["_player", "_cfgOrigin", "_cfgTarget", ["_cache", true, [true]]]; +params ["_player", "_cfgOrigin", "_cfgTarget"]; private _missing = ([configName _cfgOrigin, configName _cfgTarget] call FUNC(compareComponents)) select 0; -private _currentItems = [_player, _cache] call FUNC(getItemsAll); +private _currentItems = [_player] call FUNC(getItemsAll); _missing findIf { ! (_x in _currentItems) } != -1 // return From cb71a00bcf0243dae58c1c95f3602192240861ee Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 10 Jun 2025 15:43:23 +0200 Subject: [PATCH 303/305] add {} --- .../CfgWardrobe_Helmets.hpp | 16 +++--- .../CfgWardrobe_Uniform.hpp | 24 ++++----- .../CfgWardrobe_Facewear.hpp | 16 +++--- .../CfgWardrobe_Helmets.hpp | 34 ++++++------ .../CfgWardrobe_Headgear.hpp | 4 +- .../CfgWardrobe_Turbans.hpp | 28 +++++----- addons/wardrobe/Facewear.hpp | 54 +++++++++---------- addons/wardrobe/script_macros_wardrobe.hpp | 16 +++--- docs/wiki/framework/wardrobe-framework.md | 18 +++---- 9 files changed, 105 insertions(+), 105 deletions(-) diff --git a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Helmets.hpp b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Helmets.hpp index 01afad037f5..2b84e1ff1b8 100644 --- a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Helmets.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Helmets.hpp @@ -26,8 +26,8 @@ HELMET_GOGGLES(gm_ge_bgs_headgear_m38_72_goggles_bgr,gm_ge_bgs_headgear_m38_72_b // Helmet Only class gm_ge_headgear_m62_net: EGVAR(wardrobe,base) { class modifiableTo { - class gm_ge_headgear_sidecap_80_m62_oli; - class gm_ge_headgear_hat_80_m62_oli; + class gm_ge_headgear_sidecap_80_m62_oli {}; + class gm_ge_headgear_hat_80_m62_oli {}; }; components[] = {"gm_ge_headgear_m62_net"}; }; @@ -36,14 +36,14 @@ class gm_ge_headgear_m62_net: EGVAR(wardrobe,base) { // Hats only class gm_ge_headgear_hat_80_oli: EGVAR(wardrobe,base) { class modifiableTo { - class gm_ge_headgear_hat_80_m62_oli; + class gm_ge_headgear_hat_80_m62_oli {}; }; components[] = {"gm_ge_headgear_hat_80_oli"}; }; class gm_ge_headgear_sidecap_80_oli: EGVAR(wardrobe,base) { class modifiableTo { - class gm_ge_headgear_sidecap_80_m62_oli; + class gm_ge_headgear_sidecap_80_m62_oli {}; }; components[] = {"gm_ge_headgear_sidecap_80_oli"}; }; @@ -52,8 +52,8 @@ class gm_ge_headgear_sidecap_80_oli: EGVAR(wardrobe,base) { class gm_ge_headgear_hat_80_m62_oli: EGVAR(wardrobe,base) { class modifiableTo { - class gm_ge_headgear_hat_80_oli; - class gm_ge_headgear_m62_net; + class gm_ge_headgear_hat_80_oli {}; + class gm_ge_headgear_m62_net {}; }; components[] = {"gm_ge_headgear_hat_80_oli","gm_ge_headgear_m62_net"}; }; @@ -62,8 +62,8 @@ class gm_ge_headgear_hat_80_m62_oli: EGVAR(wardrobe,base) { class gm_ge_headgear_sidecap_80_m62_oli: EGVAR(wardrobe,base) { class modifiableTo { - class gm_ge_headgear_sidecap_80_oli; - class gm_ge_headgear_m62_net; + class gm_ge_headgear_sidecap_80_oli {}; + class gm_ge_headgear_m62_net {}; }; components[] = {"gm_ge_headgear_sidecap_80_oli","gm_ge_headgear_m62_net"}; }; diff --git a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Uniform.hpp b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Uniform.hpp index 2152cab95d4..4b1b6710fa2 100644 --- a/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Uniform.hpp +++ b/addons/compat_gm/compat_gm_wardrobe/CfgWardrobe_Uniform.hpp @@ -30,39 +30,39 @@ UNIFORM_GLOVES(gm_ge_army_uniform_soldier_gloves_80_ols,gm_ge_army_uniform_soldi // Woodland Variant class gm_xx_uniform_soldier_bdu_80_wdl: EGVAR(wardrobe,base_U_gloves_on) { class modifiableTo { - class gm_xx_uniform_soldier_bdu_rolled_80_wdl; - class gm_xx_uniform_soldier_bdu_nogloves_80_wdl; + class gm_xx_uniform_soldier_bdu_rolled_80_wdl {}; + class gm_xx_uniform_soldier_bdu_nogloves_80_wdl {}; }; }; class gm_xx_uniform_soldier_bdu_rolled_80_wdl: EGVAR(wardrobe,base_U_sleeves_up) { class modifiableTo { - class gm_xx_uniform_soldier_bdu_80_wdl; - class gm_xx_uniform_soldier_bdu_nogloves_80_wdl; + class gm_xx_uniform_soldier_bdu_80_wdl {}; + class gm_xx_uniform_soldier_bdu_nogloves_80_wdl {}; }; }; class gm_xx_uniform_soldier_bdu_nogloves_80_wdl: EGVAR(wardrobe,base) { class modifiableTo { - class gm_xx_uniform_soldier_bdu_80_wdl; - class gm_xx_uniform_soldier_bdu_rolled_80_wdl; + class gm_xx_uniform_soldier_bdu_80_wdl {}; + class gm_xx_uniform_soldier_bdu_rolled_80_wdl {}; }; }; // Olive variant class gm_xx_uniform_soldier_bdu_80_oli: EGVAR(wardrobe,base_U_gloves_on) { class modifiableTo { - class gm_xx_uniform_soldier_bdu_rolled_80_oli; - class gm_xx_uniform_soldier_bdu_nogloves_80_oli; + class gm_xx_uniform_soldier_bdu_rolled_80_oli {}; + class gm_xx_uniform_soldier_bdu_nogloves_80_oli {}; }; }; class gm_xx_uniform_soldier_bdu_rolled_80_oli: EGVAR(wardrobe,base_U_sleeves_up) { class modifiableTo { - class gm_xx_uniform_soldier_bdu_80_oli; - class gm_xx_uniform_soldier_bdu_nogloves_80_oli; + class gm_xx_uniform_soldier_bdu_80_oli {}; + class gm_xx_uniform_soldier_bdu_nogloves_80_oli {}; }; }; class gm_xx_uniform_soldier_bdu_nogloves_80_oli: EGVAR(wardrobe,base) { class modifiableTo { - class gm_xx_uniform_soldier_bdu_80_oli; - class gm_xx_uniform_soldier_bdu_rolled_80_oli; + class gm_xx_uniform_soldier_bdu_80_oli {}; + class gm_xx_uniform_soldier_bdu_rolled_80_oli {}; }; }; diff --git a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Facewear.hpp b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Facewear.hpp index 7a50301d1f2..aa704d7bea4 100644 --- a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Facewear.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Facewear.hpp @@ -7,20 +7,20 @@ HELMET_MASK(vn_b_acc_ms22001_01,vn_b_acc_ms22001_02); // 2 Bandana Variants with same Aviators class vn_b_aviator: EGVAR(wardrobe,base) { class modifiableTo { - class vn_b_bandana_a; + class vn_b_bandana_a {}; }; components[] = {"vn_b_aviator"}; }; class vn_o_bandana_b: EGVAR(wardrobe,base) { class modifiableTo { - class vn_b_bandana_a; + class vn_b_bandana_a {}; }; components[] = {"vn_o_bandana_b"}; }; class vn_b_bandana_a: EGVAR(wardrobe,base) { class modifiableTo { - class vn_b_aviator; - class vn_o_bandana_b; + class vn_b_aviator {}; + class vn_o_bandana_b {}; }; components[] = {"vn_b_aviator", "vn_o_bandana_b"}; }; @@ -36,7 +36,7 @@ class vn_b_acc_goggles_01: EGVAR(wardrobe,base) { // Pilot Mask class vn_o_acc_km32_01: EGVAR(wardrobe,base) { class modifiableTo { - class vn_o_acc_goggles_03; + class vn_o_acc_goggles_03 {}; }; components[] = {"vn_o_acc_km32_01"}; }; @@ -49,7 +49,7 @@ class vn_o_acc_goggles_01: EGVAR(wardrobe,base) { // Goggles class vn_o_acc_goggles_02: EGVAR(wardrobe,base) { class modifiableTo { - class vn_o_acc_goggles_03; + class vn_o_acc_goggles_03 {}; }; components[] = {"vn_o_acc_goggles_02"}; }; @@ -57,8 +57,8 @@ class vn_o_acc_goggles_02: EGVAR(wardrobe,base) { // Goggles with Mask class vn_o_acc_goggles_03: EGVAR(wardrobe,base) { class modifiableTo { - class vn_o_acc_km32_01; - class vn_o_acc_goggles_02; + class vn_o_acc_km32_01 {}; + class vn_o_acc_goggles_02 {}; }; components[] = { "vn_o_acc_km32_01", "vn_o_acc_goggles_02"}; }; diff --git a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Helmets.hpp b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Helmets.hpp index 5c227d70e85..b7fb458d436 100644 --- a/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Helmets.hpp +++ b/addons/compat_sog/compat_sog_wardrobe/CfgWardrobe_Helmets.hpp @@ -58,25 +58,25 @@ HELMET_VISOR(vn_o_helmet_zsh3_01,vn_o_helmet_zsh3_02); // Helmets with/without Goggles class vn_b_helmet_m1_14_01: EGVAR(wardrobe,base_H_goggles_off) { class modifiableTo { - class vn_b_helmet_m1_20_01; + class vn_b_helmet_m1_20_01 {}; }; }; class vn_b_helmet_m1_14_02: EGVAR(wardrobe,base_H_goggles_off) { class modifiableTo { - class vn_b_helmet_m1_20_02; + class vn_b_helmet_m1_20_02 {}; }; }; class vn_b_helmet_m1_20_01: EGVAR(wardrobe,base_H_goggles_on) { class modifiableTo { - class vn_b_helmet_m1_14_01; + class vn_b_helmet_m1_14_01 {}; }; components[] = {"vn_b_acc_goggles_01"}; }; class vn_b_helmet_m1_20_02: EGVAR(wardrobe,base_H_goggles_on) { class modifiableTo { - class vn_b_helmet_m1_14_02; + class vn_b_helmet_m1_14_02 {}; }; components[] = {"vn_b_acc_goggles_01"}; }; @@ -86,14 +86,14 @@ class vn_b_helmet_m1_20_02: EGVAR(wardrobe,base_H_goggles_on) { // With Goggles class vn_o_helmet_shl61_01: EGVAR(wardrobe,base_H_goggles_on) { class modifiableTo { - class vn_o_helmet_shl61_02; + class vn_o_helmet_shl61_02 {}; }; components[] = {"vn_o_acc_goggles_02"}; }; // Without Goggles class vn_o_helmet_shl61_02: EGVAR(wardrobe,base_H_goggles_off) { class modifiableTo { - class vn_o_helmet_shl61_01; + class vn_o_helmet_shl61_01 {}; }; }; @@ -101,37 +101,37 @@ class vn_o_helmet_shl61_02: EGVAR(wardrobe,base_H_goggles_off) { // US Vic Crew Helmets class vn_b_helmet_t56_01_01: EGVAR(wardrobe,base_H_goggles_off) { class modifiableTo { - class vn_b_helmet_t56_02_01; + class vn_b_helmet_t56_02_01 {}; }; }; class vn_b_helmet_t56_02_01: EGVAR(wardrobe,base_H_goggles_on) { class modifiableTo { - class vn_b_helmet_t56_01_01; + class vn_b_helmet_t56_01_01 {}; }; components[] = {"vn_b_acc_goggles_01"}; }; class vn_b_helmet_t56_01_02: EGVAR(wardrobe,base_H_goggles_off) { class modifiableTo { - class vn_b_helmet_t56_02_02; + class vn_b_helmet_t56_02_02 {}; }; }; class vn_b_helmet_t56_02_02: EGVAR(wardrobe,base_H_goggles_on) { class modifiableTo { - class vn_b_helmet_t56_01_02; + class vn_b_helmet_t56_01_02 {}; }; components[] = {"vn_b_acc_goggles_01"}; }; class vn_b_helmet_t56_01_03: EGVAR(wardrobe,base_H_goggles_off) { class modifiableTo { - class vn_b_helmet_t56_02_03; + class vn_b_helmet_t56_02_03 {}; }; }; class vn_b_helmet_t56_02_03: EGVAR(wardrobe,base_H_goggles_on) { class modifiableTo { - class vn_b_helmet_t56_01_03; + class vn_b_helmet_t56_01_03 {}; }; components[] = {"vn_b_acc_goggles_01"}; }; @@ -141,26 +141,26 @@ class vn_b_helmet_t56_02_03: EGVAR(wardrobe,base_H_goggles_on) { // vn_o_acc_goggles_01 class vn_o_helmet_tsh3_01: EGVAR(wardrobe,base_H_goggles_on) { class modifiableTo { - class vn_o_helmet_tsh3_02; + class vn_o_helmet_tsh3_02 {}; }; components[] = {"vn_o_acc_goggles_01"}; }; class vn_o_helmet_tsh3_02: EGVAR(wardrobe,base_H_goggles_off) { class modifiableTo { - class vn_o_helmet_tsh3_01; + class vn_o_helmet_tsh3_01 {}; }; }; // VN Pith Helmet with Crew Goggles class vn_o_helmet_nva_01: EGVAR(wardrobe,base_H_goggles_off) { class modifiableTo { - class vn_o_helmet_nva_05; + class vn_o_helmet_nva_05 {}; }; }; -class ItemInfo; +class ItemInfo {}; class vn_o_helmet_nva_05: EGVAR(wardrobe,base_H_goggles_on) { class modifiableTo { - class vn_o_helmet_nva_01; + class vn_o_helmet_nva_01 {}; }; components[] = {"vn_o_acc_goggles_02"}; }; diff --git a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Headgear.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Headgear.hpp index 2db5b7926bb..498e31186c8 100644 --- a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Headgear.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Headgear.hpp @@ -1,12 +1,12 @@ // Cap (Ion) Forward and Reversed class lxWS_H_CapB_rvs_blk_ION: EGVAR(wardrobe,base) { class modifiableTo { - class H_Cap_headphones_ion_lxws; + class H_Cap_headphones_ion_lxws {}; }; }; class H_Cap_headphones_ion_lxws: EGVAR(wardrobe,base) { class modifiableTo { - class lxWS_H_CapB_rvs_blk_ION; + class lxWS_H_CapB_rvs_blk_ION {}; }; }; diff --git a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Turbans.hpp b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Turbans.hpp index b4b9e0d2dfc..a183fe4e38b 100644 --- a/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Turbans.hpp +++ b/addons/compat_ws/compat_ws_wardrobe/CfgWardrobe_Turbans.hpp @@ -83,7 +83,7 @@ class lxWS_H_turban_01_black: EGVAR(wardrobe,turban) { class CN(02,black); class CN(03,black); class CN(04,black); - class H_turban_02_mask_black_lxws; + class H_turban_02_mask_black_lxws {}; }; }; class lxWS_H_turban_02_black: EGVAR(wardrobe,turban) { @@ -91,7 +91,7 @@ class lxWS_H_turban_02_black: EGVAR(wardrobe,turban) { class CN(01,black); class CN(03,black); class CN(04,black); - class H_turban_02_mask_black_lxws; + class H_turban_02_mask_black_lxws {}; }; }; class lxWS_H_turban_03_black: EGVAR(wardrobe,turban) { @@ -99,7 +99,7 @@ class lxWS_H_turban_03_black: EGVAR(wardrobe,turban) { class CN(01,black); class CN(02,black); class CN(04,black); - class H_turban_02_mask_black_lxws; + class H_turban_02_mask_black_lxws {}; }; }; class lxWS_H_turban_04_black: EGVAR(wardrobe,turban) { @@ -107,7 +107,7 @@ class lxWS_H_turban_04_black: EGVAR(wardrobe,turban) { class CN(01,black); class CN(02,black); class CN(03,black); - class H_turban_02_mask_black_lxws; + class H_turban_02_mask_black_lxws {}; }; }; @@ -118,7 +118,7 @@ class H_turban_02_mask_snake_lxws: EGVAR(wardrobe,turban) { class CN(02,sand); class CN(03,sand); class CN(04,sand); - class H_turban_02_mask_hex_lxws; + class H_turban_02_mask_hex_lxws {}; }; components[] = {"H_bmask_snake_lxws"}; }; @@ -128,7 +128,7 @@ class H_turban_02_mask_hex_lxws: EGVAR(wardrobe,turban) { class CN(02,sand); class CN(03,sand); class CN(04,sand); - class H_turban_02_mask_snake_lxws; + class H_turban_02_mask_snake_lxws {}; }; components[] = {"lxWS_H_bmask_hex"}; }; @@ -137,8 +137,8 @@ class lxWS_H_turban_01_sand: EGVAR(wardrobe,turban) { class CN(02,sand); class CN(03,sand); class CN(04,sand); - class H_turban_02_mask_snake_lxws; - class H_turban_02_mask_hex_lxws; + class H_turban_02_mask_snake_lxws {}; + class H_turban_02_mask_hex_lxws {}; }; }; class lxWS_H_turban_02_sand: EGVAR(wardrobe,turban) { @@ -146,8 +146,8 @@ class lxWS_H_turban_02_sand: EGVAR(wardrobe,turban) { class CN(01,sand); class CN(03,sand); class CN(04,sand); - class H_turban_02_mask_snake_lxws; - class H_turban_02_mask_hex_lxws; + class H_turban_02_mask_snake_lxws {}; + class H_turban_02_mask_hex_lxws {}; }; }; class lxWS_H_turban_03_sand: EGVAR(wardrobe,turban) { @@ -155,8 +155,8 @@ class lxWS_H_turban_03_sand: EGVAR(wardrobe,turban) { class CN(01,sand); class CN(02,sand); class CN(04,sand); - class H_turban_02_mask_snake_lxws; - class H_turban_02_mask_hex_lxws; + class H_turban_02_mask_snake_lxws {}; + class H_turban_02_mask_hex_lxws {}; }; }; class lxWS_H_turban_04_sand: EGVAR(wardrobe,turban) { @@ -164,7 +164,7 @@ class lxWS_H_turban_04_sand: EGVAR(wardrobe,turban) { class CN(01,sand); class CN(02,sand); class CN(03,sand); - class H_turban_02_mask_snake_lxws; - class H_turban_02_mask_hex_lxws; + class H_turban_02_mask_snake_lxws {}; + class H_turban_02_mask_hex_lxws {}; }; }; diff --git a/addons/wardrobe/Facewear.hpp b/addons/wardrobe/Facewear.hpp index 62a19894971..9691f87e6ae 100644 --- a/addons/wardrobe/Facewear.hpp +++ b/addons/wardrobe/Facewear.hpp @@ -1,27 +1,27 @@ // Common Components class G_Lowprofile: EGVAR(wardrobe,base) { class modifiableTo { - class G_Balaclava_lowprofile; + class G_Balaclava_lowprofile {}; }; components[] = { "G_Lowprofile" }; }; class G_Combat: EGVAR(wardrobe,base) { class modifiableTo { - class G_Balaclava_combat; - class G_Balaclava_TI_G_blk_F; - class G_Balaclava_TI_G_tna_F; + class G_Balaclava_combat {}; + class G_Balaclava_TI_G_blk_F {}; + class G_Balaclava_TI_G_tna_F {}; }; components[] = { "G_Combat" }; }; class G_Aviator: EGVAR(wardrobe,base) { class modifiableTo { - class G_Bandanna_aviator; + class G_Bandanna_aviator {}; }; components[] = { "G_Aviator" }; }; class G_Shades_Black: EGVAR(wardrobe,base) { class modifiableTo { - class G_Bandanna_shades; + class G_Bandanna_shades {}; }; components[] = { "G_Shades_Black" }; }; @@ -30,20 +30,20 @@ class G_Shades_Black: EGVAR(wardrobe,base) { // Balaclava, black class G_Balaclava_blk: EGVAR(wardrobe,base) { class modifiableTo { - class G_Balaclava_lowprofile; - class G_Balaclava_combat; + class G_Balaclava_lowprofile {}; + class G_Balaclava_combat {}; }; components[] = { "G_Balaclava_blk" }; }; class G_Balaclava_combat: EGVAR(wardrobe,base) { class modifiableTo { - class G_Balaclava_blk; + class G_Balaclava_blk {}; }; components[] = { "G_Balaclava_blk", "G_Combat" }; }; class G_Balaclava_lowprofile: EGVAR(wardrobe,base) { class modifiableTo { - class G_Balaclava_blk; + class G_Balaclava_blk {}; }; components[] = { "G_Balaclava_blk", "G_Lowprofile" }; }; @@ -52,13 +52,13 @@ class G_Balaclava_lowprofile: EGVAR(wardrobe,base) { // Stealth Balaclava, black class G_Balaclava_TI_blk_F: EGVAR(wardrobe,base) { class modifiableTo { - class G_Balaclava_TI_G_blk_F; + class G_Balaclava_TI_G_blk_F {}; }; components[] = { "G_Balaclava_TI_blk_F" }; }; class G_Balaclava_TI_G_blk_F: EGVAR(wardrobe,base) { class modifiableTo { - class G_Balaclava_TI_blk_F; + class G_Balaclava_TI_blk_F {}; }; components[] = { "G_Balaclava_TI_blk_F", "G_Combat" }; }; @@ -67,13 +67,13 @@ class G_Balaclava_TI_G_blk_F: EGVAR(wardrobe,base) { // Stealth Balaclava, green(tanoa) class G_Balaclava_TI_tna_F: EGVAR(wardrobe,base) { class modifiableTo { - class G_Balaclava_TI_G_tna_F; + class G_Balaclava_TI_G_tna_F {}; }; components[] = { "G_Balaclava_TI_tna_F" }; }; class G_Balaclava_TI_G_tna_F: EGVAR(wardrobe,base) { class modifiableTo { - class G_Balaclava_TI_tna_F; + class G_Balaclava_TI_tna_F {}; }; components[] = { "G_Balaclava_TI_tna_F", "G_Combat" }; }; @@ -82,9 +82,9 @@ class G_Balaclava_TI_G_tna_F: EGVAR(wardrobe,base) { // Bandana, Black class G_Bandanna_blk: EGVAR(wardrobe,base) { class modifiableTo { - class G_Bandanna_aviator; - class G_Bandanna_sport; - class G_Bandanna_shades; + class G_Bandanna_aviator {}; + class G_Bandanna_sport {}; + class G_Bandanna_shades {}; }; components[] = { "G_Bandanna_blk" }; }; @@ -92,22 +92,22 @@ class G_Bandanna_blk: EGVAR(wardrobe,base) { class G_Bandanna_shades: EGVAR(wardrobe,base) { class modifiableTo { - class G_Bandanna_blk; - class G_Shades_Black; + class G_Bandanna_blk {}; + class G_Shades_Black {}; }; components[] = { "G_Bandanna_blk", "G_Shades_Black" }; }; class G_Bandanna_sport: EGVAR(wardrobe,base) { class modifiableTo { - class G_Bandanna_blk; - class G_Sport_Blackred; + class G_Bandanna_blk {}; + class G_Sport_Blackred {}; }; components[] = { "G_Bandanna_blk", "G_Sport_Blackred"}; }; class G_Bandanna_aviator: EGVAR(wardrobe,base) { class modifiableTo { - class G_Bandanna_blk; - class G_Aviator; + class G_Bandanna_blk {}; + class G_Aviator {}; }; components[] = { "G_Bandanna_blk", "G_Aviator" }; }; @@ -116,22 +116,22 @@ class G_Bandanna_aviator: EGVAR(wardrobe,base) { // Eye Protector class G_EyeProtectors_F: EGVAR(wardrobe,base) { class modifiableTo { - class G_EyeProtectors_Earpiece_F; + class G_EyeProtectors_Earpiece_F {}; }; components[] = { "G_EyeProtectors_F" }; }; class G_EyeProtectors_Earpiece_F: EGVAR(wardrobe,base) { class modifiableTo { - class G_EyeProtectors_F; - class G_WirelessEarpiece_F; + class G_EyeProtectors_F {}; + class G_WirelessEarpiece_F {}; }; components[] = { "G_EyeProtectors_F", "G_WirelessEarpiece_F" }; }; class G_WirelessEarpiece_F: EGVAR(wardrobe,base) { class modifiableTo { - class G_EyeProtectors_Earpiece_F; + class G_EyeProtectors_Earpiece_F {}; }; components[] = { "G_WirelessEarpiece_F" }; }; diff --git a/addons/wardrobe/script_macros_wardrobe.hpp b/addons/wardrobe/script_macros_wardrobe.hpp index 5998526b3c9..9d389ddc78e 100644 --- a/addons/wardrobe/script_macros_wardrobe.hpp +++ b/addons/wardrobe/script_macros_wardrobe.hpp @@ -37,45 +37,45 @@ class ItemInfo: ItemInfo {\ #define BASIC(variant1,variant2,base1,base2)\ class variant1: base1 {\ class modifiableTo {\ - class variant2;\ + class variant2 {};\ };\ };\ class variant2: base2 {\ class modifiableTo {\ - class variant1;\ + class variant1 {};\ };\ } #define BASIC_COMPONENT(variantWith,variantWithout,baseWith,baseWithout,component)\ class variantWith: baseWith {\ class modifiableTo {\ - class variantWithout;\ + class variantWithout {};\ };\ components[] = {QUOTE(component)};\ };\ class variantWithout: baseWithout {\ class modifiableTo {\ - class variantWith;\ + class variantWith {};\ };\ } #define BASIC_COMBO(Combo,ComboBase,Variant1,Variant1Base,Variant2,Variant2Base)\ class Combo: ComboBase {\ class modifiableTo {\ - class Variant1;\ - class Variant2;\ + class Variant1 {};\ + class Variant2 {};\ };\ components[] = { QUOTE(Variant1), QUOTE(Variant2) };\ };\ class Variant1: Variant1Base {\ class modifiableTo {\ - class Combo;\ + class Combo {};\ };\ components[] = { QUOTE(Variant1) };\ };\ class Variant2: Variant2Base {\ class modifiableTo {\ - class Combo;\ + class Combo {};\ };\ components[] = { QUOTE(Variant2) };\ } diff --git a/docs/wiki/framework/wardrobe-framework.md b/docs/wiki/framework/wardrobe-framework.md index af12021f5fa..7a5c90c11bf 100644 --- a/docs/wiki/framework/wardrobe-framework.md +++ b/docs/wiki/framework/wardrobe-framework.md @@ -177,14 +177,14 @@ class ace_wardrobe { class U_B_CTRG_1: ace_wardrobe_base_U_sleeves_down { components[] = {}; class modifiableTo { - class U_B_CTRG_3; + class U_B_CTRG_3 {}; }; }; class U_B_CTRG_3: ace_wardrobe_base_U_sleeves_up { components[] = {}; class modifiableTo { - class U_B_CTRG_1; + class U_B_CTRG_1 {}; }; }; }; @@ -197,7 +197,7 @@ class ace_wardrobe { class G_Balaclava: ace_wardrobe_base { class modifiableTo { - class G_Balaclava_lowprofile; + class G_Balaclava_lowprofile {}; }; components[] = {}; }; @@ -208,7 +208,7 @@ class ace_wardrobe { class G_Balaclava_lowprofile: ace_wardrobe_base { class modifiableTo { - class G_Balaclava; + class G_Balaclava {}; }; components[] = { "G_Lowprofile" }; }; @@ -221,15 +221,15 @@ class ace_wardrobe { class G_Bandanna_blk: ace_wardrobe_base { class modifiableTo { - class G_Bandanna_aviator; - class G_Aviator; + class G_Bandanna_aviator {}; + class G_Aviator {}; }; components[] = {"G_Bandanna_blk"}; }; class G_Aviator: ace_wardrobe_base { class modifiableTo { - class G_Bandanna_aviator; + class G_Bandanna_aviator {}; }; components[] = { "G_Aviator" }; @@ -237,8 +237,8 @@ class ace_wardrobe { class G_Bandanna_aviator: ace_wardrobe_base { class modifiableTo { - class G_Bandanna_blk; - class G_Aviator; + class G_Bandanna_blk {}; + class G_Aviator {}; }; components[] = { "G_Aviator", "G_Bandanna_blk" }; }; From 9aec18719a9e5444fa45a743a15a95e9dac42958 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 10 Jun 2025 15:44:13 +0200 Subject: [PATCH 304/305] rename files to common pattern --- addons/wardrobe/CfgWardrobe.hpp | 6 +++--- .../{BaseClasses.hpp => CfgWardrobe_BaseClasses.hpp} | 0 addons/wardrobe/{Facewear.hpp => CfgWardrobe_Facewear.hpp} | 0 addons/wardrobe/{Uniforms.hpp => CfgWardrobe_Uniforms.hpp} | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename addons/wardrobe/{BaseClasses.hpp => CfgWardrobe_BaseClasses.hpp} (100%) rename addons/wardrobe/{Facewear.hpp => CfgWardrobe_Facewear.hpp} (100%) rename addons/wardrobe/{Uniforms.hpp => CfgWardrobe_Uniforms.hpp} (100%) diff --git a/addons/wardrobe/CfgWardrobe.hpp b/addons/wardrobe/CfgWardrobe.hpp index fc56b8dfcb9..d894695a38d 100644 --- a/addons/wardrobe/CfgWardrobe.hpp +++ b/addons/wardrobe/CfgWardrobe.hpp @@ -1,5 +1,5 @@ class ADDON { - #include "BaseClasses.hpp" - #include "Uniforms.hpp" - #include "Facewear.hpp" + #include "CfgWardrobe_BaseClasses.hpp" + #include "CfgWardrobe_Uniforms.hpp" + #include "CfgWardrobe_Facewear.hpp" }; diff --git a/addons/wardrobe/BaseClasses.hpp b/addons/wardrobe/CfgWardrobe_BaseClasses.hpp similarity index 100% rename from addons/wardrobe/BaseClasses.hpp rename to addons/wardrobe/CfgWardrobe_BaseClasses.hpp diff --git a/addons/wardrobe/Facewear.hpp b/addons/wardrobe/CfgWardrobe_Facewear.hpp similarity index 100% rename from addons/wardrobe/Facewear.hpp rename to addons/wardrobe/CfgWardrobe_Facewear.hpp diff --git a/addons/wardrobe/Uniforms.hpp b/addons/wardrobe/CfgWardrobe_Uniforms.hpp similarity index 100% rename from addons/wardrobe/Uniforms.hpp rename to addons/wardrobe/CfgWardrobe_Uniforms.hpp From cab8d83ed95f3fd2cd75df2e8945acec9743f5a1 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 10 Jun 2025 15:54:59 +0200 Subject: [PATCH 305/305] add {} --- .../CfgWardrobe_Headgear.hpp | 30 +- .../CfgWardrobe_Uniforms.hpp | 360 +++++++++--------- 2 files changed, 195 insertions(+), 195 deletions(-) diff --git a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Headgear.hpp b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Headgear.hpp index 0da029d54d5..659865e4eb6 100644 --- a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Headgear.hpp +++ b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Headgear.hpp @@ -2,19 +2,19 @@ #define CUP_HELMET_2_ESS(HelmetBase,HelmetGoggles1,HelmetGoggles2,Goggles)\ class HelmetBase : EGVAR(wardrobe,base) {\ class modifiableTo {\ - class HelmetGoggles1;\ - class HelmetGoggles2;\ + class HelmetGoggles1 {};\ + class HelmetGoggles2 {};\ };\ };\ class HelmetGoggles1 : EGVAR(wardrobe,base) {\ class modifiableTo {\ - class HelmetBase;\ + class HelmetBase {};\ };\ components[] = {QUOTE(Goggles)};\ };\ class HelmetGoggles2 : EGVAR(wardrobe,base) {\ class modifiableTo {\ - class HelmetBase;\ + class HelmetBase {};\ };\ components[] = {QUOTE(Goggles)};\ } @@ -23,7 +23,7 @@ class HelmetGoggles2 : EGVAR(wardrobe,base) {\ CUP_HELMET_2_ESS(HelmetBase,HelmetGoggles1,HelmetGoggles2,Goggles);\ class HelmetGoggles3 : EGVAR(wardrobe,base) {\ class modifiableTo {\ - class HelmetBase;\ + class HelmetBase {};\ };\ components[] = {QUOTE(Goggles)};\ } @@ -31,26 +31,26 @@ class HelmetGoggles3 : EGVAR(wardrobe,base) {\ #define CUP_BAF_MK6(HelmetBase,HelmetGlasses,HelmetGoggles,HelmetNetting,Glasses,Goggles)\ class HelmetBase : EGVAR(wardrobe,base_H_goggles_off) {\ class modifiableTo {\ - class HelmetGlasses;\ - class HelmetGoggles;\ + class HelmetGlasses {};\ + class HelmetGoggles {};\ };\ };\ class HelmetGlasses : EGVAR(wardrobe,base) {\ class modifiableTo {\ - class HelmetBase;\ - class HelmetNetting;\ + class HelmetBase {};\ + class HelmetNetting {};\ };\ components[] = {QUOTE(Glasses)};\ };\ class HelmetGoggles : EGVAR(wardrobe,base_H_goggles_on) {\ class modifiableTo {\ - class HelmetBase;\ + class HelmetBase {};\ };\ components[] = {QUOTE(Goggles)};\ };\ class HelmetNetting : EGVAR(wardrobe,base) {\ class modifiableTo {\ - class HelmetGlasses;\ + class HelmetGlasses {};\ };\ components[] = {};\ } @@ -130,18 +130,18 @@ CUP_BAF_MK6(CUP_H_BAF_DPM_Mk6_EMPTY_PRR,CUP_H_BAF_DPM_Mk6_GLASS_PRR,CUP_H_BAF_DP // MK7 MTP class CUP_H_BAF_MTP_Mk7 : EGVAR(wardrobe,base) { class modifiableTo { - class CUP_H_BAF_MTP_Mk7_PRR_SCRIM_B; - class CUP_H_BAF_MTP_Mk7_PRR_SCRIM_A; + class CUP_H_BAF_MTP_Mk7_PRR_SCRIM_B {}; + class CUP_H_BAF_MTP_Mk7_PRR_SCRIM_A {}; }; }; class CUP_H_BAF_MTP_Mk7_PRR_SCRIM_A : EGVAR(wardrobe,base) { class modifiableTo { - class CUP_H_BAF_MTP_Mk7; + class CUP_H_BAF_MTP_Mk7 {}; }; }; class CUP_H_BAF_MTP_Mk7_PRR_SCRIM_B : EGVAR(wardrobe,base) { class modifiableTo { - class CUP_H_BAF_MTP_Mk7; + class CUP_H_BAF_MTP_Mk7 {}; }; }; diff --git a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Uniforms.hpp b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Uniforms.hpp index 0992d9fa475..d6e1f837dc3 100644 --- a/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Uniforms.hpp +++ b/addons/compat_cup_units/compat_cup_wardrobe/CfgWardrobe_Uniforms.hpp @@ -2,36 +2,36 @@ #define CUP_UNIFORM_TSHIRT(tshirtBase,tshirtGloves,tshirtKnee)\ class tshirtBase : EGVAR(wardrobe,base) {\ class modifiableTo {\ - class tshirtGloves;\ - class tshirtKnee;\ + class tshirtGloves {};\ + class tshirtKnee {};\ };\ };\ class tshirtGloves : EGVAR(wardrobe,base) {\ class modifiableTo {\ - class tshirtBase;\ + class tshirtBase {};\ };\ };\ class tshirtKnee : EGVAR(wardrobe,base) {\ class modifiableTo {\ - class tshirtBase;\ + class tshirtBase {};\ };\ } #define CUP_UNIFORM_3(uniformBase,uniformVariant1,uniformVariant2)\ class uniformBase : EGVAR(wardrobe,base) {\ class modifiableTo {\ - class uniformVariant1;\ - class uniformVariant2;\ + class uniformVariant1 {};\ + class uniformVariant2 {};\ };\ };\ class uniformVariant1 : EGVAR(wardrobe,base) {\ class modifiableTo {\ - class uniformBase;\ + class uniformBase {};\ };\ };\ class uniformVariant2 : EGVAR(wardrobe,base) {\ class modifiableTo {\ - class uniformBase;\ + class uniformBase {};\ };\ } @@ -39,110 +39,110 @@ class uniformVariant2 : EGVAR(wardrobe,base) {\ CUP_UNIFORM_3(uniformBase,uniformVariant1,uniformVariant2);\ class uniformVariant3 : EGVAR(wardrobe,base) {\ class modifiableTo {\ - class uniformBase;\ + class uniformBase {};\ };\ } #define CUP_UNIFORM_BAF(uniformBase,uniformGLoves,uniformKneepad,uniformGlovesKneepad,uniformRolled,uniformRolledGloves,uniformRolledKneepad)\ class uniformBase: EGVAR(wardrobe,base) {\ class modifiableTo {\ - class uniformGLoves;\ - class uniformKneepad;\ - class uniformRolled;\ + class uniformGLoves {};\ + class uniformKneepad {};\ + class uniformRolled {};\ };\ };\ class uniformGLoves: EGVAR(wardrobe,base) {\ class modifiableTo {\ - class uniformGlovesKneepad;\ - class uniformRolledGloves;\ - class uniformBase;\ + class uniformGlovesKneepad {};\ + class uniformRolledGloves {};\ + class uniformBase {};\ };\ };\ class uniformKneepad: EGVAR(wardrobe,base) {\ class modifiableTo {\ - class uniformGlovesKneepad;\ - class uniformRolledKneepad;\ - class uniformBase;\ + class uniformGlovesKneepad {};\ + class uniformRolledKneepad {};\ + class uniformBase {};\ };\ };\ class uniformGlovesKneepad: EGVAR(wardrobe,base) {\ class modifiableTo {\ - class uniformGLoves;\ - class uniformKneepad;\ + class uniformGLoves {};\ + class uniformKneepad {};\ };\ };\ class uniformRolled: EGVAR(wardrobe,base) {\ class modifiableTo {\ - class uniformBase;\ - class uniformRolledGloves;\ - class uniformRolledKneepad;\ + class uniformBase {};\ + class uniformRolledGloves {};\ + class uniformRolledKneepad {};\ };\ };\ class uniformRolledKneepad: EGVAR(wardrobe,base) {\ class modifiableTo {\ - class uniformRolled;\ - class uniformKneepad;\ + class uniformRolled {};\ + class uniformKneepad {};\ };\ };\ class uniformRolledGloves: EGVAR(wardrobe,base) {\ class modifiableTo {\ - class uniformRolled;\ - class uniformGLoves;\ + class uniformRolled {};\ + class uniformGLoves {};\ };\ } #define CUP_UNIFORM_GLOVES_KNEEPAD_ROLLED(uniformBase,uniformGLoves,uniformKneepad,uniformGlovesKneepad,uniformRolled,uniformRolledGloves,uniformRolledKneepad,uniformRolledGlovesKneepad)\ class uniformBase: EGVAR(wardrobe,base) {\ class modifiableTo {\ - class uniformGLoves;\ - class uniformKneepad;\ - class uniformRolled;\ + class uniformGLoves {};\ + class uniformKneepad {};\ + class uniformRolled {};\ };\ };\ class uniformGLoves: EGVAR(wardrobe,base) {\ class modifiableTo {\ - class uniformGlovesKneepad;\ - class uniformRolledGloves;\ - class uniformBase;\ + class uniformGlovesKneepad {};\ + class uniformRolledGloves {};\ + class uniformBase {};\ };\ };\ class uniformKneepad: EGVAR(wardrobe,base) {\ class modifiableTo {\ - class uniformGlovesKneepad;\ - class uniformRolledKneepad;\ - class uniformBase;\ + class uniformGlovesKneepad {};\ + class uniformRolledKneepad {};\ + class uniformBase {};\ };\ };\ class uniformGlovesKneepad: EGVAR(wardrobe,base) {\ class modifiableTo {\ - class uniformGLoves;\ - class uniformKneepad;\ - class uniformRolledGlovesKneepad;\ + class uniformGLoves {};\ + class uniformKneepad {};\ + class uniformRolledGlovesKneepad {};\ };\ };\ class uniformRolled: EGVAR(wardrobe,base) {\ class modifiableTo {\ - class uniformRolledGloves;\ - class uniformRolledKneepad;\ - class uniformBase;\ + class uniformRolledGloves {};\ + class uniformRolledKneepad {};\ + class uniformBase {};\ };\ };\ class uniformRolledGloves: EGVAR(wardrobe,base) {\ class modifiableTo {\ - class uniformRolled;\ - class uniformRolledGlovesKneepad;\ + class uniformRolled {};\ + class uniformRolledGlovesKneepad {};\ };\ };\ class uniformRolledKneepad: EGVAR(wardrobe,base) {\ class modifiableTo {\ - class uniformRolled;\ - class uniformRolledGlovesKneepad;\ + class uniformRolled {};\ + class uniformRolledGlovesKneepad {};\ };\ };\ class uniformRolledGlovesKneepad: EGVAR(wardrobe,base) {\ class modifiableTo {\ - class uniformRolledKneepad;\ - class uniformRolledGloves;\ + class uniformRolledKneepad {};\ + class uniformRolledGloves {};\ };\ } @@ -170,24 +170,24 @@ UNIFORM_SLEEVES(CUP_U_O_RUS_M88_VDV,CUP_U_O_RUS_M88_VDV_rolled_up); class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_1: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_2; - class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_3; - class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_4; + class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_2 {}; + class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_3 {}; + class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_4 {}; }; }; class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_2: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_1; + class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_1 {}; }; }; class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_3: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_1; + class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_1 {}; }; }; class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_4: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_1; + class CUP_U_O_RUS_Soldier_Masking_Suit_6Sh119_Winter_1 {}; }; }; @@ -209,160 +209,160 @@ UNIFORM_SLEEVES(CUP_U_O_RUS_VSR98_MSV,CUP_U_O_RUS_VSR98_MSV_rolled_up); // ToDo MACRO class CUP_U_O_RUS_Soldier_VKPO_Desert_1: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Desert_2; - class CUP_U_O_RUS_Soldier_VKPO_Desert_3; - class CUP_U_O_RUS_Soldier_VKPO_Desert_4; - class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_1; + class CUP_U_O_RUS_Soldier_VKPO_Desert_2 {}; + class CUP_U_O_RUS_Soldier_VKPO_Desert_3 {}; + class CUP_U_O_RUS_Soldier_VKPO_Desert_4 {}; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_1 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Desert_2: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Desert_1; - class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_2; + class CUP_U_O_RUS_Soldier_VKPO_Desert_1 {}; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_2 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Desert_3: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Desert_1; - class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_3; + class CUP_U_O_RUS_Soldier_VKPO_Desert_1 {}; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_3 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Desert_4: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Desert_1; - class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_4; + class CUP_U_O_RUS_Soldier_VKPO_Desert_1 {}; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_4 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_1: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Desert_1; - class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_2; - class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_3; - class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_4; + class CUP_U_O_RUS_Soldier_VKPO_Desert_1 {}; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_2 {}; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_3 {}; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_4 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_2: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Desert_1; - class CUP_U_O_RUS_Soldier_VKPO_Desert_2; + class CUP_U_O_RUS_Soldier_VKPO_Desert_1 {}; + class CUP_U_O_RUS_Soldier_VKPO_Desert_2 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_3: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Desert_1; - class CUP_U_O_RUS_Soldier_VKPO_Desert_3; + class CUP_U_O_RUS_Soldier_VKPO_Desert_1 {}; + class CUP_U_O_RUS_Soldier_VKPO_Desert_3 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Rolled_Desert_4: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Desert_1; - class CUP_U_O_RUS_Soldier_VKPO_Desert_4; + class CUP_U_O_RUS_Soldier_VKPO_Desert_1 {}; + class CUP_U_O_RUS_Soldier_VKPO_Desert_4 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Summer_1: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Summer_2; - class CUP_U_O_RUS_Soldier_VKPO_Summer_3; - class CUP_U_O_RUS_Soldier_VKPO_Summer_4; - class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_1; + class CUP_U_O_RUS_Soldier_VKPO_Summer_2 {}; + class CUP_U_O_RUS_Soldier_VKPO_Summer_3 {}; + class CUP_U_O_RUS_Soldier_VKPO_Summer_4 {}; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_1 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Summer_2: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Summer_1; - class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_2; + class CUP_U_O_RUS_Soldier_VKPO_Summer_1 {}; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_2 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Summer_3: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Summer_1; - class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_3; + class CUP_U_O_RUS_Soldier_VKPO_Summer_1 {}; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_3 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Summer_4: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Summer_1; - class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_4; + class CUP_U_O_RUS_Soldier_VKPO_Summer_1 {}; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_4 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_1: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Summer_1; - class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_2; - class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_3; - class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_4; + class CUP_U_O_RUS_Soldier_VKPO_Summer_1 {}; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_2 {}; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_3 {}; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_4 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_2: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Summer_1; - class CUP_U_O_RUS_Soldier_VKPO_Summer_2; + class CUP_U_O_RUS_Soldier_VKPO_Summer_1 {}; + class CUP_U_O_RUS_Soldier_VKPO_Summer_2 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_3: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Summer_1; - class CUP_U_O_RUS_Soldier_VKPO_Summer_3; + class CUP_U_O_RUS_Soldier_VKPO_Summer_1 {}; + class CUP_U_O_RUS_Soldier_VKPO_Summer_3 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Rolled_Summer_4: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Summer_1; - class CUP_U_O_RUS_Soldier_VKPO_Summer_4; + class CUP_U_O_RUS_Soldier_VKPO_Summer_1 {}; + class CUP_U_O_RUS_Soldier_VKPO_Summer_4 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Winter_1: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Winter_2; - class CUP_U_O_RUS_Soldier_VKPO_Winter_3; - class CUP_U_O_RUS_Soldier_VKPO_Winter_4; - class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_1; + class CUP_U_O_RUS_Soldier_VKPO_Winter_2 {}; + class CUP_U_O_RUS_Soldier_VKPO_Winter_3 {}; + class CUP_U_O_RUS_Soldier_VKPO_Winter_4 {}; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_1 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Winter_2: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Winter_1; - class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_2; + class CUP_U_O_RUS_Soldier_VKPO_Winter_1 {}; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_2 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Winter_3: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Winter_1; - class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_3; + class CUP_U_O_RUS_Soldier_VKPO_Winter_1 {}; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_3 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Winter_4: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Winter_1; - class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_4; + class CUP_U_O_RUS_Soldier_VKPO_Winter_1 {}; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_4 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_1: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Winter_1; - class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_2; - class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_3; - class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_4; + class CUP_U_O_RUS_Soldier_VKPO_Winter_1 {}; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_2 {}; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_3 {}; + class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_4 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_2: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Winter_1; - class CUP_U_O_RUS_Soldier_VKPO_Winter_2; + class CUP_U_O_RUS_Soldier_VKPO_Winter_1 {}; + class CUP_U_O_RUS_Soldier_VKPO_Winter_2 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_3: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Winter_1; - class CUP_U_O_RUS_Soldier_VKPO_Winter_3; + class CUP_U_O_RUS_Soldier_VKPO_Winter_1 {}; + class CUP_U_O_RUS_Soldier_VKPO_Winter_3 {}; }; }; class CUP_U_O_RUS_Soldier_VKPO_Rolled_Winter_4: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_O_RUS_Soldier_VKPO_Winter_1; - class CUP_U_O_RUS_Soldier_VKPO_Winter_4; + class CUP_U_O_RUS_Soldier_VKPO_Winter_1 {}; + class CUP_U_O_RUS_Soldier_VKPO_Winter_4 {}; }; }; @@ -441,148 +441,148 @@ CUP_UNIFORM_GLOVES_KNEEPAD_ROLLED(CUP_U_B_USArmy_ACU_UCP,CUP_U_B_USArmy_ACU_Glov // USMC class CUP_U_B_USMC_MCCUU: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_B_USMC_MCCUU_gloves; - class CUP_U_B_USMC_MCCUU_pads; - class CUP_U_B_USMC_MCCUU_roll; + class CUP_U_B_USMC_MCCUU_gloves {}; + class CUP_U_B_USMC_MCCUU_pads {}; + class CUP_U_B_USMC_MCCUU_roll {}; }; }; class CUP_U_B_USMC_MCCUU_gloves: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_B_USMC_MCCUU_roll_gloves; - class CUP_U_B_USMC_MCCUU_pads_gloves; - class CUP_U_B_USMC_MCCUU; + class CUP_U_B_USMC_MCCUU_roll_gloves {}; + class CUP_U_B_USMC_MCCUU_pads_gloves {}; + class CUP_U_B_USMC_MCCUU {}; }; }; class CUP_U_B_USMC_MCCUU_pads_gloves: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_B_USMC_MCCUU_roll_pads; - class CUP_U_B_USMC_MCCUU_pads_gloves; - class CUP_U_B_USMC_MCCUU; + class CUP_U_B_USMC_MCCUU_roll_pads {}; + class CUP_U_B_USMC_MCCUU_pads_gloves {}; + class CUP_U_B_USMC_MCCUU {}; }; }; class CUP_U_B_USMC_MCCUU_roll: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_B_USMC_MCCUU_roll_2; - class CUP_U_B_USMC_MCCUU_roll_gloves; - class CUP_U_B_USMC_MCCUU_roll_pads; - class CUP_U_B_USMC_MCCUU; + class CUP_U_B_USMC_MCCUU_roll_2 {}; + class CUP_U_B_USMC_MCCUU_roll_gloves {}; + class CUP_U_B_USMC_MCCUU_roll_pads {}; + class CUP_U_B_USMC_MCCUU {}; }; }; class CUP_U_B_USMC_MCCUU_roll_gloves: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_B_USMC_MCCUU_roll_2_gloves; - class CUP_U_B_USMC_MCCUU_gloves; - class CUP_U_B_USMC_MCCUU_roll_pads_gloves; - class CUP_U_B_USMC_MCCUU_roll; + class CUP_U_B_USMC_MCCUU_roll_2_gloves {}; + class CUP_U_B_USMC_MCCUU_gloves {}; + class CUP_U_B_USMC_MCCUU_roll_pads_gloves {}; + class CUP_U_B_USMC_MCCUU_roll {}; }; }; class CUP_U_B_USMC_MCCUU_roll_pads: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_B_USMC_MCCUU_roll_2_pads; - class CUP_U_B_USMC_MCCUU_pads; - class CUP_U_B_USMC_MCCUU_roll_pads_gloves; - class CUP_U_B_USMC_MCCUU_roll; + class CUP_U_B_USMC_MCCUU_roll_2_pads {}; + class CUP_U_B_USMC_MCCUU_pads {}; + class CUP_U_B_USMC_MCCUU_roll_pads_gloves {}; + class CUP_U_B_USMC_MCCUU_roll {}; }; }; class CUP_U_B_USMC_MCCUU_roll_2: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_B_USMC_MCCUU_roll_2_gloves; - class CUP_U_B_USMC_MCCUU_roll_2_pads; - class CUP_U_B_USMC_MCCUU_roll; + class CUP_U_B_USMC_MCCUU_roll_2_gloves {}; + class CUP_U_B_USMC_MCCUU_roll_2_pads {}; + class CUP_U_B_USMC_MCCUU_roll {}; }; }; class CUP_U_B_USMC_MCCUU_roll_2_gloves: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_B_USMC_MCCUU_roll_2; - class CUP_U_B_USMC_MCCUU_roll_2_pads_gloves; - class CUP_U_B_USMC_MCCUU_roll_gloves; + class CUP_U_B_USMC_MCCUU_roll_2 {}; + class CUP_U_B_USMC_MCCUU_roll_2_pads_gloves {}; + class CUP_U_B_USMC_MCCUU_roll_gloves {}; }; }; class CUP_U_B_USMC_MCCUU_roll_2_pads: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_B_USMC_MCCUU_roll_2; - class CUP_U_B_USMC_MCCUU_roll_2_pads_gloves; - class CUP_U_B_USMC_MCCUU_roll_pads; + class CUP_U_B_USMC_MCCUU_roll_2 {}; + class CUP_U_B_USMC_MCCUU_roll_2_pads_gloves {}; + class CUP_U_B_USMC_MCCUU_roll_pads {}; }; }; class CUP_U_B_USMC_MCCUU_roll_2_pads_gloves: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_B_USMC_MCCUU_roll_2_pads; - class CUP_U_B_USMC_MCCUU_roll_2_gloves; - class CUP_U_B_USMC_MCCUU_roll_pads_gloves; + class CUP_U_B_USMC_MCCUU_roll_2_pads {}; + class CUP_U_B_USMC_MCCUU_roll_2_gloves {}; + class CUP_U_B_USMC_MCCUU_roll_pads_gloves {}; }; }; class CUP_U_B_USMC_MCCUU_des: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_B_USMC_MCCUU_des_gloves; - class CUP_U_B_USMC_MCCUU_des_pads; - class CUP_U_B_USMC_MCCUU_des_roll; + class CUP_U_B_USMC_MCCUU_des_gloves {}; + class CUP_U_B_USMC_MCCUU_des_pads {}; + class CUP_U_B_USMC_MCCUU_des_roll {}; }; }; class CUP_U_B_USMC_MCCUU_des_gloves: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_B_USMC_MCCUU_des_roll_gloves; - class CUP_U_B_USMC_MCCUU_des_pads_gloves; - class CUP_U_B_USMC_MCCUU_des; + class CUP_U_B_USMC_MCCUU_des_roll_gloves {}; + class CUP_U_B_USMC_MCCUU_des_pads_gloves {}; + class CUP_U_B_USMC_MCCUU_des {}; }; }; class CUP_U_B_USMC_MCCUU_des_pads_gloves: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_B_USMC_MCCUU_des_roll_pads; - class CUP_U_B_USMC_MCCUU_des_pads_gloves; - class CUP_U_B_USMC_MCCUU_des; + class CUP_U_B_USMC_MCCUU_des_roll_pads {}; + class CUP_U_B_USMC_MCCUU_des_pads_gloves {}; + class CUP_U_B_USMC_MCCUU_des {}; }; }; class CUP_U_B_USMC_MCCUU_des_roll: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_B_USMC_MCCUU_des_roll_2; - class CUP_U_B_USMC_MCCUU_des_roll_gloves; - class CUP_U_B_USMC_MCCUU_des_roll_pads; - class CUP_U_B_USMC_MCCUU_des; + class CUP_U_B_USMC_MCCUU_des_roll_2 {}; + class CUP_U_B_USMC_MCCUU_des_roll_gloves {}; + class CUP_U_B_USMC_MCCUU_des_roll_pads {}; + class CUP_U_B_USMC_MCCUU_des {}; }; }; class CUP_U_B_USMC_MCCUU_des_roll_gloves: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_B_USMC_MCCUU_des_roll_2_gloves; - class CUP_U_B_USMC_MCCUU_des_gloves; - class CUP_U_B_USMC_MCCUU_des_roll_pads_gloves; - class CUP_U_B_USMC_MCCUU_des_roll; + class CUP_U_B_USMC_MCCUU_des_roll_2_gloves {}; + class CUP_U_B_USMC_MCCUU_des_gloves {}; + class CUP_U_B_USMC_MCCUU_des_roll_pads_gloves {}; + class CUP_U_B_USMC_MCCUU_des_roll {}; }; }; class CUP_U_B_USMC_MCCUU_des_roll_pads: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_B_USMC_MCCUU_des_roll_2_pads; - class CUP_U_B_USMC_MCCUU_des_pads; - class CUP_U_B_USMC_MCCUU_des_roll_pads_gloves; - class CUP_U_B_USMC_MCCUU_des_roll; + class CUP_U_B_USMC_MCCUU_des_roll_2_pads {}; + class CUP_U_B_USMC_MCCUU_des_pads {}; + class CUP_U_B_USMC_MCCUU_des_roll_pads_gloves {}; + class CUP_U_B_USMC_MCCUU_des_roll {}; }; }; class CUP_U_B_USMC_MCCUU_des_roll_2: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_B_USMC_MCCUU_des_roll_2_gloves; - class CUP_U_B_USMC_MCCUU_des_roll_2_pads; - class CUP_U_B_USMC_MCCUU_des_roll; + class CUP_U_B_USMC_MCCUU_des_roll_2_gloves {}; + class CUP_U_B_USMC_MCCUU_des_roll_2_pads {}; + class CUP_U_B_USMC_MCCUU_des_roll {}; }; }; class CUP_U_B_USMC_MCCUU_des_roll_2_gloves: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_B_USMC_MCCUU_des_roll_2; - class CUP_U_B_USMC_MCCUU_des_roll_2_pads_gloves; - class CUP_U_B_USMC_MCCUU_des_roll_gloves; + class CUP_U_B_USMC_MCCUU_des_roll_2 {}; + class CUP_U_B_USMC_MCCUU_des_roll_2_pads_gloves {}; + class CUP_U_B_USMC_MCCUU_des_roll_gloves {}; }; }; class CUP_U_B_USMC_MCCUU_des_roll_2_pads: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_B_USMC_MCCUU_des_roll_2; - class CUP_U_B_USMC_MCCUU_des_roll_2_pads_gloves; - class CUP_U_B_USMC_MCCUU_des_roll_pads; + class CUP_U_B_USMC_MCCUU_des_roll_2 {}; + class CUP_U_B_USMC_MCCUU_des_roll_2_pads_gloves {}; + class CUP_U_B_USMC_MCCUU_des_roll_pads {}; }; }; class CUP_U_B_USMC_MCCUU_des_roll_2_pads_gloves: EGVAR(wardrobe,base) { class modifiableTo { - class CUP_U_B_USMC_MCCUU_des_roll_2_pads; - class CUP_U_B_USMC_MCCUU_des_roll_2_gloves; - class CUP_U_B_USMC_MCCUU_des_roll_pads_gloves; + class CUP_U_B_USMC_MCCUU_des_roll_2_pads {}; + class CUP_U_B_USMC_MCCUU_des_roll_2_gloves {}; + class CUP_U_B_USMC_MCCUU_des_roll_pads_gloves {}; }; }; \ No newline at end of file