diff --git a/addons/dragging/functions/fnc_setCarryable.sqf b/addons/dragging/functions/fnc_setCarryable.sqf index d1dd9cf1a9..630f212b97 100644 --- a/addons/dragging/functions/fnc_setCarryable.sqf +++ b/addons/dragging/functions/fnc_setCarryable.sqf @@ -48,5 +48,8 @@ if (_type in _initializedClasses) exitWith {}; _initializedClasses pushBack _type; GVAR(initializedClasses_carry) = _initializedClasses; -[_type, 0, ["ACE_MainActions", QGVAR(carry)], localize "STR_ACE_Dragging_Carry", "", "", {[_player, _target] call FUNC(carryObject)}, {[_player, _target] call FUNC(canCarry)}, 2] call EFUNC(interact_menu,addClassAction); -[_type, 0, ["ACE_MainActions", QGVAR(drop_carry)], localize "STR_ACE_Dragging_Drop", "", "", {[_player, _target] call FUNC(dropObject_carry)}, {[_player, _target] call FUNC(canDrop_carry)}, 2] call EFUNC(interact_menu,addClassAction); +_carryAction = [QGVAR(drag), localize "STR_ACE_Dragging_Carry", "", {[_player, _target] call FUNC(carryObject)}, {[_player, _target] call FUNC(canCarry)}] call EFUNC(interact_menu,createAction); +_dropAction = [QGVAR(drop), localize "STR_ACE_Dragging_Drop", "", {[_player, _target] call FUNC(dropObject_carry)}, {[_player, _target] call FUNC(canDrop_carry)}] call EFUNC(interact_menu,createAction); + +[_type, 0, ["ACE_MainActions"], _carryAction] call EFUNC(interact_menu,addActionToClass); +[_type, 0, ["ACE_MainActions"], _dropAction] call EFUNC(interact_menu,addActionToClass); diff --git a/addons/dragging/functions/fnc_setDraggable.sqf b/addons/dragging/functions/fnc_setDraggable.sqf index 82ebc201e2..b6e26a6f0a 100644 --- a/addons/dragging/functions/fnc_setDraggable.sqf +++ b/addons/dragging/functions/fnc_setDraggable.sqf @@ -48,5 +48,8 @@ if (_type in _initializedClasses) exitWith {}; _initializedClasses pushBack _type; GVAR(initializedClasses) = _initializedClasses; -[_type, 0, ["ACE_MainActions", QGVAR(drag)], localize "STR_ACE_Dragging_Drag", "", "", {[_player, _target] call FUNC(startDrag)}, {[_player, _target] call FUNC(canDrag)}, 2] call EFUNC(interact_menu,addClassAction); -[_type, 0, ["ACE_MainActions", QGVAR(drop)], localize "STR_ACE_Dragging_Drop", "", "", {[_player, _target] call FUNC(dropObject)}, {[_player, _target] call FUNC(canDrop)}, 2] call EFUNC(interact_menu,addClassAction); +_dragAction = [QGVAR(drag), localize "STR_ACE_Dragging_Drag", "", {[_player, _target] call FUNC(startDrag)}, {[_player, _target] call FUNC(canDrag)}] call EFUNC(interact_menu,createAction); +_dropAction = [QGVAR(drop), localize "STR_ACE_Dragging_Drop", "", {[_player, _target] call FUNC(dropObject)}, {[_player, _target] call FUNC(canDrop)}] call EFUNC(interact_menu,createAction); + +[_type, 0, ["ACE_MainActions"], _dragAction] call EFUNC(interact_menu,addActionToClass); +[_type, 0, ["ACE_MainActions"], _dropAction] call EFUNC(interact_menu,addActionToClass); diff --git a/addons/interact_menu/XEH_preInit.sqf b/addons/interact_menu/XEH_preInit.sqf index b42e8c5507..2b5150a0ea 100644 --- a/addons/interact_menu/XEH_preInit.sqf +++ b/addons/interact_menu/XEH_preInit.sqf @@ -2,21 +2,25 @@ ADDON = false; -PREP(addAction); -PREP(addClassAction); +PREP(addActionToClass); +PREP(addActionToObject); PREP(compileMenu); PREP(compileMenuSelfAction); PREP(collectActiveActionTree); +PREP(createAction); +PREP(findActionNode); +PREP(isSubPath); PREP(keyDown); PREP(keyDownSelfAction); PREP(keyUp); PREP(keyUpSelfAction); -PREP(removeAction); -PREP(removeClassAction); +PREP(removeActionFromClass); +PREP(removeActionFromObject); PREP(render); -PREP(renderIcon); PREP(renderBaseMenu); +PREP(renderIcon); PREP(renderMenu); +PREP(splitPath); GVAR(keyDown) = false; GVAR(keyDownSelfAction) = false; diff --git a/addons/interact_menu/functions/fnc_addAction.sqf b/addons/interact_menu/functions/fnc_addAction.sqf deleted file mode 100644 index c7dd6ecab3..0000000000 --- a/addons/interact_menu/functions/fnc_addAction.sqf +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Author: commy2, NouberNou and CAA-Picard - * Add an ACE action to an object, under a certain config path - * Note: This function is NOT global. - * - * Argument: - * 0: Object the action should be assigned to - * 1: Type of action, 0 for actions, 1 for self-actions - * 2: Full path of the new action - * 3: Name of the action shown in the menu - * 4: Icon - * 5: Position (Position or Selection Name) or - * 6: Statement - * 7: Condition - * 8: Distance - * 9: Other parameters (Optional) - * - * Return value: - * The entry full path, which can be used to remove the entry, or add children entries . - * - * Example: - * [cursorTarget,0,["ACE_TapShoulderRight","VulcanPinch"],"Vulcan Pinch","",[0,0,0],{_target setDamage 1;},{true},100] call ace_interact_menu_fnc_addAction; - * - * Public: No - */ -#include "script_component.hpp" - -EXPLODE_9_PVT(_this,_object,_typeNum,_fullPath,_displayName,_icon,_position,_statement,_condition,_distance); - -private ["_varName","_actions","_params","_entry"]; - -_varName = [QGVAR(actions),QGVAR(selfActions)] select _typeNum; -_actions = _object getVariable [_varName, []]; -if((count _actions) == 0) then { - _object setVariable [_varName, _actions]; -}; - -_params = [false,false,false,false]; -if (count _this > 9) then { - _params = _this select 9; -}; - -_entry = [ - [ - _displayName, - _icon, - _position, - _statement, - _condition, - _distance, - _params, - + _fullPath - ], - [] - ]; - -_actions pushBack _entry; - -_fullPath diff --git a/addons/interact_menu/functions/fnc_addActionToClass.sqf b/addons/interact_menu/functions/fnc_addActionToClass.sqf new file mode 100644 index 0000000000..c93342cfda --- /dev/null +++ b/addons/interact_menu/functions/fnc_addActionToClass.sqf @@ -0,0 +1,45 @@ +/* + * Author: CAA-Picard + * Insert an ACE action to a class, under a certain path + * Note: This function is NOT global. + * + * Argument: + * 0: TypeOf of the class + * 1: Type of action, 0 for actions, 1 for self-actions + * 2: Parent path of the new action + * 3: Action + * + * Return value: + * The entry full path, which can be used to remove the entry, or add children entries . + * + * Example: + * [typeOf cursorTarget, 0, ["ACE_TapShoulderRight"],VulcanPinchAction] call ace_interact_menu_fnc_addActionToClass; + * + * Public: No + */ +#include "script_component.hpp" + +EXPLODE_4_PVT(_this,_objectType,_typeNum,_parentPath,_action); + +// Ensure the config menu was compiled first +if (_typeNum == 0) then { + [_objectType] call FUNC(compileMenu); +} else { + [_objectType] call FUNC(compileMenuSelfAction); +}; + +private ["_varName","_actionTrees", "_parentNode"]; +_varName = format [[QGVAR(Act_%1), QGVAR(SelfAct_%1)] select _typeNum, _objectType]; +_actionTrees = missionNamespace getVariable [_varName, []]; +if((count _actionTrees) == 0) then { + missionNamespace setVariable [_varName, _actionTrees]; +}; + +_parentNode = [_actionTrees, _parentPath] call FUNC(findActionNode); +if (isNil {_parentNode}) exitWith {}; + +// Add action node as children of the correct node of action tree +(_parentNode select 1) pushBack [_action,[]]; + +// Return the full path +(+ _parentPath) pushBack (_action select 0) diff --git a/addons/interact_menu/functions/fnc_addActionToObject.sqf b/addons/interact_menu/functions/fnc_addActionToObject.sqf new file mode 100644 index 0000000000..223247057a --- /dev/null +++ b/addons/interact_menu/functions/fnc_addActionToObject.sqf @@ -0,0 +1,35 @@ +/* + * Author: CAA-Picard + * Insert an ACE action to an object, under a certain config path + * Note: This function is NOT global. + * + * Argument: + * 0: Object the action should be assigned to + * 1: Type of action, 0 for actions, 1 for self-actions + * 2: Parent path of the new action + * 3: Action + * + * Return value: + * The entry full path, which can be used to remove the entry, or add children entries . + * + * Example: + * [typeOf cursorTarget, 0, ["ACE_TapShoulderRight"],VulcanPinchAction] call ace_interact_menu_fnc_addActionToClass; + * + * Public: No + */ +#include "script_component.hpp" + +EXPLODE_4_PVT(_this,_object,_typeNum,_parentPath,_action); + +private ["_varName","_actionList"]; +_varName = [QGVAR(actions),QGVAR(selfActions)] select _typeNum; +_actionList = _object getVariable [_varName, []]; +if((count _actionList) == 0) then { + _object setVariable [_varName, _actionList]; +}; + +// Add action and parent path to the list of object actions +_actionList pushBack [_action, +_parentPath]; + +// Return the full path +(+ _parentPath) pushBack (_action select 0) diff --git a/addons/interact_menu/functions/fnc_addClassAction.sqf b/addons/interact_menu/functions/fnc_addClassAction.sqf deleted file mode 100644 index 4931328af2..0000000000 --- a/addons/interact_menu/functions/fnc_addClassAction.sqf +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Author: CAA-Picard - * Add an ACE action to a class, under a certain path - * Note: This function is NOT global. - * - * Argument: - * 0: TypeOf of the class - * 1: Type of action, 0 for actions, 1 for self-actions - * 2: Full path of the new action - * 3: Name of the action shown in the menu - * 4: Icon - * 5: Position (Position or Selection Name) or - * 6: Statement - * 7: Condition - * 8: Distance - * 9: Other parameters (Optional) - * - * Return value: - * The entry full path, which can be used to remove the entry, or add children entries . - * - * Example: - * [typeOf cursorTarget, 0,["ACE_TapShoulderRight","VulcanPinch"],"Vulcan Pinch","",[0,0,0],{_target setDamage 1;},{true},100] call ace_interact_menu_fnc_addClassAction; - * - * Public: No - */ -#include "script_component.hpp" - -EXPLODE_9_PVT(_this,_objectType,_typeNum,_fullPath,_displayName,_icon,_position,_statement,_condition,_distance); - -// Ensure the config menu was compiled first -if (_typeNum == 0) then { - [_objectType] call FUNC(compileMenu); -} else { - [_objectType] call FUNC(compileMenuSelfAction); -}; - -private ["_varName","_actions","_params","_entry", "_parentLevel", "_foundParentLevel", "_fnc_findFolder"]; - -_varName = format [[QGVAR(Act_%1), QGVAR(SelfAct_%1)] select _typeNum, _objectType]; -_actions = missionNamespace getVariable [_varName, []]; -if((count _actions) == 0) then { - missionNamespace setVariable [_varName, _actions]; -}; - -_params = [false,false,false,false]; -if (count _this > 9) then { - _params = _this select 9; -}; - -// Search the class action trees and find where to insert the entry -_parentLevel = _actions; -_foundParentLevel = false; - -_fnc_findFolder = { - EXPLODE_3_PVT(_this,_fullPath,_level,_classActions); - - if (count _fullPath == _level + 1) then { - _parentLevel = _classActions; - _foundParentLevel = true; - }; - - if (_foundParentLevel) exitWith {}; - - { - EXPLODE_2_PVT(_x,_actionData,_actionChildren); - if (((_actionData select 7) select _level) isEqualTo (_fullPath select _level)) exitWith { - // The action should go somewhere in here - [_fullPath, _level + 1, _actionChildren] call _fnc_findFolder; - }; - } forEach _classActions; -}; - -[_fullPath, 0, _actions] call _fnc_findFolder; - -// Exit if there's no entry point to insert this action -if (!_foundParentLevel) exitWith {}; - -_entry = [ - [ - _displayName, - _icon, - _position, - _statement, - _condition, - _distance, - _params, - + _fullPath - ], - [] - ]; - -_parentLevel pushBack _entry; - -_fullPath diff --git a/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf b/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf index 42f762de3f..36d4dc548d 100644 --- a/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf +++ b/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf @@ -5,6 +5,7 @@ * Argument: * 0: Object * 1: Original action tree + * 2: Parent path * * Return value: * Active children @@ -13,24 +14,39 @@ */ #include "script_component.hpp" -EXPLODE_2_PVT(_this,_object,_origAction); +EXPLODE_3_PVT(_this,_object,_origAction,_parentPath); EXPLODE_2_PVT(_origAction,_origActionData,_origActionChildren); -private ["_resultingAction","_target","_player","_activeChildren","_action","_actionData","_x"]; +private ["_target","_player","_fullPath","_activeChildren","_dynamicChildren","_action","_actionData","_x"]; _target = _object; _player = ACE_player; // Return nothing if the action itself is not active -if !([_target, ACE_player] call (_origActionData select 4)) exitWith { +if !([_target, ACE_player, _origActionData select 6] call (_origActionData select 4)) exitWith { [] }; +_fullPath = +_parentPath; +_fullPath pushBack (_origActionData select 0); _activeChildren = []; +// If there's a statement to dynamically insert children then execute it +if !({} isEqualTo (_origActionData select 5)) then { + _dynamicChildren = [_target, ACE_player, _origActionData select 6] call (_origActionData select 5); + + // Collect dynamic children class actions + { + _action = [_x select 2, _x, _fullPath] call FUNC(collectActiveActionTree); + if ((count _action) > 0) then { + _activeChildren pushBack _action; + }; + } forEach _dynamicChildren; +}; + // Collect children class actions { - _action = [_object, _x] call FUNC(collectActiveActionTree); + _action = [_object, _x, _fullPath] call FUNC(collectActiveActionTree); if ((count _action) > 0) then { _activeChildren pushBack _action; }; @@ -38,26 +54,15 @@ _activeChildren = []; // Collect children object actions { - _action = _x; - _actionData = _action select 0; + EXPLODE_2_PVT(_x,_actionData,_pPath); // Check if the action is children of the original action - if ((count (_actionData select 7)) == (count (_origActionData select 7) + 1)) then { + if (count _pPath == count _fullPath && + {_pPath isEqualTo _fullPath}) then { - // Compare parent path to see if it's a suitable child - private "_isChild"; - _isChild = true; - { - if !(_x isEqualTo ((_actionData select 7) select _forEachIndex)) exitWith { - _isChild = false; - }; - } forEach (_origActionData select 7); - - if (_isChild) then { - _action = [_object, _action] call FUNC(collectActiveActionTree); - if ((count _action) > 0) then { - _activeChildren pushBack _action; - }; + _action = [_object, _action, _fullPath] call FUNC(collectActiveActionTree); + if ((count _action) > 0) then { + _activeChildren pushBack _action; }; }; } forEach GVAR(objectActions); @@ -69,4 +74,5 @@ if ((count _activeChildren) == 0 && ((_origActionData select 3) isEqualTo {})) e [] }; -[_origActionData, _activeChildren] + +[_origActionData, _activeChildren, _object] diff --git a/addons/interact_menu/functions/fnc_compileMenu.sqf b/addons/interact_menu/functions/fnc_compileMenu.sqf index 7a24eaad5b..0fd4f6adb4 100644 --- a/addons/interact_menu/functions/fnc_compileMenu.sqf +++ b/addons/interact_menu/functions/fnc_compileMenu.sqf @@ -27,8 +27,8 @@ if !(isNil {missionNamespace getVariable [_actionsVarName, nil]}) exitWith {}; private "_recurseFnc"; _recurseFnc = { private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_selection", "_condition", "_showDisabled", - "_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_fullPath"]; - EXPLODE_2_PVT(_this,_actionsCfg,_parentPath); + "_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_insertChildren"]; + EXPLODE_1_PVT(_this,_actionsCfg); _actions = []; for "_i" from 0 to (count _actionsCfg) - 1 do { @@ -48,27 +48,28 @@ _recurseFnc = { // Add canInteract (including exceptions) and canInteractWith to condition _condition = _condition + format [QUOTE( && {[ARR_3(ACE_player, _target, %1)] call EFUNC(common,canInteractWith)} ), getArray (_entryCfg >> "exceptions")]; + _insertChildren = compile (getText (_entryCfg >> "insertChildren")); + _showDisabled = (getNumber (_entryCfg >> "showDisabled")) > 0; _enableInside = (getNumber (_entryCfg >> "enableInside")) > 0; _canCollapse = (getNumber (_entryCfg >> "canCollapse")) > 0; _runOnHover = (getNumber (_entryCfg >> "runOnHover")) > 0; - _fullPath = (+ _parentPath); - _fullPath pushBack (configName _entryCfg); - _condition = compile _condition; - _children = [_entryCfg, _fullPath] call _recurseFnc; + _children = [_entryCfg] call _recurseFnc; _entry = [ [ + configName _entryCfg, _displayName, _icon, - _selection, _statement, _condition, + _insertChildren, + [], + _selection, _distance, - [_showDisabled,_enableInside,_canCollapse,_runOnHover], - _fullPath + [_showDisabled,_enableInside,_canCollapse,_runOnHover] ], _children ]; @@ -81,20 +82,22 @@ _recurseFnc = { private "_actionsCfg"; _actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_Actions"; -missionNamespace setVariable [_actionsVarName, [_actionsCfg, []] call _recurseFnc]; +missionNamespace setVariable [_actionsVarName, [_actionsCfg] call _recurseFnc]; /* [ [ [ + "MyAction", "My Action", "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa", - [0,0,0], { (_this select 0) setVelocity [0,0,10]; }, { true }, + {}, + [], + [0,0,0], 1, [false,false,false] - ["ACE_MainActions","TeamManagement","MyAction"] ], [children actions] ] diff --git a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf index 6ef44adcf3..ebccc2ca42 100644 --- a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf @@ -27,8 +27,8 @@ if !(isNil {missionNamespace getVariable [_actionsVarName, nil]}) exitWith {}; private "_recurseFnc"; _recurseFnc = { private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_selection", "_condition", "_showDisabled", - "_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_fullPath"]; - EXPLODE_2_PVT(_this,_actionsCfg,_parentPath); + "_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_insertChildren"]; + EXPLODE_1_PVT(_this,_actionsCfg); _actions = []; for "_i" from 0 to (count _actionsCfg) - 1 do { @@ -45,27 +45,28 @@ _recurseFnc = { // Add canInteract (including exceptions) and canInteractWith to condition _condition = _condition + format [QUOTE( && {[ARR_3(ACE_player, objNull, %1)] call EFUNC(common,canInteractWith)} ), getArray (_entryCfg >> "exceptions")]; + _insertChildren = compile (getText (_entryCfg >> "insertChildren")); + _showDisabled = (getNumber (_entryCfg >> "showDisabled")) > 0; _enableInside = (getNumber (_entryCfg >> "enableInside")) > 0; _canCollapse = (getNumber (_entryCfg >> "canCollapse")) > 0; _runOnHover = (getNumber (_entryCfg >> "runOnHover")) > 0; - _fullPath = (+ _parentPath); - _fullPath pushBack (configName _entryCfg); - _condition = compile _condition; - _children = [_entryCfg, _fullPath] call _recurseFnc; + _children = [_entryCfg] call _recurseFnc; _entry = [ [ + configName _entryCfg, _displayName, _icon, - [0,0,0], _statement, _condition, + _insertChildren, + [], + [0,0,0], 10, //distace - [_showDisabled,_enableInside,_canCollapse,_runOnHover], - _fullPath + [_showDisabled,_enableInside,_canCollapse,_runOnHover] ], _children ]; @@ -82,16 +83,18 @@ _actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_SelfActions"; _actions = [ [ [ + "ACE_SelfActions", "Self Actions", "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa", + {}, + { true }, + {}, + [], "Spine3", - { true }, - { true }, 10, - [false,true,false], - ["ACE_SelfActions"] + [false,true,false] ], - [_actionsCfg, ["ACE_SelfActions"]] call _recurseFnc + [_actionsCfg] call _recurseFnc ] ]; diff --git a/addons/interact_menu/functions/fnc_createAction.sqf b/addons/interact_menu/functions/fnc_createAction.sqf new file mode 100644 index 0000000000..785db2c8b9 --- /dev/null +++ b/addons/interact_menu/functions/fnc_createAction.sqf @@ -0,0 +1,74 @@ +/* + * Author: CAA-Picard + * Creates an isolated ACE action + * Note: This function is NOT global. + * + * Argument: + * 0: Action name + * 1: Name of the action shown in the menu + * 2: Icon + * 3: Statement + * 4: Condition + * 5: Insert children code (Optional) + * 6: Action parameters (Optional) + * 7: Position (Position or Selection Name) or (Optional) + * 8: Distance (Optional) + * 9: Other parameters (Optional) + * + * Return value: + * Action + * + * Example: + * [VulcanPinch","Vulcan Pinch",{_target setDamage 1;},{true},{},[parameters], [0,0,0], 100] call ace_interact_menu_fnc_createAction; + * + * Public: No + */ +#include "script_component.hpp" + +EXPLODE_5_PVT(_this,_actionName,_displayName,_icon,_statement,_condition); + +private ["_insertChildren","_customParams","_position","_distance","_params"]; + +_insertChildren = if (count _this > 5) then { + _this select 5 +} else { + {} +}; + +_customParams = if (count _this > 6) then { + _this select 6 +} else { + [] +}; + +_position = if (count _this > 7) then { + _this select 7 +} else { + [0,0,0] +}; + +_distance = if (count _this > 8) then { + _this select 8 +} else { + 2 +}; + +_params = if (count _this > 9) then { + _this select 9 +} else { + [false,false,false,false] +}; + +[ + _actionName, + _displayName, + _icon, + _statement, + _condition, + + _insertChildren, + _customParams, + _position, + _distance, + _params +] diff --git a/addons/interact_menu/functions/fnc_findActionNode.sqf b/addons/interact_menu/functions/fnc_findActionNode.sqf new file mode 100644 index 0000000000..41dd32b7d8 --- /dev/null +++ b/addons/interact_menu/functions/fnc_findActionNode.sqf @@ -0,0 +1,56 @@ +/* + * Author: CAA-Picard + * Return action point from path + * Note: This function is NOT global. + * + * Argument: + * 0: List of Action Tree + * 1: Path + * + * Return value: + * Action node . + * + * Example: + * [_actionTree, ["ACE_TapShoulderRight","VulcanPinchAction"]] call ace_interact_menu_fnc_findActionNode; + * + * Public: No + */ +#include "script_component.hpp" + +EXPLODE_2_PVT(_this,_actionTreeList,_parentPath); + +private ["_parentNode", "_foundParentNode", "_fnc_findFolder"]; + +// Hack to make this work on the root node too +if (count _parentPath == 0) exitWith { + [[],_actionTreeList] +}; + +// Search the class action trees and find where to insert the entry +_parentNode = [[],_actionTreeList]; +_foundParentNode = false; + +_fnc_findFolder = { + EXPLODE_3_PVT(_this,_parentPath,_level,_actionNode); + + { + EXPLODE_2_PVT(_x,_actionData,_actionChildren); + if ((_actionData select 0) isEqualTo (_parentPath select _level)) exitWith { + + if (count _parentPath == _level + 1) exitWith { + _parentNode = _x; + _foundParentNode = true; + }; + + // The action should go somewhere in here + [_parentPath, _level + 1, _x] call _fnc_findFolder; + }; + } forEach (_actionNode select 1); +}; + +[_parentPath, 0, [[],_actionTreeList]] call _fnc_findFolder; + +// Exit if there's no entry point to insert this action +if (!_foundParentNode) exitWith {}; + +_parentNode diff --git a/addons/interact_menu/functions/fnc_isSubPath.sqf b/addons/interact_menu/functions/fnc_isSubPath.sqf new file mode 100644 index 0000000000..e90aa12300 --- /dev/null +++ b/addons/interact_menu/functions/fnc_isSubPath.sqf @@ -0,0 +1,29 @@ +/* + * Author: CAA-Picard + * Check if the first path is a subpath of the other + * + * Argument: + * 0: LongPath + * 1: ShortPath + * + * Return value: + * Bool + * + * Public: No + */ +#include "script_component.hpp" + +EXPLODE_2_PVT(_this,_longPath,_shortPath); + +private ["_isSubPath","_i"]; +_isSubPath = true; + +if (count _shortPath > count _longPath) exitWith {false}; + +for [{_i = 0},{_i < (count _shortPath) - 1},{_i = _i + 1}] do { + if !((_longPath select _i) isEqualTo (_shortPath select _i)) exitWith { + _isSubPath = false; + }; +}; + +_isSubPath diff --git a/addons/interact_menu/functions/fnc_keyUp.sqf b/addons/interact_menu/functions/fnc_keyUp.sqf index 716d6dafd8..69f9697449 100644 --- a/addons/interact_menu/functions/fnc_keyUp.sqf +++ b/addons/interact_menu/functions/fnc_keyUp.sqf @@ -16,7 +16,7 @@ if(GVAR(actionSelected)) then { this = GVAR(selectedTarget); _player = ACE_Player; _target = GVAR(selectedTarget); - [GVAR(selectedTarget), ACE_player] call GVAR(selectedStatement); + [GVAR(selectedTarget), ACE_player, (GVAR(selectedAction) select 0) select 6] call GVAR(selectedStatement); }; if (GVAR(keyDown)) then { diff --git a/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf b/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf index 6346696d53..dd54490532 100644 --- a/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf @@ -20,7 +20,7 @@ if(GVAR(actionSelected)) then { this = GVAR(selectedTarget); _player = ACE_Player; _target = GVAR(selectedTarget); - [GVAR(selectedTarget), ACE_player] call GVAR(selectedStatement); + [GVAR(selectedTarget), ACE_player, (GVAR(selectedAction) select 0) select 6] call GVAR(selectedStatement); }; if (GVAR(keyDownSelfAction)) then { diff --git a/addons/interact_menu/functions/fnc_removeActionFromClass.sqf b/addons/interact_menu/functions/fnc_removeActionFromClass.sqf new file mode 100644 index 0000000000..aee1675fa7 --- /dev/null +++ b/addons/interact_menu/functions/fnc_removeActionFromClass.sqf @@ -0,0 +1,39 @@ +/* + * Author: CAA-Picard + * Removes an action from a class + * + * Argument: + * 0: TypeOf of the class + * 1: Type of action, 0 for actions, 1 for self-actions + * 2: Full path of the new action + * + * Return value: + * None + * + * Example: + * [typeOf cursorTarget, 0,["ACE_TapShoulderRight","VulcanPinch"]] call ace_interact_menu_fnc_removeActionFromClass; + * + * Public: No + */ +#include "script_component.hpp" + +EXPLODE_3_PVT(_this,_objectType,_typeNum,_fullPath); + +private ["_res","_varName","_actionTrees"]; +_res = _fullPath call FUNC(splitPath); +EXPLODE_2_PVT(_res,_parentPath,_actionName); + +_varName = format [[QGVAR(Act_%1), QGVAR(SelfAct_%1)] select _typeNum, _objectType]; +_actionTrees = missionNamespace getVariable [_varName, []]; + +_parentNode = [_actionTrees, _parentPath] call FUNC(findActionNode); +if (isNil {_parentNode}) exitWith {}; + +// Iterate through children of the father +{ + if (((_x select 0) select 0) == _actionName) exitWith { + (_parentNode select 1) deleteAt _forEachIndex; + }; +} forEach (_parentNode select 1); + +_parentLevel deleteAt _actionIndex; diff --git a/addons/interact_menu/functions/fnc_removeAction.sqf b/addons/interact_menu/functions/fnc_removeActionFromObject.sqf similarity index 53% rename from addons/interact_menu/functions/fnc_removeAction.sqf rename to addons/interact_menu/functions/fnc_removeActionFromObject.sqf index 3c6988971d..dc5fdc05f0 100644 --- a/addons/interact_menu/functions/fnc_removeAction.sqf +++ b/addons/interact_menu/functions/fnc_removeActionFromObject.sqf @@ -1,30 +1,33 @@ -/* - * Author: commy2, NouberNou and CAA-Picard - * Remove an action from an object - * - * Argument: - * 0: Object the action is assigned to - * 1: Type of action, 0 for actions, 1 for self-actions - * 2: Full path of the action to remove - * - * Return value: - * None - * - * Example: - * [cursorTarget,0,["ACE_TapShoulderRight","VulcanPinch"]] call ace_interact_menu_fnc_removeAction; - * - * Public: No - */ -#include "script_component.hpp" - -EXPLODE_3_PVT(_this,_object,_typeNum,_fullPath); - -private ["_varName","_actions"]; -_varName = [QGVAR(actions),QGVAR(selfActions)] select _typeNum; -_actions = _object getVariable [_varName, []]; - -{ - if (((_x select 0) select 7) isEqualTo _fullPath) exitWith { - _actions deleteAt _forEachIndex; - }; -} forEach _actions; +/* + * Author: commy2, NouberNou and CAA-Picard + * Removes an action from an object + * + * Argument: + * 0: Object the action is assigned to + * 1: Type of action, 0 for actions, 1 for self-actions + * 2: Full path of the action to remove + * + * Return value: + * None + * + * Example: + * [cursorTarget,0,["ACE_TapShoulderRight","VulcanPinch"]] call ace_interact_menu_fnc_removeActionFromObject; + * + * Public: No + */ +#include "script_component.hpp" + +EXPLODE_3_PVT(_this,_object,_typeNum,_fullPath); + +private ["_res","_varName","_actionList"]; +_res = _fullPath call FUNC(splitPath); +EXPLODE_2_PVT(_res,_parentPath,_actionName); + +_varName = [QGVAR(actions),QGVAR(selfActions)] select _typeNum; +_actionList = _object getVariable [_varName, []]; +{ + if (((_x select 0) select 0) isEqualTo _actionName && + {(_x select 1) isEqualTo _parentPath}) exitWith { + _actionList deleteAt _forEachIndex; + }; +} forEach _actionList; diff --git a/addons/interact_menu/functions/fnc_removeClassAction.sqf b/addons/interact_menu/functions/fnc_removeClassAction.sqf deleted file mode 100644 index 9ba29cd357..0000000000 --- a/addons/interact_menu/functions/fnc_removeClassAction.sqf +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Author: CAA-Picard - * Removes a class action from a class - * Note: This function is NOT global. - * - * Argument: - * 0: TypeOf of the class - * 1: Type of action, 0 for actions, 1 for self-actions - * 2: Full path of the new action - * - * Return value: - * None - * - * Example: - * [typeOf cursorTarget, 0,["ACE_TapShoulderRight","VulcanPinch"]] call ace_interact_menu_fnc_removeClassAction; - * - * Public: No - */ -#include "script_component.hpp" - -EXPLODE_3_PVT(_this,_objectType,_typeNum,_fullPath); - -private ["_varName","_actions","_parentLevel", "_actionIndex", "_foundAction", "_fnc_findFolder"]; - -_varName = format [[QGVAR(Act_%1), QGVAR(SelfAct_%1)] select _typeNum, _objectType]; -_actions = missionNamespace getVariable [_varName, []]; - -// Search the class action trees and find where to insert the entry -_parentLevel = _actions; -_actionIndex = -1; -_foundAction = false; - -_fnc_findFolder = { - EXPLODE_3_PVT(_this,_fullPath,_level,_classActions); - - if (count _fullPath == _level + 1) then { - _parentLevel = _classActions; - }; - - { - EXPLODE_2_PVT(_x,_actionData,_actionChildren); - if (((_actionData select 7) select _level) isEqualTo (_fullPath select _level)) exitWith { - if (_level + 1 == count _fullPath) exitWith { - _actionIndex = _forEachIndex; - _foundAction = true; - }; - [_fullPath, _level + 1, _actionChildren] call _fnc_findFolder; - }; - if (_foundAction) exitWith {}; - } forEach _classActions; -}; - -[_fullPath, 0, _actions] call _fnc_findFolder; - -// Exit if the action was not found -if (!_foundAction) exitWith {}; - -_entry = [ - [ - _displayName, - _icon, - _position, - _statement, - _condition, - _distance, - _params, - + _fullPath - ], - [] - ]; - -_parentLevel deleteAt _actionIndex; diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf index 187201a821..df97b232de 100644 --- a/addons/interact_menu/functions/fnc_render.sqf +++ b/addons/interact_menu/functions/fnc_render.sqf @@ -41,17 +41,17 @@ if (GVAR(keyDown)) then { // Iterate through object actions, find base level actions and render them if appropiate _actionsVarName = format [QGVAR(Act_%1), typeOf _target]; - GVAR(objectActions) = _target getVariable [QGVAR(actions), []]; + GVAR(objectActionList) = _target getVariable [QGVAR(actions), []]; { - _action = _x; // Only render them directly if they are base level actions - if (count ((_action select 0) select 7) == 1) then { + if (count (_x select 1) == 0) then { // Try to render the menu + _action = [_x,[]]; if ([_target, _action] call FUNC(renderBaseMenu)) then { _numInteractions = _numInteractions + 1; }; }; - } forEach GVAR(objectActions); + } forEach GVAR(objectActionList); // Iterate through base level class actions and render them if appropiate _classActions = missionNamespace getVariable [_actionsVarName, []]; @@ -80,7 +80,7 @@ if (GVAR(keyDown)) then { // Iterate through object actions, find base level actions and render them if appropiate _actionsVarName = format [QGVAR(SelfAct_%1), typeOf _target]; - GVAR(objectActions) = _target getVariable [QGVAR(selfActions), []]; + GVAR(objectActionList) = _target getVariable [QGVAR(selfActions), []]; /* { _action = _x; @@ -88,7 +88,7 @@ if (GVAR(keyDown)) then { if (count (_action select 7) == 1) then { [_target, _action, 0, [180, 360]] call FUNC(renderMenu); }; - } forEach GVAR(objectActions); + } forEach GVAR(objectActionList); */ // Iterate through base level class actions and render them if appropiate @@ -142,8 +142,8 @@ if(GVAR(keyDown) || GVAR(keyDownSelfAction)) then { drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,.75], _pos, 0.6*SafeZoneW, 0.6*SafeZoneW, GVAR(rotationAngle), "", 0.5, 0.025, "TahomaB"]; _foundTarget = true; GVAR(actionSelected) = true; - GVAR(selectedTarget) = (_closest select 0) select 0; GVAR(selectedAction) = (_closest select 0) select 1; + GVAR(selectedTarget) = (GVAR(selectedAction)) select 2; GVAR(selectedStatement) = ((GVAR(selectedAction)) select 0) select 3; _misMatch = false; @@ -153,30 +153,34 @@ if(GVAR(keyDown) || GVAR(keyDownSelfAction)) then { _misMatch = true; } else { { - if(_x != (_hoverPath select _forEachIndex)) exitWith { + if !(_x isEqualTo (_hoverPath select _forEachIndex)) exitWith { _misMatch = true; }; } forEach GVAR(lastPath); }; - if(_misMatch) then { - GVAR(lastPath) = _hoverPath; + if(_misMatch && {diag_tickTime-GVAR(expandedTime) > 0.25}) then { GVAR(startHoverTime) = diag_tickTime; + GVAR(lastPath) = _hoverPath; GVAR(expanded) = false; } else { if(!GVAR(expanded) && diag_tickTime-GVAR(startHoverTime) > 0.25) then { GVAR(expanded) = true; - GVAR(expandedTime) = diag_tickTime; + + // Start the expanding menu animation only if the user is not going up the menu + if !([GVAR(menuDepthPath),GVAR(lastPath)] call FUNC(isSubPath)) then { + GVAR(expandedTime) = diag_tickTime; + }; GVAR(menuDepthPath) = +GVAR(lastPath); // Execute the current action if it's run on hover private "_runOnHover"; - _runOnHover = ((GVAR(selectedAction) select 0) select 6) select 3; + _runOnHover = ((GVAR(selectedAction) select 0) select 9) select 3; if (_runOnHover) then { this = GVAR(selectedTarget); _player = ACE_Player; _target = GVAR(selectedTarget); - [GVAR(selectedTarget), ACE_player] call GVAR(selectedStatement); + [GVAR(selectedTarget), ACE_player, (GVAR(selectedAction) select 0) select 6] call GVAR(selectedStatement); }; }; }; diff --git a/addons/interact_menu/functions/fnc_renderBaseMenu.sqf b/addons/interact_menu/functions/fnc_renderBaseMenu.sqf index e3a8a0c9a4..277f79c141 100644 --- a/addons/interact_menu/functions/fnc_renderBaseMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderBaseMenu.sqf @@ -4,7 +4,7 @@ * * Argument: * 0: Object - * 1: Action data + * 1: Action node * 2: 3D position (Optional) * * Return value: @@ -16,25 +16,25 @@ private ["_distance","_pos","_weaponDir","_ref","_cameraPos","_sPos","_activeActionTree"]; -EXPLODE_2_PVT(_this,_object,_baseAction); -EXPLODE_1_PVT(_baseAction,_actionData); +EXPLODE_2_PVT(_this,_object,_baseActionNode); +EXPLODE_1_PVT(_baseActionNode,_actionData); -_distance = _actionData select 5; +_distance = _actionData select 8; // Obtain a 3D position for the action if((count _this) > 2) then { _pos = _this select 2; } else { - if(typeName (_actionData select 2) == "ARRAY") then { - _pos = _object modelToWorld (_actionData select 2); + if(typeName (_actionData select 7) == "ARRAY") then { + _pos = _object modelToWorld (_actionData select 7); } else { - if ((_actionData select 2) == "weapon") then { + if ((_actionData select 7) == "weapon") then { // Craft a suitable position for weapon interaction _weaponDir = _object weaponDirection currentWeapon _object; _ref = _weaponDir call EFUNC(common,createOrthonormalReference); _pos = (_object modelToWorld (_object selectionPosition "righthand")) vectorAdd ((_ref select 2) vectorMultiply 0.1); } else { - _pos = _object modelToWorld (_object selectionPosition (_actionData select 2)); + _pos = _object modelToWorld (_object selectionPosition (_actionData select 7)); }; }; // Compensate for movement during the frame to get rid of jittering @@ -59,19 +59,29 @@ if ((_sPos select 1) < safeZoneY || (_sPos select 1) > safeZoneY + safeZon // Collect active tree private "_uid"; -_uid = format [QGVAR(ATCache_%1), (_actionData select 7) select 0]; +_uid = format [QGVAR(ATCache_%1), _actionData select 0]; _activeActionTree = [ - [_object, _baseAction], + [_object, _baseActionNode, []], DFUNC(collectActiveActionTree), _object, _uid, 0.2 ] call EFUNC(common,cachedCall); - - +/* +diag_log "Printing: _activeActionTree"; +_fnc_print = { + EXPLODE_2_PVT(_this,_level,_node); + EXPLODE_3_PVT(_node,_actionData,_children,_object); + diag_log text format ["Level %1 -> %2 on %3", _level, _actionData select 0, _object]; + { + [_level + 1, _x] call _fnc_print; + } forEach _children; +}; +[0, _activeActionTree] call _fnc_print; +*/ // Check if there's something left for rendering if (count _activeActionTree == 0) exitWith {false}; //EXPLODE_2_PVT(_activeActionTree,_actionData,_actionChildren); -[_object, _activeActionTree, _pos, [180,360]] call FUNC(renderMenu); +[[], _activeActionTree, _pos, [180,360]] call FUNC(renderMenu); true diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index d2cf16c3a0..26b07dd475 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -3,7 +3,7 @@ * Render an interaction menu and it's children recursively * * Argument: - * 0: Object + * 0: Parent path * 1: Action data * 2: 3D position * 3: Angle range available for rendering @@ -17,14 +17,15 @@ private ["_menuInSelectedPath", "_path", "_menuDepth", "_currentRenderDepth", "_x", "_offset", "_newPos", "_forEachIndex"]; -EXPLODE_4_PVT(_this,_object,_action,_pos,_angles); -EXPLODE_2_PVT(_action,_actionData,_activeChildren); +EXPLODE_4_PVT(_this,_parentPath,_action,_pos,_angles); +EXPLODE_3_PVT(_action,_actionData,_activeChildren,_actionObject); EXPLODE_2_PVT(_angles,_centerAngle,_maxAngleSpan); _menuDepth = (count GVAR(menuDepthPath)); // Store path to action -_path = [_object] + (_actionData select 7); +_path = +_parentPath; +_path pushBack [_actionData select 0,_actionObject]; // Check if the menu is on the selected path _menuInSelectedPath = true; @@ -32,7 +33,7 @@ _menuInSelectedPath = true; if (_forEachIndex >= (count GVAR(menuDepthPath))) exitWith { _menuInSelectedPath = false; }; - if (_x != (GVAR(menuDepthPath) select _forEachIndex)) exitWith { + if !(_x isEqualTo (GVAR(menuDepthPath) select _forEachIndex)) exitWith { _menuInSelectedPath = false; }; } forEach _path; @@ -47,7 +48,7 @@ if(!_menuInSelectedPath) then { //_menuDepth > 0 && _color = format ["#%1FFFFFF", [255 * 0.75] call EFUNC(common,toHex)]; }; }; -[_actionData select 0, _color, _pos, 1, 1, 0, _actionData select 1, 0.5, 0.025, "TahomaB"] call FUNC(renderIcon); +[_actionData select 1, _color, _pos, 1, 1, 0, _actionData select 2, 0.5, 0.025, "TahomaB"] call FUNC(renderIcon); // Add the action to current options GVAR(currentOptions) pushBack [_this, _pos, _path]; @@ -83,7 +84,7 @@ if (_menuInSelectedPath && (_menuDepth == count _path)) then { _angle = _centerAngle - _angleSpan / 2; { - _target = _object; + _target = _actionObject; _player = ACE_player; _offset = ((GVAR(refSystem) select 1) vectorMultiply (-_scale * cos _angle)) vectorAdd @@ -92,7 +93,7 @@ _angle = _centerAngle - _angleSpan / 2; //drawLine3D [_pos, _newPos, [1,0,0,0.8]]; - [_object, _x, _newPos, [_angle, 140]] call FUNC(renderMenu); + [_path, _x, _newPos, [_angle, 140]] call FUNC(renderMenu); if (_angleSpan == 360) then { _angle = _angle + _angleSpan / (count _activeChildren); diff --git a/addons/interact_menu/functions/fnc_splitPath.sqf b/addons/interact_menu/functions/fnc_splitPath.sqf new file mode 100644 index 0000000000..87140d0482 --- /dev/null +++ b/addons/interact_menu/functions/fnc_splitPath.sqf @@ -0,0 +1,27 @@ +/* + * Author: CAA-Picard + * Take full path and split it between parent path and action name + * + * Argument: + * Full path of the action to remove + * + * Return value: + * 0: Parent path + * 1: Action name + * + * Public: No + */ +#include "script_component.hpp" + +private ["_parentPath","_actionName"]; +_parentPath = []; +for [{_i = 0},{_i < (count _this) - 1},{_i = _i + 1}] do { + _parentPath pushBack (_this select _i); +}; +_actionName = if (count _this > 0) then { + _this select ((count _this) - 1); +} else { + "" +}; + +[_parentPath, _actionName] diff --git a/addons/interaction/CfgVehicles.hpp b/addons/interaction/CfgVehicles.hpp index 1bd1e81be2..a3b6187c6c 100644 --- a/addons/interaction/CfgVehicles.hpp +++ b/addons/interaction/CfgVehicles.hpp @@ -412,7 +412,14 @@ class CfgVehicles { condition = "true"; }; }; - class ACE_SelfActions {}; + class ACE_SelfActions { + class ACE_Passengers { + displayName = "$STR_ACE_Interaction_Passengers"; + condition = "true"; + statement = ""; + insertChildren = QUOTE(_this call FUNC(addPassengersActions)); + }; + }; }; class Tank: LandVehicle { class ACE_Actions { @@ -423,7 +430,14 @@ class CfgVehicles { condition = "true"; }; }; - class ACE_SelfActions {}; + class ACE_SelfActions { + class ACE_Passengers { + displayName = "$STR_ACE_Interaction_Passengers"; + condition = "true"; + statement = ""; + insertChildren = QUOTE(_this call FUNC(addPassengersActions)); + }; + }; }; class Air; @@ -436,7 +450,14 @@ class CfgVehicles { condition = "true"; }; }; - class ACE_SelfActions {}; + class ACE_SelfActions { + class ACE_Passengers { + displayName = "$STR_ACE_Interaction_Passengers"; + condition = "true"; + statement = ""; + insertChildren = QUOTE(_this call FUNC(addPassengersActions)); + }; + }; }; class Plane: Air { class ACE_Actions { @@ -447,7 +468,14 @@ class CfgVehicles { condition = "true"; }; }; - class ACE_SelfActions {}; + class ACE_SelfActions { + class ACE_Passengers { + displayName = "$STR_ACE_Interaction_Passengers"; + condition = "true"; + statement = ""; + insertChildren = QUOTE(_this call FUNC(addPassengersActions)); + }; + }; }; class Ship; @@ -469,7 +497,14 @@ class CfgVehicles { }; }; }; - class ACE_SelfActions {}; + class ACE_SelfActions { + class ACE_Passengers { + displayName = "$STR_ACE_Interaction_Passengers"; + condition = "true"; + statement = ""; + insertChildren = QUOTE(_this call FUNC(addPassengersActions)); + }; + }; }; class StaticWeapon: LandVehicle { @@ -481,7 +516,14 @@ class CfgVehicles { condition = "true"; }; }; - class ACE_SelfActions {}; + class ACE_SelfActions { + class ACE_Passengers { + displayName = "$STR_ACE_Interaction_Passengers"; + condition = "true"; + statement = ""; + insertChildren = QUOTE(_this call FUNC(addPassengersActions)); + }; + }; }; class StaticMortar; @@ -494,7 +536,14 @@ class CfgVehicles { condition = "true"; }; }; - class ACE_SelfActions {}; + class ACE_SelfActions { + class ACE_Passengers { + displayName = "$STR_ACE_Interaction_Passengers"; + condition = "true"; + statement = ""; + insertChildren = QUOTE(_this call FUNC(addPassengersActions)); + }; + }; }; class thingX; diff --git a/addons/interaction/XEH_preInit.sqf b/addons/interaction/XEH_preInit.sqf index 6efa72778e..671535c36d 100644 --- a/addons/interaction/XEH_preInit.sqf +++ b/addons/interaction/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP(addPassengerActions); +PREP(addPassengersActions); PREP(addSelectableItem); PREP(applyButtons); PREP(canInteractWithCivilian); diff --git a/addons/interaction/config.cpp b/addons/interaction/config.cpp index a39e8f8bf5..d5d9d63d69 100644 --- a/addons/interaction/config.cpp +++ b/addons/interaction/config.cpp @@ -5,7 +5,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_common"}; + requiredAddons[] = {"ace_interact_menu"}; author[] = {"commy2", "KoffeinFlummi", "CAA-Picard", "bux578"}; authorUrl = "https://github.com/commy2/"; VERSION_CONFIG; diff --git a/addons/interaction/functions/fnc_addPassengerActions.sqf b/addons/interaction/functions/fnc_addPassengerActions.sqf new file mode 100644 index 0000000000..d4a5da3788 --- /dev/null +++ b/addons/interaction/functions/fnc_addPassengerActions.sqf @@ -0,0 +1,32 @@ +/* + * Author: CAA-Picard + * Mount unit actions inside passenger submenu + * Note: This function is NOT global. + * + * Argument: + * 0: Vehicle + * 1: Player + * 3: Parameters + * + * Return value: + * Children actions + * + * Public: No + */ +#include "script_component.hpp" + +EXPLODE_3_PVT(_this,_vehicle,_player,_parameters); + +diag_log "addPassengerActions"; + +private ["_unit","_actions"]; +_unit = _parameters select 0; + +_varName = format [QEGVAR(interact_menu,Act_%1), typeOf _unit]; +_actionTrees = missionNamespace getVariable [_varName, []]; + +_actions = []; +// Mount unit MainActions menu +_actions pushBack [(_actionTrees select 0) select 0, (_actionTrees select 0) select 1, _unit]; + +_actions diff --git a/addons/interaction/functions/fnc_addPassengersActions.sqf b/addons/interaction/functions/fnc_addPassengersActions.sqf new file mode 100644 index 0000000000..678cbc55db --- /dev/null +++ b/addons/interaction/functions/fnc_addPassengersActions.sqf @@ -0,0 +1,43 @@ +/* + * Author: CAA-Picard + * Create one action per passenger + * Note: This function is NOT global. + * + * Argument: + * 0: Vehicle + * 1: Player + * 3: Parameters + * + * Return value: + * Children actions + * + * Public: No + */ +#include "script_component.hpp" + +EXPLODE_3_PVT(_this,_vehicle,_player,_parameters); + +private ["_actions"]; +_actions = []; + +{ + _unit = _x; + if (_x != _player) then { + _actions pushBack + [ + [ + str(_unit), + [_unit, true] call EFUNC(common,getName), + "", + {systemChat "selected passenger"}, + {true}, + {_this call FUNC(addPassengerActions);}, + [_unit] + ] call EFUNC(interact_menu,createAction), + [], + _unit + ]; + }; +} forEach crew _vehicle; + +_actions \ No newline at end of file diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index 76898cd227..4b82908f2f 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -650,5 +650,8 @@ Interakcja Interactuar + + Passengers >> +