|
@@ -0,0 +1,97 @@
|
|
|
+params["_vehicle"];
|
|
|
+
|
|
|
+private _rate = 10;
|
|
|
+
|
|
|
+private _attached = _vehicle getVariable["RD501_mc_attached_large", objNull];
|
|
|
+_vehicle setVariable["RD501_mc_stop_refuel", false, true];
|
|
|
+
|
|
|
+_maxFuelSource = getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "fuelCapacity");
|
|
|
+_maxFuelTarget = getNumber (configFile >> "CfgVehicles" >> typeOf _attached >> "fuelCapacity");
|
|
|
+
|
|
|
+private _firstTick = 0;
|
|
|
+if (isMultiplayer) then
|
|
|
+{
|
|
|
+ _firstTick = serverTime;
|
|
|
+} else
|
|
|
+{
|
|
|
+ _firstTick = time;
|
|
|
+};
|
|
|
+
|
|
|
+hint "Refueling started";
|
|
|
+
|
|
|
+_vehicle setVariable["RD501_mc_lastRefuelTick", _firstTick, true];
|
|
|
+_vehicle setVariable["RD501_mc_nextRefuelUpdate", 0.1, true];
|
|
|
+
|
|
|
+[{
|
|
|
+ params ["_args", "_pfID"];
|
|
|
+ _args params ["_target", "_source", "_rate", "_maxFuelSource", "_maxFuelTarget"];
|
|
|
+
|
|
|
+ if (!alive _source || {!alive _sink}) then
|
|
|
+ {
|
|
|
+ _source setVariable["RD501_mc_lastRefuelTick", nil, true];
|
|
|
+ _source setVariable["RD501_mc_nextRefuelUpdate", nil, true];
|
|
|
+ _source setVariable["RD501_mc_lastTargetFuelAmount", nil, true];
|
|
|
+ [_pfID] call CBA_fnc_removePerFrameHandler;
|
|
|
+ };
|
|
|
+
|
|
|
+ if (_source getVariable["RD501_mc_stop_refuel", false]) then
|
|
|
+ {
|
|
|
+ hint "Refueling stopped";
|
|
|
+ _source setVariable["RD501_mc_lastRefuelTick", nil, true];
|
|
|
+ _source setVariable["RD501_mc_nextRefuelUpdate", nil, true];
|
|
|
+ _source setVariable["RD501_mc_lastTargetFuelAmount", nil, true];
|
|
|
+ [_pfID] call CBA_fnc_removePerFrameHandler;
|
|
|
+ };
|
|
|
+
|
|
|
+ private _currentTime = 0;
|
|
|
+ if (isMultiplayer) then
|
|
|
+ {
|
|
|
+ _currentTime = serverTime;
|
|
|
+ } else
|
|
|
+ {
|
|
|
+ _currentTime = time;
|
|
|
+ };
|
|
|
+
|
|
|
+ private _target_fuel = (fuel _target) * _maxFuelTarget;
|
|
|
+ private _source_fuel = (fuel _source) * _maxFuelSource;
|
|
|
+
|
|
|
+ // if last ticks have not been applied yet, act as if they have
|
|
|
+ private _last_target_fuel = (_source getVariable["RD501_mc_lastTargetFuelAmount", 0]) * _maxFuelTarget;
|
|
|
+ if (_last_target_fuel > _target_fuel) then
|
|
|
+ {
|
|
|
+ _target_fuel = _last_target_fuel;
|
|
|
+ };
|
|
|
+
|
|
|
+ private _deltaT = _currentTime - (_source getVariable["RD501_mc_lastRefuelTick", 0]);
|
|
|
+ private _transfer = _rate * _deltaT;
|
|
|
+
|
|
|
+ private _target_new_fuel = ((_target_fuel + _transfer) / _maxFuelTarget);
|
|
|
+ private _source_new_fuel = ((_source_fuel - _transfer) / _maxFuelSource);
|
|
|
+
|
|
|
+ private _last_update = _source getVariable["RD501_mc_nextRefuelUpdate", 0];
|
|
|
+
|
|
|
+ if (_target_new_fuel >= 1.0) then
|
|
|
+ {
|
|
|
+ _target_new_fuel = 1.0;
|
|
|
+ hint "Refueling complete";
|
|
|
+ _source setVariable["RD501_mc_lastRefuelTick", nil, true];
|
|
|
+ _source setVariable["RD501_mc_nextRefuelUpdate", nil, true];
|
|
|
+ _source setVariable["RD501_mc_lastTargetFuelAmount", nil, true];
|
|
|
+ [_pfID] call CBA_fnc_removePerFrameHandler;
|
|
|
+ } else
|
|
|
+ {
|
|
|
+ if (_target_new_fuel >= _last_update) then
|
|
|
+ {
|
|
|
+ _last_update = round(_target_new_fuel * 10) / 10;
|
|
|
+ hint format ["Refueling at %1 percent", str (_last_update*100)];
|
|
|
+ _source setVariable["RD501_mc_nextRefuelUpdate", _last_update+0.1, true];
|
|
|
+ };
|
|
|
+ };
|
|
|
+
|
|
|
+ ["RD501_mc_set_fuel", _target_new_fuel, _target] call CBA_fnc_targetEvent;
|
|
|
+ _source setVariable["RD501_mc_lastTargetFuelAmount", _target_new_fuel, true];
|
|
|
+
|
|
|
+ _source setFuel _source_new_fuel;
|
|
|
+ _source setVariable["RD501_mc_lastRefuelTick", _currentTime, true];
|
|
|
+
|
|
|
+}, 1, [_attached, _vehicle, _rate, _maxFuelSource, _maxFuelTarget]] call CBA_fnc_addPerFrameHandler;
|