local LevelWeatherManager = {} local private = {} local EventSystem = require('Event/EventSystem') local DefaultDuration = 3 -- 默认过渡时长为3秒 -- 该模块仅适用事件调用 function LevelWeatherManager.OnStartup() EventSystem.Regist(EventID.Level_ClearLevel, private.ClearWeatherInfoList) EventSystem.Regist(EventID.Task_ChangeWeather, private.ChangeWeatherByDoingTask) EventSystem.Regist(EventID.LevelWeather_GlobalSwitchWeather, private.LevelItemGlobalSwitchWeather) EventSystem.Regist(EventID.LevelWeather_EnterLevelSwitchWeather, private.EnterLevelSwitchWeather) -- 切换天气队列 value = {weatherId, duration} private.weatherInfoList = {} private.curAutoSwitchLevelId = 0 end function private.EnterLevelSwitchWeather() -- 重置天气记录场景 private.curAutoSwitchLevelId = 0 -- 根据当前任务切换 private.ChangeWeatherByDoingTask() end -- 根据任务切换天气 function private.ChangeWeatherByDoingTask() -- 取消自动切换天气 private.StopAutoSwitchWeather() -- 根据任务切换天气 local weatherInfo = MDL.Task.GetWeatherChangedInfo() local curlevelID = BattleDataGetter.GetCurLevelID() -- 优先切换任务所附带天气 if weatherInfo then for i = 1, #weatherInfo, 2 do local levelID = weatherInfo[i] local weatherID = weatherInfo[i + 1] if curlevelID == levelID then --必须切换到当前地图才可以更换天气 private.SwitchWeather(weatherID, DefaultDuration) return end end end -- 主线、金将、彩金。不走时间切换 if MDL.Task.GetTaskCountByType(MDL.Task.Enum_TaskType.Major) > 0 or MDL.Task.GetTaskCountByType(MDL.Task.Enum_TaskType.GoldHeroActivity) > 0 or MDL.Task.GetTaskCountByType(MDL.Task.Enum_TaskType.SuperGoldHero) > 0 then local success, levelWeatherData = DataSheetManager.LevelWeatherData:TryGetDataByLevelWeatherID(curlevelID) if success then private.SwitchWeather(levelWeatherData.UseDefaultWeather, 0) end return end -- 任务不切换时 进行自动切换 if BattleDataGetter.IsTownLevel() then private.AutoSwitchWeather() end end -- 根据关卡数据切换天气 function private.LevelItemGlobalSwitchWeather(weatherId, duration) -- 取消自动切换天气 private.StopAutoSwitchWeather() -- 根据关卡数据切换天气 if duration ~= nil then private.SwitchWeather(weatherId, duration) else private.SwitchWeather(weatherId, DefaultDuration) end end -- 场景中自动切换天气 function private.AutoSwitchWeather() -- 取消自动切换天气 private.StopAutoSwitchWeather() -- 根据场景地图切换天气 local curlevelID = BattleDataGetter.GetCurLevelID() local _, levelWeatherData = DataSheetManager.LevelWeatherData:TryGetDataByLevelWeatherID(curlevelID) if not levelWeatherData then return end local curTimeStamp = UTL.Time.GetServerTimestamp() local serverZeroTimestamp = UTL.Time.GetServerZeroTimestamp() local nextSwitchTime = serverZeroTimestamp + UTL.Time.TotalSecondsOneDay + levelWeatherData.WratherChangeData[1] -- 将下一次切换事件默认设置为下一天的第一个时间点 local switchWeatherId = levelWeatherData.WeatherParam[#levelWeatherData.WeatherParam] for index, timeOffset in ipairs(levelWeatherData.WratherChangeData) do if curTimeStamp >= serverZeroTimestamp + timeOffset then switchWeatherId = levelWeatherData.WeatherParam[index] else nextSwitchTime = serverZeroTimestamp + timeOffset break end end -- 切换天气 if curlevelID == private.curAutoSwitchLevelId then -- 如果所在场景和上一次自动切换天气场景一致则 过渡切换 private.SwitchWeather(switchWeatherId, DefaultDuration) else private.SwitchWeather(switchWeatherId, 0) -- 不一致 则直接切换 private.curAutoSwitchLevelId = curlevelID end -- 设置下一次切换天气倒计时 private.timerHandle = TimerUtil.Interval(private.AutoSwitchWeather, nextSwitchTime - curTimeStamp, 1) end -- 取消自动切换天气 function private.StopAutoSwitchWeather() if private.timerHandle then TimerUtil.Remove(private.timerHandle) private.timerHandle = nil end end -- 上一次切换天气未结束时 再次切换天气无效,所以使用队列切换 function private.SwitchWeather(weatherId, duration) if private.switchTimerHandle then table.insert(private.weatherInfoList, {weatherId = weatherId, duration = duration}) else if AuxUtil.SwitchWeather(weatherId, duration) then private.switchTimerHandle = TimerUtil.Interval(private.SwitchWeatherTimeEnd, duration + 1, 1) -- 时间延迟1秒 防止极限情况下 else logging.error(LTAG.ERROR, "[关卡策划注意] 切换天气失败,关卡ID:", LevelManager.GetCurLevelID(), "天气ID:", weatherId) end end end function private.SwitchWeatherTimeEnd() if private.switchTimerHandle then TimerUtil.Remove(private.switchTimerHandle) private.switchTimerHandle = nil local weatherInfo = table.remove(private.weatherInfoList, 1) if weatherInfo then private.SwitchWeather(weatherInfo.weatherId, weatherInfo.duration) end end end -- 清空天气切换队列 function private.ClearWeatherInfoList() if private.switchTimerHandle then TimerUtil.Remove(private.switchTimerHandle) private.switchTimerHandle = nil end table.clearArray(private.weatherInfoList) end return LevelWeatherManager