From 6d868d1bd1dac50b5c26ac899808d8cf827a51fe Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 17 Mar 2015 11:44:41 +0100 Subject: [PATCH] fix collisions when releasing, fix crate fliping in buildings --- addons/common/XEH_postInit.sqf | 1 + addons/common/XEH_preInit.sqf | 2 +- addons/common/functions/fnc_fixCollision.sqf | 21 +++++++ addons/common/functions/fnc_fixCollisions.sqf | 55 ------------------- addons/dragging/XEH_preInit.sqf | 1 + addons/dragging/functions/fnc_dropObject.sqf | 14 ++++- .../functions/fnc_isObjectOnObject.sqf | 6 ++ 7 files changed, 42 insertions(+), 58 deletions(-) create mode 100644 addons/common/functions/fnc_fixCollision.sqf delete mode 100644 addons/common/functions/fnc_fixCollisions.sqf create mode 100644 addons/dragging/functions/fnc_isObjectOnObject.sqf diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 1a26553ed7..f260b7b4ec 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -20,6 +20,7 @@ if (hasInterface) then { }; }] call FUNC(addEventhandler); +["fixCollision", FUNC(fixCollision)] call FUNC(addEventhandler); ["fixPosition", FUNC(fixPosition)] call FUNC(addEventhandler); // hack to get PFH to work in briefing diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index a70014c25d..e346c1e74d 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -55,7 +55,7 @@ PREP(execPersistentFnc); PREP(execRemoteFnc); PREP(executePersistent); PREP(filter); -PREP(fixCollisions); +PREP(fixCollision); PREP(fixLoweredRifleAnimation); PREP(fixPosition); PREP(getAllDefinedSetVariables); diff --git a/addons/common/functions/fnc_fixCollision.sqf b/addons/common/functions/fnc_fixCollision.sqf new file mode 100644 index 0000000000..6b43cec469 --- /dev/null +++ b/addons/common/functions/fnc_fixCollision.sqf @@ -0,0 +1,21 @@ +/* + * Author: commy2 + * Attempt to fix physx collisions causing unreasonable impact forces and damage. + * + * Arguments: + * 0: Object + * + * Return Value: + * Nothing + * + */ +#include "script_component.hpp" + +// allowDamage requires local object +if (!local _this) exitWith {}; + +// prevent collision damage, @todo allowDamage API +_this allowDamage false; + +// re-allow damage after 2 seconds +[{_this allowDamage true}, _this, 2, 0] call EFUNC(common,waitAndExecute); diff --git a/addons/common/functions/fnc_fixCollisions.sqf b/addons/common/functions/fnc_fixCollisions.sqf deleted file mode 100644 index 2f4078bb1f..0000000000 --- a/addons/common/functions/fnc_fixCollisions.sqf +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Author: commy2 - * Attempt to fix physx collisions causing unreasonable impact forces and damage. - * - * Arguments: - * 0: Object - * - * Return Value: - * Nothing - * - */ -#include "script_component.hpp" - -private "_object"; - -_object = _this select 0; - -if (!local _object) exitWith {}; - -// ignore collision damage -_object setVariable [QGVAR(fixCollisionsDamage), damage _object]; - -private ["_ehID", "_vectorDirAndUp"]; - -_ehID = _object addEventHandler ["HandleDamage", { - - if (isNull (_this select 3)) exitWith { - (_this select 0) getVariable [QGVAR(fixCollisionsDamage), 0]; - }; - (_this select 0) setVariable [QGVAR(fixCollisionsDamage), _this select 2]; - - _this select 2 - -}]; - -_vectorDirAndUp = [vectorDir _object, vectorUp _object]; - -[{ - private ["_object", "_ehID", "_vectorDirAndUp", "_timeOut"]; - - _object = _this select 0 select 0; - _ehID = _this select 0 select 1; - _vectorDirAndUp = _this select 0 select 2; - _timeOut = _this select 0 select 3; - - // adjust vector to prevent fliping - _object setVectorDirAndUp _vectorDirAndUp;systemChat str damage _object;// - - if (time > _timeOut) exitWith { - _object removeEventHandler ["HandleDamage", _ehID];hint str time;// - - [_this select 1] call CBA_fnc_removePerFrameHandler; - }; - -}, 0, [_object, _ehID, _vectorDirAndUp, time + 2]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/dragging/XEH_preInit.sqf b/addons/dragging/XEH_preInit.sqf index 4ed8925e48..46c3ebecb1 100644 --- a/addons/dragging/XEH_preInit.sqf +++ b/addons/dragging/XEH_preInit.sqf @@ -8,6 +8,7 @@ PREP(dragObject); PREP(dragObjectPFH); PREP(dropObject); PREP(initObject); +PREP(isObjectOnObject); PREP(setDraggable); PREP(startDrag); PREP(startDragPFH); diff --git a/addons/dragging/functions/fnc_dropObject.sqf b/addons/dragging/functions/fnc_dropObject.sqf index dc850c6f00..a8f56d6753 100644 --- a/addons/dragging/functions/fnc_dropObject.sqf +++ b/addons/dragging/functions/fnc_dropObject.sqf @@ -20,14 +20,24 @@ _target = _this select 1; // remove scroll wheel action _unit removeAction (_unit getVariable [QGVAR(ReleaseActionID), -1]); +private "_inBuilding"; +_inBuilding = [_unit] call FUNC(isObjectOnObject); + // play release animation _unit playAction "released"; -// release object -[_target] call EFUNC(common,fixCollisions);//"fixCollision" +// prevent collision damage +["fixCollision", _target, _target] call EFUNC(common,targetEvent); +// release object detach _target; +// prevent object from flipping inside buildings +if (_inBuilding) then { + _target setPosASL (getPosASL _target vectorAdd [0, 0, 0.05]); +}; + + _unit setVariable [QGVAR(isDragging), false, true]; _unit setVariable [QGVAR(draggedObject), objNull, true]; diff --git a/addons/dragging/functions/fnc_isObjectOnObject.sqf b/addons/dragging/functions/fnc_isObjectOnObject.sqf new file mode 100644 index 0000000000..0a8624820e --- /dev/null +++ b/addons/dragging/functions/fnc_isObjectOnObject.sqf @@ -0,0 +1,6 @@ +// by commy2 + +private "_object"; +_object = _this select 0; + +(getPosATL _object select 2) - (getPos _object select 2) > 1E-5