local GuildMine_Model = {} local private = {} local EventSystem = require('Event/EventSystem') local mine_info_pb = require('Proto/mine_info_pb') local mine_opt_pb = require('Proto/mine_opt_pb') local GuildMineRefreshTime_Key = "GuildMineRefreshTime" local fuben_common = require('Proto/fuben_pb') local GoldMineLevel = 4 GuildMine_Model.MineDailyCollectNum = DataSheetManager.ConstData:GetDataByID("MineDailyCollectNum").IntValue -- 每日免费挖矿次数 GuildMine_Model.MineDailyFreePlunderNum = DataSheetManager.ConstData:GetDataByID("MineDailyFreePlunderNum").IntValue -- 每日免费掠夺次数 local function LootHistorySort(a,b) local aTime = a.baseInfo.lootTime local bTime = b.baseInfo.lootTime return aTime > bTime end local function AssHistorySort(a,b) local aTime = a.supplementInfo.assStartTime local bTime = b.supplementInfo.assStartTime return aTime > bTime end GuildMine_Model.MineAssStateType = { None = mine_info_pb.None, -- 未夺回 ReTakeBySelf = mine_info_pb.ReTakeBySelf, -- 自己夺回 ReTakeByOther = mine_info_pb.ReTakeByOther -- 援助夺回 } GuildMine_Model.GuidMineOpType = { Assist = mine_opt_pb.Assist, -- 援助 FightBack = mine_opt_pb.FightBack, -- 反击 Loot = mine_opt_pb.Loot, -- 掠夺 SeekHelp = mine_opt_pb.SeekHelp, -- 求助 } GuildMine_Model.InterfaceType = { Open = mine_opt_pb.Open, -- 打开界面 Continue = mine_opt_pb.Continue, -- 延续界面监控 Close = mine_opt_pb.Close, -- 关闭界面 Refresh = mine_opt_pb.Refresh, -- 关闭界面 } GuildMine_Model.GetMineOptType = { GetLevel = mine_opt_pb.GetLevel, -- 打开操作 RefreshLevel = mine_opt_pb.RefreshLevel, -- 刷新操作 DrawGold = mine_opt_pb.DrawGold, -- 领取金矿 } function GuildMine_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageCreatMine, private.CreatMineResponse) NetManager.RegisterMsgCB(MessageEnums.MessageGuildMineOpt, private.GuildMineOptResponse) NetManager.RegisterMsgCB(MessageEnums.MessageGetMineLevel, private.GetMineLevelResponse) NetManager.RegisterMsgCB(MessageEnums.MessageMineAssThanks, nil) -- 援助感谢 NetManager.RegisterMsgCB(MessageEnums.MessageG2CChangeMineMsg, private.G2CChangeMineMsg) -- 矿场变化推动 NetManager.RegisterMsgCB(MessageEnums.MessageG2CBalanceMineMsg, private.G2CBalanceMineMsg) -- 矿场收获结算消息推送 NetManager.RegisterMsgCB(MessageEnums.MessageGetMineLootHistory, private.GetGuildMineLootHistoryResponse) -- 获取矿场势力援助历史 NetManager.RegisterMsgCB(MessageEnums.MessageGetMineInterfaceInfo, private.GetMineInterfaceInfoResponse) NetManager.RegisterMsgCB(MessageEnums.MessageGetGuildMineAssHistory, private.GetGuildMineAssHistoryResponse) NetManager.RegisterMsgCB(MessageEnums.MessageGetGuildMineEnemyLineUp, private.GetGuildMineEnemyLineUpResponse) NetManager.RegisterMsgCB(MessageEnums.MessageReceiveMineReward, nil) EventSystem.Regist(EventID.UI_Guild_BeKickOutRefresh, private.RemoveGuildMineMainNotice) -- 退出势力移除主城气泡提示 EventSystem.Regist(EventID.AcquireSystemRedAfterUnlock, GuildMine_Model.UpdateEntryRed) private.kingdomId = 1 -- 当前国别 private.collectNum = 0 -- 采矿次数 private.lootNum = 0 -- 掠夺次数 private.purchaseNum = 0 -- 购买掠夺次数 private.enterCount = 0 -- 玩法次数 -- 红点判断用 private.assCount = 0 -- 援助次数 private.mineRefreshCount = 0 -- 矿刷新次数 private.curMineLevel = 0 -- 当前矿石级别 private.lootRedPoint = false -- 当前掠夺日志红点 private.assRedPoint = false -- 当前援助红点 private.assUnReadNum = 0 -- 当前援助红点数量 private.syncLineup = false -- 登录同步矿场阵容 private.isMineDoing = false -- 是否有矿场正在进行 GuildMine_Model.ThanksRefreshTime = 0 -- 感谢消息的发送时间,CD用 private.MyMineInfo = {} -- 自己的矿 private.OtherMineList = {} -- 其他6个矿 private.lootHistory = {} private.assHistory = {} private.BalanceMine = {} -- 收获推送 end function GuildMine_Model.GetMyMineInfo() return private.MyMineInfo end function GuildMine_Model.GetLootHistory() return private.lootHistory end function GuildMine_Model.GetAssHistory() return private.assHistory end function GuildMine_Model.GetOtherMineList() return private.OtherMineList end function GuildMine_Model.GetOtherMineInfoByAcid(acid) for k,v in ipairs(private.OtherMineList) do if v.mineInfo.minePlayerShowInfo.playerAcid == acid then return v.mineInfo end end return nil end function GuildMine_Model.GetBalanceMine() return private.BalanceMine end function GuildMine_Model.GetAssCount() return private.assCount end function GuildMine_Model.GetMineRefreshCount() return private.mineRefreshCount end function GuildMine_Model.GetCurMineLevel() return private.curMineLevel end function GuildMine_Model.IsGoldMineLevel() return private.curMineLevel == GoldMineLevel end function GuildMine_Model.GetMineCurKingdomId() return private.kingdomId end function GuildMine_Model.GetMineLootNum() return private.lootNum end function GuildMine_Model.GetMinePurchaseNum() return private.purchaseNum end function GuildMine_Model.GetMineCollectNum() return private.collectNum end function GuildMine_Model.GetMineLootRedPoint() return private.lootRedPoint end function GuildMine_Model.GetMineAssRedPoint() return private.assRedPoint end function GuildMine_Model.GetMineAssUnReadNum() return private.assUnReadNum end function GuildMine_Model.GetLastRefreshTime() return PersistentData.PlayerData:Get(GuildMineRefreshTime_Key, 0) end function GuildMine_Model.SetLastRefreshTime(time) PersistentData.PlayerData:Set(GuildMineRefreshTime_Key, time, true) end --region ***************** 布阵 ******************** -- 获取上阵武将战力 function GuildMine_Model.GetLineUpGSByTeamID(kingdom, teamID) local heroInfos = GuildMine_Model.GetLineUpInfo(kingdom) local posNum1, posNum2 = CTL.FreeLineUp.GetLineUpPosNumByTeamID(teamID) local totalGS = 0 if heroInfos and #heroInfos > 0 then for _, heroInfo in ipairs(heroInfos) do if posNum1 == heroInfo.posNumber or posNum2 == heroInfo.posNumber then local baseGS = heroInfo.heroBaseGs or 0 local lineUpGS = heroInfo.lineUpGs or 0 totalGS = totalGS + baseGS + lineUpGS end end end return totalGS end function GuildMine_Model.GetLineUpGSTotal(kingdom) return GuildMine_Model.GetLineUpGSByTeamID(kingdom, 1) + GuildMine_Model.GetLineUpGSByTeamID(kingdom, 2) + GuildMine_Model.GetLineUpGSByTeamID(kingdom, 3) end -- 获取开启国别的上阵武将阵容 function GuildMine_Model.GetLineUpInfo(kingdom) local lineNumber = kingdom and kingdom or private.kingdomId local lineUpInfo = MDL.FreeLineUp.GetLineUpInfoByFunctionType(MDL.FreeLineUp.FuncType.GuildMine) if lineUpInfo and #lineUpInfo > 0 then for i, v in ipairs(lineUpInfo) do if lineNumber == v.lineNumber then return v.heroInfos end end end return nil end --endregion ***************** 布阵 ******************** --region -------------------------------- 红点 ------------------------ -- 已参与次数 function GuildMine_Model.GetEnterNums() return private.enterCount end function GuildMine_Model.UpdateEntryRed() CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.Guild_Activity_GuildMine) local isUnlock = MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.GuildMine) local activityState = CTL.Activities.GetState(LuaConst.ActivityType.GuildMine) if isUnlock and activityState == CTL.Activities.ActivityState.Opening then local lootLeftTimes = GuildMine_Model.MineDailyFreePlunderNum + private.purchaseNum - private.lootNum local collectLeftTimes = GuildMine_Model.MineDailyCollectNum - private.collectNum if private.lootRedPoint or lootLeftTimes > 0 or (collectLeftTimes > 0 and not private.isMineDoing)then CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.Guild_Activity_GuildMine) EventSystem.Dispatch(EventID.UI_Activity_Refresh_Single_RedPoint, LuaConst.ActivityType.GuildMine, true) else EventSystem.Dispatch(EventID.UI_Activity_Refresh_Single_RedPoint, LuaConst.ActivityType.GuildMine, false) end else EventSystem.Dispatch(EventID.UI_Activity_Refresh_Single_RedPoint, LuaConst.ActivityType.GuildMine, false) end end --endregion -------------------------------- 红点 ------------------------ --region ***************** 协议 ******************** function GuildMine_Model.SyncGuildMineInfo(info) logging.log(LTAG.LOG, "势力挖矿登录信息 ", info) private.kingdomId = info.kingdomId private.collectNum = info.collectNum private.isMineDoing = info.isMineDoing if private.lootNum ~= info.lootNum or private.purchaseNum ~= info.purchaseNum then private.lootNum = info.lootNum private.purchaseNum = info.purchaseNum EventSystem.Dispatch(EventID.UI_GuildMine_Refresh_LootNum) end if private.assCount ~= info.assNum then private.assCount = info.assNum -- 刷新敌方信息弹窗界面援助次数 EventSystem.Dispatch(EventID.UI_GuildMine_Enemy_Pop_Up_Refresh) end if private.mineRefreshCount ~= info.refreshNum then private.mineRefreshCount = info.refreshNum -- 刷新我的矿场界面刷新次数 EventSystem.Dispatch(EventID.UI_GuildMine_MyMine_ReTimes) end private.assUnReadNum = info.assUnReadNum EventSystem.Dispatch(EventID.UI_HomeMain_RefreshNotice, false) if private.assRedPoint ~= info.assHotPoint then private.assRedPoint = info.assHotPoint if info.assHotPoint == true then CTL.HomeMain.AddMainNotice(CTL.HomeMain.NoticeType.GuildMineHelp) else CTL.HomeMain.RemoveMainNotice(CTL.HomeMain.NoticeType.GuildMineHelp) end EventSystem.Dispatch(EventID.UI_GuildMine_Refresh_HelpBtnRedPoint, private.assRedPoint) end private.lootRedPoint = info.lootHotPoint EventSystem.Dispatch(EventID.UI_GuildMine_Refresh_DailyBtnRedPoint, private.lootRedPoint) -- 更新红点状态 private.enterCount = (GuildMine_Model.MineDailyCollectNum - info.collectNum) + (GuildMine_Model.MineDailyFreePlunderNum + info.purchaseNum - info.lootNum) GuildMine_Model.UpdateEntryRed() if not private.syncLineup then MDL.FreeLineUp.FreeLineUpGetInfoRequest(MDL.FreeLineUp.FuncType.GuildMine) private.syncLineup = true end end -- 获取掠夺矿场界面信息 function GuildMine_Model.GetMineInterfaceInfoRequest(interfaceType) local msg = mine_opt_pb.GetMineInterfaceInfoReq() msg.interfaceType = interfaceType NetManager.SendMessage(MessageEnums.MessageGetMineInterfaceInfo, msg) end function private.GetMineInterfaceInfoResponse(msgResp) logging.log(LTAG.LOG, "我的矿场显示信息 ", msgResp.myMineShowInfo) logging.log(LTAG.LOG, "敌方矿场显示信息 ", msgResp.enemyMineShowInfo) if msgResp.interfaceType == GuildMine_Model.InterfaceType.Open or msgResp.interfaceType == GuildMine_Model.InterfaceType.Refresh then private.MyMineInfo = msgResp.myMineShowInfo private.OtherMineList = {} for _,serverMineInfo in ipairs(msgResp.enemyMineShowInfo) do table.insert(private.OtherMineList, {acid = serverMineInfo.minePlayerShowInfo.playerAcid, mineInfo = serverMineInfo}) end EventSystem.Dispatch(EventID.UI_GuildMine_Refresh_OtherMineList) end end -- 创建矿场 function GuildMine_Model.CreatMineRequest() local msg = mine_opt_pb.CreatMineReq() msg.mineLevel = private.curMineLevel NetManager.SendMessage(MessageEnums.MessageCreatMine, msg) end function private.CreatMineResponse(msgResp) logging.log(LTAG.LOG, "开始挖矿 ", msgResp) if msgResp.Resp.Code == 0 then if msgResp.isSuccess then if not private.MyMineInfo.mineBaseShowInfo then private.MyMineInfo.mineBaseShowInfo = {} end private.MyMineInfo.mineBaseShowInfo.mineLevel = msgResp.mineLevel private.MyMineInfo.mineBaseShowInfo.mineBeginTime = msgResp.creatTime EventSystem.Dispatch(EventID.UI_GuildMine_MyMine_Create) end end end -- 获取矿场等级 function GuildMine_Model.GetMineLevelRequest(optType) local msg = mine_opt_pb.GetMineLevelReq() msg.optType = optType NetManager.SendMessage(MessageEnums.MessageGetMineLevel, msg) end function private.GetMineLevelResponse(msgResp) if msgResp.Resp.Code == 0 then private.curMineLevel = msgResp.mineLevel EventSystem.Dispatch(EventID.UI_GuildMine_MyMine_Refresh) end end -- 矿场操作(求助) function GuildMine_Model.GuildMineOptRequest(type, playerAcid, timestamp, lootAcid, mineBeginTime) local msg = mine_opt_pb.GuildMineOptReq() msg.type = type msg.playerAcid = playerAcid msg.timestamp = timestamp or 0 msg.lootAcid = lootAcid or "" msg.mineBeginTime = mineBeginTime or 0 NetManager.SendMessage(MessageEnums.MessageGuildMineOpt, msg) end function private.GuildMineOptResponse(msgResp) if msgResp.Resp.Code == 0 then if msgResp.type == GuildMine_Model.GuidMineOpType.SeekHelp then -- 求助 private.UpdateOneLootHistory(msgResp.timestamp, msgResp.isSuccess) end end end function private.UpdateOneLootHistory(lootTime, isSeekHelp) for i,v in ipairs(private.lootHistory) do if v.baseInfo.lootTime == lootTime then v.supplementInfo.isSeekHelp = isSeekHelp break end end EventSystem.Dispatch(EventID.UI_GuildMine_Update_One_Record, lootTime) end -- 获取矿场掠夺历史信息 function GuildMine_Model.GetGuildMineLootHistoryRequest() local msg = mine_opt_pb.GetMineLootHistoryReq() NetManager.SendMessage(MessageEnums.MessageGetMineLootHistory, msg) end function private.GetGuildMineLootHistoryResponse(msgResp) private.lootHistory = msgResp.mineLootHistory table.sort(private.lootHistory, LootHistorySort) EventSystem.Dispatch(EventID.UI_GuildMine_Loot_History_Refresh) end -- 获取矿场势力援助历史 function GuildMine_Model.GetGuildMineAssHistoryRequest() local msg = mine_opt_pb.GetGuildMineAssHistoryReq() NetManager.SendMessage(MessageEnums.MessageGetGuildMineAssHistory, msg) end function private.GetGuildMineAssHistoryResponse(msgResp) private.assHistory = msgResp.mineAssHistory table.sort(private.assHistory, AssHistorySort) EventSystem.Dispatch(EventID.UI_GuildMine_Ass_History_Refresh) end -- 获取敌方信息 function GuildMine_Model.GetGuildMineEnemyLineUpRequest(acid, timestamp, lootAcid, lootGuild) local msg = mine_opt_pb.GetGuildMineEnemyLineUpReq() msg.acid = acid msg.timestamp = timestamp msg.lootAcid = lootAcid msg.lootGuild = lootGuild NetManager.SendMessage(MessageEnums.MessageGetGuildMineEnemyLineUp, msg) end function private.GetGuildMineEnemyLineUpResponse(msgResp) if msgResp.Resp.Code == 0 then UIManager.OpenView(Const_UI_Lua.UIEnum.UIGuildMineEnemyPopUp,{info = msgResp.info, acid = msgResp.acid, timestamp = msgResp.timestamp}) else if msgResp.acid ~= BattleDataGetter.GetAcID() then GuildMine_Model.GetGuildMineAssHistoryRequest() else GuildMine_Model.GetGuildMineLootHistoryRequest() end end end GuildMine_Model.BattleData = {} function GuildMine_Model.EnterGuildMineFuBen(fightType, mineLevel, playerAcid, playerName, beHelpAcid, beHelpName, lootTime, mineBeginTime, playerPortraitId, playerFrameId, beHelpPortraitId, beHelpFrameId) if CTL.Activities.IsActivityInOpeningTime(LuaConst.ActivityType.GuildMine) then local msg = fuben_common.EnterFubenReq() msg.id = 621001 msg.mapType = LuaConst.LevelType.LootMine msg.mineInfo.fightType = fightType msg.mineInfo.mineLevel = mineLevel msg.mineInfo.playerAcid = playerAcid msg.mineInfo.beHelpAcid = beHelpAcid msg.mineInfo.lootTime = lootTime msg.mineInfo.mineBeginTime = mineBeginTime GuildMine_Model.BattleData = { fightType = fightType, mineLevel = mineLevel, playerAcid = playerAcid, playerName = playerName, playerPortraitId = playerPortraitId, --头像(求助者/反击敌人) playerFrameId = playerFrameId, --头像框(求助者/反击敌人) beHelpAcid = beHelpAcid, beHelpName = beHelpName, beHelpPortraitId = beHelpPortraitId, --头像(求助者/反击敌人) beHelpFrameId = beHelpFrameId, --头像框(求助者/反击敌人) lootTime = lootTime, mineBeginTime = mineBeginTime, } NetManager.SendMessage(MessageEnums.MessageEnterFuben, msg) end end -- 援助感谢 function GuildMine_Model.MineAssThanksRequest(name, guildId) local msg = mine_opt_pb.MineAssThanksReq() msg.thanksName = name msg.guildId = guildId GuildMine_Model.ThanksRefreshTime = UTL.Time.GetServerTimestamp() NetManager.SendMessage(MessageEnums.MessageMineAssThanks, msg) end -- 领取矿场奖励 function GuildMine_Model.ReceiveMineRewardRequest() local msg = mine_opt_pb.ReceiveMineRewardReq() NetManager.SendMessage(MessageEnums.MessageReceiveMineReward, msg) end -- 收获推送 function private.G2CBalanceMineMsg(msgResp) logging.log(LTAG.LOG, "收获推送 ", msgResp) if msgResp.mineLevel > 0 then private.BalanceMine.mineLevel = msgResp.mineLevel private.BalanceMine.lootHistory = msgResp.lootHistory table.sort(private.BalanceMine.lootHistory, LootHistorySort) CTL.HomeMain.AddMainNotice(CTL.HomeMain.NoticeType.GuildMineFinish) EventSystem.Dispatch(EventID.UI_GuildMine_MineFinish) end end -- 矿区变化推送 function private.G2CChangeMineMsg(msgResp) logging.log(LTAG.LOG, "矿区变化推送 ", msgResp) if msgResp.changeAcid == BattleDataGetter.GetAcID() then if msgResp.changeMineInfo.mineBaseShowInfo.mineLevel > 0 then private.MyMineInfo = msgResp.changeMineInfo else private.MyMineInfo = {} end EventSystem.Dispatch(EventID.UI_GuildMine_Refresh_OtherMineList, msgResp.changeAcid) return end for k,clientMineInfo in ipairs(private.OtherMineList) do if clientMineInfo.acid == msgResp.changeAcid then if msgResp.changeMineInfo.mineBaseShowInfo.mineLevel > 0 then private.OtherMineList[k].mineInfo = msgResp.changeMineInfo else table.remove(private.OtherMineList, k) end end end EventSystem.Dispatch(EventID.UI_GuildMine_Refresh_OtherMineList, msgResp.changeAcid) end --endregion ***************** 协议 ******************** function GuildMine_Model.RemoveBalanceMineInfo() CTL.HomeMain.RemoveMainNotice(CTL.HomeMain.NoticeType.GuildMineFinish) private.BalanceMine = {} end -- 退出势力 function private.RemoveGuildMineMainNotice() CTL.HomeMain.RemoveMainNotice(CTL.HomeMain.NoticeType.GuildMineHelp) end return GuildMine_Model