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