Esempio n. 1
0
        public void Sense()
        {
            if (Allies == null && Creature != null)
            {
                Allies = Creature.Faction;
            }

            List <CreatureAI> sensed = new List <CreatureAI>();

            VoxelHandle currentVoxel = new VoxelHandle(World.ChunkManager.ChunkData, GlobalVoxelCoordinate.FromVector3(Position));

            if (!(currentVoxel.IsValid && currentVoxel.IsEmpty))
            {
                return;
            }

            foreach (var thing in Manager.World.CollisionManager.EnumerateIntersectingObjects(BoundingBox, CollisionManager.CollisionType.Both))
            {
                Body body = thing as Body;
                if (body == null)
                {
                    continue;
                }
                CreatureAI minion = body.GetRoot().GetComponent <CreatureAI>();
                if (minion == null)
                {
                    continue;
                }
                Faction faction = minion.Faction;
                if (World.Diplomacy.GetPolitics(Allies, faction).GetCurrentRelationship() !=
                    Relationship.Hateful)
                {
                    continue;
                }

                if (!minion.Active)
                {
                    continue;
                }


                float dist = (minion.Position - GlobalTransform.Translation).LengthSquared();

                if (dist < SenseRadius && !VoxelHelpers.DoesRayHitSolidVoxel(
                        Manager.World.ChunkManager.ChunkData, Position, minion.Position))
                {
                    sensed.Add(minion);
                }
            }


            if (sensed.Count > 0)
            {
                OnEnemySensed.Invoke(sensed);
            }
        }
Esempio n. 2
0
        public void Sense()
        {
            if (Allies == null && Creature != null)
            {
                Allies = Creature.Faction;
            }

            List <CreatureAI> sensed  = new List <CreatureAI>();
            List <CreatureAI> collide = new List <CreatureAI>();

            foreach (KeyValuePair <string, Faction> faction in Manager.World.Factions.Factions)
            {
                if (World.Diplomacy.GetPolitics(Allies, faction.Value).GetCurrentRelationship() !=
                    Relationship.Hateful)
                {
                    continue;
                }

                foreach (CreatureAI minion in faction.Value.Minions)
                {
                    if (!minion.Active)
                    {
                        continue;
                    }

                    if (Creature != null && minion.Sensor.Enemies.Contains(Creature))
                    {
                        sensed.Add(minion);
                        continue;
                    }

                    float dist = (minion.Position - GlobalTransform.Translation).LengthSquared();

                    if (dist < SenseRadius && !VoxelHelpers.DoesRayHitSolidVoxel(
                            Manager.World.ChunkManager.ChunkData, Position, minion.Position))
                    {
                        sensed.Add(minion);
                    }

                    if (dist < 1.0f)
                    {
                        collide.Add(minion);
                    }
                }
            }


            if (sensed.Count > 0)
            {
                OnEnemySensed.Invoke(sensed);
            }
        }
Esempio n. 3
0
        public void Sense()
        {
            List <CreatureAI> sensed  = new List <CreatureAI>();
            List <CreatureAI> collide = new List <CreatureAI>();

            foreach (KeyValuePair <string, Faction> faction in PlayState.ComponentManager.Factions.Factions)
            {
                if (Alliance.GetRelationship(Creature.Creature.Allies, faction.Value.Name) == Relationship.Hates)
                {
                    foreach (CreatureAI minion in faction.Value.Minions)
                    {
                        float dist = (minion.Position - GlobalTransform.Translation).LengthSquared();

                        if (dist < SenseRadius)
                        {
                            sensed.Add(minion);
                        }

                        if (dist < 1.0f)
                        {
                            collide.Add(minion);
                        }
                    }
                }
            }

            if (sensed.Count > 0)
            {
                OnEnemySensed.Invoke(sensed);
            }

            foreach (CreatureAI minion in collide)
            {
                Vector3 diff = minion.Position - Creature.Position;
                diff.Normalize();
                minion.Physics.ApplyForce(diff * 10, DwarfTime.Dt);
                Creature.Physics.ApplyForce(diff * 10, DwarfTime.Dt);
            }
        }
Esempio n. 4
0
        public void Sense()
        {
            if (Name == "turret-sensor")
            {
                var x = 5;
            }

            if (!Active)
            {
                return;
            }

            if (Creature != null)
            {
                Allies = Creature.Faction;
            }

            // Don't sense enemies if we're inside the ground??
            var currentVoxel = new VoxelHandle(World.ChunkManager, GlobalVoxelCoordinate.FromVector3(Position));

            if (!(currentVoxel.IsValid && currentVoxel.IsEmpty))
            {
                return;
            }

            var sensed = new List <CreatureAI>();

            var myRoot = GetRoot();

            foreach (var body in Manager.World.EnumerateIntersectingObjects(BoundingBox, b => !Object.ReferenceEquals(b, myRoot) && b.IsRoot()))
            {
                if (body.GetComponent <Flammable>().HasValue(out var flames) && flames.IsOnFire)
                {
                    if (GetRoot().GetComponent <CreatureAI>().HasValue(out var myAI))
                    {
                        var task = new FleeEntityTask(body, 5)
                        {
                            Priority        = TaskPriority.Urgent,
                            AutoRetry       = false,
                            ReassignOnDeath = false
                        };

                        if (!myAI.HasTaskWithName(task))
                        {
                            myAI.AssignTask(task);
                        }

                        continue;
                    }
                }

                if (body.GetComponent <CreatureAI>().HasValue(out var minion))
                {
                    if (!minion.Active)
                    {
                        continue;
                    }

                    if (!DetectCloaked && minion.Creature.IsCloaked)
                    {
                        continue;
                    }

                    else if (DetectCloaked && minion.Creature.IsCloaked)
                    {
                        minion.Creature.IsCloaked = false;
                    }

                    if (World.Overworld.GetPolitics(Allies.ParentFaction, minion.Faction.ParentFaction).GetCurrentRelationship() != Relationship.Hateful)
                    {
                        continue;
                    }

                    if (!VoxelHelpers.DoesRayHitSolidVoxel(Manager.World.ChunkManager, Position, minion.Position))
                    {
                        sensed.Add(minion);
                    }
                }
            }

            if (sensed != null && sensed.Count > 0 && OnEnemySensed != null)
            {
                OnEnemySensed.Invoke(sensed);
            }
        }