SessionService.Role.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. using DeepCore;
  2. using DeepMMO.Data;
  3. using DeepMMO.Protocol.Client;
  4. using DeepCrystal.RPC;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Threading.Tasks;
  8. using DeepCrystal.ORM.Generic;
  9. using DeepMMO.Server.Logic;
  10. namespace DeepMMO.Server.Connect
  11. {
  12. //---------------------------------------------------------------------------------------
  13. //处理角色相关逻辑.
  14. //---------------------------------------------------------------------------------------
  15. public partial class SessionService
  16. {
  17. [RpcHandler(typeof(ClientCreateRoleRequest), typeof(ClientCreateRoleResponse), ServerNames.ConnectServerType)]
  18. public virtual async Task<ClientCreateRoleResponse> client_rpc_Handle(ClientCreateRoleRequest req)
  19. {
  20. try
  21. {
  22. var serverID = await accountSave.LoadFieldAsync<string>(nameof(AccountData.lastLoginServerID));
  23. var privilege = await accountSave.LoadFieldAsync<RolePrivilege>(nameof(AccountData.privilege));
  24. var accountData = accountSave.Data;
  25. var roleIDMap = accountRoleSnapSave.Data.roleIDMap;
  26. if (roleIDMap == null)
  27. {
  28. roleIDMap = new HashMap<string, RoleIDSnap>();
  29. }
  30. int roleCount = 0;
  31. foreach (var item in roleIDMap)
  32. {
  33. if (item.Value.serverID == serverID)
  34. {
  35. roleCount++;
  36. }
  37. }
  38. if (roleCount >= RPGServerTemplateManager.Instance.GetRoleMaxCount())//该服下账号是否达到创建上限.
  39. {
  40. return new ClientCreateRoleResponse() { s2c_code = ClientCreateRoleResponse.CODE_CREATE_ROLE_LIMIT };
  41. }
  42. else if (RPGServerTemplateManager.Instance.IsBlackWord(req.c2s_name))
  43. {
  44. return new ClientCreateRoleResponse() { s2c_code = ClientCreateRoleResponse.CODE_BLACK_NAME };
  45. }
  46. else if (!RPGServerPersistenceManager.Instance.CheckRoleName(req.c2s_name))
  47. {
  48. //名字异常,长度不符合规范
  49. return new ClientCreateRoleResponse() { s2c_code = ClientCreateRoleResponse.CODE_CREATE_ROLE_INVAILD };
  50. }
  51. // 创建纯数据
  52. var roleData = RPGServerTemplateManager.Instance.CreateRoleData(req, accountID, serverID);
  53. //用户权限.
  54. roleData.privilege = privilege;
  55. if (roleData == null)
  56. {
  57. return new ClientCreateRoleResponse() { s2c_code = ClientCreateRoleResponse.CODE_TEMPLATE_NOT_EXIST };
  58. }
  59. var digitID = await RPGServerPersistenceManager.Instance.TryRegistRoleNameMappingAsync(roleData.uuid, roleData.name, this);
  60. if (digitID == null)
  61. {
  62. return new ClientCreateRoleResponse() { s2c_code = ClientCreateRoleResponse.CODE_NAME_ALREADY_EXIST };
  63. }
  64. roleData.digitID = digitID;
  65. // Role数据映射
  66. var snapData = await RPGServerPersistenceManager.Instance.CreateRoleDataAsync(roleData, this);
  67. var roleIDSnap = RPGServerTemplateManager.Instance.CreateRoleIDSnapData(roleData);
  68. roleIDMap.Add(roleIDSnap.roleUUID, roleIDSnap);
  69. accountRoleSnapSave.SetField(nameof(AccountRoleSnap.roleIDMap), roleIDMap);
  70. await accountRoleSnapSave.FlushAsync();
  71. //单区内角色记录
  72. var serverRoleIDSet = RPGServerPersistenceManager.Instance.GetServerRoleIDMappingSet(this, roleData.server_id);
  73. await serverRoleIDSet.AddRoleIDAsync(roleData.uuid);
  74. var ret = new ClientCreateRoleResponse()
  75. {
  76. s2c_role = snapData
  77. };
  78. //网络协议接口日志//
  79. //log.Log(ret);
  80. //BI创角记录.
  81. RPGServerPersistenceManager.Instance.SaveBICreateRoleInfo(log, roleData, Channel, remote_log_service);
  82. return ret;
  83. }
  84. catch (Exception err)
  85. {
  86. log.Error(string.Format("ClientCreateRoleRequest Handle Error:account = {0} msg = {1} ", accountID, err.Message), err);
  87. return (new ClientCreateRoleResponse()
  88. {
  89. s2c_code = ClientCreateRoleResponse.CODE_ERROR,
  90. s2c_msg = err.Message
  91. });
  92. }
  93. }
  94. [RpcHandler(typeof(ClientGetRandomNameRequest), typeof(ClientGetRandomNameResponse), ServerNames.ConnectServerType)]
  95. public virtual Task<ClientGetRandomNameResponse> client_rpc_Handle(ClientGetRandomNameRequest req)
  96. {
  97. try
  98. {
  99. var rd = RPGServerTemplateManager.Instance.GetRoleTemplate(req.c2s_role_template_id, req.c2s_role_gender);
  100. if (rd != null)
  101. {
  102. //获取随机名字方法.
  103. return Task.FromResult(new ClientGetRandomNameResponse()
  104. {
  105. s2c_name = RPGServerTemplateManager.Instance.RandomName(rd)
  106. });
  107. }
  108. else
  109. {
  110. return Task.FromResult(new ClientGetRandomNameResponse() { s2c_code = ClientCreateRoleResponse.CODE_ERROR, });
  111. }
  112. }
  113. catch (Exception err)
  114. {
  115. log.ErrorFormat("ClientGetRandomNameRequest Handle Error:account = {0} msg = {1} ", accountID, err.Message);
  116. return Task.FromResult(new ClientGetRandomNameResponse() { s2c_code = ClientCreateRoleResponse.CODE_ERROR, s2c_msg = err.Message });
  117. }
  118. }
  119. [RpcHandler(typeof(ClientGetRolesRequest), typeof(ClientGetRolesResponse), ServerNames.ConnectServerType)]
  120. public virtual async Task<ClientGetRolesResponse> client_rpc_Handle(ClientGetRolesRequest req)
  121. {
  122. try
  123. {
  124. var serverID = await accountSave.LoadFieldAsync<string>(nameof(AccountData.lastLoginServerID));
  125. var accountData = accountSave.Data;
  126. var roleIDMap = accountRoleSnapSave.Data.roleIDMap;
  127. // using (var saveAcc = PersistenceFactory.Instance.Get<AccountData>(null, accountID))
  128. if (roleIDMap != null && roleIDMap.Count > 0)
  129. {
  130. List<RoleSnap> ret = new List<RoleSnap>();
  131. foreach (var item in roleIDMap)
  132. {
  133. if (item.Value.serverID == serverID)
  134. {
  135. var snap = await queryRoleSnap.LoadDataAsync(item.Value.roleUUID);
  136. if (snap != null && snap.server_id == serverID)
  137. {
  138. ret.Add(snap);
  139. }
  140. }
  141. }
  142. return (new ClientGetRolesResponse()
  143. {
  144. s2c_code = ClientGetRolesResponse.CODE_OK,
  145. s2c_roles = ret
  146. });
  147. }
  148. else
  149. {
  150. return (new ClientGetRolesResponse() { s2c_code = ClientGetRolesResponse.CODE_OK });
  151. }
  152. }
  153. catch (Exception err)
  154. {
  155. log.ErrorFormat("ClientGetRolesRequest Handle Error:account = {0} msg = {1} ", accountID, err.Message);
  156. return (new ClientGetRolesResponse() { s2c_code = ClientGetRolesResponse.CODE_ERROR, s2c_msg = err.Message });
  157. }
  158. }
  159. [RpcHandler(typeof(ClientDeleteRoleRequest), typeof(ClientDeleteRoleResponse), ServerNames.ConnectServerType)]
  160. public virtual async Task<ClientDeleteRoleResponse> client_rpc_Handle(ClientDeleteRoleRequest req)
  161. {
  162. try
  163. {
  164. if (string.IsNullOrEmpty(req.c2s_role_uuid))
  165. {
  166. return (new ClientDeleteRoleResponse() { s2c_code = ClientDeleteRoleResponse.CODE_ROLEID_INVAILD });
  167. }
  168. else
  169. {
  170. var roleIDMap = accountRoleSnapSave.Data.roleIDMap;
  171. if (roleIDMap.Remove(req.c2s_role_uuid))
  172. {
  173. accountRoleSnapSave.SetMappingField(nameof(AccountRoleSnap.roleIDMap), roleIDMap);
  174. await accountRoleSnapSave.FlushAsync();
  175. await RPGServerPersistenceManager.Instance.DeleteRoleDataAsync(req.c2s_role_uuid, this);
  176. return (new ClientDeleteRoleResponse());
  177. }
  178. else
  179. {
  180. return (new ClientDeleteRoleResponse() { s2c_code = ClientDeleteRoleResponse.CODE_ROLEID_INVAILD });
  181. }
  182. }
  183. }
  184. catch (Exception err)
  185. {
  186. log.ErrorFormat("ClientDeleteRoleRequest Handle Error:account = {0} msg = {1} ", accountID, err.Message);
  187. return (new ClientDeleteRoleResponse() { s2c_code = ClientDeleteRoleResponse.CODE_ERROR, s2c_msg = err.Message });
  188. }
  189. }
  190. }
  191. // public class ClientDeleteRoleLog
  192. // {
  193. // public string account;
  194. // public string c2s_role_uuid;
  195. // }
  196. }