public CarrierTask(IInteractableInventory from, IInteractableInventory to, Item item) { this.from = from; this.to = to; this.item = item; this.status = TaskStatus.TODO; }
public CarrierTask DispatchTask(IInteractableInventory from, IInteractableInventory to, Item item) { var task = new CarrierTask(from, to, item); _scheduledTasks.Add(task); return(task); }
public List <CarrierTask> BatchTask(IInteractableInventory from, IInteractableInventory to, Item item, int amount) { List <CarrierTask> taskList = new List <CarrierTask>(); for (int i = 0; i < amount; i++) { taskList.Add(DispatchTask(from, to, item)); } return(taskList); }
public IInteractableInventory FindStorage(Transform origin) { float nearestDistance = float.MaxValue; IInteractableInventory nearestStorage = null; foreach (var storage in storageList) { var distance = Vector3.Distance(origin.position, storage.transform.position); if (distance < nearestDistance) { nearestDistance = distance; nearestStorage = storage; } } return(nearestStorage); }
public IInteractableInventory FindItems(Transform origin, Item item, int amount = 1) { float nearestDistance = float.MaxValue; IInteractableInventory nearestStorage = null; foreach (var storage in storageList) { var distance = Vector3.Distance(origin.position, storage.transform.position); if (distance < nearestDistance && storage.inventory.Offers(item)) { nearestDistance = distance; nearestStorage = storage; } } return(nearestStorage); }
public void RequestItems(IInteractableInventory target, Item item, int amount) { if (amount <= 0) { Debug.LogError("Illegal amount requested!"); return; } if (!requests.ContainsKey(target)) { requests.Add(target, new RequestInfo()); } if (!requests[target].requestedItems.ContainsKey(item)) { requests[target].requestedItems.Add(item, 0); } requests[target].requestedItems[item] = amount; }
private void ScheduleTasks(IInteractableInventory target, RequestInfo requestInfo) { List <Item> removeItems = new List <Item>(); List <Item> keys = new List <Item>(requestInfo.requestedItems.Keys); foreach (var key in keys) { var value = requestInfo.requestedItems[key]; var nextAvailableStorage = storageManager.FindItems(target.transform, key); if (nextAvailableStorage != null) { var inStock = nextAvailableStorage.inventory.GetElement(key).virtualAmount; var possibleQuantity = inStock >= value ? value : inStock; if (nextAvailableStorage.inventory.Transfer(target.inventory, key, possibleQuantity, false, true)) { requestInfo.activeTaks.AddRange(carrierManager.BatchTask(nextAvailableStorage, target, key, possibleQuantity)); requestInfo.requestedItems[key] -= possibleQuantity; if (requestInfo.requestedItems[key] == 0) { removeItems.Add(key); } else if (requestInfo.requestedItems[key] < 0) { throw new InvalidOperationException("Requested amount must not be negative!"); } } else { Debug.LogWarning("Failed to schedule task for requested task due to failed transfer"); } } } foreach (var item in removeItems) { requestInfo.requestedItems.Remove(item); } }
public void Unsubscribe(IInteractableInventory storage) { storageList.Remove(storage); }
public void Subscribe(IInteractableInventory storage) { storageList.Add(storage); }