示例#1
0
 public CarrierTask(IInteractableInventory from, IInteractableInventory to, Item item)
 {
     this.from   = from;
     this.to     = to;
     this.item   = item;
     this.status = TaskStatus.TODO;
 }
示例#2
0
    public CarrierTask DispatchTask(IInteractableInventory from, IInteractableInventory to, Item item)
    {
        var task = new CarrierTask(from, to, item);

        _scheduledTasks.Add(task);

        return(task);
    }
示例#3
0
    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);
    }
示例#4
0
    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);
    }
示例#5
0
    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);
    }
示例#6
0
    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;
    }
示例#7
0
    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);
        }
    }
示例#8
0
 public void Unsubscribe(IInteractableInventory storage)
 {
     storageList.Remove(storage);
 }
示例#9
0
 public void Subscribe(IInteractableInventory storage)
 {
     storageList.Add(storage);
 }