Files
KPLibSumava/kp_liberation.brf_sumava/scripts/server/resources/manage_logistics.sqf
Samuele Lorefice 9e023649ac initial files
2025-05-24 16:17:33 +02:00

465 lines
29 KiB
Plaintext

waitUntil {!isNil "save_is_loaded"};
waitUntil {!isNil "KP_liberation_logistics"};
waitUntil {save_is_loaded};
["Logistic management started", "LOGISTIC"] call KPLIB_fnc_log;
KP_liberation_convoy_ambush_inProgress = false;
KP_liberation_convoy_ambush_check = 0;
private _start = 0;
while {GRLIB_endgame == 0} do {
if (((count (allPlayers - entities "HeadlessClient_F")) > 0) && ((count KP_liberation_logistics) > 0)) then {
_start = diag_tickTime;
if (KP_liberation_logistic_debug > 0) then {[format ["Logistic interval started: %1", diag_tickTime], "LOGISTIC"] call KPLIB_fnc_log;};
private _tempLogistics = +KP_liberation_logistics;
{
private _locPos = -1;
private _locRes = -1;
switch (_x select 7) do {
case 0: {};
case 1;
case 3: {
if ((_x select 8) > 1) then {
switch (_x select 7) do {case 1: {_locPos = 2; _locRes = 4;}; case 3: {_locPos = 3; _locRes = 5;};};
switch (_x select 9) do {case 2: {_x set [9,0];}; case 3: {_x set [9,1];};};
private _storage_areas = nearestObjects [(_x select _locPos), [KP_liberation_small_storage_building, KP_liberation_large_storage_building], 150];
if (((_x select 9) == 0) && !((_x select 6) isEqualTo [0,0,0])) then {
if ((count (_storage_areas)) == 0) exitWith {_x set [9,2];};
private _toProcess = ceil ((ceil (((_x select 6) select 0) / 100)) + (ceil (((_x select 6) select 1) / 100)) + (ceil (((_x select 6) select 2) / 100)));
if (_toProcess > 3) then {_toProcess = 3;};
private _spaceSum = 0;
{
if (typeOf _x == KP_liberation_large_storage_building) then {
_spaceSum = _spaceSum + (count KP_liberation_large_storage_positions) - (count (attachedObjects _x));
};
if (typeOf _x == KP_liberation_small_storage_building) then {
_spaceSum = _spaceSum + (count KP_liberation_small_storage_positions) - (count (attachedObjects _x));
};
} forEach _storage_areas;
if (_spaceSum < _toProcess) exitWith {_x set [9,2];};
_x set [8,((_x select 8) - 1)];
private _currentIndex = _forEachIndex;
private _processed = 0;
while {_processed < _toProcess} do {
{
private _space = 0;
if (typeOf _x == KP_liberation_large_storage_building) then {
_space = (count KP_liberation_large_storage_positions) - (count (attachedObjects _x));
};
if (typeOf _x == KP_liberation_small_storage_building) then {
_space = (count KP_liberation_small_storage_positions) - (count (attachedObjects _x));
};
if ((_space > 0) && ((((_tempLogistics select _currentIndex) select 6) select 0) > 0)) then {
private _amount = 100;
if (((((_tempLogistics select _currentIndex) select 6) select 0) / 100) < 1) then {
_amount = ((_tempLogistics select _currentIndex) select 6) select 0;
};
(_tempLogistics select _currentIndex) set [6,
[(((_tempLogistics select _currentIndex) select 6) select 0) - _amount,
(((_tempLogistics select _currentIndex) select 6) select 1),
(((_tempLogistics select _currentIndex) select 6) select 2)]
];
private _crate = [KP_liberation_supply_crate, _amount, getPos _x] call KPLIB_fnc_createCrate;
[_crate, _x] call KPLIB_fnc_crateToStorage;
_processed = _processed + 1;
_space = _space - 1;
};
if (_processed >= _toProcess) exitWith {};
if ((_space > 0) && ((((_tempLogistics select _currentIndex) select 6) select 1) > 0)) then {
private _amount = 100;
if (((((_tempLogistics select _currentIndex) select 6) select 1) / 100) < 1) then {
_amount = ((_tempLogistics select _currentIndex) select 6) select 1;
};
(_tempLogistics select _currentIndex) set [6,
[(((_tempLogistics select _currentIndex) select 6) select 0),
(((_tempLogistics select _currentIndex) select 6) select 1) - _amount,
(((_tempLogistics select _currentIndex) select 6) select 2)]
];
private _crate = [KP_liberation_ammo_crate, _amount, getPos _x] call KPLIB_fnc_createCrate;
[_crate, _x] call KPLIB_fnc_crateToStorage;
_processed = _processed + 1;
_space = _space - 1;
};
if (_processed >= _toProcess) exitWith {};
if ((_space > 0) && ((((_tempLogistics select _currentIndex) select 6) select 2) > 0)) then {
private _amount = 100;
if (((((_tempLogistics select _currentIndex) select 6) select 2) / 100) < 1) then {
_amount = ((_tempLogistics select _currentIndex) select 6) select 2;
};
(_tempLogistics select _currentIndex) set [6,
[(((_tempLogistics select _currentIndex) select 6) select 0),
(((_tempLogistics select _currentIndex) select 6) select 1),
(((_tempLogistics select _currentIndex) select 6) select 2) - _amount]
];
private _crate = [KP_liberation_fuel_crate, _amount, getPos _x] call KPLIB_fnc_createCrate;
[_crate, _x] call KPLIB_fnc_crateToStorage;
_processed = _processed + 1;
_space = _space - 1;
};
if (_processed >= _toProcess) exitWith {};
} forEach _storage_areas;
};
please_recalculate = true;
if (KP_liberation_logistic_debug > 0) then {[format ["Logistic Group Update: %1", _x], "LOGISTIC"] call KPLIB_fnc_log;};
} else {
_x set [9,1];
};
if (((_x select 9) == 1) && !((_x select _locRes) isEqualTo [0,0,0])) then {
if ((count (_storage_areas)) == 0) exitWith {_x set [9,3];};
private _supplyValue = 0;
private _ammoValue = 0;
private _fuelValue = 0;
{
{
switch ((typeOf _x)) do {
case KP_liberation_supply_crate: {_supplyValue = _supplyValue + (_x getVariable ["KP_liberation_crate_value",0]);};
case KP_liberation_ammo_crate: {_ammoValue = _ammoValue + (_x getVariable ["KP_liberation_crate_value",0]);};
case KP_liberation_fuel_crate: {_fuelValue = _fuelValue + (_x getVariable ["KP_liberation_crate_value",0]);};
default {[format ["Invalid object (%1) at storage area", (typeOf _x)], "ERROR"] call KPLIB_fnc_log;};
};
} forEach (attachedObjects _x);
} forEach _storage_areas;
private _toProcess = ceil ((ceil (((_x select _locRes) select 0) / 100)) + (ceil (((_x select _locRes) select 1) / 100)) + (ceil (((_x select _locRes) select 2) / 100)));
if (_toProcess > 3) then {_toProcess = 3;};
private _maxGetSupply = ((_x select _locRes) select 0);
if (_maxGetSupply > 300) then {_maxGetSupply = 300;};
private _maxGetAmmo = ((_x select _locRes) select 1);
if (_maxGetAmmo > 300) then {_maxGetAmmo = 300;};
private _maxGetFuel = ((_x select _locRes) select 2);
if (_maxGetFuel > 300) then {_maxGetFuel = 300;};
private _getSupply = 0;
private _getAmmo = 0;
private _getFuel = 0;
private _i = 0;
private _j = 0;
while {(_i < _toProcess) && (_j < _toProcess)} do {
if ((_maxGetSupply - _getSupply) > 0) then {
if ((floor ((_maxGetSupply - _getSupply) / 100)) > 0) then {
if ((_supplyValue - _getSupply) >= 100) then {
_getSupply = _getSupply + 100;
_i = _i + 1;
};
} else {
if ((_maxGetSupply - _getSupply) <= (_supplyValue - _getSupply)) then {
_getSupply = _maxGetSupply;
_i = _i + 1;
};
};
};
if (((_maxGetAmmo - _getAmmo) > 0) && (_i < _toProcess)) then {
if ((floor ((_maxGetAmmo - _getAmmo) / 100)) > 0) then {
if ((_ammoValue - _getAmmo) >= 100) then {
_getAmmo = _getAmmo + 100;
_i = _i + 1;
};
} else {
if ((_maxGetAmmo - _getAmmo) <= (_ammoValue - _getAmmo)) then {
_getAmmo = _maxGetAmmo;
_i = _i + 1;
};
};
};
if (((_maxGetFuel - _getFuel) > 0) && (_i < _toProcess)) then {
if ((floor ((_maxGetFuel - _getFuel) / 100)) > 0) then {
if ((_fuelValue - _getFuel) >= 100) then {
_getFuel = _getFuel + 100;
_i = _i + 1;
};
} else {
if ((_maxGetFuel - _getFuel) <= (_fuelValue - _getFuel)) then {
_getFuel = _maxGetFuel;
_i = _i + 1;
};
};
};
_j = _j + 1;
};
if ((_j == _toProcess) && (_i != _toProcess)) exitWith {_x set [9,3];};
_x set [_locRes,[((_x select _locRes) select 0) - _getSupply,((_x select _locRes) select 1) - _getAmmo,((_x select _locRes) select 2) - _getFuel]];
_x set [6,[((_x select 6) select 0) + _getSupply,((_x select 6) select 1) + _getAmmo,((_x select 6) select 2) + _getFuel]];
_x set [8,((_x select 8) - 1)];
{
private _storage_positions = [];
private _storedCrates = (attachedObjects _x);
reverse _storedCrates;
{
private _crateValue = _x getVariable ["KP_liberation_crate_value",0];
switch ((typeOf _x)) do {
case KP_liberation_supply_crate: {
if (_getSupply > 0) then {
if (_crateValue > _getSupply) then {
_crateValue = _crateValue - _getSupply;
_x setVariable ["KP_liberation_crate_value", _crateValue, true];
_getSupply = 0;
} else {
detach _x;
deleteVehicle _x;
_getSupply = _getSupply - _crateValue;
};
};
};
case KP_liberation_ammo_crate: {
if (_getAmmo > 0) then {
if (_crateValue > _getAmmo) then {
_crateValue = _crateValue - _getAmmo;
_x setVariable ["KP_liberation_crate_value", _crateValue, true];
_getAmmo = 0;
} else {
detach _x;
deleteVehicle _x;
_getAmmo = _getAmmo - _crateValue;
};
};
};
case KP_liberation_fuel_crate: {
if (_getFuel > 0) then {
if (_crateValue > _getFuel) then {
_crateValue = _crateValue - _getFuel;
_x setVariable ["KP_liberation_crate_value", _crateValue, true];
_getFuel = 0;
} else {
detach _x;
deleteVehicle _x;
_getFuel = _getFuel - _crateValue;
};
};
};
default {[format ["Invalid object (%1) at storage area", (typeOf _x)], "ERROR"] call KPLIB_fnc_log;};
};
} forEach _storedCrates;
([_x] call KPLIB_fnc_getStoragePositions) params ["_storage_positions"];
private _area = _x;
_i = 0;
{
_height = [typeOf _x] call KPLIB_fnc_getCrateHeight;
detach _x;
_x attachTo [_area, [(_storage_positions select _i) select 0, (_storage_positions select _i) select 1, _height]];
_i = _i + 1;
} forEach attachedObjects (_x);
if ((_getSupply == 0) && (_getAmmo == 0) && (_getFuel == 0)) exitWith {};
} forEach _storage_areas;
if (KP_liberation_logistic_debug > 0) then {[format ["Logistic Group Update: %1", _x], "LOGISTIC"] call KPLIB_fnc_log;};
};
} else {
private _nextState = 0;
private _time = -1;
if (((_x select 4) isEqualTo [0,0,0]) && ((_x select 5) isEqualTo [0,0,0]) && ((_x select 6) isEqualTo [0,0,0])) then {
_x set [2, [0,0,0]];
_x set [3, [0,0,0]];
} else {
_nextState = switch (_x select 7) do {case 1: {2}; case 3: {4};};
_time = ceil (((_x select 2) distance2D (_x select 3)) / 400);
};
_x set [7,_nextState];
_x set [8,_time];
_x set [9,0];
if (KP_liberation_logistic_debug > 0) then {[format ["Logistic Group Update: %1", _x], "LOGISTIC"] call KPLIB_fnc_log;};
};
};
case 2;
case 4: {
if ((_x select 8) > 1) then {
if (((_x select 8) <= ((ceil (((_x select 2) distance2D (_x select 3)) / 400)) - 3)) && ((_x select 8) >= 3) && !((_x select 6) isEqualTo [0,0,0]) && !KP_liberation_convoy_ambush_inProgress && (KP_liberation_civ_rep <= -25) && (((_x select 8) % 2) == 0)) then {
private _dice = round (random 100);
private _chance = KP_liberation_convoy_ambush_chance;
if (chance > 0) then {
_chance = _chance + ([] call KPLIB_fnc_crGetMulti);
};
if (KP_liberation_asymmetric_debug > 0) then {[format ["Logistic convoy %1: ambush possible - current ETA: %2 - Dice: %3 - Chance: %4", (_x select 0), (_x select 8), _dice, _chance], "ASYMMETRIC"] call KPLIB_fnc_log;};
if (_dice <= _chance) then {
private _convoy = +_x;
sleep 0.1;
[_convoy] spawn logistic_convoy_ambush;
waitUntil {sleep 0.1; KP_liberation_convoy_ambush_check != 0};
if (KP_liberation_convoy_ambush_check == 2) then {
_x set [1,0];
_x set [2,[0,0,0]];
_x set [3,[0,0,0]];
_x set [4,[0,0,0]];
_x set [5,[0,0,0]];
_x set [6,[0,0,0]];
_x set [7,0];
_x set [8,-1];
} else {
_x set [8,((_x select 8) - 1)];
KP_liberation_convoy_ambush_check = 0;
};
} else {
_x set [8,((_x select 8) - 1)];
};
} else {
_x set [8,((_x select 8) - 1)];
};
if (KP_liberation_logistic_debug > 0) then {[format ["Logistic Group Update: %1", _x], "LOGISTIC"] call KPLIB_fnc_log;};
} else {
private _nextState = -1;
private _time = 0;
switch (_x select 7) do {
case 2: {
_nextState = 3;
_time = ceil (((ceil (((_x select 5) select 0) / 100)) + (ceil (((_x select 5) select 1) / 100)) + (ceil (((_x select 5) select 2) / 100))) / 3);
};
case 4: {
_nextState = 1;
_time = ceil (((ceil (((_x select 4) select 0) / 100)) + (ceil (((_x select 4) select 1) / 100)) + (ceil (((_x select 4) select 2) / 100))) / 3);
};
};
if (_time > (_x select 1)) then {_time = (_x select 1);};
_time = _time + (ceil (((ceil (((_x select 6) select 0) / 100)) + (ceil (((_x select 6) select 1) / 100)) + (ceil (((_x select 6) select 2) / 100))) / 3));
_time = _time + 1;
_x set [7,_nextState];
_x set [8,_time];
if (KP_liberation_logistic_debug > 0) then {[format ["Logistic Group Update: %1", _x], "LOGISTIC"] call KPLIB_fnc_log;};
};
};
case 5;
case 6: {
if ((_x select 8) > 1) then {
_locPos = switch (_x select 7) do {case 5: {2}; case 6: {3};};
_x set [9,0];
private _storage_areas = nearestObjects [(_x select _locPos), [KP_liberation_small_storage_building, KP_liberation_large_storage_building], 150];
if ((count (_storage_areas)) == 0) exitWith {_x set [9,2];};
private _toProcess = ceil ((ceil (((_x select 6) select 0) / 100)) + (ceil (((_x select 6) select 1) / 100)) + (ceil (((_x select 6) select 2) / 100)));
if (_toProcess > 3) then {_toProcess = 3;};
private _spaceSum = 0;
{
if (typeOf _x == KP_liberation_large_storage_building) then {
_spaceSum = _spaceSum + (count KP_liberation_large_storage_positions) - (count (attachedObjects _x));
};
if (typeOf _x == KP_liberation_small_storage_building) then {
_spaceSum = _spaceSum + (count KP_liberation_small_storage_positions) - (count (attachedObjects _x));
};
} forEach _storage_areas;
if (_spaceSum < _toProcess) exitWith {_x set [9,2];};
_x set [8,((_x select 8) - 1)];
private _currentIndex = _forEachIndex;
private _processed = 0;
while {_processed < _toProcess} do {
{
private _space = 0;
if (typeOf _x == KP_liberation_large_storage_building) then {
_space = (count KP_liberation_large_storage_positions) - (count (attachedObjects _x));
};
if (typeOf _x == KP_liberation_small_storage_building) then {
_space = (count KP_liberation_small_storage_positions) - (count (attachedObjects _x));
};
if ((_space > 0) && ((((_tempLogistics select _currentIndex) select 6) select 0) > 0)) then {
private _amount = 100;
if (((((_tempLogistics select _currentIndex) select 6) select 0) / 100) < 1) then {
_amount = ((_tempLogistics select _currentIndex) select 6) select 0;
};
(_tempLogistics select _currentIndex) set [6,
[(((_tempLogistics select _currentIndex) select 6) select 0) - _amount,
(((_tempLogistics select _currentIndex) select 6) select 1),
(((_tempLogistics select _currentIndex) select 6) select 2)]
];
private _crate = [KP_liberation_supply_crate, _amount, getPos _x] call KPLIB_fnc_createCrate;
[_crate, _x] call KPLIB_fnc_crateToStorage;
_processed = _processed + 1;
_space = _space - 1;
};
if (_processed >= _toProcess) exitWith {};
if ((_space > 0) && ((((_tempLogistics select _currentIndex) select 6) select 1) > 0)) then {
private _amount = 100;
if (((((_tempLogistics select _currentIndex) select 6) select 1) / 100) < 1) then {
_amount = ((_tempLogistics select _currentIndex) select 6) select 1;
};
(_tempLogistics select _currentIndex) set [6,
[(((_tempLogistics select _currentIndex) select 6) select 0),
(((_tempLogistics select _currentIndex) select 6) select 1) - _amount,
(((_tempLogistics select _currentIndex) select 6) select 2)]
];
private _crate = [KP_liberation_ammo_crate, _amount, getPos _x] call KPLIB_fnc_createCrate;
[_crate, _x] call KPLIB_fnc_crateToStorage;
_processed = _processed + 1;
_space = _space - 1;
};
if (_processed >= _toProcess) exitWith {};
if ((_space > 0) && ((((_tempLogistics select _currentIndex) select 6) select 2) > 0)) then {
private _amount = 100;
if (((((_tempLogistics select _currentIndex) select 6) select 2) / 100) < 1) then {
_amount = ((_tempLogistics select _currentIndex) select 6) select 2;
};
(_tempLogistics select _currentIndex) set [6,
[(((_tempLogistics select _currentIndex) select 6) select 0),
(((_tempLogistics select _currentIndex) select 6) select 1),
(((_tempLogistics select _currentIndex) select 6) select 2) - _amount]
];
private _crate = [KP_liberation_fuel_crate, _amount, getPos _x] call KPLIB_fnc_createCrate;
[_crate, _x] call KPLIB_fnc_crateToStorage;
_processed = _processed + 1;
_space = _space - 1;
};
if (_processed >= _toProcess) exitWith {};
} forEach _storage_areas;
};
please_recalculate = true;
if (KP_liberation_logistic_debug > 0) then {[format ["Logistic Group Update: %1", _x], "LOGISTIC"] call KPLIB_fnc_log;};
} else {
_x set [2,[0,0,0]];
_x set [3,[0,0,0]];
_x set [4,[0,0,0]];
_x set [5,[0,0,0]];
_x set [6,[0,0,0]];
_x set [7,0];
_x set [8,-1];
if (KP_liberation_logistic_debug > 0) then {[format ["Logistic Group Update: %1", _x], "LOGISTIC"] call KPLIB_fnc_log;};
};
};
default {};
};
} forEach _tempLogistics;
KP_liberation_logistics = +_tempLogistics;
if (KP_liberation_logistic_debug > 0) then {[format ["Logistic interval finished - Time needed: %1 seconds", diag_tickTime - _start], "LOGISTIC"] call KPLIB_fnc_log;};
};
uiSleep 60;
};