private IEnumerator RedirectAfterShipmentRefusal(HashSet <FreightAreaIn> toIgnore) { FreightAreaIn bestWarehouse = null; for (int i = 0; i < 3 && bestWarehouse == null; i++) //TODO possibilité d'un peu de random sur ce 3, arbitraire { if (i > 0) { yield return(new WaitForSeconds(Random.Range(0.5f, 3.0f - i))); } Cell <FreightAreaIn> coroutineRslt = new Cell <FreightAreaIn>(); RoadData occupiedRoad = GetComponent <RoadRouteManager>().occupiedRoad; yield return(StartCoroutine(occupiedRoad.FindNearestFreeWarehouseFor(shipment, coroutineRslt, toIgnore))); bestWarehouse = coroutineRslt.value; } RoadRouteManager routeManager = GetComponent <RoadRouteManager>(); if (bestWarehouse != null) { routeManager.MoveTo(bestWarehouse.road); destination = bestWarehouse.GetComponentInParent <BuildingStock>(); } else { destination = origin; routeManager.MoveTo(destination.freightAreaData.freightAreaIn.road); } yield return(null); }
/** * Déclenche (via une coroutine) le mouvement du transporteur vers la maison la * plus proche (sur le réseau routier), où il sera détruit (utile pour se * débarrasser des transporteurs dont le bâtiment principal est détruit). * Le stock sera alors perdu. Si aucune maison n'est disponible, le * transporteur ne bouge pas, et la coroutine va continuer d'attendre une * maison vers laquelle se rendre. **/ private IEnumerator GoHome() { RoadRouteManager roadRouteManager = GetComponent <RoadRouteManager>(); while (true) { //TODO utiliser un findNearestObjectWithPath (Utils) pour être plus générique. GameObject[] homesArray = GameObject.FindGameObjectsWithTag("Home"); float minDistance = 0.0f; FreightAreaIn nearestHomeIn = null; foreach (GameObject home in homesArray) { FreightAreaIn homeIn = home.GetComponent <BuildingStock>().freightAreaData.freightAreaIn; float distance = RoadsPathfinding.RealDistanceBetween(homeIn.road, roadRouteManager.occupiedRoad); if (distance > 0.0f && (nearestHomeIn == null || minDistance > distance)) { minDistance = distance; nearestHomeIn = homeIn; } yield return(null); } if (nearestHomeIn != null)//Sinon, c'est qu'il n'y a AUCUNE maison satisfaisante, et la boucle principale se charge de relancer la recherche { destination = nearestHomeIn.GetComponentInParent <BuildingStock>(); roadRouteManager.MoveTo(destination.freightAreaData.freightAreaIn.road, Random.Range(0.5f, 3.0f), null); yield break; } yield return(null); } }
/* * Fait dans OnTriggerStay, car il faut attendre qu'ils soient à l'arrêt dans la * zone ; gérer ça avec OnTriggerEnter2D et attendre la fin du mouvement n'est * PAS une bonne idée, car si le collider d'un perso de passage effleure la case, * il déclenchera le code en question, ce qui est TRES MAUVAIS!!!! */ void OnTriggerStay2D(Collider2D other) { RoadRouteManager roadRouteManager = other.GetComponent <RoadRouteManager>(); MoveManager moveManager = other.GetComponent <MoveManager>(); //Condition assez longue, mais nécessaire pour éviter les bugs dus à des collisions partielles avec certains colliders qui "effleureent" la zone de frêt if (!_freightAreaDataTreatedColliders.Contains(other) && roadRouteManager != null && roadRouteManager.occupiedRoad == road && !moveManager.IsMoving()) { inEvent.Invoke(other); _freightAreaDataTreatedColliders.Add(other); } }
public void CollectingResourceCarrierStuck(RetryData retryData)//ATTENTION: RetryData peut valoir null (si on essaie de se rendre à qqch de détruit) { RoadRouteManager routeManager = GetComponent <RoadRouteManager>(); if (destination == null && origin == null) //bâtiment de destination détruit, et l'origine est détruite { collectingResources = false; //Pour être sûr de ne pas refiler les ressources à l'autre maison et faire ainsi confusion avec son/ses transporteur(s) StartCoroutine(GoHome()); //On part se faire éliminer dans la maison la plus proche. } else//Dans tous les autre cas, on retourne à l'origine (soit on s'obstine, soit on fait demi-tour) { if (destination != origin && destination != null) { destination.GetComponent <KeepAsideOrderManager>().CancelKeptAside(this); } destination = origin; routeManager.MoveTo(destination.freightAreaData.freightAreaIn.road); } }
public IEnumerator GoBack() { RoadRouteManager roadRouteManager = GetComponent <RoadRouteManager>(); while (true) { RoadData destination = null; if (prefecture != null)// elle existe encore { destination = prefecture.GetComponent <Prefecture>().door; } else //Elle n'existe plus { GameObject nearestHome = Utils.GetNearestObjectWithPath(roadRouteManager.occupiedRoad, "Home", null); if (nearestHome != null)//sinon ça boucle { destination = nearestHome.GetComponentInChildren <FreightAreaIn>().road; } } if (destination != null) { roadRouteManager.MoveTo(destination); yield return(new WaitUntil(() => destination == null || GetComponent <RoadRouteManager>().occupiedRoad == destination)); if (destination != null)//Sinon, ça boucle { destination.roadLock.UnlockFor(GetComponent <MoveManager>().orientation, gameObject); if (prefecture != null) { prefecture.GetComponent <Prefecture>().ComeBack(this); } GameObject.Destroy(gameObject); } } yield return(null); } }
public void DeliveringResourceCarrierStuck(RetryData retryData)//ATTENTION: RetryData peut valoir null (si on essaie de se rendre à qqch de détruit) { RoadRouteManager roadRouteManager = GetComponent <RoadRouteManager>(); if (destination != null)//destination peut valoir null si le bâtiment a été détruit { ResourceConsumer consumer = destination.freightAreaData.parentStock.GetComponent <ResourceConsumer>(); if (shipment != null && consumer != null && origin.freightAreaData.freightAreaIn != destination)//Donc: si le transporteur est en livraison vers un ResourceConsumer et qu'il n'est pas déjà en cours de mouvement d'annulation de livraison { consumer.CancelResourceOrder(shipment); } } if (origin != null) { destination = origin; roadRouteManager.MoveTo(destination.freightAreaData.freightAreaIn.road, Random.Range(0.5f, 3.0f), null); } else { StartCoroutine(GoHome()); } }