123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- -- 游戏 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, session)
- -- 通知 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())
|