From ba089d4691f7c2ef24b55531f396fd3efe73ea36 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 27 Dec 2024 02:06:47 +0100 Subject: [PATCH 001/123] 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 9c3554522cbeafc02529867fea3ff681cb5451b7 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 27 Dec 2024 14:05:52 +0100 Subject: [PATCH 002/123] 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 4e3f2eb2bea1bafc9371250a10d90626c9fd1e6a Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 27 Dec 2024 14:10:49 +0100 Subject: [PATCH 003/123] 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 69d7810ba71236ab2f2de422fdc26649c5416b25 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 27 Dec 2024 14:10:51 +0100 Subject: [PATCH 004/123] 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 8c13b824fea9300e2da4e2ef0a553bc4c4a0895b Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 27 Dec 2024 14:35:59 +0100 Subject: [PATCH 005/123] 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 cd5744552053322a5feebe32fdc76e5157490ca6 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 27 Dec 2024 14:36:05 +0100 Subject: [PATCH 006/123] 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 a096f915d34ffd99a2892150377a9017eb16bf2a Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 28 Dec 2024 15:34:21 +0100 Subject: [PATCH 007/123] 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 90d775c6fec59c0500ff3e0b3c26bf3a242818a3 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 28 Dec 2024 17:48:36 +0100 Subject: [PATCH 008/123] 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 f4b7180ee53753add7508ea070b7a1cfb1c522da Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 28 Dec 2024 17:48:57 +0100 Subject: [PATCH 009/123] 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 c5bcc11197702d8594588faef18004a271b79eb8 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 28 Dec 2024 17:49:16 +0100 Subject: [PATCH 010/123] 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 e6ddc21193d024dfcb10dd61186b3ca7f9700ae4 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 28 Dec 2024 18:18:02 +0100 Subject: [PATCH 011/123] 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 cb191aff4261e43bc5540ef9de5c5e2756400f99 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 28 Dec 2024 19:10:12 +0100 Subject: [PATCH 012/123] 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 fea7488c1d0174a1495243475546ce815c5a4545 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 28 Dec 2024 20:21:19 +0100 Subject: [PATCH 013/123] 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 ae05b1942a5..5f2fad4e147 100644 --- a/.hemtt/launch.toml +++ b/.hemtt/launch.toml @@ -35,3 +35,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 653a2052cffbad4a79b64ada2261d59dfebb39d9 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 28 Dec 2024 20:26:32 +0100 Subject: [PATCH 014/123] 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 3b7e08acd896ceccaabe447718a2c22a810f3497 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 29 Dec 2024 17:22:52 +0100 Subject: [PATCH 015/123] 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 d8d03905d5ec22dc18945c9c3b40ca6bd3c8de3f Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 29 Dec 2024 19:33:11 +0100 Subject: [PATCH 016/123] 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 2cdbd7bb58249801e8e1e0b38e71052fbf6b86e9 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 29 Dec 2024 23:18:29 +0100 Subject: [PATCH 017/123] 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 a4456cd943ae27ec97b35e24a98eb66cc2683fa0 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 30 Dec 2024 13:12:38 +0100 Subject: [PATCH 018/123] 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 969051d77e80196245ae5904dbbfbf6ed6cb8f94 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 30 Dec 2024 13:13:03 +0100 Subject: [PATCH 019/123] 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 zcmce-cUV))*Ds#XOTdI?K)}#R2uf%IHd?3wAta$AgkBX0D3)WW(nUG}m6iaZR|PEe z4$_-qN19kbP_g|so^#&!d*9#l-22>r?zm@|wWqGnT5D#_WP8Tj+Xln}`X_Ag{+(I3 z8chI8g2T^+kbOh`K?)%5F3c9$emj9*3@rI z+Z(Qs8d9k3YpGR+;7qiBq0Qa3Bkvx>Xkz#WjUnZ@`0UvMj6k|3Qn5n#{e&DZ6$b~B z>*65;Qe_1pJgD-*C?3@TL^Muytu(_@XRW*>RcBqXX8$u(|N7_PMc+_paLCi*=ljb^a3T29Nva`Fi#Fm;L7t>j*HY zP)0lZHL_S*toW67F>6d*6${8?9})z2x->Gq#FXLXSL2)C;#1iYINX39Zh-u$0%!o+ z{%k;nzBI=F@A0zF_WVCTx;_IakS>5_f3SFeuq+lY+aH4F{DbfS2#~2R9^D(FZXBxK zA9@0Kj46hLnYhui)3!&o`Dx3A6+-z_oe6||h1QDP z{67*57!!RB$Pzh}*ISr3P756~h0y4K=OP61Ijbusfp?-S1^j)YZa_WXNg8Lxf*sJ- zew_BUyj2LuC1mC+G`AA|?(ZM9sBkG5>(qV;v`ARY_iyEP26Ep#3f_-$@4x$>>Z1$D z&21jucPk2UHI;)bB*l=*kfhw;&nUzUAWJ1vQjN?iqOI_v3Uo@;AI=dVPz>~s7XO?4 zQRTn2xHLTxHKf=$qB@M;PpZ1dbT;a`p#~5Ppv7nnK#NnF-`)UTk2=F)h7h8*6J2E!p;-IVN)WWHk!^;8lF=`&zW$~g%(f8yI1X7 z{xO)p&F1-B*ne2gzKKX{r@l5xXZvr&SPnKs_CGAA10!w#SW^Sq zV*76%Pfh@UQm_aAQve`PM;gTZ&pKj_SDwLZ%;1%Ygp>b!ivdb!)Geme0bsL0AW=Yn zdO3@d@d6ps4(~ec5;0tKj%7@&P;_=of3E(JwPmq8kJPeC*`#({^36puPoAp2{il=R z$x_!(!f)xX%5nh99vjFS1mZB2HkBRRI#F!=8U6Tm!U-7lO@w;Nis^0R?TeBi)6W+r zEiz8rT$xY@b{;T45JmKhq?A~wT3}F;Y=org)`@hWfrXG%Vm2c|^06THwtS-DlzI^@ zn-L)mkTiuvoVA7pm%8#OK+4npB~Mxt_S@oYh^;jnU129D2*l$5CV{z`-1ge9>`OxmV5eey9cbQv zlRkgQON><}Zi<*!%)~p-#co_Gu4n_gN?LzhV>ktn z>wiclFHx9i6Q0M|P_>w&Gi!Jkge_*W{vq3Hcx^d=+5ZXDa$3WPx^s?i+mV?t=X*6i z%zsJSEPw=os9;VI6(l&M3qS~_DuO^sfC76)NcID!v3&y2T-w_R*}(Gws9+_mx1`1Vrr(-mgBoZ8)KBk@3bPoe^<+1%QuK)$P9q><-wmd}xe>VnrH**>*(TV%yMK$ijx`eDI%|>un8? z6KDRsnhV=^I{udctjpqBz?uiwQxGMJxRr1pl%)QvP*hAjrZ?A(#|$Z_o~VbE%jD8G zsVL1fHBoM!RaHa+3zi(ciR3U;S~`pO&&!;4@UI4e>R35}$XoP>FG&z6It{U+QWlVwct3#i6u_fge?1xi3IJs|7(M(4 zhzw6(0QG$whbQ-C0D#C?`-9+m8)0T2ZQ{&-paKTH;N}PEvTIhQp2w?;*!c{Yfe@@9 zDuzSK1EN0wkJ)!CVxR&bkje|dOLEm0RaEzo1EukRbm1jJ?qjB=6{<$a6-4HwgJ&9k zOiz*C?1iKkM5p8ZNAYIb3Uc&W8d5ac%FL`n2Z4^)xrN1K6xVkE;$i_s zfIw+@06@4q4oTm4%@~>cxaZoK0k{KrmI1h9-WL3E+(O6xcyHP(e_S|V6Wk|(op7H7 zys7#UJM>uxiZTUnW?In*( zKxJ}rJ+LYJR|70pk7}41g-6Z<2$OtbxhzeT98C<+vC{#_7bWw!QT1;E@VwO0`T zh*}>>-{!pL%k@K!6(!v@P1N zT(rO41L*B1P+%aSKgB-<`yBwJfc~F?{ekw$zeoF%1CkgkpwoW~6y;(B_6ORp_ov|R zf&NSb7`zCOCt#OUkPJ$>$5O541dFkdDo!^xu8Ivb39Ls3Re&)AkOK)H{@+}6vk~&| zcYg{h{;SF#^8bBez7N5_-2Y$Z!1L^f_^A_uMgn+mQIc5jYi_u7+8>4S1q0R%C=8qe zH3KY+M+%U9aeruQmIs3wMV!?5jAi6q1vh zMHcoY0H{4?)*%|OKR~;yXYAaodf|d*CIEWm5g=ZvlA})pD&A-3kLha>!Y3#Lxs+zO zTe4quubq2!{VZS!U0EXJL;&tkWg{;4P@q3M|C&}2x8#Y|EC;_7pi0uwKDe8Il|~=1 zdi26&V(OY(#QaA!<^ZRykL$2IAkC+t`$ip;hUpXYA8Q3spK@`6de~*SD;gn6Dfd3H zL0~3DQk5Vo97L4@#gH2S6o7>f1SZufH8%N`+^fjAzZ%`4KFV-}FGLAW)C}sCIvW(woxec|Wu;o*!7&!v_${vb_$f9?i5bq)3Qqtw zK_Eaur$C@|VT3d-PdkhG3=;;HK&RIj@7Dx*!%7z+ix|zm>AE{C%$P z0HE6s`{(-oQnj7-DZ#tV`{#OJAPxg@4v4SRH>vFUsRtb}+2P|VMCP7q(qA7h!m+WZ znt~4RieQZSFDIq?Xn${EzE0V5U3~V6-(|ggqE;oa+QjW^bLVWhR zyM=C!n1i2o?VeXDyAzWv%y7cpFQ`5wTjsGd)06k7bymY$Sbo3v3_mrq{N+PA z!^i`zh5b7H_3lym@fp9z-!D$mJiH+NNms2OB@180`4`8FbNp`l+9V>FfAYfW+}kRm z9{M$v3$m%QU1ZYGyp4JDRO|udPD6F2Hd*Om zGdV)!gI*bcJ$?5 zFj-9d;-zHPfdP|hm=5E{jpSr83?~!<`?TX0#cYm4?7p5=hh097)?8zjA?s$ZWs46T zdajcbjJJ$X;BD3xc!)lAn@MXOtaxkuUBp_3kcsbU*lRfeRkqM@{{1;(aR4tAX2|yZ z;h}36J~srQ*Pis3y{3Ini;o&V*4ldf$KdWGfe$RD9yLd*j`Jk1=w28*%)hkv- z%zAC)^RfE48`pjP1E*`RC0?u{qNU=R7vXX1ojJXKxvCg#2RQFkGgGS^t)?6<;VT>7 zJ7W2oj}oWV%nyCa>9p#$!kw-nRno+-{Z_|9*oF&VJ*RK_WxGEf>{Ta`rvDPEM8!qM zyK$ZJ45UvN`z6Lpq#YF2Fvbx(KuM7_X=x@8!y!jzqxMmsm6cNbi*x1ik#1ZlE}Mtp z>b)FsQsg?nd2zOGJ+x7Td#?&4v|{E+qLgbnbBR%0?ps(+>{ajgtAaD!>dRe^K`R~D zDidk^nn`XBKJC#al}jpotQ}T*^tb}j^M>md*Q;U@76KxN4A<4>Ekt3e+6G{d%HiD; zSIzXi|FS%;*z-Avn9X5W@ZvU!Y8si8|_N<;A9s(W8!p*2<-sJ5{E-+Z$bA<2A9;<45I!RkVA(rHx@KhrZa>d)GQX zbip*aa^O+f7}5T{=D9G}g12watwSEMh?Wh?cII*ljQb_?T#tUzx+V7N zg1uwD&Fl8e%Ufr!nFyHO^lCn~$@8f3V`%fC^I-m;M_wS7WBt}%f-q%E#+iT zfi3?9x4!S`Sx~-H^PlrOx{ECFR2me8S@LNp2FYIkVKsO8`9B zB+Vd%#ZAmeorfJp;30KGI7~~xrc!!(4J>ZdxC(WS6eBmQa@`ygu}JQ8qck>YuEGg! zLjl5wD+>r~ijZfC>XAjT_{i#&xXRy(5~ZN@Wrf|vNZx)#uap{Q7OEqC01i*?#Nb(H zq9MsTdg?$IPiLpTMfcV#Q&N94d%YP|qF>!vkETNGppH zRFu~67q4dNa~{nk3FRim&#NjchfW5L<%K$H_~mo8>40sbHpoR5Q&`L1&5T9*4|1hx zZ^~=Cf*F~g(`I>{ z;dXWezvi#_SGd___1hEC@?`0#pcd&j>VmgU*(m$JBljAz={5I?^B?ad==K!LOTXRo zQqyh}R3wGfx!DCUNlBRbDlT{&f-4S8!eBAP>AER#>DfrvMQh=Ddp!%k1Np5921qOOxGw%04jkBESuK0XAD`)W@6K&QT}bQg{%_rW zwx-;8w8BnHIO!nxa3rAFKD5s^2)ldbTl>b<+isTboI^@ilq5eqFlb*?)n zF(-DI<8vtP^bPOv%&ILHqk@(9+H%#d^-EPDZFMNSO5C7QUgmE3-FuY>hVI0kB-Uju zExJvhVo~10JnR+aDwa2J^3g_nNCr(m6G}FgUcYH9X?BRfU&c%2QlJ&Ei&1iaNq-3B& z&f)tG)o(>t6rD0Oq=6g%BZ}^}-6o7T$>oiii##1Z7CqW#JsQDTY%$n!lak71+u_nl57n)XX!CO6$pt+H}a zD6hOMWa9Z#kDD5WbMZ!Q*;)q%66yDCF?i!!)nsQkV)CR{!iIS_xpwv8{zS^Atn<}ZWiT; za}zZfB^oI66W%jsaYwx^M%Km5BkIdv8WOOOZoAqRa{LUTlRyzNVCyEpJS9+ZSP6@6 zFKZm6$S`Skv8H+IaD!)3P#Gtyl8A=zJ5sbrxc9M5*J5TNJWdMh?-)D}gB_m`HpB!Z zviNC~7zC%a>i5|_Y*ymxM{J(JbmqlcIRwuU-sdzus_~)s6VXX zb&q_OXY7|}$5sSNR7qRuj(`2n)xd0{L&hIIEvxF-%}PgQ9=}6uH<+8iJiQ8eH2r&0 z@Byd5$-8?Oe_Af{zkmD*Kg+}>;m=9zj)aUKEAaRw47w$ke3xM{IkPkN;$7Qz>8G`~ z!ke4z>n(GKPJ2JQPT3Q8)cy69J@t_qfB&#ftyD z+S+f{##Jel#n+hN2>p!izNb?+noXYQ9HAaW%z2)g4~01Oe`Dqri`;l{)c&{V$?KHf zU(dUjI`e+5Khb*q=>X31_*t#&v=EWj^Li)t1WCDS{0|YYzkd4`P?+TW@O$$}SAlsQ zoG5Rf-kW>qy1BCLnR=mdbj~UTB-UG8_vAk7qny-n__b3@Y^KRO<6K<26$v{VI{^VULOn6l?mw4eKimt zI>ybVT{0Qjql?WQE0m7$(Z#Ck#9FGXvT?Jqy0O7wveBul5S^6Ba(E-vbv)9Pl|@De z>&L!kAWI~cOk5W_iE}7Aj3Izk)&!h}3_0NXAj4gi_47}AEX1J(&`$N6;5;@Lc~%j& zE1Z;Z+dK#p^n!z8WiaQO=xosw_Se-s;oB|8yt}ni46LhB>rTIPOV{JB`BX&bpL#iD zI_P$4)+kSvX;u?W6KFgG`Ik0kJiSGI+vw8)(Z`hHxr*iWOP&Y|x4EIYx2~P5 zdx+f>z3R0Z?)P%1`V&J%xb4WfU(bhV*#5eBA|ILPts9Wi=$p0T=*L!Jo*#=EaJ23t zpi9ARI?4XXWv3u~&aqjve^*^R^b6z5ZBXi3bbv^Bv%+8oJ%p(yhkB8MY_uM&hgz$|7s zTf6UrB>Nie-ILx`}@J08s>ECB}N><-{edg)4GH6TI^rd6ztyDMC1$j=oqsFEgI z69wDz)Y`}}3|~E$v`Ch$jgKiVz`+6o#TiZ;N}Q~YUdxO(%uR7Ix2KR*=`OJ9gn+;_ zu0bmh$nt8@YgC|NIX=>S;q6(YcRJrQSH#@UV5^tl+@?w2^?y!XJ2{m>rJcBTOWm|) zN~dw=ti(fAvZm?9m8GMPJiwrvN*HuV5c?F=;kW|ts!}qX)x?qju0IdXD4no3k;2F;>+p6)gAf%#^4vn3jE54ES{TX9 zgl}B9vNjVDzsbSENhc9dq%z7YO&1~7J1DD|Yt#=(Mp8P=L{z{xDd|RJu|9|f8%i#A ztV6&mvN+vDN2v>yEJsQ|(rDkoLTB?sjfjEj@q_^RXlT6h+Key0(%cE3!BHefq9w>0 z#a-;S3dnpdgRiVhwk48g5FMyu!^n7XHj~-pwjhL&LFbzm^Am34U=<7)4EpEhMf%Uh z%b%MURv^n9x{@OVT(#@~aSw>^fVcp}56_H~sGy5riO==Mp&;;mD*qmQ8eLDj=gM5z z8(VLJS}JYhz$!D_ z5~t}y2kE`&Y_IC(Z?h`5%zLc1>8Y+w@dzV=#OHVubLIn@ypQ(%wq^6DT`CZF`)3e4JGR?zp+xB&{53^42dgPWDd=+ZMyQH z4Xu~ZHcNlw+}zTS7ozt%yE}VZ*6OC-d zoK~%EJ3oupp|*x_!`{lom-tiAdJ-bGu&M@Q0jqfS5^4~0;&W??vqN<-0iy!R7h`hF zVhrmXBsNJ{A>sC7(sUv+DtES~m@FO7M8>@=yyMc+c0``(=X&=LqqoVCELRbh{ZQCd z(11V?(kowhm?3+8WZc5Wg1x@dO&F%CV@jaTPF~@X=;W~4PE87>`8&aQyzFiJm_C6x-;>pbI(sVgX zZIq!jNZ)n#x0O8L5=5zzB8KLKwQZ8(QB}J`fR6R>WkXe z_wRR&Un(%qb(C%I!=JW8buYTwDTAl>IZ>f|Ex>&QK)0sjh2QD7h-}{)DuSXP&6BHsX_&F5g?%pm-1-ACeR5;&>rRsCCvERG(rwAn zK^B7x^`tr~y|jIZa8TKRue^^BO&1hyQLwU;6CPipaCU1jF4iX^BX*zHi{u2sx$*bx zwcPPy2G&Kh5>HK*y9OI(xj2%!kCaB6NQ!y3r85c#TNn*#U6e|tdvD^ByN_ly`daF_ z!8Oi<5D3wDSGqM)T_L(_Jf7*HDu<{_p5uv$?}=1{nU<)+DF}Ej!{Z(jA|_&2JYKGj zkJgJ}D;S`5sd0#}qI!CSx^*cyPZg>eh><1)VFN|iAh>koD zO3WIU8Z^t4B_&ZMOAoIy9%)u0m2O!y!G$YQ!FWMs)6{i1ne1f4eVbnwmew!m++6nG3^*13ZRu$)uJb$DaIgFZ}K_7Cp zpDOW(kcV=F#=OnY4Ib5D4&C1Zki9+cG#>aVj=erY+N9gVU=Z&qbx(^xvO}_ft=W3B zji0^3Y}k5YqnLI2vaPMHin+a$w;9C$kkP2yTdK+vKTOM{T%0c#89XHnfxuV|&{0zK zFhi)punY+%gcF9a;yS(Ts&q7kolB%drs@#6ep+@AgQ{GSZs`GdTye2TeV!dU%GVeI ztE`BUB9jzG<5QAH)ftF*2LfhBooI*_AqZis{H9x)RNZyv=cBq~^0aU@>)|$c=bcp# zhwmbaOG(M`By+|yb^|b#SL+u2>7y@Y*8;D7yW`?NeXV6HD1t}R1f#o z@Z5W|YrxO*lmDzU(gfu}S=7TiEI(r)!dttheZttjwyZGUIz+vQUV1utDfwqA+p56B z3&*OAq7V7wo9!N)n0aCD^u6PvyMMjr?{nWa?myZ1b-iYpUpBj-R`&9Rns*nU__lpb zY#w(BtQc$cykK{^?n(b+acd8kc}L&0yie?<(?Xkic_XU34?K0gp|>O{25nit7cs%R zx8d(iS}cEGYo7>yu#<*2xzl!jtVW_`0{Slg>-lGA^Uoev@BXHi(f)nz=9lselIQS+ zYhRT%h#!taka9%ZBX*u|I^Y&~zaf+s9hJy!?u26;eHxTuvgTfK=uJphM4`vgg%RcR zpQ`ANS(cGE1uB1h?GI~ndmV3Ujr)3KP=!S@_F!#AAJ&x`^$`-u`|;`Z+G7$KvR|1| zvGPX+JamYYY{kb-p9lvO8=Gh{JP znf4H2Nr_#jt_tz62_|$@QHuh{| z&GV}DCi}LYW|214N^8^sBk`S1L86)PVS*xB|JznzOM;j66UIof|G{ZA5ib-7n=z_R z3e6^EVXzz;IJE-afSTB5d;<+EH#S5t`qnaJ4c#$$#Ki#9i9Hc1GfovmLR!Wy7o(hq zM~vYw=2ac$YsRZ8SF)_E6kc}DTr|YecOrYMEwe%E5Vg08&)JC2Jb#Ry(nYqP<(fCA z`-+ism6vBA=A&;Y*A4tV4#U*oape_$8dl8-qbeRtIx1{QVq|Ag&Yqw!bZmtm**3`+ zj*>^s3-{`XbQhC^HE=4^gl=`isyIG_O){*FE6%|hr^IB$a631doeMkeAWrg7GYB|1 z)r4e;=MhnDayUdwRRJC1K~SyQNOh#rgpmOueQj>gefh_`w{qHdA}+y7nr8EQjc>_n zT|Rl>%~7;L6k}?q1!{Ra+^p_U2=QULpN&gByvDBJF80N!mhr=tXZpv^sm~4WJ=f|C zKZHu!Gw|GSSmiLJ46){X@3?*i@B2aM$am$f2Ny2o7rrmgdGT_7fNEBd8PL^Opy9W0 z|9sMFXyB3gTS}6DiGFZ1MX;V?t76}(Z7CZGxc}DgK<1%W5Lc%gmY)v&;G7AwZ$@9! zy8pd-3xiE*cq^>*-K5J!NIFP+{d?o1h9R+G-@dB#AtLWwV$ao--z<7pYw?hy7oJuw z9rrgNo420UedH8b@@3=pj*Q7O2}h|}*pD%vYikPSe)?CaDe~ z*Iw2xlz*z4_2ojnJ*}@G`)fjt@^F7z+g17#>t!C-7ggpBL;336E^1qWA7rDCRBkqf zCPhX&IAG^{7Vuek5z9!sTkl>J*uMG!W;avs*G4eB69*P#J3AyL)f0!X>?qq3|1Pk) zTcapNgT^w&Eq03^$JEK{)Ya{eOI@NQPnQ!QgmitkG#E?no+yV1SYuwj(UNkH=}2QuXNw+^U84w0`3Q*(da%elL1I8tt2hL-vs92vh65<1 z7UG*6s>e%KLy{ljCuU|0TqUrIIy(4kSBY3IsV1t601TU=pbSs*kb`|TD@W-%h{)Pg zWf4T~S<#Uwu(V3|iOjAE?us)Nys50B4?vP|H4qqWMJVr7PaOrx9hzZ{>Tt8znw)?9d=h#?QW&BG66wxBl(TjDAm?#Zz>@=qy>mH=PP zHLUSO6>)HkB_-4xa{j~+a?m##=Gg&$kpdgARa7S>`=aRPXyyk2(xkexx6SC{7Qes0 zx{8Q&u5^6iSb?n&7>a>h7Nk^F*}%HhanlQag>jYsFaj;p5dR*Zv(t}~%$Fxl~2&B=?&^%YYV_0|u& zydBMp#Im+~u7^WWw=jv>m)?mMstpXCdWW%7$bQ^zNNNV@+B;cb=&iyFglhhn| z+qTVJQ@&FFv?F7!56=`rnlp7yAHF*DGIZ`i#K_Yp;SWY$MY}x-!21c5%(nM$jVRsD zYs%I^)yMIS^~3X?C$=$nc5)oFf4utPZLlKrJ@BmELA1+7flCC{_a+CW@blpw-w#bb zMdfusP&<3d-`U=+7m*wiEG>2IK{vH}qt}qK!^@NL?@QHExIIGLRC~Ix#v?3-WK@co z6`z1?tX|o1-}yicml!bxfyBMO|8?CSwyMNP~n7zsoO;>6^Wa&&_YvJ0XDK3dz`qIanFlY9|#*oMB1>E3q#C3 zZ(|}brHIps=B7lg%T^FZWTAQrV4GDTMvcn@v7Sbcv}xGh8c`@EM!$;7Ig8Fz)iq=r z1XYf7=8lJPT)2Lmz!@xfK~P34-td%G5=i$vNO(`IK#mIHM;M%qhV!GW?rVE9=PvZv zjRikixjY?aYi+lVd{7X~Yg_D&c~;2Tt!`dx_%NdS;N2e;s$QqfU1p_EH`Qpbw98=! z$PTuvy|2zRYuQM<@6ueYvGem+yJ40LSN|F&JD9cl?9h0X-sYR3P1iY-_wra0G6 z&tlB7@v)7~OB(hr{qTavCrfY%x$!jS$EEFDAJ%UU@{c7=rqis8rBChpi1kfZIW%yM zd8sxVyB4&wC7iIs>fK5@e`Y9ga7Yy{EnAZtXs>(}>MP(?r1Z?m7;bEJ#;Fl13WIzK zHs3ozvcXN2qqH4qGAME~i!~8;C7`kj*844mC=~26b%-EKY-;kyXPy@Catk#kB@1K- znC2(?eQW#N6)~+2(;&i!bE6Vg$--7x_Bx$eX|brnKyH3tvRZXlCZ@E>)9eWcCsxm* zvrdszZ}+a;q&05Mm2B5fUaYGiAGFe_&!yw0gz6op{g9ZHMbh&NgW=Ud{hD6kJ6s$- zNMS3R=H56HLjtThz5*WSo4h!!E2L3{N_1<^L-;9@%X!$f*z`Zg4#Y<tagwQ) zL?PKh2zUH|-qxOW(uvW(@CW;RY=*)#OXttdd1lF^U7$Y?72^y#9?oX^V$f;)-m~_u zi+L_`$4@8e6P_D*t6GlV`@Qw+v}(19%N0@5@LO3|__y#`T0`Bjy^qykuD<$|S2>xJ z8t!!Fyw6U2SHzj}+TWYoKNTfYOy!!i!rdnBf@Ug7y=;);9iG%I8i64YRAAIno z6z(1_;(ys0obWw*5|7hvQJB(_n>PP-*3I+sRG8t3QPmgsTR4@9OMCdK{N4@cxCxsn zp+lr^f$wLYgu;AyPn*@KhyHcu1}IkM2Nvz}b$cjpO1cvC(Q0t*h!gwK<0&b$Gktq~ z2H%w@bMT4pb@FtWVwUgWxv z0PvBm9p~#FJ%p-m2ue1%Q^*=BC1A=l;o(!Gdf+qJ$WTa>rOLdJ{1U58#cjWM;D)cS z)Y`Jh~FOVGcDn>vZ1FGi)>(v&m{qvuqIyC?L3UB{QESzPC zf-rDpw+X~mAg%#%3y8mY|2mi<&hZLt5i8cl;m++^c#_JaL6J}dPp^)rhg@#`ek3ea zgP2VZN~teMQF|M4#=kM{)r`uc*V!bEW*4{R;MwF*qsIZWuiFiikFn#+8~sn|)9=%) za}~y{Rl|I~9hsGYd?_pAm+ zz7(uER&ehwdd2bJwyRc-508NVtX-Spn}T3-r^`hfLykOxhL01sCzDz;yRy)P5Qw2+ zkM@i*5;<6xXi6l9ovMtr_9J?dmYkjzYxSQHlP77ARPc$(;dYc1J9KDPflO??UbVZ{ zaqTZBa>Mc}=5mviHO|<*NOqg{dlg==a-T!`tCCSvIhXM#-onBtVf)&-e#OF`)+RR| zuZ*THojH27QH4NKr-OatDh{dZ)GzETBM_(K=oA)ak-uz#)9BTSD_&Oi%eC8-XK3&x zEm~lR7;|Nk`)qtJQ`!e<6Tl&Y!SnC-Fe6#WQNmC}6WF>0Ol@X%=$bz)J_DV1fiu zfKTWo{Lg(|e1AYb?7= z{PZ>~ez1%<97@189lO`Rbmk!0#@ugo^A6A8o$YY<@hKt~N7C#7dyn>)jnAQen00te8^z==jyy_8nzIDa|;;;?bbXHnL@q@bPNN!^aOeaxS-`g7jEqp50kW z*^90ijt#`T=t<&Yy)ML(;Tgwa#QOutnuTh;PC|LEr3~;z4MJYpREL|&%`4pa2enieXtnc6xB7Ittdf?IB~|-dS}(xK^W!xnK_OUsmzSh2mD8%|Mr;j} zhF6t~gAFIb*KSI_KtXr==Q}LUFkx9;CMU!4YR4*-AN1k(N~aeZUvk7HwlEQryP=1b z@V|Q7>>j<=Ns_A8Xg~DCA$xnc_RFMPF5Ncyk_)2-%hla9YyI=?-lMD>r$&_D$nmz1 zyJ1*HpVjvv{G->zv@JgA#jpolN)9=ieRjd;{VQyT=48s5o|wnpcAk0@E~3LDzvqVG zvwC4w!>G7;twV9H4QT&VgwQEev78(Mc@{2LI9nbg!Mj zm_}{6Y&W-2;OF$xgq|vl=(<2?XHJEqk&X1jsQWd%f)aM3v8$N5y*e z>OyU%?Fk~G)o^ldweZi+S5*o&WBrt8HAHliYszcv%j~SJ8x0M0kCD0!14URXX=I{? za-3T|3LeL@dnA#GB(*10FqS5310@(5|L^5hOH43Fjg4mc=OB|9AJ_Kh`?08=knierRE_UZlN3a(ld-VOcL;9~je>)!Bz}@#4{@292)+_kcOFzkNuk^RH zh8I#keh)J%HVwJ7Ts9Y~>y@Rr0?XdS7!gaZEF8aIdG<@vcGe>^eKhrP;0Lz1bEwZw zX!r<*2tz8%$1%r=zgionzuh~Q;Q3W4W7cu}{Xy#csTXXxd(m1?wx<&!6E8Ttp6xx9 zer2T$_M`nB!P{B%fFlzveTjWdEp(g0zqr_>%F6;*Eo9;2P|Vh=K_pq5+PF`7%6nrp=Q(f|tk#Mp zEWC&ilM`tm8SRURhOSBl`I#cCv74nB9|B4#%gEg-mtwfc9|i2+veTLO8NB;_^(eJ+WToZRGj7}9>xj~9^i*{_SVYQeJHU*R_q4l zY!;JN2_`0F3-+FH)-ajEZnsiGS<$MHMzzHm|M97QmojKP2K1N0lsJdzF&<~mtILD3 z33}5>(rbkuII%de_y%dlFZ1rS_l)vYno?U=Mz^n=9Zpp2=5EKg9tY|7p*ue`@P-xQ zbI#ivq{;f?w=V*&g{nl%^wT=1UjsM=vJ~IA)QlD^BhZa}yey7|RY(NfB7F8U1kbNn9_~ zbIjhtx}f<5Ej&Oj==f!A5)rElJzT^K=Yi_$nN}n$*QrT;APs7GnmH*~ll*I=+NDJ> zf!6Ijjfv7647VDe2;?K9ML&d5RRc<=Ih85JD6fh4d|(KH4bv8($%|G~DxTA6H#OiQ zNs*)KRerRMWMLZ|5k^>i39Zg-z3uB-n24_xPD-8e5{swh7K7qOd&md|vxr540K;j_ zs3@o6K8MS+#f!NLLWmlCZSPdwf#1GGG17DKi!d;lby^(*cz|w@k&AdYpItavz8DvXXIr5Nk`PTfYPa>y(WlDWDw>wvA>GycH#5QL2aK9{OSQtNS&<)u`bud({lcHRa4KF=J2nS z#x4`BRPopOf`2)aj+*q;0C;U(dY5ZTLbZZ@9Ny(TBa$jQCpU07uGilwiWWMTeVTGk8P$l1`hJ z;gK2*)wty9V1i(Sp+W0}XlYJL)IhMpO|bXCc_~irs854=pg0v3 zQ*VR-tGD7je98`N>IYXu7b>p8+1MKwV$z2=Xvwnl!n6RISvry;);R>?7Ah3bceS^O z6g45MzzcEEJ87oYQb?-Qv=&j0#}Lrc4i7VlW5J>(tBwXfdq%c`hxqhBd{8maLy>L~ zmW$v*U&mw==mnU{kYU(CGMZYC#(jK!T&}kNRm=x_{KO^nR#enRg6d~3hQ86u)DWt; zlZRPOu3YZQ(JGyTV{1-!X3E3G+uf6wX4ggNv!mTs?!Azl4;6}f&wTC2gN^8vqi>}f zb($%`eKU4BeSZ1YN~jgg2As4pvlTXftNCQnx#sW!EW-{1J)JFZFgPd6yON%|22Rd=(=O-*KGa(T`%fqLX)7CuMj<6(LT5EyG>d2x*0n%Y-S|=kQ*#I=7Fbl)_q{U; z4C7N&e#Rq`5nyp)m0uh6DlyS>)?P6|U_~{yvD_`H*U?;9F1cJRywYb-A8B382Ad)n z-r`%K6q_3ctXI($OA5omHf&Z?Mi60b>BRVW8ixq9KBvSF=_y<$!mE|*Zi^Pd;0&sZ zNvse8Uwa{!CZ_FylR-T*x*}29Xzoj^*OMTBe3#X6hFujS8p)V%$5x@@Xyo!mA(*O6 zQ^76EU4&m^Igf~8Q_F>MHEG5{;b>=3&11*307FMgNz9rjJ@=sJYzv+aTxb=#&bV_* zZSZ#l-_46l{-48G2Cqd(!E`9Pr*DkxH47^hs?R?VpvUs((d@JZKRGGJ z*-P?XpFX`msOEaQN5PZr)=|yHh#cCLcUyB`RoykMX1 zElw1#;+U99pYW1!isRzOly~;R<0oMp_n225?tyupQDasi=*YC-5W|q7P|lmI%3z$% z8_PkDXj+eKMU`D-ZU+NF5*}pJV7E1h2NkDd$g?=jxZ4U5pP1)!-D(XuWZG zyeYU)B@2Z^`Qi+v^|4?ySP#qM0ZNBzL1n!Vv?xA%leJYY;~myOAdRn``xUY%bK0z=>F+-OuL_XljZI5y>OAKG@Fxm zhl59(lP1ia@ywnSfxIq|C(avkcc5mtc6$Bm|3}n$N3;EgZ9Ha;s2M`hh*2?<+DdCA zW~f9G38e%ztF>EQM6DRLHzkOOQL_|PTaBtswW`&st*usvt~bAP-uJvY=gxV~_n-We zbDsNq-Jk2ax8vRQ@4*7LJG~HSnR=T%y%apyHdjBuu&C{`hO76Wnj&{DsjklOL3AOw z#W@Ov6H-U}sOy}jPvn4TK`8vLkCCHrl(pTp#t zs|BBhq^)NX`hC~zh`Abwg1D@HGaai z&F|?cjI0sYzF29qeFW-snYA)3E&#&OeD0x~o=#A<)`yC_%4T03*`)bMn$I%WpR3SB z%!{Ok>f9BPuz7aX)8_-zDHUVUT9y;M4JrB^F&61SNKO8z!}O*C7I2Jn(xB0qX>;jK zKGNiqdvT~&FE1GW#+pk=fz7j*H(ChXJIE=T52TcFK&?{1oJ&F6CBuU}aujUt7i*fKZ-6Z^qtXD1pthq`RpuFZP}GKi0U8q3g_`(bg~@{e5~WVhkAeCKh6Omg;Q2+3Lx)Q^0B0*4IPt_> z1i^+s9y~WZ)-7+y#xRJOkBVbX&P;mv8z1ZwWVF;+T0e<2uR|})_Qlw=1rTx@%VwZQ z8cNRdg=RVP>*1;+%Br@AW{X944P}Dkv#5#r>x)!BSg~s=-alUFBbZvJvT#>Mv8C#Hl1F?a zTntc|)#SI4>!w>WgM>v1ewY0CM|Bh0fFG3p^ZMT+5$-W(E*ctqYp5pd+F|X1h~3XW zb=|^!E{XT3d3SzgG?IaFyk7+#Di2y&uet_9gvzH?)wznY}Y{ZnOSp!mn9_ z&o2}VUNK;&{l0|Uq<=U1D1}W{{rSVc_LwamVF;?Ik>c+v2yWwfUwWQ9=hi4;yW#MQ z>aU5oHH5AaHHy?^P1WviA-yf-NcSH2_*UV>sW;tcx)THki0T%;+P_LaJ~;K;v$};` zd(q`xYJ|KO|HF&F8hG#QGJJuy;q(bjjiC_N7*GUz?qFR)z@Lmw4Wf^YTxvYxRJ%vm zNv`jI3TZ;T{6+#61p2sLR3>?7L`2y9=^b{i9cVS&&ZlaY0d4Wt{G{r%QB_8HAT&K;X^d=_n9k zvxaLs`084FLy=IW)a@7$dfy!`B)W+XSCN^HVKw!>g%m69(aIX3EPFU&J`OS($Kjs# zWen`Y9s_r;Luzv;@kr&AVR-m*kZ2aD<86iGitW|TWY^9_hHt|1Pv2BX4Z2o$=$ZccEW>yBcttTqY z@s-=rCts?Q-RC&mc&q6hRT#9mi$NdnaSEpzMHC#k55us zE(mtS|FsKI7wG3R4vvKq{0 z=7wj%e2#N!i_P9|vP)B4Ps^nYwR%O!=b*Nph7<#=)QybhBa2i$riGsl*{+9#nd{uX zkm6A%-Ui(s-?(n4-sh}5>|C2)h2sy-YbK!7s^3jWqR>KIxV>8<90t_Nv^X39Wcpr# zi^a3Od$sX0`5rY>Il8xDnA#FT*mh#NMP`s^{7VqA~i|Q5f zu=9>+30R+)*pByb1UU#H=M5|8&CaVKgz!R$LGHQt9$JHw`Pw?~%W~vG*X6)+PtyT_ z=ZeFFhQ}+V2;$1ynMlNi!7JMLZ_Mtt{(QOeq^HXBJwv|xv8EdM%HKxXs$b2*?l+PBjDeE} z1@+#!CA2Y2r%Pv`_2s}0QS_Cc6}9>IbX9AwaO`8pf4o?spPhU+^Yh*DJEGJ)?FgX< zL+m=P%F>M>O+iJaFng@6n3n2;lpzOwLFAPO4fvK5KL_p(&$#KH8wf^)^c&hdd0@HH ze5G8Id{O0=PLJT&u`WMZ)N3DgrRnfDu#10q)?fZI2V7D1o*vQt75Y2k$J9@9 z^Y*YpY2&suuN|X?v9A}=o}iMtKYFR)xnH)Lcro8haL;?e;%}uwVJXk=yga|qW~Vv- z)6iVq?v1d~T(s{2@hNr?Q2E*;X0P^`)JlA~(H-YPXA9&#mEb#K$*yM=^-3|HD?&nN zg44WuTi5}ya&YS^xk9skg&e9d9Hz!OGk_|ew&qH;uIM6K%@l}D*vzo8*>Sur!*1ae zJTr0cfC?3BV0o`?4y#NHXd21H+{6?osFc;u2Q2Ggdl@D{hI6OLg}4tULN*mr0oN{5^BcbWHO@ux5~w&_&29FV}){7KH#T)8R-E?a1>VO=yQf3!lD8N~!x?|h?N zFpk3}dSMBG0GuU;0yzF~BYlB&*Q41YOyZPc4f8M+Q)^$}ej59yHj^A`nA}l&&oocp zqVog{4lwIDlbu+oGu-9u>hxhSO57Cz#Q69WKaZF4E>%k&h`e6|UUfX(R<})~Z`qXl zIBn-eV(wq0DQyR8{%Vfc&d~dCdQw~&SmGRo@ZVt)bK>>RRSG87WQTi|1y&-x!g4MD z9N`etB;o7xdACWWn{yww$3qU)jFao0Qe!4+7yhXH85a9Rjr;pVFZ|Dkp<2JhITmc< zQ`y$-he&a-aLWK`((*|UdN5l#en8=YTN)3-T<)(ErICcOt}Cng{!AEJE`{`9%*KCN z;8i%6dtGAu+d%MSbKtn)g`&jV{uhJVgF+~iTR1!6OEx6nAV_!sjCO#bO@R)M^;#Bk z@x<0{7@1k#(4sF7C15~Zeqi-1UahpwNo}AGuJS^1ho`HjGqCAJvA$_nw_W`=`~Vs3 z5BP8-?m0-tpmqsDT^_=C;jZ~HDPh-GzihF3t8Z7qHO?Wat|8Leo?U2yW0Mqdj_D7! z@e{c8wFTA^f?Pr^kBZD7ZKYcs5^l3+ylZ^tAVgqSr~>o`-`DA=d%ki&IQ#nVmF`B`wSbuSL z;q^sFTKZ;T%s_9rwB}>Ma~9fp4VQZF*nQfXxqMsr8bYnk9&&xpUP6A|Iw?Om^I znjgZ?#p9kBdpe%>bYHUZfgIQPL0L~1)VnvTo1-M9f9K$9T-725{&MT$y)4Q8ydz`& z;d;Jpz2XNIwVChM6D$qC#JT_an6qn#QEePhv(fYS1(IIe(0BX5!0Fn%2CaH(U_z6LP0a%Y|hX7Pb|jM5~G^mY2;1f~)0QfE+lLG?OybEL<5UsC4Nf_5 z^4MhZP!jcDU48A_c#21=-A{N5yNMD4xaq}G0n@Sy7!=OjX%!7%Yh?}U;v0sr59+AI zs!YB0Rs74}x|CXHWd`&MsaX8zajxdh0^_qXZ2F^dVoS%cTKwUARExg8R4k#>CUJ*j zc)N&8GQkz~3wa`8@9UrCd4w`L^&<@C75*n^rTkvSS5FJqY!#cRA!4U)Bl>c7wu-mD z=HcA%zxfe7FDL`#5w}d$p@+e4kX=c@Viy}w_UY95oE)7sJIu7mz}Xjj)JP%x9OyH! zlAdB1{{&ormdporhUT`&cPOb)8=HT1oNa&+5R#@`-x#Z{L3)nNL2{idr)gK1bph4T(8?Q$2M0*;0dP~<;A#e`Kxg*$y zTyb+@b30qnfbWgmV1mvNUzvEt`;_@H>#pg0?u;ZV4N50+);eFN5rHUymSjIIp}I1n z9haJV*Rxn29XMJT2yEn^|5!*6A@_?(3Wq45M~wh??cv$%Cgtl+=ATr>e@+G{-!xkq z{4_bfY;B$Tm_2zb75YQwm+?~QQ@zl?#{&L5*FL2V^>~gh0iD!JhBfi9;RRc6{c^5S zsU{tauT4%iZ(zq3ce?#&x~`qMkhF1%!GM<}eZPKOzq!}6{9D6|=9dvJ6Y=NQ+-9KyLUD)w&0WYq+eoIW(RP)bcu9x%K0%L*~-xmFL-|^91n+(|4AahSFLqf)) zp1ZV7*xuS#DSdwQQS51JaOsIpUe~MRoJ4l1?~6ajC_XW z3YDn+J8`)lr=*s!+YxdXK1$W{D?t>ihQ+MJqZzqRDSFF%u(6Kh+%B(bdv3Eh*A-(zultd&!QpGdHX^nCwx<3=o{Yn7_ z7k`T2V1rt5XAPP-O(RkvRyk6!OkPeLC-6-fkcXnrSq|foiY*g1VN>DfMao-?SoPvk zl)-Qa1?0gOon=3S=7aN23@XH$j_~;6q*%axFK0;%80_e)E#=@FjSv+M%jBetxnmjZ zQDq59Wlo#Vqd>6o>00@ua%HT?sK$0j3ef)At?H%rK{ub(Wy!C!vjA5+K`FplWtO~W z6wRX(wl`{Yp7p}cI;nqs)uKN@ihNZ1SU-~M`2-xJ(%fc~(t@(t)3~y_5bnBNO{YJN z7>%}KHiVrYCpzI&14gBI`S3az8EHpIw0rh7A;}&IdfGjjuX;hUP4ygw<57s;QJtCsep}{M~VuQ`h zYmO4Zyt6nAaTEu0&EEAan#a2iN+osdKlQKoFy%wp;+%X}UbugyCbiHRC~=r()vz+Y zgJ}>~-c07kf*Tq-0>nv<{#C7^HI{>n?JLl|m|Kh^86ku=(7b<6gMSB!q|&mL=>{1I ziLt_=!f;!lCmbp5kFc@z)A0~sTG;!kdxPWk>_j>6KH9r{s%Zi2mTiTej1_<4V!nSq zWu7u5mILyuRgQ;Tj(pEO8^oM%OeQm9PSXq1sLHG%Vq0{gU!T98fN-N@X3}0(QfmEN zJ2xSJ?+g(n8pssa0q*95R#ccvD70!KU#((jIG1X^G99px*cQ-T607g^B3oCSm*0m6 z5M9}|Rk=o5DgJz@I6hRWBB7mcfTv!YoC`UAIwq{}bmZ?h(~jpuFVg6XE;nzU>a?1m zAMB56=x47MVc$B{e_lIreJ$ob((XzpYV$|oBwg`#+Qlp^#E;?E}x+%X6d7kU#R~r2?*-4!Trm8X8yMJ^F@*UxQ5j$XNRIu zGH0vTxs$$uBaT$HT?_b7VJn^ zQ`_nI)N=Kc2evis;j1+HW6z_|Ls|asVSV9#Id>*6x(c3`E%rV`_;}-Xekp`Bu_ifZ zEy!oNR}yUS>1_+!BIVX6^WDy$u*IY2{F)XwzGpiZYsRIndNy6(JVzqvo!syK z)^Nf6;qW1TxVl(HQ6FX;SJh8zF;P{h^olt~>lk}*z}E-fC<(Rbws(?@Wt@aCgid*! z>~FlLU7g?GD^_?prYLSZ(IJZ@3>8jaf(pfYQU?j4Q>m9a5rCX{p0doRsAE(^2T8R1 zl%F(75xWnN@rec&4nYuXg=spMrV4UGkqRTxq99E_F{!>vh@k*NS;3qplJ3QsSe!1T zpEEkB&<{+hK}%(s`kbx-s+71xDaR8{<(2czJRyczX4RN2v6Set^k^X=G#@BK%*-qg z)e>i+C;UfS4TQhvHpADL8=e>jh?DC!5#cU@bM}>6NW2M&>nuC5O923?j)nbSu$kNc z3wYeD<4g7s|8YP)=5l7H*IpiPz3zC z)k-*Ia;N5ti+DxJ2;8O%<1FOnM)k1`KHk70^Il8UZ-4j^+H$;pC#SfORvG4T_EN^d z&oEb;G4$j8@Xk7$B9x!-sGB6%flFvA|A>mt;(IhDMP7LBB0k9N+$Z_hF)A9*Kuy29oq{PxIOQ%2yoyS2B_o9CYV%el{p%Q zsB^1pc7ClQpDm1>*6}a&$LR2aX0_`lEo#_bX16evRLRU5x>Q6Hor5wD2jM}5tU&kU z>-eTZDqf97izPNP{h$zrD+-U9ZG9n(sFIJ*S1x1f=POBneR1?`*OCeI$Ah|f$T4Y2 zg<$d$0yLm-L$cF@)j$YN(z9q0N<$vxAPsRB!Uec0 zIFNB$Jq47;zA2C92A3*2jXe2O?|t)fNu)+h?wiXqcNgFHeQ|sDgmPUtHX|!eQ~Gwz z7mwxmHZu+vzwc_VTVnI_`2;uwkI_QQ^}ybeo}s)-=pT5yF~_8Y&-c%L?D(F!gC~CZ z(=-#c>79m~_Fog~yszI>*I-9k7Fpec-HxY3!*yEisKN7D~y zW2PHS=7i1GWcYLE23*Dc znDWW~Wo8On=B`L^n(>jz$X)M3pP6dM;ZfB0zE46vXniDiuQGpRS{YeIz$(0A+Ya6Q$FW`cRB^5-iaxT^su>*33O^&_E6fIL022 zm{K+o0{e18D4fG=iTZHpWd0kgULr(9WFuu7j7C>uc~iD3kyWRCwbACE9iJIlx~%Eots;Zm-RXtKw|jYutA6XOBZ^)Eec-HDuT3N@bh0T+v@+9fv6` zrNs>KaM!=CS0*%gk;Tu|)Uk_a=N~nmJbL!R5}d^s1{xGa4IeBAC_d|VW@YMkEZ8Vq z95-;edK{YD*q-#I`%Sc=#82afiKYoDMmSecOs-L&)nzR7>{$pTQCr!uA*ErVu3@S+ z9v1%$p6f=Sbz{u8ycmnjY)#U;Tz!cQT@s1zRzatIb2P^tfmI3WJBGF11VS#z@ucc% z;2mI}CAuEY8saF~xGYrGk=Pe4YG84N&2=sZB}3}#7r+k}bpo>6h=Gda#4ba6U4!#n zScHb-@uuN1R)j`vISw|*>Ko>irCl9YM9c-?D+j(wTH;Q~L9r8_)RrWafRIcDr|fnt1{G&ZwreUN zV_3mq6oxy-0U-e2r9)^D!kjf1T+?BL%MJd8e7c~yK{B$i1b6IP*?qPWsE?$sG$EtQ zJu*q!w-1rc34lGC!tQ+fEg!!#1Aq2j%yO3|Xwe-AsR;MEM?ye@bBBKyCG+zgCXINiJ8CZ^+eb_?TWy+l zyInE- zo=7SlxX8P$#1l1?w_ZBr`BI&Q-Ug{e?|)nl5&U_uXZ$DIL3t8g!?*lm`d!U#!&udJ z#W{HK*(zD$!(_eH4_6A}9&>Q54Cz$#r!>8sgbp({GSVw%&$l-e2S_)ZU#{YihG=2kPB8OM&LhpWFB&`h;jL{xiCFm`n}3~-!+&yL^E*+cx+rJd z5vX`_%h2X-Ee@xYqalt#sM6`PrW1D&O^DYtX-NmW=zN~DStcs)tZ;0q$K0|W`5`rJ z)}LA#zC!|S#gD%iBR+^_3pt)GpwXRRp|-~hUD%n#h*ln($1E|E=JDrXo{fXlRi!yWWNSz>gGjirLM2Rt8#tb!P( zA}c4#M6`=IDW>unQn6|9IEXMv3z6E#&Fb>ua3M~bJJP|LQ+p6n0CZ>XQ}8wHG@JMR z>Wepamcfdt6P;AUxb9|8)tZ}`dB+Q-D{$tsmqd5QbW)DQ3v=B9@{}x6CwojqrxF2Y z^;H4vyU~2N1dFc&Vxj<&M?L8?@sGuz%W9gcQDB7*5vF&N<2|;@w@mH86PZdrRJfC> z1!18WtVYvTs_nF@$2vR0+bbU~2;qSCKzWeNRU}ZXlYV=NV`Jun-(%>;bEaWW_}NmY zXPJh~gIWfyil5J12$>tK!N&sSnq6Opkzmbt%?9yh3RJBi1mjCm5*LTUl;amLk4Sy> zyWO=krXO)I!pKvi8OB=bT|{zibe*wBuEPZIf`I3aTH!ahzrfi(FtP% z4vC4*QH0IC#*TYLaGJ9N(yx?{<(9%?uCCm88y9>#v~+dNNWm+1UZhYCyH&M2qP$@#bBaG#=IYI7$Fvxwh_J2SqZ&V}4qOvsT*_!#r&nXbcZ zv$2=KYrXL(t?l<;wywzD120aH>)Fwb_Zrr0BotOoP!XOl+ZfKFEs=&vXo7no=E`j` zZ^N74I3#$g|59~Ic!E^}qCRDT^+*Bf397Q4VUIxPV&SrTAnrbMhD#5>f0tC3x{b-! zi0y-Q-h(`aT7t)O@5lF?ASPZVw`-*;C6p|4b-zwNO6xi1Ze8sk|1di`DY0%rlz%l& z+5>H!aiTLJ3ZyO)c+r~?Qh;p^de9(stfM;cSh)1QNlwg_9Q(gp1@2te`VJ+U!s1ll zZGP7@=~MJ!phD8P%ife(a@`n?qyRj*351&EdDR{Bpwr9 z{=m)HnT-d=F;nH#Q+KhORI15pz9&PKABQwXT>iaEHptyn zSs#8$CXlB3#|-F&dlw}w*n2I#!oH$pYo%x%LsX(Th%jS3WYh)ql$q92RYY|(kRB!b z720-GpDH$WtRtwVtkH{k!|inNc0PHtj>3y#$p)u zNQ?^m;FH&HNL+w@?Y_9uY&E*JtG3b6(2>79SgtqCygQqTJ*5;+fqRNcW%Ko})w7JX zL)X^=iF-OU3)kg>;8OxkWd!vTlU0o+@0D%5ZGGmko+&YE>uvQG)^bBXCu`eg0tU6E zaba;f%Kk_J(X2O#?EBb)Hz(O&26uVYKL zorjwiOZp-au3Y*d!77vgct#?Bo_kQ+{}KCYjv!&O!s`zMhE7a%~6DTL+8ic zYAw? zG6?>n1vP%)kA?y3?9-tr)B(mXyk%|%Bw!nv&xY_S}%5M`d6vKbx~_wZfpMm`d( z{1jE;D8#F+G78W|uv_?Ih2BXEWdRLsIH*#lOocj=u(&}SW(jF{m7vf>C)ThxiEt*t z{1Y1-Fq8&wR8C)WyfS;AyTB+!1^{U@low>(KMHsI-mp(;$5@;^@tE6KJCWs+(fW^; z0p8-8G-7T2V!37c2?4-lbW+pA_Be$}zBk=uY~@(`jlFee%4!SuE1}f5W&gBWUJkG# zIdi(MMB+5tGg|M1H>4W;V=)g(d2F`KTD!l3 zWWR};m!JkI)NsKU{zLvv(^7xlh^sW`FZ+w9HMEu_2FW19yq7P;GHcfAvQ$<48Ilc5 z=bd&sjjWA&OW4`%oS@d&N)`{jKn`E%GieLU5GMfPBl#M8bx`MIhJlTkqH9{$+%Pqb z4GxWuz1T&zf2kTAF^raU#P=zi!+woja~(@=fXQ=JHAy8m;0LgIXO9IxTqrx^o(}=s z9uk_h>AK~lg9f$;B+t?Pa+_OJQyD`z?|Nk_sxF_vzo5e{Uh9f(O3T+BpjOp+n1T@M zd=Z$Ud~%y}oN!Yj>oGJDHBZ)=AEYzp8;eX1T?1T1Aql$R7bj@(iA3alkaC#gZba9R zHrx)!1q+o#2-hZhBudd)Gk7&RQNSFH*8yJ65LQQk8K^-ab39l5)2*5E0D)VYw`!Aj zMMq#<(Lit+=v-ys`ZVKK)EePJNoMesPWj}s^jO~%l#64}i1Uz)?BbgALNQkCm(X}H zw`bAw%z8b;3+-nEed?GlD`7XCc0S^rq*Xxbc?&(uJtpn?7WY>NK2bo08?v(xv+Jzt zXP_jbH`K7^LW_cS`B7(F0Txp=DKvIY{wI2O-z-DMXxwjqww&C4`aHdxZ)dwu+I8Kh zV*Iz*erZU~(1}2O-mi~NB7gU~as7Det}7d?`1j?)M}B*zr4VhnU?S9@L?p*~Oy%Yi zJ(Lb(Kk}hAdVTVHb)L88Mh^LY__?!s2?)|FPxF7-2N#UnMt%#Kt=}=~izMAK55*kk zXYyYSXovmys*CB%-qDVG8d9?5g(#8G^?FkjTrMb-GW;exMyNBvrH-gq6{3zaV1ekKCSGul^~FlZr}&tL_yhOqdQa+hhq?v$}^P;lc{om zA&*yy0t%+?@rJQ6Y?7zN2HE7m6=uC1?~-JNrG4K%~Di_lYGo;vo=jhou`k@Ycl|FrV4J`KcV;U&%Yf) zPm6Ny%%ugLjiP;n<;$+r0S6QmMJ~Sq~o=WYFFh zSLN#rZU5xA@Kb+Ve5Fo3x2ju2b)#@BGq?Riek~Nbi6#H-h`=D+2&q_dX`A*~UH*6{ zkH66whNaU8h01dp3pFk?B&)T3J&0#^OVpM_lN&Z)Mup68Qv*uAT+GNr2_c5AxeWdr z-#HPGh@lN1RM`3a{odflGoTbtdf;pP&nKs~2wHpj1nmAo#hN^m;%f~uANNw&81aAL zQs1czqi5Hh$#HYxAo%Fm0 zc(AyoW4+LyZ&P;YWG+^7L6M0F)vHOpFpLcHM;!uQCLv^bJ<1gT5X(Aveo(fdLxgKj z=~XE_^y=GWms|DJwvK(wVph_xe@R^@I%k^5Ug5S6<(n^&dM|}ntQE7_N4ss#cI3Z$ zB>C>fZNb!~1N)b$s;bWh)iqDl5Cfu|>v~iLb?tL~X9_h4OCSdipr@${X7r)Q}P2AXoWsIH_TUoJvnV zZayeHtGBo;6OHaeOPQe!X{G5&twqz7Gk8wPO%V>daU9572qZzssh;Nj;4nr>P;G7Sv|$hh5?f6E2lDv zXwt1O3p6R83-5|nK1e-=I7*anbw957FrF-R#%KLZ)Fsy6KR$!%-0ZsVsh~c_bK}vE!jqwnb~d6{MANE$b^fF=4bRzhO+Knu6^@#gD=rxa zE*xBOIprhJ04AQCOI`@zMocWb=G5$&0@iiA$%QBOh*Ia4; z+Ob6eblVC)#u+S)LGevUnmi$9%I{=Gl84gBSp5fMlsaLVc06A)BdOtX(|y=g-5W#A zL8PWuKORdV9qv#h28VHl>fY=TFdmdK2D&n(24tXfNO$|Ab;pad|K{yH}ugox&Xlp5Q{=~}G z7A{-jGsL3gl7x939aX|{JnJ)+26Sr>^m z=MtTplA3J`(Q|H5#eE2RQj+>Ko22fk=&?S=9)slr^p<(lxLp7pKH!}VMp+lVE(t&G zcK%Fw=dWdxJFiGr{+@rb+O>M3J>}}5r-jzsFJ@_Bo^6$+L_VoP;g8228xcfJrzweIpIQ}}fo<%Q&-Td-yw;q)KQlUtNKQ(v+ zk=p(t-6i+Qx5$qUGny}luW|i*n(TlU&dma};Kq~7|72V=4R zD5N@9Wiqtw*`Gm)Z?T5f3!@K!H((FMz4a}&o;O+mb?ynKeWWI3OW1RfuJ#Vf|!9{g=(-8zs@!-gc(BnZKn{wyrezg(jG9^r97?C9S=^B(&M2C&788hXTKO z5oz|u9U#A~;@Ov%c7M?&Y((dKhKc0gUxrn;>kw|fv&{Td7nRjg7Gym?*LpDKz z#;@*?<7;V%%sVB52M`EOuNm+sN4DZ@*=NxJv#V}57mT`pm=$rnD>k-J%!w2C>dcQ8 zO6~W*Z<{2Wp*1K1M#qo$g<-6)TbE96iuH*m*}988G6n>v6@$;O0g%$XAX6?CQ%@*& zDg+RUrO#|}(u3Xc=J}>mF)>~gD26Dht(3`IX`yHZl7WG6_KlfnrPQ(;B4sv95DY-h zp#mm+rV8hH8WxDmyvvuRz*a_$o+DbvFv|2P@ohl1@+_r99%pub@$^B5J|ue3J&3$I zyTf;j!#K)r)=W@V!jq3{n+>ClF<*2;vvYqvhMX>Bg<`}Us1lm|?R)AvH}ZaDwlIgE ztX-C}vgh583`_IbRc&U7Y4}uBrsEw~ZGum1{3+!PcANN@TzDV|Qup)8%gO1C3aA+} zt0B!sboD$lT6OMPt{vXeI^Wv*!N12q9>m3ECv0k&XAUcVmL2778iGqTv-Q+G$0)QV z@-4P;Fqkdief_Q$XXm4pajL70BNltCZo$x-pjOjBx>viNcd+PR6e7DQrnS1c{N>ql z7#){QB$7(-o>lc#Ht;j8TajH4E3ewRq`2oqtpFRY4o^z$95l>7?4;CIr7kzC?0`6` zNDZS*zuYTzlj0THlaL>^R3;TVV<~K|CLT@~!x1uC)Ddm-+O=3ke{ts%>-C--rs}nR zo6K^eS! zqUxDsP?raT&l7=htdI9_AAsAPh=&l8rRZ!9$8PCG9E+bBH-=mIh?%7o7uef|%b4Ze z%B(2Q(W*(5qoTxgI4e5MmtVEA3|!^`U1FJiCRh$E;5C@#}(Ctsj!2FI~xrz@~S*UYaL=T&byha&A5M zj9nEZqTG@DO8l=nd(G#N_ogfRH`jRQa}+z5t_Z}9sHQpdknDfllW#rxaG@9w8B|=I ztN6w0Q1iFlQBS?~!N|pm6!2q>Q)O(=W0q>~T_0Q3n%S!R?qU_h+spXwT8;A{$$PHc z&i)&a-WTh4=#47TEI891>OOH_&p=ByM0W*|-99#=e{{*!N903=cfLkQk*6$@p3`^Y ztU2+ee9KrF&c!kc6hG*FK5Q}i@P1P)@oh5Sw4J`wo9ALX2eY0-_dhz_{v37~@qK02 z!BCdjORG7CNtwOy6_~tBqrdA;eXir(v4zV6b6t{y>B+TU_{pgnXA$7$B_JzOQ235f zb-=#Lr*}18=PZ1Z&uKbi0%8mnx1d;WXj3RwDyb%Si+F*Jj9z3I)ow~bipx{U59S-x zzxB{ciUydE-KJ$JC|Pl*Hkc`7*_Xo^IKvz&f~)2RQ6o7{o4e@0EivA5)}B+=+$B_B zF{MjT6EUSMYX_l{GPV+X2ZRiQ=gnQ|L^dHIcp2p7lrRXv%Pqju+dGiH%3{H7WBWEaI4wr{CehC`P92{!SN?GtJe?TUI;Nkwoi$J2DM6uj4E%~ zWuN;F!9;l<{no3v(gnx#*E!MKX3t{t>vHR~^2)0%%X~M6zBYf5#4bM?G$x^2bniy- zIdR$v=^$+n{W=vbCFW92uNDR&PL=yB$HPJ*DwTzOP-=TSM&ZxZ2OpKsp2?PIK?ev0 zH{{3prBDqcOM_QnuHZR(RqMQZaGQ{)M-|)~c(Fs#qU+m1JQx;VD&O#}uEt3qpk~?2 zW};t+ByL;3ETb^Ss%~4|@hia~Eg}Od)oYymm zyABcUiu7;0=R6M%ZPKh=$BQA*AX4lUo#~4ZM`K(`fr)rLke^Nk`!Cs<4-sW%FCgma zepF&3!$S)=;Ez&+P{Fxu2m!IS#AhsJ4h9uBX{3=KGy8!BE|mUKP68HUs$ z+zMHuHM~ST9GyI#bJTzK%Sl4SzD3IL-go?MNndDEa`?YHv+;`q<6jRZ1T6&azj%`E zhm*3@3&pnYVdt8PoGRPFt8s!lh{Eid2dBQT(r!uGl?EW|jFfIC#^_bQ|9H)1?XTa4 zIU#dn&u&9E_~IP2XXo*RI#}u9soUYV6!CPnl3Z^OJeC={S8R8FmDIv_UAE_Z&hcG9 z_5Q{9KcfSej$Sw@^;aKS807r@(iy1ZRAaQ*srS#Pq3XM~p11ZwgY=5%lH0lW29{#> zzd@=m&M&@s|FMu(_kGLW;PQ9f1xF1?Te}X=kou$Kf6Lc3yMs&C)h_0FqNoO(ngJ^2 z)@Fw870b1;C%3K!j8WWLcbFlJrypwFE>O6)`BiQRP=Y7DEo(m(U;C1-&3v_}R%I2E zng4!O=01`ZVuokxP);!h3+@h<&Bi!XYgrlEjh59;`-)vdACr;Pw%fDevhL-=SMsb#YW zc9m3nbDW4gvcjEDz)A{&JjJrn(1a6BGi}VG3v@&{Wl$MrR^k+{*nD17!*EGfHV&r@ z;Iec07N_ZX&U%3!i7(OYhwLUNuOkGNr`&`PW%uH0STE~xvz|R_>{3!eov!20_(t3I z(b?I5Uq5DrIS+3H*v2zYT@Je}a3kX6^a~Sz`D<(I=kBx=97?9z>Pe8l~C~V+WVQtC053v=uHxq4bpbXI2uCD?e4`k5|(>tBNy--h0Ug zlO&)9Z(TW22g!G#_Jt~={?jS$%=PMtZJX;CiX!7gNa#?)`~f{MiSoH*UMCLG_UNu; zR1kJG1n4_^M*)<0DN)3!S=#N14iT#@V z`aVsHV5w72XC%of6VOE-#33=v0MipnXMpJ|D!PvK%KlQcL`?WKsp_ibCW&WmpOm6Yn@-}2dr_P)S8jbFSU9!Y+4Zz`hbim8=yW&}~Aob(L ztef4T|D>CD-#b)S+m-1r)q62oP1V20jbmOq&{g($_di#7Uj5D4-lWl?CE2BGK^?!h zs3PoqL)#*2{7|8DG_q88^n(4Rn_F8=^=h!w-A>Uxs#prp&iekut@gqf$L0ee& z;bWg5qYY=7AD@psBHNaFUtA!uZD#ZSdT{!$$<{?stf0}`6;a5w2glX-4e!81CBHu< z#dTjl3!=I$YuaZU8$`N=Bt4(+YWMKHF>rJ{uD@I&^3%l^6E1Uvqp<{eziB2AsQb9k z+nJuhVM~G@N>&wqc)>kn{Z{HiL_ouXGwUb+$qZk&+^Vj58+T(w*mg_T__OwN)$=DG z|0w>2{-bm4`p@qfG>%K8ry}vk@VeH9uHU@iS2JDC#NIMpd<*|!)Lp|#dS5*EUR$kVzge{C$`qhdf^iol^;-0%FUt!6Nz~o4~vItd%t}@SL$q_BbzhK8LS7 z*f^YaCBAAZLq*#JDa4mwmd-5}tqnHg0YF45qq$;CAXitHmpP>b?2wu>|EKP;aJ&CL z|7{Ls?L!5uNoG(){}b~>{`(SO)wll+_uLYTSoF;?(BKUrJvQK=pkewxTQY-WgRn6^ zd{z{0Tdw#)vcBZKm`)B0rhzbQ8q&KOlJHLuG zBmk@K`wKi0Ukr~pPq4!c*}6I#iDdUZ!6U;fO}fM)66|^A5H~LtRm@*$VjR%TOCV${j3E1;LDbeD6SsA(zOvtGkB;uUg1H+CX zfWSVSE256PXm&sA#AA*GNze|p$wB~;GDAnPmX=&sjUR%e2Wb8&WQH8wb!ZT7*XA;> z&5FnuXk+4cwZz+!hWw+!R9FP(fB5_?d?EtwT)B*%6{=0*0n;hJZl<* z4w@N71EDOrPxp1;M2LsKDqhweeWUbF<2~pvW$(C5G3^!I$G1*uyAV%yh-qK^SNnaN zZwbSZ-1xZWv~2(9u_tFjg4k+va{fJi|MjnU>c@kvYXt+Emk8I626R)-g`NpYGk84( z@#>b+GkAWYEr%4uyvSmMZoIn5Woayva^>+CreWf#)>o~|hZl~2E<2ZS!r*S=Ipa5% zGDb!(w=ZBiCJI}=)!UjFC&`diNy9hvZ@!GYb5->G33E))3&X&NlVSZy{dpW}Rr()s zMY}c0uZIs@4eosy-4MtU50q-I_~=RKd=S+VD{)?8#P0LpU$ubt$CbP1oJzI6X{4&a z6i@L-=wEvKKLPI#5b!RI#f@88T9MYeJKEMtpfd`4R~-yXxSJNcxSG18dlov}JXf$l zN}QXM`rG~RV#6$ntzD-VT;&W2Nr`1Q3CI4*Cjm}T8balS00aO)$TW$e0q0{Zm5@Vc^;06c`5z%8rGAJZTl5{E)Gu0Ug5JC(lg-*dF3BX`dNeaQBGJ!&; zaR!rMoN;6ToHK@;2r&sJK`^Lv#2^SJl}a*cR63#(Bpv7kMu_#-2db2+KBTWkA87T_ z>VQclKrnPvUDA)GB$c37A5|4vK!@p;z>B z{=4fzVq@{#6&YGkoe?df^zn_c)Ezm-*;v&4;k>-%*;^hMabA_x*H>K@)C?%1h3PH5*z@w%xZ!H-{fvfIfU0HZ5wg#9h6qfR{DYQ(l8nvm2skKqBs8J(Ei6Nu1vS#YH z4kM_=j&%hsFN#`B40m0xMO4*NVmC)kF;_$_wQ1TFQBe_d#gw*V6`QG}qNoFcfrGgs z=z3zsL@ns5xn_N1z_b{mn1-UdT3!ux5H(E|(=bd!m#D>5yJA&S#cD$pH9*uVf{Ko) zgJG)L1VaT=OsuAg3aDwb8kVuDf!!3uu&SY=m=*)OiD@W;MQaHW(QQl@eQQh;3m~Y9 zm|{0g(?CrG)3m9`m?(mXT5X`BqG~bKCZdLkB1PtyWkL`kDFE>Merb{e_9f^i7mtLf}LcnQ2p}$?9HzVFS>3Y<5G7|wEa7+Q6txQRE(sX`1@FVG2N9f zR%FV5@2i0IZ_KajG~a0H%2gH}Cm>4St#)6f0gR@r{QE?ePwsUk)d{TT2u@2#Hm3vL z4;#Q-b^Mq4lGpe6*=JbJC7W2w#SOjdt;u##qQe&RvQGKuapg2Y6;&rfBZ;jay&5qs zz3goZ^Ge_uVrS@YeMo({#Q-xQSsC}`|nk3^BXXy`o^aIv_kb2&ff5O z{9}_WYKe!H8)Mc7PghhiN-UvMsZ6izpV>xz3Ng9^$8r76c1jFA+?v}9Iref$XSe{| za3eft4r*J4am{oGk;qq>c{p@doN2-Iua5=5NB&I_HE$`8Q$RE>?B(g;*F}je~xtOkjYRl)wdd z#1MF`?=Uj-JUFG~guns4Nmes~JZ7O06e^Wu0!de=IH}sAk%++r1a2n_k#V!oiJU1* z0^poyctl`CoKXR)hXX?Zj=(uEhny84t_i>yGKRcxA`pc_p)n{RAv%)^6e^+sNirD( z!X!hY5>l^5kOb??8t6*`tdcG<5$jcSSp%unsCpP02}y#XGBI>P3aJ_p3Ihq~cJ(bW>N`7y007>Gi+}|f0BFN`AOZvc!$J(hid&M!O03rMa7Nr#L{X*e zfwd}7l(sCd$|@QwKKAL>GzOGf`nWP~UB1+c?SHkb*uEZYm`6iaWr=z*7DK}^$NEyY zzLmC@N<%{9-BQ1nSJxrkvZ7Ir7DKg2i?P&MijG@A)sc>%IeZ8rdz12 zT0z$cVkvKq1al&tT4wBNOx-qUQ8-A&OSQ}{ zkIM7zUUS+|O1NYLOh&a9?ag^1=!=}+JO<~d**rpOrCKY1}5ST*JoVGe0B_-bP z(Pu5eAsMUblXxj{gLyg^%kboV;kEF>)YS>5Lmj}uLJx~1X{fNu`K=zYF678DX|vRc zT@05xrW2R}EH!io!BUs)a?lxwNuvP+fTWS&vVrgbMA1W9HIpC+sR}hS>FNk(jiPXp zQ+6?8U1H-0elRmEXNj6n=M2*wd z^}HYNKlmQ~$uEDg<95yPJn``t{}BemN0k_pt-n}CiMf>NdG@XM{D%X*L*@oJPJ z;^UfG+uT$g(>jDNpDZoKw)W7&@1sm3RMdaibn`lRgNErDRC6d*d|z&SsAKD+B8E!) zD4qzWmThbJ*!z%Tytspo60fRyV+>PK#H{uPE|{r)miomov) zRP2UezSXd^5wVCWqNb={!@w35zz{g1VntO|P>X^(SWUH;BQ{4d5c}#eLR>Dq9&$T z)n*sdG!+LC3V4{rmJsei# zIkfsPqa0<+k+u)ZpWU&b8Tu*pjDgu86FwW_|4ex3<;h3{Az1`%-RJc=z>Ar{uB;D> ze|&bJA3u&N8*Jh-+(#6w2;kOoUAK`&2ySe4=Kb{7rrxk zHcajN8?G~5_0#8Ij}?$OEr@yHxSL|#^UnS!gA{!KQu*Bcd|nm%i=E_cns(QTzs=S6 zJMELUDTdjpR2dvdpq9f*ceOt>4G^bR;LLcqP(ID3wJJH8uJ5H>N~#l zK7Di$BxQC6Wia^_!l(|H#uMF#vFd-wMCxRwa{o4)`V91NaS9KQHh%*!y`V3oodTi=pCkWqoMeEs}NppYZj2F1T*5H%yI(=>giMQoOqwl*5_d0k)}b>PLNfVcs!}u)UmRS8faiu10v>KMWlBFj&gfb=u>$kT#wu9OR7MU z2=hfu9XPsS5!C2x71Kx#ic?LUz%n2fjM3xFD)S0xSOkzIp^AuLXcl6z)JcE@>VRa@ zIUb&Sg%KoyxSoL*H6k^!le!f|=W0st=_H1UkOH!H$Ue9JN zxnY;C+Nc842)D|xX@W`+77HCN!GMtmj*7l2q^d%%BqA_rFtGptT;UurltFC==2JKW z48x$71M^;VwVcIhbj#pF$T0e0SbWBfZ6Co8O7&&>rutYVY;6vu*jdO@Y%QwddkIq) ztKHmcSW&UXu-brF*-#Z#tC*-o5#-$h#y|%=;c-*dGk%g*l9~=)b@8}0-zx4Y|Hnzy zk20>G8r9x{Zuz?Q{N5k+@_07catXN~&V1BW*N{j+N-C7{Kt?=_l@J6+gm72@!w?4G z5EKwml19Y@Fo^KnjBXt5fRXgI><7n6+M$uu+tdq6i2Lxd!%jPFEvgo)#cJ_A{^RX$ z9s9(sonh0>kLKIW!!s0P)aEvC@uCOAE7uD#Emn)8MNONd6Q|)|im0fVw)NLrSKcZC z7*?CzX1CcbrYIQrbh3B@K#cjYl3$Gaed43du=Uwd@wGVVS-|QD2#>V30-{^whyVZp 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 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

