diff --git a/addons/interact_menu/functions/fnc_renderActionPoints.sqf b/addons/interact_menu/functions/fnc_renderActionPoints.sqf index 21aec3f24c..e30ee55c10 100644 --- a/addons/interact_menu/functions/fnc_renderActionPoints.sqf +++ b/addons/interact_menu/functions/fnc_renderActionPoints.sqf @@ -16,8 +16,8 @@ GVAR(currentOptions) = []; private _player = ACE_player; -private _cameraPosASL = AGLtoASL (positionCameraToWorld [0, 0, 0]); -private _cameraDir = (AGLtoASL (positionCameraToWorld [0, 0, 1])) vectorDiff _cameraPosASL; +GVAR(cameraPosASL) = AGLtoASL (positionCameraToWorld [0, 0, 0]); +GVAR(cameraDir) = (AGLtoASL (positionCameraToWorld [0, 0, 1])) vectorDiff GVAR(cameraPosASL); private _fnc_renderNearbyActions = { // Render all nearby interaction menus @@ -32,7 +32,7 @@ private _fnc_renderNearbyActions = { private _target = _x; // Quick oclussion test. Skip objects more than 1 m behind the camera plane - private _lambda = ((getPosASL _x) vectorDiff _cameraPosASL) vectorDotProduct _cameraDir; + private _lambda = ((getPosASL _x) vectorDiff GVAR(cameraPosASL)) vectorDotProduct GVAR(cameraDir); if ((_lambda > -1) && {!isObjectHidden _target}) then { private _numInteractions = 0; // Prevent interacting with yourself or your own vehicle diff --git a/addons/interact_menu/functions/fnc_renderBaseMenu.sqf b/addons/interact_menu/functions/fnc_renderBaseMenu.sqf index 512779fe82..852c2b332f 100644 --- a/addons/interact_menu/functions/fnc_renderBaseMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderBaseMenu.sqf @@ -90,9 +90,8 @@ if (_activeActionTree isEqualTo []) exitWith {false}; BEGIN_COUNTER(fnc_renderMenus); -// IGNORE_PRIVATE_WARNING(_cameraPosASL,_cameraDir); if (count _pos > 2) then { - _sPos pushBack (((AGLtoASL _pos) vectorDiff _cameraPosASL) vectorDotProduct _cameraDir); + _sPos pushBack (((AGLtoASL _pos) vectorDiff GVAR(cameraPosASL)) vectorDotProduct GVAR(cameraDir)); } else { _sPos pushBack 0; }; diff --git a/addons/interaction/CfgVehicles.hpp b/addons/interaction/CfgVehicles.hpp index dd6ca32de6..0aa65cd762 100644 --- a/addons/interaction/CfgVehicles.hpp +++ b/addons/interaction/CfgVehicles.hpp @@ -307,8 +307,9 @@ class CfgVehicles { class ACE_Actions { class ACE_MainActions { displayName = CSTRING(MainAction); + position = QUOTE(call DFUNC(getVehiclePos)); selection = ""; - distance = 10; + distance = 4; condition = "true"; class ACE_Passengers { displayName = CSTRING(Passengers); @@ -333,8 +334,9 @@ class CfgVehicles { class ACE_Actions { class ACE_MainActions { displayName = CSTRING(MainAction); + position = QUOTE(call DFUNC(getVehiclePos)); selection = ""; - distance = 10; + distance = 4; condition = "true"; class ACE_Passengers { displayName = CSTRING(Passengers); @@ -386,8 +388,9 @@ class CfgVehicles { class ACE_Actions { class ACE_MainActions { displayName = CSTRING(MainAction); + position = QUOTE(call DFUNC(getVehiclePos)); selection = ""; - distance = 10; + distance = 4; condition = "true"; class ACE_Passengers { displayName = CSTRING(Passengers); @@ -413,7 +416,7 @@ class CfgVehicles { class ACE_MainActions { displayName = CSTRING(MainAction); selection = ""; - distance = 10; + distance = 4; condition = "true"; class ACE_Passengers { displayName = CSTRING(Passengers); @@ -439,8 +442,9 @@ class CfgVehicles { class ACE_Actions { class ACE_MainActions { displayName = CSTRING(MainAction); + position = QUOTE(call DFUNC(getVehiclePos)); selection = ""; - distance = 10; + distance = 4; condition = "true"; class ACE_Push { @@ -475,7 +479,7 @@ class CfgVehicles { class ACE_MainActions { displayName = CSTRING(MainAction); selection = "gunnerview"; - distance = 2; + distance = 4; condition = "true"; class ACE_Passengers { displayName = CSTRING(Passengers); diff --git a/addons/interaction/XEH_PREP.hpp b/addons/interaction/XEH_PREP.hpp index be6158cdd5..db6b1d3298 100644 --- a/addons/interaction/XEH_PREP.hpp +++ b/addons/interaction/XEH_PREP.hpp @@ -2,6 +2,7 @@ // interaction menu PREP(addPassengerActions); PREP(addPassengersActions); +PREP(getVehiclePos); PREP(getWeaponPos); PREP(moduleInteraction); diff --git a/addons/interaction/functions/fnc_getVehiclePos.sqf b/addons/interaction/functions/fnc_getVehiclePos.sqf new file mode 100644 index 0000000000..1b8ebc69f6 --- /dev/null +++ b/addons/interaction/functions/fnc_getVehiclePos.sqf @@ -0,0 +1,81 @@ +/* + * Author: esteldunedain + * Return a suitable position for the action point for the given target vehicle + * + * Arguments: + * None (uses local variable _target) + * + * Return value: + * Children actions + * + * Example: + * call ace_interaction_fnc_getVehiclePos + * + * Public: No + */ +#include "script_component.hpp" +// IGNORE_PRIVATE_WARNING(_target); + +private _bb = boundingBoxReal _target; +(_bb select 0) params ["_bbX", "_bbY", "_bbZ"]; + +//Helicopter's rotors distort the bounding box, assume a max of 3 meters width for the body +if (_target isKindOf "Helicopter") then {_bbX = (_bbx min 3) max -3;}; + +private _relPos = _target worldToModelVisual ASLToAGL EGVAR(interact_menu,cameraPosASL); +#ifdef DEBUG_MODE_FULL + _relPos = _target worldToModelVisual ASLToAGL eyePos ACE_player; +#endif +_relPos params ["_dx", "_dy", "_dz"]; + +private _ndx = (abs _dx) / ((abs (_bbx)) - 1); +private _ndy = (abs _dy) / ((abs (_bbY)) - 1); +private _ndz = (abs _dz) / ((abs (_bbZ)) - 1); + +private "_pos"; +if (_ndx > _ndy) then { + if (_ndx > _ndz) then { + // _ndx is greater, will colide with x plane first + _pos = _relPos vectorMultiply ((1 / _ndx) min 0.8); + } else { + // _ndz is greater, will colide with z plane first + _pos = _relPos vectorMultiply ((1 / _ndz) min 0.8); + }; +} else { + if (_ndy > _ndz) then { + // _ndy is greater, will colide with y plane first + _pos = _relPos vectorMultiply ((1 / _ndy) min 0.8); + } else { + // _ndz is greater, will colide with z plane first + _pos = _relPos vectorMultiply ((1 / _ndz) min 0.8); + }; +}; +//Set max height at player's eye level (prevent very high interactin point on choppers) +_pos set [2, (_pos select 2) min _dz]; +TRACE_4("",_bb,_bbX,_relPos, _pos); +_pos + +/////////////////// +// The code belows works very well for cursor mode, but not at all in normal mode +// maybe it could be enabled by default only for that mode +/* +if (cursorObject isEqualTo _target) exitWith { + private _dest = EGVAR(interact_menu,cameraPosASL) vectorAdd (EGVAR(interact_menu,cameraDir) vectorMultiply 50); + private _origin = EGVAR(interact_menu,cameraPosASL); + //private _origin = EGVAR(interact_menu,cameraPosASL) vectorAdd [0, 0, -0.35] vectorDiff (EGVAR(interact_menu,cameraDir) vectorMultiply 1.5); + //private _dest = AGLtoASL (_target modelToWorldVisual [0,0,0]); + private _results = lineIntersectsSurfaces [_origin, _dest, ACE_player, objNull, true, 5]; + private _finalPos = [0,0,0]; + { + _x params ["_pos", "", "_obj"]; + TRACE_3("",_forEachIndex,_obj,_target); + if (_obj isEqualTo _target) exitWith { + _finalPos = _target worldToModelVisual ASLtoAGL (_pos vectorAdd (EGVAR(interact_menu,cameraDir) vectorMultiply 1.0)); + }; + } forEach _results; + _finalPos +}; +[0,0,0] +*/ +/////////////////// +