Fix Advanced Throwing floating IR grenades and block vanilla throwing (#4365)

* Fix #4362 - floating primed IR grenades

* Fix #4363 - block vanilla throwing while prepared

* Respect last thrown time with vanilla throwing and dropping primed throwable,
This commit is contained in:
jonpas 2016-09-09 11:00:30 +02:00 committed by Glowbal
parent ebdc883855
commit 062f6deec8
6 changed files with 30 additions and 8 deletions

View File

@ -83,6 +83,13 @@ GVAR(ammoMagLookup) = call CBA_fnc_createNamespace;
// Fired XEH
[QGVAR(throwFiredXEH), FUNC(throwFiredXEH)] call CBA_fnc_addEventHandler;
// Set last thrown time on Vanilla Throwing and Advanced Throwing
["ace_firedPlayer", {
if (_weapon == "Throw") then {
_unit setVariable [QGVAR(lastThrownTime), CBA_missionTime];
};
}] call CBA_fnc_addEventHandler;
// Display handlers
["KeyDown", {_this call FUNC(onKeyDown)}] call CBA_fnc_addDisplayHandler;

View File

@ -4,7 +4,7 @@
*
* Arguments:
* 0: Unit <OBJECT>
* 1: Pick Up <BOOL> (default: false)
* 1: Ignore Last Thrown Time <BOOL> (default: false)
*
* Return Value:
* Can Prepare <BOOL>
@ -16,10 +16,10 @@
*/
#include "script_component.hpp"
params ["_unit", ["_pickUp", false]];
params ["_unit", ["_ignoreLastThrownTime", false]];
// Don't delay when picking up
if (_pickUp) then {
if (_ignoreLastThrownTime) then {
_unit setVariable [QGVAR(lastThrownTime), -1];
};

View File

@ -15,7 +15,7 @@
*/
#include "script_component.hpp"
if (dialog || {!(ACE_player getVariable [QGVAR(inHand), false])} || {!([ACE_player] call FUNC(canPrepare))}) exitWith {
if (dialog || {!(ACE_player getVariable [QGVAR(inHand), false])} || {!([ACE_player, true] call FUNC(canPrepare))}) exitWith {
[ACE_player, "In dialog or no throwable in hand or cannot prepare throwable"] call FUNC(exitThrowMode);
};
@ -71,16 +71,25 @@ private _throwableType = getText (configFile >> "CfgMagazines" >> _throwableMag
if (!([ACE_player] call FUNC(canThrow)) && {!_primed}) exitWith {
if (!isNull _activeThrowable) then {
deleteVehicle _activeThrowable;
// Restore muzzle ammo to original
ACE_player setAmmo (ACE_player getVariable [QGVAR(activeMuzzle), ["", 0]]);
};
};
if (isNull _activeThrowable || {(_throwableType != typeOf _activeThrowable) && {!_primed}}) then {
if (!isNull _activeThrowable) then {
deleteVehicle _activeThrowable;
// Restore muzzle ammo to original
ACE_player setAmmo (ACE_player getVariable [QGVAR(activeMuzzle), ["", 0]]);
};
_activeThrowable = _throwableType createVehicleLocal [0, 0, 0];
_activeThrowable enableSimulation false;
ACE_player setVariable [QGVAR(activeThrowable), _activeThrowable];
// Set muzzle ammo to 0 to block vanilla throwing, save to variable for later restoration
private _muzzle = _throwableType call FUNC(getMuzzle);
ACE_player setVariable [QGVAR(activeMuzzle), [_muzzle, ACE_player ammo _muzzle]];
ACE_player setAmmo [_muzzle, 0];
};
// Exit in case of explosion in hand

View File

@ -25,13 +25,21 @@ if !(_unit getVariable [QGVAR(inHand), false]) exitWith {};
systemChat format ["Exit Throw Mode: %1", _reason];
#endif
private _activeThrowable = _unit getVariable [QGVAR(activeThrowable), objNull];
if !(_unit getVariable [QGVAR(primed), false]) then {
deleteVehicle (_unit getVariable [QGVAR(activeThrowable), objNull]);
deleteVehicle _activeThrowable;
// Set muzzle ammo to original
_unit setAmmo (_unit getVariable [QGVAR(activeMuzzle), ["", 0]]);
} else {
_unit setVariable [QGVAR(lastThrownTime), CBA_missionTime];
// Fix floating for throwables without proper physics (eg. IR Grenade)
_activeThrowable setVelocity [0, 0, -0.1];
};
_unit setVariable [QGVAR(inHand), false];
_unit setVariable [QGVAR(primed), false];
_unit setVariable [QGVAR(activeThrowable), objNull];
_unit setVariable [QGVAR(activeMuzzle), ["", 0]];
_unit setVariable [QGVAR(throwType), THROW_TYPE_DEFAULT];
_unit setVariable [QGVAR(throwSpeed), THROW_SPEED_DEFAULT];
_unit setVariable [QGVAR(dropMode), false];

View File

@ -26,7 +26,7 @@ private _throwableMag = (currentThrowable _unit) select 0;
_unit removeItem _throwableMag;
private _throwableType = getText (configFile >> "CfgMagazines" >> _throwableMag >> "ammo");
private _muzzle = _throwableMag call FUNC(getMuzzle);
private _muzzle = (_unit getVariable [QGVAR(activeMuzzle), ["", 0]]) select 0;
// Create actual throwable globally
private _activeThrowableOld = _unit getVariable [QGVAR(activeThrowable), objNull];

View File

@ -54,8 +54,6 @@ if (!(_unit getVariable [QGVAR(primed), false])) then {
_activeThrowable setVelocity _newVelocity;
};
_unit setVariable [QGVAR(lastThrownTime), CBA_missionTime];
// Invoke listenable event
["ace_throwableThrown", [_unit, _activeThrowable]] call CBA_fnc_localEvent;
}, [