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); } }
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); } }
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); } }
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); } }