/// <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)); } } }
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); } } }