GuildLobbyData.lua 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. local GuildLobbyData = class('GuildLobbyData', require('DataBase'))
  2. local LRUMap = require("LRUMap")
  3. local MaxDataLimit = 2000
  4. local TimeoutLimit = 30
  5. local Contain = function(ls, item)
  6. for _, value in pairs(ls) do
  7. if value == item then
  8. return true
  9. end
  10. end
  11. return false
  12. end
  13. local Remove = function(ls, item)
  14. for i = 1, #ls do
  15. if ls[i] == item then
  16. table.remove(ls, i)
  17. -- 列表中数据不重复,不需要完全遍历, 如果需要完全遍历,请倒序遍历
  18. return
  19. end
  20. end
  21. end
  22. function GuildLobbyData:ctor()
  23. --- 获得玩家信息超时了,可能服务器抛弃了请求,需要继续请求
  24. self.timeOutGetPlayerData = nil
  25. --- 需要从服务器获得的玩家基本数据队列,table(uid)
  26. self.preGetPlayerDataQueue = {}
  27. self.playerDataMap = LRUMap.new(MaxDataLimit)
  28. end
  29. function GuildLobbyData:Clear()
  30. self.playerDataMap:Clear()
  31. for i = #self.preGetPlayerDataQueue, 1, -1 do
  32. table.remove(self.preGetPlayerDataQueue, i)
  33. end
  34. end
  35. function GuildLobbyData:Destroy()
  36. if self.Clear then
  37. self:Clear()
  38. end
  39. self:UnRegisterNetEvents()
  40. end
  41. function GuildLobbyData:RegisterNetEvents()
  42. --ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_MAP_OTHER_PLAYERS_INFO_NTF, self.OnOtherPlayerInfoNtf, self)
  43. end
  44. function GuildLobbyData:UnRegisterNetEvents()
  45. --ManagerContainer.NetManager:UnRegisterPbIdCallback(ProtoMsgId.SC_MAP_OTHER_PLAYERS_INFO_NTF)
  46. end
  47. function GuildLobbyData:OnOtherPlayerInfoNtf(msgData)
  48. LogError("[Wboy] SC_MAP_GET_OTHER_PLAYERS_INFO_NTF " .. Inspect(msgData))
  49. if not ManagerContainer.NetManager:IsErrorData(msgData) then
  50. local playerDatas = msgData.info_list
  51. for _, value in pairs(playerDatas) do
  52. local uid = value.uid
  53. -- 已获得了玩家数据,从队列中删除
  54. Remove(self.preGetPlayerDataQueue, uid)
  55. local data = self.playerDataMap:Get(uid)
  56. local playerData = {}
  57. playerData.uid = uid
  58. if data then
  59. playerData.sex = (value.sex and value.sex ~= 0) and value.sex or data.sex
  60. playerData.jobId = (value.job_id and value.job_id ~= 0) and value.job_id or data.jobId
  61. playerData.nickName = (value.nick_name and value.nick_name ~= '') and value.nick_name or data.nickName
  62. playerData.viewData = data.viewData
  63. if value.fashion_data then
  64. local viewData = ProtocalDataNormal.FashionDataToViewData(value.fashion_data)
  65. ProtocalDataNormal.UpdateViewData(playerData.viewData, viewData)
  66. end
  67. playerData.actionId = (value.action_id and value.action_id ~= 0) and value.action_id or data.actionId
  68. else
  69. playerData.sex = value.sex
  70. playerData.jobId = value.job_id
  71. playerData.nickName = value.nick_name
  72. if value.fashion_data then
  73. playerData.viewData = ProtocalDataNormal.FashionDataToViewData(value.fashion_data)
  74. end
  75. playerData.actionId = value.action_id
  76. end
  77. playerData.roleCfgId = CommonUtil.JobIdToRoleId(playerData.jobId, playerData.sex)
  78. self:AddPlayerData(playerData)
  79. -- 通知显示层更新显示
  80. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.GUILD_LOBBY_PLAYER_INFO_CHANGED, uid)
  81. end
  82. end
  83. -- 还有需要获得的用户信息,继续获得
  84. self:SendGetOtherPlayersInfo()
  85. end
  86. --- 发送消息给服务器,获得其它玩家的信息
  87. function GuildLobbyData:SendGetOtherPlayersInfo()
  88. local length = #self.preGetPlayerDataQueue
  89. if length <= 0 then
  90. return
  91. end
  92. -- 服务器规定,一次最多获取10个玩家信息
  93. if length > 10 then length = 10 end
  94. local sendUids = {}
  95. for i = 1, length do
  96. sendUids[i] = self.preGetPlayerDataQueue[i]
  97. end
  98. LogError("[Wboy] CS_MAP_GET_OTHER_PLAYERS_INFO_REQ " .. Inspect(sendUids))
  99. self.timeOutGetPlayerData = ManagerContainer.LuaTimerMgr:CurServerTime()
  100. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_MAP_GET_OTHER_PLAYERS_INFO_REQ, { player_list = sendUids })
  101. end
  102. --- 获得玩家信息
  103. ---@param uid ulong
  104. function GuildLobbyData:GetPlayerData(uid)
  105. local data = self.playerDataMap:Get(uid)
  106. if not data then
  107. if not Contain(self.preGetPlayerDataQueue, uid) then
  108. local isSending = (#self.preGetPlayerDataQueue > 0)
  109. if isSending then
  110. local time = ManagerContainer.LuaTimerMgr:CurServerTime()
  111. if self.timeOutGetPlayerData and (time - self.timeOutGetPlayerData) > TimeoutLimit then
  112. isSending = false
  113. end
  114. end
  115. table.insert(self.preGetPlayerDataQueue, uid)
  116. if not isSending then
  117. self:SendGetOtherPlayersInfo()
  118. end
  119. end
  120. end
  121. return data
  122. end
  123. --- 添加玩家信息
  124. ---@param playerData table
  125. function GuildLobbyData:AddPlayerData(playerData)
  126. self.playerDataMap:Add(playerData.uid, playerData)
  127. end
  128. function GuildLobbyData:ClearPlayerData()
  129. self.timeOutGetPlayerData = nil
  130. self.playerDataMap:Clear()
  131. self.preGetPlayerDataQueue = {}
  132. end
  133. return GuildLobbyData