private void OnAmmoSupply(SocketAsyncEventArgs args, byte[] bytes)
        {
            AmmoSupply input = AmmoSupply.Parser.ParseFrom(bytes);

            if (input.ActorId != ActorId)
            {
                return; // 不是自己,略过
            }
            AmmoBase = input.AmmoBase;
            if (AmmoBase > AmmoBaseMax)
            {
                ServerRoomManager.Instance.Log($"ActorBehaviour OnAmmoSupply Error - Ammobase is invalid! AmmoBase:{AmmoBase}/{AmmoBaseMax}"); //  弹药基数出现异常
                AmmoBase = AmmoBaseMax;
            }

            AmmoSupplyReply output = new AmmoSupplyReply()
            {
                RoomId   = input.RoomId,
                OwnerId  = input.OwnerId,
                ActorId  = input.ActorId,
                AmmoBase = input.AmmoBase,
                Ret      = true,
            };

            _roomLogic.BroadcastMsg(ROOM_REPLY.AmmoSupplyReply, output.ToByteArray());
        }
        public override void Tick()
        {
            if (timeSpan < TIME_DELAY)
            {
                timeSpan += Time.deltaTime;
                return;
            }

            timeSpan = 0;

            // 1-恢复[弹药基数AmmoBase]
            if (Owner.GetLastedTime() >= TIME_SUPPLY)
            {
                Owner.RestartTime();
                if (_actorBehaviour.AmmoBase < _actorBehaviour.AmmoBaseMax)
                {
                    _actorBehaviour.AmmoBase++;
                    AmmoSupply output = new AmmoSupply()
                    {
                        RoomId   = _actorBehaviour.RoomId,
                        OwnerId  = _actorBehaviour.OwnerId,
                        ActorId  = _actorBehaviour.ActorId,
                        AmmoBase = _actorBehaviour.AmmoBase,
                    };
                    GameRoomManager.Instance.SendMsg(ROOM.AmmoSupply, output.ToByteArray());
                }
            }

            // 2-寻找附近的敌人, 如果有, 且自己弹药满仓, 且自己行动点足够, 且敌人活着, 就干他
            // (因为本状态下可以恢复弹药,所以如果只要弹药有1就攻击的话,显得拖拖拉拉)
            var abEnemy = _actorBehaviour.FindEnemyInRange();

            if (abEnemy != null &&
                _actorBehaviour.AmmoBase == _actorBehaviour.AmmoBaseMax &&
                CmdAttack.IsActionPointGranted() &&
                !abEnemy.IsDead)
            {
                _actorBehaviour.IsCounterAttack = false; // 这是主动攻击, 不是反击, 记录在自己身上, Stop的时候用
                _actorBehaviour.StateMachine.TriggerTransition(StateEnum.FIGHT, 0, abEnemy.ActorId, _actorBehaviour.AttackDuration);
            }
        }