(F^qz#qi)vg|A1U$sa z2OPedAFV1u!w%N~);R!R;7IS~P^~jvPqyWMj@?=CEI+Y1Hg0!Ne729*|8A?No}}E= z6>r18D(Iv6Ny^8OV!z|1p9A>zuW`NQ`TAgmXc_NC&&+)N;ri6GL~d2hi<^HAm*qU4m`y*aJl8?p{Qd*|u5*Z7pee&*5^{#iTlD75{)N9sSy zgnFjzqe!U~H-c2!Ef4o`?EJG}sNUOptj6VZX|K9`_nNjN_mIx^UFVFaAcRcHt!p2+$ z7%nWu{+LL6YC;DJ9<+YRPlLLDx`}cM8 zr97w8p&p)-Shv9=-boinj5!a65BVP1DcXDcMJlV0zgko(=&D+xP&rNMlm)L!$wZzU zh~mH#(_awJ6V02u!KiUsDjEe`%i4PvU+Kqbd<9VKzV`;eIpl``vTHWiHR7{JTe;VL-l*vWh{n>;Rp90$N$9wLAn zFt(^@xm$R3i{9ivcCNnhc>?bl&kvlk#WR>k0 z(%@QZUynq?Vhl>{Nz+C*U8NToSK`z!- zClV2gKAVK|A+F9mBI$;j;N*=`Ri$X8+vp;?7Ma?PYBX(RO@Lh;+?Y$0G*99AP02cE zj24y91TAwb9d?3h`M9CSs5jFRf|W?%0KVEV!&`i^huQsd3@2A^D62yWFEU`TogAEC zg%~!JsIHYtS^xd;emL0^l=hkcWuw4G5N}7JuUjxE1Un(H>IEb0CSHIBmV+*jOTJ8xx zZTJ8o{Z#D3Om5tpJ(s}mDVI&&cs)gXGln z?Ng&E*Ck%l8XbN_pAmMRlA3~|^XRbbJEWldk+n&f}$ zI{LK~KK1-+h-Aa|v%kAfwf5#|<gVTKuXGwj0g?`~ufaN(xS}&e8gx zjNLi$TFPOMc;=jB9<{CM=IfH^en(v-@4=5LZ%Kw)k2~cq zu|aUC_zh6)e@^PbqS%Bi?cy(zSDlsF=VkZMg0WxgyzgGXAJ$apLltk80qfK_+PDR7 z8>Z^F4g^q?GqTLA+A>sun3(jTnzM;x8!BX?MK#W__bE=5Atst#1*5BTm)XT+fpZbC ze2F--tgD6mrBI73K2BpxG_e&@RAs`2Plx*Eh$!fipGKIe@FnzDD2=NKXHaUKO!y7b zi-_idIYo}P(L750Iir4fkT?tuDmKOIk&)wm05v|-49;lYe751}7;IWNp9Jn>B2DF$ zfllh6aX%MncIx2o(m*6Nh^xtGN2_J9QRO)t2#6YgPK~fQ0BBb|x6Y@}mL7Hihb%%*5=GOyhTC_sr1@Fqq7 z9PbC7I1l1(9LEk1hyL}f>r@hC`68POKlrGCPH?Uv4r1h2K5I3V-rDSDQ#IXucN)r9 zu`AaLn${YP@44sOY#-xkA*=#MwR}?~kMea?Deo z%-Y+Pd0;&4$6l37kx!86R8>{j?`&%@p<6Y9hHY(`|CEO_Y`klgwa=a$#8!m5gP2G$ zL#{Y2>&{^k71;j1hv_M6iAA z3m`DUCD;P@fge>N84X6R>@-4zDmX{bcM=Bm5Y>?(Yn^(&vs(UvLU9IcdKUQNOnhk< zw5OjFuz&bHRa*b^<+s?hP#M*8w{2&76=vL|Z+?@%oRXmL7DET_tDiFLJ@^fEZ;)(# zIuT}kLhtn)!oRqF5+6lv{l44E=u|P7l_@*1D&iV`?=bsIPjK_sP4e_1-0*PqyR`gL zG^i9W!twTApq=51oy>(ZtVQd9kWYhMzlyIE7VRF>{-o8W+|cvw+oP4-kb}F?kJ10~n)dT8 z&BEf-At5o0H`8}wON$?%P4Bw>@qcseJayshu;JP3=EEbq0aE2Y4u$7kJMgdJ9}{X{ z9je@F;4GP?hkv{Eb?bqD(}@Iaa^bGzuYRD*m9(x?6_4YaP5DdK%42YltX%y}T7su< z_T8x;r4M9}r4|3#oAlkilmnB~%ThJt$5)tYik{AoG|N}i(a8Ux5%(e$^7=<9A1D#P z38xrl$BE173ng{LaVPtwOW7uibAlsMvOoaNyrK%x8rT3*NK0&FIH z3Q(cXc9vP_3Y+`r#lf=x2q33g9akBL8Jj1V6%DcDKmc<4`ut|eX4M=#zU-5OgtLge zt&F^gcp^9&lCL4m3n??t0f0<10K85`(FlLeqP=~ip|8iIJEl7yXF zx=_qzwO9Y&5Dbuw0$~6Ak02z%eymx4d;OE^O-bXQPKg7woYWN-?l*XhOli_GN7h47U_rMG{btqHy2ZVOEz^{>-n|JRHNO1UwaJf9 z39&+^?Rc4_s6=UqyGQ-}q9~&y{Z>iZx0VmUs7|J?RMZaTK2h^+T02nF2IWLQCSED` zCNHQ!Jh`N)X~PO$rpMwE;em&|yId9IBP(y|R+i1^itwtAd1n0zE#W4J=BAx6e0@&i zp%EIrSma76n<}v`%y~?bv36Aocz}Hq^z}SmGuPAOnc31up!WX!r^H%jmr4dIif%+= zW%mp3m|HQKTBvKx4x~D*~O0 z5s16UVJfjyCvezmREAKYxpmq|-8BKz&vasnSJO=JWU|Jlq?cAQT@*EN86=VBZj}); z2doQrcVOS@OCshr4)KN=dJsuQbg1VLvr}|{AXA44gGg%fDx*PXt0Hik-Ml?o-PeLwlLqdx!ICqjzQ-r=*>}|9@I`Dw>cnSjb`jo%=`t6hcTxsAhL?UINHldCumGh(`NejYMf&D_^z10*Y) zVNsv0#r_tO#4V;+frIeqW{^ax@Q7-zTpS<(Cu7HvgPUzlD$+A&@bQ_BRQTX@+1?Ws zexR-$j1kQ#LQIIS0hFn1aF_M5^UwHTZa}UXSpCpE2;+SxT0CigPU27$4CB06al9RU zF-gJ>Q7l8LQ&AVCIZH4g8$no`O+q3%3y$MYl7>|H^aHr#0lmrhfn3W1fX70o;sDEB zz=-35N;ry;XE<7LOZszETcT*rP3VtbO@GpDb%V7&_1I`2AJpPI&b^TtZcq1^_eW2i z^b|`@+>-k-ex{20Y_d_H-#w#Ai%Jby(3UYSsna3JT!9zLO=kBi@tTfd5N<$Y{nnPE zkQUKe_$(GX;F4c#F-E~->Y$73A2KW&7c4NIo7XSb_~EdwG_84hw>5u(lS4yDE358_ zuYbmZ=J%H5@{gCn$vx^Qq{BYPMEJje9&}-vyCB?TMbIi*@?wy4ca5Lbjle%Bx{c)L z?%I=*8mHBgor`L%OC6j+5*{M8^cveM&NCxWIH^h(>@qse;e5_Ce9)=0CjeLzt z--}aRFhDVNHJSo4e@LKva6_}(@U7U^Dy1-`Iu5+~X}6fYv6 zrT`#RsNpFN67vvWj5*uOT35uIfZ?X1U?RvK9Lb6Y)uWiK*z>R_8rr8jm>dk@(-87} zPT)%k+pwm+u}W0oP!aN(Xnh`Jv(PbgTJYnjt`}8>_vFipJ8Kaivs$*xX14BI2{q}z zt-o_^%`CyB%D2Vq>dsd@&W>(PG7!*B{1s)hQPgj$`QQ7$7ya7KY!!u@UN;qkdG$>C z?><=n+$zd$7IU{8W2$c73BbyVBm^oh=Dw>r95f?H8GdOWVNN|WZT9Xs&G3`=+vVKN zKKg#b+4JK|psVf_&tBvwmA#_dvvX8Rr=7+%WP_W$na-lXqq%!`|7=cSY5^CPj^-K; zR-`Vp5PEfzAoINS^-+F(p6Q(OV+Lo=H zm3&spiY?K4BCp*PcYc(XMhyB(lN*nf3#$Z(^b~ zLL@#T2qY8VAUdHQO6FEl1N$0W-cU1vn!U?Z)T^UKu&*-#oNDo0P=EDO$VW5ocgFvH zG3I)g4hEc=6wI>!Sfip2M?2~UA##T500kqF+}3@3qF~|p4ah^+%iLvtS>mQuP8*OM z$3R_m5C{b1g(*v`q^=YDD_kCeG64LIaV>}Kl%N{UO1LCREgOl=t!zZTOVXShaT1db2oHbd5uRuIHk6e?g6`V=y(XOtN(K0KUEQgW@|EJT!)>BkUGKx%-6 zVM=*29Goz~iR%MI&OcmQ5u_gT9P{x990H|6RS85}zw}LQNP|5qykVkP(#VKQfy5V+`)0MZ)keSno3RGcayE$PDO}$s8GL>F_!8(Qx({9lw2cv zF0Aa_cByxW4;D85BD;!MH4b%_cVfSlQPC0+PmE*oN8iggPVuom07wl9>v)E7b8#we zlj3upOj4|3xA84IxZAbZtiSI`)#pq7jjuQEni{$x5HUvf_8K7*@QeoAU@aqGeVeDtD7;Qi*`CUP0A~rT?-#=qnPMlkeNeELEdd2~3#R6PG0|8d%4u-mn7Q4qJ zijOms0i%s78qH)>7&$w;TEUz|K!^dSzHk|9dT79Er4;XLVHiM+(UeeXo6_X&Tg{VV zNwi#AVE9t7MkHq3WFKJ~o>o-f_THp6DfS^rI@*^Xw*lkw z4LHk^QlZ{EFGJ;{Zy$iBBG3<`AKgMd`9qOAxqA7fedPDjUps%Q<#M_vZ(p}U#y@E; z72$L$cl-6NQH=E=dFe8$?R@F8k?mUy2J>RUtncI4dQmSArh~>Kv87_+7m)D(Ncvhvt4I zyLOScDR}X}%L6|Wy5a%1x>>QCUwppbVC|l)sy|=1bjdN6(5bZekzt}a$?ST`g8Z|b zw6|A)HMUQ^kA@Q|gAeM6!cvqK&8GqfcOOR6E`8!JyyrXIcJtMW#yQf2d~VA8h@XYa zE5+A1uZ_?O2=uCJ@H7W-CEGD~g>)_>-b^|0_sR(st6(T=UZq-Z^Bp`V?((s0np3Q! za4CnoUke12&zwK2;FTSBOb??0idZs`5_4AXQ;-{mgE+D|LM?~3OMTUf zmWRkhb)n>x$o3oq7*_;m*%t-?$BftKv?eC$vx}1zv(Vgl+xj$^iiB$r5(ePX*Uc3w zs?iT#zF#q7W<#vd-B6jhKZ(=_|V&k2UtQ62t2}wv4cH%ZLli?Iqkp|_&#pNMDl0aMGE`X&1+4H_) zo~h2T{QflHgz+wbYnO*3QI<1M#H`{uU|N@QO;c@1nsr+wJ>T@Bhv4qdwuKwN(I5G0 zeqNO~gGXWD!HT2!CYp50quNWP_ppMkBMCOf_fzsMEmncVzi?1bQFmb)&Ptzj#+3b(0sG?q8-uB8a4; z78~c=->waUV+P!(iX~<|Ar;V(@@K$ZaU%uv{j3( zV$ZOqckF{hVDpz_(%O6q!W-QRTVEJUWjiOtkIFc6#rSK6V9($4(Xa-}!*C9Zb-^f& zt>PE7Vru6Zv?a^1uAjyQ=v@_c~W#=yo5k94jZEW!v%!}mdN;$;Tfn#bvE9w8;=q%*$R>&(4!d) z3oNw~0~#<$e;D4=bY%xE!6nSW^IqZVTqa9bg6Pq+#AgthM*4tD=L$-xD3L6|6|S_ zZq|81|KZyb$l!~F9~|g!M+!|BQbOD~#V&ZijS_fZ*r(HWb++ruf3Mt43T8V0dVP%Y zy>m}F_m>p$CLvVzaQ0K%}@NO=ZYxxn;JDCf&%M@ z_R3YHtozovKV^+S8Cm`h_RC{_?UhgfXQ;Tl>@VJycv?-?9n(F@dzVQ!c3&Lt{m=f{ zzy~{1-=zROVE& zwT%xFg5?NVIN;l6QaF!)kSpTm`fsFPxk^FIdUTE}M>jW7i2s}m=hdOCNSK29xN#&t z?^RSLGMQ5yASoz}CyS{B>Y_ve8Ent!oLYlQgVL!XV@n)!9qf|>x8c6;0I;m(6$dhE zl+6sr{bs>9c79n6%<P)KOr6bi{;|sUqM|COq!&gH-Joq1qXuTWDqstUChG7F z?3t!P2Mt{Z^s0YrY0N^^eDU|OUzSa>i^5uCzZ|t(o81wgwJOKe6lu@J$HZ$RBc(hS zK07!si!0BFJGZwLyLX3gwDxW15~!ke4})jep&CsEE(+*Zz(F-(KjCb$Bb zy+ipDoETb_*TCpn2m8iJNIE68qm#898gpK)h<%%APqhsmg7DIc2=iom2Nr{7ziY*y zAdMtSri7*>w}_$cHaX5%gbEf)Q1FF{(2FFGxjNHRgUKwUtJ5i^I-jjNPj&=JVkwbH zqhGR?1}pF)^9INkoM9`D6pV2YGu$RD{6N>BHQlKzl7|W}5w1MK;>ZnLaS=i0C6h$p zYt+#j%g663npR)=C6RT3!_f{aKuLnWakSG!PWxbHaHH_-Q$7Xk^nX|VE&*NWr=}m7R zHXrrI%G+N1InOq(G_A9XQ@xqD8?KzL^Qs^Rv(ZhmWea{^79tOM(tdy+#GK*(`J}Pw z^ef8LFS`tx3BydNoRd*uhOf}xxP|C}-U6W}3 z>JT7%!#q$gtR&i18t4)LmlHTO#8m{#E!~A+0UDM7XRM1ITR5DrP=w?Z<5s(jq*zBw z>IO%vm5u6})$*w&si=#mHx%Kb_~X*EM2@Yd$LVt?rxU9I05y5ter~%{=H@QJ?CVFF zj2c&A1`L6ybqdAJ261O0`w&10{Wu_kw+v=B2+A=RjW&xmm7n3`bk)VRpieeVo3Sq4 zdp1p-p-Q;lVVkV(?6Yhh^g7vQA#0uX6wwCLZmQ>TcvPWEJj%1OdYxQDPN?L|=g&b3 zR%QW5U=X_mcntxNpdhYV0LWW&HKwSwb0J<#rI^&-S2FDX)cjX@9LBg zjQZ2N)mVDkkRWJNzjonG0KdltAL4`464r+A6BL-Z3I75zZ=WQ zzRK99X;+8BEi zXY4ki$vL(#HTX;?UR|%4xK1TfD9?3)uHsr0&UBYKal{?yAo4kTegWl-f@X_UGlvKa zX4ZWl61hxL)>V3&d(I#dDbe1B9cy;p1s8RqsliYOF5TJ)pi!h#T5v0g>qo0`Ybpxs z4V51~8>350#yu`E(o(``3Hg$O!Dt3EHCQCH?sdzOAiK6PNQ&=5h{?^1r&VIYu89ng z;&DZI;5tzqQ&vo2n-rzda@utmD65WO_822)#cH8&;9uJ1e3|CajW9qMN-($erd_r> zs?r<wRD_y*rP9*75*8nH{wYZ`tNSuFs=LG_DS3G?&|G~f%DLBb%wsO zk4Eplpq)xT`o*30EK`*fcn-gyY&zP30fr`^eYGnp??e7_9q_yC--(Mt6$TIe^$r4m zJ(Vu;Qztc} zb#pHvB?A6E#(3i(9R2I@=#9SUF$3$jT_JM;BWEUzD0cX$Z_`K z@gvsfk6Jc649$MCYR1-(>`(n+m5~YrSyp!9u)QQr%)Cq^{370 zi}8=@vM)b=o51%b184Hf`DWF$?G5?Hz6v{D>9rR?MY4DP75e12giKlB6St}PAaF_Zi-XFEdaRijH6Aw1>RNV|W>+MDr zK;>j+!b!sH*{J}B1T{Y498`-MAc2qX3EBJ<^Bp&*bq6eZ2*5GFps?g~?tf$GD4w zmu$i83nio1SDF^KbOFi|`ukP)_EFG~dx!4^#K&#BMeHv)*DG(-eUP|#Z|=&udFnUU zCGcttJe)V5t$sKa*WX8JI#Ida+-#lX=c%jj^cviQ2h6VtTRFt=@-WwecqrxK(^tKq zSNxgFdiqb2&k88s}jZIcQn+^09WuwmV z%gULxAP`%@R`1?I4t_a+EMWz(5nJJ4@~C!&%V$r}(uuNW`EOe^(0wH_{##;O4F<}@ zm$919MDm2YkgJa-{&ha|yzqwjuhlL%n5tMp@Vyck z-0IFsaKH1xfaMnKzB3ymJXh6kBp3Jq+7Nguv@qZQX6xo}mz~+IU+<L12=eBt2RYIq(y(I;KFe)1yU ztEF2!d+2|jJjdLK_emXu)aKL~Lq^b^>9;fWH_M-DoQ(Y&)UUAAv3KwInMrJSpzNJ0 zy3C=^rM>2;X zn?X3JU~96gfTRs~Nt`0^IP&;|hNn??7!a|{GcHANKCQZV-#x!>ug#Rd z_2S<0<3G^?Ha=^Af34O&ud{P>YBlCGCP-z=MppSb#aCX}~*ErfAx5GHYg^cDj7oDtz`i6&_pD+6kpI-@Ic`UE7@+0_gcv@ND;rFc5k$Bff z@nOup5HO+Wr;!z6RFVO~(~M;twFxf=W}K0s*IE?oDo5|@qkf;>xbays^hnhDgxZS> zpWI{)@9y=(j}2yFln^CL*xaT4kSBle?G<0o8=p8XcKXc==SO$0zn#)b;DOjHMEORY zyL{b)FP^1u_Kr9%EDg;9-9e5}c)<$1#mQpxW-;X_sV;9r}-|IP^Bn~FaF zyF-D1zIWF1q_dpZ-17_gLjnVNiCjzcr4NhWKC*H$OmRb9WFlL^etf+u^J5!t6nDS1sP)ty2U_F!(fC9tW->pvH(A=mDkViiBeDkn^AcEkRMC zh-`^X^MNAR)1{Q+`!Z^o|NCxN=O|d>L!mf0l(6@^`4RAkd6?B;I4RgUEm%g)$VMWf zijrQ;`A&UPTzALFl1Xr`H=1jzQ&O(usC$i^htZOK_%hk#cgY?~*(hK4dB4IxLy9B^ zcU%2xFy4$?q*4WN1h1)6`!aLss`@$eNU5n1i6e@oM!roj3$>~E*^QyRo5{+*^=kZ$ z_*>sOt*QDhf1T`aUccU#K1buP@eO~>n`<%Yhw8YS2+Cd0Q}t_po7p&#DHR#}W$^6M zdwnwW?S#f;nSrpX^K}1Vo}625mmQ>m%B^NVKtG6a{OV&~?6S6$)~8fbeB}5Sac5X6 zFl|9&eME8Dyw)?+>=7Ha&V$KdOb=rMqfhn(x$CJq!w( zm@wqId*a9E&6~raS(|;WvOc1{XmRC;kFbhAxKD8Fzy>7-N)Km(zBn?B$Iq`BR?HTR?q z!I_++>=WQs@ca|(ecqE(ULmTxo8u3Y6^~hHGxJ<+VL(C7cC!yO1z((+tseJKoUpWM zLsF#K>WdjgU#9UT>(svNv&o<=j3}o9kk_b65yrvG1?A@~BK9ljaw)?U`8l2WA&kE0 z3V^PLxJH(0qTeRS-2b~LTmpNhZ?WFQl&jj-9k8*Ta$Af z!9?KH&`4n}ZeC%IH!1dUNxU4modGKaixfbM5QX6ENc&h66Z_F~ZOb>9q+Zpch44%- zSnmo<6aPoy+`MfBUlt9+qDKthYgN}Li%{Kv*LIeRsLme_>=q8LTlV;0jtR_W9a>qX z_wVR=Nk;j{^ykEZJ5BCcgP>-m*zY(`Y+v*n`WtM?zwObh0B_B#FBAd4f`_>nT6yUP1@2 z)l#&QV8LTFN`Vv#j_fz+?xHaaX0=ebVy%$$^DpHs4MQmbX+A|XndH-3N+h4Q6X0}l zqVp)bEIUic6JSD4)uVNi|ej-?%L9jz4&>T~kRyl^H*v~x{5^0Hc zPE$zWB$u5hPGp3W6^K@?I0ZvQ=pI{#4<)d$-O%`##k~GG9 zW(B%ZcRv)~-rM)|?U~Gf{ulf50?G#T{_1?jq~Pl_$C@D97J;K5hj#)?@?(Eoa8dZP z{U-*SYPmjVxn?7ur4h+n40J(KJdU1db(!4$7#qA|aZ)*r! zi|@zmWt*0`yCe)pt31JFrbyU+%8j$;k+h{H=8~{4xB=)K2K?BpAYx@lO&lJ9X=zd6 za_CNo|6vm788BpSzGfH%NJguWLm2owr76#Qp z9V%Gc09!s=4X}l)g<=EQ;<$l(mc>nO1H(i(&Q2x{mt>$?p~r{Ie?qr+3nl*l;gR30u2(%}-vo_!n7!_DFCpMwmb$sQX}rBVn<#oE)^lJK9tQM>X;NtmkRf-f$0(To zV;N)UW`$&8p=saq6@pS8 zljpX2ET`N?huLOGwFlU8hv~bH%T}DEYyi_dQcQ7aZHNh?*Rhl=P0S{hva(g` zOS%8M7q)-Ra1l~9#nHbfDdgk-PL#S>u>)lMd#U99W%sTiVyTlqK{lZGQYR@n(d$3H zt!b0SyYP^|GuIEhQGOw{6Bncf7_yHC-qf7mhqy+{;!XDMCtm>>xO#5g(EUW*uD?BW z2lV$__p&ejNjpn$PJ0&qCgw`h>-aQ$fhLmoUf;^qG|dD5m|;S>{`{FI&Q&GFSFHx| z^$+D;CY!7DSw)`M1^8EvLl!0Qtm=lV&kWB~ti`=ex4(H#2X$+J4?v zj#Y9CFdXAu4ARqh1t1!+(LtdlB0Ine5RHX?{(P_&-v-I5QIX$-$0V1?jAqF~$+U&M zak3xp{Y+_tw2_*2vrp>A$2Ienj1{;TCZFS(s9LDq5b)TC7sg=SLY01Gj!FyS407c@ zXEtag`zrHY7C^%Iqg=L>0xoeKl#>vbI{#2yEyx$-IfxMe?DX%!!!FgXBdf z<2alu!dtFK<1LP}GwO;S>WRqOCM^559?6I1&y zAYJA+8nydqr4S#rm_PS0UJCHqJ)eoOlDo0n*Wkyi=( zRCZUnr1SaD(X^9`bI}^s9eKf#7{ki3a`Dd&k#`@nx?Rpb*Gy}7$KZ>o8sXtlgNLcXCq#F&xwp?Sr8hQn$1uEdijk zkS0Cih77TY2Az-@2y!ijPPmT`8aVt`uR^mgifZz#9FQVTFjhx~l^N?YU0R70ERz4d zio`C%q%Ad~2a|os6u#v3VXa01llHO-f*~WE-J|tHv4>HL>iEIyn^mf8cD0_C5d+9e zpeT6q%o(&|VLXU#bW>QE$?6X=mvKaVJn z$@<3|G0UHP9EHfE-wwXcdj9qAam+i%W&D~o^MmdMKV>U9Da~ zKcPvKN2VIfi%%Z&_9lJmpHZn#8)akLiPE=?5?pUJA3b$zzf(AQsiAcSY@Y4syXW}( z@2IxYQq4sdzQwoL`HH8lNASlY0$Kdg&&85%j7D?wV{fkE=I`Zqe3JcXZP${8xJt{} z{ONf1OaSu+M{i5>h1@^?IcT~n9+S$_jsr}$YP?=a8j%%}e<)RuWYGdkRn0*4+X1fL zdNRjtHR4B|*BunBgCR53E;lfqh$igj82c7s)ujXF=E$KfcB|1`YU>G3)w9sqXeN#` zKOY7eg;^;0*077MynQAnDa;ITu-b@)s#12sP>mCRgh)|kMYcFV%1NY(GnF4P$er2{ z4M}47ab{R&fmDK`Dffj`?36|1*Ts3uMrvFe#4BdVn>D6vX{ETr2BJ<(Sj;yeGl=c8 zuEBBIit4lDSsoBlZA7I3gj3*U54}V4%^}@2X3Z41U@$hD#zlsNh>su?%yY20#8d!h zd!i+$=$Ukf=_OG-Up#O8B;SQo`sV-`z_eT0coZLd^40r3MsPsfa+3Y8%sPV$pA2-I z(y~eW-F--yub#AtxdivFqDSBdBz9Z^%g4?NbZ=gMq8ymaGN>=}p3IDTFDZ$^vIdtT z3aTphG|Ze)21bcS>do*lnL(4@ap_R%u&|Sn@EP)b3-d_yOb4^A8yvYE3B4>1b8tRC z+~vg0fai|BkZwQWZ#8b!w{(*Lt&^hX<-tFn6Z?c|By}0D%uestdCb#ie4$zGO)v0Y zzgJW76fB>S+XU+-BaMpxA?@naup?Fr?^)=_gkhAGT=I+`IX`U?wkr=d@_p=DkmEj@ zMyZ5}d=kxHScV7B0eC=`FcuFT3}sCO#m3Y@ow~DNb*& z;yqQzYAGUB;@J*6hO^bY86vIvC1L~Zoc3~lrb-QmIW96Qx7;aoc5ahLq@=ixoT`*g z;*gwU;+I5!)y;U~q$Ovq>+P_`& zZ}lc^&LgRw^8EO7;jOnnl-q7e+We3ZOM=rbjh*=-^JhTmS<;EdTrGo0lcVmQ?lHNy zp^Uy5|0|^jUTbY8y~my3pEI9<`6NLv)^2(KSnDwtH}x223Aj0%)5cz3Ik4UOwh)s0 ztsQ#h^oxHu`7D#mh=mi!r#zlrT?~5k?-9bM(e~g)2iX3BwY!~D!OQJzkjOu=z2f}8wb(K)=hxYmP`Rjk5H~p+Q{WrQDM8&MlN8I^;h&u16 zq{IIGqvAp|oS|tUjuf@Pt(Cbanke92xH0!iZ8!;W%Okn^|bc>)#J9F)gdll2Iw&E-}z=|>aYYpNQy!U zD2gg|A)Y;Z_;L7pL4e?FlE@pRL{;*jwzHogJIUMpoNR0%hl9DN#*AE;X=>T=rxb8* z~m@ z$;RQCDI?7-@EDN9k!5IW0Y)cV)Y$VRkIHUE0rD(W*)ZF+G$QA=jO?zrLE=2j0>w-e)Tfj%}F${`$><09V-FxcWx|*dGGIP6CYHJ`DaI>}FqDw^)Av zNvIl*p+pGt1M{lba1J>J&Ck{C&qsHETBz3awk*$5^LNFGD{$Wfir%3$Iy5qg9-u`h z`}bMWWbH*m>C*>=S|r8}tuBm}ZRL)P+e}QRA&|*Wkwtm4dXu7Vap!iXD3Q{BFY=u6 z^|vKVCSn%bm;WpzlQNY)O%iBSe6Lp3qVxK{#l{Enj26sj9EmCBV*v+-D!Po%(u$Ipm`rrW2Q}?#NLztx3f9g%WdYwfjexdNax@UFrbzWUlbOa; zw9kOT3r^u8k=8-FE4wM=#w2e#jU4a?Z#FHYCUd*6?&KUK`i$Hg7HG?MPTg9?S{gsD zRPTf;&%H**zmHlCSul;8U^Pdg(UKZt=I6SkNtN{`{258QG%qNjO@d`Lw-yY%IZe5c zSwhf4w<+Ku8m7&7`l`r0pp;twjM!L3;ukHIcT=GcDS-yd(LSlA$CNDvdszX9`q0yBoYqD}|iHN(RPcsUdM@Kh? z8+s2rbrQZSew@@UeO0tEqZF}-|99gnksbnRd1|d+cI&IHnj!Yjxj?%JyzbohPabrx ziVx>R>yET&wV%U}AD-4%KUtExukR>$-O(K*;D@a=1zLw;Eu;fG3KR?)osn5 zS5E@kH85tbU)Lu`F8!|fJm&cjeR2HkP6G3DwA<~ry)SgV9q~AyM{}rapFf;iIDt&A zOW$Ps(#w{8>HD?#0K5%DW2b=s_R*u`E-`1$T+a`lMA_6xbH^-yzse(_t+YS&GJeN( z^mE(j!|R5T12??dSO`bQ@hyud>QBtM8hguQ2B-{>v{15|qN36P#tdWKoRP{LR(TRw_rTLuQ9Wa@fCnvOE?<96 zcE|@L@5gRov_qEN7O9tjNwBi$DQpP48us$h;V9jqXO`@RHflwzqjnM?hppVSDhJCO zK(?uyVQv2gwp-ZLEnr%$t>7S#)0=BlmKSS$ddtw`nrxKFquLpBPRKA#-l#E8PR)P^ z!i(oo)(6ghB=PZ(!qx}@5>-`oRuIl>HJo}kBW3wO2JG8CHl}5t5UV5?P#lnPIKgNoyf)6zy!_2?%73-vOze2k z-e@~*z8<~pQeAO;&DVFvNfG-pvK(48a`j10H!1R>w<_Mz3IDQWHUwYNrtu`35u;>M zv@1c#WMc7w`8k8y;RU$h@b&5C56a1G_T4#kUcTZPIa9v#-97UcOrO25LkMxocWx^$ zTU8ZBJ7-jhrxoSRkE9!&@^%s%snoDyJf$^_I`^t{8C$wMW;pcdkZ6%>MVbsMRacz* z=5_9Q+qQ+qD!6GnYr}<7>D`7VW`cr5d#3ZkPElhZoThosx2?c53x!pdm!~=}lUAKy ziDWppDvi<*nSqrA4H3Z%a#9s>o$M?cjg=flRFj;`oIk*!l&WL}Ji4usqEpY~D2N;G zOqZzlIzHFhC;@M*n~C-wvh8(LhOrYU_}Wz?t?I(&vCDJ*Kt8+?+c{c2y!phIF2)Fh z5v5Di=d@kB{m?k`A$gdG9U!Ywznkh#+uC?Bvg1Yfnkwh?58N8vz|c{2&-MdP?eNdcT-ym!%zqG z?1;FJr1HYH==Uo|pqKm$2!0pQ<|;JX(C-b$(%)h6ng+KT9@uT(EdFTLJN~X?O8#(8 z_XYO^U|90gDfuGd@8|M9?5(^nxa9W@SKa<*1?h+vy@QVF=upsY$`3sE?iTJ>iFfv4 zCHZnB|KjV|yiZvvf}A{Wy$S1Nmg+%xNdOx_Svxg93x^@{LN zx{ow>Znoj@c&g#{^T8)i1e)Jk@w`X4jG5PDf+dG^MNz5TVsFfuvLf!Fu(0t|tnye+ znnT|BM#A5{992lI{v_LvFY=t>NRTO~L6Vw(S({x7>)$>Oh5F~!-psIEBZ_df&LSa7 zfHE~hLT0!u4_Cb!m@m;lT0u5Twh^rXf^p|(Ba;+(8l$-QbEy{IaL_al%pH;hGFyL| z^L|*ClP9^B4=~^v@#ZPS3FcpxczGCrFeQ(_!Acn9VbKtE1OY;|8Hs`=RpzRrbFi=g z>Yxt-a+GuO&v)OgyBPCZSdp#P769-&uGZ2p(Y%l$>gm^1`^T{T7J<$o*-84%f*JIYU{Dvy)tJ5_H&9A*e&D+i} znM@5`BFMi|#g-1MTT||G^l59%l?y5TV0OdY0XZxZtu_^2&L3M`-$Z|B&5W_ z!5Uy&;7uWuXtV|dOb?oy|zPWlh0eLVL`Jjn{E|CZ&m_gSSUP zSp41+{5`HG5d?21k6>FBxd^mTNz>uZ=&d3ozaR>O8w#P7FjtDNJFl#ayB|Fp<311c$~IiLRTiVeN2EQb7SG~OUoy;=`!ZIX z9p0jQwVr%TaOo`@ea^9pb#s)6Q2){%V?wPQQ3? zKXm5)^@!i$KPJE4e{}drW6_T9-muUv`$?RwjEHeOBQC6m&DL#;)nd857c-dSINWaO zSM*?)v|6Shso%0tf4;hcR;XX=Z1j&$sysJtt8OnrRmlB(uV& z3V87#AEYc?SGrX@toX*y-kmew$C)Z9V)e0)hHc}0c76^jv z7Mh(Szm}C=2Sl8FERHfQQ>)AcmK&-HvcRrfX{JN6Sr$VqiiM4D4r`r2OIX+`@}Rb` z5*7_IXgdooP9F9daee>hGo5zKOBb)D7Eq>d*U6@(>E+Py4s<5O2m{>SVnYE`QfA%} zz-jZ49H^FyQwD0xz3TeFR*C=8s-MiWc~+!21SwaL5a-rxM%2^S<15*|+=?#bVgQc*oEE*Jf%-MRn5rMR+*vh=DV zFO*Ofc5E4ysWn>q!QMVYe|WmEFw9YKMgbG)J0sKVeq|?pyi(>J`Qyz^mC49175ig! zmjefXMg6z#{VmOOyRtihQY$8zkp+xYiO?Cjmr;BgWARRyT||pmi;Yx0G1$^FP!YJ( z^?v7moie9f(V}70a66$ofV4yTe(pWY&U0(o!RPX5RN!VFdrh~pl3$5$O_ZXj6T|jZ zM4$mGv57(@79lX*f*=G{(-Rx*gr>WiG-uPQ z8+i%K)+y(G`rURHr56pDM4IzQA`CWLRI~&XSSp&_t54FBm zooPI>qc>T`bu5fNihFsWw=s>lc3*)p8YMrhW_a@7XlZsBuqc7pKgV(Um7L*MlbsaU4%{gnC!QYO=sXfY6#Y~wX;fmk(soKEI}n!yD!rDc4008ewFs_FyA;K|28 zTX7y~AP*0kvr-7F%OPC|>x$o(%ZtZ7im%F%Rs4S2*&vw>LN}~ArPxE^%F_UG)E;AD z_GC124BM+uSuF&JJhJmuEH=LhFwsxubynXYisH?gs#ZuNPAofJIi1QTLAxoDo&o^; zCFRq=Fu-KoeIB1MAQE-V`RoK-Ec|oy-oLYVN38;xgN0}D4Q4E`WyF+EJz9E#;?$mc zA}!;E^WwqCc?&Mo%OMHeuj)@uIE<5{o0~@aw4Lcz7>Nk!ym6?eVA`N)5FfV zhP$QZx-V1&>1LS6ZJz1(9JSE#ulw?TatB7unulX!0sASTt2= z3;0;o{2nSdrMSOh=wON*uCnEf!U(zqI#|~fIE%S)bXTi7C%qKCd2qrEh2jTd+E}Ok zuBC|@5<5Y(5XB%d32-|xWgZf*ragm3bar4Ap*W40ez-QMn7y*2@d$yZo@uMmbm99o zp9U><8F|9c;{hU-()F~--Ux~{ntEe;&t4QV zmod!EU);D`^MHO?C&TYlhUv%|&u5&gH{738y_Z+WwdGkEXz}=rciTUEAhoctQSiF{ zSkG^MPV0Ys8=$Vqv99EazVBLW{xdf+hq~?we0)IEKM}KYFThc~x%?D^u z(<6fB&3g$acRa7Y@Ef7+|40wMqZl>T4Jy7}D1FYbCp$3e*RumlNRhOFVMCK_3!*i~ zztdq);1RWsq4o-wc^uQy|F5VW6f0!x+xa)@bM^0`FV8J)|Hl5czvdgGI6}%+qdPja zcIn->J`;1JvU!ho_D1Q>EyH$Hg)7v}M$=~Ib!lwPJ$QUEt!{XyqCV-XzNXCXH2Fco z=M31p7T z@}NCI26_52iXx+AZ3s}+Shm*IJdX%KJ^8V3>AUaQcEHgQ4iV8dYL`Kmq zPxltK!ecb6k@M}0ihtQ{j>A7+Ry(0~Qi!E3r$us$K)b~PoGo6CzkjwE$BCEK$!1uN zx?(aUB>W-a?u+)XATHsW@>3M$dU9ZG(f!(B4Tm0gq-905?g;eA)WazXJnN@9PraMG zf4*))Iau)H=aS>}WS1T!ABw5n^Lktwo-KU=XvgLB06zL7hg?HZj9B5`?8wQUg;7VKps52| z5NAJ(6g75m7=dI2f-@|FTVYfZPMPTV*!41kB+8db8>cBaHrE&2W3&u(k}HWQ2ORbZ zoS-4ax(49X_?VI8iGtub1T!&@JLv?+;WO2wWr(NY|(?s$TK<9u~EC5azERAE;U|7%AcC6=YLr%r_3E`)aUse=O$2XzH-+j?3qyt^C(PBz9U^} z;9()*Pn)s$!}qj~E003;%DcZ6UOA?XZht56L(qe!ZfN=kltCzMTwi$~yZRND;K%T=xxSrLce$wk_9ckc?GJMQki1;I zz-_{ZKNU6#Zj5cAUu=C@dbGAvZY7_@hv@Q~*_ReMdUJj6Li0a!B0pu;20t2qH@g2C z1$zxV)lbE!;8XtDb)A@b!5Q?vDr~pduKqhPU*naBWMbGu85#Gbs7I=K?V1KE-Y}%d z-q`&+UzNH+A@X|vuJ^m=XnW%wbf>b##7115)UL&S1<#**f6O-v(-kpF{MwgyR|7h9 zbVmQHhSnunOj3t38TeK_NqHx3?J+M;4G`GiVu;WcgJdS7LTu-_jirs@sZ_E2?NO?M z*DO!F2$!;sw8e9z@Eni4!7No>!dzDKsfDyg{&xK=zjhg!o$NK&NF6XlluuPoC#4(M zuY!%(@?-`5Y!j1_<&S|D(ros~dC zLYQN&v4m9B&0;6RV@7G7iRmJW#l{_;xV(a4c64o`cr65#gyrR7f2{l%$yOtfINEoN z|G$C(=6`|#s}_w_ZZPfgAHm=cYmQj+fi>H#d82pJs?1y`DKp9Q{*b8bY%)L@d@GTC z=Vw;#L1=OFPM!}R1?iUTBhuaq^jim&#uBBwxm z7y0>3hJ;-QMQgR}w1Q$gVvT#*bf5ud7*hzdIc60Hw zUTL;cw0ywT<+8HC;LWJZ9FfYPE47Oa#Wj;Vpt!Y`l6g2+L1W3jxe7y7sO}jnL#DKU z?j4h0-V_lmlboGfk05H`j5D2?AvpV$$1Hs2@nS_e&twMM97Mzf0>sgs#tSg>)$e;o z2(pqPv#(Bf+T4^(oKbiOX1JF%uLpLz)s`}P(j2o;3?fEf3iE+bqClcaWss$zZp!Qg7Hw0swDQt$CIJ;5)rnA`G&Kft3y%P# zcUArO@mGu%Mc>!{#zS=7*mH6hsDIRxckSNC*o9lSjAp43Ima*Opmt3) zc<+B#b)RI@lD#4=x?z|9XzQ5Ux4F&-za6s1_W1+Og`g^WPfQ-YLZRBhOLxybc=TC0 zuk@9wIYN|&%gUz5_g?xHu6(JYVa2a?mzTV6m+v>T`SHfaOPgAPa0@^>pck@7Qt5pSsAO>H^z6vnDz<|&;M{*$zv zyT687r{zV|F>oe_PG?5_gOYk4ZmX?KQJLdYQh7f=uf3;kxylMLpCsn0@(>td!{ZhN z+X68@pURo0H-5GNDd}ShPU39lIge*KP7la#uqwT4xRc&M!>1sW&9dAk1Cc51{Pi#k z&A~*Rx-LiH=zSwU8=(mHh~XSrX?DR){nW%3L)8?JEbA6vvrwHGJb%Z9CELUfpu%J=ifpBMVGvYfsB;OvIjUUM z4g@%P^IIaP2{JKIzyZJy1E6I{%hu;Ys8&*Y^?t#ptfuPkFF42ZuDH6Dg+J58_GYbn z7Tk{*jh|mu*RU#ZRek^9-Ep@zs9}#>6PN|(d=B3bkJ@akbC=8xsroc_v^n0^Tx>*- z)X&0V(IwVR_I((C9NUkz?>RC4N_e*`3D;YC;Kcj1o-GNP;&pcIrtL3-ls_RCMiW1d#wdW$?yw05hMC}ml*x-m{g-QP1+ z+)&?a$&BX3L@Tcfde4;cVnK)5JApc{z{oBK69eE-W9NBOuWH}9M!%V^-4k+_O~Bo~N9=#Ud)1#akJJgY8iS@uz>qy8#o$ROl(_qh*iF#ZgxCVD{9=p!kcN}?=*jrd!= zo!h8*6c&OjZ3>R;1t*ncEHx+6o*@oc33O)bi5Nj8E~1*rV^pRI%P(?)__4uq*f9MH5o|~jn)us z0kX%{?Xk!lg-q21ZxfnsVY%N;~UyR+~4AxuqgzrE+J|7;^63QHYp0szI zYDeJY{t5StTqQm^hHUEnq|_9benDQ{F>D~{r|xFi?X?Iq0b=O$*dJjP6~`~$fA*{E z^J|mSb`BXSO3OD+m8{>@`Pc7p3k*p9<-(bFZK&vv9{gVR3O#akY`OWV-)c{@;cIlG z%{}8^z2Crw;e9LnR)t^B{2nz5>b?E;>J3q?(Ql8n)ONDIFyN-m$FRb;oqlNF7>#{6 zxq6@P`M5`d^^5*nYYM~38L=G(5e_{i=XrNPLEUzq(f1?<#;db+Z|#7&t;QL${@ra0 zKlK#+oodecuL=Ka2`Qe^9^Jc)=0;-{kAwGFoHjlKzg*{@d`s_Hh8=w{w@76t``J@! z&%*q1#3Tp*Sgx1iR0q3Y6ySwL9R@izjHcyfGi<{~khHEZbJ826fi02Y&VZA$ zX{HXCM2pQgxq?Xj^)V>yc=dGRs3{n2@TUGL(Bg^g6;E)KmIZ2(oTD>J&XfUIDQTQxfh=p17(QV_t) zBdy^mZ2|Pl;o?h7t*y)q0WCA1xC5`>4oXae0Nw~Jvhg7SNb*Q4#d6K{$c#hK@>;)a z*>k7%?uQF@&)(2Fl#U4b5|LHIlbpq6z{%34RTc|6yu1Bn?U;N<9_|VcQ>?1?3xGq z7Yh5KtBOmbCo#MIu3NK)*WwDZ$uJarOkuwO-Wd{bqGF{2J zK-GjZQ__+bu3dD`nNc*Tj?PF_bS$(JtNkG2XsyAb6VF-u_nPqcjuf!li_Ae;dB@HI zrY**pf9}EX3#?$5%lrpK0hvM>A<~jUB;m6nVuCA&X#CBrioVeOeBxF_`)-6*MD-D} zBSz}!WDA@W*x@Xx!dhXXg?gGodOr@17m4PgbPaVl0FpoJ5Zo^Qh!D)Ds5`x5;?#|~ znthVBz(uO{6UV!GH;G#>@`!rzw?>LgXusaQ`g_s@sKX4!6N zZ2IMfGmD>lMB=!x0#{zYjd(vE@1m5Dysezzd%gEtFEiZ6MbT|vy}xDmtJnf=rto>h z`Ru!QyAL9D-+xIhm5>d(>H$6Y>DRHo^)u`2t4#L5haUWwu{t5SN>%$^VYJQ3!;6M{ z_JQI`(E(55&XkTUCfnV;To%3-w_oRP@@qm62D!6(@vP)}H(1%RB0p~jJo*%oQZ7AH zeY&U#oLp^g20{=x^cGe(&4#oo))R4WGS+EbGmTA9IAdry;8<=+Cm?JYHj+flh@1w84ZT1K4C+ zzxNGso$v`sljYV&ntAjIg_*(T^4&%5{f7Z-)ihE_6^w%3-YttgxyK&=-hb?cp~{?+ z)gvge;IW9>NH6K?J(u`-6-(dk?st`bnS-=HScNUDw2*E#)yA`p?jjmB+Pn(c*(js z!vx*YH8f6J;;=Uw_9|S`Yw+NV=ZWuW{yaOY6I^$ZQF({~L7nSI2J2zbIIH3LkidTj#?#?~$d6f*DOD zNAMg{g=m5s4iKM|KK`Lv%)lC(G(f9gHpY!~vOCTb1%-{loHZv%ja5WW0~LawvC_!f z)Da6ycEIfzTip@+W4D|hT@0C{zB!YBI#(~TAaRh)95)_6rS+`4fFa>kwpho!w zVL$axC*_c#ZTw^7m5?X|Uz3Q0Z2;CBa5@{T!(o$IW%*W;Y;WMnQ+9gusg4B z80w#iQp_2wl};WTX0>NoPA6H&6w8jP1Ia8jOJ~I0J6Ru%4wKYEFZmjuDuDopNhjkw0k23_k8hd-v>&a3zDNrJY&aZ= zU9{-7{#E~dk3Y|UCJ+z*x?fqjYj;T2=6f(25--0%84}ddR&fGt%BXln2)<53tv0E2@-A(Nq+UDa@kA{TARAZvLQiuT)*qRDwn z`J9Z<(o*vw<+FVM43TH=gIW$f{zN=;zqRk7zSVboAoI_Sp1)hk7tDMemw<~6} zV@=~6bk23OnU=S&Tx>nlXSeKln_n`rd_8BeEpIhWGhvDDv-9iYMbwvXxHvi}8B{W06DloHJlLTJD*`bLH^}t^rjii+dka>#_}3`eTow&6^C6Z{@cP0VwW2b(*lhtGR5oO{@AN-kcNK!VJ?Y_usHAN z$-V*{N5_SIVKZjSB#*J{H*U$L02_P~Y`1nmb{5{#A|-}NK=gZAHU<3nTTX57GSpPA zFdRiHezBrv$)hH z(qN6`GcgxUf7%T{Bn4M>RmE=AE?!ebHR!3ukNjT zh=zXa!(R2ik7I3pG|F2jz1U9g4gdOyF8S=O=^A4<+peO&G=$3pt?$Eywxf)h_vX@u zmZ_N0E>a!_F$7|rtErFrWa*YF5Afill$OQ!aN4J^1 zh>BTRnnLtK*!7k>6O=!JF3}d-vvpC5PPs>`MXSo{R~xG8s3}QJgBW8gL1oSg#cG>V zESTo!76oUak%9`*NE3%<`o@Q%m}eRXXF}cX5fv4KD$GzS^!Gc|_XKPmWM-Mv^0}_H zw|*n(xGCdqH~W)+n#L%GPBdg7RRScAg3$VzafucyJ(z(bH*Yg zmRib{ORbcort0!nHkY%XroQ|*Nja072;&6syy1vkE$V^Ya7sv2(fsj5Fzl{2_d(C> zt0$9DPsoIy?@q#F%~!7fRo>~7{?)~?{?0@1fzseNY24AGTHG4pU3F$9-TZ5UD_i?E z-_VKMNC_3bPws_AA<)aIGXjsIydJ!~Ua_QyzO<|3UWe<9Ke+K|>#Fa(<&R9R!Hdgx z%iu#c%xB(bHWds%d=WV`iv4g!CoH&g>CcYxq3jJlmC&EI;lvC#lV*g+rNH`h|8Hfq zv61!R)8~5>P|sVb4^Y3%T2vDD91<3+KAv;39JylQ#`R;R&!g~I`Iml&fqv_N(p`z% ztJ0fv$b;Vkq_f*-WUJ0MaddOOMqftn-`t5|-Nou>0dzr5|Hz};v||f7jbYo-J3AHa zQpkMjj+TLvFN4_kU0niulTM&2LwN_&4KxGm+?0f>>O@wh)R>u0I4qTgc+&8zkr z?^Pd!+Hkcv=$trBIQ7f=S!|S7S+#HI)=Srs%$>(ye~N5x8z^G%@l7|m3-xat_Ds#x zzr8$nj?vYaX>_6U%HhP_RmeIguU`2E=(j?DkEYP8WMf5ikb%4rQgfa*>7$XMDq3C* zQ)flUv6PZDi?tkKy;19Q9hTSM5Mn7iA}z#~1Ly}CpHh$tn=;Jp7?j&gmK9P}2J37B zCQ$;mY*0a&7D{Rh901{9=?2c9oy`z9A4d5)X7Vmq(7_H2f zV+ary7MA5e=mW?`R(I*!6p0ekW9((C=269-5y32gSTx7faPgLHn#xT|*>lythBDj` zBJz4cx*WrXU+F;eRrqVSo7*{vo#{*dLE3GpPK}_y@{TO!yE!HXg=Wdxey8n#3R^e! zqS2XV8&?O96e_#2=JuMirdetqqhpRrVTW&oqK$!hEI_rFJON+x722=Q^$blv(iGxSYB z*%+{E6>?{7u{7+$z0Vp4g;Dce@xqL=;_$tL>l#D-M}9(oHzZ@t^H2q7c^-rXL4z|3 zmSpH}2Qe@>Bdp#^=LIm#6Ft|wmxAb#wzCHug24vG{^B#fW`=+L!3k#;Tg)dZ^%YymX1^- zNDoB;@C*AW$AHg2r!LJXtNl%O$)~I85^p7VicIyV>pyyT$Pc^}m1L&%d>h~Jb$9G_ zrA}XP?zkYoU-GOZ4>ucWJWCkGmB|so&Q1U$3n>s!IE?o-KXAF4Z5AzM^TXc?1YM1S z9w>B7Qam^Ay;J}jX*G8fYlHody4q+}r3Wp+xH%h_uA#$#zN%JoiCBhoyPtJj$M5)G zC#vPSC`>Hf!0EEBK{x?QX+%T<&Ko#iPir^5^J!&m`ul8Ysiy}0!9a?-YD05 zH~E8ZcUimiU#RZ(^1iIWUubBZ5lCK!+7Z0FG%#I`AIZW@By)zQIZ#gwk5WgMUwFKJ zNa3Q3K5hHUQRLRA&VGp)$kpXAybwj#2pe%7^15>Upor9Qtbg}wj@nbGj|=nzj@;E6 z?|lGID)JjXWas6^YV&4;2Mmxf*r<-GzAOhvK6x?MlgTc7;5W)5rIU2AKT45m*?zl{ z_U95GNN)xR%v}muiejR&t)&#TR^M9t;pTEsuPQ71uHn?8!D!L0Il>Z6)M&8Vy^4s7 zjzaQtH`J>rYqmjch9CQ3keAN~tho8T|7tjL?{~@9TjU45IH$*E)vn9r=e`1MT-}%E zf)>7C@jdJC2+3t`Qk|V{DZ2eFgW0%nZz7IUnW8Ts&L;ErDFh0yzVWfgLAALg=AP_^ zC6?n)`gcrWL1KwA;PM{cP==~A@N8ZRk~)8GQ88P<4hg6JkX>tE@?NCPFo7gs!D!XvFu3r%-MzI^@mfe$}?ZN*>jgpTRPgz&`1PaT}csj~?>suQAz3lEVB zUi-9>^T#z=jB>1t@Gb45zy!|H-AMyZyiXq}48g+}OK zJA^jrYB0vY&g6p8%IAXzZt!Xnjdpp#EPlA!t5FPSE3Jms zw3l#jnWoeS;e%eJIGMEGc;0ms>L*d($b%?>tAfyNSK#%S27#ci^(*zwQ?Kopog1Cb zcHwX}+Kbf!yJ&BH1+4L8XEW>eaaO+0(uwIPq8$CAhSn(7%|)&vlJ2Kf*+i9(IO}AL z8!&BAwkB6wwNxA#G(5xClBIgSrFx>;pnamYm|p&_6dI1d%~?eTPwyyDs;82?5G*1~ z8>LDNWv$_fRjeZgV&+@ngvAIIYCWX}DmK!NRHl&tEU>~nqPo#p1UXR9wuBbsb41On zn=r&s422kdi1<)v(<+hyqY^N~BG?i2W=+go3>iPEKk+D^FlC5a%Vban-n`rM| zOr{G$ELhz8Hwb9ceY(U#uxclD?flLQ_Sw5XvN9Fh21dv+57sz@!VALbS6{#F{dHyX z%2ng<9;mH6U>AP;!M!hkte!njST*Pi&T?K#e&xABRgw7C@#?woR7d5v+EIA%ALg5j z{}3l0y*}byaS4D{Tnk^=ho8rtyW_K7ed*69w?{9OD=ee0DJ+14@zuBDf*ND>qAYI8 z1Z3`BJL0<`Gs+D87@c>8FR-um1%C5@@`Uo8}W5WU&@w8e4Y}kIjhK)*xA3glWOfQ7Bm3Z@}gP3P1dPuT9NDtV>J#s?yx$;Ecs=3 zt)`W*`gaAQ>aIJRST@$uX|l4pXJAg|X_XTaeu*MYAb!3^ggINKm#D6@3KpK#$IcGR zvJ?u7s%e^FyH0jV1XoqE*BHGN@X=@U?9}I1wkT@v|NZ>Ky=3+Wvdu*8c0163_S^BD zf6W!4MY`~INIl3oQgOI1cje-`D`M1^)+qsF>FY1h_M*|>E|*=m@4hN6FR@KN_vrk9S^tZf zEx_A-@r(R**RD>cW@d~^D893s(o}8OY~N7p1owP+4T%mG73^|+ZT#rrOq2B-S+5O& z*u2|;-hOi)-|>6p_M)h$ReEILW~5bdNzm>1htAHDNpsZ>Q4f`;m55ZQd6A{&)U(2$Q{LM_i3Don z8e@tm+~$pOn6z8w$9>RLrk{!qDa=kXMn2VF=!x0!-SJn*NU?|CPuF!c^07*ytTk{q(B9dJ;!`!u{V_{Xn$ED zrppn>)Hg8(^3_W>f3BUA!ATGCV)U>XNSat=k+0-A~+~MKK^Xapg@56!eokR1&{sH*cHbj`j z>#yh@-2U^lSLq|le2*OB`o5JRJ3<^rF6Uhzer5wIT}>6rdGkWB3H@c4P>U4NxtlWj z{lmm}!P%4F9FgL!Qw;FUW_941uP&V3H{Ukj{5yQ{&$QsNj5)OnnNA?yN7=`loP!49 z&&VXMeYr4FoIs5Yw(FW(bibWS6b|~1x^%k%^)+>SEvvZWf`3Wx%WjXBhy>>!6BQQ` z?l-n=?z8PaO!(Ipf9nE0`S3LeJ{kM)Gg*FI3VAtZl~yrw_CA+$ZU=pgzg*;D&!~pj zrhMHy(6x_eS6iZEM%XmhnXY{2PuvC239mWt-m2mrWwb4QNtuZ5DoQx9^CjC-n$Qd` zw3+oimhr5*h+FAIQ(XP|iFUue;h-+{fs(0FQB@H~o5@4sn(Kg!$4f5uSazN=*H`6d zPTVzrn%ISsOEbuH<8;WvEdd!0k+){3t}d9TixFLxcPP zs-t8R08mJl29d0YED$a9<}@>n#EPyENQ^&jNZJJ!5r&C-A7)lHW~0d0UJ%fyFd<4zo6GccLo|Jv_7 zt^H5k)!`PGQlrS>j`GKzw4Xd3?s%03ys@xd!N7T-(-dhU|L&Q$y zf5}Wi7BuLR?w6=4=t4A&mLHrE<*SiVlG}v(rMD3nKRCtiVcit3z9V`j z!5r^0N21;4(7_XwZO}Rb+5?xFm2U|u3TD|WOgfM+BZEPOCYg$CDg%!pIIF-itJ~T| zT?;URL2jO+G1A0(j&k2ur5;u9CD>c-7ie!X3NmG@vg0Z(fs#bnWxmZ-DjN_$TI@D!;t zS}Ge}Rs{ff!tdO8Dj?PW%iS?l?|G9(^@2p-YqHOsv96gbyuWJh*oo1Mu9d$iJryG` z_VfIS2d@p*N+th&F*}*eU-u~?cHYZHZsA4g4Yp$U`BU8e!yz^!C#oO)dve-K?rzd4 zX=t0~-I=(`xBbl*FWUNkv(~c_J8O0V>v3&e?Yd0H^uS*|@O*iylCdtA%Ppl~f_>7c z4_{ART*+wzhdFC@BArgCDrRML5EM6$tqW&Y=u48Gc* z71uBSyk+;vq456^^&Z}AKkoZ~%%Z3u5lUY%E3p!*sH#08S|bT!l-N;wv~&@pF>7xv zAwwJ<8`+ElMRC*<(LQ>_m%7b6eh4Vp2 zOF~bBKTdlc#l#`v7WcwsY#Xk)_om#1%O5m%jdWeDHh;>J^w7>fKXu^40XJ>+oLF#s z;i|q^Hp@^}gci$WJc}yVY*(aN30BHgl>ZGm#eSNqBV4NhJLM)e{ll<2)ska+){28+ zXcOv|YVlT|i*-Yu`*BD$jVsHZE#pdP&S28xs8i@d9>*jh#Bixa{$LWwb5xC;Pg*V) zAONv5FSFq)v)uzQpez&s)AAXfRbwnO1LPATqo@dAn#Igw0kMF&JfOS~h^l!mF#|z| zMcKLgl^9`(x^!HFa_h{sTIurLU6A6}ER=P8B72h?O)(B4aSIi}<8sEM%w5@ToeRQp zT*P&W70C2(&sTD90fK!8Ov>2!0r%P9@^gXIz^dk7R*(Fy{1z9bPJ5wBAC7(}7&D4e z)@~GTet!tsDU7Q1dF5LYw!OYP%ot38b?*JR#u_o(N1Z3?#}>g+Selj#FuxYrA{wH^!T<;=Ch z0@Dl9%;FLUPZNy3VcLyWSA>}{U(3TWeBL-tC2^gCZ;+_8sgOq|XbP;34s53ru=BzI zJ4M&xfUo_Kr8x`}COh9q9?xN2#Lf;0fY?&-2+ScpnTP22$Fp_~onm5@f>)%IOc*+m z*4+>yog+mId>)M9<(*G*P;%HM;FV}ai3I?PNK+_+&+K|tvcr(niv>7b6C-ZTmdk=f z13?@qEIef7*K#)_OiVx!}(BzwQBvfPNgP;V5FNPL2KA z2VdbSV=ei+RGd?Z2vI}^eTwCASj4+S%biC)3u+xclFkp)DilR7PRt*V>QAyFeCW%# zJ{I!#>f4+Qh9Dbvo$SWq$XirEN*bg|xvY_g?&>*0TTh)0Qy%q<)&)nD)_! zuu}hax>UBwqCfq0#Ojm!`QTR|zK|Acp9FuJPv{fW*65`VW-bpeIQ$gzVTSH<*RWp8 zjK=1yj~MndMz19;tE@}xu(BZjixl#C9L{XAKSaIyIwm{wV0uO5W!-<$%gODe`$3qJ zf6{)9?_Q3vN63D2Ty)H;55}&vpeDgd+$FpX3a?v;gG-9!{lN28v4_)*&SA-7JNf-R zv-xxRpa3X}IK9#@v>cWr@A$1E(15#z`%L>`Kda$miC)7iPEsZDt>=}ql+QyV_#d8D z7R+S7@uOT-xrE!NMDi*>ITZ-7am8jK{8E|!d5egP}cHFAW5H`#0}00XSLx1 zWtZ9N`m#gi1i~#0&O_LVxGC#Li%Q6%-vYVWC}5Yv*vSb zLJ;2qZebET)<{f$KSsk)|C&ZD6gvRD!(sxmWpyLu{x8#21BmToXGNZJAt~R10t^mk zkC_oIfBjRe0REuI{NYf*8-yEqBlMxlKPRj3D3}Xnhh98=^sjg){{n8?w<{WsKU?7+ zF1qu~YKI*0=P0T|+Y~9RV3~id)D;De_)=+qE$>%p$8>v_OmA3yQ`_O0KTjTCzHlol zSA7=oJnuwt#90(G7i~H{Gc7d$FQ-n24y&igBJF)pNe8+<1E1vSM4C;Grlrs~(=eE5 zM7`N6?$K~~q?2?l-c@!gWXV>U0L{D5D(F*crIuhAUbAfG-QX`7c19v3#1%79Y*$?6 z2i{an=~2?4SJAaOHzgo*OwXxq_td;G#*#Q-8a1e1iMFX1 zbBM<_(K}mHC5es;0>8lD)u01}ALuU!mSMJ&;0n1y1*qHV4!S~(s5!Vqg!>{mvE zRt*s(KtsY!PD71k6K1$7nG)HQTtv*%+wKb#50(DaZZP>4N`t`(OvnpSCo%;qVFP3n zFsTOd8`&?YGaML+uqynh-&cHU43kL?m17o%f(ERy-N}%G)jB#emnjELhW(U&XcZ9tCsJrj;5x|B>S`}x}%P*eQ|4m+m|pZ zHpqM=xP8J?y#o4m`U~GI^&4Er?gvj|;ZtHtj zpl?^`p1@1b)B5u#-b*$+tv@fzD)Ba>t-bP-Ra1QOK|gg#>%Wi%`99Harux^3XZv`X z1*WC44cy&zQXI4^@Jr53Tc5L#pu3bW2`PIrs*%dygW+~nP>8!W=)WVup*caFCp%3vTnAvl^i%0vCB(;*2SpKveV+6f3!4$l896qtX>BRFkm1Mg zJjto-l0NKx+CVmL-l(@+`X$o2dr~o1B;_%jX^DF>GrsEag$3L)2G#&Ob6aW7Gz&M* z{z}9yU4R#BpG#_E$P!#Ka9QWDTrM@LhczzGe9KG`OqL7OfPIY19KuyTqdo(0O|*Q% zB?Ay&4(4lu3d+B^2>|7&&jr;TcdxVmWsVzusEo+FbO+ zT}jcss7-xPpipb7SNhyMN9(~j^Ft^jIpyehrzB_T>DAMVTuv*H$+7g=#Od*_>J}4$ ztZ0nC#+4~Wo1Squ2BSIE9lT%k)n!zS5j5cV9I+GW@@j_4nJ;8m5CezmZEP$K3hZs% zI$l`0-qVlCc!pUNwpX8*tC)@sPE?Df(HEK5Ipe&NWUc!f6X()tmOmhpa;zJ7?SrQT zZ9oH3LxtCUlBZiPLdM|)KJ4rqm5~aAv=Rc8w447V~y-MGxq35>rXL^d_1l*)6q(o(R%d7$j=gw-DqbjSyDFu|)t17erHP zj&A^7RYa?Bv6&b1Zob^wHANxF6UajX*s+2==?DcP2o0PEpvyYehS(Pbuy(+vIxD3+ zBEl&}oJ86b{J4;5Jzt6krNpi5cC)~%Rt1a}t&cOa-_4{AS|qXq9H>F2pFI2R*Uc}S zt6BWK*N}1}r^?+SB~@Os=Q85)Nr1ZI`#UeS*E_$ze0X=?<8el57xiig%Y%~^B{t2! zf!BL7nWSrs!s)${qk_gukXO=ws$II*%`$UkvOj(By%Wt5S*Xd|x~j1Z zV{J>n%7{}qx&f$rM_@(LJae6yBE(7@;2QOh(v9MP?6W$jyMbq^ehs(GmQ-Gs${mrs z|9+0LElDy*ifEtD{}E|R8qMO>d+t2FdsnaTWR_igQG_2(G`jsfh-c)I7j}&*jrygy zsAPEx-1_K2WOC{kN{|N|!0n58gvabqVp(=VWs{qx1e4)wJfl=b61o_PD69##C0y~s zW-OTN{AfbGFV&T?bDfNPU)gde=!XOEm&*&p;4#{djl0aFiiLIU@;*%TcVkK97oiFUjEc{ArSujV$YnG8cgq(6xZZEOsMNZ9T2i*x4lcL06&D$Upc=MuwW(Z&GDXXU*4iiM_tzPA8M z%wFbP#038Hk&4g9Y31f-(yloBbRmJdaA4c(AhS-g%LEz?Y+nz{(+-nw`maTIN!F_M z4JLd@j-ZRux^>hvsaow%wJ+3sy4+p=RZ_w9Qh;e;SgEDRcHk&i*PFb@_)g-wLXE|A>*@A9_bE!7_6xeHR-Urt&}<#jKw)l zcQ7LvskF8e%8rVuQi3fJ-35jP=}0FgBiriOmLfZq)RnSV>decP%V>nUR0*Jv2|9%? zNv~u2_^1|z0zH*W75YeCSwA?^AGei%LtWZE2A-a5Us37Tj_2+>^F*tky1 zgQHq8Z&M{rVMe}{5&G^-pqdaCWtWpz`10kR4=J4@XNyOoQ{2VeD<%eV`raLL{<#9< zZF1wG5C8>IV2}W?+wfFBfiyK}jY){j^1mPVet?JBp#=cE#3{V;9K6=!@^VCIcl~iOx-A@|%-Rx`G zS|{{JTuF7~!WClr@2eZjA@`R4bM)F{Vv2El%0f}zlDXb z0URpyeY#hl>?2B#Drv!WKdPLH7;~te^*n|BhK0yC%ytM1|37s&^ zaDn$t{6!PG{V~>BA8RMd5G?M#y1omUE(@FS6FIGfYBNSoJI$_rltj|GaIM4b#$XrHnF4ywvZnA?r83N;QOL z*=8XR%J1mlMU^?oP5Zyne+-;AOZtxco9#V)RfgTUAH^c(PqD?cFynFexZRgzFC@IV zR>h+cn_l= zWQ?abS3gvO^TOhQ+Xp#-JbMi1|C8R5{!e;?F#kagYS%vePkQ^G?6%CDIp$3NZ|){4 z(ElgBEd^W6`Z2%xnfd-Kg0oQ_VL{<_t)Rr`_L~*k?TQJv1byaRlu`*_2QMYc2qwda zO{YpWj%k0=K^?9oTdnbNJvZOpKA`{kiVk@dR$8ZaaPqTmL0DFnOQGI2#l&SHIN-UL zsAGhZ3$qFv&w%7KIqz&F72oK(x=Y}WpA z)}4oiEue3WcLHi<>Nir8B_~?NyYBK^mhho695qZTEzxZ3EDP$uTU}tKCH#18ofT{j zaklA{QcGLio<}YgImAP2n(iV@??d>hR>f+s0x6vI$oU9Upaapadq^HQKPc>?!PC8d z{XJRPN54Q!tV@h5 zB0}g@Llm5ijrD-?FeEX_Wr!VF=U`ImU|sC4VO8tr)`6>9Ni{DR4Mgf2^C7LQ+lEke z1K_UI0ZG3QvJF$7lOj#E7I8UTuc9%5%b-~+$VE-79PuRGN}1A182})Hnsfafc~$dv zrW`3Fd2*m(>*ASDgWG>@d+jXT%GdgL=bL>5_K|O?_1gUVS9-}pq5PBfXN0Qzzjz=& z@>Z5me+E1umCT_|cRWcwX*sjoX?nLP;0|ZUz1gkKlar3!DfwFpU!Em$byTljd^z~- zf+GE4CN)p36+h1UKy|~^Pw`*Fov#etKN$R;E!OX-YrLh9UnUCYSCN;VigNW)(4hLe zw06y@)uyx8H+TKKT%DBvzSf?0k^UEzQ~jLtB=iGV(sr@6$9?^0618XZ_N!(~GnKB- zG?l$43i%#;NjB7}8_(~XVP~^y7@MZgp2LMxm&p zTPBv;B1#g`v=RKzqM|?@x%K%ZV0zObBJEWJmFvx&UD0piP6-^-8(1RVl)DzL-J@$j zl)x2Tkhs5b>hu(4vV(}Y#~EAJTXO&Vi#NE66wR&PvFwzs>O=8@*NSXWK=|KD(mRvS z{RN?lV^Jl~N-(feF(}KKk;m4xiZOKKcW#5M#$g%z`uU5#G3H5Qee4uyRuz=n&C8lL z2odQsAcdud1VV&0S=4!8cCc`rAqyWV<01VaxQ?4q`K*N?^Znbfd=>-=;R((e6oQP% z@auzOknE;p<32zE*SsH^+2vV?hD*t#ZTn?Jg~i->5-i*i5OU%kpy0~+Sc4fv+%q?( zO%ut?Q>9@%tukCWVYWQnzFeZ_99&ss5I2~KYk-1`2LaX{{cq&H0n38Q&j0^z>V!N% z@a=&JH&zzFh=CPwIYVulib^{E_q_j-9m;tq0}KAoPGo4zqSI{ZGXy*!Wt@{!S;Kg& zIjt2YWs<7T%V9fm2M=x&8yfp`9Vq*IOkmeGeaKczL^dH_nUJRGV(zoENIBspS~D4A z3BP|GiHs{`dhdn1PIlGb8h;=r>#eiq)fN$fRPRF&axd7blofb5_!Awyj_YWCjSfyx zj(4PB1Sx-;S4(|Fw<4vsMk)K|$U_C_4%fY#!Y7v^) zmO<)Z)Eoe*C~LzmOF%9;3?f9c=ag|q9BuVLmElmL+>Xg!bwHx-f`f|c2bG42F0 zntMoO`vE!G!f(XZ8^(K>0O5?ZV?ShuAjcdKj52-#VReW=^Wy@e=ZPR-rgGjKCq0>q zKv{c+PA%erM1pLX%r@RyKRY9($U(#|u9ogD=5VM9GCTEoW-75>bnW|kfhGrbffP&j z;^i1X0712MI;{X~$4IUrWBt`|^?cGkp=f@*q&X`9I&czl5_K=;(kA9nZT*Pr#do*( z_cUwsJOA;kkMZYxEMLinX<3F7{MOD4|ID^g>b_a5-~^4T1)X{QE9iFDU3nk5Rj$;? ztHUe&{P%ZWr2aO8WxHPrtGfogP_y;EqO0v=W(&>?Q*p$@zxd)3LuL;soGWd4S*<929Di`W~4o6;J_X}^t zUhrzR*Mq^Q?g`0GKifWhE8dTpDjdCV++g=#F6j0B zS-Fc(YB*HQZiufS@9574L=j#5d*4Kg+=pg~-@a2cQglu?`@-DkWo^;sh@a#=cKdT# zU8Oy_Al4@R(lqSIYzRB2X;|)3Wa6f=tze1hg6GfFyM zmnoBJWI=L?*2YL8fdo~g1r3=aoJ)#@B<5s6Ea!zs zOW(*OY!FmM+2#CXs@$^1%M@Y^+_F#x`W!l?AOs7q4kw&4%dNwGM|kcLhl6<{v`!Cy zNzq(TDAR4p3tSls01)(5YhpZMEanu`T|u%AH;dl=Vr~g8fYz(Gkx&vdDREA~SU}N! z#5=BQ&fS>XTar;=i{9(c&2H~hJSx7KBQt%T@vwfE_&4{_7X;9Mx;Jk$=fY3dTLlSG zsRav*NQ5OGwuO~U}`!za`(!$@<_T5x?U~o7Y znXj|yoW;OEw(RSh>y0g99nZ}N=DAFp-;k9F$6`~#&it+Tm1G+R*x7PSt6LeT!Nj5! z*^*jvLN!a;9_A9-Jju2;WbPJNE>g!iKX5|7K-&g)&+V2;9CV%7qz_3M*M!0`_Id?^0HT7rq zqIj%k&Vk@*zs^@bP7>@k$5AR$L!}Mt9q&@M#3rVT#GB$UQI!eB7v7hMD!t!Y?hu)I z{@UDz`%XXtP3~x2ZmRC5cvbi5rPZbf!!|cRlOnd%yu15pCEJ@A1+1Yv|S=(GIEnZ29=~Lmpml(auuLDT4?xu_TxMv?fWr*3={)8PfG25>$jfXv5lFL;;^7eRwne0+??Kdj z3&!*-Pjm6`*~Ox4YtU#zGeKeBg5!M}Dao9!lQF2nz>*CN-MRTVF)RXXf~*Wx0M`bs zt!>$?j?{Zf-5BsNF>JJTk~PLoydEGF&C<6ANS0dN>rl;6@w*IrSs_bx^)#UyB@)G? z8teEsn5XXA%j%dvsB~ew(GV&>?s)Ir0bN1Hb!j(w!DP=cX|APtmno!CZ7*#O7a8U+ z<>CjmEMZeci~TAJRn$SxrXsl%o8GVxa2r@rZf9BbTilzx7vMUPMdZ+a>L}4hMPYbA zWM7w%)0}V(k}^~-Pu+E}3UgoRY|EjiD}Hdzbx<&s^i#}#zn&tGf+;oWIhWqJ`ZK*m z-VR^sfepuE&_OI~fcf|ElF(S>a$N$Vd!84FZmu%IBVyv-k`IQvj*P)qBn zYrQA*;#kM=k4t_N1m${@!3@Q=s{5dtI@?vzoK*o>*ZT;hbjJZNG1+0Qc{lk^pRv-s zra@iIB3-F#@kSFIjBJ#qg9p;Xjr-1l6$qy<9v+{Pyhu-cfw7uLC?-O@J$~=P<)oZK ztHNIF!ROtp!gi@sb-fRETN1Pxz7f|G@q+|9nUZ)cT6fpvs}NG>Qpo7QkJ1(AO%axn z4CVq}md0%uI6Zy0)%(Xt<+ZR+;yd`m37@^!y86wB1JK0CfNSqm8_bQgpZvis_mmF6 zvMFK0VI8-Bt>397OE#zuzu5i+FCKr$`15wR+9UIaWv@EpN{MLn~wqK~7O@E>(<2flWU40|y1Qt!&zf4YC)FKN}#2EIotbm#rE|IG{O z9+*-tPoL;f?~%OrB2vmlCDKc)wRm{XTL{QHKTX_!&N>oo?;jVyE!X= z^(zdFegju8^l}gJL@vpPThB*s=Tk!hC*O)20Io_*N_OiW#;$?CeVm-*kP?l)s*Tg( zMxIwv)N6VJ%#JZLVa<0E&M^lzzi;(bj2~~vSoin)iE^WPX3;UWjsf?J6XaKka1IV; z#lQ_W`l(P0E^e{f5RZ78Fu!x&u8ft-y7%LlB${FDb#&NV0sMTqsgD#-E-Gxkgxxfp z1Zsj6q$5fbA$@cyn7(ZxdHUTTBtu3T@Uf(zz`!S~PbSu&+#_pH-A#2*2AX0hC0B*; zW6$LzUy0E{6bSPm3eaV2rH1D%#1c@d5VVdI49zQ(0Z4^#!yIY9;Df*RWd9ty*UZN9 zvt#P?LVoREMdL4(K^-oaH&D!35JCWi0S8i5t1R6mac0*j^^VbNb}>M2f=BEGgFR+m zR9R3t0}!kOpcLF3MjU$&d_mVp|D38xac4xe?LHnX%&7b4_m5WFgL<)8q+6Mf8pxP! z&LQ_M=Kt~q%TniEZmvxfQx{Uciiha!%xM1li|pj1O#3WrRrn|!5Vuc8nh6o*t;Y+^ zif{r1?|?a2Ud$DFFO^6t`nr1-Tyf=&huHnVC2BA5?>(>1=lO%`sj^XO&9-swWYw=N z{u^mfqL`}pAAGT$lTA2o>em!wbfSnyk%C|RawRPp1})f;o?!4+`Kwwqj3%oS%BT}g z-d_FA5$%3sa1ZQLiUQe|mIQs%{u;ZwOae~{Fva4!Kj06lin!=G*3yo)46Y&{G`uiQB&&omKtaY%?aF=6!9j0(T z3SbR;meCz&;1``k+O&@P{#2Nk?Z;WuhlH~xkEpsKTOK&hw_pM=B9g^%@Sex}jz^}V z5xLJG^9e`IYCe0AM;-F?{ZCTu&liVI@>2DLyhpAv7J^#p{%)T3KhZL3=dxYrIwO_m zIc>jrg86VoE7;E=*Ae_-RCTOpzVk5oGykI4p@PH7imL0l#Bbk76qljOi)RV?9Vhml zx16szM9noRcZE|9zmB4Z%dL>M^&j^?N#SU*5)?rQ|teIz8$4|&Z+ueRa)=0{`#3RG1u`D`PAo`ZUy%q zZ;6YY)}NLWS<)BQ)KdN8)}!6j=|NsGxmjMKCGS(OrO__tBEKL^E)&AQ-FEf~iTZ;U zF=Od5g4&y=B)QEM*;AgQX+rSYU9C{|D=*)vx&e5hAHP$+(~to*>fu%+n-GD+Oej4ckn9NT%>0YnG`G>x_T_ zqL3U5Ona6a&a-H3p;Kznk%=ys6tgf;7t2m&KCHQPtYP82yk!Estn_ELbVczieopC6W~jB|QS z(KDH-pZYxY1v-y+l6)0>%3Y^BiPqwT8-%pg^8|LtQrz(Nl_ICZSNxMiLCC?3RWY!E z0S2AI^FD!&K;V=NE zIJ8}V7hW|npt_>d?SR$bOQ8^wYpUw9lBOxSOfIU?6%p0yYq?TVM)Bxc8EGF5shn&8 zpsDQ!u%sFCbMI{1BJ!K=hq3*0Gcw!U)29K49g4hpQhF@GEPcl}nvR&#G=0rj zdh8Lry`Us-Y=3RxsLSlqC0KI)1%H3opCw&{tf1&u#jV$#NunluEjrd|rrGDP_E?2#an~7n&soR41+rWN74p2GxDnZiMZA^$vgxC%1x->Pp*X ziA@9%v|U|*UD&#gV;i)}eFV-xnjW%(&9Dpy1Qv}n7DuPVk@38@E*PNaZTbbUZRe!S znG~o2b#xnvk8NO|Cgp}jFKW7bSG3fYRpIMsE=q*R!-6WhSd|#XTtw*NJX~#bH1F=O z-5#=V1-tZMQH%!{vqbD3w!iRX3#a{1_-o|8GYTJcEP<(0k-&YZNA9ng|4I9G?fnGS z`EK+({D^m0@9|6GgYp+|teK!OyjSx~DOQ!(we(Ex>WKWD?x5J8u7#wpexwCOHTHTYz4JCo<_;Vv z(B6{G>h2DU&ZqSd){2v(Op~Iix_y<_6BmOqb2QZE*X-l4wNK~%Ey3Zl<4(le%u6Fd zElu2(&4e$L3%lY7&s}U0#p;HSOM8LrLe8i!_z8f5yJ)Jl~Ps%WcaatcoClq zi0&$dV#a*ESXeU?^#vvcNaif3#{e%vVyq>Y`C&dlZ#)~$&ySlk_~A1fN&?u89DL5k zCT>nlw&&Ho2cQF8lvyI!PN(}skcyM2HcmoY)&)tNla*qHlXu--Bg&e8*;;x;z)Z#_ zA}!L?6ZV|DMx$S9C>-y*+4QzAt5iL z>$7v+wTbUJ#s=;{AUF(HIVD)K^~mLx*HCYKSWSq@^`?d9EWHuO)1R6n`}-WH=XW-) zPrCfnfb3s~!Cn%0?!bb2BWP2$J9)HKC$I5*l_(9Fipq9IJ8jhrXg%m4ptw$3&<*PL zbBco|M2J^ioODMC4yr?5hL^&WNd0sgbx<)latZ9`(cDr{)#Vpj-{N?d;9Gq6*Vy6Q zf~_pIgw5K(gLlEvYXP1J(S!wGDPC-suWb)k$C|xQZf<`M?o&4a8lh|DbC8*i8oVit z7eJ$-8IZ?1zE+}mNEoYOV8*9NU~cCO$EzFzBr!ss2oPu8f}d52jwj;#;D1wAV)@+ljub z#q+3ODC2lheXu9S#&gM4l}RGx>%4dX4T$I}-UD3sNLS_N9rju%)x3vsRZe)r@LVrE zCrt8$J-(!i@Gd{A>wp5ccj-jh#HKsYU9RL?Swj@V_fQcXc0I;Yb3=U)J4ZvwL&J5y zi+<{-k+JkNT(xAfJ5;R7W;dLtN|0h(niSZ_-Lx-ZcDc4+q9mBb(!w>jLlLg)!Kb&`TQ>&_zf+XDX4}CW5cdTa2G65OpL8y zNvzUnrOT zE+Nyf{qPrzS4_~*yX!}(5W=cW8zh}I(E+_s<;F#HgGg8dn@-2j$|pQQg=d>BFaDA@ zF31ZA&_dT~lwUMIHH$qj#k(Y_ic&tsFP=IoTiP1L(Ok?KUxm=1HSW5-%t+E>oo}+^W75t8&*;=llq%^s++B^;I(ay zUw2>$*h$Yr-D{4?;&u-|9qzk6cK%QOwSaPKo@2Xy$*G4P`7a%8m6xf~pJ@*)LiL=1 ztiR#+YqIUfix0m!6-VkdeMHPxUyp_+D;c<&R=k<|uzuNij!Si=23kO(`l(a1+}tCA z&$z1Jg}U4;I$l}2^Pp>>nlCcC@XES5G;%5K^%^Wi=U*KafYJ&D*mh|rpoSV5Sm@SRXGxBb?$sgFBF@Li+d#gL-w5BSA zf(ipEICEDuZ$rn9+mAtOkU>JEGJiqidC-1>r3g1|u6S61K?RT~^R|pwHshc#`GQw& zh+u7TNPy~;mYaS87-ykL06`WCvl*he6)9&SfZ?2h@d8f8=@+o0Rb80RQd2K^`93HM z8ygeuXTSnaC{tsxgRu`y8S8t^)r5;lNRlk1&9eY#0eytISU*f%XPEq~tQ%;+2Je^g zV`?}a`eb9WF|Sx`n%kUt`TYcdrBXa6EUQqKg~YC2P{x|!#tD?U^Lp|A3+OT6Ts&Ln zO&VMwt;IMUrM1_uj@CH(yk^8ylrANLJfwPV-8VAvBna1WFa2}qc zVT)UKPMqb5H{rx0z6OP$QvZl5_TNv;U5s1^5v4B65Ndu~{vOZyp+YR~K>M|h$_`xC zZE}CVS+xz$(%TN{f~eTxD~x$gv-i{A5^R_WoN&sD1$eU{8Lb$YdZbn(BG@{S&6o0DZLMQ^LAe^_np&pkO#j}VQx zGW{Ygg2ytg{7te6(Z;3H(*7t%xWKAmX$fnBw7f1&3}2{nqEwaJO~7l3i3PIoB`^>P z6IPPtBDAgqdi;JBV4}#WdJqmgtz@c*LM$}$_)nxzi0uQ3V_y4Aa3;B+%ESeGiN;04 zVg!We1=x(NQ~ZV!z0knoSZ+d7A%!TC!WENL0PY40&71jW9jZ+b=J+SWu_jIO#8qSW z!dJ!@Oaf?P$zbSCoOz|v@x{)U}f=*JD&<6o)w9H;XLCpUuClOBFi)x77-vvj1{_2i>Y zlyI{~-lumS%73Yz*Lz$Pcy$%_4=cVbUKBbP*jq!j-_t(^Jxx<8YJU3w|I%pc^4}jF zw>vI-Pc>{>ehH4w{~_=@b!_5Q`*xST@8-el1IpsG>Eh@7=u44$k6`P{75}PT@)aCz z-^#hlc~#|YP}U8OxR+=h$Ali98}WJrg;)Y|^Qxf(zUfOBzAL9nox51JWLQuhev|We zxmu>)&c}?bGl_FXV}d*!YH&vw3S3!YIr%%wg~jS_R8HA^JgrZ4v@mrz?Q0yH)=s+J zjrb4xSqMo(!3Xbp&D|$}9%C&~r1B+mE_QqN}1Ed96EDqnN!mnKkuHLtxmR?}xk-DHIpW232ajT0#gV zg;1b_FX7s&@^1q;cJ4jYm^MI|*oE9ToGt(((Oe}dVZ*{2CIJai!zOOl3mVfenxS*@ zes;#E?XJE{bt-8xG^xe&trrZ;2KWS?iHKCrRMw~^i5eczb|Xcb!0tr_d4fCPIPDf9 z-H%#V;Ql7PO(HbHx(~zVlSk2Q3rE)Zmzd}q7^D5Y(Dp`3TV&+HAUifY_fOz^Pyg+* z4;^bpkpcLPMm&*+WWslybvRms(0z#LD#h7j(4a=?WXWe-^QKzIf_?hz^CUci9#SRDDw>K*%H3 z&O_|YQHk!3K<5mnh@vx_sj3cB19MJxM5>Qx=#;x!gg05z_a{m1!QOPC6 z9T^}`RkCaUD9^LSmHEa#`GHv{Hl%wKGmoR-`wpTip=zlRV{Q953;rD1aq2X8E?jj^ zrcma(cT}%jhVezy5+z426(6DSx4|_ibcYdlI3VGEu`8kkCASU%?C@)y=5&T5xHY;G zEa-e_9-I^yz~&^g9+xa19$$z7#Gu&wGLXW965$b~XKt$II5{5y@|AvJPHR6hN>H8C zO((Z(PDUqB9>WUoce8e|&@rgiE)3^k!dL`YdBf?a2pJeTQ++|Sft0ar4U<_Vk0zlA zVx{SR1#Vd~tUMAd0+_*MQT8;Z5RqV_9ijud@?$4OaAnCjO z(u+*go8jWI?lEA07%$|U+_lDPpY>AHS#|E6BM zHJKHXSTWT&>g1F1FgR=ayqCXcjpbz4fc7O9MccpYgdCOf){S!!Z*q4D&lbKM;PKe` zsIei2kL)!G9-p18hlaSSqpdgAkLz!3*F~g(Qpa&QTKUR5i>(yvNyEoGIpo2vMZAWk z{2d&6Vy&Gl>jLaZI+`gBh%i|y2`aFS=5oiY-hYp#mmfQ2k}YK=rObxH@E z?P+`G5!QsyQGeae%=ZSQ)-Ng`OMo6rqs2&KL>|n)@rAuL^APQbpQBYj5!+8@=C6=j z70ZhCN+#$8kO_EzX2r-GB7S=oQwgCF@Dt1aiVAhiRw}YJv${-*0TUQMpwlJgq=@)D z4Kgedb-K>CFc4!c)U?Xc-(IyMQS6ZnNi+$-X$aR6&G-~3Od6&K2z=Hh-A|2)t*>QP z;jpwps{CR|z6Y98Zbq0vbzb&9hUC=n_3+vUVrP#pdfS_B@pdb{fUfCtS+D?NplQ!9 zX-o)L=lyZ*sG*;PMLT}qZR{*1Y5u$@0O~FFx~XRz6^+?=6Bd9>Y&*48P{QS-8}^rR zs&Ya1;l-5Gx1Z{)=YB$0OJDVnb-5?Gc897R_XWPoxVze+s*Eio@D+IHt# zN1WQQA2=|08;Ht_*i{<5Hyqvn$yx44`|axd=zkCA*q?kF2aB&}OdSvGD(C;60@ysv z+Wb8urH}Ku3-quv2?;CKR!-^RM8in$ZuIat#=J@E?#3jjoRykJax?zg|uie;!oG5sh zXh3l0nw|mSvI>yXNs{;9McVCRWYl2lS;q3BJA+y~iL}&Ru?1w6G~8mwBDo*KNwJa8 z_p$aB)^XoumnxLu5a2*EUt!bAE2ZPjjVfy9MTLzyIGLT;(t=2CxiofJAsR%DR)AtQ zW5y-dup9E~l$Jr!r^=*f=xMx?8qvpDF~YXHC=+6YqkVI_r#UA877mi?XT(%KqkFOl z#>hapW?^w_vJsly6(4_B0#S$$rqwfxlGVY7dxH zXu73)AdAzfgBQSBym7>m|9FhK|Gpm|6}_J;7-xIH=n1dWv0b`YjE`ATUk?6MMMbJPioY+?AvVcJkY+QGvaf}%yyZZAoA_owBSero%HYJ9@ zRY1qPOrnocGZhrf;&H|Y!2)%Pkv_jAT5a=I*pR?Z>33}@!C6@VK+Y{2k$T&oRF3aY zqL<}$Rruvn|6C&E2Sm)Z|G}w$NqY)>{k_H5wkr@daP0zZ1oh#+wU&mslZ4dJ@zSkZ zH-h<3^<+f{E$~ekt$zKoaPw@X&UVyG4tuRMp0E$Z#Se#hHK%dh=ev>ef3`||>PSy| zUp$?yc<@d};K`R;{Ptjo6-UG^+Yzh~j~BCGalu!Ad%RRUf9&NYXgob@4_4@Q9OC^f@)3K&?aNAERx5Wtt1XeFyRWq&Ob&3CY~%NDml(A|sH$Cw(Zpzt zYOSacYDS`{O@g-6C|zbmj1qhAl!z^qmZ$bkjig4aTdmTkik4RU$@4kB-{bScb=-fz zeP8!+UFZ8eUndu7TnQ$oXn@$S5aCLwndd#5ZQ?m3XDJ6NfQob2OL2kO9I9%@-A+r~R<9OH}BxZX7G>iubcojDX z9~S=v$CjY3K#*UZj4u8AFj~WJOMkW+RN2swaMzS1cscy;uGYeVxVRXwq#` zQ#4LQahnXOdaI$|vlUa?9w$RD!DMJF(+cL4Hx0_!>p!iigkQ{s z&2%i!;q@fxWSC;AmzCEExVTPDu_Oj01 zW}Dm|3v1(XgjbxI9SwGw0wyzo4XR{&@0myXd)@9P+$Kn2$BD_Eigq6&lS1|~=mga% zkeS}9brft)ay$l3UaiVS?us^QaSET>B?#cJ#v*^lXP;SZPveeKM0f@WYBOxjm zzi~I;xcQ-*Rh*~gv#cM~Jumj;W6Vjhok(SmN$;``-xq^V*WG%8hsm}++iN4A=0cLv zhvls1pKq1OaomAJ4UXcIYNsaro1*yP-+s{@FSUqQKy;59A%0)};s4muOC7w;yv$CT z`dPNqPU@~TP8<`e#Uu_SDD!vXV z{8c7SG#0;V4N*f|`p$%t)J|56U;m~_k-zPzNAHW`=1kS9s?Ncp$4r5iS|1vPx&!XA z50Aj6 zQni|Nw(RhT9?q=+o4R?71~+ny*KyAQTZ5?XidxJP8OFD4%F{qJc`RDMzMK z1BaJ^n7$>?X)vtHlLshLkO9(BnThT9B^moT6gZi(8=DoF$YXJA@fMX{DoG?lHtyC)-s)98HbBeo)*H;LbU(^waVMCpD}dKS!y zLxI67fs+gX4*rfFq5ci%D^skBeF6Z46~S07g@DSvsm!mIgl?@igYA1$-UZ(~1EX_4 zjO%ZB7v??&tEttN=gl>#tnA{N>WaukH{`vVqZ}8KvX~y)p&6HN^7V{RA1|=B3WY*h z&EF+Aj-!YNhP9tAwg#&8GRQg7CC+m*7Z|PuDxT^g>)vPqGe$JnNX<3KJuPI_O#{Y{ zW$DxIQ0LiDH%xoYJy#o-A)3OZwEG2zesKX8`^(=YM^xR`>=JXMQoR@$y=3eQ33Iq$ z!t#v`wdBDazdOL(7EmW9%YY@&@6<3XEXK)-DN)l_AUID7M2-?)L{J5sAFSzQ zKAINH?k&vls$=4`kuY&iq4rQ?DWT%x^VdxIxaOxT;V8@VCcdh2gYq-Wz6x=2d@SF@ z5*;`Ba;)UZS*4fiFuS_zV@NUq4-+FuZ%8fjyaTirXsoN8gDj${OkUx!TBO;bXY z%le*bJFjt?%{;BQ%C(MEJFU*+GKc>6Mx%0*08j?qQ0N3mSCuqRL9D$gvfR;n_PP6` zwQwbKPWqAjT~(Ld^qyqvh61H)UiJmgvDSaw&WgJV?`EL1{VfMD@h z0b(*!!i9J&Ccv>y=!Yi4YwZG!<%JP?^#yDI6TdN~lsaBTB!>bt0a2|GZyO*NkB4TP zUJ>BQ^>h$UsBr)Zm~*JqJCP7(S_4i1j`$iD{C61n9Ld4ULI!ZN0ZwbPUb)g~kT?(7 zhf9fdRRD-sLv^^gMAX>0K=HF&QZu61z25)tni~E;t?3j?YicnaQ}|D7YWjZ~Qw{5x z&srt2iMKmXmdOF|bufwd&pu>F$H&5OX^P|m8t}T+^vA=tUDF7to+Ie2_fKY&n@?4m z_~O<5+O0E1Ax>X~a=pA{b9MWgguNqCbl9EROMVt11+!uR zfsU?m`W?&fGmlEL1}Ng_som5{d_N(tO@Y55hyit?=0Il6nM2QYvRctxz@ecG@G|~< z6&WjH4;w0Ro`)g_?bvmZgDtGaSAk(%T{;uklXqRw8#pA6GB?i{v~{`Lq8NGpadu-7 zyS`yK>)yKL<;mX4%L1VWh7bmu21QF%`5Fstmx1yue+BO6TdsR|zx5fvT!Yo^+>6g2 zj!0SfEII#zkX_WE`iVKXQ$dp5$t^BIy|~}?!+zg+;nz=Y8Ahu9$@l#?(^ue8Y%bNN zmAkbQYwEV@o-Qt4?@K@70&afo?kOH3uKzxD)>-e&*0YVgq*-UXo7}SxHJoFPtIK8v zo}CKT7tcTZN4hz}WJS~YE!Mr>CSZ~MxIFT@QG;W}#uYg2h2Jzp`Hb7Yw>9-jI3~_~ zo9n)Meu8viygl%H>viS7cxSopf5GQYUh4Guft~#qkM-t-NM2QI<_~-HDhC1d56wky znyxhfA*tZ1ZNOvCNdaGa@lI=is-H%!Vy|f-cC(O9 zf_sHi7j*yFLdEpIXH>dQ0G|!M=`IZTb3IrFIwhjW$%B;2;a<{?Gr|}fqp1%)TF;mx zVK?6NmUF%%I<10!cl(KRugl^RH;f76EmHVlA$Q>$sT`US0PIqGCc?|XolqlPoFqZc z!Qg!6SVHo!2~4xX&>flRPO$a7kd1$>#b%-yd@{M`RF=?%eqZ@q1WaPw*i8zCVuist zoGawx&9!n(s^?rUgVr5gj0t+$7hgaUSjJl4KKA~SIH*UhpPyx@;VB0YDZAb z9i1=d^+_A zJ%4lVbe=QqxTEYAeNQScFNry=v33V#Ra(cGbAEc$3fV5a3ZiDB2F^V8%Mdf7zc3e4~*;M-sEdXvsrx&ej z`y7e48y-9gkjb&iNO({*Op>H!8BATP|}w0nC4_>byk~l{faj+ z?|T3979zV=5FGi%TLI4`4s*@xAjN5?K=@wQ^|X?Mr;0g&HjJ+* zh>u$~F^Ac}>{-W)8};bK;1EC!P#4bLP(UX1Dv5?Arg^He!rj(CN2BI@-+uNu>P7hk z$7bg*&=O^n9}L3x^9*Ne&mrE@Y?BH-%2fIYy3&#->#a`y^-F)t2EVq*b;f62Bm;Q* z-<(`}@xxu6sMmWth_)qc?`9}*yg*G$lK&x;PIkY3j3)nmJD5Y#IM;UX0mH+Vi!hug zll<&J&2Sf?(e%pJ%S(pej;ej%NdS-ZuNM0*pL2W{>oiqz>G7_5;5^VpV>Ii9bLMv; z_{%Hql%@RLkqOrmvjsCj9uAL=BE6MVL7ijjgmEEfqbxckdiAq6PH`opRJrT+SqVcl zg{qL33w8*ZA|1a)oXo!Q_^j@V_SMMn+11}z`586hn~(}>lV zdw=*8$HjG(=S_S>H-!M`OW73&A&4HhvpBAWZ^zQAykAP>7Ke7$2`0jiLvS5p$`OFR z^Zxlb0?*5xb(YgY2Hiiw1rcONRXbW53?gO1i zN7fEbCJ<}{cMzhv&(5jxQJO?D5t<7o2c!J6prQ9 zeXiifp)$t>Nq{ie&KNVGe2t2J*73&gXz$)aLwYcfy>D*c?=;D34OQVW3++G4@|{mz z@x3)6vAS%^geG?xU1p4jHqFd`;AT*(;-EK(b;J+S8(QQ#ue@sg(P35nHN!QHudW@P zO$Mpr^z~U<=WGu3R+1_r4wzLmmvxXRO^mM@&*7K`+Qa#ErbGiAJMI;UQ#>WyhwR*} z%ZqmS?8inv-lK&7Q?6{Tt60TWh;q7zj;QI;#-SN^YAwA0CteP4P6eBk= zl!pOTZlwQtMz1yPr+{j4VlK$=j)>BH2i>|NNDEIY8bAf~v<*;UI9;ZAhv4k69cO!v z>npo#-SzO|A_-l%0EQD^sW>{)ksC_rbDZ~W#1eqIg0yAJeKf^^`6X6bAy4^AB1>ap zvsBa-HTw8Ye&of`YR)16X!+7-FW|XIRvCv@*JbS+lZ{Q17aO+jkG3AgmqOA$TG=!` zE~V+}{c_X2`}B?eJ=$idP1veZp~M%X$9r6_+kdzN9y#?;{-zjg>Ow_2JX_uvUMtgP zx+_t-zPmg#7f&%dHfRjvm~eLO=cvi;B)6Zh3c^UJAn$p_!gtbCo$+P~WD?l+aD+su`n-*qSo zSI~U0DXbxb%b;F=E$5Ro4iAt7hotMHwr?(+Ro-IPkr?k|8Dq>H_2w7#V3vNE43eh_ z_bITs*hJH?J4$zjRMvR?P{mq-Ges7nkeznhF)oZ#-iG+3c*ZnEHTZ0{b77n_^*Pe1 z=D7e8+fp-FBX}Y{m+x6SCm79SEb6#ec_)yz36-Aafx(*e(@7b^YG&{WCqRqCI_@3l zqh*bGNhlt)F5XO5{KuCaz7l~l5BPy?g$TU`v&IKstnnGY4c$T>W1mZef zS2Hunl}=H!tjF}tV(v$=;$HlVIEbrRWV%@F)j~Pdx)sb*;wvYN;xCh+4&JA zGh@JkAB7M_XX{v|3&$f`xcKV0*w~(PrIRJ4%WiAS;lnb49~p$b*9w;GoJw^fQsF?| znw$vu2R~GGfGUHrtVi9AIsSX%XC_QXS(SM5i8D9sw^0(fBjlm}(dFU|H&${ex8f_c zhD6x9chw8yWIIi&;{EZ|VzoM03O1nH_HSS^U0PzzVE~&&Pih(I=@C{g^3K}7sBVA* z+xePH(E6lvHegrsJT@x)Ny8h=bM!-6iR(p8m@e8J_pn5$X zZpkTS?jk*Jj1GFHNWp1Zr2Ndq+NV=!{;#IZ@+~&zI@momL6GT#B|g&^MU;bW>)N7e zs``Lyf45E^c*x0zDdQ$mqAWB2Z`?5h(xf;d0GK*sD?1rcOk32T(|lY^@i*G>VZM-NVt@NT)YG8gu8KcS7f=J@boaS z=KDXh9R0llYAG?>`pRM}`o!QaA zrUEzvxGD5tz|Z|Ju=qxprAxs4q+vz(=ATnlW6#w@x`Gd(H|uX;Lw%YyER24izKIFA zxwH0f{E;7qT)r@TZ(euion2r@Lc^%P=|!17L#J)S$+;W+qIDJiDCnIFL~8ugd(6l$ z^J`*lM?b^Q%aA|!{S6!Yb%Rdv#g$u7hr8?7nvQ}dNa5dp2Bl!mWMIvp5h~GTl=6#| z9h07}o->`*5GDuE#3^a@8_h*({?`5d$~CC-F{LsV5T0CosfJF=sRQbhbmlCx!+B z!xUjU1dJA%PUZRyJFU6$JHDQq%Zu8g^ov)Qv_cf{Br6ek3fZg0TX#?@Bu4DGvP-|& z9>v&(i8E!3o2W?BmJx@vk(!8F>1=TN81#F8Sjtsa^bebl#(}jmn^pm?I(ix{*iJ2p09#=R}V%{LUYhYhOKF zVjhqUc%$xRhso{UU-~nQ_y^*198;|+{%s)|1FqhF;osu=>3U0R&%IK4(Q6s)VW|_} zqfXntZXJEQ`3ctLVuxzL-6Et0))7GAnFpc&50I5AVS~B=%>+{3vAN~M8FjMRM z3i8s&@RnO!^tLoLM?c25j`Jn3h@FN9C0BAFA3IkSnEWP(s1$>klBj)Yaxf-)sJX9% zruUJI(!43N@rx6;;@@8B;NuwSq{sB@ny>^YokfRb^S-KTQN?-i{NQ}1w)_389^VGW zRQAHOLDvAa5BsM1{jG<~7cN#(%(d!O6!)!8D!pnuF%$a^S){=p$)_u?pRdFo&25oX z6yI-LG@;{Uz?P6}VO;C$)GZ}q5(6~3B0eJy;C2iYAZEMZOGM-lJSI%I8C8HIyWqK# zK~oG7G^A#KNGah`M=&Ju78&QPfwCzowGiyhS`g- z^rKs><;hxtfB)KUvj4e#3VxTDqobwn^kH|z>^UNvhC1$wL;-<`c|Gv{K|^?P_WSNw zfkucC>f9zp-R5{O3MH`?UTrr!TXfHr=shG@D>1cZ#m6Gs&|enW|L_wjp$)aYWDM?! zTA0*>k3ajGKg}cedO}2@YsIN(wnEbGSH|RF(7>1~U3ID`N<(dOv4pVF`F80b3hy7^E7>=$ylnpqURT?tcK{TW>6IY z%`~=3T?fTuD>$(1FcV-+8q>)xa4I~NRXdLBAF>mxRjaFz5O8Kqim0@gD^AUJWk>g8*ONcli9iANAJB+T3I`9rMo>qET^LeW)*L z!t?b)u-VktMZetpyPm&&50AWUUvT;NM{Y)$#s>%vdKdi;bvrh@H+X=Vo@q~>3qM!z z>my92`swhKtq1j^oY$TuycjpAYg3XWN(%-wV|q&-!PaccZ|3bDLJzZL8qScf+ba3( zkeBFTxdrWO%!ym{+c8lhHhs~*&c`AB!7(bzWeZx)C85jzs?>b>*s}bw?9A8;PBFu6 za-t=zDzh%?TPoW{T zW|R&~;C@1YY#GNoCrNiW)JXth(i(e1Tf|!!H0xW$=_rh-brg;R3y{o>0~`v&%~?9J zI3x*iwq6IY$4q8}^5-T(YAj|=1CunfsR=Y z_$zW&{sE_LUES&WZX5p(fUd?TIZB1 z35+?lSVV#txEAgAhBes;%4idBteW>x8&WTvJDG)vcyTpClk0M~!Xz;zFEG^KDSx1? z%>t5?_acmiHRas9p|7QSO9338X!kFa>3+`vQ-Li1F?3(+#NDlcz})6 zy#5#R%PO=zEwCOoD~+-LrEhc9OnnQ5qERI6SsgH^$y=|a?>FbitW12cGY8vrwPXgT zQpW`~ZbM&v?Htj8136heFmoAToHxarvN)_$G=AwyGFsf(OvV~4kqhI7hSVicJY9#0 zVEi%_U*uV!y!vTJw8v>SISd9%7rT+U8L{GdR&b-YiGr-8I|0Z4%b)t zxF`8a|L{frMw4nmP(ahLsp*yt_kY^Bzc-Mt1pmV&IifMK`;fiZDs|@&)1|GdQdroi z)bLcx=xgxD{H@+lF2rJX0T<{L&~H&w#(>Y-4VpFjT@cui|{%}QH(QLw!Na~9Y9 zx)n%$QKo3DG|6XENnH2k>xLGhicL%Vo7+(f)3f&tM^7~tvAyv+41@++(|V4MF!D>bf-D)j?ODUXwkykn_q_sq?)R=FdLMp42 zG-}z6?Zx>y_`|!Ky>Ynd4!yDn^@+DfH5ZoVMMWOyV5uHS6fRkvp+a@L>Z6>$-D`a; zUb~Ch?--7w=|zZp?71ul?i8lY&jH1dLX$QyfVGDZIpY-~N@}?kGkV;H7X_01$Hjq` zR>TC808nR7d`&x`C^BojZ+3hg)^0Z2Ah8zIUoi1c*07^|tQ;`QN3T%G}HtZFtc>8rsRL*gr- z#_>{t&bR_G9$Md*l%juA2ZNqQu=NT3}b`4B*b$o57 zdV}LpNdC)PgE|r)LwZL_%^H*1De4tLWwZwuhTMBUI2%rjZsj1~zy5Bz(nHt|F2sTJ z@)uTXJ-`+kC{*hF{fMLyCuj%m_~T~V9cy`VNS@z@+RB?9$Up<|e&LCg_s15i!Cj4R z8Zq;mIRu)Mm=V|!AjnF&E@;>zp<;6TL3Qo0RF`xkrV!YmR^aMg zVfX4p<$1&zJL*CU1lkIG#}TgCF4Q*`dU#d_g~dSB`uxuyTWVzV%uCeepU>{om6Os# z6&}SIr95en6MOr|_iOruKvB>5=!0AIBFUjlzBPcaoNw;k!6llZDgE|2k$%^|x6wMD zM_(om)#~1;{7I#2{JQQ(*ld5~g1Uo0-S){9*lPBO2vE)nd)!Hxin_CGlE0R1VjAWg zN;<6XG2ehb#WW4%pWn4{c>vv*i`+_=fy+)L8;q;;s=G!X@mcfd_t*Ye zYa-tJLqY!t&*&BtR7<-o%KdmdvYx#Pr3^RA`2O`>%cZp#ejc0I+OYj+aw!g)9$QIn z7pSf-KsVr8lP5OU@77DbMnLrs@Y$sLX`98!q$&eiL=+0)lc4TWb|gnW^S*g}?FyQgw(ZCpsfvDH>M+RkCJL zT-29f!gi*EMV5@(lSPa31Zfr4PUxbaIQh;vcH(fq}=3n@} zAAM2gs$Lnm9ur) zp?kSZU1LFj($C#gTo~w3Y=Jy|o00=BF|z1$-RF;X{?#5@uaMy2z0^%oxUCiHEUO}P z(x4$oJ|7aZ4f8o`=ps~qEu8@|dK1u|d$;I9K%2eZrDg54CRMMR5ZCRdg_p52@dpcw4?cC(q`Jw4zD^Lma|Jb{}R& zw`^>CAAA}y^)9;|or}V@5h#^4N&Jg1A8+h@J`@a#)SM%8Gi6)ja7k(Z(%dgUP-4f{ zZ0CC7(n@laldi@W{V>5{Pl*O4?tUsi>r!6aj7MjmkNTu?_v;rGDYq8buV9iIA=8ck zx#s!jQiPlI7#7*Fyrt9K9aj@*)6ZFS(X!c`eZaD|7FW(EoWnbMR{j*jJ)J(ozG98DPn5t66+F)Q!#5549H6L8E~PI80L&5=Q-J6i zC)Ah<%sI)4FA=T88_ZMuCa~2!QydO*g>#uTqPGLESOdems*ws%e$tR#IMAP=h8*&g zvYd4Wu_>_+dB(=$uaqch!w7snyuv{}t_r1fF&#LzvfFpRl%9}f{Z*lB2aAR$|NE9I zLrc6s3JO-nU}bQv68C?<8#cLmCDOLo;oqf&(d=RK&kS0t;N7x6KOP>~LIc=RkN*CC z8eFCv4KkFu{Os@XuiH;$yHj34wS*p)%^uC26rS9Xb9tlOIC_Ej(&NuZWm<;M+h~=G z=W2i39%Ojj$WUjG9hJ&g^OHq(xFFx}COGgF__Xi;Jf9}chHgZyls0=$kzl83+H9x> zM$D(qPK#3bTPcsfOumH5ugIAw9CK+&DiHTpDm*f8+{4OMBMy*sup+fr%01?)xNgX9 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 69fe0dded49124c6da20d86a8b0c2f3345366e70 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 020/123] 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 ad8aa112709493cc7daa3d753797a4ce13cb3367 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 021/123] 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 86d39b3e7c2d7ce1de25c40186a88c07416b6a60 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 30 Dec 2024 15:18:45 +0100 Subject: [PATCH 022/123] 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 fc639199eeb9aaf614ebec31705ebd1716513d54 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 30 Dec 2024 15:18:56 +0100 Subject: [PATCH 023/123] 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 551fe63cf3ed332792ada5d6a43731676abf4a10 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 30 Dec 2024 15:19:06 +0100 Subject: [PATCH 024/123] 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 db2f6057f3da0c81b90eb32d7f9bf2b0cf6adb85 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 31 Dec 2024 14:29:35 +0100 Subject: [PATCH 025/123] 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 fa21d316e0e243a18a85e94a909848ec3c2a2ec8 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 1 Jan 2025 16:41:57 +0100 Subject: [PATCH 026/123] 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 62afe5a7385b44a0360ae153ac41f69f13d8c46c Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 1 Jan 2025 18:55:50 +0100 Subject: [PATCH 027/123] 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 574493630f3b048b80abc8fe6576b0dce8c4576c Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 1 Jan 2025 23:55:47 +0100 Subject: [PATCH 028/123] 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 029/123] 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 ad9c63284e17aab06acdb4d086177d2acc90e9e9 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 2 Jan 2025 14:09:23 +0100 Subject: [PATCH 030/123] 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 f8bd529f5ccb59cda63c2c5eedc632607254a968 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 2 Jan 2025 14:09:30 +0100 Subject: [PATCH 031/123] 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 177d48e9d5b6005aeab27d56cd301aa44c97d8ea 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 032/123] 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 b0e91ad2eef5961cc5cbc0224cf4220b54575945 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 2 Jan 2025 15:48:56 +0100 Subject: [PATCH 033/123] 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 5f2fad4e147..22fa41bfa59 100644 --- a/.hemtt/launch.toml +++ b/.hemtt/launch.toml @@ -36,17 +36,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 e2235f7a62ad4c85e7eee59cfba199e52d39e663 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 2 Jan 2025 17:41:52 +0100 Subject: [PATCH 034/123] 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 8cacab04f3d58d7f32243e471dc865c0944d3539 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 2 Jan 2025 17:44:03 +0100 Subject: [PATCH 035/123] 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 8a53f84611a812057b94b8200c2d3b69d103a79e Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 2 Jan 2025 18:37:05 +0100 Subject: [PATCH 036/123] 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 bbc33ac76b462e6e987c2b31fd98852a6d8754c6 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 2 Jan 2025 18:37:13 +0100 Subject: [PATCH 037/123] 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 13b3342a27a6d3561f376f497c3ad71c11548408 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 2 Jan 2025 18:42:29 +0100 Subject: [PATCH 038/123] 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 b5c95e4d426cbf5a4938602e131a79f1131b91e8 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Thu, 2 Jan 2025 19:09:41 +0100 Subject: [PATCH 039/123] 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 7b49f75dc31f251f786a5ad949e00d1b6824a9ea Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 01:55:35 +0100 Subject: [PATCH 040/123] 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 3fea9346c868bfba393d2afb4b84fe1386a03057 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 041/123] 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 a3a1683f408..b8d090871c9 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 39f50cdd3b04d4f44650aea6342847cfc59c586b 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 042/123] 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 e07a5b05ec2..16eefada3fa 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 1ba5bd6197e08da79986d6d5e16187e62a4e8b21 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 043/123] 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 819156bcfd8..f561e41a5f0 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 5cd501ffea93113c2658c74af87d772eef4ca342 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 044/123] 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 a25c5e3f89e..68cb3f34dab 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 45c34719ad287b662b5bdcacb2b202d428caec13 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:12:41 +0100 Subject: [PATCH 045/123] 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 c4a98d919e95b67821bf620f6e20d17e9ddf43b6 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:13:10 +0100 Subject: [PATCH 046/123] -> 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 61eae5d3cb3cb6fb819a2ff5d8e0d75219f2717a Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:17:43 +0100 Subject: [PATCH 047/123] -> 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 fe8591593b8edaaca5be3d656cc4a2fe1b6d1edb Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:19:16 +0100 Subject: [PATCH 048/123] 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 4f9482b263e0edbd7b2a6dc71749802c3f6a900a Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:20:17 +0100 Subject: [PATCH 049/123] 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 a62e45aaf62aeb44ba1cf78879bee65b4e2bf460 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:29:01 +0100 Subject: [PATCH 050/123] 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 45e3ff07c9537fd1da8d4c448c257e789f39a2ed Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:40:26 +0100 Subject: [PATCH 051/123] 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 dfb35a711684cee0742836347db977d308814e30 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:40:32 +0100 Subject: [PATCH 052/123] 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 344df47d20573d42741470f5b69291dc51874d88 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:48:37 +0100 Subject: [PATCH 053/123] 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 8db68fecc5becd1700963ba26f1f7806f841eb3c Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:48:43 +0100 Subject: [PATCH 054/123] 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 4368ea4132ef3902c426f1e0402907d74044a670 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:49:15 +0100 Subject: [PATCH 055/123] 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 5e4f12d02ead9f6c64f65cd2c338df66e425ba7e Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:49:22 +0100 Subject: [PATCH 056/123] 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 3b13160eb455fcc463591225761a7ad4c9e15297 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 02:55:22 +0100 Subject: [PATCH 057/123] 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 f1063f4a0fa8254115524a8372ba222c8f9e4f52 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 03:04:34 +0100 Subject: [PATCH 058/123] 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 386136576377dc11a5392d75e840e6c7df0bab71 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 03:14:49 +0100 Subject: [PATCH 059/123] 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 97b7c37131e535b715f206cb98cc4d164c0b9477 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 03:15:04 +0100 Subject: [PATCH 060/123] 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 5d2bed4b88ed10f8174da428557965e5f4bdef42 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 03:22:53 +0100 Subject: [PATCH 061/123] 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 65a8bb1f1ee5a5a92b689b669032b9bd08249ea0 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 03:25:21 +0100 Subject: [PATCH 062/123] 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 8637bb34d93d96c4d012cac6c43723b49ebaa76f Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 03:30:12 +0100 Subject: [PATCH 063/123] 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 e5c0dc1191732212aa0930b268bd0d5cb6458273 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 03:32:18 +0100 Subject: [PATCH 064/123] 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 fd1a4b025e95ff0844088999bbfd4d3725731540 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 03:34:00 +0100 Subject: [PATCH 065/123] 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 e15e8e8d4743100df5a363e73ccf8e4be45b54a6 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 11:57:00 +0100 Subject: [PATCH 066/123] 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 3d8aa264fad3eb2fc049bd5ef9daddb73f2cc5f3 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 11:59:39 +0100 Subject: [PATCH 067/123] 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 8506f650121a9e78df398c670a9a8c2ce6667636 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 12:06:26 +0100 Subject: [PATCH 068/123] 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 401cd950d3a12629e2a99efa81be7d96420fe6dd Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 18:27:16 +0100 Subject: [PATCH 069/123] 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 7d65631fb84b926a1528fe4c9d8f2bc1b6563429 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 19:17:27 +0100 Subject: [PATCH 070/123] =?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 a632d1daa7e9175e473a060c8ad27b576a22dd7a Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 19:43:05 +0100 Subject: [PATCH 071/123] "../../" -> "../" --- 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 37c3ffff1e181820f53a8922fad0376602eb0473 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Fri, 3 Jan 2025 19:56:19 +0100 Subject: [PATCH 072/123] 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 70b17bbd3669c5154d450b73779643b0f8843821 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 4 Jan 2025 18:20:23 +0100 Subject: [PATCH 073/123] 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 93f785d441a3c948cf94e903d3c617ec44aa92c2 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 4 Jan 2025 18:24:13 +0100 Subject: [PATCH 074/123] 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 978e5cf6b1fc84b1c9c209c11ae18d95a8eef85d Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 4 Jan 2025 18:28:13 +0100 Subject: [PATCH 075/123] 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 4c2dad8cbb37ad5279a401b402f85d36357245ea Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 4 Jan 2025 18:52:49 +0100 Subject: [PATCH 076/123] 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 58cfa2566dd22140ad287e91f3fb9e3d89555a89 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 4 Jan 2025 18:53:04 +0100 Subject: [PATCH 077/123] 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 835aec00fd056f6a5dc42d6bfb02d0cfe6f7f390 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 078/123] 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 cc3757c0ba5eb0651bdfb4c4d356d9aa00eec495 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 079/123] 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 b9b90a86f2f8ea6a905f8fb6e0219194de61a467 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 4 Jan 2025 19:36:34 +0100 Subject: [PATCH 080/123] 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 4aea498b776d339578eb965ff580665c81103108 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sat, 4 Jan 2025 19:39:39 +0100 Subject: [PATCH 081/123] 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 e7781b26cf4a88c9bc6c2dbdd103430699c673d6 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 082/123] 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 4b47a020988ef6af9e917a5a3cfa6dfdf074a10f Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 5 Jan 2025 00:23:28 +0100 Subject: [PATCH 083/123] 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 769d746fd4e83e96a02b4c00279b8e93f8f55d9c Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 5 Jan 2025 02:59:30 +0100 Subject: [PATCH 084/123] 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 972d9b9f74a400b4ca30a78eabe994d31efdc2a7 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 5 Jan 2025 02:59:53 +0100 Subject: [PATCH 085/123] 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 9a7f879b45222cd3f1b98a3e20215052ac32fbaf Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 5 Jan 2025 03:02:30 +0100 Subject: [PATCH 086/123] 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 22fa41bfa59..da7fee53370 100644 --- a/.hemtt/launch.toml +++ b/.hemtt/launch.toml @@ -45,6 +45,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 82bb067e4a2aefcdc5507b4f14679b173d5ae8a5 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 5 Jan 2025 19:21:15 +0100 Subject: [PATCH 087/123] 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 e7e7f410e8ad148fb199d6e4edd4f68250f7905d Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Sun, 5 Jan 2025 19:36:05 +0100 Subject: [PATCH 088/123] 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 848a00d18ff46885d25562d6848b7d4639c6926d Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 01:18:40 +0100 Subject: [PATCH 089/123] 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 5ae5b57398118ab5338f128c23ab29bed87d568f Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 01:18:57 +0100 Subject: [PATCH 090/123] 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 d8900d6ddb459fda175af23847e5dec5af0fbeef Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 01:21:10 +0100 Subject: [PATCH 091/123] 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 288a9e8e6bcd035be0116ca5a5bdf411af7649a3 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 10:43:48 +0100 Subject: [PATCH 092/123] 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 9a128e44c7ec1c298eefb0c09e7a9dfb35c4df90 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 10:44:33 +0100 Subject: [PATCH 093/123] 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 d4f9e2fa8d53ce963663557401db7502135fbf71 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 10:50:55 +0100 Subject: [PATCH 094/123] 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 8b42f502dca97004062b0bfb9111ccfb8bf75563 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 11:49:53 +0100 Subject: [PATCH 095/123] 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 178e3be69be60734cea36a52511a44fe09f91c84 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 11:50:44 +0100 Subject: [PATCH 096/123] 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 5bb2eb7a2457c0abff82b05a90f257ea373151c9 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 11:53:06 +0100 Subject: [PATCH 097/123] 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 95bd7bc739265a5a4dfa763f951cd9ebaaaedaa0 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 11:53:25 +0100 Subject: [PATCH 098/123] 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 b29b601e98b6ed5d9ca1eaeb506430a7b1a0106f Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 11:53:52 +0100 Subject: [PATCH 099/123] 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 55183349acc6aa8b2a944b1815882791f803ef60 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 12:09:12 +0100 Subject: [PATCH 100/123] 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 e3b1aa04958de1e55adc296ff3e6103356d56434 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 14:35:30 +0100 Subject: [PATCH 101/123] 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 42e97af825a36b8e7e8190175336f294decad724 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 14:56:51 +0100 Subject: [PATCH 102/123] 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 62553d9bea7bd00bc70aaf38a99c6a1b360d3044 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 15:57:28 +0100 Subject: [PATCH 103/123] 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 cfce465bf088024aee9c861e55bfbedf521da7d5 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 15:57:44 +0100 Subject: [PATCH 104/123] # 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 89119906094b1a9e11ebac29e8f9785e456f0f7e Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 16:02:01 +0100 Subject: [PATCH 105/123] 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 3a22a5c84a7b0b9700a73c2f7631d193b11552c8 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 16:06:23 +0100 Subject: [PATCH 106/123] 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 fc2858dbc9a35ce35b2b2902df77cd308b2c46ab Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 18:51:09 +0100 Subject: [PATCH 107/123] 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 f260f7970095b679d631bd894118d5558e33c62e Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 18:51:31 +0100 Subject: [PATCH 108/123] 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 39cca808dd40f43bac431d09328ffea947ce683c Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 18:52:29 +0100 Subject: [PATCH 109/123] 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 68e0d519f4a2f061d87cec762b097bfa1bdc543c Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 19:16:36 +0100 Subject: [PATCH 110/123] 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 ae85d156f1589bdb24c7f5902128d83dd6e33579 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 19:59:18 +0100 Subject: [PATCH 111/123] 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 0abd442ff328a0936b2b3d09a68b1da3e511de33 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 20:06:14 +0100 Subject: [PATCH 112/123] 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 a8a6526c97d676ac414a72bb6046383c70b270fe Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 22:00:22 +0100 Subject: [PATCH 113/123] 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 8f11e7b4e744a14fde68ce10e2100393502bd64e Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Mon, 6 Jan 2025 22:01:50 +0100 Subject: [PATCH 114/123] 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 da7fee53370..5ce20c06f0f 100644 --- a/.hemtt/launch.toml +++ b/.hemtt/launch.toml @@ -37,7 +37,7 @@ workshop = [ ] [Wardrobe] -extends = "default" +extends = "rhs" workshop = [ "2369477168", # Advanced Developer Tools "1779063631", # ZEN @@ -46,6 +46,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 883e21ca9397e49430f00c48954efd478c49b213 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 7 Jan 2025 01:01:53 +0100 Subject: [PATCH 115/123] 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 eab28a7c76c563b6aca13423db879f84cd05084f Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 7 Jan 2025 01:02:25 +0100 Subject: [PATCH 116/123] 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 afbb63e20775cfc2d975aab0fd8c7ae4a2fbf8fa Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Tue, 7 Jan 2025 02:03:20 +0100 Subject: [PATCH 117/123] 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 ea825087b459af38f1e4b7943d6d6a4dae75d083 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 118/123] 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 16a5edfad4f10ce065d8c94c0f9dd81f7b9c5851 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 8 Jan 2025 19:16:34 +0100 Subject: [PATCH 119/123] 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 0b88f00d6f96c5b7126ce7eda9bd2da062d41eab Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 8 Jan 2025 19:28:20 +0100 Subject: [PATCH 120/123] 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 152d5831e3686b3d1c379ec671354f0ae1e1e77e Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 8 Jan 2025 19:29:01 +0100 Subject: [PATCH 121/123] 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 4310f978629fc6c746a52ae459ef0e8fae1d7b49 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 8 Jan 2025 19:31:50 +0100 Subject: [PATCH 122/123] 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 15227e8b8f1b0cebab0d99c6a3ab4fe44e021864 Mon Sep 17 00:00:00 2001 From: OverlordZorn Date: Wed, 8 Jan 2025 19:32:03 +0100 Subject: [PATCH 123/123] 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);