BigMapData.lua 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. local BigMapData = class('BigMapData', require('DataBase'))
  2. --- 正在同步数据,需要等待数据返回
  3. --- 如果数据一直没返回,则认为服务器丢失了这个请求,则在这个时候后,还可以请求
  4. local SendCD = 5
  5. local rankProcessParam, rankProcessParam1 = 0.75, 500
  6. function BigMapData:ctor()
  7. self.data = {}
  8. end
  9. function BigMapData:Clear()
  10. self.data = {}
  11. end
  12. function BigMapData:Destroy()
  13. if self.Clear then
  14. self:Clear()
  15. end
  16. self:UnRegisterNetEvents()
  17. end
  18. function BigMapData:RegisterNetEvents()
  19. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_GET_MAP_RANK_ACK, function(data)
  20. LogError("[wboy] SC_GET_MAP_RANK_ACK = " .. Inspect(data))
  21. if ManagerContainer.NetManager:IsErrorData(data) then return end
  22. self:RefreshData(data)
  23. end)
  24. end
  25. function BigMapData:UnRegisterNetEvents()
  26. end
  27. function BigMapData:RefreshData(data)
  28. local val = GlobalConfig.Instance:GetConfigStrValue(178)
  29. if val ~= "" and val ~= nil then
  30. local t = CommonUtil.DeserializeGlobalStrToTable(val)
  31. if t and t[1] then
  32. rankProcessParam = t[1][1] and tonumber(t[1][1])*0.0001 or 0.75
  33. rankProcessParam1 = t[1][2] and tonumber(t[1][2]) or 500
  34. end
  35. end
  36. local selfRank = data.self_rank
  37. local totalRank = data.total_rank
  38. local topPlayerList = self.data.topPlayerList or {}
  39. local topPlayerChanged = false
  40. for i = 1, #data.top_player_list do
  41. local item = data.top_player_list[i]
  42. local mapLevel = item.map_level
  43. local mapId = item.map_id
  44. local brief = item.brief
  45. local uid = brief.uid
  46. local headId = brief.img_id
  47. local sex = brief.gender
  48. local headFrameId = brief.head_frame_id
  49. local jobId = brief.config_id
  50. local level = brief.level
  51. local nickName = CommonUtil.GetVaildNickName(brief.nick_name)
  52. if selfRank == i then
  53. nickName = ManagerContainer.DataMgr.UserData:GetUserNickname()
  54. end
  55. local playerInfo = topPlayerList[i]
  56. if playerInfo then
  57. if playerInfo.uid ~= uid or playerInfo.mapLevel ~= mapLevel or playerInfo.mapId ~= mapId
  58. or playerInfo.nickName ~= nickName or playerInfo.headId ~= headId or playerInfo.sex ~= sex then
  59. topPlayerChanged = true
  60. end
  61. else
  62. playerInfo = {}
  63. topPlayerList[i] = playerInfo
  64. topPlayerChanged = true
  65. end
  66. playerInfo.uid = uid
  67. playerInfo.mapLevel = mapLevel
  68. playerInfo.mapId = mapId
  69. playerInfo.nickName = nickName
  70. playerInfo.headId = headId
  71. playerInfo.sex = sex
  72. playerInfo.headFrameId = headFrameId
  73. playerInfo.jobId = jobId
  74. playerInfo.level = level
  75. end
  76. local selfRankChanged = (self.data.selfRank ~= selfRank or self.data.totalRank ~= totalRank)
  77. self.data.selfRank = selfRank
  78. self.data.totalRank = totalRank
  79. self.data.topPlayerList = topPlayerList
  80. self.data.waitTime = nil
  81. --- 自身排名变化了
  82. if selfRankChanged then
  83. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.BIGMAP_SELF_RANK_CHANGED)
  84. end
  85. --- 前几名的玩家变化了
  86. if topPlayerChanged then
  87. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.BIGMAP_TOPPLAYER_RANK_CHANGED)
  88. end
  89. end
  90. --- 获得当前玩家的排名信息
  91. ---@return integer 不为nil,说明100名内,名次
  92. ---@return number 不为nil,说明100名外,百分制
  93. function BigMapData:GetSelfRankInfo()
  94. local totalRank = self.data.totalRank
  95. local selfRank = self.data.selfRank
  96. if not totalRank or totalRank <= 0 or not selfRank or selfRank <= 0 then
  97. return nil, nil
  98. end
  99. if selfRank <= 100 then
  100. return selfRank, nil
  101. else
  102. return nil, self:GetSelfRankPercent()
  103. end
  104. end
  105. function BigMapData:GetSelfRankPercent()
  106. local totalRank = self.data.totalRank
  107. local selfRank = self.data.selfRank
  108. if selfRank == nil or totalRank == nil then
  109. return 0
  110. end
  111. --1- 实际排名 * 0.75 / MAX(总人数,500)
  112. return (1 - (selfRank*rankProcessParam)/math.max(totalRank, rankProcessParam1)) * 100
  113. end
  114. --- 获得前几名的玩家信息
  115. ---@return table[] 玩家信息数组
  116. function BigMapData:GetTopRankPlayerList()
  117. return self.data.topPlayerList
  118. end
  119. function BigMapData:SendGetData()
  120. local waitTime = self.data.waitTime
  121. local time = Time.GetTimestamp()
  122. if waitTime and (time - waitTime) < SendCD then
  123. return
  124. end
  125. self.data.waitTime = time
  126. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_GET_MAP_RANK_REQ, {})
  127. end
  128. return BigMapData