Ejemplo n.º 1
0
    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);
    }
Ejemplo n.º 2
0
    /**
     * 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);
        }
    }
Ejemplo n.º 3
0
    /*
     * 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);
        }
    }
Ejemplo n.º 4
0
    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);
        }
    }
Ejemplo n.º 5
0
    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);
        }
    }
Ejemplo n.º 6
0
    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());
        }
    }