Пример #1
0
    /// <summary>
    /// This function loads products from a <see cref="IProductEmitter"/> into the _transporterStorage.
    /// </summary>
    /// <param name="transportRouteElement">The current <see cref="TransportRouteElement"/> that is used by the <see cref="RouteMover"/>.</param>
    /// <returns></returns>
    public IEnumerator Load(TransportRouteElement transportRouteElement)
    {
        if (!(transportRouteElement.FromNode.gameObject.GetComponent <IProductEmitter>() is IProductEmitter producer))
        {
            yield break;
        }
//        Debug.Log(producer.EmitterStorage().StoredProductData.ProductName);
        // Search unloading settings and execute them
        foreach (TransportRouteSetting setting in transportRouteElement.RouteSettings)
        {
            bool isUnload = !setting.IsLoad;
            bool isEmitterProducingProduct = producer.EmitterStorage(setting.ProductData) != null;

            if (isUnload || !isEmitterProducingProduct)
            {
                continue;
            }

            Debug.Log(setting.ToString());

            if (!_transporterStorage.ContainsKey(setting.ProductData))
            {
                ProductStorage productStorage = new ProductStorage(setting.ProductData)
                {
                    MaxAmount = MaxCapacity
                };
                productStorage.SetAmount(0);
                _transporterStorage.Add(setting.ProductData, productStorage);
            }

            // Handle actual unloading process
            ProductStorage emitterStorage = producer.EmitterStorage(setting.ProductData);
            ProductStorage truckStorage   = _transporterStorage[setting.ProductData];
            int            loadAmount     = setting.Amount;
            while (loadAmount > 0 && truckStorage.Amount != truckStorage.MaxAmount)
            {
                while (producer.EmitterStorage(setting.ProductData).Amount == 0)
                {
                    yield return(new WaitForSeconds(0.1f));
                }

                loadAmount--;
                emitterStorage.Add(-TransferAmount);
                truckStorage.Add(TransferAmount);
                yield return(new WaitForSeconds(TransferTime));
            }
        }
    }
Пример #2
0
    public IEnumerator Unload(TransportRouteElement transportRouteElement)
    {
        // Unload Products
        if (transportRouteElement == null || !(transportRouteElement.ToNode.gameObject.GetComponent <IProductReceiver>() is IProductReceiver consumer))
        {
            yield break;
        }

        foreach (TransportRouteSetting setting in transportRouteElement.RouteSettings)
        {
            bool isLoad = setting.IsLoad;
            bool isLoadedProductReceiver = consumer.ReceiverStorage(setting.ProductData) != null;
            bool hasProductLoaded        = _transporterStorage.ContainsKey(setting.ProductData);
            // if: setting is for loading, receiver not in need of the product or the truck has none of the product
            if (isLoad || !isLoadedProductReceiver || !hasProductLoaded)
            {
                continue;
            }

            Debug.Log(setting.ToString());

            ProductStorage receiverStorage = consumer.ReceiverStorage(setting.ProductData);
            ProductStorage truckStorage    = _transporterStorage[setting.ProductData];
            int            unloadAmount    = setting.Amount; // The amount that is supposed to be transferred

            // Handle actual unloading
            while (unloadAmount > 0 && truckStorage.Amount > 0 &&
                   receiverStorage.Amount < receiverStorage.MaxAmount)
            {
                unloadAmount--;
                truckStorage.Add(-TransferAmount);
                receiverStorage.Add(TransferAmount);
                yield return(new WaitForSeconds(TransferTime));
            }

            if (truckStorage.Amount == 0)
            {
                _transporterStorage.Remove(setting.ProductData);
            }
        }
    }