public int CompareStockpiles(Stockpile A, Stockpile B)
        {
            if (A == B)
            {
                return(0);
            }
            else
            {
                BoundingBox boxA    = A.GetBoundingBox();
                Vector3     centerA = (boxA.Min + boxA.Max) * 0.5f;
                float       costA   = (Creature.Physics.GlobalTransform.Translation - centerA).LengthSquared();

                BoundingBox boxB    = B.GetBoundingBox();
                Vector3     centerB = (boxB.Min + boxB.Max) * 0.5f;
                float       costB   = (Creature.Physics.GlobalTransform.Translation - centerB).LengthSquared();

                if (costA < costB)
                {
                    return(-1);
                }
                else
                {
                    return(1);
                }
            }
        }
Exemple #2
0
        public override float ComputeCost(Creature agent, bool alreadyCheckedFeasible = false)
        {
            if (!GetStockpile())
            {
                return(9999);
            }

            return((stockpile.GetBoundingBox().Center() - agent.AI.Position).LengthSquared());
        }
        public override IEnumerable <Status> Run()
        {
            Creature.IsCloaked = false;
            if (Zone != null)
            {
                var resourcesToStock = Creature.Inventory.Resources.Where(a => a.MarkedForRestock && Zone is Stockpile && (Zone as Stockpile).IsAllowed(a.Resource.TypeName)).ToList();

                foreach (var resource in resourcesToStock)
                {
                    var createdItem = Creature.Inventory.RemoveAndCreate(resource.Resource, Inventory.RestockType.RestockResource);
                    if (Zone.AddResource(resource.Resource))
                    {
                        var toss = new TossMotion(1.0f, 2.5f, createdItem.LocalTransform, Zone.GetBoundingBox().Center() + new Vector3(0.5f, 0.5f, 0.5f));

                        if (createdItem.GetRoot().GetComponent <Physics>().HasValue(out var physics))
                        {
                            physics.CollideMode = Physics.CollisionMode.None;
                        }

                        createdItem.AnimationQueue.Add(toss);
                        toss.OnComplete += createdItem.Die;

                        Creature.NoiseMaker.MakeNoise("Stockpile", Creature.AI.Position);
                        Creature.Stats.NumItemsGathered++;
                        Creature.CurrentCharacterMode = Creature.Stats.CurrentClass.AttackMode;
                        Creature.Sprite.ResetAnimations(Creature.Stats.CurrentClass.AttackMode);
                        Creature.Sprite.PlayAnimations(Creature.Stats.CurrentClass.AttackMode);

                        while (!Creature.Sprite.AnimPlayer.IsDone())
                        {
                            yield return(Status.Running);
                        }

                        yield return(Status.Running);
                    }
                    else
                    {
                        Creature.Inventory.AddResource(resource.Resource, Inventory.RestockType.RestockResource);
                        createdItem.Delete();
                    }
                }
            }

            Timer waitTimer = new Timer(1.0f, true);
            bool  removed   = Creature.World.RemoveResourcesFromSpecificZone(Resource, Zone);

            if (!removed)
            {
                yield return(Status.Fail);
            }
            else
            {
                var newEntity = Agent.Manager.RootComponent.AddChild(new ResourceEntity(Agent.Manager, Resource, Zone.GetBoundingBox().Center() + new Vector3(0.0f, 1.0f, 0.0f)));

                if (newEntity.GetRoot().GetComponent <Physics>().HasValue(out var newPhysics))
                {
                    newPhysics.CollideMode = Physics.CollisionMode.None;
                }

                var toss = new TossMotion(1.0f + MathFunctions.Rand(0.1f, 0.2f), 2.5f + MathFunctions.Rand(-0.5f, 0.5f), newEntity.LocalTransform, Agent.Position);
                newEntity.AnimationQueue.Add(toss);
                toss.OnComplete += () => newEntity.Die();

                Agent.Creature.Inventory.AddResource(Resource, Inventory.RestockType.None);
                Agent.Creature.Sprite.ResetAnimations(Creature.Stats.CurrentClass.AttackMode);
                while (!waitTimer.HasTriggered)
                {
                    Agent.Creature.CurrentCharacterMode = Creature.Stats.CurrentClass.AttackMode;
                    waitTimer.Update(DwarfTime.LastTime);
                    yield return(Status.Running);
                }
                Agent.Creature.CurrentCharacterMode = CharacterMode.Idle;
                yield return(Status.Success);
            }
        }
        public int CompareStockpiles(Stockpile A, Stockpile B)
        {
            if(A == B)
            {
                return 0;
            }
            else
            {
                BoundingBox boxA = A.GetBoundingBox();
                Vector3 centerA = (boxA.Min + boxA.Max) * 0.5f;
                float costA = (Creature.Physics.GlobalTransform.Translation - centerA).LengthSquared();

                BoundingBox boxB = B.GetBoundingBox();
                Vector3 centerB = (boxB.Min + boxB.Max) * 0.5f;
                float costB = (Creature.Physics.GlobalTransform.Translation - centerB).LengthSquared();

                if(costA < costB)
                {
                    return -1;
                }
                else
                {
                    return 1;
                }
            }
        }