481 lines
12 KiB
Lua
481 lines
12 KiB
Lua
local BountyData = class("BountyData", BaseData)
|
|
|
|
function BountyData:ctor()
|
|
self.startTime = 0
|
|
self.endTime = 0
|
|
-- 当前赛季数据
|
|
self.season = 0
|
|
self.level = 1
|
|
self.exp = 0
|
|
self.todayExp = 0
|
|
self.receivedRewards = {}
|
|
self.unlockPro = {}
|
|
-- 上次赛季数据,如果已付费则可领奖
|
|
self.previousSeason = 1
|
|
self.previousLevel = 1
|
|
self.previousExp = 0
|
|
self.previousReceivedRewards = {}
|
|
self.previousUnlockPro = {}
|
|
|
|
self.data.isDirty = false
|
|
end
|
|
|
|
function BountyData:setDirty()
|
|
self.data.isDirty = not self.data.isDirty
|
|
end
|
|
|
|
function BountyData:clear()
|
|
self.startTime = 0
|
|
self.endTime = 0
|
|
-- 当前赛季数据
|
|
self.season = 0
|
|
self.level = 1
|
|
self.exp = 0
|
|
self.todayExp = 0
|
|
self.receivedRewards = {}
|
|
self.unlockPro = {}
|
|
-- 上次赛季数据,如果已付费则可领奖
|
|
self.previousSeason = 1
|
|
self.previousLevel = 1
|
|
self.previousExp = 0
|
|
self.previousReceivedRewards = {}
|
|
self.previousUnlockPro = {}
|
|
|
|
DataManager:unregisterCrossDayFunc("BountyData")
|
|
DataManager:unregisterTryOpenFunc("BountyData")
|
|
end
|
|
|
|
function BountyData:init(data)
|
|
data = data or {}
|
|
if EDITOR_MODE then
|
|
Logger.logHighlight("战令数据")
|
|
Logger.printTable(data)
|
|
end
|
|
|
|
self.startTime = data.open_at or 0-- 本赛季开启时间
|
|
self.endTime = self.startTime + self:getCycleDay() * 86400
|
|
-- 战令数据
|
|
self.season = data.season or self:getMaxSeason()
|
|
self.level = data.level or 1
|
|
self.exp = data.exp or 0
|
|
self.todayExp = data.today_exp or 0
|
|
-- 领奖状态
|
|
self.receivedRewards = {}
|
|
self.receivedRewards[GConst.BountyConst.REWARD_GEAR.FREE] = data.claimed or 0
|
|
self.receivedRewards[GConst.BountyConst.REWARD_GEAR.PRO_1] = data.pro_claimed or 0
|
|
self.receivedRewards[GConst.BountyConst.REWARD_GEAR.PRO_2] = data.pro2_claimed or 0
|
|
-- 解锁状态
|
|
self.unlockPro = {}
|
|
self.unlockPro[GConst.BountyConst.REWARD_GEAR.PRO_1] = data.bought or false
|
|
self.unlockPro[GConst.BountyConst.REWARD_GEAR.PRO_2] = data.bought2 or false
|
|
-- 上赛季
|
|
local previousBounty = data.previous or {}
|
|
self.previousSeason = previousBounty.season or 1
|
|
self.previousLevel = previousBounty.level or 1
|
|
self.previousExp = previousBounty.exp or 0
|
|
self.previousReceivedRewards = {}
|
|
self.previousReceivedRewards[GConst.BountyConst.REWARD_GEAR.FREE] = previousBounty.claimed or 0
|
|
self.previousReceivedRewards[GConst.BountyConst.REWARD_GEAR.PRO_1] = previousBounty.pro_claimed or 0
|
|
self.previousReceivedRewards[GConst.BountyConst.REWARD_GEAR.PRO_2] = previousBounty.pro2_claimed or 0
|
|
self.previousUnlockPro = {}
|
|
self.previousUnlockPro[GConst.BountyConst.REWARD_GEAR.PRO_1] = previousBounty.bought or false
|
|
self.previousUnlockPro[GConst.BountyConst.REWARD_GEAR.PRO_2] = previousBounty.bought2 or false
|
|
|
|
self:initConfig()
|
|
self:fixLevel()
|
|
|
|
self:setDirty()
|
|
DataManager:registerCrossDayFunc("BountyData", function()
|
|
self.todayExp = 0
|
|
self:checkSeasonChange()
|
|
self:setDirty()
|
|
end)
|
|
-- 如果功能未开启 注册功能开启监听
|
|
if not self:isOpen() then
|
|
DataManager:registerTryOpenFunc("BountyData", function()
|
|
if not self:isOpen(false, true) then
|
|
return
|
|
end
|
|
DataManager:unregisterTryOpenFunc("BountyData")
|
|
|
|
if EDITOR_MODE then
|
|
Logger.logHighlight("战令功能开启")
|
|
end
|
|
|
|
self.startTime = Time:getDayBeginTimeStamp()
|
|
self.endTime = self.startTime + self:getCycleDay() * 86400
|
|
-- 战令数据
|
|
self.season = self:getMaxSeason()
|
|
self.level = 1
|
|
self.exp = 0
|
|
self.todayExp = 0
|
|
-- 领奖状态
|
|
self.receivedRewards = {}
|
|
-- 解锁状态
|
|
self.unlockPro = {}
|
|
-- 上赛季
|
|
self.previousSeason = 0
|
|
self.previousLevel = 0
|
|
self.previousExp = 0
|
|
self.previousReceivedRewards = {}
|
|
self.previousUnlockPro = {}
|
|
|
|
self:initConfig()
|
|
|
|
self:setDirty()
|
|
end)
|
|
end
|
|
end
|
|
|
|
-- 检查赛季改变(周期结束)
|
|
function BountyData:checkSeasonChange()
|
|
if not self:isOpen() then
|
|
return
|
|
end
|
|
if self:getRemainTime() > 0 then
|
|
return
|
|
end
|
|
|
|
self.startTime = self.endTime
|
|
self.endTime = self.startTime + self:getCycleDay() * 86400
|
|
|
|
self.previousSeason = self.season
|
|
self.previousLevel = self.level
|
|
self.previousExp = self.exp
|
|
self.previousReceivedRewards = self.receivedRewards
|
|
self.previousUnlockPro = self.unlockPro
|
|
|
|
self.season = math.min(self.season + 1, self:getMaxSeason())
|
|
self.level = 1
|
|
self.exp = 0
|
|
self.receivedRewards = {}
|
|
self.unlockPro = {}
|
|
|
|
self:initConfig()
|
|
end
|
|
|
|
-- 服务器的等级不设上限,需要客户端修订
|
|
function BountyData:fixLevel()
|
|
if self.level > self:getMaxLv() then
|
|
self.level = self:getMaxLv()
|
|
end
|
|
end
|
|
|
|
-- 是否开启
|
|
function BountyData:isOpen(showToast, noCheckTime)
|
|
if GFunc.isShenhe() then
|
|
return false
|
|
end
|
|
-- if not GFunc.IsGotServerTime() then
|
|
-- return false
|
|
-- end
|
|
if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.BOUNTY, not showToast) then
|
|
return false
|
|
end
|
|
-- if not noCheckTime and (self:getStartTime() <= 0 or self:getEndTime() <= 0) then
|
|
-- return false
|
|
-- end
|
|
|
|
return true
|
|
end
|
|
|
|
-- 获取开始时间
|
|
function BountyData:getStartTime()
|
|
return self.startTime or 0
|
|
end
|
|
|
|
-- 获取结束时间
|
|
function BountyData:getEndTime()
|
|
return self.endTime or 0
|
|
end
|
|
|
|
-- 获取赛季剩余时间
|
|
function BountyData:getRemainTime()
|
|
return self:getEndTime() - Time:getServerTime()
|
|
end
|
|
|
|
function BountyData:showRedPoint()
|
|
if not self:isOpen() then
|
|
return false
|
|
end
|
|
if self:canGetRewards() then
|
|
return true
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
function BountyData:getMaxSeason()
|
|
local maxSeason = 0
|
|
for id, data in pairs(ConfigManager:getConfig("bounty_level")) do
|
|
maxSeason = math.max(maxSeason, data.season)
|
|
end
|
|
return maxSeason
|
|
end
|
|
|
|
function BountyData:initConfig()
|
|
self.configList = {}
|
|
for id, data in pairs(ConfigManager:getConfig("bounty_level")) do
|
|
if data.season == self:getSeason() then
|
|
data.id = id
|
|
table.insert(self.configList, data)
|
|
end
|
|
end
|
|
table.sort(self.configList, function (a, b)
|
|
return a.id < b.id
|
|
end)
|
|
end
|
|
|
|
-- 最大赛季
|
|
function BountyData:getMaxSeason()
|
|
if self.maxSeason == nil then
|
|
self.maxSeason = 1
|
|
for id, data in pairs(ConfigManager:getConfig("bounty_level")) do
|
|
if data.season > self.maxSeason then
|
|
self.maxSeason = data.season
|
|
end
|
|
end
|
|
end
|
|
return self.maxSeason
|
|
end
|
|
|
|
-- 最大等级
|
|
function BountyData:getMaxLv()
|
|
return #self.configList
|
|
end
|
|
|
|
-- 获取升级所需经验
|
|
function BountyData:getLvUpExp()
|
|
if self:getLevel() >= self:getMaxLv() then
|
|
return 0
|
|
end
|
|
local curCfg = self.configList[self:getLevel()]
|
|
return curCfg.exp
|
|
end
|
|
|
|
-- 获取奖励
|
|
function BountyData:getReward(type, lv)
|
|
local cfg = self.configList[lv]
|
|
if type == GConst.BountyConst.REWARD_GEAR.FREE then
|
|
return cfg.reward
|
|
elseif type == GConst.BountyConst.REWARD_GEAR.PRO_1 then
|
|
return cfg.reward_pro
|
|
elseif type == GConst.BountyConst.REWARD_GEAR.PRO_2 then
|
|
return cfg.reward_pro_max
|
|
end
|
|
end
|
|
|
|
-- 获取循环时间
|
|
function BountyData:getCycleDay()
|
|
return GFunc.getConstIntValue("bounty_duration")
|
|
end
|
|
|
|
-- 获取每日最高所获经验
|
|
function BountyData:getDailyMaxExp()
|
|
return GFunc.getConstIntValue("bounty_daily_limit")
|
|
end
|
|
|
|
-- 获取经验兑换比例
|
|
function BountyData:getExpRatio()
|
|
return GFunc.getConstIntValue("bounty_point")
|
|
end
|
|
|
|
-- 获取高级奖励礼包id
|
|
function BountyData:getProRewardGiftId(type)
|
|
return GConst.BountyConst.ACT_GIFT_IDS[type]
|
|
end
|
|
|
|
function BountyData:getSeason()
|
|
return self.season -- 测试
|
|
end
|
|
|
|
function BountyData:getLevel()
|
|
return self.level
|
|
end
|
|
|
|
function BountyData:getExp()
|
|
return self.exp
|
|
end
|
|
|
|
-- 今日已获得经验
|
|
function BountyData:getTodayExp()
|
|
return self.todayExp
|
|
end
|
|
|
|
-- 获取已领取奖励等级
|
|
function BountyData:getReceivedLevel(type)
|
|
return self.receivedRewards[type] or 0
|
|
end
|
|
|
|
-- 获取奖励解锁状态
|
|
function BountyData:isUnlockReward(type)
|
|
if not self:isOpen() then
|
|
return false
|
|
end
|
|
if type == GConst.BountyConst.REWARD_GEAR.FREE then
|
|
return true
|
|
end
|
|
return self.unlockPro[type] or false
|
|
end
|
|
|
|
-- 获取上赛季等级
|
|
function BountyData:getPreviousLevel()
|
|
return self.previousLevel or 0
|
|
end
|
|
|
|
-- 获取上赛季
|
|
function BountyData:getPreviousSeason()
|
|
return self.previousSeason or 0
|
|
end
|
|
|
|
-- 获取上赛季领奖等级
|
|
function BountyData:getPreviousReceivedLevel(type)
|
|
return self.previousReceivedRewards[type] or 0
|
|
end
|
|
|
|
-- 获取上赛季解锁状态
|
|
function BountyData:isPreviousUnlock(type)
|
|
if type == GConst.BountyConst.REWARD_GEAR.FREE then
|
|
return true
|
|
end
|
|
return self.previousUnlockPro[type] or false
|
|
end
|
|
|
|
function BountyData:getMoveIdx()
|
|
local minLevel = self:getLevel()
|
|
for k, gear in pairs(GConst.BountyConst.REWARD_GEAR) do
|
|
if self:isUnlockReward(gear) then
|
|
local lv = self:getReceivedLevel(gear) + 1
|
|
minLevel = minLevel > lv and lv or minLevel
|
|
end
|
|
end
|
|
return minLevel
|
|
end
|
|
|
|
-- 是否已领取奖励
|
|
function BountyData:isReceivedReward(type, level)
|
|
return self:getReceivedLevel(type) >= level
|
|
end
|
|
|
|
-- 是否可领奖励
|
|
function BountyData:canClaimReward(type, level)
|
|
if self:isReceivedReward(type, level) then
|
|
return false
|
|
end
|
|
if not self:isUnlockReward(type) then
|
|
return false
|
|
end
|
|
|
|
return self:getLevel() >= level
|
|
end
|
|
|
|
-- 是否可领取这赛季奖励
|
|
function BountyData:canGetRewards()
|
|
if self:getLevel() > self:getReceivedLevel(GConst.BountyConst.REWARD_GEAR.FREE) then
|
|
return true
|
|
end
|
|
if self:isUnlockReward(GConst.BountyConst.REWARD_GEAR.PRO_1) and self:getLevel() > self:getReceivedLevel(GConst.BountyConst.REWARD_GEAR.PRO_1) then
|
|
return true
|
|
end
|
|
if self:isUnlockReward(GConst.BountyConst.REWARD_GEAR.PRO_2) and self:getLevel() > self:getReceivedLevel(GConst.BountyConst.REWARD_GEAR.PRO_2) then
|
|
return true
|
|
end
|
|
end
|
|
|
|
-- 是否可领取上赛季奖励
|
|
function BountyData:canGetPreviousRewards()
|
|
if self:getPreviousLevel() > self:getPreviousReceivedLevel(GConst.BountyConst.REWARD_GEAR.FREE) then
|
|
return true
|
|
end
|
|
if self:isPreviousUnlock(GConst.BountyConst.REWARD_GEAR.PRO_1) and self:getPreviousLevel() > self:getPreviousReceivedLevel(GConst.BountyConst.REWARD_GEAR.PRO_1) then
|
|
return true
|
|
end
|
|
if self:isPreviousUnlock(GConst.BountyConst.REWARD_GEAR.PRO_2) and self:getPreviousLevel() > self:getPreviousReceivedLevel(GConst.BountyConst.REWARD_GEAR.PRO_2) then
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
-- 解锁高级奖励
|
|
function BountyData:onUnlockPro(season, type)
|
|
if self:getSeason() == season then
|
|
self.unlockPro[type] = true
|
|
elseif self:getPreviousSeason() == season then
|
|
self.previousUnlockPro[type] = true
|
|
end
|
|
self:setDirty()
|
|
end
|
|
|
|
-- 领取所有可领取的奖励
|
|
function BountyData:onClaimAllRewards()
|
|
self.receivedRewards[GConst.BountyConst.REWARD_GEAR.FREE] = self:getLevel()
|
|
if self:isUnlockReward(GConst.BountyConst.REWARD_GEAR.PRO_1) then
|
|
self.receivedRewards[GConst.BountyConst.REWARD_GEAR.PRO_1] = self:getLevel()
|
|
end
|
|
if self:isUnlockReward(GConst.BountyConst.REWARD_GEAR.PRO_2) then
|
|
self.receivedRewards[GConst.BountyConst.REWARD_GEAR.PRO_2] = self:getLevel()
|
|
end
|
|
self:setDirty()
|
|
end
|
|
|
|
-- 领取遗留战令奖励
|
|
function BountyData:onGotBountyPreviousReward()
|
|
self.previousReceivedRewards[GConst.BountyConst.REWARD_GEAR.FREE] = self.previousLevel
|
|
if self:isPreviousUnlock(GConst.BountyConst.REWARD_GEAR.PRO_1) then
|
|
self.previousReceivedRewards[GConst.BountyConst.REWARD_GEAR.PRO_1] = self.previousLevel
|
|
end
|
|
if self:isPreviousUnlock(GConst.BountyConst.REWARD_GEAR.PRO_2) then
|
|
self.previousReceivedRewards[GConst.BountyConst.REWARD_GEAR.PRO_2] = self.previousLevel
|
|
end
|
|
self:setDirty()
|
|
end
|
|
|
|
-- 增加战令经验
|
|
function BountyData:addBountyExp(num)
|
|
if not self:isOpen() then
|
|
return
|
|
end
|
|
|
|
local exp = num * self:getExpRatio()
|
|
self.exp = self.exp + exp
|
|
self.todayExp = self.todayExp + exp
|
|
|
|
local isLvUp = false
|
|
if self.exp >= self:getLvUpExp() then
|
|
self.exp = self.exp - self:getLvUpExp()
|
|
self.level = self.level + 1
|
|
isLvUp = true
|
|
end
|
|
-- 修订满级
|
|
if self:getLevel() >= self:getMaxLv() then
|
|
self.exp = 0
|
|
self.level = self:getMaxLv()
|
|
end
|
|
|
|
if EDITOR_MODE then
|
|
Logger.logHighlight("战令增加经验:" .. exp)
|
|
Logger.logHighlight(" 当前等级:" .. self.level .. " 当前经验:" .. self.exp .. "今日获得经验:" .. self.todayExp .. "是否升级:" .. tostring(isLvUp))
|
|
end
|
|
|
|
BIReport:postBountyOpt(BIReport.BOUNTY_OPT.EXP_UP)
|
|
if isLvUp then
|
|
BIReport:postBountyOpt(BIReport.BOUNTY_OPT.LV_UP, BIReport.BOUNTY_LV_UP_TYPE.EXP)
|
|
end
|
|
|
|
self:setDirty()
|
|
end
|
|
|
|
function BountyData:getAllRewards(type)
|
|
local rewards = {}
|
|
for k, v in pairs(self.configList) do
|
|
local reward = self:getReward(type,v.level)
|
|
if rewards[reward.id] then
|
|
rewards[reward.id].num = rewards[reward.id].num + reward.num
|
|
else
|
|
rewards[reward.id] = {num = reward.num}
|
|
end
|
|
end
|
|
return rewards
|
|
end
|
|
|
|
return BountyData |