123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361 |
- ---@class UIHuntingDemonsInfo @注释
- ---@field AllRankDataList table<number,{roleInfo:{career:number, name:string, online:number, serverid:number},integral:number, rank:number, rid:number, medal:number}> @所有排行榜数据
- ---@field TheFirstThreeRankDataList table<number,UserProtos.OtherRoleInfoRes> @前三名玩家装备数据 key:名次 value:数据
- ---@field itemID number @猎魔勋章道具id(策划说写死)
- ---@field TheFirstThreeRidList table<number,number> @前三名玩家rid key:名次 value:rid
- ---@field reqOtherPlayerDataIndex number @请求其他玩家装备数据序列(前三名数据 一个个请求)
- ---@field startReqOtherPlayerData boolean @开始请求其他玩家数据
- ---@field AllPlayerIntegral number @所有玩家的积分
- ---@field AllItemCount number @所有勋章数量
- ---@field ConversionRateList table<number,{integral:number,value:number}> @转化率占比 integral:所处积分 value:占比
- ---@field RankWeightDataList table<number,{cfg:cfg_monsterHuntReward_column,itemCount:number}> @对应排名权重信息 cfg:表数据 itemCount:猎魔勋章数量
- ---@field isStartReqRankData boolean @开始请求排行榜数据(用于计时请求数据)
- UIHuntingDemonsInfo = class()
- local this = UIHuntingDemonsInfo
- function this:ctor()
- end
- function this:Init()
- self:Reset()
- self:InitData()
- self:RegistMessages()
- end
- function this:InitData()
- self.itemID = 10230001
- ---倒计时时间
- self.timeCount = tonumber(SL:GetConfig("cfg_global",27004).value)
- self:GetConversionRateRange()
- self:InitRankingIntervalWeightData()
- end
- function this:RegistMessages()
- SL:RegisterLuaNetMsg(LuaMessageIdToClient.RES_MONSTER_HUNT_RANK,self.RES_MONSTER_HUNT_RANK,self)
- SL:RegisterLuaNetMsg(LuaMessageIdToClient.RES_MONSTER_HUNT_INFO,self.RES_MONSTER_HUNT_INFO,self)
- SL:RegisterLuaNetMsg(MessageDef.ResOtherRoleInfoMessage, self.ResOtherRoleInfoMessage, self)
- end
- ---猎魔积分信息
- ---@param message {settleSec:number, resetSec:number}
- function this:RES_MONSTER_HUNT_INFO(id,message)
- if message then
- self.settleSec = message.settleSec
- self.resetSec = message.resetSec
- SL:onLUAEvent(LUA_EVENT_HUNTING_DEMONS_INFO_CHANGE)
- end
- end
- ---其他玩家数据
- function this:ResOtherRoleInfoMessage(id,message)
- if message.type == 1 and self.startReqOtherPlayerData then
- self.TheFirstThreeRankDataList[self.reqOtherPlayerDataIndex] = message
- self.reqOtherPlayerDataIndex = self.reqOtherPlayerDataIndex + 1
- ---是否还有下一个玩家数据需要请求
- self:StartReqOtherPlayerData(true)
- end
- end
- ---响应猎魔积分排行榜
- ---@param message table<number,{roleInfo:{career:number, name:string, online:number, serverid:number},integral:number, rank:number, rid:number, medal:number}>
- function this:RES_MONSTER_HUNT_RANK(id,message)
- self.AllRankDataList = {}
- self.TheFirstThreeRankDataList = {}
- self.TheFirstThreeRidList = {}
- self.reqOtherPlayerDataIndex = 1
- self.AllPlayerIntegral = 0
- if message and next(message) then
- local count = table.count(message)
- local list = {}
- for i = 1, count do
- table.insert(list,message[tostring(i)])
- end
- table.sort(list,function(a, b)
- return a.rank < b.rank
- end)
- for i = 1, count do
- local data = list[i]
- table.insert(self.AllRankDataList,data)
- if i <= 3 then
- self.TheFirstThreeRidList[i] = data.rid
- end
- end
- self:StartReqOtherPlayerData()
- end
- self:RefreshJackpotData()
- SL:onLUAEvent(LUA_EVENT_HUNTING_DEMONS_RANK_DATA_CHANGE)
- if self.isStartReqRankData then
- self.timer = SL:Schedule(self.timer,self.timeCount,self.timeCount,-1,function()
- SL:SendLuaNetMsg(LuaMessageIdToSever.REQ_MONSTER_HUNT_RANK)
- end)
- end
- end
- ---刷新奖池相关数据
- function this:RefreshJackpotData()
- ---所有玩家的权重
- local allWeight = 0
- for i, v in ipairs(self.AllRankDataList) do
- self.AllPlayerIntegral = self.AllPlayerIntegral + v.integral
- allWeight = allWeight + self:GetRankingIntervalWeight(i)
- end
- local rate = self:GetNowConversionRateRange()
- self.AllItemCount = self.AllPlayerIntegral * (rate / 10000)
- for i, v in ipairs(self.RankWeightDataList) do
- v.itemCount = 0
- if v.cfg.reward[1] > 0 and self.AllRankDataList[v.cfg.rank[1]] then
- v.itemCount = Mathf.Floor(self.AllItemCount * (v.cfg.reward[1] / allWeight))
- end
- end
- end
- ---获取转化率区间
- function this:GetConversionRateRange()
- self.ConversionRateList = {}
- ---@type cfg_global_column
- local globalCfg = SL:GetConfig("cfg_global",27001)
- local strList = string.split(globalCfg.value,'|')
- for i, v in ipairs(strList) do
- local stringList2 = string.split(v,'#')
- table.insert(self.ConversionRateList,{integral = tonumber(stringList2[1]),value = tonumber(stringList2[2])})
- end
- end
- ---获取当前积分所处的转化率
- function this:GetNowConversionRateRange()
- local rota = 10000
- for i, v in ipairs(self.ConversionRateList) do
- if self.AllPlayerIntegral >= v.integral then
- rota = v.value
- end
- end
- return rota
- end
- ---获取下一阶段的积分所处的转化率和所差积分
- function this:GetNextConversionRateRange()
- local index = 1
- ---下一阶段所差积分
- local nextDifferIntegral = nil
- for i, v in ipairs(self.ConversionRateList) do
- if self.AllPlayerIntegral >= v.integral then
- index = i + 1
- end
- end
- if self.ConversionRateList[index] then
- nextDifferIntegral = self.ConversionRateList[index].integral - self.AllPlayerIntegral
- end
- return self.ConversionRateList[index],nextDifferIntegral
- end
- ---初始化对应排名的区间权重信息
- function this:InitRankingIntervalWeightData()
- self.RankWeightDataList = {}
- local cfg = SL:GetConfigTable("cfg_monsterHuntReward")
- ---@param v cfg_monsterHuntReward_column
- for i, v in ipairs(cfg) do
- table.insert(self.RankWeightDataList,{cfg = v,itemCount = 0})
- end
- end
- ---获取对应排名的区间权重
- function this:GetRankingIntervalWeight(rank)
- for i, v in ipairs(self.RankWeightDataList) do
- if rank >= v.cfg.rank[1] and rank <= v.cfg.rank[2] then
- return v.cfg.reward[1]
- end
- end
- return 0
- end
- ---获取对应排名的勋章数量
- function this:GetRankingIntervalWeightItemCount(index)
- if not self.RankWeightDataList[index] then
- return 0
- end
- return self.RankWeightDataList[index].itemCount
- end
- ---开始请求玩家装备数据
- function this:StartReqOtherPlayerData(isEvent)
- if self.TheFirstThreeRidList[self.reqOtherPlayerDataIndex] then
- self.startReqOtherPlayerData = true
- ---自己的话不用请求
- if self.TheFirstThreeRidList[self.reqOtherPlayerDataIndex] == SL:GetMetaValue(EMetaVarGetKey.UID) then
- local equip = {}
- if SL:MeData_GetRoleExtInfo() and SL:MeData_GetRoleExtInfo().roleInfoExtData and SL:MeData_GetRoleExtInfo().roleInfoExtData.equip then
- equip = SL:MeData_GetRoleExtInfo().roleInfoExtData.equip
- end
- self.TheFirstThreeRankDataList[self.reqOtherPlayerDataIndex] = {role = {roleInfoExt = {equip=equip},career = SL:MeData_GetCareer()}}
- ---当第一个数据是自己的时候需要isEvent为true,因为第一个数据是自己的时候不会走ResOtherRoleInfoMessage协议,isEvent还是为空
- if self.reqOtherPlayerDataIndex == 1 then
- isEvent = true
- end
- self.reqOtherPlayerDataIndex = self.reqOtherPlayerDataIndex + 1
- self:StartReqOtherPlayerData(isEvent)
- return
- end
- SL.Friend:ReqOtherRoleInfoMessage(self.TheFirstThreeRidList[self.reqOtherPlayerDataIndex], 1)
- else
- self.startReqOtherPlayerData = false
- if isEvent then
- SL:onLUAEvent(LUA_EVENT_REQ_HUNTING_DEMONS_THREE_PLAYER_END)
- end
- end
- end
- ---获得猎魔积分
- ---@param monsterID number @怪物id
- function this:GetHuntingDemonsIntegral(monsterID)
- ---@type cfg_monster_column
- local monsterCfg = SL:GetConfig("cfg_monster",monsterID)
- if not SL:HasConfig("cfg_monsterHunt",monsterCfg.monsterHunt) then
- return nil
- end
- ---@type cfg_monsterHunt_column
- local monsterHuntCfg = SL:GetConfig("cfg_monsterHunt",monsterCfg.monsterHunt)
- local myLv = SL:MeData_GetLevel()
- for i, v in ipairs(monsterHuntCfg.level) do
- local minLv = v[1]
- local maxLv = v[2]
- if myLv >= minLv and myLv <= maxLv then
- return monsterHuntCfg.number[i]
- end
- end
- return nil
- end
- ---设置每个界面上的猎魔积分
- function this:SetIntegralInControl(bgControl,textControl,monsterID)
- if monsterID then
- local num = self:GetHuntingDemonsIntegral(monsterID)
- if num then
- GUI:setVisible(bgControl,true)
- GUI:Text_setString(textControl,tostring(num))
- return
- end
- end
- GUI:setVisible(bgControl,false)
- end
- ---获取前三名的数据
- ---@param index number @名次
- function this:GetTheFirstThreeRankData(index)
- return self.TheFirstThreeRankDataList[index]
- end
- ---获取排行榜某个序列的数据
- ---@param index number @序列
- function this:GetRankDataIndex(index)
- if self.AllRankDataList then
- return self.AllRankDataList[index]
- end
- end
- ---设置是否开始请求排行榜服务器数据
- function this:SetIsStartReqRankData(isStart)
- self.isStartReqRankData = isStart
- if not isStart then
- if self.timer then
- SL:UnSchedule(self.timer)
- end
- end
- end
- ---@param data UserProtos.RoleInfo
- function this:GetPlayerRoleInfo(data)
- local role_param = { "body", "head", "armor", "hand", "pants", "boot" }
- local wear_list_str = ""
- local model_list_str = ""
- local equipInfo = data.roleInfoExt.equip
- if equipInfo then
- local default_tbl = SL:GetConfig("cfg_model_default", data.career.baseCareer)
- local model_list = {}
- for _, v in pairs(role_param) do
- model_list[v] = default_tbl[v]
- end
- for _, v in ipairs(equipInfo) do
- ---@type cfg_item_column
- local itemInfo = SL:GetConfig("cfg_item", v.cfgId)
- if itemInfo and itemInfo.type == 2 then
- if itemInfo.subType == 1 then
- if wear_list_str == "" then
- wear_list_str = "WeaponRspineParent#" .. itemInfo.field[1]
- else
- wear_list_str = wear_list_str .. ",WeaponRspineParent#" .. itemInfo.field[1]
- end
- elseif itemInfo.subType == 2 then
- if wear_list_str == "" then
- wear_list_str = "WeaponLspineParent#" .. itemInfo.field[1]
- else
- wear_list_str = wear_list_str .. ",WeaponLspineParent#" .. itemInfo.field[1]
- end
- elseif itemInfo.subType == 3 then
- if wear_list_str == "" then
- wear_list_str = "WeaponRspineParent#" .. itemInfo.field[1]
- else
- wear_list_str = wear_list_str .. ",WeaponRspineParent#" .. itemInfo.field[1]
- end
- elseif itemInfo.subType == 13 then
- if wear_list_str == "" then
- wear_list_str = "Wing#" .. itemInfo.field[1]
- else
- wear_list_str = wear_list_str .. ",Wing#" .. itemInfo.field[1]
- end
- elseif itemInfo.subType == 30 then
- if wear_list_str == "" then
- wear_list_str = "BuffspineParent#" .. itemInfo.field[1]
- else
- wear_list_str = wear_list_str .. ",BuffspineParent#" .. itemInfo.field[1]
- end
- else
- local point = ""
- ---@type cfg_model_charactor_column
- local model_tbl = SL:GetConfig("cfg_model_charactor", itemInfo.field[1])
- if model_tbl then
- if model_tbl.part == 23 then
- point = "body"
- elseif model_tbl.part == 11 then
- point = "head"
- elseif model_tbl.part == 2 then
- point = "armor"
- elseif model_tbl.part == 9 then
- point = "hand"
- elseif model_tbl.part == 15 then
- point = "pants"
- elseif model_tbl.part == 5 then
- point = "boot"
- end
- if point ~= "" then
- model_list[point] = itemInfo.field[1]
- end
- end
- end
- end
- end
- for _, v in pairs(model_list) do
- if model_list_str == "" then
- model_list_str = v
- else
- model_list_str = model_list_str .. "#" .. v
- end
- end
- end
- return model_list_str, wear_list_str
- end
- function this:Reset()
- self.settleSec = 0
- self.resetSec = 0
- self.AllPlayerIntegral = 0
- self.AllItemCount = 0
- self.AllRankDataList = {}
- self.TheFirstThreeRankDataList = {}
- self.TheFirstThreeRidList = {}
- self.reqOtherPlayerDataIndex = 1
- self.startReqOtherPlayerData = false
- self:SetIsStartReqRankData(false)
- end
|