diff --git a/Missionbasefiles/kp_liberation.green_sea/description.ext b/Missionbasefiles/kp_liberation.green_sea/description.ext index 1f736d9ec..8a194cee4 100644 --- a/Missionbasefiles/kp_liberation.green_sea/description.ext +++ b/Missionbasefiles/kp_liberation.green_sea/description.ext @@ -248,6 +248,10 @@ class CfgTaskDescriptions { #include "KP\KPGUI\KPGUI_defines.hpp" #include "KP\KPPLM\ui\KPPLM_dialog.hpp" +#include "VAM_GUI\defines.hpp" +#include "VAM_GUI\VAM_GUI_controls.hpp" +#include "VAM_GUI\VAM_GUI_classes.hpp" + class ACEX_Fortify_Presets { class KPLIB_Fortify { displayName = "KPLIB Fortify"; @@ -259,4 +263,4 @@ class ACEX_Fortify_Presets { {"Land_BagFence_Round_F", 60} }; }; -}; +}; \ No newline at end of file diff --git a/Missionbasefiles/kp_liberation.green_sea/init.sqf b/Missionbasefiles/kp_liberation.green_sea/init.sqf index dda3d4b14..d3a99f31e 100644 --- a/Missionbasefiles/kp_liberation.green_sea/init.sqf +++ b/Missionbasefiles/kp_liberation.green_sea/init.sqf @@ -63,8 +63,8 @@ CHBN_adjustColor = [1.0,1.2,1.4]; // Temperature and humidity changes [{ - ace_weather_humidityShift = 0; - ace_weather_temperatureShift = 0; + ace_weather_humidityShift = -1; + ace_weather_temperatureShift = -1; },[], 1] call CBA_fnc_waitAndExecute; [] call compile preprocessFileLineNumbers "scripts\shared\init_shared.sqf"; @@ -147,3 +147,6 @@ if (isServer) then { KPLIB_initServerDone = true; publicVariable "KPLIB_initServerDone"; }; + +//VAM_GUI: For changing camo and vehicle appearence without Zeus: +[] execVM "VAM_GUI\VAM_GUI_init.sqf"; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/VAM_GUI_classes.hpp b/Missionframework/VAM_GUI/VAM_GUI_classes.hpp new file mode 100644 index 000000000..84d25b2c2 --- /dev/null +++ b/Missionframework/VAM_GUI/VAM_GUI_classes.hpp @@ -0,0 +1,111 @@ +//////////////////////////////////////////////////////// +// GUI EDITOR OUTPUT START (by UNITnormal, v1.063, #Vurive) +//////////////////////////////////////////////////////// +//missionConfigFile >> "VAM_GUI" +class VAM_GUI +{ + idd = 4900; + OnLoad = "[] spawn fnc_VAM_GUI_check;"; + OnUnload = "[] spawn fnc_VAM_variable_cleaner;"; + movingEnable = false; + controls[] = {"VAM_BG", "VAM_Title", "VAM_Text_Camo" ,"VAM_Text_Comp", "VAM_Confirm", "VAM_Reset", "VAM_List_Camo", "VAM_List_Comp", "VAM_Current_Vehicle_1", "VAM_Current_Vehicle_2"}; + objects[] = {}; + + class VAM_BG: VAM_IGUIBack + { + idc = -1; + x = 0.329375 * safezoneW + safezoneX; + y = 0.318 * safezoneH + safezoneY; + w = 0.34125 * safezoneW; + h = 0.392 * safezoneH; + }; + class VAM_Title: VAM_RscText + { + idc = -1; + text = $STR_VAM_MAIN_MENU_NAME; + x = 0.3425 * safezoneW + safezoneX; + y = 0.332 * safezoneH + safezoneY; + w = 0.144375 * safezoneW; + h = 0.028 * safezoneH; + }; + class VAM_Text_Camo: VAM_RscText + { + idc = -1; + text = $STR_VAM_CAMOUFLAGE; + x = 0.3425 * safezoneW + safezoneX; + y = 0.374 * safezoneH + safezoneY; + w = 0.065625 * safezoneW; + h = 0.028 * safezoneH; + }; + class VAM_Text_Comp: VAM_RscText + { + idc = -1; + text = $STR_VAM_COMPONENT; + x = 0.506562 * safezoneW + safezoneX; + y = 0.374 * safezoneH + safezoneY; + w = 0.065625 * safezoneW; + h = 0.028 * safezoneH; + }; + class VAM_Confirm: VAM_RscButton + { + idc = 4930; + text = $STR_VAM_CONFIRM_MENU; + action = "closeDialog 0;"; + x = 0.611562 * safezoneW + safezoneX; + y = 0.332 * safezoneH + safezoneY; + w = 0.0459375 * safezoneW; + h = 0.028 * safezoneH; + }; + class VAM_List_Camo: VAM_RscListbox + { + idc = 4910; + style = LB_TEXTURES; + sizeEx = 0.035; + x = 0.3425 * safezoneW + safezoneX; + y = 0.416 * safezoneH + safezoneY; + w = 0.150937 * safezoneW; + h = 0.224 * safezoneH; + }; + class VAM_List_Comp: VAM_RscListbox + { + idc = 4920; + style = LB_TEXTURES + LB_MULTI; + sizeEx = 0.035; + x = 0.506562 * safezoneW + safezoneX; + y = 0.416 * safezoneH + safezoneY; + w = 0.150937 * safezoneW; + h = 0.224 * safezoneH; + }; + class VAM_Reset: VAM_RscButton + { + idc = 4940; + text = $STR_VAM_RESET_VEHICLE; + OnButtonClick = "[] spawn fnc_VAM_reset;"; + x = 0.559062 * safezoneW + safezoneX; + y = 0.332 * safezoneH + safezoneY; + w = 0.0459375 * safezoneW; + h = 0.028 * safezoneH; + }; + class VAM_Current_Vehicle_1: VAM_RscText + { + idc = -1; + text = $STR_VAM_CURRENT_VEHICLE; + x = 0.3425 * safezoneW + safezoneX; + y = 0.654 * safezoneH + safezoneY; + w = 0.091875 * safezoneW; + h = 0.028 * safezoneH; + }; + class VAM_Current_Vehicle_2: VAM_RscText + { + idc = 4950; + sizeEx = 0.03; + text = ""; + x = 0.427812 * safezoneW + safezoneX; + y = 0.654 * safezoneH + safezoneY; + w = 0.124687 * safezoneW; + h = 0.028 * safezoneH; + }; +}; +//////////////////////////////////////////////////////// +// GUI EDITOR OUTPUT END +//////////////////////////////////////////////////////// \ No newline at end of file diff --git a/Missionframework/VAM_GUI/VAM_GUI_controls.hpp b/Missionframework/VAM_GUI/VAM_GUI_controls.hpp new file mode 100644 index 000000000..56cfba5ad --- /dev/null +++ b/Missionframework/VAM_GUI/VAM_GUI_controls.hpp @@ -0,0 +1,382 @@ +/////////////////////////////////////////////////////////////////////////// +/// Base Classes +/////////////////////////////////////////////////////////////////////////// +class VAM_RscText +{ + deletable = 0; + fade = 0; + access = 0; + type = 0; + idc = -1; + colorBackground[] = + { + 0, + 0, + 0, + 0 + }; + colorText[] = + { + 1, + 1, + 1, + 1 + }; + text = ""; + fixedWidth = 0; + x = 0; + y = 0; + h = 0.037; + w = 0.3; + style = 0; + shadow = 1; + colorShadow[] = + { + 0, + 0, + 0, + 0.5 + }; + font = "RobotoCondensed"; + SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + linespacing = 1; + tooltipColorText[] = + { + 1, + 1, + 1, + 1 + }; + tooltipColorBox[] = + { + 1, + 1, + 1, + 1 + }; + tooltipColorShade[] = + { + 0, + 0, + 0, + 0.65 + }; +}; +class VAM_RscListBox +{ + deletable = 0; + fade = 0; + access = 0; + type = 5; + rowHeight = 0; + colorText[] = + { + 1, + 1, + 1, + 1 + }; + colorDisabled[] = + { + 1, + 1, + 1, + 0.25 + }; + colorScrollbar[] = + { + 1, + 0, + 0, + 0 + }; + colorSelect[] = + { + 0, + 0, + 0, + 1 + }; + colorSelect2[] = + { + 0, + 0, + 0, + 1 + }; + colorSelectBackground[] = + { + 0.95, + 0.95, + 0.95, + 1 + }; + colorSelectBackground2[] = + { + 1, + 1, + 1, + 0.5 + }; + colorBackground[] = + { + 0, + 0, + 0, + 0.3 + }; + soundSelect[] = + { + "\A3\ui_f\data\sound\RscListbox\soundSelect", + 0.09, + 1 + }; + autoScrollSpeed = -1; + autoScrollDelay = 5; + autoScrollRewind = 0; + arrowEmpty = "#(argb,8,8,3)color(1,1,1,1)"; + arrowFull = "#(argb,8,8,3)color(1,1,1,1)"; + colorPicture[] = + { + 1, + 1, + 1, + 1 + }; + colorPictureSelected[] = + { + 1, + 1, + 1, + 1 + }; + colorPictureDisabled[] = + { + 1, + 1, + 1, + 0.25 + }; + colorPictureRight[] = + { + 1, + 1, + 1, + 1 + }; + colorPictureRightSelected[] = + { + 1, + 1, + 1, + 1 + }; + colorPictureRightDisabled[] = + { + 1, + 1, + 1, + 0.25 + }; + colorTextRight[] = + { + 1, + 1, + 1, + 1 + }; + colorSelectRight[] = + { + 0, + 0, + 0, + 1 + }; + colorSelect2Right[] = + { + 0, + 0, + 0, + 1 + }; + tooltipColorText[] = + { + 1, + 1, + 1, + 1 + }; + tooltipColorBox[] = + { + 1, + 1, + 1, + 1 + }; + tooltipColorShade[] = + { + 0, + 0, + 0, + 0.65 + }; + class ListScrollBar + { + width = 0; + height = 0; + scrollSpeed = 0.01; + arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; + arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; + border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa"; + thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa"; + color[] = {1,1,1,1}; + }; + x = 0; + y = 0; + w = 0.3; + h = 0.3; + style = 16; + font = "RobotoCondensed"; + sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + shadow = 0; + colorShadow[] = + { + 0, + 0, + 0, + 0.5 + }; + period = 1.2; + maxHistoryDelay = 1; +}; +class VAM_RscButton +{ + deletable = 0; + fade = 0; + access = 0; + type = 1; + text = ""; + colorText[] = + { + 1, + 1, + 1, + 1 + }; + colorDisabled[] = + { + 1, + 1, + 1, + 0.25 + }; + colorBackground[] = + { + 0, + 0, + 0, + 0.5 + }; + colorBackgroundDisabled[] = + { + 0, + 0, + 0, + 0.5 + }; + colorBackgroundActive[] = + { + 0, + 0, + 0, + 1 + }; + colorFocused[] = + { + 0, + 0, + 0, + 1 + }; + colorShadow[] = + { + 0, + 0, + 0, + 0 + }; + colorBorder[] = + { + 0, + 0, + 0, + 1 + }; + soundEnter[] = + { + "\A3\ui_f\data\sound\RscButton\soundEnter", + 0.09, + 1 + }; + soundPush[] = + { + "\A3\ui_f\data\sound\RscButton\soundPush", + 0.09, + 1 + }; + soundClick[] = + { + "\A3\ui_f\data\sound\RscButton\soundClick", + 0.09, + 1 + }; + soundEscape[] = + { + "\A3\ui_f\data\sound\RscButton\soundEscape", + 0.09, + 1 + }; + idc = -1; + style = 2; + x = 0; + y = 0; + w = 0.095589; + h = 0.039216; + shadow = 2; + font = "RobotoCondensed"; + sizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + url = ""; + offsetX = 0; + offsetY = 0; + offsetPressedX = 0; + offsetPressedY = 0; + borderSize = 0; +}; +class VAM_IGUIBack +{ + type = 0; + idc = 124; + style = 128; + text = ""; + colorText[] = + { + 0, + 0, + 0, + 0 + }; + font = "RobotoCondensed"; + sizeEx = 0; + shadow = 0; + x = 0.1; + y = 0.1; + w = 0.1; + h = 0.1; + colorbackground[] = + { + "(profilenamespace getvariable ['IGUI_BCG_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_BCG_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_BCG_RGB_B',1])", + "(profilenamespace getvariable ['IGUI_BCG_RGB_A',0.8])" + }; +}; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/VAM_GUI_init.sqf b/Missionframework/VAM_GUI/VAM_GUI_init.sqf new file mode 100644 index 000000000..d9cdc6cb7 --- /dev/null +++ b/Missionframework/VAM_GUI/VAM_GUI_init.sqf @@ -0,0 +1,71 @@ +//Vehicle Appearance Manager GUI init +if (!hasInterface) exitWith {}; + +//Options +//Default setting for VAM_condition_check_options is [];. Add option what you want and separate them with comma. Ex. VAM_condition_check_options = [1,2]; +//For example if you change VAM_condition_check_options to [1,2] from [], you can use VAM when you are near objects those are in list OR in certain marker area +//1 : Activate when player is near vehicles those are in list. +//2 : Activate when player is in certain marker area. (Marker name should be like "VAM_service_area_0", "VAM_service_area_1". You could have multiple marker area.) +//3 : Activate when player is near KP Liberation FOB +VAM_condition_check_options = [1]; +VAM_repair_vehicle_list = [ + "Land_Workbench_01_F" +]; + +//Exception for bug fix and additional cosmetic change. Check out fnc_VAM_GUI_check.sqf. +VAM_exceptions = [ + "I_APC_Wheeled_03_cannon_F","B_APC_Wheeled_03_cannon_F", + "I_LT_01_AT_F","I_LT_01_scout_F","I_LT_01_AA_F","I_LT_01_cannon_F", + "O_APC_Wheeled_02_rcws_F","O_T_APC_Wheeled_02_rcws_ghex_F", + "O_APC_Wheeled_02_rcws_v2_F","O_T_APC_Wheeled_02_rcws_v2_ghex_F", + "B_Heli_Light_01_dynamicLoadout_F","B_Heli_Light_01_armed_F","B_Heli_Light_01_F", + "B_Heli_Attack_01_dynamicLoadout_F","B_Heli_Attack_01_F", + "O_Heli_Light_02_dynamicLoadout_F","O_Heli_Light_02_F","O_Heli_Light_02_unarmed_F","O_Heli_Light_02_v2_F", + "B_UGV_01_rcws_F","B_T_UGV_01_rcws_olive_F","O_UGV_01_rcws_F","O_T_UGV_01_rcws_ghex_F","I_UGV_01_rcws_F" +]; + +//Function preload +fnc_VAM_GUI_check = compileFinal preprocessFileLineNumbers "VAM_GUI\functions\fnc_VAM_GUI_check.sqf"; +fnc_VAM_action = compileFinal preprocessFileLineNumbers "VAM_GUI\functions\fnc_VAM_action.sqf"; +fnc_VAM_reset = compileFinal preprocessFileLineNumbers "VAM_GUI\functions\fnc_VAM_reset.sqf"; +fnc_VAM_condition_check = compileFinal preprocessFileLineNumbers "VAM_GUI\functions\fnc_VAM_condition_check.sqf"; +fnc_VAM_variable_cleaner = compileFinal preprocessFileLineNumbers "VAM_GUI\functions\fnc_VAM_variable_cleaner.sqf"; + +//Vehicle Function +fnc_VAM_common_setup = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\fnc_VAM_common_setup.sqf"; +fnc_VAM_common_camo = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\fnc_VAM_common_camo.sqf"; +fnc_VAM_common_comp = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\fnc_VAM_common_comp.sqf"; +fnc_VAM_common_camo_check = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\fnc_VAM_common_camo_check.sqf"; +fnc_VAM_common_comp_check = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\fnc_VAM_common_comp_check.sqf"; + +fnc_VAM_Gorgon_setup = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\exceptions\Gorgon\fnc_VAM_Gorgon_setup.sqf"; +fnc_VAM_Gorgon_camo = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\exceptions\Gorgon\fnc_VAM_Gorgon_camo.sqf"; +fnc_VAM_Gorgon_camo_check = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\exceptions\Gorgon\fnc_VAM_Gorgon_camo_check.sqf"; + +fnc_VAM_Nyx_setup = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\exceptions\Nyx\fnc_VAM_Nyx_setup.sqf"; +fnc_VAM_Nyx_camo = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\exceptions\Nyx\fnc_VAM_Nyx_camo.sqf"; + +fnc_VAM_Marid_v1_setup = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\exceptions\Marid\fnc_VAM_Marid_v1_setup.sqf"; +fnc_VAM_Marid_v1_comp = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\exceptions\Marid\fnc_VAM_Marid_v1_comp.sqf"; +fnc_VAM_Marid_v1_comp_check = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\exceptions\Marid\fnc_VAM_Marid_v1_comp_check.sqf"; +fnc_VAM_Marid_v2_setup = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\exceptions\Marid\fnc_VAM_Marid_v2_setup.sqf"; +fnc_VAM_Marid_camo = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\exceptions\Marid\fnc_VAM_Marid_camo.sqf"; + +fnc_VAM_HBPN_setup = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\exceptions\HBPN\fnc_VAM_HBPN_setup.sqf"; +fnc_VAM_HBPN_camo = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\exceptions\HBPN\fnc_VAM_HBPN_camo.sqf"; +fnc_VAM_HBPN_camo_check = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\exceptions\HBPN\fnc_VAM_HBPN_camo_check.sqf"; + +fnc_VAM_Blackfoot_setup = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\exceptions\Blackfoot\fnc_VAM_Blackfoot_setup.sqf"; +fnc_VAM_Blackfoot_camo = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\exceptions\Blackfoot\fnc_VAM_Blackfoot_camo.sqf"; +fnc_VAM_Blackfoot_camo_check = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\exceptions\Blackfoot\fnc_VAM_Blackfoot_camo_check.sqf"; + +fnc_VAM_Orca_setup = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\exceptions\Orca\fnc_VAM_Orca_setup.sqf"; +fnc_VAM_Orca_camo = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\exceptions\Orca\fnc_VAM_Orca_camo.sqf"; +fnc_VAM_Orca_camo_check = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\exceptions\Orca\fnc_VAM_Orca_camo_check.sqf"; + +fnc_VAM_UGV_rcws_setup = compileFinal preprocessFileLineNumbers "VAM_GUI\vehicles\exceptions\UGV_rcws\fnc_VAM_UGV_rcws_setup.sqf"; + +if !(count VAM_condition_check_options isEqualTo 0) then {[] spawn fnc_VAM_condition_check;}; +[] spawn fnc_VAM_action; + +systemchat localize "STR_VAM_INITIALIZED"; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/defines.hpp b/Missionframework/VAM_GUI/defines.hpp new file mode 100644 index 000000000..e4110378f --- /dev/null +++ b/Missionframework/VAM_GUI/defines.hpp @@ -0,0 +1,93 @@ +/////////////////////////////////////////////////////////////////////////// +/// Styles +/////////////////////////////////////////////////////////////////////////// + +// Control types +#define CT_STATIC 0 +#define CT_BUTTON 1 +#define CT_EDIT 2 +#define CT_SLIDER 3 +#define CT_COMBO 4 +#define CT_LISTBOX 5 +#define CT_TOOLBOX 6 +#define CT_CHECKBOXES 7 +#define CT_PROGRESS 8 +#define CT_HTML 9 +#define CT_STATIC_SKEW 10 +#define CT_ACTIVETEXT 11 +#define CT_TREE 12 +#define CT_STRUCTURED_TEXT 13 +#define CT_CONTEXT_MENU 14 +#define CT_CONTROLS_GROUP 15 +#define CT_SHORTCUTBUTTON 16 +#define CT_XKEYDESC 40 +#define CT_XBUTTON 41 +#define CT_XLISTBOX 42 +#define CT_XSLIDER 43 +#define CT_XCOMBO 44 +#define CT_ANIMATED_TEXTURE 45 +#define CT_OBJECT 80 +#define CT_OBJECT_ZOOM 81 +#define CT_OBJECT_CONTAINER 82 +#define CT_OBJECT_CONT_ANIM 83 +#define CT_LINEBREAK 98 +#define CT_USER 99 +#define CT_MAP 100 +#define CT_MAP_MAIN 101 +#define CT_LISTNBOX 102 +#define CT_CHECKBOX 77 + +// Static styles +#define ST_POS 0x0F +#define ST_HPOS 0x03 +#define ST_VPOS 0x0C +#define ST_LEFT 0x00 +#define ST_RIGHT 0x01 +#define ST_CENTER 0x02 +#define ST_DOWN 0x04 +#define ST_UP 0x08 +#define ST_VCENTER 0x0C + +#define ST_TYPE 0xF0 +#define ST_SINGLE 0x00 +#define ST_MULTI 0x10 +#define ST_TITLE_BAR 0x20 +#define ST_PICTURE 0x30 +#define ST_FRAME 0x40 +#define ST_BACKGROUND 0x50 +#define ST_GROUP_BOX 0x60 +#define ST_GROUP_BOX2 0x70 +#define ST_HUD_BACKGROUND 0x80 +#define ST_TILE_PICTURE 0x90 +#define ST_WITH_RECT 0xA0 +#define ST_LINE 0xB0 + +#define ST_SHADOW 0x100 +#define ST_NO_RECT 0x200 +#define ST_KEEP_ASPECT_RATIO 0x800 + +#define ST_TITLE ST_TITLE_BAR + ST_CENTER + +// Slider styles +#define SL_DIR 0x400 +#define SL_VERT 0 +#define SL_HORZ 0x400 + +#define SL_TEXTURES 0x10 + +// progress bar +#define ST_VERTICAL 0x01 +#define ST_HORIZONTAL 0 + +// Listbox styles +#define LB_TEXTURES 0x10 +#define LB_MULTI 0x20 + +// Tree styles +#define TR_SHOWROOT 1 +#define TR_AUTOCOLLAPSE 2 + +// MessageBox styles +#define MB_BUTTON_OK 1 +#define MB_BUTTON_CANCEL 2 +#define MB_BUTTON_USER 4 \ No newline at end of file diff --git a/Missionframework/VAM_GUI/functions/fnc_VAM_GUI_check.sqf b/Missionframework/VAM_GUI/functions/fnc_VAM_GUI_check.sqf new file mode 100644 index 000000000..6700b1984 --- /dev/null +++ b/Missionframework/VAM_GUI/functions/fnc_VAM_GUI_check.sqf @@ -0,0 +1,23 @@ +//VAM Check +disableSerialization; +private _VAM_display = findDisplay 4900; +private _vehicleclass = typeof VAM_targetvehicle; +private _vehiclename = getText (configFile >> "CfgVehicles" >> _vehicleclass >> "displayName"); +private _currentvehicletext = _VAM_display displayCtrl 4950; +_currentvehicletext ctrlSetText _vehiclename; + +if !(_vehicleclass in VAM_exceptions) exitWith { + [] spawn fnc_VAM_common_setup; +}; + +Switch (true) do { + Case (_vehicleclass in ["I_APC_Wheeled_03_cannon_F","B_APC_Wheeled_03_cannon_F"]) : {[] spawn fnc_VAM_Gorgon_setup;}; + Case (_vehicleclass in ["I_LT_01_AT_F","I_LT_01_scout_F","I_LT_01_AA_F","I_LT_01_cannon_F"]) : {[] spawn fnc_VAM_Nyx_setup;}; + Case (_vehicleclass in ["O_APC_Wheeled_02_rcws_F","O_T_APC_Wheeled_02_rcws_ghex_F"]) : {[] spawn fnc_VAM_Marid_v1_setup;}; + Case (_vehicleclass in ["O_APC_Wheeled_02_rcws_v2_F","O_T_APC_Wheeled_02_rcws_v2_ghex_F"]) : {[] spawn fnc_VAM_Marid_v2_setup;}; + Case (_vehicleclass in ["B_Heli_Light_01_dynamicLoadout_F","B_Heli_Light_01_armed_F","B_Heli_Light_01_F"]) : {[] spawn fnc_VAM_HBPN_setup;}; + Case (_vehicleclass in ["B_Heli_Attack_01_dynamicLoadout_F","B_Heli_Attack_01_F"]) : {[] spawn fnc_VAM_Blackfoot_setup;}; + Case (_vehicleclass in ["O_Heli_Light_02_dynamicLoadout_F","O_Heli_Light_02_F","O_Heli_Light_02_unarmed_F","O_Heli_Light_02_v2_F"]) : {[] spawn fnc_VAM_Orca_setup;}; + Case (_vehicleclass in ["B_UGV_01_rcws_F","B_T_UGV_01_rcws_olive_F","O_UGV_01_rcws_F","O_T_UGV_01_rcws_ghex_F","I_UGV_01_rcws_F"]) : {[] spawn fnc_VAM_UGV_rcws_setup;}; + default {}; +}; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/functions/fnc_VAM_action.sqf b/Missionframework/VAM_GUI/functions/fnc_VAM_action.sqf new file mode 100644 index 000000000..10387369a --- /dev/null +++ b/Missionframework/VAM_GUI/functions/fnc_VAM_action.sqf @@ -0,0 +1,60 @@ +//VAM Action +disableSerialization; +VAM_condition_result = true; +VAM_cursor_condition = false; +VAM_check_locality = compileFinal " + params ['_target', '_caller']; + if (!(owner _target isEqualTo _caller) && !(unitIsUAV _target)) then { + _target setOwner _caller; + }; + if (!(owner _target isEqualTo _caller) && unitIsUAV _target) then { + (group _target) setGroupOwner _caller; + }; +"; +VAM_action = compileFinal " + player addAction + [ + 'Modify Vehicle', + { + if (VAM_cursor_condition) then { + VAM_targetvehicle = cursorObject; + _my_id = clientOwner; + [VAM_targetvehicle, _my_id] remoteExec ['VAM_check_locality', 2]; + } else { + VAM_targetvehicle = vehicle player; + }; + 0 = createDialog 'VAM_GUI'; + }, + [], 0, false, true, '', + 'VAM_condition_result && (VAM_cursor_condition || (!(player isEqualTo vehicle player) && (player isEqualTo driver vehicle player)))', + -1 + ]; +"; + +[] spawn VAM_action; + +player addEventHandler ["Respawn", {[] spawn VAM_action;}]; + +while {true} do { + if (player isEqualTo vehicle player && cursorObject isKindOf "AllVehicles" && player distance cursorObject < 10 && ((crew cursorObject isEqualTo []) || (unitIsUAV cursorObject && !(isUAVConnected cursorObject)))) then { + _vehicleclass = typeof cursorObject; + _camo_path = "true" configClasses (configfile >> "CfgVehicles" >> _vehicleclass >> "TextureSources"); + _camo_check = true; + if (count _camo_path < 1 && !(_vehicleclass in VAM_exceptions)) then { + _camo_check = false; + }; + _comp_path = configProperties [configfile >> "CfgVehicles" >> _vehicleclass >> "AnimationSources", "!('' isEqualTo getText (_x >> 'DisplayName'))"]; + _comp_check = true; + if (count _comp_path < 1) then { + _comp_check = false; + }; + if (_camo_check || _comp_check) then { + VAM_cursor_condition = true; + } else { + VAM_cursor_condition = false; + }; + } else { + VAM_cursor_condition = false; + }; + sleep 1; +}; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/functions/fnc_VAM_condition_check.sqf b/Missionframework/VAM_GUI/functions/fnc_VAM_condition_check.sqf new file mode 100644 index 000000000..aff64bb02 --- /dev/null +++ b/Missionframework/VAM_GUI/functions/fnc_VAM_condition_check.sqf @@ -0,0 +1,45 @@ +//Vehicle Appearance Manager Condition Check +VAM_condition_1 = false; +VAM_condition_2 = false; +VAM_condition_3 = false; + +while {true} do { + if (1 in VAM_condition_check_options) then { + private _repair_vehicle_finder = vehicles inAreaArray [getPos player, 10, 10, 0, false, 10] select {(typeof _x) in VAM_repair_vehicle_list}; + if (count _repair_vehicle_finder > 0 && alive player) then { + VAM_condition_1 = true; + } else { + VAM_condition_1 = false; + }; + }; + if (2 in VAM_condition_check_options) then { + VAM_condition_2 = false; + { + if (_x find "VAM_service_area_" > -1) then { + if !(VAM_condition_2) then { + if (player inArea _x && alive player) then { + VAM_condition_2 = true; + }; + }; + }; + } forEach allMapMarkers; + }; + if (3 in VAM_condition_check_options) then { + private _nearfob = [] call KPLIB_fnc_getNearestFob; + private _fobdistance = 9999; + if (count _nearfob isEqualTo 3) then { + _fobdistance = player distance _nearfob; + }; + if ((_fobdistance < KPLIB_range_fob) && (alive player)) then { + VAM_condition_3 = true; + } else { + VAM_condition_3 = false; + }; + }; + if (VAM_condition_1 or VAM_condition_2 or VAM_condition_3) then { + VAM_condition_result = true; + } else { + VAM_condition_result = false; + }; + sleep 1; +}; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/functions/fnc_VAM_reset.sqf b/Missionframework/VAM_GUI/functions/fnc_VAM_reset.sqf new file mode 100644 index 000000000..8331510f2 --- /dev/null +++ b/Missionframework/VAM_GUI/functions/fnc_VAM_reset.sqf @@ -0,0 +1,4 @@ +[VAM_targetvehicle, true, [true]] call bis_fnc_initVehicle; +VAM_check_fnc_delay = false; +hint localize "STR_VAM_COMPLETE_RESET"; +hint ""; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/functions/fnc_VAM_variable_cleaner.sqf b/Missionframework/VAM_GUI/functions/fnc_VAM_variable_cleaner.sqf new file mode 100644 index 000000000..15001484d --- /dev/null +++ b/Missionframework/VAM_GUI/functions/fnc_VAM_variable_cleaner.sqf @@ -0,0 +1,10 @@ +uisleep 0.1; +camo_class_names = nil; +camo_display_names = nil; +comp_class_names = nil; +comp_display_names = nil; +current_comp = nil; +VAM_camo_check_complete = nil; +VAM_comp_check_complete = nil; +VAM_check_fnc_delay = nil; +VAM_targetvehicle = nil; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/license.txt b/Missionframework/VAM_GUI/license.txt new file mode 100644 index 000000000..209e51bc9 --- /dev/null +++ b/Missionframework/VAM_GUI/license.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 UNIT_normal + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/Missionframework/VAM_GUI/read_me_EN.txt b/Missionframework/VAM_GUI/read_me_EN.txt new file mode 100644 index 000000000..9c29f0b23 --- /dev/null +++ b/Missionframework/VAM_GUI/read_me_EN.txt @@ -0,0 +1,50 @@ +Vehicle Appearance Manager (GUI) by UNIT_normal +This allows you to change camouflage and component via GUI. +VAM supports most of vanilla vehicles even mod vehicles. +You can apply custom textures by making exceptions. + +Known issue +- Some components are linked each other. It's not VAM's limitation. +- Some components aren't compatible each other. It's not VAM's limitation. +- Some vehicles don't have default customizing value. Reset will not work in that case. + +Installation +1. Put VAM folder on your mission folder. +2. Put stringtable.xml or copy & paste contents to your stringtable.xml. +3. Add this to init.sqf. +[] execVM "VAM_GUI\VAM_GUI_init.sqf"; +4. Add this to description.ext. +#include "VAM_GUI\defines.hpp" +#include "VAM_GUI\VAM_GUI_controls.hpp" +#include "VAM_GUI\VAM_GUI_classes.hpp" + +Option +- In VAM_GUI_init.sqf, you can enable multiple check systems. + +Changelog +1.0 +Released +1.10 +Marid(v1 and v2) fixed. (I suggest you change every v1 to v2) +1.11 +List text size adjusted +1.12 +Liberation FOB distance check system is now available +1.20 +Hidden texture option added for Hummingbird/Pawnee, Blackfoot, Orca +1.21 +Bug fixed (Error message when user is trying to scroll down below last component with arrow down key.) +1.22 +Action method changed. UGV RCWS bug fixed. Introducing fnc_VAM_variable_cleaner +1.3 +Added more condition check options +1.31, 1.32 +Minor change +1.40 +Action mechanism changed +1.41 +Locality problem fixed, some activation conditions has been changed. + +Special Thanks +DCinside ARMA Minor Gallery for testing +JLD server for on-server testing \ No newline at end of file diff --git a/Missionframework/VAM_GUI/read_me_KR.txt b/Missionframework/VAM_GUI/read_me_KR.txt new file mode 100644 index 000000000..e63561bbb --- /dev/null +++ b/Missionframework/VAM_GUI/read_me_KR.txt @@ -0,0 +1,50 @@ +차량 형상 관리자 (GUI) by UNIT_normal +GUI를 통해 위장과 구성품을 바꿀 수 있습니다. +VAM은 대부분의 바닐라, 모드 차량들을 지원합니다. +예외처리를 하여 커스텀 텍스쳐를 적용하는 것이 가능합니다. + +알려진 문제들 +- 몇몇 구성품들이 서로 연결되어 있음. BI가 바꾸기 전까지 단독 적용 등은 불가. +- 몇몇 구성품들은 서로 호환되지 않음. BI가 바꾸기 전까지 동시 적용 등은 불가. +- 리셋 시 기본 값이 없을 시 변화 없음. + +설치 +1. VAM 폴더를 미션폴더에 넣기 +2. stringtable.xml을 넣거나 내용물을 기존에 있던 것에 삽입 +3. init.sqf에 다음 줄 삽입 +[] execVM "VAM_GUI\VAM_GUI_init.sqf"; +4. description.ext에 다음 줄 삽입 +#include "VAM_GUI\defines.hpp" +#include "VAM_GUI\VAM_GUI_controls.hpp" +#include "VAM_GUI\VAM_GUI_classes.hpp" + +옵션 +- VAM_GUI_init.sqf에서 각종 옵션 활성화 가능 + +변경내역 +1.0 +공개 +1.10 +마리드 구형과 신형 버그 픽스 (구형은 신형으로 대체하십시오) +1.11 +리스트 글자 크기 조정 +1.12 +리버레이션 FOB 체크 기능 사용가능 +1.20 +Hummingbird/Pawnee, Blackfoot, Orca 히든 텍스쳐 옵션 추가 +1.21 +구성품 리스트에서 화살표 아래키로 마지막 이하로 내려가려고 할때 나오는 에러 픽스 +1.22 +액션 방법 변경, UGV RCWS 버그 픽스, fnc_VAM_variable_cleaner 추가 +1.3 +컨디션 체크 옵션 추가 +1.31, 1.32 +마이너 체인지 +1.40 +액션 매커니즘 변경 +1.41 +로컬리티 문제 해결, 기타 발동조건 변경 + +고마운 곳들 +디시인사이드 아르마(ARMA) 마이너 갤러리 (테스트 협조) +JLD 서버 (서버 상 테스트) \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/exceptions/Blackfoot/fnc_VAM_Blackfoot_camo.sqf b/Missionframework/VAM_GUI/vehicles/exceptions/Blackfoot/fnc_VAM_Blackfoot_camo.sqf new file mode 100644 index 000000000..f28375e03 --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/exceptions/Blackfoot/fnc_VAM_Blackfoot_camo.sqf @@ -0,0 +1,9 @@ +//VAM Blackfoot Vehicle Camo Apply +disableSerialization; +private _VAM_display = findDisplay 4900; +private _list_camo = _VAM_display displayCtrl 4910; + +private _list_selection = lbCurSel _list_camo; +private _selected_camo_class_name = camo_class_names select _list_selection; + +VAM_targetvehicle setObjectTextureGlobal [0, _selected_camo_class_name]; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/exceptions/Blackfoot/fnc_VAM_Blackfoot_camo_check.sqf b/Missionframework/VAM_GUI/vehicles/exceptions/Blackfoot/fnc_VAM_Blackfoot_camo_check.sqf new file mode 100644 index 000000000..fe0a0f77b --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/exceptions/Blackfoot/fnc_VAM_Blackfoot_camo_check.sqf @@ -0,0 +1,16 @@ +//VAM Blackfoot Vehicle Camouflage Check +disableSerialization; +waitUntil {!(VAM_check_fnc_delay)}; +private _VAM_display = findDisplay 4900; +private _list_camo = _VAM_display displayCtrl 4910; + +private _check = getObjectTextures VAM_targetvehicle select 0; + +//Check current applied camouflage +{ + if (_check isEqualTo _x) then { + _list_camo lbSetCurSel _forEachIndex; + }; +} forEach camo_class_names; + +VAM_camo_check_complete = true; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/exceptions/Blackfoot/fnc_VAM_Blackfoot_setup.sqf b/Missionframework/VAM_GUI/vehicles/exceptions/Blackfoot/fnc_VAM_Blackfoot_setup.sqf new file mode 100644 index 000000000..b8f36caef --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/exceptions/Blackfoot/fnc_VAM_Blackfoot_setup.sqf @@ -0,0 +1,82 @@ +//VAM Blackfoot Vehicle GUI Setup +disableSerialization; +private _VAM_display = findDisplay 4900; +private _list_camo = _VAM_display displayCtrl 4910; +private _list_comp = _VAM_display displayCtrl 4920; +private _confirm = _VAM_display displayCtrl 4930; +private _reset = _VAM_display displayCtrl 4940; + +private _vehicleclass = typeof VAM_targetvehicle; + +//Get all camouflages(texture sets) +private _camo_path = "true" configClasses (configfile >> "CfgVehicles" >> _vehicleclass >> "TextureSources"); +camo_class_names = []; +camo_display_names = []; +private _textures_names = [ + "STR_VAM_DARK_GREEN_CAMO", + "STR_VAM_GREEN_CAMO" +]; +private _textures = [ + "a3\air_f_beta\heli_attack_01\data\heli_attack_01_co.paa", + "a3\air_f\heli_light_02\data\heli_light_02_common_co.paa" +]; +{ + camo_class_names pushBack _x; +} forEach _textures; +{ + camo_display_names pushBack (localize _x); +} forEach _textures_names; + +//Get all components(animations) +private _getvc = [VAM_targetvehicle] call BIS_fnc_getVehicleCustomization; +private _check_comp = _getvc select 1; +comp_class_names = []; +{ + if (_x isEqualType "STRING") then { + comp_class_names pushBack (_check_comp select _forEachIndex); + }; +} forEach _check_comp; +comp_display_names = []; +{_name = getText (configfile >> "CfgVehicles" >> _vehicleclass >> "AnimationSources" >> _x >> "DisplayName"); comp_display_names pushBack _name;} forEach comp_class_names; +{ + if (_x isEqualTo "") then { + comp_display_names set [_forEachIndex, comp_class_names select _forEachIndex]; + }; +} forEach comp_display_names; + +//Put camouflages and components in list +if (camo_class_names isEqualTo []) then { + _list_camo lbAdd localize "STR_VAM_NO_CAMOUFLAGE"; +} else { + {_list_camo lbAdd _x} forEach camo_display_names; +}; +if (comp_class_names isEqualTo []) then { + _list_comp lbAdd localize "STR_VAM_NO_COMPONENT"; +} else { + {_list_comp lbAdd _x} forEach comp_display_names; +}; + +//Spawn check functions +VAM_camo_check_complete = true; +VAM_comp_check_complete = true; +VAM_check_fnc_delay = false; + +if !(camo_class_names isEqualTo []) then { + [] spawn fnc_VAM_Blackfoot_camo_check; + VAM_camo_check_complete = false; +}; +if !(comp_class_names isEqualTo []) then { + [] spawn fnc_VAM_common_comp_check; + VAM_comp_check_complete = false; +}; +waitUntil {uisleep 0.1; VAM_camo_check_complete && VAM_comp_check_complete}; + +//Add UIEH +if !(camo_class_names isEqualTo []) then { + _list_camo ctrlAddEventHandler ["LBSelChanged", {[] spawn fnc_VAM_Blackfoot_camo;}]; +}; +if !(comp_class_names isEqualTo []) then { + _list_comp ctrlAddEventHandler ["LBSelChanged", {[] spawn fnc_VAM_common_comp;}]; +}; +_reset ctrlAddEventHandler ["ButtonClick", {VAM_check_fnc_delay = true; [] spawn fnc_VAM_Blackfoot_camo_check; [] spawn fnc_VAM_common_comp_check;}]; +_confirm ctrlAddEventHandler ["ButtonClick", {[] spawn fnc_VAM_variable_cleaner;}]; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/exceptions/Gorgon/fnc_VAM_Gorgon_camo.sqf b/Missionframework/VAM_GUI/vehicles/exceptions/Gorgon/fnc_VAM_Gorgon_camo.sqf new file mode 100644 index 000000000..1e87e4ced --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/exceptions/Gorgon/fnc_VAM_Gorgon_camo.sqf @@ -0,0 +1,19 @@ +//VAM Gorgon Vehicle Camo Apply +disableSerialization; +private _VAM_display = findDisplay 4900; +private _list_camo = _VAM_display displayCtrl 4910; + +private _list_selection = lbCurSel _list_camo; +private _selected_camo_class_name = camo_class_names select _list_selection; +private _gorgon_blufor = [ + "a3\armor_f_gamma\apc_wheeled_03\data\apc_wheeled_03_ext_co.paa", + "a3\armor_f_gamma\apc_wheeled_03\data\apc_wheeled_03_ext2_co.paa", + "a3\armor_f_gamma\apc_wheeled_03\data\rcws30_co.paa", + "a3\armor_f_gamma\apc_wheeled_03\data\apc_wheeled_03_ext_alpha_co.paa", + "a3\armor_f\data\camonet_nato_desert_co.paa", + "a3\armor_f\data\cage_sand_co.paa"]; +if (_selected_camo_class_name isEqualTo localize "STR_VAM_BLUFOR_CAMO") exitWith { + [VAM_targetvehicle,["Indep",1],nil,nil] call BIS_fnc_initVehicle; + {VAM_targetvehicle setObjectTextureGlobal [_forEachIndex, _x];} forEach _gorgon_blufor; +}; +[VAM_targetvehicle,[_selected_camo_class_name,1],nil,nil] call BIS_fnc_initVehicle; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/exceptions/Gorgon/fnc_VAM_Gorgon_camo_check.sqf b/Missionframework/VAM_GUI/vehicles/exceptions/Gorgon/fnc_VAM_Gorgon_camo_check.sqf new file mode 100644 index 000000000..0fbad26e9 --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/exceptions/Gorgon/fnc_VAM_Gorgon_camo_check.sqf @@ -0,0 +1,35 @@ +//VAM Gorgon Vehicle Camouflage Check +disableSerialization; +waitUntil {!(VAM_check_fnc_delay)}; +private _VAM_display = findDisplay 4900; +private _list_camo = _VAM_display displayCtrl 4910; + +private _getvc = [VAM_targetvehicle] call BIS_fnc_getVehicleCustomization; + +private _camo_slot = _getvc select 0; +private _current_camo = _camo_slot select 0; +private _gorgon_blufor_check = getObjectTextures VAM_targetvehicle; +private _gorgon_blufor = [ + "a3\armor_f_gamma\apc_wheeled_03\data\apc_wheeled_03_ext_co.paa", + "a3\armor_f_gamma\apc_wheeled_03\data\apc_wheeled_03_ext2_co.paa", + "a3\armor_f_gamma\apc_wheeled_03\data\rcws30_co.paa", + "a3\armor_f_gamma\apc_wheeled_03\data\apc_wheeled_03_ext_alpha_co.paa", + "a3\armor_f\data\camonet_nato_desert_co.paa", + "a3\armor_f\data\cage_sand_co.paa"]; + +//Check current applied camouflage +if (_gorgon_blufor_check isEqualTo _gorgon_blufor) exitWith { + { + if (localize "STR_VAM_BLUFOR_CAMO" isEqualTo _x) then { + _list_camo lbSetCurSel _forEachIndex; + }; + } forEach camo_class_names; + VAM_camo_check_complete = true; +}; +{ + if (_current_camo isEqualTo _x) then { + _list_camo lbSetCurSel _forEachIndex; + }; +} forEach camo_class_names; + +VAM_camo_check_complete = true; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/exceptions/Gorgon/fnc_VAM_Gorgon_setup.sqf b/Missionframework/VAM_GUI/vehicles/exceptions/Gorgon/fnc_VAM_Gorgon_setup.sqf new file mode 100644 index 000000000..405823f78 --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/exceptions/Gorgon/fnc_VAM_Gorgon_setup.sqf @@ -0,0 +1,77 @@ +//VAM Gorgon Vehicle GUI Setup +disableSerialization; +private _VAM_display = findDisplay 4900; +private _list_camo = _VAM_display displayCtrl 4910; +private _list_comp = _VAM_display displayCtrl 4920; +private _confirm = _VAM_display displayCtrl 4930; +private _reset = _VAM_display displayCtrl 4940; + +private _vehicleclass = typeof VAM_targetvehicle; + +//Get all camouflages(texture sets) +private _camo_path = "true" configClasses (configfile >> "CfgVehicles" >> _vehicleclass >> "TextureSources"); +camo_class_names = []; +camo_display_names = []; +{_class = configName _x; camo_class_names pushBack _class;} forEach _camo_path; +{_name = getText (configfile >> "CfgVehicles" >> _vehicleclass >> "TextureSources" >> _x >> "DisplayName"); camo_display_names pushBack _name;} forEach camo_class_names; +{ + if (_x isEqualTo "") then { + camo_display_names set [_forEachIndex, camo_class_names select _forEachIndex]; + }; +} forEach camo_display_names; +camo_class_names pushBack (localize "STR_VAM_BLUFOR_CAMO"); +camo_display_names pushBack (localize "STR_VAM_BLUFOR_CAMO"); + +//Get all components(animations) +private _getvc = [VAM_targetvehicle] call BIS_fnc_getVehicleCustomization; +private _check_comp = _getvc select 1; +comp_class_names = []; +{ + if (_x isEqualType "STRING") then { + comp_class_names pushBack (_check_comp select _forEachIndex); + }; +} forEach _check_comp; +comp_display_names = []; +{_name = getText (configfile >> "CfgVehicles" >> _vehicleclass >> "AnimationSources" >> _x >> "DisplayName"); comp_display_names pushBack _name;} forEach comp_class_names; +{ + if (_x isEqualTo "") then { + comp_display_names set [_forEachIndex, comp_class_names select _forEachIndex]; + }; +} forEach comp_display_names; + +//Put camouflages and components in list +if (camo_class_names isEqualTo []) then { + _list_camo lbAdd localize "STR_VAM_NO_CAMOUFLAGE"; +} else { + {_list_camo lbAdd _x} forEach camo_display_names; +}; +if (comp_class_names isEqualTo []) then { + _list_comp lbAdd localize "STR_VAM_NO_COMPONENT"; +} else { + {_list_comp lbAdd _x} forEach comp_display_names; +}; + +//Spawn check functions +VAM_camo_check_complete = true; +VAM_comp_check_complete = true; +VAM_check_fnc_delay = false; + +if !(camo_class_names isEqualTo []) then { + [] spawn fnc_VAM_Gorgon_camo_check; + VAM_camo_check_complete = false; +}; +if !(comp_class_names isEqualTo []) then { + [] spawn fnc_VAM_common_comp_check; + VAM_comp_check_complete = false; +}; +waitUntil {uisleep 0.1; VAM_camo_check_complete && VAM_comp_check_complete}; + +//Add UIEH +if !(camo_class_names isEqualTo []) then { + _list_camo ctrlAddEventHandler ["LBSelChanged", {[] spawn fnc_VAM_Gorgon_camo;}]; +}; +if !(comp_class_names isEqualTo []) then { + _list_comp ctrlAddEventHandler ["LBSelChanged", {[] spawn fnc_VAM_common_comp;}]; +}; +_reset ctrlAddEventHandler ["ButtonClick", {VAM_check_fnc_delay = true; [] spawn fnc_VAM_Gorgon_camo_check; [] spawn fnc_VAM_common_comp_check;}]; +_confirm ctrlAddEventHandler ["ButtonClick", {[] spawn fnc_VAM_variable_cleaner;}]; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/exceptions/HBPN/fnc_VAM_HBPN_camo.sqf b/Missionframework/VAM_GUI/vehicles/exceptions/HBPN/fnc_VAM_HBPN_camo.sqf new file mode 100644 index 000000000..8d3f20512 --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/exceptions/HBPN/fnc_VAM_HBPN_camo.sqf @@ -0,0 +1,9 @@ +//VAM Hummingbird/Pawnee Vehicle Camo Apply +disableSerialization; +private _VAM_display = findDisplay 4900; +private _list_camo = _VAM_display displayCtrl 4910; + +private _list_selection = lbCurSel _list_camo; +private _selected_camo_class_name = camo_class_names select _list_selection; + +VAM_targetvehicle setObjectTextureGlobal [0, _selected_camo_class_name]; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/exceptions/HBPN/fnc_VAM_HBPN_camo_check.sqf b/Missionframework/VAM_GUI/vehicles/exceptions/HBPN/fnc_VAM_HBPN_camo_check.sqf new file mode 100644 index 000000000..0211aafc8 --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/exceptions/HBPN/fnc_VAM_HBPN_camo_check.sqf @@ -0,0 +1,16 @@ +//VAM Hummingbird/Pawnee Vehicle Camouflage Check +disableSerialization; +waitUntil {!(VAM_check_fnc_delay)}; +private _VAM_display = findDisplay 4900; +private _list_camo = _VAM_display displayCtrl 4910; + +private _check = getObjectTextures VAM_targetvehicle select 0; + +//Check current applied camouflage +{ + if (_check isEqualTo _x) then { + _list_camo lbSetCurSel _forEachIndex; + }; +} forEach camo_class_names; + +VAM_camo_check_complete = true; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/exceptions/HBPN/fnc_VAM_HBPN_setup.sqf b/Missionframework/VAM_GUI/vehicles/exceptions/HBPN/fnc_VAM_HBPN_setup.sqf new file mode 100644 index 000000000..9b6d1ec0f --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/exceptions/HBPN/fnc_VAM_HBPN_setup.sqf @@ -0,0 +1,84 @@ +//VAM Hummingbird/Pawnee Vehicle GUI Setup +disableSerialization; +private _VAM_display = findDisplay 4900; +private _list_camo = _VAM_display displayCtrl 4910; +private _list_comp = _VAM_display displayCtrl 4920; +private _confirm = _VAM_display displayCtrl 4930; +private _reset = _VAM_display displayCtrl 4940; + +private _vehicleclass = typeof VAM_targetvehicle; + +//Get all camouflages(texture sets) +private _camo_path = "true" configClasses (configfile >> "CfgVehicles" >> _vehicleclass >> "TextureSources"); +camo_class_names = []; +camo_display_names = []; +private _textures_names = [ + "STR_VAM_GREEN_CAMO", + "STR_VAM_BLACK_CAMO", + "STR_VAM_AAF_CAMO" +]; +private _textures = [ + "a3\air_f\heli_light_01\data\heli_light_01_ext_blufor_co.paa", + "a3\air_f\heli_light_01\data\heli_light_01_ext_ion_co.paa", + "a3\air_f\heli_light_01\data\heli_light_01_ext_indp_co.paa" +]; +{ + camo_class_names pushBack _x; +} forEach _textures; +{ + camo_display_names pushBack (localize _x); +} forEach _textures_names; + +//Get all components(animations) +private _getvc = [VAM_targetvehicle] call BIS_fnc_getVehicleCustomization; +private _check_comp = _getvc select 1; +comp_class_names = []; +{ + if (_x isEqualType "STRING") then { + comp_class_names pushBack (_check_comp select _forEachIndex); + }; +} forEach _check_comp; +comp_display_names = []; +{_name = getText (configfile >> "CfgVehicles" >> _vehicleclass >> "AnimationSources" >> _x >> "DisplayName"); comp_display_names pushBack _name;} forEach comp_class_names; +{ + if (_x isEqualTo "") then { + comp_display_names set [_forEachIndex, comp_class_names select _forEachIndex]; + }; +} forEach comp_display_names; + +//Put camouflages and components in list +if (camo_class_names isEqualTo []) then { + _list_camo lbAdd localize "STR_VAM_NO_CAMOUFLAGE"; +} else { + {_list_camo lbAdd _x} forEach camo_display_names; +}; +if (comp_class_names isEqualTo []) then { + _list_comp lbAdd localize "STR_VAM_NO_COMPONENT"; +} else { + {_list_comp lbAdd _x} forEach comp_display_names; +}; + +//Spawn check functions +VAM_camo_check_complete = true; +VAM_comp_check_complete = true; +VAM_check_fnc_delay = false; + +if !(camo_class_names isEqualTo []) then { + [] spawn fnc_VAM_HBPN_camo_check; + VAM_camo_check_complete = false; +}; +if !(comp_class_names isEqualTo []) then { + [] spawn fnc_VAM_common_comp_check; + VAM_comp_check_complete = false; +}; +waitUntil {uisleep 0.1; VAM_camo_check_complete && VAM_comp_check_complete}; + +//Add UIEH +if !(camo_class_names isEqualTo []) then { + _list_camo ctrlAddEventHandler ["LBSelChanged", {[] spawn fnc_VAM_HBPN_camo;}]; +}; +if !(comp_class_names isEqualTo []) then { + _list_comp ctrlAddEventHandler ["LBSelChanged", {[] spawn fnc_VAM_common_comp;}]; +}; +_reset ctrlAddEventHandler ["ButtonClick", {VAM_check_fnc_delay = true; [] spawn fnc_VAM_HBPN_camo_check; [] spawn fnc_VAM_common_comp_check;}]; +_confirm ctrlAddEventHandler ["ButtonClick", {[] spawn fnc_VAM_variable_cleaner;}]; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/exceptions/Marid/fnc_VAM_Marid_camo.sqf b/Missionframework/VAM_GUI/vehicles/exceptions/Marid/fnc_VAM_Marid_camo.sqf new file mode 100644 index 000000000..7ebcc561b --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/exceptions/Marid/fnc_VAM_Marid_camo.sqf @@ -0,0 +1,28 @@ +//VAM Marid Vehicle Camo Apply +disableSerialization; +private _VAM_display = findDisplay 4900; +private _list_camo = _VAM_display displayCtrl 4910; + +private _list_selection = lbCurSel _list_camo; +private _selected_camo_class_name = camo_class_names select _list_selection; +private _hex = [ + "a3\armor_f_beta\apc_wheeled_02\data\apc_wheeled_02_ext_01_opfor_co.paa", + "a3\armor_f_beta\apc_wheeled_02\data\apc_wheeled_02_ext_02_opfor_co.paa", + "a3\data_f\vehicles\turret_opfor_co.paa", + "a3\armor_f\data\camonet_csat_hex_desert_co.paa", + "a3\armor_f\data\cage_csat_co.paa" +]; +private _greenhex = [ + "a3\armor_f_exp\apc_wheeled_02\data\apc_wheeled_02_ext_01_ghex_co.paa", + "a3\armor_f_exp\apc_wheeled_02\data\apc_wheeled_02_ext_02_ghex_co.paa", + "a3\data_f_exp\vehicles\turret_ghex_co.paa", + "a3\armor_f\data\camonet_csat_hex_green_co.paa", + "a3\armor_f\data\cage_csat_green_co.paa" +]; +[VAM_targetvehicle,[_selected_camo_class_name,1],nil,nil] call BIS_fnc_initVehicle; +if (_selected_camo_class_name isEqualTo "Hex") then { + {VAM_targetvehicle setObjectTextureGlobal [_forEachIndex, _x];} forEach _hex; +}; +if (_selected_camo_class_name isEqualTo "GreenHex") then { + {VAM_targetvehicle setObjectTextureGlobal [_forEachIndex, _x];} forEach _greenhex; +}; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/exceptions/Marid/fnc_VAM_Marid_v1_comp.sqf b/Missionframework/VAM_GUI/vehicles/exceptions/Marid/fnc_VAM_Marid_v1_comp.sqf new file mode 100644 index 000000000..f7e2d0e00 --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/exceptions/Marid/fnc_VAM_Marid_v1_comp.sqf @@ -0,0 +1,21 @@ +//VAM Marid v1 Vehicle Comp Apply +disableSerialization; +private _VAM_display = findDisplay 4900; +private _list_comp = _VAM_display displayCtrl 4920; + +private _list_selection = lbSelection _list_comp select 0; +if (isNil "_list_selection") exitWith {}; +private _comp_array = current_comp; +private "_comp_change"; +if (_comp_array select _list_selection isEqualTo 0) then {_comp_change = 1;}; +if (_comp_array select _list_selection isEqualTo 1) then {_comp_change = 0;}; +_comp_array set [_list_selection, _comp_change]; + +private _comp_array_total = []; +{ + _comp_array_total pushBack (comp_class_names select _forEachIndex); + _comp_array_total pushBack (_comp_array select _forEachIndex); +} forEach comp_class_names; +[VAM_targetvehicle,nil,_comp_array_total,nil] call BIS_fnc_initVehicle; + +[] spawn fnc_VAM_Marid_v1_comp_check; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/exceptions/Marid/fnc_VAM_Marid_v1_comp_check.sqf b/Missionframework/VAM_GUI/vehicles/exceptions/Marid/fnc_VAM_Marid_v1_comp_check.sqf new file mode 100644 index 000000000..33f384a79 --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/exceptions/Marid/fnc_VAM_Marid_v1_comp_check.sqf @@ -0,0 +1,23 @@ +//VAM Marid v1 Vehicle Component Check +disableSerialization; +if (VAM_check_fnc_delay) then { + current_comp = [0,0,0,0,0]; + [VAM_targetvehicle,nil,["showBags",0,"showCanisters",0,"showTools",0,"showCamonetHull",0,"showSLATHull",0],nil] call BIS_fnc_initVehicle; +}; +waitUntil {!(VAM_check_fnc_delay)}; +private _VAM_display = findDisplay 4900; +private _list_comp = _VAM_display displayCtrl 4920; + +//Reset list selection +{ + _list_comp lbSetSelected [_forEachIndex, false]; +} forEach current_comp; + +//Check current applied components +{ + if (_x isEqualTo 1) then { + _list_comp lbSetSelected [_forEachIndex, true]; + }; +} forEach current_comp; + +VAM_comp_check_complete = true; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/exceptions/Marid/fnc_VAM_Marid_v1_setup.sqf b/Missionframework/VAM_GUI/vehicles/exceptions/Marid/fnc_VAM_Marid_v1_setup.sqf new file mode 100644 index 000000000..896c942f9 --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/exceptions/Marid/fnc_VAM_Marid_v1_setup.sqf @@ -0,0 +1,71 @@ +//VAM Marid v1 Vehicle GUI Setup +disableSerialization; +private _VAM_display = findDisplay 4900; +private _list_camo = _VAM_display displayCtrl 4910; +private _list_comp = _VAM_display displayCtrl 4920; +private _confirm = _VAM_display displayCtrl 4930; +private _reset = _VAM_display displayCtrl 4940; + +private _vehicleclass = typeof VAM_targetvehicle; + +//Get all camouflages(texture sets) +private _camo_path = "true" configClasses (configfile >> "CfgVehicles" >> _vehicleclass >> "TextureSources"); +camo_class_names = []; +camo_display_names = []; +{_class = configName _x; camo_class_names pushBack _class;} forEach _camo_path; +{_name = getText (configfile >> "CfgVehicles" >> _vehicleclass >> "TextureSources" >> _x >> "DisplayName"); camo_display_names pushBack _name;} forEach camo_class_names; +{ + if (_x isEqualTo "") then { + camo_display_names set [_forEachIndex, camo_class_names select _forEachIndex]; + }; +} forEach camo_display_names; + +//Get all components(animations) +comp_class_names = ["showBags","showCanisters","showTools","showCamonetHull","showSLATHull"]; +comp_display_names = []; +{_name = getText (configfile >> "CfgVehicles" >> "O_APC_Wheeled_02_rcws_v2_F" >> "AnimationSources" >> _x >> "DisplayName"); comp_display_names pushBack _name;} forEach comp_class_names; +{ + if (_x isEqualTo "") then { + comp_display_names set [_forEachIndex, comp_class_names select _forEachIndex]; + }; +} forEach comp_display_names; +current_comp = [0,0,0,0,0]; + +//Put camouflages and components in list +if (camo_class_names isEqualTo []) then { + _list_camo lbAdd localize "STR_VAM_NO_CAMOUFLAGE"; +} else { + {_list_camo lbAdd _x} forEach camo_display_names; +}; +if (comp_class_names isEqualTo []) then { + _list_comp lbAdd localize "STR_VAM_NO_COMPONENT"; +} else { + {_list_comp lbAdd _x} forEach comp_display_names; +}; + +//Spawn check functions +VAM_camo_check_complete = true; +VAM_comp_check_complete = true; +VAM_check_fnc_delay = false; + +if !(camo_class_names isEqualTo []) then { + [] spawn fnc_VAM_common_camo_check; + VAM_camo_check_complete = false; +}; +if !(comp_class_names isEqualTo []) then { + [] spawn fnc_VAM_Marid_v1_comp_check; + VAM_comp_check_complete = false; +}; +waitUntil {uisleep 0.1; VAM_camo_check_complete && VAM_comp_check_complete}; + +//Add UIEH +if !(camo_class_names isEqualTo []) then { + _list_camo ctrlAddEventHandler ["LBSelChanged", {[] spawn fnc_VAM_Marid_camo;}]; +}; +if !(comp_class_names isEqualTo []) then { + _list_comp ctrlAddEventHandler ["LBSelChanged", {[] spawn fnc_VAM_Marid_v1_comp;}]; +}; +_reset ctrlAddEventHandler ["ButtonClick", {VAM_check_fnc_delay = true; [] spawn fnc_VAM_common_camo_check; [] spawn fnc_VAM_Marid_v1_comp_check;}]; +_confirm ctrlAddEventHandler ["ButtonClick", {[] spawn fnc_VAM_variable_cleaner;}]; + +"NOTICE" hintC localize "STR_VAM_MARID_V1_NOTICE"; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/exceptions/Marid/fnc_VAM_Marid_v2_setup.sqf b/Missionframework/VAM_GUI/vehicles/exceptions/Marid/fnc_VAM_Marid_v2_setup.sqf new file mode 100644 index 000000000..ad075f350 --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/exceptions/Marid/fnc_VAM_Marid_v2_setup.sqf @@ -0,0 +1,75 @@ +//VAM Marid v2 Vehicle GUI Setup +disableSerialization; +private _VAM_display = findDisplay 4900; +private _list_camo = _VAM_display displayCtrl 4910; +private _list_comp = _VAM_display displayCtrl 4920; +private _confirm = _VAM_display displayCtrl 4930; +private _reset = _VAM_display displayCtrl 4940; + +private _vehicleclass = typeof VAM_targetvehicle; + +//Get all camouflages(texture sets) +private _camo_path = "true" configClasses (configfile >> "CfgVehicles" >> _vehicleclass >> "TextureSources"); +camo_class_names = []; +camo_display_names = []; +{_class = configName _x; camo_class_names pushBack _class;} forEach _camo_path; +{_name = getText (configfile >> "CfgVehicles" >> _vehicleclass >> "TextureSources" >> _x >> "DisplayName"); camo_display_names pushBack _name;} forEach camo_class_names; +{ + if (_x isEqualTo "") then { + camo_display_names set [_forEachIndex, camo_class_names select _forEachIndex]; + }; +} forEach camo_display_names; + +//Get all components(animations) +private _getvc = [VAM_targetvehicle] call BIS_fnc_getVehicleCustomization; +private _check_comp = _getvc select 1; +comp_class_names = []; +{ + if (_x isEqualType "STRING") then { + comp_class_names pushBack (_check_comp select _forEachIndex); + }; +} forEach _check_comp; +comp_display_names = []; +{_name = getText (configfile >> "CfgVehicles" >> _vehicleclass >> "AnimationSources" >> _x >> "DisplayName"); comp_display_names pushBack _name;} forEach comp_class_names; +{ + if (_x isEqualTo "") then { + comp_display_names set [_forEachIndex, comp_class_names select _forEachIndex]; + }; +} forEach comp_display_names; + +//Put camouflages and components in list +if (camo_class_names isEqualTo []) then { + _list_camo lbAdd localize "STR_VAM_NO_CAMOUFLAGE"; +} else { + {_list_camo lbAdd _x} forEach camo_display_names; +}; +if (comp_class_names isEqualTo []) then { + _list_comp lbAdd localize "STR_VAM_NO_COMPONENT"; +} else { + {_list_comp lbAdd _x} forEach comp_display_names; +}; + +//Spawn check functions +VAM_camo_check_complete = true; +VAM_comp_check_complete = true; +VAM_check_fnc_delay = false; + +if !(camo_class_names isEqualTo []) then { + [] spawn fnc_VAM_common_camo_check; + VAM_camo_check_complete = false; +}; +if !(comp_class_names isEqualTo []) then { + [] spawn fnc_VAM_common_comp_check; + VAM_comp_check_complete = false; +}; +waitUntil {uisleep 0.1; VAM_camo_check_complete && VAM_comp_check_complete}; + +//Add UIEH +if !(camo_class_names isEqualTo []) then { + _list_camo ctrlAddEventHandler ["LBSelChanged", {[] spawn fnc_VAM_Marid_camo;}]; +}; +if !(comp_class_names isEqualTo []) then { + _list_comp ctrlAddEventHandler ["LBSelChanged", {[] spawn fnc_VAM_common_comp;}]; +}; +_reset ctrlAddEventHandler ["ButtonClick", {VAM_check_fnc_delay = true; [] spawn fnc_VAM_common_camo_check; [] spawn fnc_VAM_common_comp_check;}]; +_confirm ctrlAddEventHandler ["ButtonClick", {[] spawn fnc_VAM_variable_cleaner;}]; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/exceptions/Nyx/fnc_VAM_Nyx_camo.sqf b/Missionframework/VAM_GUI/vehicles/exceptions/Nyx/fnc_VAM_Nyx_camo.sqf new file mode 100644 index 000000000..c9950974d --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/exceptions/Nyx/fnc_VAM_Nyx_camo.sqf @@ -0,0 +1,11 @@ +//VAM Nyx Vehicle Camo Apply +disableSerialization; +private _VAM_display = findDisplay 4900; +private _list_camo = _VAM_display displayCtrl 4910; + +private _list_selection = lbCurSel _list_camo; +private _selected_camo_class_name = camo_class_names select _list_selection; +[VAM_targetvehicle,[_selected_camo_class_name,1],nil,nil] call BIS_fnc_initVehicle; +if (_selected_camo_class_name isEqualTo "Indep_Olive") then { + VAM_targetvehicle setObjectTextureGlobal [2, "A3\Armor_F\Data\camonet_NATO_Green_CO.paa"]; +}; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/exceptions/Nyx/fnc_VAM_Nyx_setup.sqf b/Missionframework/VAM_GUI/vehicles/exceptions/Nyx/fnc_VAM_Nyx_setup.sqf new file mode 100644 index 000000000..36d9861b3 --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/exceptions/Nyx/fnc_VAM_Nyx_setup.sqf @@ -0,0 +1,75 @@ +//VAM Nyx Vehicle GUI Setup +disableSerialization; +private _VAM_display = findDisplay 4900; +private _list_camo = _VAM_display displayCtrl 4910; +private _list_comp = _VAM_display displayCtrl 4920; +private _confirm = _VAM_display displayCtrl 4930; +private _reset = _VAM_display displayCtrl 4940; + +private _vehicleclass = typeof VAM_targetvehicle; + +//Get all camouflages(texture sets) +private _camo_path = "true" configClasses (configfile >> "CfgVehicles" >> _vehicleclass >> "TextureSources"); +camo_class_names = []; +camo_display_names = []; +{_class = configName _x; camo_class_names pushBack _class;} forEach _camo_path; +{_name = getText (configfile >> "CfgVehicles" >> _vehicleclass >> "TextureSources" >> _x >> "DisplayName"); camo_display_names pushBack _name;} forEach camo_class_names; +{ + if (_x isEqualTo "") then { + camo_display_names set [_forEachIndex, camo_class_names select _forEachIndex]; + }; +} forEach camo_display_names; + +//Get all components(animations) +private _getvc = [VAM_targetvehicle] call BIS_fnc_getVehicleCustomization; +private _check_comp = _getvc select 1; +comp_class_names = []; +{ + if (_x isEqualType "STRING") then { + comp_class_names pushBack (_check_comp select _forEachIndex); + }; +} forEach _check_comp; +comp_display_names = []; +{_name = getText (configfile >> "CfgVehicles" >> _vehicleclass >> "AnimationSources" >> _x >> "DisplayName"); comp_display_names pushBack _name;} forEach comp_class_names; +{ + if (_x isEqualTo "") then { + comp_display_names set [_forEachIndex, comp_class_names select _forEachIndex]; + }; +} forEach comp_display_names; + +//Put camouflages and components in list +if (camo_class_names isEqualTo []) then { + _list_camo lbAdd localize "STR_VAM_NO_CAMOUFLAGE"; +} else { + {_list_camo lbAdd _x} forEach camo_display_names; +}; +if (comp_class_names isEqualTo []) then { + _list_comp lbAdd localize "STR_VAM_NO_COMPONENT"; +} else { + {_list_comp lbAdd _x} forEach comp_display_names; +}; + +//Spawn check functions +VAM_camo_check_complete = true; +VAM_comp_check_complete = true; +VAM_check_fnc_delay = false; + +if !(camo_class_names isEqualTo []) then { + [] spawn fnc_VAM_common_camo_check; + VAM_camo_check_complete = false; +}; +if !(comp_class_names isEqualTo []) then { + [] spawn fnc_VAM_common_comp_check; + VAM_comp_check_complete = false; +}; +waitUntil {uisleep 0.1; VAM_camo_check_complete && VAM_comp_check_complete}; + +//Add UIEH +if !(camo_class_names isEqualTo []) then { + _list_camo ctrlAddEventHandler ["LBSelChanged", {[] spawn fnc_VAM_Nyx_camo;}]; +}; +if !(comp_class_names isEqualTo []) then { + _list_comp ctrlAddEventHandler ["LBSelChanged", {[] spawn fnc_VAM_common_comp;}]; +}; +_reset ctrlAddEventHandler ["ButtonClick", {VAM_check_fnc_delay = true; [] spawn fnc_VAM_common_camo_check; [] spawn fnc_VAM_common_comp_check;}]; +_confirm ctrlAddEventHandler ["ButtonClick", {[] spawn fnc_VAM_variable_cleaner;}]; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/exceptions/Orca/fnc_VAM_Orca_camo.sqf b/Missionframework/VAM_GUI/vehicles/exceptions/Orca/fnc_VAM_Orca_camo.sqf new file mode 100644 index 000000000..c079c2cc1 --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/exceptions/Orca/fnc_VAM_Orca_camo.sqf @@ -0,0 +1,13 @@ +//VAM Orca Vehicle Camo Apply +disableSerialization; +private _VAM_display = findDisplay 4900; +private _list_camo = _VAM_display displayCtrl 4910; + +private _list_selection = lbCurSel _list_camo; +private _selected_camo_class_name = camo_class_names select _list_selection; +private _texture = "a3\air_f\heli_light_02\data\heli_light_02_ext_indp_co.paa"; +if (_selected_camo_class_name isEqualTo localize "STR_VAM_AAF_CAMO") exitWith { + [VAM_targetvehicle,["Opfor",1],nil,nil] call BIS_fnc_initVehicle; + VAM_targetvehicle setObjectTextureGlobal [0, _texture]; +}; +[VAM_targetvehicle,[_selected_camo_class_name,1],nil,nil] call BIS_fnc_initVehicle; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/exceptions/Orca/fnc_VAM_Orca_camo_check.sqf b/Missionframework/VAM_GUI/vehicles/exceptions/Orca/fnc_VAM_Orca_camo_check.sqf new file mode 100644 index 000000000..eddef71f0 --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/exceptions/Orca/fnc_VAM_Orca_camo_check.sqf @@ -0,0 +1,29 @@ +//VAM Orca Vehicle Camouflage Check +disableSerialization; +waitUntil {!(VAM_check_fnc_delay)}; +private _VAM_display = findDisplay 4900; +private _list_camo = _VAM_display displayCtrl 4910; + +private _getvc = [VAM_targetvehicle] call BIS_fnc_getVehicleCustomization; + +private _camo_slot = _getvc select 0; +private _current_camo = _camo_slot select 0; +private _check = getObjectTextures VAM_targetvehicle select 0; +private _texture = "a3\air_f\heli_light_02\data\heli_light_02_ext_indp_co.paa"; + +//Check current applied camouflage +if (_check isEqualTo _texture) exitWith { + { + if (localize "STR_VAM_AAF_CAMO" isEqualTo _x) then { + _list_camo lbSetCurSel _forEachIndex; + }; + } forEach camo_class_names; + VAM_camo_check_complete = true; +}; +{ + if (_current_camo isEqualTo _x) then { + _list_camo lbSetCurSel _forEachIndex; + }; +} forEach camo_class_names; + +VAM_camo_check_complete = true; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/exceptions/Orca/fnc_VAM_Orca_setup.sqf b/Missionframework/VAM_GUI/vehicles/exceptions/Orca/fnc_VAM_Orca_setup.sqf new file mode 100644 index 000000000..461b9d6b0 --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/exceptions/Orca/fnc_VAM_Orca_setup.sqf @@ -0,0 +1,77 @@ +//VAM Orca Vehicle GUI Setup +disableSerialization; +private _VAM_display = findDisplay 4900; +private _list_camo = _VAM_display displayCtrl 4910; +private _list_comp = _VAM_display displayCtrl 4920; +private _confirm = _VAM_display displayCtrl 4930; +private _reset = _VAM_display displayCtrl 4940; + +private _vehicleclass = typeof VAM_targetvehicle; + +//Get all camouflages(texture sets) +private _camo_path = "true" configClasses (configfile >> "CfgVehicles" >> _vehicleclass >> "TextureSources"); +camo_class_names = []; +camo_display_names = []; +{_class = configName _x; camo_class_names pushBack _class;} forEach _camo_path; +{_name = getText (configfile >> "CfgVehicles" >> _vehicleclass >> "TextureSources" >> _x >> "DisplayName"); camo_display_names pushBack _name;} forEach camo_class_names; +{ + if (_x isEqualTo "") then { + camo_display_names set [_forEachIndex, camo_class_names select _forEachIndex]; + }; +} forEach camo_display_names; +camo_class_names pushBack (localize "STR_VAM_AAF_CAMO"); +camo_display_names pushBack (localize "STR_VAM_AAF_CAMO"); + +//Get all components(animations) +private _getvc = [VAM_targetvehicle] call BIS_fnc_getVehicleCustomization; +private _check_comp = _getvc select 1; +comp_class_names = []; +{ + if (_x isEqualType "STRING") then { + comp_class_names pushBack (_check_comp select _forEachIndex); + }; +} forEach _check_comp; +comp_display_names = []; +{_name = getText (configfile >> "CfgVehicles" >> _vehicleclass >> "AnimationSources" >> _x >> "DisplayName"); comp_display_names pushBack _name;} forEach comp_class_names; +{ + if (_x isEqualTo "") then { + comp_display_names set [_forEachIndex, comp_class_names select _forEachIndex]; + }; +} forEach comp_display_names; + +//Put camouflages and components in list +if (camo_class_names isEqualTo []) then { + _list_camo lbAdd localize "STR_VAM_NO_CAMOUFLAGE"; +} else { + {_list_camo lbAdd _x} forEach camo_display_names; +}; +if (comp_class_names isEqualTo []) then { + _list_comp lbAdd localize "STR_VAM_NO_COMPONENT"; +} else { + {_list_comp lbAdd _x} forEach comp_display_names; +}; + +//Spawn check functions +VAM_camo_check_complete = true; +VAM_comp_check_complete = true; +VAM_check_fnc_delay = false; + +if !(camo_class_names isEqualTo []) then { + [] spawn fnc_VAM_Orca_camo_check; + VAM_camo_check_complete = false; +}; +if !(comp_class_names isEqualTo []) then { + [] spawn fnc_VAM_common_comp_check; + VAM_comp_check_complete = false; +}; +waitUntil {uisleep 0.1; VAM_camo_check_complete && VAM_comp_check_complete}; + +//Add UIEH +if !(camo_class_names isEqualTo []) then { + _list_camo ctrlAddEventHandler ["LBSelChanged", {[] spawn fnc_VAM_Orca_camo;}]; +}; +if !(comp_class_names isEqualTo []) then { + _list_comp ctrlAddEventHandler ["LBSelChanged", {[] spawn fnc_VAM_common_comp;}]; +}; +_reset ctrlAddEventHandler ["ButtonClick", {VAM_check_fnc_delay = true; [] spawn fnc_VAM_Orca_camo_check; [] spawn fnc_VAM_common_comp_check;}]; +_confirm ctrlAddEventHandler ["ButtonClick", {[] spawn fnc_VAM_variable_cleaner;}]; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/exceptions/UGV_rcws/fnc_VAM_UGV_rcws_setup.sqf b/Missionframework/VAM_GUI/vehicles/exceptions/UGV_rcws/fnc_VAM_UGV_rcws_setup.sqf new file mode 100644 index 000000000..2cb8b33fe --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/exceptions/UGV_rcws/fnc_VAM_UGV_rcws_setup.sqf @@ -0,0 +1,76 @@ +//VAM UGV RCWS Vehicle GUI Setup +disableSerialization; +private _VAM_display = findDisplay 4900; +private _list_camo = _VAM_display displayCtrl 4910; +private _list_comp = _VAM_display displayCtrl 4920; +private _confirm = _VAM_display displayCtrl 4930; +private _reset = _VAM_display displayCtrl 4940; + +private _vehicleclass = typeof VAM_targetvehicle; + +//Get all camouflages(texture sets) +private _camo_path = "true" configClasses (configfile >> "CfgVehicles" >> _vehicleclass >> "TextureSources"); +camo_class_names = [ + "Blufor","GreenHex","IDAP","Indep","Olive","Opfor" +]; +camo_display_names = []; +{_name = getText (configfile >> "CfgVehicles" >> _vehicleclass >> "TextureSources" >> _x >> "DisplayName"); camo_display_names pushBack _name;} forEach camo_class_names; +{ + if (_x isEqualTo "") then { + camo_display_names set [_forEachIndex, camo_class_names select _forEachIndex]; + }; +} forEach camo_display_names; + +//Get all components(animations) +private _getvc = [VAM_targetvehicle] call BIS_fnc_getVehicleCustomization; +private _check_comp = _getvc select 1; +comp_class_names = []; +{ + if (_x isEqualType "STRING") then { + comp_class_names pushBack (_check_comp select _forEachIndex); + }; +} forEach _check_comp; +comp_display_names = []; +{_name = getText (configfile >> "CfgVehicles" >> _vehicleclass >> "AnimationSources" >> _x >> "DisplayName"); comp_display_names pushBack _name;} forEach comp_class_names; +{ + if (_x isEqualTo "") then { + comp_display_names set [_forEachIndex, comp_class_names select _forEachIndex]; + }; +} forEach comp_display_names; + +//Put camouflages and components in list +if (camo_class_names isEqualTo []) then { + _list_camo lbAdd localize "STR_VAM_NO_CAMOUFLAGE"; +} else { + {_list_camo lbAdd _x} forEach camo_display_names; +}; +if (comp_class_names isEqualTo []) then { + _list_comp lbAdd localize "STR_VAM_NO_COMPONENT"; +} else { + {_list_comp lbAdd _x} forEach comp_display_names; +}; + +//Spawn check functions +VAM_camo_check_complete = true; +VAM_comp_check_complete = true; +VAM_check_fnc_delay = false; + +if !(camo_class_names isEqualTo []) then { + [] spawn fnc_VAM_common_camo_check; + VAM_camo_check_complete = false; +}; +if !(comp_class_names isEqualTo []) then { + [] spawn fnc_VAM_common_comp_check; + VAM_comp_check_complete = false; +}; +waitUntil {uisleep 0.1; VAM_camo_check_complete && VAM_comp_check_complete}; + +//Add UIEH +if !(camo_class_names isEqualTo []) then { + _list_camo ctrlAddEventHandler ["LBSelChanged", {[] spawn fnc_VAM_common_camo;}]; +}; +if !(comp_class_names isEqualTo []) then { + _list_comp ctrlAddEventHandler ["LBSelChanged", {[] spawn fnc_VAM_common_comp;}]; +}; +_reset ctrlAddEventHandler ["ButtonClick", {VAM_check_fnc_delay = true; [] spawn fnc_VAM_common_camo_check; [] spawn fnc_VAM_common_comp_check;}]; +_confirm ctrlAddEventHandler ["ButtonClick", {[] spawn fnc_VAM_variable_cleaner;}]; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/fnc_VAM_common_camo.sqf b/Missionframework/VAM_GUI/vehicles/fnc_VAM_common_camo.sqf new file mode 100644 index 000000000..abcfa3aa9 --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/fnc_VAM_common_camo.sqf @@ -0,0 +1,8 @@ +//VAM Common Vehicle Camo Apply +disableSerialization; +private _VAM_display = findDisplay 4900; +private _list_camo = _VAM_display displayCtrl 4910; + +private _list_selection = lbCurSel _list_camo; +private _selected_camo_class_name = camo_class_names select _list_selection; +[VAM_targetvehicle,[_selected_camo_class_name,1],nil,nil] call BIS_fnc_initVehicle; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/fnc_VAM_common_camo_check.sqf b/Missionframework/VAM_GUI/vehicles/fnc_VAM_common_camo_check.sqf new file mode 100644 index 000000000..886b03733 --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/fnc_VAM_common_camo_check.sqf @@ -0,0 +1,20 @@ +//VAM Common Vehicle Camouflage Check +disableSerialization; +waitUntil {!(VAM_check_fnc_delay)}; +private _VAM_display = findDisplay 4900; +private _list_camo = _VAM_display displayCtrl 4910; + +private _getvc = [VAM_targetvehicle] call BIS_fnc_getVehicleCustomization; + +private _camo_slot = _getvc select 0; +private _current_camo = _camo_slot select 0; +if (isNil "_current_camo") exitWith {VAM_camo_check_complete = true;}; + +//Check current applied camouflage +{ + if (_current_camo isEqualTo _x) then { + _list_camo lbSetCurSel _forEachIndex; + }; +} forEach camo_class_names; + +VAM_camo_check_complete = true; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/fnc_VAM_common_comp.sqf b/Missionframework/VAM_GUI/vehicles/fnc_VAM_common_comp.sqf new file mode 100644 index 000000000..73809ab10 --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/fnc_VAM_common_comp.sqf @@ -0,0 +1,21 @@ +//VAM Common Vehicle Comp Apply +disableSerialization; +private _VAM_display = findDisplay 4900; +private _list_comp = _VAM_display displayCtrl 4920; + +private _list_selection = lbSelection _list_comp select 0; +if (isNil "_list_selection") exitWith {}; +private _comp_array = current_comp; +private "_comp_change"; +if (_comp_array select _list_selection isEqualTo 0) then {_comp_change = 1;}; +if (_comp_array select _list_selection isEqualTo 1) then {_comp_change = 0;}; +_comp_array set [_list_selection, _comp_change]; + +private _comp_array_total = []; +{ + _comp_array_total pushBack (comp_class_names select _forEachIndex); + _comp_array_total pushBack (_comp_array select _forEachIndex); +} forEach comp_class_names; +[VAM_targetvehicle,nil,_comp_array_total,nil] call BIS_fnc_initVehicle; + +[] spawn fnc_VAM_common_comp_check; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/fnc_VAM_common_comp_check.sqf b/Missionframework/VAM_GUI/vehicles/fnc_VAM_common_comp_check.sqf new file mode 100644 index 000000000..4872cd5fe --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/fnc_VAM_common_comp_check.sqf @@ -0,0 +1,25 @@ +//VAM Common Vehicle Component Check +disableSerialization; +waitUntil {!(VAM_check_fnc_delay)}; +private _VAM_display = findDisplay 4900; +private _list_comp = _VAM_display displayCtrl 4920; + +current_comp = []; +{ + _isOn = VAM_targetvehicle animationPhase _x; + current_comp pushBack _isOn; +} forEach comp_class_names; + +//Reset list selection +{ + _list_comp lbSetSelected [_forEachIndex, false]; +} forEach current_comp; + +//Check current applied components +{ + if (_x isEqualTo 1) then { + _list_comp lbSetSelected [_forEachIndex, true]; + }; +} forEach current_comp; + +VAM_comp_check_complete = true; \ No newline at end of file diff --git a/Missionframework/VAM_GUI/vehicles/fnc_VAM_common_setup.sqf b/Missionframework/VAM_GUI/vehicles/fnc_VAM_common_setup.sqf new file mode 100644 index 000000000..bacee5300 --- /dev/null +++ b/Missionframework/VAM_GUI/vehicles/fnc_VAM_common_setup.sqf @@ -0,0 +1,73 @@ +//VAM Common Vehicle GUI Setup +disableSerialization; +private _VAM_display = findDisplay 4900; +private _list_camo = _VAM_display displayCtrl 4910; +private _list_comp = _VAM_display displayCtrl 4920; +private _reset = _VAM_display displayCtrl 4940; + +private _vehicleclass = typeof VAM_targetvehicle; + +//Get all camouflages(texture sets) +private _camo_path = "true" configClasses (configfile >> "CfgVehicles" >> _vehicleclass >> "TextureSources"); +camo_class_names = []; +camo_display_names = []; +{_class = configName _x; camo_class_names pushBack _class;} forEach _camo_path; +{_name = getText (_x >> "DisplayName"); camo_display_names pushBack _name;} forEach _camo_path; +{ + if (_x isEqualTo "") then { + camo_display_names set [_forEachIndex, camo_class_names select _forEachIndex]; + }; +} forEach camo_display_names; + +//Get all components(animations) +private _getvc = [VAM_targetvehicle] call BIS_fnc_getVehicleCustomization; +private _check_comp = _getvc select 1; +comp_class_names = []; +{ + if (_x isEqualType "STRING") then { + comp_class_names pushBack (_check_comp select _forEachIndex); + }; +} forEach _check_comp; +comp_display_names = []; +{_name = getText (configfile >> "CfgVehicles" >> _vehicleclass >> "AnimationSources" >> _x >> "DisplayName"); comp_display_names pushBack _name;} forEach comp_class_names; +{ + if (_x isEqualTo "") then { + comp_display_names set [_forEachIndex, comp_class_names select _forEachIndex]; + }; +} forEach comp_display_names; + +//Put camouflages and components in list +if (camo_class_names isEqualTo []) then { + _list_camo lbAdd localize "STR_VAM_NO_CAMOUFLAGE"; +} else { + {_list_camo lbAdd _x} forEach camo_display_names; +}; +if (comp_class_names isEqualTo []) then { + _list_comp lbAdd localize "STR_VAM_NO_COMPONENT"; +} else { + {_list_comp lbAdd _x} forEach comp_display_names; +}; + +//Spawn check functions +VAM_camo_check_complete = true; +VAM_comp_check_complete = true; +VAM_check_fnc_delay = false; + +if !(camo_class_names isEqualTo []) then { + [] spawn fnc_VAM_common_camo_check; + VAM_camo_check_complete = false; +}; +if !(comp_class_names isEqualTo []) then { + [] spawn fnc_VAM_common_comp_check; + VAM_comp_check_complete = false; +}; +waitUntil {uisleep 0.1; VAM_camo_check_complete && VAM_comp_check_complete}; + +//Add UIEH +if !(camo_class_names isEqualTo []) then { + _list_camo ctrlAddEventHandler ["LBSelChanged", {[] spawn fnc_VAM_common_camo;}]; +}; +if !(comp_class_names isEqualTo []) then { + _list_comp ctrlAddEventHandler ["LBSelChanged", {[] spawn fnc_VAM_common_comp;}]; +}; +_reset ctrlAddEventHandler ["ButtonClick", {VAM_check_fnc_delay = true; [] spawn fnc_VAM_common_camo_check; [] spawn fnc_VAM_common_comp_check;}]; \ No newline at end of file diff --git a/Missionframework/description.ext b/Missionframework/description.ext index a24dd1710..d713ee611 100644 --- a/Missionframework/description.ext +++ b/Missionframework/description.ext @@ -248,6 +248,10 @@ class CfgTaskDescriptions { #include "KP\KPGUI\KPGUI_defines.hpp" #include "KP\KPPLM\ui\KPPLM_dialog.hpp" +#include "VAM_GUI\defines.hpp" +#include "VAM_GUI\VAM_GUI_controls.hpp" +#include "VAM_GUI\VAM_GUI_classes.hpp" + class ACEX_Fortify_Presets { class KPLIB_Fortify { displayName = "KPLIB Fortify"; diff --git a/Missionframework/init.sqf b/Missionframework/init.sqf index eae46b88e..968365a9c 100644 --- a/Missionframework/init.sqf +++ b/Missionframework/init.sqf @@ -149,3 +149,6 @@ if (isServer) then { KPLIB_initServerDone = true; publicVariable "KPLIB_initServerDone"; }; + +//VAM_GUI: For changing camo and vehicle appearence without Zeus: +[] execVM "VAM_GUI\VAM_GUI_init.sqf"; \ No newline at end of file diff --git a/Missionframework/stringtable.xml b/Missionframework/stringtable.xml index 8c99828b8..b254ac141 100644 --- a/Missionframework/stringtable.xml +++ b/Missionframework/stringtable.xml @@ -8169,5 +8169,77 @@ KP Player Menu v1.0.2\nby Wyqer KP プレイヤー メニュー v1.0.2\nby Wyqer + + + + Vehicle Appearance Manager initialized + 차량 형상 관리자 불러오기 및 초기화 완료 + + + Vehicle Appearance Manager + 차량 형상 관리자 + + + Reset + 초기화 + + + Confirm + 확인 + + + Current Vehicle : + 현 재 차 량 : + + + You should be in %1m from FOB.) + FOB에서 %1m 안에 있어야 합니다. + + + Reset complete + 초기화 완료 + + + Camoufluge + 위장 + + + Component + 구성품 + + + There is no camouflage. + 위장이 없습니다. + + + There is no component. + 구성품이 없습니다. + + + Your Marid is outdated one.\nVehicle component setup may not be loaded next time.\nPlease contact with your server admin. + 당신의 마리드는 오래된 것입니다.\n다음 번에 차량 구성품 설정을 불러올 수 없을 것입니다.\n해당 서버 관리자와 연락을 취해보십시오. + + + + BLUFOR + 청군 + + + Green + 녹색 + + + Black + 검정색 + + + AAF + AAF + + + Dark Green + 어두운 녹색 + + diff --git a/README.md b/README.md index 0801c818d..0600c8b09 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ On top of [KP Liberation's features](https://github.com/moistbois/Moist-Liberati * Full Heal tweaked to have a cooldown and not work around enemies. * New "Gear Crates", powered by [ALiVE's Orbat Faction creator](http://alivemod.com/). Add new crates with goodies to the build list, without their goodies being wiped by the clear script. They can be locked behind military base captures. * CH View Distance has "Standard" as the lowest option to disallow removing grass, [thanks to champ-1](https://forums.bohemia.net/forums/topic/175757-ch-view-distance-addon/). +* Change vehicle camos at workbenches, thanks to Vehicle Appearance Manager GUI. Credits to [UNIT_normal](https://forums.bohemia.net/forums/topic/224041-release-vehicle-appearance-manager-gui/) ## Watch We regularly stream our campaigns and sometimes even development. You can watch us at: