public static bool AttackEnemyInRange(ActorBehaviour abMe, long targetId)
        {
            ActorBehaviour abEnemy = GameRoomManager.Instance.RoomLogic.ActorManager.GetActor(targetId);

            if (abEnemy == null)
            { // 优先找指定的敌人,如果没有找到,则搜索射程以内的敌人(从近到远)
                abEnemy = abMe.FindEnemyInRange();
            }

            if (abEnemy != null)
            {
                if (abMe.IsEnemyInRange(abEnemy))
                {
                    if (abMe.CalcDistance(abEnemy) < 18f * abMe.ShootingRange)
                    {                                 // 敌人进入射程,进入攻击状态. 注意:这时候的敌人,可能不是之前要打的敌人
                        abMe.IsCounterAttack = false; // 这是主动攻击, 不是反击, 记录在自己身上, Stop的时候用
                        abMe.StateMachine.TriggerTransition(StateEnum.FIGHT, abEnemy.CellIndex, abEnemy.ActorId,
                                                            abMe.AttackDuration);
                        CmdAttack.TryCommand();
                        return(true);
                    }
                }
            }
            return(false);
        }
Пример #2
0
        public override void Enter()
        {
            _enemyActorId = 0;
            isRest        = false;
            ActorBehaviour abEnemy = GameRoomManager.Instance.RoomLogic.ActorManager.GetActor(Owner.TargetActorId);

            if (abEnemy != null && _actorBehaviour.IsEnemyInRange(abEnemy))
            {
                _enemyActorId = abEnemy.ActorId;
                FightStart output = new FightStart()
                {
                    RoomId   = GameRoomManager.Instance.RoomId,
                    OwnerId  = _actorBehaviour.OwnerId,
                    ActorId  = _actorBehaviour.ActorId,
                    TargetId = abEnemy.ActorId,
                    // SkillId
                };
                GameRoomManager.Instance.SendMsg(ROOM.FightStart, output.ToByteArray());
            }
            else
            { // 如果没有找到敌人, 休息
                Owner.TriggerTransition(StateEnum.IDLE);
            }
        }