diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 6fec7a1a20..1d951c3ceb 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -99,6 +99,7 @@ GVAR(OldZeusDisplayIsOpen) = !(isNull findDisplay 312); GVAR(OldCameraView) = cameraView; GVAR(OldPlayerVehicle) = vehicle ACE_player; GVAR(OldPlayerTurret) = [ACE_player] call FUNC(getTurretIndex); +GVAR(OldPlayerWeapon) = currentWeapon ACE_player; // PFH to raise varios events [{ @@ -159,6 +160,14 @@ GVAR(OldPlayerTurret) = [ACE_player] call FUNC(getTurretIndex); ["playerTurretChanged", [ACE_player, _newPlayerTurret]] call FUNC(localEvent); }; + // "playerWeaponChanged" event + _newPlayerWeapon = currentWeapon ACE_player; + if (_newPlayerWeapon != GVAR(OldPlayerWeapon)) then { + // Raise ACE event locally + GVAR(OldPlayerWeapon) = _newPlayerWeapon; + ["playerWeaponChanged", [ACE_player, _newPlayerWeapon]] call FUNC(localEvent); + }; + }, 0, []] call cba_fnc_addPerFrameHandler; [QGVAR(StateArrested),false,true,QUOTE(ADDON)] call FUNC(defineVariable); diff --git a/addons/dragging/CfgEventHandlers.hpp b/addons/dragging/CfgEventHandlers.hpp index a74afd1df7..6a6aa440f7 100644 --- a/addons/dragging/CfgEventHandlers.hpp +++ b/addons/dragging/CfgEventHandlers.hpp @@ -29,3 +29,19 @@ class Extended_Init_EventHandlers { }; }; }; + +class Extended_Killed_EventHandlers { + class CAManBase { + class ADDON { + killed = QUOTE(_this call DFUNC(handleKilled)); + }; + }; +}; + +class Extended_AnimChanged_EventHandlers { + class CAManBase { + class ADDON { + animChanged = QUOTE(_this call DFUNC(handleAnimChanged)); + }; + }; +}; diff --git a/addons/dragging/XEH_clientInit.sqf b/addons/dragging/XEH_clientInit.sqf index ba9d14af21..da9c6eefd6 100644 --- a/addons/dragging/XEH_clientInit.sqf +++ b/addons/dragging/XEH_clientInit.sqf @@ -15,15 +15,5 @@ if (isNil "ACE_maxWeightCarry") then { ["isNotCarrying", {!((_this select 0) getVariable [QGVAR(isCarrying), false])}] call EFUNC(common,addCanInteractWithCondition); // release object on player change. This does work when returning to lobby, but not when hard disconnecting. -["playerChanged", { - private ["_newPlayer", "_oldPlayer"]; - - _newPlayer = _this select 0; - _oldPlayer = _this select 1; - - { - if (_x getVariable [QGVAR(isDragging), false]) then { - [_x, _x getVariable [QGVAR(draggedObject), objNull]] call FUNC(dropObject); - }; - } forEach [_newPlayer, _oldPlayer]; -}] call EFUNC(common,addEventhandler); +["playerChanged", {_this call DFUNC(handlePlayerChanged)}] call EFUNC(common,addEventhandler); +["playerWeaponChanged", {_this call DFUNC(handlePlayerWeaponChanged)}] call EFUNC(common,addEventhandler); diff --git a/addons/dragging/XEH_preInit.sqf b/addons/dragging/XEH_preInit.sqf index 8ab3e36c4d..7a0be053ad 100644 --- a/addons/dragging/XEH_preInit.sqf +++ b/addons/dragging/XEH_preInit.sqf @@ -13,6 +13,10 @@ PREP(dragObjectPFH); PREP(dropObject); PREP(dropObject_carry); PREP(getWeight); +PREP(handleAnimChanged); +PREP(handleKilled); +PREP(handlePlayerChanged); +PREP(handlePlayerWeaponChanged); PREP(handleScrollWheel); PREP(initObject); PREP(isObjectOnObject); diff --git a/addons/dragging/functions/fnc_carryObjectPFH.sqf b/addons/dragging/functions/fnc_carryObjectPFH.sqf index 4f40d2b5d6..81b2369624 100644 --- a/addons/dragging/functions/fnc_carryObjectPFH.sqf +++ b/addons/dragging/functions/fnc_carryObjectPFH.sqf @@ -6,13 +6,8 @@ private ["_unit", "_target"]; _unit = _this select 0 select 0; _target = _this select 0 select 1; -if ( - !([_unit] call EFUNC(common,isAlive)) // drop if the player is dead - || {!([_target] call EFUNC(common,isAlive))} // drop if the crate is destroyed - || {currentWeapon _unit != ""} - || {stance _unit != "STAND"} // drop when crouching or inside a vehicle - || {!([_unit] call EFUNC(common,isPlayer))} -) then { +// drop if the crate is destroyed +if !([_target] call EFUNC(common,isAlive)) then { [_unit, _target] call FUNC(dropObject_carry); [_this select 1] call CBA_fnc_removePerFrameHandler; }; diff --git a/addons/dragging/functions/fnc_dragObjectPFH.sqf b/addons/dragging/functions/fnc_dragObjectPFH.sqf index 8a27be1584..e741b01f17 100644 --- a/addons/dragging/functions/fnc_dragObjectPFH.sqf +++ b/addons/dragging/functions/fnc_dragObjectPFH.sqf @@ -6,13 +6,8 @@ private ["_unit", "_target"]; _unit = _this select 0 select 0; _target = _this select 0 select 1; -if ( - !([_unit] call EFUNC(common,isAlive)) // drop if the player is dead - || {!([_target] call EFUNC(common,isAlive))} // drop if the crate is destroyed - || {!(animationState _unit in DRAG_ANIMATIONS)} // drop if not in dragging anim. This also exits when entering a vehicle. - || {currentWeapon _unit != primaryWeapon _unit} - || {!([_unit] call EFUNC(common,isPlayer))} -) then { +// drop if the crate is destroyed +if !([_target] call EFUNC(common,isAlive)) then { [_unit, _target] call FUNC(dropObject); [_this select 1] call CBA_fnc_removePerFrameHandler; }; diff --git a/addons/dragging/functions/fnc_handleAnimChanged.sqf b/addons/dragging/functions/fnc_handleAnimChanged.sqf new file mode 100644 index 0000000000..b5eb4d4d8f --- /dev/null +++ b/addons/dragging/functions/fnc_handleAnimChanged.sqf @@ -0,0 +1,31 @@ +// by commy2 +#include "script_component.hpp" + +private ["_unit", "_anim"]; + +_unit = _this select 0; +_anim = _this select 1; + +if (_unit getVariable [QGVAR(isDragging), false]) then { + + // drop dragged object when not in valid animation + if !(_anim in DRAG_ANIMATIONS) then { + private "_draggedObject"; + _draggedObject = _unit getVariable [QGVAR(draggedObject), objNull]; + + [_unit, _draggedObject] call FUNC(dropObject); + }; + +}; + +if (_unit getVariable [QGVAR(isCarrying), false]) then { + + // drop carried object when not standing + if (stance _unit != "STAND") then { + private "_carriedObject"; + _carriedObject = _unit getVariable [QGVAR(carriedObject), objNull]; + + [_unit, _carriedObject] call FUNC(dropObject_carry); + }; + +}; diff --git a/addons/dragging/functions/fnc_handleKilled.sqf b/addons/dragging/functions/fnc_handleKilled.sqf new file mode 100644 index 0000000000..4dcfc77fcd --- /dev/null +++ b/addons/dragging/functions/fnc_handleKilled.sqf @@ -0,0 +1,20 @@ +// by commy2 +#include "script_component.hpp" + +private "_unit"; + +_unit = _this select 0; + +if (_unit getVariable [QGVAR(isDragging), false]) then { + private "_draggedObject"; + _draggedObject = _unit getVariable [QGVAR(draggedObject), objNull]; + + [_unit, _draggedObject] call FUNC(dropObject); +}; + +if (_unit getVariable [QGVAR(isCarrying), false]) then { + private "_carriedObject"; + _carriedObject = _unit getVariable [QGVAR(carriedObject), objNull]; + + [_unit, _carriedObject] call FUNC(dropObject_carry); +}; diff --git a/addons/dragging/functions/fnc_handlePlayerChanged.sqf b/addons/dragging/functions/fnc_handlePlayerChanged.sqf new file mode 100644 index 0000000000..e2dd41021b --- /dev/null +++ b/addons/dragging/functions/fnc_handlePlayerChanged.sqf @@ -0,0 +1,17 @@ +// by commy2 +#include "script_component.hpp" + +private ["_newPlayer", "_oldPlayer"]; + +_newPlayer = _this select 0; +_oldPlayer = _this select 1; + +{ + if (_x getVariable [QGVAR(isDragging), false]) then { + [_x, _x getVariable [QGVAR(draggedObject), objNull]] call FUNC(dropObject); + }; + + if (_x getVariable [QGVAR(isCarrying), false]) then { + [_x, _x getVariable [QGVAR(carriedObject), objNull]] call FUNC(dropObject_carry); + }; +} forEach [_newPlayer, _oldPlayer]; diff --git a/addons/dragging/functions/fnc_handlePlayerWeaponChanged.sqf b/addons/dragging/functions/fnc_handlePlayerWeaponChanged.sqf new file mode 100644 index 0000000000..44160b54c1 --- /dev/null +++ b/addons/dragging/functions/fnc_handlePlayerWeaponChanged.sqf @@ -0,0 +1,31 @@ +// by commy2 +#include "script_component.hpp" + +private ["_unit", "_weapon"]; + +_unit = _this select 0; +_weapon = _this select 1; + +if (_unit getVariable [QGVAR(isDragging), false]) then { + + // drop dragged object when selecting a non-primary weapon + if (_weapon != primaryWeapon _unit) then { + private "_draggedObject"; + _draggedObject = _unit getVariable [QGVAR(draggedObject), objNull]; + + [_unit, _draggedObject] call FUNC(dropObject); + }; + +}; + +if (_unit getVariable [QGVAR(isCarrying), false]) then { + + // drop carried object when selecting any weapon + if (_weapon != "") then { + private "_carriedObject"; + _carriedObject = _unit getVariable [QGVAR(carriedObject), objNull]; + + [_unit, _carriedObject] call FUNC(dropObject_carry); + }; + +};