private IEnumerator SendWaitingCarriers() { while (true) { if (_waitingCarriers.Count > 0 && road.roadLock.IsFree(Orientation.SOUTH))//TODO orientation { ResourceCarrier candidate = _waitingCarriers.Dequeue(); ResourceCarrier firstCandidate = candidate; bool firstOk = true; while (RoadsPathfinding.RouteStar(road, candidate.destination.freightAreaData.freightAreaIn.road, 10, Orientation.SOUTH) == null && firstCandidate != candidate)//TODO orientation (et attention avec in/out :/) { firstOk = false; _waitingCarriers.Enqueue(candidate); candidate = _waitingCarriers.Dequeue(); yield return(new WaitForSeconds(0.1f)); }//TODO ATTENTION: la boucle ci-dessus veut dire que si le joueur fait n'importe quoi et coupe des chemins partout, la taille de la file va augmenter alors que des transporteurs y restent coincés!!!! Du coup, au moins mettre un genre de message d'erreur pourrait être sympa.==> TODO attention aussi au cas des destruction: que deviennent les carriers qui devaient aller à un bâtiment qui n'existe plus ? Comparer avec null pour vérifier que pas détruits ??? OK sur les children ? if (firstOk || firstCandidate != candidate)//Donc, on a trouvé un transporteur à envoyer { candidate.transform.position = new Vector3(road.transform.position.x, road.transform.position.y, candidate.transform.position.z); MoveManager candidateMoveManager = candidate.GetComponent <MoveManager>(); candidateMoveManager.orientation = Orientation.SOUTH;//TODO orientation candidate.GetComponent <RoadRouteManager>().occupiedRoad = road; road.roadLock.LockFor(candidateMoveManager.orientation, candidate.gameObject); candidate.GetComponent <Collider2D>().enabled = true; candidate.GetComponent <RoadRouteManager>().MoveTo(candidate.destination.freightAreaData.freightAreaIn.road); } } yield return(new WaitForSeconds(0.5f)); } }
/** * Ajoute au stock associé le chargement du transporteur passé en paramètre * (qui se trouve dans la FreightAreaIn ) et * détruit ensuite celui-ci. **/ public void AddShipmentToStockAndDestroy(ResourceCarrier carrier) { if (carrier.shipment != null) { parentStock.AddToStock(carrier.shipment); } freightAreaIn.road.roadLock.UnlockFor(carrier.GetComponent <MoveManager>().orientation, carrier.gameObject); GameManager.instance.DestroyGameObject(carrier.gameObject); treatedColliders.Remove(carrier.GetComponent <Collider2D>()); _availableCarriers++; }
/** * Renvoie un transporteur à son point d'origine. **/ public void SendBack(ResourceCarrier carrier) { carrier.destination = carrier.origin; carrier.GetComponent <Collider2D>().enabled = false; freightAreaOut.EnqueueCarrierToSend(carrier); }
/** * Envoie un transporteur (généré AVANT l'appel à la méthode) vers destination, * avec pour orientation de départ orientation et pour chargement shipment. **/ public void SendCarrier(ResourceCarrier toSend, BuildingStock destination, string orientation, ResourceShipment shipment) {//TODO: la nouvelle version de ceci, qui enqueue sur la FreightAreaOut, permet de faire moins de vérifications avant l'appel de cette méthode=> il y a sans doute des trucs à simplifier ailleurs dans le code. toSend.shipment = shipment; toSend.origin = parentStock; toSend.destination = destination; toSend.GetComponent <MoveManager>().orientation = orientation;//TODO orientation: faire en sorte que les appels à cette méthode donnent bien tous la bonne orientation pour sortir de FAout freightAreaOut.EnqueueCarrierToSend(toSend); }
/** * Instantie un nouveau transporteur sur la freightAreaOut en désactivant * son collider, avec un chargement à null. **/ public ResourceCarrier InstantiateCarrierWithoutCollider() { ResourceCarrier newCarrier = ((GameObject)Instantiate(carrierPrefab.gameObject, freightAreaOut.transform.position, Quaternion.identity)).GetComponent <ResourceCarrier>(); //TODO voir si changer la coordonnée z de l'objet n'est pas nécessaure pour qu'il n'apparaisse pas DERRIERE la rue ( à mon avis, si) newCarrier.GetComponent <Collider2D>().enabled = false; //On annule le collider pour l'instantiation uniquement (plus défensif), c'est la FreighAreaIn qui le réactivera _availableCarriers--; return(newCarrier); }
private IEnumerator DeliveryCoroutine(ResourceCarrier carrier) { KeepAsideOrderManager keepAsideOrderManager = freightAreaData.parentStock.GetComponent <KeepAsideOrderManager>(); yield return(new WaitForSeconds(waterDeliveryTime)); ResourceShipment order = keepAsideOrderManager.DeliverKeptAside(carrier); carrier.shipment = order; carrier.destination = carrier.origin; carrier.GetComponent <RoadRouteManager>().MoveTo(carrier.destination.freightAreaData.freightAreaIn.road); }
public void EnqueueCarrierToSend(ResourceCarrier carrier)//pré= le carrier ne doit PAS être en cours de mouvement. { MoveManager moveManager = carrier.GetComponent <MoveManager>(); RoadData occupiedRoad = carrier.GetComponent <RoadRouteManager>().occupiedRoad; if (occupiedRoad != null) //Elle vaudra null si c'est un nouveau carrier qui démarre seulement { occupiedRoad.roadLock.UnlockFor(moveManager.orientation, carrier.gameObject); } if (carrier.destination != null)//Si la destination vaut null, c'est qu'elle a été détruite { carrier.GetComponent <Collider2D>().enabled = false; _waitingCarriers.Enqueue(carrier); } else { GameManager.instance.DestroyGameObject(carrier.gameObject); } }
protected override void OnFreightAreaEntered(Collider2D other) { ResourceCarrier carrier = other.GetComponent <ResourceCarrier>(); if (carrier != null && carrier.destination == freightAreaData.parentStock) { if (carrier.collectingResources) { if (carrier.shipment != null) { freightAreaData.GetComponent <Home>().CancelOrderToPick(carrier); } freightAreaData.AddShipmentToStockAndDestroy(carrier); } else { freightAreaData.treatedColliders.Remove(other); freightAreaIn.road.roadLock.UnlockFor(carrier.GetComponent <MoveManager>().orientation, carrier.gameObject); GameManager.instance.DestroyGameObject(other.gameObject); } } }