RoleTimeReset.lua 5.19 KB
local RoleTimeReset = {}

RoleTimeReset.bind = function (Role)

-- 重置内容 对应 GlobalVar TimeReset
local ResetFunc = {}
ResetFunc["CrossDay"] = function(self, notify, response, now)
	self:setProperty("dTask", {})
	self.activity:checkActivityStatus(now, true, notify)

	self.dailyData:refreshDailyData(notify)
	self.dinerData:refreshDailyData(notify)
	self.activity:refreshDailyData(notify)
	self.storeData:onCrossDay()

	self:incrProperty("lday", 1)
	self:advRandomSupportEffect(not notify)

	self:checkExpireItem(not notify)
	local advMine = self:getProperty("advMine")
	if advMine[1] then
		advMine[1].co = nil
	end
	self:setProperty("advMine", advMine)

	local ltime = self:getProperty("ltime")
	if isCrossMonth(ltime, now) then
		self.storeData:resetStoreReored(3)		--商店跨月重置 time_reset表关联id 
	end

	-- 检查回归者
	if ltime ~= 0 and (now - ltime) >= 86400 * globalCsv.returner_time then
		self:checkReturner()
	end

	-- 检查 夜间打工
	local workBattle = self:getProperty("workBattle")
	local need = {}
	for i = 1, 5 do
		if workBattle[i] == 1 then
			need[#need + 1] = workBattle.round * 10 + i
		end
	end
	local change = false
	if next(need) then
		local ret = redisproxy:hmget(WORK_BATTLE_COUNT, table.unpack(need))
		for idx, v in ipairs(need) do
			local ctype = v % 10
			local ccount = tonum(ret[idx])
			local workMainCsv = csvdb["work_mainCsv"][ctype]
			if ccount >= workMainCsv.target_num then 
				self:sendMail(workMainCsv.email, nil, workMainCsv.phase_award)
			end
			workBattle[ctype] = -1
		end
		change = true
	end
	local newRound = math.floor((now - START_RESET_TIME) / 604800)
	if newRound ~= workBattle.round then
		workBattle = {round = newRound}
		change = true
	end
	if change then
		self:setProperty("workBattle", workBattle)
		response.workBattle = workBattle
	end

	response.dTask = {}
	response.advSup = self:getProperty("advSup")
	self:log("onLogin")
end

ResetFunc["CrossWeek"] = function(self, notify, response)
	local advMine = self:getProperty("advMine")
	if advMine[2] then
		advMine[2].co = nil
	end
	self:setProperties({
		wTask =  {}, 
		dinerS = {},
		advMine = advMine,
	})

	response.wTask = {}
	response.dinerS = {}

	self.activity:refreshWeekData(notify)

	-- 跨周送一些道具
	local BnousReward = self:getBnousPvpTicket()
	if next(BnousReward) then
		local reward, change = self:award(BnousReward, {log = {desc = "towerBnous"}})
	end
end


ResetFunc["DinerRank"] = function(self, notify, response)
	self.dinerData:rankResetData(notify)
end

ResetFunc["PvpShop"] = function(self, notify, response)
	self:setProperty("pvpShop", {})
	response.pvpShop = {}
end

ResetFunc["PvpCross"] = function(self, notify, response)
	self:setProperty("pvpBet", {})
end


function Role:updateTimeReset(now, notify)
	local timeReset = self:getProperty("timeReset")

	local passTime = now - START_RESET_TIME

	local needResetId = {}
	for resetId, resetData in pairs(csvdb["time_resetCsv"]) do
		if resetData.interval > 0 then
			local curRound = math.floor((passTime - resetData.start) / resetData.interval)
			if not timeReset[resetId] or curRound ~= timeReset[resetId] then
				needResetId[resetId] = curRound
			end
		end
	end
	if not next(needResetId) then return end

	local resetMode = {}

	local response = {}
	for idx = 1, #TimeResetArray do
		local funcName = TimeResetArray[idx]
		local resetId = TimeReset[funcName]
		if resetId then
			if needResetId[resetId] and ResetFunc[funcName] then
				ResetFunc[funcName](self, notify, response, now)
				resetMode[funcName] = true
			end
		end
	end

	for resetId, round in pairs(needResetId) do
		self.storeData:resetStoreReored(resetId)
		timeReset[resetId] = round
	end
	self:setProperties({timeReset = timeReset, ltime = now})

	response.timeReset = timeReset
	response.ltime = now

	if notify then
		self:notifyUpdateProperties(response)
	end
	return resetMode
end

-- 持续时间取  min(interval, duration) duration 填 0 默认使用 interval 作为持续时间
local function getTimeResetDuration(rtype)
	local resetData = csvdb["time_resetCsv"][rtype]
	if not resetData then return 0 end
	return resetData.duration == 0 and resetData.interval or math.min(resetData.interval, resetData.duration)
end

--检查功能是否是在开放期
function Role:isTimeResetOpen(rtype)
	local resetData = csvdb["time_resetCsv"][rtype]
	if not resetData or getTimeResetDuration(rtype) >= resetData.interval then
		return true
	end
	
	return self:getTimeResetEndTime(rtype) > skynet.timex()
end

-- 当前轮次 开始时间
function Role:getTimeResetStartTime(rtype)
	local timeReset = self:getProperty("timeReset")
	if not timeReset[rtype] then return 0 end
	local resetData = csvdb["time_resetCsv"][rtype]
	if not resetData then return 0 end
	return START_RESET_TIME + timeReset[rtype] * resetData.interval + resetData.start
end

-- 当前轮次 结束时间
function Role:getTimeResetEndTime(rtype)
	return self:getTimeResetStartTime(rtype) + getTimeResetDuration(rtype)
end

function Role:getTimeResetRound(rtype)
	local timeReset = self:getProperty("timeReset")
	return timeReset[rtype] or 0
end

function Role:getTimeResetDataStart(rtype)
	local resetData = csvdb["time_resetCsv"][rtype]
	if not resetData then return 0 end
	return resetData.start
end







end





return RoleTimeReset