srvAgent.lua 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. -- 游戏 agent 服务
  2. local skynet = require "skynet"
  3. local code = require "code"
  4. local jmService = require "jmService"
  5. local nodeUtil = require("utils.nodeUtil")
  6. local lib_queue = require("lib_queue")
  7. local util_event = require("utils.util_event")
  8. local roleMgr = (require "roleMgr").new()
  9. local mapItf2Module = {}
  10. local root = {
  11. mapUid2Agent = {}
  12. }
  13. -- 登录
  14. function root.login(uid, session)
  15. cs(uid)(roleMgr.login_role, roleMgr, uid, gSession)
  16. -- 通知 agentmgr
  17. skynet.call(".srvAgentMgr", "lua", "login", uid, session)
  18. nodeUtil:user_master_band_node(uid)
  19. return true
  20. end
  21. -- 登出
  22. function root.logout(uid, session)
  23. cs(uid)(roleMgr.logout_role, roleMgr, uid)
  24. skynet.call(".srvAgentMgr", "lua", "logout", uid, session)
  25. nodeUtil:user_master_unband_node(uid)
  26. return true
  27. end
  28. -- 回应请求协议
  29. local function l_c2s_response(uid, protoName, errCode, res, ...)
  30. res = res or {}
  31. res.code = errCode
  32. local role = roleMgr:get_role_obj(uid)
  33. if not role or role.gateNode == nil or role.gateAgent == nil then
  34. return
  35. end
  36. nodeUtil:send_to_node(role.gateNode, role.gateAgent, "c2s_response", uid, protoName, res, ...)
  37. end
  38. -- 格式化协议
  39. local function l_get_interface_and_func(protoName)
  40. -- return protoName:match "([^_]*)_(.*)"
  41. local data = string.split(protoName, "_")
  42. local itfName = data[1]
  43. return itfName, protoName
  44. end
  45. -- 获取接口对象
  46. local function l_get_interface_module(itfName)
  47. local fileName = string.format("interface.%s", itfName)
  48. mapItf2Module[itfName] = mapItf2Module[itfName] or require(fileName)
  49. return mapItf2Module[itfName]
  50. end
  51. -- 处理客户端协议数据
  52. function root.c2s_forward(uid, protoName, args, ...)
  53. local role = roleMgr:get_role_obj(uid)
  54. if role == nil then
  55. log.warning("c2s_forward not find role! uid:%s", uid)
  56. return l_c2s_response(uid, protoName, code.INNER_SERVER_ERROR)
  57. end
  58. local itfName, funcName = l_get_interface_and_func(protoName)
  59. local itfModule = l_get_interface_module(itfName)
  60. if itfModule == nil then
  61. log.error("dont find module ! itfName:%s, funcName:%s", itfName, funcName)
  62. return l_c2s_response(uid, protoName, code.INNER_SERVER_ERROR, nil, ...)
  63. end
  64. local func = itfModule[funcName]
  65. if not func then
  66. log.error("dont find func ! itfName:%s, funcName:%s", itfName, funcName)
  67. return l_c2s_response(uid, protoName, code.INNER_SERVER_ERROR, nil, ...)
  68. end
  69. local ok, errCode, rs =
  70. xpcall(
  71. func,
  72. function()
  73. skynet.error(debug.traceback())
  74. end,
  75. itfModule,
  76. role,
  77. args
  78. )
  79. if not ok then
  80. log.error(string.format("itfName:%s, funcName:%s, args:%s", itfName, funcName, tostring(args)))
  81. return l_c2s_response(uid, protoName, code.INNER_SERVER_ERROR, nil, ...)
  82. end
  83. l_c2s_response(uid, protoName, errCode, rs, ...)
  84. -- 协议处理完后进行处理
  85. local afterFuncName = string.format("after_%s", funcName)
  86. local afterFunc = itfModule[afterFuncName]
  87. if not afterFunc then
  88. return
  89. end
  90. ok, errCode, rs =
  91. xpcall(
  92. afterFunc,
  93. function()
  94. skynet.error(debug.traceback())
  95. end,
  96. itfModule,
  97. role,
  98. args
  99. )
  100. if not ok then
  101. log.error(string.format("after itfName:%s, funcName:%s, args:%s", itfName, funcName, tostring(args)))
  102. return
  103. end
  104. end
  105. function root.doCmd(uid, itfName, cmd, args)
  106. local role = roleMgr:get_role_obj(uid)
  107. if not role then
  108. log.error("doCmd uid[%s] role nil", tostring(uid))
  109. return
  110. end
  111. local itfModule = l_get_interface_module(itfName)
  112. if itfModule == nil then
  113. log.error("doCmd dont find module ! itfName:%s, cmd:%s", itfName, cmd)
  114. return 400
  115. end
  116. local func = itfModule[cmd]
  117. if not func then
  118. log.error("doCmd dont find func ! itfName:%s, cmd:%s", itfName, cmd)
  119. return 401
  120. end
  121. local ok, errCode, rs =
  122. xpcall(
  123. func,
  124. function()
  125. skynet.error(debug.traceback())
  126. end,
  127. role,
  128. args
  129. )
  130. if not ok then
  131. log.error(string.format("doCmd itfName:%s, cmd:%s, args:%s", itfName, cmd, tostring(args)))
  132. return
  133. end
  134. return errCode, rs
  135. end
  136. -- 玩家事件
  137. function root.user_trigge_event(uid, eventId, evtParams)
  138. log.debug("user_trigge_event uid[%s] eventId[%s] eventParams[%s]", uid, eventId, tostring(evtParams))
  139. lib_queue.critical_section(uid)(util_event.user_event, util_event, uid, eventId, evtParams)
  140. end
  141. -- 启动服务
  142. function root.onStart()
  143. return true
  144. end
  145. -- 服务关闭
  146. function root.onStop()
  147. -- 向agent管理服务发送退出成功消息
  148. skynet.send(".srvAgentMgr", "lua", "exit", skynet.self())
  149. return true
  150. end
  151. function root.recycle()
  152. skynet.exit()
  153. end
  154. -- 更新配置表
  155. function root.update_config(...)
  156. jmService.update_config(...)
  157. util_event:init()
  158. end
  159. -- 更新逻辑
  160. function root.update_logic(...)
  161. jmService.update_logic(...)
  162. util_event:init()
  163. end
  164. -- 在线玩家数
  165. function root.get_player_count()
  166. local count = 0
  167. for _, v in pairs(roleMgr.get_role_obj_list()) do
  168. count = count + 1
  169. end
  170. return count
  171. end
  172. -- 打印 - 玩家列表
  173. function root.print_uid_list()
  174. local uidList = {}
  175. for uid, _ in pairs(roleMgr.get_role_obj_list()) do
  176. table.insert(uidList, uid)
  177. end
  178. log.warning("print_uid_list uidList:%s", tostring(uidList))
  179. end
  180. jmService.start(root, "srvAgent_" .. skynet.self())