-- 游戏 agent 服务 local skynet = require "skynet" local queue = require "skynet.queue" local code = require "code" local baseService = require "baseService" local nodeUtil = require("utils.nodeUtil") local lib_queue = require("lib_queue") local util_event = require("utils.util_event") local roleMgr = (require "roleMgr").new() local mapItf2Module = {} local queues = {} local function cs(uid) local q = queues[uid] if not q then q = queue() queues[uid] = q end return q end local root = { mapUid2Agent = {} } -- 登录 function root.login(uid, session) cs(uid)(roleMgr.login_role, roleMgr, uid, gSession) -- 通知 agentmgr skynet.call(".srvAgentMgr", "lua", "login", uid, session) nodeUtil:user_master_band_node(uid) return true end -- 登出 function root.logout(uid, session) cs(uid)(roleMgr.logout_role, roleMgr, uid) skynet.call(".srvAgentMgr", "lua", "logout", uid, session) nodeUtil:user_master_unband_node(uid) return true end -- 回应请求协议 local function l_c2s_response(uid, protoName, errCode, res, ...) res = res or {} res.code = errCode local role = roleMgr:get_role_obj(uid) if not role or role.gateNode == nil or role.gateAgent == nil then return end nodeUtil:send_to_node(role.gateNode, role.gateAgent, "c2s_response", uid, protoName, res, ...) end -- 格式化协议 local function l_get_interface_and_func(protoName) -- return protoName:match "([^_]*)_(.*)" local data = string.split(protoName, "_") local itfName = data[1] return itfName, protoName end -- 获取接口对象 local function l_get_interface_module(itfName) local fileName = string.format("interface.%s", itfName) mapItf2Module[itfName] = mapItf2Module[itfName] or require(fileName) return mapItf2Module[itfName] end -- 处理客户端协议数据 function root.c2s_forward(uid, protoName, args, ...) local role = roleMgr:get_role_obj(uid) if role == nil then log.warning("c2s_forward not find role! uid:%s", uid) return l_c2s_response(uid, protoName, code.INNER_SERVER_ERROR) end local itfName, funcName = l_get_interface_and_func(protoName) local itfModule = l_get_interface_module(itfName) if itfModule == nil then log.error("dont find module ! itfName:%s, funcName:%s", itfName, funcName) return l_c2s_response(uid, protoName, code.INNER_SERVER_ERROR, nil, ...) end local func = itfModule[funcName] if not func then log.error("dont find func ! itfName:%s, funcName:%s", itfName, funcName) return l_c2s_response(uid, protoName, code.INNER_SERVER_ERROR, nil, ...) end local ok, errCode, rs = xpcall( func, function() skynet.error(debug.traceback()) end, itfModule, role, args ) if not ok then log.error(string.format("itfName:%s, funcName:%s, args:%s", itfName, funcName, tostring(args))) return l_c2s_response(uid, protoName, code.INNER_SERVER_ERROR, nil, ...) end l_c2s_response(uid, protoName, errCode, rs, ...) -- 协议处理完后进行处理 local afterFuncName = string.format("after_%s", funcName) local afterFunc = itfModule[afterFuncName] if not afterFunc then return end ok, errCode, rs = xpcall( afterFunc, function() skynet.error(debug.traceback()) end, itfModule, role, args ) if not ok then log.error(string.format("after itfName:%s, funcName:%s, args:%s", itfName, funcName, tostring(args))) return end end function root.doCmd(uid, itfName, cmd, args) local role = roleMgr:get_role_obj(uid) if not role then log.error("doCmd uid[%s] role nil", tostring(uid)) return end local itfModule = l_get_interface_module(itfName) if itfModule == nil then log.error("doCmd dont find module ! itfName:%s, cmd:%s", itfName, cmd) return 400 end local func = itfModule[cmd] if not func then log.error("doCmd dont find func ! itfName:%s, cmd:%s", itfName, cmd) return 401 end local ok, errCode, rs = xpcall( func, function() skynet.error(debug.traceback()) end, role, args ) if not ok then log.error(string.format("doCmd itfName:%s, cmd:%s, args:%s", itfName, cmd, tostring(args))) return end return errCode, rs end -- 玩家事件 function root.user_trigge_event(uid, eventId, evtParams) log.debug("user_trigge_event uid[%s] eventId[%s] eventParams[%s]", uid, eventId, tostring(evtParams)) lib_queue.critical_section(uid)(util_event.user_event, util_event, uid, eventId, evtParams) end -- 启动服务 function root.onStart() return true end -- 服务关闭 function root.onStop() -- 向agent管理服务发送退出成功消息 skynet.send(".srvAgentMgr", "lua", "exit", skynet.self()) return true end function root.recycle() skynet.exit() end -- 更新配置表 function root.update_config(...) baseService.update_config(...) util_event:init() end -- 更新逻辑 function root.update_logic(...) baseService.update_logic(...) util_event:init() end -- 在线玩家数 function root.get_player_count() local count = 0 for _, v in pairs(roleMgr.get_role_obj_list()) do count = count + 1 end return count end -- 打印 - 玩家列表 function root.print_uid_list() local uidList = {} for uid, _ in pairs(roleMgr.get_role_obj_list()) do table.insert(uidList, uid) end log.warning("print_uid_list uidList:%s", tostring(uidList)) end baseService.start(root, "srvAgent_" .. skynet.self())