public override void Exit(bool disabled) { if (_enemyActorId == 0) { return; } FightStop output = new FightStop() { RoomId = GameRoomManager.Instance.RoomId, OwnerId = _actorBehaviour.OwnerId, ActorId = _actorBehaviour.ActorId, TargetId = _enemyActorId, }; GameRoomManager.Instance.SendMsg(ROOM.FightStop, output.ToByteArray()); }
/// <summary> /// 注意,因为这条消息里有删除Actor的操作,所以不能放在ActorBehaviour里去响应,除非找到更好的方法.Nov.15.2019. Liu Gang. /// </summary> /// <param name="args"></param> /// <param name="bytes"></param> private void OnFightStop(SocketAsyncEventArgs args, byte[] bytes) { FightStop input = FightStop.Parser.ParseFrom(bytes); if (input.RoomId != RoomId) { return; // 不是自己房间的消息,略过 } ///////////////// // 1-攻击者 var attacker = ActorManager.GetActor(input.ActorId); if (attacker == null) { FightStopReply output = new FightStopReply() { RoomId = input.RoomId, OwnerId = input.OwnerId, ActorId = input.ActorId, Ret = false, ErrMsg = "Attacker not found!", }; ServerRoomManager.Instance.SendMsg(args, ROOM_REPLY.FightStopReply, output.ToByteArray()); return; } // 2-防御者 var defender = ActorManager.GetActor(input.TargetId); if (defender == null) { FightStopReply output = new FightStopReply() { RoomId = input.RoomId, OwnerId = input.OwnerId, ActorId = input.ActorId, Ret = false, ErrMsg = "Defender not found!", }; ServerRoomManager.Instance.SendMsg(args, ROOM_REPLY.FightStopReply, output.ToByteArray()); return; } // 3-计算弹药基数 bool isFightAgain = false; if (attacker.AmmoBase <= 0) { // 3.1-弹药基数不足, 无法攻击 attacker.AmmoBase = 0; FightStopReply output = new FightStopReply() { RoomId = input.RoomId, OwnerId = input.OwnerId, ActorId = input.ActorId, Ret = false, ErrMsg = "弹药基数不足!", }; ServerRoomManager.Instance.SendMsg(args, ROOM_REPLY.FightStopReply, output.ToByteArray()); return; } else { attacker.AmmoBase--; // 弹药充足, 并且这不是反击的情况下, 允许攻击下一轮 if (attacker.AmmoBase > 0 && !input.IsCounterAttack) { isFightAgain = true; } } // 4-战斗计算 - 减法公式 int damage = (int)Mathf.FloorToInt(attacker.AttackPower - defender.DefencePower); if (input.IsCounterAttack) // 如果是反击,则仅计算60%的伤害 { damage = Mathf.FloorToInt(damage * 0.6f); } if (damage == 0) { damage = 1; } defender.Hp = defender.Hp - damage; // 5-如果已经死亡 bool isEnemyDead = false; if (defender.Hp <= 0) { defender.Hp = 0; isEnemyDead = true; isFightAgain = false; ServerRoomManager.Instance.Log($"RoomLogic OnFightStop 1 - {attacker.ActorId} killed {defender.ActorId}"); } ///////////////// {// 10-挨打者的血量, 群发, UpdateActorInfoReply output = new UpdateActorInfoReply() { RoomId = defender.RoomId, OwnerId = defender.OwnerId, ActorId = defender.ActorId, Hp = defender.Hp, AmmoBase = defender.AmmoBase, Ret = true, }; BroadcastMsg(ROOM_REPLY.UpdateActorInfoReply, output.ToByteArray()); } {// 11-攻击者的弹药基数, 群发, UpdateActorInfoReply output = new UpdateActorInfoReply() { RoomId = attacker.RoomId, OwnerId = attacker.OwnerId, ActorId = attacker.ActorId, Hp = attacker.Hp, AmmoBase = attacker.AmmoBase, Ret = true, }; BroadcastMsg(ROOM_REPLY.UpdateActorInfoReply, output.ToByteArray()); } {// 12-飙血, 群发 SprayBloodReply output = new SprayBloodReply() { RoomId = defender.RoomId, OwnerId = defender.OwnerId, ActorId = defender.ActorId, Damage = damage, Ret = true, }; BroadcastMsg(ROOM_REPLY.SprayBloodReply, output.ToByteArray()); ServerRoomManager.Instance.Log($"飙血 - {defender.ActorId}"); } ///////////////// {// 20-本次攻击结束 FightStopReply output = new FightStopReply() { RoomId = input.RoomId, OwnerId = input.OwnerId, ActorId = input.ActorId, TargetId = input.TargetId, IsEnemyDead = isEnemyDead, FightAgain = isFightAgain, Ret = true, }; ServerRoomManager.Instance.SendMsg(args, ROOM_REPLY.FightStopReply, output.ToByteArray()); } if (isEnemyDead) {// 21-挨打者死了, 发送删除单位的消息 ActorRemoveReply output = new ActorRemoveReply() { RoomId = defender.RoomId, OwnerId = defender.OwnerId, ActorId = defender.ActorId, DieType = 1, Ret = true, }; ActorManager.RemoveActor(defender.ActorId); BroadcastMsg(ROOM_REPLY.ActorRemoveReply, output.ToByteArray()); ServerRoomManager.Instance.Log($"RoomLogic OnFightStop 2 - {attacker.ActorId} killed {defender.ActorId}"); } }