diff --git a/addons/common/XEH_PREP.hpp b/addons/common/XEH_PREP.hpp index b93dce70c..488c63f26 100644 --- a/addons/common/XEH_PREP.hpp +++ b/addons/common/XEH_PREP.hpp @@ -1,6 +1,7 @@ PREP(changeGroupSide); PREP(collapseTree); PREP(createZeus); +PREP(customizeVehicle); PREP(deployCountermeasures); PREP(deserializeInventory); PREP(deserializeObjects); @@ -28,6 +29,7 @@ PREP(getSelectedUnits); PREP(getSelectedVehicles); PREP(getSideIcon); PREP(getVehicleAmmo); +PREP(getVehicleCustomization); PREP(getVehicleIcon); PREP(getWeaponReloadTime); PREP(hasDefaultInventory); diff --git a/addons/common/functions/fnc_customizeVehicle.sqf b/addons/common/functions/fnc_customizeVehicle.sqf new file mode 100755 index 000000000..21c56b3b4 --- /dev/null +++ b/addons/common/functions/fnc_customizeVehicle.sqf @@ -0,0 +1,58 @@ +#include "script_component.hpp" +/* + * Author: Kex + * Changes the textures, animation sources and/or mass of a given vehicle. + * Based on BIS_fnc_initVehicle, but can be applied multiple times without issues. + * In contrast to BIS_fnc_initVehicle, if texture is passed as an array, + * it can also alternatively be an array of texture paths (i.e. output of getObjectTextures). + * + * Arguments: + * 0: Vehicle + * 1: Texture + * 2: Animation + * 3: Mass + * 4: Instant animation + * + * Return Value: + * None + * + * Example: + * [vehicle player, [texturePath1, texturePath2], [animationSource1, animationPhase1]] call zen_common_fnc_customizeVehicle + * + * Public: No + */ + +params ["_vehicle", ["_texture", false, [false, [], ""]], ["_animation", false, [false, [], ""]], ["_mass", false, [false, 0]], ["_instantAnimation", true, [false]]]; + +private _vehicleType = typeOf _vehicle; + +// Fix: BIS_fnc_initVehicle cannot animate doors multiple times +if (_animation isEqualType []) then { + for "_i" from 0 to (count _animation - 2) step 2 do { + private _configName = _animation select _i; + private _source = getText (configFile >> "CfgVehicles" >> _vehicleType >> "animationSources" >> _configName >> "source"); + private _phase = _animation select (_i + 1); + switch (_source) do { + case "door": { + _vehicle animateDoor [_configName, _phase, _instantAnimation]; + }; + case "user": { + _vehicle animateSource [_configName, _phase, _instantAnimation]; + }; + default { + _vehicle animate [_configName, _phase, _instantAnimation]; + }; + }; + }; +}; + +if (_texture isEqualType [] && {count _texture < 2 || {(_texture select 1) isEqualType ""}}) then { + [_vehicle, nil, nil, _mass] call BIS_fnc_initVehicle; + { + _vehicle setObjectTextureGlobal [_forEachIndex, _x]; + } forEach _texture; +} else { + [_vehicle, _texture, nil, _mass] call BIS_fnc_initVehicle; +}; + +nil diff --git a/addons/common/functions/fnc_deserializeObjects.sqf b/addons/common/functions/fnc_deserializeObjects.sqf index a4944f60e..1332976a5 100644 --- a/addons/common/functions/fnc_deserializeObjects.sqf +++ b/addons/common/functions/fnc_deserializeObjects.sqf @@ -151,7 +151,7 @@ private _fnc_deserializeVehicle = { [_vehicle, "", []] call BIS_fnc_initVehicle; } else { _customization params ["_textures", "_animations"]; - [_vehicle, _textures, _animations, true] call BIS_fnc_initVehicle; + [_vehicle, _textures, _animations, true] call FUNC(customizeVehicle); }; { @@ -217,7 +217,7 @@ private _fnc_deserializeVehicle = { }; private _fnc_deserializeStatic = { - params ["_type", "_position", "_direction", "_simulationEnabled", "_inventory", "_attachedObjects"]; + params ["_type", "_position", "_direction", "_simulationEnabled", "_inventory", "_attachedObjects", ["_customization", [[], []]]]; _position = _position vectorAdd _centerPos; @@ -238,6 +238,9 @@ private _fnc_deserializeStatic = { [_object, _inventory] call FUNC(deserializeInventory); [_object, _attachedObjects] call _fnc_deserializeAttachedObjects; + _customization params ["_textures", "_animations"]; + [_object, _textures, _animations, true] call FUNC(customizeVehicle); + _objects pushBack _object; _object diff --git a/addons/common/functions/fnc_exportMissionSQF.sqf b/addons/common/functions/fnc_exportMissionSQF.sqf index 8651cb139..4a06f1c70 100644 --- a/addons/common/functions/fnc_exportMissionSQF.sqf +++ b/addons/common/functions/fnc_exportMissionSQF.sqf @@ -246,8 +246,9 @@ private _fnc_processVehicle = { _outputObjects pushBack ["%1 forceFlagTexture %2;", _varName, str _flagTexture]; }; - (_vehicle call BIS_fnc_getVehicleCustomization) params ["_textures", "_animations"]; - _outputObjects pushBack ["[%1, %2, %3, true] call BIS_fnc_initVehicle;", _varName, _textures, _animations]; + (_vehicle call FUNC(getVehicleCustomization)) params ["_textures", "_animations"]; + _outputObjects pushBack ["[%1, nil, %2, true] call BIS_fnc_initVehicle;", _varName, _animations]; + _outputObjects pushBack ["{%1 setObjectTextureGlobal [_forEachIndex, _x]} forEach %2;", _varName, _textures]; [_vehicle, _varName] call _fnc_processInventory; diff --git a/addons/common/functions/fnc_getVehicleCustomization.sqf b/addons/common/functions/fnc_getVehicleCustomization.sqf new file mode 100755 index 000000000..b4f675ddf --- /dev/null +++ b/addons/common/functions/fnc_getVehicleCustomization.sqf @@ -0,0 +1,53 @@ +#include "script_component.hpp" +/* + * Author: Kex + * Return vehicle customization settings. + * Based on BIS_fnc_getVehicleCustomization. + * In contrast to BIS_fnc_getVehicleCustomization, it works properly for doors + * and textures are returned as an array of texture paths (i.e. output of getObjectTextures). + * + * Arguments: + * 0: Vehicle + * + * Return Value: + * Array of texture paths and array of animations + * + * Example: + * [vehicle player] call zen_common_fnc_getVehicleCustomization + * + * Public: No + */ + +params ["_vehicle"]; + +private _vehicleType = typeOf _vehicle; +private _vehicleConfig = configFile >> "CfgVehicles" >> _vehicleType; + +private _animations = []; +{ + private _config = _x; + private _configName = toLower configName _config; + private _source = toLower getText (_config >> "source"); + + if (_source in WHITELIST_ANIMATION_SOURCES && {BLACKLIST_ANIMATION_INNAMES findIf {_x in _configName} == -1 && {BLACKLIST_ANIMATION_ATTRIBUTES findIf {isClass (_config >> _x)} == -1}}) then { + private _phase = switch (_source) do { + case "door": { + _vehicle doorPhase _configName; + }; + case "user": { + _vehicle animationSourcePhase _configName; + }; + default { + _vehicle animationPhase _configName; + }; + }; + // Some sources will return negative values + if (_phase >= 0) then { + _animations append [_configName, _phase]; + } + }; +} forEach configProperties [_vehicleConfig >> "animationSources", "isClass _x", true]; + +private _textures = getObjectTextures _vehicle; + +[_textures, _animations] diff --git a/addons/common/functions/fnc_serializeObjects.sqf b/addons/common/functions/fnc_serializeObjects.sqf index ba8c38c48..8c8a0f5b9 100644 --- a/addons/common/functions/fnc_serializeObjects.sqf +++ b/addons/common/functions/fnc_serializeObjects.sqf @@ -118,7 +118,7 @@ private _fnc_serializeVehicle = { private _fuel = fuel _vehicle; private _inventory = _vehicle call FUNC(serializeInventory); - private _customization = _vehicle call BIS_fnc_getVehicleCustomization; + private _customization = _vehicle call FUNC(getVehicleCustomization); private _flagTexture = getForcedFlagTexture _vehicle; private _pylonMagazines = getPylonMagazines _vehicle; @@ -182,8 +182,9 @@ private _fnc_serializeStatic = { private _simulationEnabled = simulationEnabled _object; private _inventory = _object call FUNC(serializeInventory); private _attachedObjects = _object call _fnc_serializeAttachedObjects; + private _customization = _object call FUNC(getVehicleCustomization); - [_type, _position, _direction, _simulationEnabled, _inventory, _attachedObjects] + [_type, _position, _direction, _simulationEnabled, _inventory, _attachedObjects, _customization] }; private _fnc_serializeAttachedObjects = { diff --git a/addons/common/script_component.hpp b/addons/common/script_component.hpp index 36346bc50..524e3892b 100644 --- a/addons/common/script_component.hpp +++ b/addons/common/script_component.hpp @@ -90,3 +90,8 @@ // Prevent certain magazines from being handled by ammo functions #define BLACKLIST_MAGAZINES ["Laserbatteries"] + +// Prevent certain source animations from being displayed in the garage +#define WHITELIST_ANIMATION_SOURCES ["user", "door", "doors", "proxy"] +#define BLACKLIST_ANIMATION_INNAMES ["proxy", "doors", "offset", "autoloader", "shtora", "elev", "obs", "offset", "recoil", "sight", "hook", "brakes", "eject", "vtol", "pip", "switch", "fuel", "burner" "rwr", "filter"] +#define BLACKLIST_ANIMATION_ATTRIBUTES ["weapon", "wheel", "isComponent"] diff --git a/addons/garage/XEH_PREP.hpp b/addons/garage/XEH_PREP.hpp index d188d5cd0..d81cfba5c 100644 --- a/addons/garage/XEH_PREP.hpp +++ b/addons/garage/XEH_PREP.hpp @@ -1,5 +1,6 @@ PREP(applyToAll); PREP(closeGarage); +PREP(defineCustomTexture); PREP(getVehicleData); PREP(handleMouse); PREP(onAnimationSelect); diff --git a/addons/garage/XEH_preInit.sqf b/addons/garage/XEH_preInit.sqf index 722ae8119..f38540954 100644 --- a/addons/garage/XEH_preInit.sqf +++ b/addons/garage/XEH_preInit.sqf @@ -20,4 +20,6 @@ GVAR(camYaw) = -45; true ] call EFUNC(attributes,addButton); +#include "initCustomVehicleTextures.sqf" + ADDON = true; diff --git a/addons/garage/functions/fnc_applyToAll.sqf b/addons/garage/functions/fnc_applyToAll.sqf index bb96b4e97..2b02e6a4a 100644 --- a/addons/garage/functions/fnc_applyToAll.sqf +++ b/addons/garage/functions/fnc_applyToAll.sqf @@ -16,12 +16,12 @@ * Public: No */ -(GVAR(center) call BIS_fnc_getVehicleCustomization) params ["_texture", "_animations"]; +(GVAR(center) call EFUNC(common,getVehicleCustomization)) params ["_textures", "_animations"]; private _vehicleType = typeOf GVAR(center); { if (typeOf _x isEqualTo _vehicleType) then { - [_x, _texture, _animations, true] call BIS_fnc_initVehicle; + [_x, _textures, _animations, true, false] call EFUNC(common,customizeVehicle); }; } forEach SELECTED_OBJECTS; diff --git a/addons/garage/functions/fnc_defineCustomTexture.sqf b/addons/garage/functions/fnc_defineCustomTexture.sqf new file mode 100755 index 000000000..06f54f845 --- /dev/null +++ b/addons/garage/functions/fnc_defineCustomTexture.sqf @@ -0,0 +1,38 @@ +#include "script_component.hpp" +/* + * Author: Kex + * Defines custom texture variant for all vehicles that inherit from the given vehicle type. + * + * Arguments: + * 0: Base vehicle type + * 1: Texture variant name + * 2: Path of texture for each hidden selection + * + * Return Value: + * None + * + * Example: + * [vehicleType, variantName, [texturePath1, texturePath2]] call zen_garage_fnc_defineCustomTexture + * + * Public: Yes + */ + +params ["_baseVehicleType", "_variantName", "_texture"]; + +if (isNil QGVAR(customVehicleTextures)) then { + GVAR(customVehicleTextures) = [] call CBA_fnc_createNamespace; +}; + +{ + private _vehicleType = configName _x; + // Clear garage cache + GVAR(vehicleDataCache) setVariable [_vehicleType, nil]; + + if (isNil {GVAR(customVehicleTextures) getVariable _vehicleType}) then { + GVAR(customVehicleTextures) setVariable [_vehicleType, []]; + }; + private _textures = GVAR(customVehicleTextures) getVariable _vehicleType; + _textures pushBack [_texture, _variantName]; +} forEach (format ["configName _x isKindOf '%1'", _baseVehicleType] configClasses (configFile >> "CfgVehicles")); + +nil diff --git a/addons/garage/functions/fnc_getVehicleData.sqf b/addons/garage/functions/fnc_getVehicleData.sqf index cdac0ffbb..30254571f 100644 --- a/addons/garage/functions/fnc_getVehicleData.sqf +++ b/addons/garage/functions/fnc_getVehicleData.sqf @@ -25,29 +25,34 @@ private _vehicleType = typeOf _vehicle; private _vehicleData = GVAR(vehicleDataCache) getVariable _vehicleType; if (isNil "_vehicleData") then { - _vehicleData = []; - private _vehicleConfig = configFile >> "CfgVehicles" >> _vehicleType; - private _vehicleFaction = faction _vehicle; + private _animations = []; + ([_vehicle] call EFUNC(common,getVehicleCustomization)) params ["", "_currentAnimations"]; + for "_i" from 0 to (count _currentAnimations - 2) step 2 do { + private _configName = _currentAnimations select _i; + private _displayName = getText (_vehicleConfig >> "animationSources" >> _configName >> "displayName"); + if (_displayName isEqualTo "") then { + _displayName = (_configName splitString "_") joinString " "; + }; + _animations pushBack [_configName, _displayName]; + }; + + private _textures = []; { - private _entries = []; - - { - private _displayName = getText (_x >> "displayName"); - private _factions = getArray (_x >> "factions"); - - if ( - _displayName != "" - && {getNumber (_x >> "scope") == 2 || {!isNumber (_x >> "scope")}} - && {_factions isEqualTo [] || {_factions findIf {_x == _vehicleFaction} > -1}} - ) then { - _entries pushBack [configName _x, _displayName]; - }; - } forEach configProperties [_x, "isClass _x", true]; - - _vehicleData pushBack _entries; - } forEach [_vehicleConfig >> "animationSources", _vehicleConfig >> "textureSources"]; + private _configName = configName _x; + private _displayName = getText (_x >> "displayName"); + if (_displayName isEqualTo "") then { + _displayName = (_configName splitString "_") joinString " "; + }; + _textures pushBack [_configName, _displayName]; + } forEach configProperties [_vehicleConfig >> "textureSources", "isClass _x", true]; + + // Adding custom definitions + private _customTextures = GVAR(customVehicleTextures) getVariable [_vehicleType, []]; + _textures append _customTextures; + + _vehicleData = [_animations, _textures]; GVAR(vehicleDataCache) setVariable [_vehicleType, _vehicleData]; }; diff --git a/addons/garage/functions/fnc_onAnimationSelect.sqf b/addons/garage/functions/fnc_onAnimationSelect.sqf index fc2a511ec..e91953bfa 100644 --- a/addons/garage/functions/fnc_onAnimationSelect.sqf +++ b/addons/garage/functions/fnc_onAnimationSelect.sqf @@ -26,9 +26,10 @@ _ctrlListAnimations lbSetPicture [_selectedIndex, CHECK_ICONS select _value]; // Create array of all animation states private _animations = []; for "_i" from 0 to (lbSize _ctrlListAnimations - 1) do { - _animations pushBack (_ctrlListAnimations lbData _i); + private _dataVar = _ctrlListAnimations lbData _i; + _animations pushBack (_ctrlListAnimations getVariable _dataVar); _animations pushBack (_ctrlListAnimations lbValue _i); }; // Update vehicle animations -[GVAR(center), nil, _animations, true] call BIS_fnc_initVehicle; +[GVAR(center), nil, _animations, true, false] call EFUNC(common,customizeVehicle); diff --git a/addons/garage/functions/fnc_onTextureSelect.sqf b/addons/garage/functions/fnc_onTextureSelect.sqf index 0f19cd902..2947bcf97 100644 --- a/addons/garage/functions/fnc_onTextureSelect.sqf +++ b/addons/garage/functions/fnc_onTextureSelect.sqf @@ -26,5 +26,8 @@ for "_i" from 0 to (lbSize _ctrlListTextures - 1) do { // Check selected texture _ctrlListTextures lbSetPicture [_selectedIndex, ICON_CHECKED]; +private _dataVar = _ctrlListTextures lbData _selectedIndex; +private _texture = _ctrlListTextures getVariable _dataVar; + // Update vehicle textures -[GVAR(center), [_ctrlListTextures lbData _selectedIndex, 1]] call BIS_fnc_initVehicle; +[GVAR(center), _texture] call EFUNC(common,customizeVehicle); diff --git a/addons/garage/functions/fnc_populateLists.sqf b/addons/garage/functions/fnc_populateLists.sqf index f86bf29ca..20bf2018a 100644 --- a/addons/garage/functions/fnc_populateLists.sqf +++ b/addons/garage/functions/fnc_populateLists.sqf @@ -20,17 +20,22 @@ private _display = findDisplay IDD_DISPLAY; // Get animation and texture data for current vehicle private _vehicleData = [GVAR(center)] call FUNC(getVehicleData); _vehicleData params ["_vehicleAnimations", "_vehicleTextures"]; +private _vehicleType = typeOf GVAR(center); private _fnc_addToList = { - params ["_ctrlList", "_configName", "_displayName", "_isChecked"]; + params ["_ctrlList", "_variant", "_displayName", "_isChecked"]; if (_isChecked isEqualType false) then {_isChecked = parseNumber _isChecked}; private _index = _ctrlList lbAdd _displayName; - _ctrlList lbSetData [_index, _configName]; + private _dataVar = str _index; + + _ctrlList lbSetData [_index, _dataVar]; _ctrlList lbSetValue [_index, _isChecked]; _ctrlList lbSetTooltip [_index, _displayName]; _ctrlList lbSetPicture [_index, [ICON_UNCHECKED, ICON_CHECKED] select _isChecked]; + + _ctrlList setVariable [_dataVar, _variant]; }; // Add items to animations list @@ -38,7 +43,19 @@ private _ctrlListAnimations = _display displayCtrl IDC_LIST_ANIMATIONS; { _x params ["_configName", "_displayName"]; - private _isChecked = GVAR(center) animationPhase _configName; + private _source = getText (configFile >> "CfgVehicles" >> _vehicleType >> "animationSources" >> _configName >> "source"); + private _phase = switch (_source) do { + case "door": { + _vehicle doorPhase _configName; + }; + case "user": { + _vehicle animationSourcePhase _configName; + }; + default { + _vehicle animationPhase _configName; + }; + }; + private _isChecked = _phase >= 0.5; [_ctrlListAnimations, _configName, _displayName, _isChecked] call _fnc_addToList; } forEach _vehicleAnimations; @@ -47,20 +64,25 @@ private _ctrlListTextures = _display displayCtrl IDC_LIST_TEXTURES; private _sourcesConfig = configOf GVAR(center) >> "textureSources"; private _currentTextures = getObjectTextures GVAR(center) apply {toLower _x}; { - _x params ["_configName", "_displayName"]; + _x params ["_variant", "_displayName"]; - private _configTextures = getArray (_sourcesConfig >> _configName >> "textures"); + private _textures = if (_variant isEqualType "") then { + getArray (_sourcesConfig >> _variant >> "textures"); + } else { + _variant; + }; private _isChecked = true; - if (count _configTextures == count _currentTextures) then { - {if !((_currentTextures select _forEachIndex) in toLower _x) exitWith {_isChecked = false}} forEach _configTextures; + if (count _textures == count _currentTextures) then { + {if !((_currentTextures select _forEachIndex) in toLower _x) exitWith {_isChecked = false}} forEach _textures; } else { _isChecked = false; }; - [_ctrlListTextures, _configName, _displayName, _isChecked] call _fnc_addToList; + [_ctrlListTextures, _variant, _displayName, _isChecked] call _fnc_addToList; } forEach _vehicleTextures; -// Set font height and hide both lists +// Set font height and sort both lists { _x ctrlSetFontHeight POS_H(0.8); // Todo: setting for font height? + lbSort _x; } forEach [_ctrlListAnimations, _ctrlListTextures]; diff --git a/addons/garage/initCustomVehicleTextures.sqf b/addons/garage/initCustomVehicleTextures.sqf new file mode 100755 index 000000000..58d2a481b --- /dev/null +++ b/addons/garage/initCustomVehicleTextures.sqf @@ -0,0 +1,102 @@ +// Add hidden Tempest variants +[ + "O_Truck_03_ammo_F", + format ["%1 (%2)", localize "STR_A3_texturesources_hex0", localize "str_a3_rscdisplayaanarticle_menu_3"], + [ + "\A3\Soft_F_EPC\Truck_03\Data\Truck_03_ext01_CO.paa", + "\A3\Soft_F_EPC\Truck_03\Data\Truck_03_ext02_CO.paa", + "\A3\Soft_F_EPC\Truck_03\Data\Truck_03_cargo_CO.paa", + "\A3\missions_f_oldman\Data\img\Decals\science_containers_tempest_co.paa" + ] +] call FUNC(defineCustomTexture); +[ + "O_Truck_03_ammo_F", + format ["%1 (%2)", localize "STR_A3_texturesources_greenhex0", localize "str_a3_rscdisplayaanarticle_menu_3"], + [ + "\A3\Soft_F_Exp\Truck_03\Data\Truck_03_ext01_ghex_CO.paa", + "\A3\Soft_F_Exp\Truck_03\Data\Truck_03_ext02_ghex_CO.paa", + "\A3\Soft_F_Exp\Truck_03\Data\Truck_03_cargo_ghex_CO.paa", + "\A3\missions_f_oldman\Data\img\Decals\science_containers_tempest_co.paa" + ] +] call FUNC(defineCustomTexture); + +// Add hidden Taru variants +{ + [ + _x, + format ["%1 (%2)", localize "str_a3_texturesources_black0", localize "str_a3_rscdisplayaanarticle_menu_3"], + [ + "A3\Air_F_Heli\Heli_Transport_04\Data\heli_transport_04_base_01_Black_co.paa", + "A3\Air_F_Heli\Heli_Transport_04\Data\heli_transport_04_base_02_Black_co.paa", + "A3\missions_f_oldman\Data\img\Decals\science_pods_co.paa", + "A3\Air_F_Heli\Heli_Transport_04\Data\Heli_Transport_04_Pod_Ext02_Black_CO.paa" + ] + ] call FUNC(defineCustomTexture); +} forEach ["O_Heli_Transport_04_covered_F", "O_Heli_Transport_04_medevac_F", "O_Heli_Transport_04_box_F"]; + +// Add hidden Gorgon variants +[ + "I_APC_Wheeled_03_cannon_F", + localize "str_a3_texturesources_sand0", + [ + "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" + ] +] call FUNC(defineCustomTexture); + +// Add hidden Blackfoot variants +[ + "B_Heli_Attack_01_dynamicLoadout_F", + localize "STR_A3_TEXTURESOURCES_OLIVE0", + [ + "\A3\Air_F_Beta\heli_attack_01\data\heli_attack_01_co.paa" + ] +] call FUNC(defineCustomTexture); +[ + "B_Heli_Attack_01_dynamicLoadout_F", + localize "str_a3_texturesources_green0", + [ + "A3\Air_F\Heli_Light_02\Data\heli_light_02_common_co.paa" + ] +] call FUNC(defineCustomTexture); +[ + "B_Heli_Attack_01_dynamicLoadout_F", + localize "str_a3_texturesources_black0", + [ + "A3\Air_F_Beta\heli_attack_01\data\UI\Heli_Attack_01_EDEN_CA.PAA" + ] +] call FUNC(defineCustomTexture); + +// Add hidden Orca variants +[ + "Heli_Light_02_base_F", + localize "str_a3_cfgfactionclasses_ind_f0", + [ + "\a3\air_f\Heli_Light_02\Data\heli_light_02_ext_indp_co.paa" + ] +] call FUNC(defineCustomTexture); + +// Add hidden Pawnee/Hummingbird variants +[ + "Heli_Light_01_base_F", + localize "str_a3_texturesources_green0", + [ + "A3\Air_F\Heli_Light_01\Data\Heli_Light_01_ext_Blufor_CO.paa" + ] +] call FUNC(defineCustomTexture); +[ + "Heli_Light_01_base_F", + localize "str_a3_texturesources_black0", + [ + "\a3\air_f\Heli_Light_01\Data\heli_light_01_ext_ion_co.paa" + ] +] call FUNC(defineCustomTexture); +[ + "Heli_Light_01_base_F", + localize "str_a3_cfgfactionclasses_ind_f0", + [ + "A3\Air_F\Heli_Light_01\Data\heli_light_01_ext_indp_co.paa" + ] +] call FUNC(defineCustomTexture); diff --git a/docs/user_guide/garage.md b/docs/user_guide/garage.md index 2268fd0b3..210e2c5ab 100644 --- a/docs/user_guide/garage.md +++ b/docs/user_guide/garage.md @@ -15,3 +15,32 @@ In order to easily apply the same customization to multiple vehicles, all vehicl - BACKSPACE : Toggle interface visibility. - LMB : Show hidden interface. - RMB : Toggle interface (when not panning). + +### Register a Texture + +A custom texture can be made available for the garage by calling the `zen_garage_fnc_defineCustomTexture` function. +This function has an effect on all children of the given base vehicle type. +It is local, and thus must be executed on every Zeus client to have a global effect. + +**Arguments:** + + \# | Description | Type | Default Value (if optional) +:---: | ----------- | ---- | --------------------------- +0 | Base vehicle type | STRING | +1 | Texture variant name | STRING | +2 | Path to texture for each hidden selection | ARRAY | + +**Return Value:** + +- None + +**Example:** +```sqf +[ + "Heli_Light_01_base_F", + "My new shiny AAF texture", + [ + "A3\Air_F\Heli_Light_01\Data\heli_light_01_ext_indp_co.paa" + ] +] call zen_garage_fnc_defineCustomTexture; +```