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);
            }
        }
Exemple #3
0
        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);
            }
        }