diff --git a/addons/hitreactions/XEH_PREP.hpp b/addons/hitreactions/XEH_PREP.hpp index 7701b8ef19..53f2d60eb6 100644 --- a/addons/hitreactions/XEH_PREP.hpp +++ b/addons/hitreactions/XEH_PREP.hpp @@ -1,3 +1,4 @@ PREP(fallDown); PREP(getRandomAnimation); +PREP(throwWeapon); diff --git a/addons/hitreactions/functions/fnc_throwWeapon.sqf b/addons/hitreactions/functions/fnc_throwWeapon.sqf new file mode 100644 index 0000000000..bc2936e101 --- /dev/null +++ b/addons/hitreactions/functions/fnc_throwWeapon.sqf @@ -0,0 +1,49 @@ +#include "script_component.hpp" +/* + * Author: commy2 + * Makes the unit throw their currently selected weapon. + * Unit must be local and not inside a vehicle or attached to another object. + * + * Arguments: + * 0: Unit + * + * Return Value: + * Weapon Holder + * + * Example: + * player call ace_hitreactions_fnc_throwWeapon + * + * Public: No + */ + +#define OFFSET_LATERAL 0.59 +#define THROW_ANGLE 63.43 +#define THROW_VELOCITY 1.5 +#define THROW_TORQUE 0.2 + +params ["_unit"]; + +private _weapon = currentWeapon _unit; +if (!isNull objectParent _unit || _weapon isEqualTo "") exitWith {objNull}; + +private _data = weaponsItems _unit select {_x select 0 == _weapon} select 0; + +private _holder = createVehicle ["WeaponHolderSimulated", [0, 0, 0], [], 0, "CAN_COLLIDE"]; +_holder addWeaponWithAttachmentsCargoGlobal [_data, 1]; + +private _vDir = _unit weaponDirection _weapon; +private _vLat = vectorNormalized (_vDir vectorCrossProduct [0, 0, 1]); +private _vUp = _vLat vectorCrossProduct _vDir; + +private _position = _unit modelToWorldWorld (_unit selectionPosition "RightHand") vectorAdd (_vLat vectorMultiply OFFSET_LATERAL); +private _velocity = vectorNormalized (_vDir vectorAdd (_vUp vectorMultiply tan THROW_ANGLE)) vectorMultiply THROW_VELOCITY vectorAdd velocity _unit; + +_unit removeWeapon _weapon; +_holder setPosWorld _position; +_holder setVectorDirAndUp [_vUp, _vLat]; +_holder setVelocity _velocity; +_holder addTorque (call CBA_fnc_randomVector3D vectorMultiply THROW_TORQUE); + +["ACE_weaponThrown", [_unit, _holder, _data]] call CBA_fnc_localEvent; + +_holder // return