srvAgentMgr.lua 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. --[[
  2. Descripttion:游戏agent管理服务
  3. version:
  4. Author: Neo,Huang
  5. Date: 2022-07-05 17:32:01
  6. LastEditors: Neo,Huang
  7. LastEditTime: 2022-07-05 20:21:11
  8. --]]
  9. local skynet = require "skynet"
  10. local sharetable = require("skynet.sharetable")
  11. local agentPool = require("agentPool")
  12. local baseService = require("baseService")
  13. local hotfixHelper = require("hotfix.helper")
  14. local pool
  15. local mapUid2Agent = {}
  16. local root = {}
  17. -- 获取玩家agent
  18. function root.user_get_game_agent(uid)
  19. if mapUid2Agent[uid] then
  20. log.error("uid:%s上一次的agent地址没有释放", uid)
  21. end
  22. return pool:alloc_agent_srv(uid)
  23. end
  24. -- 玩家登陆游戏服
  25. function root.login(uid, session)
  26. pool:bind_agent(uid, session.gameAgent)
  27. mapUid2Agent[uid] = session.gameAgent
  28. -- log.error("uid:%s登陆成功绑定agent地址:%s", uid, gSession.gameAgent)
  29. end
  30. -- 玩家退出游戏服
  31. function root.logout(uid, session)
  32. pool:unbind_agent(uid, session.gameAgent)
  33. mapUid2Agent[uid] = nil
  34. -- log.error("uid:%s下线成功, 解绑agent地址:%s", uid, gSession.gameAgent)
  35. end
  36. function root.onStart()
  37. -- 初始化agent池
  38. pool = agentPool.new("srvAgent", 5)
  39. end
  40. local exitCoroutine
  41. function root.onStop()
  42. local addrList = pool:get_agent_srv_addr_list()
  43. for _, addr in pairs(addrList) do
  44. skynet.send(addr, "lua", "exit")
  45. end
  46. -- 挂起退出协程 等待agent全部退出
  47. exitCoroutine = coroutine.running()
  48. skynet.wait(exitCoroutine)
  49. end
  50. function root.exit(agent)
  51. pool:remove_agent_service(agent)
  52. -- agent全部退出 唤醒退出协程
  53. local addrList = pool:get_agent_srv_addr_list()
  54. if #addrList <= 0 then
  55. skynet.wakeup(exitCoroutine)
  56. end
  57. end
  58. -- 更新配置表
  59. function root.update_config(...)
  60. sharetable.update(...)
  61. local addrList = pool:get_agent_srv_addr_list()
  62. for _, addr in pairs(addrList) do
  63. skynet.send(addr, "lua", "update_config", ...)
  64. end
  65. end
  66. -- 更新逻辑
  67. function root.update_logic(...)
  68. hotfixHelper.update(...)
  69. local addrList = pool:get_agent_srv_addr_list()
  70. for _, addr in pairs(addrList) do
  71. skynet.send(addr, "lua", "update_logic", ...)
  72. end
  73. end
  74. -- 打印 - 玩家列表
  75. function root.print_uid_list()
  76. local addrList = pool:get_agent_srv_addr_list()
  77. for _, addr in pairs(addrList) do
  78. skynet.send(addr, "lua", "print_uid_list")
  79. end
  80. end
  81. -- 在线玩家广播消息
  82. function root.broadcast_agents(mdl, cmd, ...)
  83. for uid, handle in pairs(mapUid2Agent) do
  84. pcall(skynet.send, handle, "lua", "doCmd", uid, mdl, cmd, ...)
  85. end
  86. end
  87. baseService.start(root, ".srvAgentMgr", true)