/** * Simulate transfer task on provided storages. */ private bool Transfer(TransferTask transferTask, Dictionary <VehicleUnit, StorageState> storages, ref TaskTransfers taskTransfers, ref TaskTransfers[] taskTransfersPerUnit, bool calculateTransfer = false, bool calculateTransferPerUnit = false) { ImmutableUniqueList <VehicleUnit> targetUnits = transferTask.GetTargetUnits(); int targetUnitsCount = targetUnits.Count; Dictionary <VehicleUnit, int> loadingLimits = Manager <AdvancedTransferTaskAdapter> .Current?.GetCapacityLimits(transferTask, storages); for (int k = 0; k < targetUnitsCount; k++) { VehicleUnit targetUnit = targetUnits[k]; if (storages.TryGetValue(targetUnit, out StorageState storage)) { if (storage.storage == null) { //autorefitable storage = cannot determine transfer return(false); } int newCount; if (loadingLimits != null && loadingLimits.TryGetValue(targetUnit, out int limit)) { newCount = transferTask is LoadTask ? Math.Max(storage.count, limit) : Math.Min(storage.count, limit); } else { newCount = transferTask is LoadTask ? storage.storage.Capacity : 0; } if (storage.count != newCount) { if (calculateTransfer) { if (taskTransfers == null) { taskTransfers = new TaskTransfers(); } taskTransfers.Add(storage.storage.Item, newCount - storage.count); } if (calculateTransferPerUnit) { int unitIndex = targetUnit.Vehicle.Units.IndexOf(targetUnit); if (taskTransfersPerUnit == null) { taskTransfersPerUnit = new TaskTransfers[targetUnit.Vehicle.Units.Count]; } if (taskTransfersPerUnit[unitIndex] == null) { taskTransfersPerUnit[unitIndex] = new TaskTransfers(); } taskTransfersPerUnit[unitIndex].Add(storage.storage.Item, newCount - storage.count); } storage.count = newCount; storages[targetUnit] = storage; } } } return(true); }
/** * Simulate refit task on provided storages. * Returns false when the refit task has no item to refit (=Auto refit) */ private bool Refit(RefitTask refitTask, Dictionary <VehicleUnit, StorageState> storages) { Item item = refitTask.Item; if (item == null) { //refit to auto = cannot determine begin state return(false); } ImmutableUniqueList <VehicleUnit> targetUnits = refitTask.GetTargetUnits(); int targetUnitsCount = targetUnits.Count; StorageManager storageManager = LazyManager <StorageManager> .Current; for (var k = 0; k < targetUnitsCount; k++) { VehicleUnit targetUnit = targetUnits[k]; storageManager.TryGetStorage(targetUnit.SharedData.AssetId, item, out Storage newStorage); if (newStorage != null && storages.ContainsKey(targetUnit) && (storages[targetUnit].storage == null || storages[targetUnit].storage.Item != newStorage.Item)) { storages[targetUnit] = new StorageState(newStorage); } } return(true); }