123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- --[[
- 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:allocation(uid)
- end
- -- 玩家登陆游戏服
- function root.login(uid, session)
- pool:bindAgent(uid, session.gameAgent)
- mapUid2Agent[uid] = session.gameAgent
- -- log.error("uid:%s登陆成功绑定agent地址:%s", uid, gSession.gameAgent)
- end
- -- 玩家退出游戏服
- function root.logout(uid, session)
- pool:unbindAgent(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)
- -- 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)
|