using Milimoe.FunGame.Core.Api.Transmittal; using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Exception; using Milimoe.FunGame.Core.Model; using Milimoe.FunGame.Desktop.Library; using Milimoe.FunGame.Desktop.Model; using Milimoe.FunGame.Desktop.UI; namespace Milimoe.FunGame.Desktop.Controller { public class MainController(Main Main) { private readonly Session Usercfg = RunTime.Session; private readonly DataRequest ChatRequest = RunTime.NewLongRunningDataRequest(DataRequestType.Main_Chat); private readonly DataRequest CreateRoomRequest = RunTime.NewLongRunningDataRequest(DataRequestType.Main_CreateRoom); private readonly DataRequest MatchRoomRequest = RunTime.NewLongRunningDataRequest(DataRequestType.Main_MatchRoom); private readonly DataRequest GetRoomPlayerCountRequest = RunTime.NewLongRunningDataRequest(DataRequestType.Room_GetRoomPlayerCount); private readonly DataRequest UpdateRoomRequest = RunTime.NewLongRunningDataRequest(DataRequestType.Main_UpdateRoom); private readonly DataRequest IntoRoomRequest = RunTime.NewLongRunningDataRequest(DataRequestType.Main_IntoRoom); private readonly DataRequest QuitRoomRequest = RunTime.NewLongRunningDataRequest(DataRequestType.Main_QuitRoom); private readonly DataRequest SetReadyRequest = RunTime.NewLongRunningDataRequest(DataRequestType.Main_Ready); private readonly DataRequest CancelReadyRequest = RunTime.NewLongRunningDataRequest(DataRequestType.Main_CancelReady); private readonly DataRequest StartGameRequest = RunTime.NewLongRunningDataRequest(DataRequestType.Main_StartGame); #region 公开方法 public void MainController_Disposed() { ChatRequest.Dispose(); CreateRoomRequest.Dispose(); GetRoomPlayerCountRequest.Dispose(); UpdateRoomRequest.Dispose(); IntoRoomRequest.Dispose(); QuitRoomRequest.Dispose(); SetReadyRequest.Dispose(); CancelReadyRequest.Dispose(); StartGameRequest.Dispose(); } public async Task LogOutAsync() { try { // 需要当时登录给的Key发回去,确定是账号本人在操作才允许登出 if (Usercfg.LoginKey != Guid.Empty) { DataRequest request = RunTime.NewDataRequest(DataRequestType.RunTime_Logout); request.AddRequestData("key", Usercfg.LoginKey); await request.SendRequestAsync(); if (request.Result == RequestResult.Success) { string msg = ""; Guid key = Guid.Empty; msg = request.GetResult("msg") ?? ""; key = request.GetResult("key"); if (key == Usercfg.LoginKey) { Usercfg.LoginKey = Guid.Empty; Main.UpdateUI(MainInvokeType.LogOut, msg ?? ""); return true; } } } throw new CanNotLogOutException(); } catch (Exception e) { Main.ShowMessage(ShowMessageType.Error, "无法登出您的账号,请联系服务器管理员。", "登出失败", 5); Main.GetMessage(e.GetErrorInfo()); } return false; } public async Task IntoRoomAsync(Room room) { try { IntoRoomRequest.AddRequestData("roomid", room.Roomid); await IntoRoomRequest.SendRequestAsync(); if (IntoRoomRequest.Result == RequestResult.Success) { return IntoRoomRequest.GetResult("result"); } throw new CanNotIntoRoomException(); } catch (Exception e) { Main.GetMessage(e.GetErrorInfo(), TimeType.None); return false; } } public async Task UpdateRoomAsync() { bool result = false; try { List list = []; await UpdateRoomRequest.SendRequestAsync(); if (UpdateRoomRequest.Result == RequestResult.Success) { list = UpdateRoomRequest.GetResult>("rooms") ?? []; Main.UpdateUI(MainInvokeType.UpdateRoom, list); } else throw new CanNotIntoRoomException(); } catch (Exception e) { Main.GetMessage(e.GetErrorInfo(), TimeType.None); } return result; } public async Task GetRoomPlayerCountAsync(string roomid) { try { GetRoomPlayerCountRequest.AddRequestData("roomid", roomid); await GetRoomPlayerCountRequest.SendRequestAsync(); return GetRoomPlayerCountRequest.GetResult("count"); } catch (Exception e) { Main.GetMessage(e.GetErrorInfo(), TimeType.None); return 0; } } public async Task SetReadyAsync(string roomid) { try { bool result = true; SetReadyRequest.AddRequestData("roomid", roomid); await SetReadyRequest.SendRequestAsync(); if (SetReadyRequest.Result == RequestResult.Success) { result = SetReadyRequest.GetResult("result"); if (result) { Config.FunGame_isInRoom = true; Main.GetMessage("[ " + Usercfg.LoginUser.Username + " ] 准备完毕。"); } List ReadyPlayerList = SetReadyRequest.GetResult>("ready") ?? []; if (ReadyPlayerList.Count > 0) Main.GetMessage("已准备的玩家:" + string.Join(", ", ReadyPlayerList.Select(u => u.Username))); List NotReadyPlayerList = SetReadyRequest.GetResult>("notready") ?? []; if (NotReadyPlayerList.Count > 0) Main.GetMessage("仍未准备的玩家:" + string.Join(", ", NotReadyPlayerList.Select(u => u.Username))); } return result; } catch (Exception e) { Main.GetMessage(e.GetErrorInfo(), TimeType.None); return false; } } public async Task CancelReadyAsync(string roomid) { try { bool result = true; CancelReadyRequest.AddRequestData("roomid", roomid); await CancelReadyRequest.SendRequestAsync(); if (CancelReadyRequest.Result == RequestResult.Success) { result = CancelReadyRequest.GetResult("result"); if (result) { Config.FunGame_isInRoom = false; Main.GetMessage("[ " + Usercfg.LoginUser.Username + " ] 已取消准备。"); } List ReadyPlayerList = CancelReadyRequest.GetResult>("ready") ?? []; if (ReadyPlayerList.Count > 0) Main.GetMessage("已准备的玩家:" + string.Join(", ", ReadyPlayerList.Select(u => u.Username))); List NotReadyPlayerList = CancelReadyRequest.GetResult>("notready") ?? []; if (NotReadyPlayerList.Count > 0) Main.GetMessage("仍未准备的玩家:" + string.Join(", ", NotReadyPlayerList.Select(u => u.Username))); } return result; } catch (Exception e) { Main.GetMessage(e.GetErrorInfo(), TimeType.None); return false; } } public async Task QuitRoomAsync(string roomid, bool isMaster) { bool result = false; try { QuitRoomRequest.AddRequestData("roomid", roomid); QuitRoomRequest.AddRequestData("isMaster", isMaster); await QuitRoomRequest.SendRequestAsync(); if (QuitRoomRequest.Result == RequestResult.Success) { result = QuitRoomRequest.GetResult("result"); if (result) { Usercfg.InRoom = General.HallInstance; return result; } } throw new QuitRoomException(); } catch (Exception e) { Main.GetMessage(e.GetErrorInfo(), TimeType.None); return result; } } public async Task CreateRoomAsync(RoomType roomType, string gameModuleServer, string gameMap, bool isRank, int maxUsers, string password = "") { Room room = General.HallInstance; try { CreateRoomRequest.AddRequestData("roomtype", roomType); CreateRoomRequest.AddRequestData("gamemoduleserver", gameModuleServer); CreateRoomRequest.AddRequestData("gamemap", gameMap); CreateRoomRequest.AddRequestData("master", Usercfg.LoginUser); CreateRoomRequest.AddRequestData("password", password); CreateRoomRequest.AddRequestData("isrank", isRank); CreateRoomRequest.AddRequestData("maxusers", maxUsers); await CreateRoomRequest.SendRequestAsync(); if (CreateRoomRequest.Result == RequestResult.Success) { room = CreateRoomRequest.GetResult("room") ?? room; } } catch (Exception e) { Main.GetMessage(e.GetErrorInfo(), TimeType.None); } return room; } public async Task MatchRoomAsync(RoomType roomType, bool isCancel = false) { bool result = false; try { MatchRoomRequest.AddRequestData("roomtype", roomType); MatchRoomRequest.AddRequestData("matcher", Usercfg.LoginUser); MatchRoomRequest.AddRequestData("iscancel", isCancel); await MatchRoomRequest.SendRequestAsync(); if (MatchRoomRequest.Result == RequestResult.Success) { result = MatchRoomRequest.GetResult("result"); } } catch (Exception e) { Main.GetMessage(e.GetErrorInfo(), TimeType.None); } return result; } public async Task ChatAsync(string msg) { try { ChatRequest.AddRequestData("msg", msg); await ChatRequest.SendRequestAsync(); if (ChatRequest.Result == RequestResult.Success) { return true; } throw new CanNotSendTalkException(); } catch (Exception e) { Main.GetMessage(e.GetErrorInfo(), TimeType.None); return false; } } public async Task StartGameAsync(string roomid, bool isMaster) { try { StartGameRequest.AddRequestData("roomid", roomid); StartGameRequest.AddRequestData("isMaster", isMaster); await StartGameRequest.SendRequestAsync(); if (StartGameRequest.Result == RequestResult.Success) { return StartGameRequest.GetResult("result"); } } catch (Exception e) { Main.GetMessage(e.GetErrorInfo(), TimeType.None); } return false; } #endregion } }