private IEnumerator SortAvailableKeepAsideOrderManagersByDistance(Cell <PriorityQueue <float, KeepAsideOrderManager> > rslt) { StockManager stockManager = GameManager.instance.cityBuilderData.stockManager; PriorityQueue <float, KeepAsideOrderManager> rsltQueue = new PriorityQueue <float, KeepAsideOrderManager>(); IEnumerator <KeepAsideOrderManager> keepAsideEnumerator = stockManager.AllKeepAsideOrderManagers(); while (keepAsideEnumerator.MoveNext()) { KeepAsideOrderManager keepAsideManager = keepAsideEnumerator.Current; if (keepAsideManager != null)//On vérifie s'il n'a pas été détruit { float distance = Vector2.Distance(transform.position, keepAsideManager.transform.position); if (distance <= keepAsideManager.availabilityRange)//Pour éviter les calculs inutiles ; si ce n'est pas le cas, il est de toute façon trop loin { FreightAreaIn inArea = keepAsideManager.freightAreaData.freightAreaIn; FreightAreaOut outHome = freightAreaData.freightAreaOut; float roadDistance = RoadsPathfinding.RealDistanceBetween(inArea.road, outHome.road); if (roadDistance > 0.0f && roadDistance <= keepAsideManager.availabilityRange) { rsltQueue.Push(roadDistance, keepAsideManager); } } } yield return(null); } rslt.value = rsltQueue; }
public void ConnectFreightTo(Agora agora) { FreightAreaData agoraFreight = agora.GetComponent <FreightAreaData>(); FreightAreaIn agoraAreaIn = agoraFreight.freightAreaIn; FreightAreaOut agoraAreaOut = agoraFreight.freightAreaOut; HashSet <Collider2D> agoraTreatedColliders = agoraFreight.treatedColliders; FreightAreaData freightData = GetComponent <FreightAreaData>(); freightData.freightAreaIn = agoraAreaIn; freightData.freightAreaOut = agoraAreaOut; freightData.treatedColliders = agoraTreatedColliders; }
protected void Awake() { /* * Les conditions sur l'assignation des freightArea permet de les setter à des * objets définis dans un autre Awake s'exécutant avant celui-ci (ce qui peut * être très utile pour les marchands d'agora, afin d'éviter les problèmes si, * comme dans le test, ils sont déjà présents dans le préfab instancié). */ if (freightAreaIn == null) { freightAreaIn = GetComponentInChildren <FreightAreaIn>(); } if (freightAreaOut == null) { freightAreaOut = GetComponentInChildren <FreightAreaOut>(); } _availableCarriers = carriersNber; parentStock = GetComponent <BuildingStock>(); }
public bool SendOrderIfPossible() { FreightAreaOut freightOut = freightAreaData.freightAreaOut; if (freightAreaData.availableCarriers > 0 && OrdersToTreat() && freightOut.road.roadLock.IsFree(Orientation.SOUTH))//TODO orientation (opposée à celle du bâtiment) { ResourceOrder toTreat = NextOrder(); FreightAreaIn destinationIn = toTreat.deliveryPlace.freightAreaData.freightAreaIn; if (RoadsPathfinding.RouteStar(destinationIn.road, freightOut.road, 10, Orientation.SOUTH) != null)//TODO orientation { MarkAsTreated(toTreat); freightAreaData.SendCarrier(toTreat.deliveryPlace, Orientation.SOUTH, toTreat.shipment);//TODO orientation (opposée à celle du bâtiment) return(true); } else //Si la destination n'est pas raccordée au réseau routier, on annule sa commande et on l'en notifie { toTreat.deliveryPlace.freightAreaData.parentStock.GetComponent <ResourceConsumer>().CancelResourceOrder(toTreat.shipment); } } return(false); }