From 541349efef13b5b6858cd29cbe736f8c3019fe22 Mon Sep 17 00:00:00 2001 From: jonpas <jonpas@users.noreply.github.com> Date: Sun, 24 Jul 2016 20:11:35 +0200 Subject: [PATCH] Fix refuel not respecting time acceleration and pause (#4140) * Fix refuel not respecting time acceleration and pause * Make lastTickMissionTime local --- addons/refuel/functions/fnc_refuel.sqf | 31 ++++++++++++++----------- addons/refuel/functions/fnc_turnOff.sqf | 1 + addons/refuel/functions/fnc_turnOn.sqf | 1 + 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/addons/refuel/functions/fnc_refuel.sqf b/addons/refuel/functions/fnc_refuel.sqf index 2f7131bd9f..ae17ce8d02 100644 --- a/addons/refuel/functions/fnc_refuel.sqf +++ b/addons/refuel/functions/fnc_refuel.sqf @@ -16,11 +16,9 @@ #include "script_component.hpp" -#define PFH_STEPSIZE 1 - params [["_unit", objNull, [objNull]], ["_target", objNull, [objNull]], ["_nozzle", objNull, [objNull]], ["_connectToPoint", [0,0,0], [[]], 3]]; -private _rate = getNumber (configFile >> "CfgVehicles" >> (typeOf _target) >> QGVAR(flowRate)) * GVAR(rate) * PFH_STEPSIZE; +private _rate = getNumber (configFile >> "CfgVehicles" >> (typeOf _target) >> QGVAR(flowRate)) * GVAR(rate); private _maxFuel = getNumber (configFile >> "CfgVehicles" >> (typeOf _target) >> QGVAR(fuelCapacity)); [{ @@ -36,7 +34,7 @@ private _maxFuel = getNumber (configFile >> "CfgVehicles" >> (typeOf _target) >> _nozzle setVariable [QGVAR(isConnected), false, true]; _nozzle setVariable [QGVAR(sink), objNull, true]; _sink setVariable [QGVAR(nozzle), objNull, true]; - [_pfID] call cba_fnc_removePerFrameHandler; + [_pfID] call CBA_fnc_removePerFrameHandler; }; private _tooFar = ((_sink modelToWorld _connectToPoint) distance (_source modelToWorld _connectFromPoint)) > (REFUEL_HOSE_LENGTH - 2); if (_tooFar && {!(_nozzle getVariable [QGVAR(jerryCan), false])}) exitWith { @@ -46,24 +44,31 @@ private _maxFuel = getNumber (configFile >> "CfgVehicles" >> (typeOf _target) >> _nozzle setVariable [QGVAR(isConnected), false, true]; _nozzle setVariable [QGVAR(sink), objNull, true]; _sink setVariable [QGVAR(nozzle), objNull, true]; - [_pfID] call cba_fnc_removePerFrameHandler; + [_pfID] call CBA_fnc_removePerFrameHandler; }; private _finished = false; private _fueling = _nozzle getVariable [QGVAR(isRefueling), false]; if (_fueling) then { if (isEngineOn _sink) exitWith { + _nozzle setVariable [QGVAR(lastTickMissionTime), nil]; _nozzle setVariable [QGVAR(isRefueling), false, true]; }; private _fuelInSource = [_source] call FUNC(getFuel); if (_fuelInSource == 0) exitWith { [LSTRING(Hint_SourceEmpty), 2, _unit] call EFUNC(common,displayTextStructured); + _nozzle setVariable [QGVAR(lastTickMissionTime), nil]; _nozzle setVariable [QGVAR(isRefueling), false, true]; }; + + // Calculate rate using mission time to take time acceleration and pause into account + private _rateTime = _rate * (CBA_missionTime - (_nozzle getVariable [QGVAR(lastTickMissionTime), CBA_missionTime])); + _nozzle setVariable [QGVAR(lastTickMissionTime), CBA_missionTime]; + if !(_fuelInSource == REFUEL_INFINITE_FUEL) then { - _fuelInSource = _fuelInSource - _rate; + _fuelInSource = _fuelInSource - _rateTime; } else { - _source setVariable [QGVAR(fuelCounter), (_source getVariable [QGVAR(fuelCounter), 0]) + _rate, true]; + _source setVariable [QGVAR(fuelCounter), (_source getVariable [QGVAR(fuelCounter), 0]) + _rateTime, true]; }; if (_fuelInSource < 0 && {_fuelInSource > REFUEL_INFINITE_FUEL}) then { _fuelInSource = 0; @@ -71,7 +76,7 @@ private _maxFuel = getNumber (configFile >> "CfgVehicles" >> (typeOf _target) >> [LSTRING(Hint_SourceEmpty), 2, _unit] call EFUNC(common,displayTextStructured); }; - private _fuelInSink = (_unit getVariable [QGVAR(tempFuel), _startFuel]) + ( _rate / _maxFuel); + private _fuelInSink = (_unit getVariable [QGVAR(tempFuel), _startFuel]) + ( _rateTime / _maxFuel); if (_fuelInSink > 1) then { _fuelInSink = 1; _finished = true; @@ -86,11 +91,11 @@ private _maxFuel = getNumber (configFile >> "CfgVehicles" >> (typeOf _target) >> }; if (_finished) exitWith { + _nozzle setVariable [QGVAR(lastTickMissionTime), nil]; _nozzle setVariable [QGVAR(isRefueling), false, true]; }; -}, -PFH_STEPSIZE, -[_nozzle getVariable QGVAR(source), +}, 1, [ + _nozzle getVariable QGVAR(source), _target, _unit, _nozzle, @@ -98,5 +103,5 @@ PFH_STEPSIZE, fuel _target, _maxFuel, _nozzle getVariable [QGVAR(attachPos), [0,0,0]], - _connectToPoint] -] call cba_fnc_addPerFrameHandler; + _connectToPoint +]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/refuel/functions/fnc_turnOff.sqf b/addons/refuel/functions/fnc_turnOff.sqf index 4b82e19486..7ce3d9c874 100644 --- a/addons/refuel/functions/fnc_turnOff.sqf +++ b/addons/refuel/functions/fnc_turnOff.sqf @@ -24,6 +24,7 @@ params [["_unit", objNull, [objNull]], ["_nozzle", objNull, [objNull]]]; { params ["_args"]; _args params [["_unit", objNull, [objNull]], ["_nozzle", objNull, [objNull]]]; + _nozzle setVariable [QGVAR(lastTickMissionTime), nil]; _nozzle setVariable [QGVAR(isRefueling), false, true]; [LSTRING(Hint_Stopped), 1.5, _unit] call EFUNC(common,displayTextStructured); }, diff --git a/addons/refuel/functions/fnc_turnOn.sqf b/addons/refuel/functions/fnc_turnOn.sqf index b18d1b57ca..7a69de9b6f 100644 --- a/addons/refuel/functions/fnc_turnOn.sqf +++ b/addons/refuel/functions/fnc_turnOn.sqf @@ -24,6 +24,7 @@ params [["_unit", objNull, [objNull]], ["_nozzle", objNull, [objNull]]]; { params ["_args"]; _args params [["_unit", objNull, [objNull]], ["_nozzle", objNull, [objNull]]]; + _nozzle setVariable [QGVAR(lastTickMissionTime), CBA_missionTime]; _nozzle setVariable [QGVAR(isRefueling), true, true]; [LSTRING(Hint_Started), 1.5, _unit] call EFUNC(common,displayTextStructured); },