示例#1
0
    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));
        }
    }
示例#2
0
    /**
     * 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++;
    }
示例#3
0
    /**
     * Renvoie un transporteur à son point d'origine.
     **/
    public void SendBack(ResourceCarrier carrier)
    {
        carrier.destination = carrier.origin;
        carrier.GetComponent <Collider2D>().enabled = false;

        freightAreaOut.EnqueueCarrierToSend(carrier);
    }
示例#4
0
    /**
     * 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);
    }
示例#5
0
    /**
     * 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);
    }
示例#7
0
    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);
        }
    }
示例#8
0
    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);
            }
        }
    }