--[[ Descripttion:游戏agent管理服务 version: Author: Neo,Huang Date: 2022-07-05 17:32:01 LastEditors: Neo,Huang LastEditTime: 2022-07-05 20:21:11 --]] local skynet = require "skynet" local sharetable = require("skynet.sharetable") local agentPool = require("agentPool") local baseService = require("baseService") local hotfixHelper = require("hotfix.helper") local pool local mapUid2Agent = {} local root = {} -- 获取玩家agent function root.user_get_game_agent(uid) if mapUid2Agent[uid] then log.error("uid:%s上一次的agent地址没有释放", uid) end return pool:alloc_agent_srv(uid) end -- 玩家登陆游戏服 function root.login(uid, session) pool:bind_agent(uid, session.gameAgent) mapUid2Agent[uid] = session.gameAgent -- log.error("uid:%s登陆成功绑定agent地址:%s", uid, gSession.gameAgent) end -- 玩家退出游戏服 function root.logout(uid, session) pool:unbind_agent(uid, session.gameAgent) mapUid2Agent[uid] = nil -- log.error("uid:%s下线成功, 解绑agent地址:%s", uid, gSession.gameAgent) end function root.onStart() -- 初始化agent池 pool = agentPool.new("srvAgent", 5) end local exitCoroutine function root.onStop() local addrList = pool:get_agent_srv_addr_list() for _, addr in pairs(addrList) do skynet.send(addr, "lua", "exit") end -- 挂起退出协程 等待agent全部退出 exitCoroutine = coroutine.running() skynet.wait(exitCoroutine) end function root.exit(agent) pool:remove_agent_service(agent) -- agent全部退出 唤醒退出协程 local addrList = pool:get_agent_srv_addr_list() if #addrList <= 0 then skynet.wakeup(exitCoroutine) end end -- 更新配置表 function root.update_config(...) sharetable.update(...) local addrList = pool:get_agent_srv_addr_list() for _, addr in pairs(addrList) do skynet.send(addr, "lua", "update_config", ...) end end -- 更新逻辑 function root.update_logic(...) hotfixHelper.update(...) local addrList = pool:get_agent_srv_addr_list() for _, addr in pairs(addrList) do skynet.send(addr, "lua", "update_logic", ...) end end -- 打印 - 玩家列表 function root.print_uid_list() local addrList = pool:get_agent_srv_addr_list() for _, addr in pairs(addrList) do skynet.send(addr, "lua", "print_uid_list") end end -- 在线玩家广播消息 function root.broadcast_agents(mdl, cmd, ...) for uid, handle in pairs(mapUid2Agent) do pcall(skynet.send, handle, "lua", "doCmd", uid, mdl, cmd, ...) end end baseService.start(root, ".srvAgentMgr", true)