local WarZoneAuction_Model = {} local private = {} local EventSystem = require('Event/EventSystem') local warzone_auction_opt_pb = require("Proto/warzone_auction_opt_pb") -- 拍卖记录排序(按照购买时间排) local function SortAuctionHistory(a, b) return a.AuctionTime > b.AuctionTime end -- 拍卖数据排序(拍卖中 > 未开启 > 已结束) local function SortAuctionData(a, b) local Astate = a.AuctionState if Astate == WarZoneAuction_Model.AuctionState.FixedPrice then -- 一口价中 跟 竞拍中 一样 Astate = WarZoneAuction_Model.AuctionState.AuctionIng end local Bstate = b.AuctionState if Bstate == WarZoneAuction_Model.AuctionState.FixedPrice then -- 一口价中 跟 竞拍中 一样 Bstate = WarZoneAuction_Model.AuctionState.AuctionIng end if Astate == Bstate then return a.AuctionStartTime < b.AuctionStartTime else return Astate < Bstate end end local RefreshInterval = 30 WarZoneAuction_Model.AuctionHistoryType = { AllAuction = 0, -- 全部竞拍 MyAuction = 1, -- 我的竞拍 } WarZoneAuction_Model.AuctionState = { AuctionIng = 0, -- 拍卖中 NotStart = 1, -- 未开启 End = 2, -- 已结束 FixedPrice = 3, -- 一口价中 } function WarZoneAuction_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageWarZoneAuction, private.WarZoneAuctionResponse) NetManager.RegisterMsgCB(MessageEnums.MessageWarZoneAuctionRefresh, private.WarZoneAuctionRefreshResponse) NetManager.RegisterMsgCB(MessageEnums.MessageWarZoneAuctionHistory, private.WarZoneAuctionHistoryResponse) NetManager.RegisterMsgCB(MessageEnums.MessageG2CPushWarZoneAuctionExceed, private.G2CPushWarZoneAuctionExceed) EventSystem.Regist(EventID.New_Day_Refresh, private.ReSetShowPopKey) private.historyMaxEntry = DataSheetManager.ConstData:GetDataByID("HistoryEntry").IntValue private.lastReqAuctionAllHistoryTime = 0 -- 上次请求全部拍卖记录的时间,用于增量更新 private.lastReqAuctionPersonHistoryTime = 0 -- 上次请求个人拍卖记录的时间,用于增量更新 private.auctionHistoryDataList = {} -- 拍卖记录列表 {WarZoneAuction_Model.AuctionHistoryType.AllAuction = {}, WarZoneAuction_Model.AuctionHistoryType.MyAuction = {}} private.auctionDataList = {} -- 当前活动拍卖信息 private.auctionShowRedPointDic = {} -- 需要展示红点的拍卖道具字典 private.auctionVer = 0 -- 当前活动拍卖版本 private.isClickRefreshBtn = nil -- 这里标记是否是通过刷新按钮刷新 end ---------- start 协议相关 start ---------- -- region 大拍卖竞拍 function WarZoneAuction_Model.WarZoneAuctionRequest(auctionID, auctionPrice) local activityId = CTL.WarZoneAuction.GetCurOpenWarZoneAuctionActivityId() if activityId == nil then -- logging.error(LTAG.ERROR, "大拍卖 : 没有找到,现在正在开放的 activityId") CTL.Tips.AddTipsMsg(UIUtils.GetLocalizedTxt(Const_IDS.IDS_WarZoneAuction_12)) private.ActivityEnd() return end local msg = warzone_auction_opt_pb.WarZoneAuctionReq() msg.ActivityID = activityId msg.AuctionID = auctionID msg.AuctionPrice = auctionPrice NetManager.SendMessage(MessageEnums.MessageWarZoneAuction, msg) end function private.WarZoneAuctionResponse(msgResp) if msgResp.Resp.Code == 0 then -- 设置当前竞价 local auctionID = msgResp.CurrAuction.AuctionID local auctionData = WarZoneAuction_Model.GetAuctionDataByAuctionID(auctionID) if auctionData then auctionData.AuctionStartTime = msgResp.CurrAuction.AuctionStartTime auctionData.AuctionEndTime = msgResp.CurrAuction.AuctionEndTime auctionData.AuctionCurrPrice = msgResp.CurrAuction.AuctionCurrPrice if not auctionData.AuctionAcidList then auctionData.AuctionAcidList = {} end -- 替换处理,防止频繁创建table for i, v in ipairs(msgResp.CurrAuction.AuctionAcid) do auctionData.AuctionAcidList[i] = v end -- 移除多余数据 for i = #msgResp.CurrAuction.AuctionAcid + 1, #auctionData.AuctionAcidList do table.remove(auctionData.AuctionAcidList) end -- auctionData.AuctionAcid = msgResp.CurrAuction.AuctionAcid local oldState = auctionData.AuctionState local state = private.GetAuctionState(auctionData) auctionData.AuctionState = state private.ChangeAuctionShowRedPointDic(oldState, state, auctionID) EventSystem.Dispatch(EventID.UI_WarZoneAuction_RefreshAuctionList, auctionID) end else WarZoneAuction_Model.WarZoneAuctionRefreshRequest() end end -- region 大拍卖竞拍刷新 function WarZoneAuction_Model.WarZoneAuctionRefreshRequest(isClickRefreshBtn) local activityId = CTL.WarZoneAuction.GetCurOpenWarZoneAuctionActivityId() if activityId == nil then -- logging.error(LTAG.ERROR, "大拍卖 : 没有找到,现在正在开放的 activityId") CTL.Tips.AddTipsMsg(UIUtils.GetLocalizedTxt(Const_IDS.IDS_WarZoneAuction_12)) private.ActivityEnd() return end -- 此处不一定为false、true,可以为nil private.isClickRefreshBtn = isClickRefreshBtn local msg = warzone_auction_opt_pb.WarZoneAuctionRefreshReq() msg.ActivityID = activityId msg.AuctionVer = private.auctionVer NetManager.SendMessage(MessageEnums.MessageWarZoneAuctionRefresh, msg) end function private.WarZoneAuctionRefreshResponse(msgResp) if msgResp.Resp.Code ~= 0 then return end if IsServerDataNotNil(msgResp.CurrAuction) and #msgResp.CurrAuction > 0 then -- 设置所有物品竞拍时间 local index = 1 for _, v in ipairs(msgResp.CurrAuction) do local auctionData = {} private.auctionDataList[index] = auctionData auctionData.AuctionID = v.AuctionID auctionData.AuctionStartTime = v.AuctionStartTime auctionData.AuctionEndTime = v.AuctionEndTime auctionData.AuctionCurrPrice = v.AuctionCurrPrice -- 设置竞拍人 local auctionAcidList = {} for _, acid in ipairs(v.AuctionAcid) do table.insert(auctionAcidList, acid) end auctionData.AuctionAcidList = auctionAcidList local oldState = auctionData.AuctionState local state = private.GetAuctionState(auctionData) auctionData.AuctionState = state private.ChangeAuctionShowRedPointDic(oldState, state, v.AuctionID) index = index +1 end for i = #private.auctionDataList, index, -1 do WarZoneAuction_Model.RemoveAuctionShowRedPointDic(private.auctionDataList[i].AuctionID) table.remove(private.auctionDataList, i) end -- 排序 table.sort(private.auctionDataList, SortAuctionData) else -- 需要刷新一下状态 for i, v in ipairs(private.auctionDataList) do local oldState = v.AuctionState local state = private.GetAuctionState(v) v.AuctionState = state private.ChangeAuctionShowRedPointDic(oldState, state, v.AuctionID) end end -- 设置版本信息 private.auctionVer = msgResp.AuctionVer EventSystem.Dispatch(EventID.UI_WarZoneAuction_RefreshAuctionList) -- 提示是否刷新成功 if private.isClickRefreshBtn then private.isClickRefreshBtn = nil CTL.Tips.AddTipsMsg(UIUtils.GetLocalizedTxt(Const_IDS.IDS_GoldHeroActivity_SynergyBoss_RefreshHint)) end -- 处理一下红点计时器 private.SetTimerHandle() end -- 大拍卖竞拍历史 ( 此处 为增量更新请求 ) function WarZoneAuction_Model.WarZoneAuctionHistoryRequest(auctionHistoryType) local activityId = CTL.WarZoneAuction.GetCurOpenWarZoneAuctionActivityId() if activityId == nil then -- logging.error(LTAG.ERROR, "大拍卖 : 没有找到,现在正在开放的 activityId") CTL.Tips.AddTipsMsg(UIUtils.GetLocalizedTxt(Const_IDS.IDS_WarZoneAuction_12)) return end local msg = warzone_auction_opt_pb.WarZoneAuctionHistoryReq() msg.ActivityID = activityId msg.IsPersonal = auctionHistoryType == WarZoneAuction_Model.AuctionHistoryType.MyAuction if msg.IsPersonal then msg.LastReqTime = private.lastReqAuctionPersonHistoryTime -- 此处更新一下时间请求时间 方便下次请求使用 private.lastReqAuctionPersonHistoryTime = UTL.Time.GetServerTimestamp() else msg.LastReqTime = private.lastReqAuctionAllHistoryTime -- 此处更新一下时间请求时间 方便下次请求使用 private.lastReqAuctionAllHistoryTime = UTL.Time.GetServerTimestamp() end NetManager.SendMessage(MessageEnums.MessageWarZoneAuctionHistory, msg) end -- 此处记录为增量更新 function private.WarZoneAuctionHistoryResponse(msgResp) if msgResp.Resp.Code ~= 0 then return end local historyDataList = {} if msgResp.IsPersonal then if not private.auctionHistoryDataList[WarZoneAuction_Model.AuctionHistoryType.MyAuction] then private.auctionHistoryDataList[WarZoneAuction_Model.AuctionHistoryType.MyAuction] = historyDataList else historyDataList = private.auctionHistoryDataList[WarZoneAuction_Model.AuctionHistoryType.MyAuction] end else if not private.auctionHistoryDataList[WarZoneAuction_Model.AuctionHistoryType.AllAuction] then private.auctionHistoryDataList[WarZoneAuction_Model.AuctionHistoryType.AllAuction] = historyDataList else historyDataList = private.auctionHistoryDataList[WarZoneAuction_Model.AuctionHistoryType.AllAuction] end end for _, v in ipairs(msgResp.His) do table.insert(historyDataList, v) end table.sort(historyDataList, SortAuctionHistory) -- 移除过期数据 for i = #historyDataList , private.historyMaxEntry + 1, -1 do table.remove(historyDataList, i) end EventSystem.Dispatch(EventID.UI_WarZoneAuction_RefreshHistory) end -- 大拍卖竞拍被超推送 function private.G2CPushWarZoneAuctionExceed(msg) -- 设置新竞价 local auctionID = msg.CurrAuction.AuctionID local auctionData = WarZoneAuction_Model.GetAuctionDataByAuctionID(auctionID) if auctionData then -- 如果之前的竞拍人中有自身,并且新的价格跟之前的价格不一致时提示 if CTL.WarZoneAuction.AuctionIncludeSelf(auctionData.AuctionAcidList) and auctionData.AuctionCurrPrice ~= msg.CurrAuction.AuctionCurrPrice then CTL.Tips.AddTipsMsg(UIUtils.GetLocalizedTxt(Const_IDS.IDS_WarZoneAuction_20)) end auctionData.AuctionCurrPrice = msg.CurrAuction.AuctionCurrPrice -- 设置竞拍人(替换处理方式频繁的table创建) if not auctionData.AuctionAcidList then auctionData.AuctionAcidList = {} end -- 替换 for i, v in ipairs(msg.CurrAuction.AuctionAcid) do auctionData.AuctionAcidList[i] = v end -- 移除多余数据 for i = #msg.CurrAuction.AuctionAcid + 1, #auctionData.AuctionAcidList do table.remove(auctionData.AuctionAcidList) end auctionData.AuctionStartTime = msg.CurrAuction.AuctionStartTime auctionData.AuctionEndTime = msg.CurrAuction.AuctionEndTime local oldState = auctionData.AuctionState local state = private.GetAuctionState(auctionData) auctionData.AuctionState = state private.ChangeAuctionShowRedPointDic(oldState, state, auctionID) EventSystem.Dispatch(EventID.UI_WarZoneAuction_RefreshAuctionList, auctionID) end end ---------- end 协议相关 end ---------- ---------- start 数据获取相关 start ---------- -- 获取全部历史数据迭代器 function WarZoneAuction_Model.GetAllAuctionHistoryIterator() local historyDataList = private.auctionHistoryDataList[WarZoneAuction_Model.AuctionHistoryType.AllAuction] return ipairs(historyDataList) end -- 获取个人历史数据迭代器 function WarZoneAuction_Model.GetMyAuctionHistoryIterator() local historyDataList = private.auctionHistoryDataList[WarZoneAuction_Model.AuctionHistoryType.MyAuction] return ipairs(historyDataList) end -- 根据 AuctionID 竞拍ID 获取竞拍物品信息 function WarZoneAuction_Model.GetAuctionDataByAuctionID(auctionID) for i, v in ipairs(private.auctionDataList) do if v.AuctionID == auctionID then return v end end return nil end -- 获取竞拍数据 function WarZoneAuction_Model.GetAuctionDataList() return private.auctionDataList end -- 获取所有竞拍数据中最快到时间的(结束or开启) function WarZoneAuction_Model.GetNextRefreshTime() local residueTime = RefreshInterval local serverTime = UTL.Time.GetServerTimestamp() for _, v in ipairs(private.auctionDataList) do local distanceStartTime = v.AuctionStartTime - serverTime if distanceStartTime > 0 and distanceStartTime < residueTime then residueTime = distanceStartTime + 1 -- 刷新增加1秒延迟 防止客户端认为结束了 实际服务器计时还没结束 end local distanceEndTime = v.AuctionEndTime - serverTime if distanceEndTime > 0 and distanceEndTime < residueTime then residueTime = distanceEndTime + 1 -- 刷新增加1秒延迟 防止客户端认为结束了 实际服务器计时还没结束 end end return tonumber(residueTime) end function WarZoneAuction_Model.HasAuctionShowRedPointDic(auctionID) return private.auctionShowRedPointDic[auctionID] end function WarZoneAuction_Model.RemoveAuctionShowRedPointDic(auctionID) private.auctionShowRedPointDic[auctionID] = nil end function WarZoneAuction_Model.AuctionShowRedPointDicIsEmpty() for i, v in pairs(private.auctionShowRedPointDic) do return false end return true end ---------- end 数据获取相关 end ---------- function private.ChangeAuctionShowRedPointDic(oldState, newState, auctionID) if oldState == WarZoneAuction_Model.AuctionState.NotStart and newState == WarZoneAuction_Model.AuctionState.AuctionIng then private.auctionShowRedPointDic[auctionID] = true end if newState == WarZoneAuction_Model.AuctionState.End then WarZoneAuction_Model.RemoveAuctionShowRedPointDic(auctionID) end end function private.GetAuctionState(auctionData) local serverTime = UTL.Time.GetServerTimestamp() if serverTime < auctionData.AuctionStartTime then return WarZoneAuction_Model.AuctionState.NotStart elseif auctionData.AuctionEndTime > 0 and serverTime >= auctionData.AuctionEndTime then return WarZoneAuction_Model.AuctionState.End else local activityId = CTL.WarZoneAuction.GetCurOpenWarZoneAuctionActivityId() local info = MDL.OperationActivity.WarZoneAuction:GetDataByActivityID_AuctionID(activityId, auctionData.AuctionID) if auctionData.AuctionCurrPrice == info.HighestPrice then return WarZoneAuction_Model.AuctionState.FixedPrice else return WarZoneAuction_Model.AuctionState.AuctionIng end end end function private.ActivityEnd() for _, v in ipairs(private.auctionDataList) do v["AuctionState"] = WarZoneAuction_Model.AuctionState.End end -- 排序 table.sort(private.auctionDataList, SortAuctionData) EventSystem.Dispatch(EventID.UI_WarZoneAuction_RefreshAuctionList) end ---------- start 计时器相关 start ---------- -- 开启物品开启计时器 function private.SetTimerHandle() if private.redPointShow then TimerUtil.Remove(private.redPointShow) private.redPointShow = nil end private.nextData = nil local serverTime = UTL.Time.GetServerTimestamp() local nextStartTime = 0 for _, v in ipairs(private.auctionDataList) do if serverTime < v.AuctionStartTime then if nextStartTime == 0 or v.AuctionStartTime < nextStartTime then nextStartTime = v.AuctionStartTime private.nextData = v end end end if private.nextData then private.redPointShow = TimerUtil.Interval(private.RedPointShow, private.nextData.AuctionStartTime - serverTime, 1) end end -- 红点显示 function private.RedPointShow() CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.WarZoneAuction) private.auctionShowRedPointDic[private.nextData.AuctionID] = true private.SetTimerHandle() end -- #endregion ---------- end 计时器相关 end ---------- -- 红点显示 function private.ReSetShowPopKey() PersistentData.PlayerData:Remove("WarZoneAuction_ShowPop_key") end return WarZoneAuction_Model