Uniformize interaction distance for vehicle. Distance is now aprox 4m from the bounding box of the vehicle, consistent with interaction with people.

This commit is contained in:
esteldunedain 2016-02-18 20:20:02 -03:00
parent bf082e928d
commit ff04ca8981
5 changed files with 90 additions and 11 deletions

View File

@ -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

View File

@ -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;
};

View File

@ -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);
@ -360,8 +362,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);
@ -387,7 +390,7 @@ class CfgVehicles {
class ACE_MainActions {
displayName = CSTRING(MainAction);
selection = "";
distance = 10;
distance = 4;
condition = "true";
class ACE_Passengers {
displayName = CSTRING(Passengers);
@ -413,8 +416,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 {
@ -449,7 +453,7 @@ class CfgVehicles {
class ACE_MainActions {
displayName = CSTRING(MainAction);
selection = "gunnerview";
distance = 2;
distance = 4;
condition = "true";
class ACE_Passengers {
displayName = CSTRING(Passengers);

View File

@ -5,6 +5,7 @@ ADDON = false;
// interaction menu
PREP(addPassengerActions);
PREP(addPassengersActions);
PREP(getVehiclePos);
PREP(getWeaponPos);
PREP(moduleInteraction);
PREP(removeTag);

View File

@ -0,0 +1,75 @@
/*
* 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 <ARRAY>
*
* Example:
* call ace_interaction_fnc_getWeaponPos
*
* Public: No
*/
#include "script_component.hpp"
// IGNORE_PRIVATE_WARNING(_target);
private _bb = boundingBoxReal _target;
_bb params ["_p1",""];
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 (_p1 select 0)) - 1);
private _ndy = (abs _dy) / ((abs (_p1 select 1)) - 1);
private _ndz = (abs _dz) / ((abs (_p1 select 2)) - 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);
};
};
TRACE_3("",_bb,_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]
*/
///////////////////