public void Perform(Agent agent, GameTime gameTime) { var agentPosition = agent.Owner.Position; agent.Owner.GetComponent <Move>()?.MoveTo(_destination, _speed, true); if (agentPosition == agent.Owner.Position) { // Agent Stuck... abort agent.Abort(AgentAbortReason.ImStuck); } }
public override void Update(GameTime gameTime) { if (Target != null && (Target.Removed || Target.Level != Agent.Owner.Level || Mathf.Distance(Agent.Owner.Position, Target.Position) > FollowRange * Game.Unit)) { Agent.Abort(AgentAbortReason.TagetLost); Target = null; } if (Target == null) { _targetsOnSight = Agent.Owner.Level.QueryEntity(Agent.Owner.Position, AgroRange * Game.Unit) .Where((e) => e.MemberOf(Targets) && CheckLineOfSight(e.Coordinates)).ToList(); _targetsOnSight.Sort((a, b) => Mathf.Distance(a.Position, Agent.Owner.Position) .CompareTo(Mathf.Distance(b.Position, Agent.Owner.Position))); if (_targetsOnSight.Any()) { Target = _targetsOnSight.First(); _lastTagetPosition = Target.Coordinates; Agent.MoveTo(Target.Coordinates, MoveSpeedAgro, false, (int)(FollowRange + 4)); } } else { if (Target.Coordinates != _lastTagetPosition && Mathf.Distance(Agent.Owner.Position, Target.Position) < FollowRange * Game.Unit && CheckLineOfSight(Target.Coordinates)) { Agent.Flush(); _lastTagetPosition = Target.Coordinates; Agent.MoveTo(_lastTagetPosition, MoveSpeedAgro, false, (int)(FollowRange + 4)); } } if (!Agent.IsBusy()) { base.Update(gameTime); } }
public override void Update(GameTime gameTime) { if (!Agent.IsBusy() && Target != null && (Target.Level != Agent.Owner.Level || Mathf.Distance(Agent.Owner.Position, Target.Position) > FollowRange * Game.Unit)) { Agent.Abort(AgentAbortReason.TagetLost); Target = null; } if (Target == null) { _targetsOnSight = Agent.Owner.Level.GetEntitiesOnArea(Agent.Owner.Position, AgroRange * Game.Unit) .Where((e) => e.Blueprint == ENTITIES.PLAYER && CheckLineOfSight(e.GetTilePosition())).ToList(); _targetsOnSight.Sort((a, b) => Mathf.Distance(a.Position, Agent.Owner.Position) .CompareTo(Mathf.Distance(b.Position, Agent.Owner.Position))); if (_targetsOnSight.Any()) { Target = _targetsOnSight.First(); _lastTagetPosition = Target.GetTilePosition(); Agent.MoveTo(Target.GetTilePosition(), MoveSpeedAgro, true, (int)(FollowRange + 4)); } } else { if (Target.GetTilePosition() != _lastTagetPosition && Mathf.Distance(Agent.Owner.Position, Target.Position) < FollowRange * Game.Unit && CheckLineOfSight(Target.GetTilePosition())) { Agent.Flush(); _lastTagetPosition = Target.GetTilePosition(); Agent.MoveTo(_lastTagetPosition, MoveSpeedAgro, true, (int)(FollowRange + 4)); } } if (!Agent.IsBusy()) { base.Update(gameTime); } }