private static void CHANGE_AI_RIGHTS_REPLY(byte[] bytes) { ChangeAiRightsReply input = ChangeAiRightsReply.Parser.ParseFrom(bytes); if (input.OwnerId != GameRoomManager.Instance.CurrentPlayer.TokenId) { // 校验, 此内容测试完毕以后, 可以去掉 GameRoomManager.Instance.Log($"RoomMsgReply CHANGE_AI_RIGHTS_REPLY Error - Id is not the same! - {input.OwnerId} : {GameRoomManager.Instance.CurrentPlayer.TokenId}"); return; } if (!input.Ret) { string msg = "AI代理权设置失败! - 实际代码永远不可能走到这里! 如果发现这个错误, 就让服务器去查吧! "; UIManager.Instance.SystemTips(msg, PanelSystemTips.MessageType.Error); GameRoomManager.Instance.Log($"MSG: CHANGE_AI_RIGHTS_REPLY Error - " + msg); return; } { string msg = ""; if (input.ControlByMe) { msg = $"AI代理权修改: {input.AiAccount} 被我控制!"; GameRoomManager.Instance.AddAiPlayer(input.AiPlayerId, input.AiAccount); // AI-代理权 4-刷新AI玩家身上的资源 UpdateRes output3 = new UpdateRes() { RoomId = input.RoomId, OwnerId = input.AiPlayerId, }; GameRoomManager.Instance.SendMsg(ROOM.UpdateRes, output3.ToByteArray()); } else { msg = $"AI代理权修改: {input.AiAccount} 解除被我的控制!"; GameRoomManager.Instance.RemoveAiPlayer(input.AiPlayerId); } GameRoomManager.Instance.Log($"MSG: CHANGE_AI_RIGHTS_REPLY OK - " + msg); } }
public void Offline(long playerId) { var piir = GetPlayerInRoom(playerId); if (piir == null) { ServerRoomManager.Instance.Log($"RoomLogic Offline - Player not found!"); return; } // 玩家下线 piir.Offline(); // 把本玩家的代理权交给别的在线玩家, 除非我已经是最后一个了, 就不做任何处理了 // 找到一个仍然在线的玩家 PlayerInfoInRoom piirOnline = null; foreach (var keyValue in PlayersInRoom) { var piirOther = keyValue.Value; if (piirOther.IsOnline) { piirOnline = piirOther; } } if (piirOnline != null) { // 不仅是自己, 而且是把所有自己管理的AiRights, 都交给对方 foreach (var keyValue in PlayersInRoom) { var piirAi = keyValue.Value; if (piirAi.AiRights == piir.Enter.TokenId) { piirAi.AiRights = piirOnline.Enter.TokenId; ChangeAiRightsReply output = new ChangeAiRightsReply() { RoomId = piirOnline.RoomId, OwnerId = piirOnline.Enter.TokenId, AiPlayerId = piirAi.Enter.TokenId, AiAccount = piirAi.Enter.Account, ControlByMe = true, Ret = true, }; ServerRoomManager.Instance.SendMsg(piirOnline.Args, ROOM_REPLY.ChangeAiRightsReply, output.ToByteArray()); ServerRoomManager.Instance.Log($"RoomLogic Offline OK - AI Rights of {piirAi.Enter.Account} belongs to {piirOnline.Enter.Account}"); } } } else { // 如果我是最后一个玩家, 则把所有人的 AI Rights 改为0 foreach (var keyValue in PlayersInRoom) { var piirAi = keyValue.Value; if (piirAi.AiRights != piir.Enter.TokenId) { ServerRoomManager.Instance.Log($"RoomLogic Offline Error - I am the last one in the room. But the AI Rights of {piirAi.Enter.Account} belongs to someone else {piirAi.AiRights} - MyName:{piir.Enter.Account}"); } piirAi.AiRights = 0; ServerRoomManager.Instance.Log($"RoomLogic Offline OK - AI Rights of {piirAi.Enter.Account} belongs to nobody! There is no player in the room."); } } _curPlayerCount = PlayersInRoom.Count; ServerRoomManager.Instance.Log($"RoomLogic Offline OK - Player left the battlefield! Player:{piir.Enter.Account}"); // 玩家离开战场 }
public void Online(SocketAsyncEventArgs args, PlayerEnter enter, long roomId) { var piir = GetPlayerInRoom(enter.TokenId); if (piir == null) { // 如果房间里实际没有这个玩家(的存盘), 则表明这是一个新用户, 要从表格中读取初始数据 piir = new PlayerInfoInRoom(); var csv = CsvDataManager.Instance.GetTable("battle_init"); int wood = csv.GetValueInt(1, "PlayerInit_Wood"); int food = csv.GetValueInt(1, "PlayerInit_Food"); int iron = csv.GetValueInt(1, "PlayerInit_Iron"); int actionPointMax = csv.GetValueInt(1, "MaxActionPoint"); piir.AddWood(wood); piir.AddFood(food); piir.AddIron(iron); piir.SetActionPointMax(actionPointMax); piir.AddActionPoint(actionPointMax); piir.TimeSinceLastSave = DateTime.Now.ToFileTime(); piir.TimeSinceLastRestoreActionPoint = 0; PlayersInRoom[enter.TokenId] = piir; } // 把本玩家记录到Room的Redis里, 便于以后查找, 这里保存的就是房间内所有的玩家的id AddPlayerIdToRedis(piir); // 玩家上线 piir.Online(args, enter, roomId); // 玩家进入以后,根据该玩家[离开游戏]的时间,到[现在]的时间差(秒),计算出应该恢复多少的行动点数, 一次性恢复之 piir.RestoreActionPointAfterLoading(); // 这段逻辑很重要: 这是要把所有房间内的玩家的代理权限交给第一个进入房间的玩家, 以后, 如果这些玩家也上线了, 则把代理权交还给真正的玩家 // 这是因为, 服务器并没有对这些玩家的逻辑进行AI处理, 而是由客户端自己来控制自己的. // 未来, 如果服务器要把AI代理权限收回来,这些地方都要做修改. if (piir.AiRights == 0 || piir.AiRights != piir.Enter.TokenId) { // 我之前曾经被别人代理过, 把代理权收回来 var piirAi = GetPlayerInRoom(piir.AiRights); if (piirAi != null && piirAi.IsOnline) { piir.AiRights = piir.Enter.TokenId; ChangeAiRightsReply output = new ChangeAiRightsReply() { RoomId = piirAi.RoomId, OwnerId = piirAi.Enter.TokenId, AiPlayerId = piir.Enter.TokenId, AiAccount = piir.Enter.Account, ControlByMe = false, Ret = true, }; ServerRoomManager.Instance.SendMsg(piirAi.Args, ROOM_REPLY.ChangeAiRightsReply, output.ToByteArray()); ServerRoomManager.Instance.Log($"RoomLogic Online OK - AI Rights of {piir.Enter.TokenId} is no longer controlled by {piir.Enter.Account}"); } else { ServerRoomManager.Instance.Log($"RoomLogic Online Error - When trying to handle the AI controlled rights, the original player is offline! {piir.Enter.Account} - {piir.Enter.Account}"); } } // 遍历所有玩家, 把所有: AI没有被代理, 且不在线的玩家, 权限都给它. 这种情况仅发生在第一个进入的玩家 foreach (var keyValue in PlayersInRoom) { var piirAi = keyValue.Value; if (piirAi.AiRights == 0) { // 我自己不需要发送此消息, 我自己的AiRights此时肯定不是0了 piirAi.AiRights = piir.Enter.TokenId; ChangeAiRightsReply output = new ChangeAiRightsReply() { RoomId = piir.RoomId, OwnerId = piir.Enter.TokenId, AiPlayerId = piirAi.Enter.TokenId, AiAccount = piirAi.Enter.Account, ControlByMe = true, Ret = true, }; ServerRoomManager.Instance.SendMsg(piir.Args, ROOM_REPLY.ChangeAiRightsReply, output.ToByteArray()); ServerRoomManager.Instance.Log($"RoomLogic Online OK - AI Rights of {piirAi.Enter.Account} belongs to {piir.Enter.Account} now!"); } } _curPlayerCount = PlayersInRoom.Count; ServerRoomManager.Instance.Log($"RoomLogic Online OK - Player entered the battlefield! Player:{piir.Enter.Account}"); // 玩家进入战场 }