private void OnActorRemoveReply(byte[] bytes) { ActorRemoveReply input = ActorRemoveReply.Parser.ParseFrom(bytes); if (!input.Ret) { string msg = $"销毁Actor失败!{input.ActorId}"; GameRoomManager.Instance.Log("MSG: OnActorRemoveReply Error - " + msg); } else { PanelRoomMain.Instance.RemoveSelection(input.ActorId); // 如果该单位被选中,要取消选中 if (input.DieType == 0) { // 自然死亡, 部队解散 GameRoomManager.Instance.HexmapHelper.DestroyUnit(input.ActorId); string msg = $"成功解散部队!{input.ActorId}"; GameRoomManager.Instance.Log("MSG: OnActorRemoveReply - OK " + msg); } else if (input.DieType == 1) { // 战斗致死, 这时候先不删除该单元,而是要等动画结束以后再删除 var ab = ActorManager.GetActor(input.ActorId); if (ab == null) { return; } ab.StateMachine.TriggerTransition(StateEnum.DIE); GameRoomManager.Instance.Log($"MSG: OnActorRemoveReply - OK - {ab.Name}:{ab.ActorId} 被杀死!"); } } }
private void OnCityAdd(SocketAsyncEventArgs args, byte[] bytes) { CityAdd input = CityAdd.Parser.ParseFrom(bytes); if (input.RoomId != RoomId) { return; // 不是自己房间的消息,略过 } // 删除建造城市的开拓者 { bool ret = ActorManager.RemoveActor(input.CreatorId); ActorRemoveReply output = new ActorRemoveReply() { RoomId = input.RoomId, OwnerId = input.OwnerId, ActorId = input.CreatorId, Ret = ret, }; BroadcastMsg(ROOM_REPLY.ActorRemoveReply, output.ToByteArray()); } if (input.CellIndex == 0) { Debug.LogError("OnCityAdd F**k!!! City position is lost!!!"); } bool isCapiirtal = UrbanManager.CountOfThePlayer(input.OwnerId) == 0; // 第一座城市是都城 UrbanCity city = new UrbanCity() { RoomId = input.RoomId, OwnerId = input.OwnerId, CityId = input.CityId, PosX = input.PosX, PosZ = input.PosZ, CellIndex = input.CellIndex, CityName = input.CityName, CitySize = input.CitySize, IsCapital = isCapiirtal, }; UrbanManager.AddCity(city); { CityAddReply output = new CityAddReply() { RoomId = input.RoomId, OwnerId = input.OwnerId, CityId = input.CityId, PosX = input.PosX, PosZ = input.PosZ, CellIndex = input.CellIndex, CityName = input.CityName, CitySize = input.CitySize, IsCapital = isCapiirtal, Ret = true, }; BroadcastMsg(ROOM_REPLY.CityAddReply, output.ToByteArray()); } }
private void OnActorRemove(SocketAsyncEventArgs args, byte[] bytes) { ActorRemove input = ActorRemove.Parser.ParseFrom(bytes); if (input.RoomId != _roomId) { return; } bool ret = ActorManager.RemoveActor(input.ActorId); ActorRemoveReply output = new ActorRemoveReply() { RoomId = input.RoomId, OwnerId = input.OwnerId, ActorId = input.ActorId, Ret = ret, }; BroadcastMsg(ROOM_REPLY.ActorRemoveReply, 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}"); } }