-- 大秘境【区域】实例(一共6个) local XRiftChapter = XClass(nil, "XRiftChapter") function XRiftChapter:Ctor(config) self.Config = config self.EntityFightLayersDic = {} self.EntityFightLayersList = {} self.OutliersList = {} -- 服务端下发后确认的数据 self.s_UnlockedLayerOrderMax = nil -- 已解锁最高层数 self.s_PassedLayerOrderMax = nil -- 已通关最高层数 self.s_LuckyValue = 0 self.s_LeftSweepTimes = nil --剩余扫荡次数 self.s_CurrLuckFightLayer = nil end -- 向下建立关系 function XRiftChapter:InitRelationshipChainDown(xFightLayer) self.EntityFightLayersDic[xFightLayer:GetId()] = xFightLayer end -- 【获取】Id function XRiftChapter:GetId() return self.Config.Id end -- 【获取】Config function XRiftChapter:GetConfig() return self.Config end -- 【检查】是否处于未作战状态,如果为false,说明区域内有作战层处于作战状态,并返回作战层id function XRiftChapter:CheckNoneData() local res = true local fightLayerId = nil for k, xFightLayer in pairs(self:GetAllFightLayers()) do if not xFightLayer:CheckNoneData() then res = false fightLayerId = xFightLayer:GetId() break end end return res, fightLayerId end -- 【检查】红点 function XRiftChapter:CheckRedPoint() return not self:CheckHasLock() and not self:CheckHadFirstEntered() end function XRiftChapter:CheckPreLock() -- 前置区域没通过 或者 没到达开放时间,都会上锁 local preLock = true if self:GetId() <= 1 then preLock = false elseif XDataCenter.RiftManager.GetEntityChapterById(self:GetId() - 1):CheckHasPassed() then preLock = false end return preLock end function XRiftChapter:CheckTimeLock() local timeLock = true if self:GetOpenLeftTime() <= 0 then timeLock = false end return timeLock end -- 【检查】上锁 function XRiftChapter:CheckHasLock() -- 前置区域没通过 或者 没到达开放时间,都会上锁 local preLock = self:CheckPreLock() local timeLock = self:CheckTimeLock() return timeLock or preLock end -- 【检查】通过该区域 function XRiftChapter:CheckHasPassed() local curr, total = self:GetProgress() return curr >= total end -- 【获取】开启区域的剩余时间 function XRiftChapter:GetOpenLeftTime() local nowTime = XTime.GetServerNowTimestamp() -- 使用目标时间点做标记来替代计时器 local passTime = nowTime - XDataCenter.RiftManager.GetActivityStartTime() local leftTime = self:GetConfig().UnlockTime - passTime local timeDesc = XUiHelper.GetTime(leftTime, XUiHelper.TimeFormatType.ACTIVITY) return leftTime, timeDesc end -- 【获取】所有作战层 function XRiftChapter:GetAllFightLayers() return self.EntityFightLayersDic end -- 【获取】按Id排序的顺序表 function XRiftChapter:GetAllFightLayersOrderList() if not XTool.IsTableEmpty(self.EntityFightLayersList) then return self.EntityFightLayersList end for k, xFightLayer in pairs(self.EntityFightLayersDic) do table.insert(self.EntityFightLayersList, xFightLayer) end table.sort(self.EntityFightLayersList, function (a, b) return a:GetId() < b:GetId() end) return self.EntityFightLayersList end -- 【获取】所有异常点(多队伍作战层) function XRiftChapter:GetAllOutliersList() if not XTool.IsTableEmpty(self.OutliersList) then return self.OutliersList end for k, xFightLayer in pairs(self.EntityFightLayersDic) do if xFightLayer:GetType() == XRiftConfig.LayerType.Multi then table.insert(self.OutliersList, xFightLayer) end end table.sort(self.OutliersList, function (a, b) return a:GetId() < b:GetId() end) return self.OutliersList end -- 【获取】当前区域正在作战的层 function XRiftChapter:GetCurPlayingFightLayer() for k, xFightLayer in pairs(self:GetAllFightLayersOrderList()) do if xFightLayer:CheckHasStarted() then return xFightLayer end end end -- 【获取】当前区域进度 function XRiftChapter:GetProgress() local allFightLayers = self:GetAllFightLayersOrderList() local firstLayerInCurChapter = allFightLayers[1] local total = #allFightLayers local finalCur = (self.s_PassedLayerOrderMax or 0) - firstLayerInCurChapter:GetId() + 1 finalCur = finalCur < 0 and 0 or finalCur return finalCur, total end -- 【获取】幸运值进度 function XRiftChapter:GetLuckValueProgress() local progress = self.s_LuckyValue / self.Config.LuckyValueMax progress = progress >= 1 and 1 or progress progress = progress < 0 and 0 or progress return progress end -- 【检查】检查当前chapter是否刚刚完成首通,是的话打开弹窗 并执行传入的sureCb function XRiftChapter:CheckFirstPassAndOpenTipFun(afterSureCb) local nextChapter = XDataCenter.RiftManager.GetEntityChapterById(self:GetId() + 1) if self:CheckHasPassed() and nextChapter and not nextChapter:CheckHasLock() and XDataCenter.RiftManager.GetIsFirstPassChapterTrigger() then local title = CS.XTextManager.GetText("TipTitle") local content = CS.XTextManager.GetText("RiftChapterFirstPassTip") local sureCallback = function () if afterSureCb then afterSureCb(nextChapter) end end XLuaUiManager.Open("UiDialog", title, content, XUiManager.DialogType.Normal, nil, sureCallback) end end -- 【保存】首次进入 function XRiftChapter:SaveFirstEnter() local key = "RiftChapter"..XPlayer.Id..self:GetId() XSaveTool.SaveData(key, true) end -- 【检查】是否有过首次进入 function XRiftChapter:CheckHadFirstEntered() local key = "RiftChapter"..XPlayer.Id..self:GetId() return XSaveTool.GetData(key) end -- 【获取】已通关最高作战层 function XRiftChapter:GetPassedLayerOrderMaxFightLayer() if self:GetProgress() <= 0 then return end local list = self:GetAllFightLayersOrderList() local initOrder = list[1]:GetConfig().Order -- 先拿到服务器下发的最高通关的序号(没错,服务器只发当前最高通关作战层的order,不是id.) local order = (self.s_PassedLayerOrderMax or initOrder) - initOrder + 1 local xFightLayer = self:GetAllFightLayersOrderList()[order] return xFightLayer end function XRiftChapter:GetCurrLuckFightLayer() return self.s_CurrLuckFightLayer end function XRiftChapter:SetCurrLuckFightLayer(xFightLayer) self.s_CurrLuckFightLayer = xFightLayer end function XRiftChapter:GetMaxUnlockLayer() return self.s_UnlockedLayerOrderMax or 0 end function XRiftChapter:GetMaxPassLayer() return self.s_PassedLayerOrderMax or 0 end function XRiftChapter:SyncData(data) self.s_UnlockedLayerOrderMax = data.UnlockedLayerOrderMax -- 已解锁最高层数 self.s_PassedLayerOrderMax = data.PassedLayerOrderMax -- 已通关最高层数 self.s_LuckyValue = data.LuckyValue if not XTool.IsTableEmpty(data.LuckyNode) then local xFightLayer = XDataCenter.RiftManager.GetEntityFightLayerById(data.LuckyNode.LayerId) xFightLayer:SetLuckStageGroup(data.LuckyNode) end end return XRiftChapter