UIHuntingDemonsInfo.lua 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. ---@class UIHuntingDemonsInfo @注释
  2. ---@field AllRankDataList table<number,{roleInfo:{career:number, name:string, online:number, serverid:number},integral:number, rank:number, rid:number, medal:number}> @所有排行榜数据
  3. ---@field TheFirstThreeRankDataList table<number,UserProtos.OtherRoleInfoRes> @前三名玩家装备数据 key:名次 value:数据
  4. ---@field itemID number @猎魔勋章道具id(策划说写死)
  5. ---@field TheFirstThreeRidList table<number,number> @前三名玩家rid key:名次 value:rid
  6. ---@field reqOtherPlayerDataIndex number @请求其他玩家装备数据序列(前三名数据 一个个请求)
  7. ---@field startReqOtherPlayerData boolean @开始请求其他玩家数据
  8. ---@field AllPlayerIntegral number @所有玩家的积分
  9. ---@field AllItemCount number @所有勋章数量
  10. ---@field ConversionRateList table<number,{integral:number,value:number}> @转化率占比 integral:所处积分 value:占比
  11. ---@field RankWeightDataList table<number,{cfg:cfg_monsterHuntReward_column,itemCount:number}> @对应排名权重信息 cfg:表数据 itemCount:猎魔勋章数量
  12. ---@field isStartReqRankData boolean @开始请求排行榜数据(用于计时请求数据)
  13. UIHuntingDemonsInfo = class()
  14. local this = UIHuntingDemonsInfo
  15. function this:ctor()
  16. end
  17. function this:Init()
  18. self:Reset()
  19. self:InitData()
  20. self:RegistMessages()
  21. end
  22. function this:InitData()
  23. self.itemID = 10230001
  24. ---倒计时时间
  25. self.timeCount = tonumber(SL:GetConfig("cfg_global",27004).value)
  26. self:GetConversionRateRange()
  27. self:InitRankingIntervalWeightData()
  28. end
  29. function this:RegistMessages()
  30. SL:RegisterLuaNetMsg(LuaMessageIdToClient.RES_MONSTER_HUNT_RANK,self.RES_MONSTER_HUNT_RANK,self)
  31. SL:RegisterLuaNetMsg(LuaMessageIdToClient.RES_MONSTER_HUNT_INFO,self.RES_MONSTER_HUNT_INFO,self)
  32. SL:RegisterLuaNetMsg(MessageDef.ResOtherRoleInfoMessage, self.ResOtherRoleInfoMessage, self)
  33. end
  34. ---猎魔积分信息
  35. ---@param message {settleSec:number, resetSec:number}
  36. function this:RES_MONSTER_HUNT_INFO(id,message)
  37. if message then
  38. self.settleSec = message.settleSec
  39. self.resetSec = message.resetSec
  40. SL:onLUAEvent(LUA_EVENT_HUNTING_DEMONS_INFO_CHANGE)
  41. end
  42. end
  43. ---其他玩家数据
  44. function this:ResOtherRoleInfoMessage(id,message)
  45. if message.type == 1 and self.startReqOtherPlayerData then
  46. self.TheFirstThreeRankDataList[self.reqOtherPlayerDataIndex] = message
  47. self.reqOtherPlayerDataIndex = self.reqOtherPlayerDataIndex + 1
  48. ---是否还有下一个玩家数据需要请求
  49. self:StartReqOtherPlayerData(true)
  50. end
  51. end
  52. ---响应猎魔积分排行榜
  53. ---@param message table<number,{roleInfo:{career:number, name:string, online:number, serverid:number},integral:number, rank:number, rid:number, medal:number}>
  54. function this:RES_MONSTER_HUNT_RANK(id,message)
  55. self.AllRankDataList = {}
  56. self.TheFirstThreeRankDataList = {}
  57. self.TheFirstThreeRidList = {}
  58. self.reqOtherPlayerDataIndex = 1
  59. self.AllPlayerIntegral = 0
  60. if message and next(message) then
  61. local count = table.count(message)
  62. local list = {}
  63. for i = 1, count do
  64. table.insert(list,message[tostring(i)])
  65. end
  66. table.sort(list,function(a, b)
  67. return a.rank < b.rank
  68. end)
  69. for i = 1, count do
  70. local data = list[i]
  71. table.insert(self.AllRankDataList,data)
  72. if i <= 3 then
  73. self.TheFirstThreeRidList[i] = data.rid
  74. end
  75. end
  76. self:StartReqOtherPlayerData()
  77. end
  78. self:RefreshJackpotData()
  79. SL:onLUAEvent(LUA_EVENT_HUNTING_DEMONS_RANK_DATA_CHANGE)
  80. if self.isStartReqRankData then
  81. self.timer = SL:Schedule(self.timer,self.timeCount,self.timeCount,-1,function()
  82. SL:SendLuaNetMsg(LuaMessageIdToSever.REQ_MONSTER_HUNT_RANK)
  83. end)
  84. end
  85. end
  86. ---刷新奖池相关数据
  87. function this:RefreshJackpotData()
  88. ---所有玩家的权重
  89. local allWeight = 0
  90. for i, v in ipairs(self.AllRankDataList) do
  91. self.AllPlayerIntegral = self.AllPlayerIntegral + v.integral
  92. allWeight = allWeight + self:GetRankingIntervalWeight(i)
  93. end
  94. local rate = self:GetNowConversionRateRange()
  95. self.AllItemCount = self.AllPlayerIntegral * (rate / 10000)
  96. for i, v in ipairs(self.RankWeightDataList) do
  97. v.itemCount = 0
  98. if v.cfg.reward[1] > 0 and self.AllRankDataList[v.cfg.rank[1]] then
  99. v.itemCount = Mathf.Floor(self.AllItemCount * (v.cfg.reward[1] / allWeight))
  100. end
  101. end
  102. end
  103. ---获取转化率区间
  104. function this:GetConversionRateRange()
  105. self.ConversionRateList = {}
  106. ---@type cfg_global_column
  107. local globalCfg = SL:GetConfig("cfg_global",27001)
  108. local strList = string.split(globalCfg.value,'|')
  109. for i, v in ipairs(strList) do
  110. local stringList2 = string.split(v,'#')
  111. table.insert(self.ConversionRateList,{integral = tonumber(stringList2[1]),value = tonumber(stringList2[2])})
  112. end
  113. end
  114. ---获取当前积分所处的转化率
  115. function this:GetNowConversionRateRange()
  116. local rota = 10000
  117. for i, v in ipairs(self.ConversionRateList) do
  118. if self.AllPlayerIntegral >= v.integral then
  119. rota = v.value
  120. end
  121. end
  122. return rota
  123. end
  124. ---获取下一阶段的积分所处的转化率和所差积分
  125. function this:GetNextConversionRateRange()
  126. local index = 1
  127. ---下一阶段所差积分
  128. local nextDifferIntegral = nil
  129. for i, v in ipairs(self.ConversionRateList) do
  130. if self.AllPlayerIntegral >= v.integral then
  131. index = i + 1
  132. end
  133. end
  134. if self.ConversionRateList[index] then
  135. nextDifferIntegral = self.ConversionRateList[index].integral - self.AllPlayerIntegral
  136. end
  137. return self.ConversionRateList[index],nextDifferIntegral
  138. end
  139. ---初始化对应排名的区间权重信息
  140. function this:InitRankingIntervalWeightData()
  141. self.RankWeightDataList = {}
  142. local cfg = SL:GetConfigTable("cfg_monsterHuntReward")
  143. ---@param v cfg_monsterHuntReward_column
  144. for i, v in ipairs(cfg) do
  145. table.insert(self.RankWeightDataList,{cfg = v,itemCount = 0})
  146. end
  147. end
  148. ---获取对应排名的区间权重
  149. function this:GetRankingIntervalWeight(rank)
  150. for i, v in ipairs(self.RankWeightDataList) do
  151. if rank >= v.cfg.rank[1] and rank <= v.cfg.rank[2] then
  152. return v.cfg.reward[1]
  153. end
  154. end
  155. return 0
  156. end
  157. ---获取对应排名的勋章数量
  158. function this:GetRankingIntervalWeightItemCount(index)
  159. if not self.RankWeightDataList[index] then
  160. return 0
  161. end
  162. return self.RankWeightDataList[index].itemCount
  163. end
  164. ---开始请求玩家装备数据
  165. function this:StartReqOtherPlayerData(isEvent)
  166. if self.TheFirstThreeRidList[self.reqOtherPlayerDataIndex] then
  167. self.startReqOtherPlayerData = true
  168. ---自己的话不用请求
  169. if self.TheFirstThreeRidList[self.reqOtherPlayerDataIndex] == SL:GetMetaValue(EMetaVarGetKey.UID) then
  170. local equip = {}
  171. if SL:MeData_GetRoleExtInfo() and SL:MeData_GetRoleExtInfo().roleInfoExtData and SL:MeData_GetRoleExtInfo().roleInfoExtData.equip then
  172. equip = SL:MeData_GetRoleExtInfo().roleInfoExtData.equip
  173. end
  174. self.TheFirstThreeRankDataList[self.reqOtherPlayerDataIndex] = {role = {roleInfoExt = {equip=equip},career = SL:MeData_GetCareer()}}
  175. ---当第一个数据是自己的时候需要isEvent为true,因为第一个数据是自己的时候不会走ResOtherRoleInfoMessage协议,isEvent还是为空
  176. if self.reqOtherPlayerDataIndex == 1 then
  177. isEvent = true
  178. end
  179. self.reqOtherPlayerDataIndex = self.reqOtherPlayerDataIndex + 1
  180. self:StartReqOtherPlayerData(isEvent)
  181. return
  182. end
  183. SL.Friend:ReqOtherRoleInfoMessage(self.TheFirstThreeRidList[self.reqOtherPlayerDataIndex], 1)
  184. else
  185. self.startReqOtherPlayerData = false
  186. if isEvent then
  187. SL:onLUAEvent(LUA_EVENT_REQ_HUNTING_DEMONS_THREE_PLAYER_END)
  188. end
  189. end
  190. end
  191. ---获得猎魔积分
  192. ---@param monsterID number @怪物id
  193. function this:GetHuntingDemonsIntegral(monsterID)
  194. ---@type cfg_monster_column
  195. local monsterCfg = SL:GetConfig("cfg_monster",monsterID)
  196. if not SL:HasConfig("cfg_monsterHunt",monsterCfg.monsterHunt) then
  197. return nil
  198. end
  199. ---@type cfg_monsterHunt_column
  200. local monsterHuntCfg = SL:GetConfig("cfg_monsterHunt",monsterCfg.monsterHunt)
  201. local myLv = SL:MeData_GetLevel()
  202. for i, v in ipairs(monsterHuntCfg.level) do
  203. local minLv = v[1]
  204. local maxLv = v[2]
  205. if myLv >= minLv and myLv <= maxLv then
  206. return monsterHuntCfg.number[i]
  207. end
  208. end
  209. return nil
  210. end
  211. ---设置每个界面上的猎魔积分
  212. function this:SetIntegralInControl(bgControl,textControl,monsterID)
  213. if monsterID then
  214. local num = self:GetHuntingDemonsIntegral(monsterID)
  215. if num then
  216. GUI:setVisible(bgControl,true)
  217. GUI:Text_setString(textControl,tostring(num))
  218. return
  219. end
  220. end
  221. GUI:setVisible(bgControl,false)
  222. end
  223. ---获取前三名的数据
  224. ---@param index number @名次
  225. function this:GetTheFirstThreeRankData(index)
  226. return self.TheFirstThreeRankDataList[index]
  227. end
  228. ---获取排行榜某个序列的数据
  229. ---@param index number @序列
  230. function this:GetRankDataIndex(index)
  231. if self.AllRankDataList then
  232. return self.AllRankDataList[index]
  233. end
  234. end
  235. ---设置是否开始请求排行榜服务器数据
  236. function this:SetIsStartReqRankData(isStart)
  237. self.isStartReqRankData = isStart
  238. if not isStart then
  239. if self.timer then
  240. SL:UnSchedule(self.timer)
  241. end
  242. end
  243. end
  244. ---@param data UserProtos.RoleInfo
  245. function this:GetPlayerRoleInfo(data)
  246. local role_param = { "body", "head", "armor", "hand", "pants", "boot" }
  247. local wear_list_str = ""
  248. local model_list_str = ""
  249. local equipInfo = data.roleInfoExt.equip
  250. if equipInfo then
  251. local default_tbl = SL:GetConfig("cfg_model_default", data.career.baseCareer)
  252. local model_list = {}
  253. for _, v in pairs(role_param) do
  254. model_list[v] = default_tbl[v]
  255. end
  256. for _, v in ipairs(equipInfo) do
  257. ---@type cfg_item_column
  258. local itemInfo = SL:GetConfig("cfg_item", v.cfgId)
  259. if itemInfo and itemInfo.type == 2 then
  260. if itemInfo.subType == 1 then
  261. if wear_list_str == "" then
  262. wear_list_str = "WeaponRspineParent#" .. itemInfo.field[1]
  263. else
  264. wear_list_str = wear_list_str .. ",WeaponRspineParent#" .. itemInfo.field[1]
  265. end
  266. elseif itemInfo.subType == 2 then
  267. if wear_list_str == "" then
  268. wear_list_str = "WeaponLspineParent#" .. itemInfo.field[1]
  269. else
  270. wear_list_str = wear_list_str .. ",WeaponLspineParent#" .. itemInfo.field[1]
  271. end
  272. elseif itemInfo.subType == 3 then
  273. if wear_list_str == "" then
  274. wear_list_str = "WeaponRspineParent#" .. itemInfo.field[1]
  275. else
  276. wear_list_str = wear_list_str .. ",WeaponRspineParent#" .. itemInfo.field[1]
  277. end
  278. elseif itemInfo.subType == 13 then
  279. if wear_list_str == "" then
  280. wear_list_str = "Wing#" .. itemInfo.field[1]
  281. else
  282. wear_list_str = wear_list_str .. ",Wing#" .. itemInfo.field[1]
  283. end
  284. elseif itemInfo.subType == 30 then
  285. if wear_list_str == "" then
  286. wear_list_str = "BuffspineParent#" .. itemInfo.field[1]
  287. else
  288. wear_list_str = wear_list_str .. ",BuffspineParent#" .. itemInfo.field[1]
  289. end
  290. else
  291. local point = ""
  292. ---@type cfg_model_charactor_column
  293. local model_tbl = SL:GetConfig("cfg_model_charactor", itemInfo.field[1])
  294. if model_tbl then
  295. if model_tbl.part == 23 then
  296. point = "body"
  297. elseif model_tbl.part == 11 then
  298. point = "head"
  299. elseif model_tbl.part == 2 then
  300. point = "armor"
  301. elseif model_tbl.part == 9 then
  302. point = "hand"
  303. elseif model_tbl.part == 15 then
  304. point = "pants"
  305. elseif model_tbl.part == 5 then
  306. point = "boot"
  307. end
  308. if point ~= "" then
  309. model_list[point] = itemInfo.field[1]
  310. end
  311. end
  312. end
  313. end
  314. end
  315. for _, v in pairs(model_list) do
  316. if model_list_str == "" then
  317. model_list_str = v
  318. else
  319. model_list_str = model_list_str .. "#" .. v
  320. end
  321. end
  322. end
  323. return model_list_str, wear_list_str
  324. end
  325. function this:Reset()
  326. self.settleSec = 0
  327. self.resetSec = 0
  328. self.AllPlayerIntegral = 0
  329. self.AllItemCount = 0
  330. self.AllRankDataList = {}
  331. self.TheFirstThreeRankDataList = {}
  332. self.TheFirstThreeRidList = {}
  333. self.reqOtherPlayerDataIndex = 1
  334. self.startReqOtherPlayerData = false
  335. self:SetIsStartReqRankData(false)
  336. end