autoImport("PvpRoomData"); autoImport("YoyoRoomData"); autoImport("MvpBattleTeamData") autoImport("TeamPwsData") PvpProxy = class('PvpProxy', pm.Proxy) PvpProxy.Instance = nil; PvpProxy.NAME = "PvpProxy" PvpProxy.Type = { Yoyo = MatchCCmd_pb.EPVPTYPE_LLH, --溜溜猴 DesertWolf = MatchCCmd_pb.EPVPTYPE_SMZL, --沙漠之狼 GorgeousMetal = MatchCCmd_pb.EPVPTYPE_HLJS, --華麗金屬 PoringFight = MatchCCmd_pb.EPVPTYPE_POLLY, --波利大亂鬥 MvpFight = MatchCCmd_pb.EPVPTYPE_MVP or MatchCCmd_pb.EPVPTYPE_POLLY, --波利大亂鬥 SuGVG = MatchCCmd_pb.EPVPTYPE_SUGVG, TutorMatch = MatchCCmd_pb.EPVPTYPE_TUTOR, -- 導師匹配借用 TeamPws = MatchCCmd_pb.EPVPTYPE_TEAMPWS, -- 組隊排位賽 FreeBattle = MatchCCmd_pb.EPVPTYPE_TEAMPWS_RELAX, -- 休閑賽 } PvpProxy.RoomStatus = { WaitJoin = MatchCCmd_pb.EROOMSTATE_WAIT_JOIN, ReadyForFight = MatchCCmd_pb.EROOMSTATE_READY_FOR_FIGHT, Fighting = MatchCCmd_pb.EROOMSTATE_FIGHTING, Success = MatchCCmd_pb.EROOMSTATE_MATCH_SUCCESS, End = MatchCCmd_pb.EROOMSTATE_END, } -- 組隊競技戰 顏色列舉 PvpProxy.TeamPws = { TeamColor = { Red = FuBenCmd_pb.ETEAMPWS_RED, Blue = FuBenCmd_pb.ETEAMPWS_BLUE, } } function PvpProxy:ctor(proxyName, data) self.proxyName = proxyName or PvpProxy.NAME if(PvpProxy.Instance == nil) then PvpProxy.Instance = self end if data ~= nil then self:setData(data) end self:Init() end function PvpProxy:Init() self.pvpStatusMap = {}; self.roomListMap = {}; self.detail_roomid_map = {}; self.server_teamPwsInfo = {}; --追蹤資訊 self.fightStatInfo = {} self.fightStatInfo.ranks = {} self:ClearBosses() end function PvpProxy:ClearBosses() self.bosses = {} end function PvpProxy:ResetMyRoomInfo() if(self.myRoomData)then self.myRoomData = nil; end end function PvpProxy:SetMyRoomBriefInfo(type, brief_info) -- local myRoomType = PvpProxy.Instance:GetMyRoomType() -- if(myRoomType and myRoomType~=type)then -- return -- end if(brief_info == nil or brief_info.type == nil)then redlog("PvpProxy-->ReSetMyRoomBriefInfo",brief_info.roomid); self:ResetMyRoomInfo(); else local roomid = brief_info.roomid; redlog("PvpProxy-->SetMyRoomBriefInfo", string.format("reqType:%s Roomid:%s Type:%s State:%s", type, roomid,brief_info.type, brief_info.state)); self.myRoomData = PvpRoomData.new(roomid); self.myRoomData:SetData(brief_info); local roomlist = self:GetRoomList(type); if(roomlist)then local find = false for i=1,#roomlist do if(roomlist[i].guid == roomid)then roomlist[i]:SetData(brief_info); find = true break; end end if(not find) then if(type==PvpProxy.Type.DesertWolf)then local myRoom = PvpRoomData.new(roomid); myRoom:SetData(brief_info); roomlist[#roomlist+1] = myRoom table.sort(roomlist, function (l,r) return self:SortDesertRoomData(l,r) end ) end end end end end function PvpProxy:UpdateMyRoomStatus(pvp_type, roomid, state, endtime) if(self.myRoomData and self.myRoomData.guid == roomid)then redlog("PvpProxy-->UpdateMyRoomStatus", string.format("Type:%s Roomid:%s State:%s", pvp_type, roomid, state)); self.myRoomData.state = state; self.myRoomData:SetEndTime(endtime); end end function PvpProxy:GetMyRoomType() if(self.myRoomData)then return self.myRoomData.type; end end function PvpProxy:GetMyRoomState(type) if(self.myRoomData and self.myRoomData.type == type)then return self.myRoomData.state; end return PvpProxy.RoomStatus.WaitJoin; end function PvpProxy:GetMyRoomGuid() if(self.myRoomData)then return self.myRoomData.roomid; end end function PvpProxy:SetRoomList(type, room_lists) local detailRoomData = nil; local detail_roomid = self.detail_roomid_map[type]; if(detail_roomid)then detailRoomData = self:GetRoomData(type, detail_roomid); end helplog("SetRoomList", type, detail_roomid, detailRoomData); local roomlist = {}; local roomids = ""; for i=1,#room_lists do local list = room_lists[i]; roomids = roomids .. " " .. list.roomid; if(detailRoomData and list.roomid == detailRoomData.guid)then detailRoomData:SetData(list); detailRoomData:SetIndex(i); table.insert(roomlist, detailRoomData); else local roomdata = PvpRoomData.new(list.roomid); roomdata:SetData(list); roomdata:SetIndex(i); table.insert(roomlist, roomdata); end end if(type==PvpProxy.Type.DesertWolf)then table.sort(roomlist, function (l,r) return self:SortDesertRoomData(l,r) end ) end self.roomListMap[type] = roomlist; end function PvpProxy:SetYoyoRoomList(type,roomList) local yoyoRoomData=YoyoRoomData.new(); yoyoRoomData:SetData(roomList); self.roomListMap[type]=yoyoRoomData:GetyoyoRoomData(); end function PvpProxy:SortDesertRoomData(l,r) if(l.roomid==self:GetMyRoomGuid())then return true elseif(r.roomid==self:GetMyRoomGuid())then return false else return l.roomid rMiniCount end else return lMvpCount > rMvpCount end end function PvpProxy:RecvMvpBattleReportFubenCmd(data) if self.mvpResultList == nil then self.mvpResultList = {} else TableUtility.ArrayClear(self.mvpResultList) end for i=1,#data.datas do local mvpData = MvpBattleTeamData.new(data.datas[i]) self.mvpResultList[#self.mvpResultList + 1] = mvpData end table.sort(self.mvpResultList, SortMvpResult) end function PvpProxy:RecvUpdateUserNumFubenCmd(data) self.usernum = data.usernum end function PvpProxy:RecvBossDieFubenCmd(data) local data = self.bosses[data.npcid] if(not data)then data = {live = 0,total = 1} self.bosses[data.npcid] = data else local live = data.live if(live and live >0)then data.live = data.live - 1 else data.live = 0 end end end function PvpProxy:PvpTeamMemberUpdateCCmd(matchTeamMemUpdateInfo) if(matchTeamMemUpdateInfo == nil)then return; end local roomid = matchTeamMemUpdateInfo.roomid; local teamid = matchTeamMemUpdateInfo.teamid; local isfirst = matchTeamMemUpdateInfo.isfirst; local index =matchTeamMemUpdateInfo.index; if(roomid and teamid)then local roomData = self:GetRoomData(PvpProxy.Type.GorgeousMetal, roomid); if(roomData)then local teamData = roomData:GetRoomTeamDataByPos(index); if(teamData)then teamData.id = teamid; teamData.roomid = roomid; teamData.zoneid = zoneid; local updates = matchTeamMemUpdateInfo.updates; if(updates)then teamData:SetMembers(updates); end local deletes = matchTeamMemUpdateInfo.deletes; if(deletes)then teamData:RemoveMembers(deletes); end local myTeam = TeamProxy.Instance.myTeam; if(myTeam == nil or (myTeam.id == teamData.id and teamData.memberNum == 0))then self:ResetMyRoomInfo(); end else redlog("PVP: Pos Is illegal", index, tostring(teamData)); end end end local myID = Game.Myself.data.id local deletesId = matchTeamMemUpdateInfo.deletes; for _,v in pairs(deletesId) do if(v==myID)then self:ResetMyRoomInfo() break end end end function PvpProxy:PvpMemberDataUpdate(matchTeamMemDataUpdateInfo) if(matchTeamMemDataUpdateInfo == nil)then return; end local roomid = matchTeamMemDataUpdateInfo.roomid; local teamid = matchTeamMemDataUpdateInfo.teamid; local charid = matchTeamMemDataUpdateInfo.charid; local members = matchTeamMemDataUpdateInfo.members; if(roomid and teamid and charid and members)then local roomData = self:GetRoomData(PvpProxy.Type.GorgeousMetal, roomid); if(roomData)then local teamData = roomData:GetTeamByGuid(teamid); if(teamData)then local teamMemberData = teamData:GetMemberByGuid(charid); if(teamMemberData)then teamMemberData:SetMemberData(members); end end end end end function PvpProxy:DoKickTeamCCmd(type, roomid, zoneid, teamid) local roomList = self:GetRoomList(type); if(roomList)then for i=1,#roomList do local roomData = roomList[i]; if(roomData and roomData.guid == roomid)then roomData:RemoveTeamByGuid(teamid); end end end if(self.myRoomData and self.myRoomData.guid == roomid)then local myTeam = TeamProxy.Instance.myTeam; if(myTeam and myTeam.id == teamid)then -- helplog("kick 時清空自己房間,myRoomID ",self.myRoomData.guid) self:ResetMyRoomInfo(); end end if(type==PvpProxy.Type.DesertWolf)then ServiceMatchCCmdProxy.Instance:CallReqRoomDetailCCmd(type, roomid) end end function PvpProxy:Req_Server_MyRoomMatchCCmd() if(not self.reqMyRoom)then self.reqMyRoom = true; ServiceMatchCCmdProxy.Instance:CallReqMyRoomMatchCCmd(); end end function PvpProxy:PoringFightResult(server_rank, server_rewards, server_apple) if(server_rank == nil)then return; end self.poringFight_viewdata = {}; self.poringFight_viewdata.rank = {}; local myRank = 1; local myCharid = Game.Myself.data.id; local poringList = GameConfig.PoliFire and GameConfig.PoliFire.trans_buffid; local npclist = {}; for i=1,#server_rank do local info = {}; info.charid = server_rank[i].charid; info.index = server_rank[i].index; info.rank = server_rank[i].rank; info.name = server_rank[i].name; table.insert(self.poringFight_viewdata.rank, info); if(info.charid == myCharid)then myRank = info.rank; end local listdata = {}; listdata.npcid = poringList and poringList[info.index].monster or 10001; listdata.name = info.name; npclist[info.rank] = listdata; end self.poringFight_viewdata.myRank = myRank or 1; if(server_rewards)then self.poringFight_viewdata.rewards = {}; for i=1,#server_rewards do local reward = server_rewards[i]; local item = ItemData.new(nil, reward.itemid); item.num = reward.count; table.insert(self.poringFight_viewdata.rewards, item) end end self.poringFight_viewdata.apple = server_apple; if(myRank == 9999)then GameFacade.Instance:sendNotification(UIEvent.JumpPanel, {view = PanelConfig.PoringFightResultView}); else Game.PlotStoryManager:Start(1, nil, nil, PlotConfig_Prefix.Anim, npclist); end end function PvpProxy:GetPoringFight_viewdata() return self.poringFight_viewdata; end function PvpProxy:NtfMatchInfo(etype, ismatch, isfighting) if(etype == nil)then return; end if(self.matchStateMap == nil)then self.matchStateMap = {}; end self.matchStateMap[etype] = {} self.matchStateMap[etype].ismatch = ismatch; self.matchStateMap[etype].isfighting = isfighting self.matchStateMap[etype].startMatchTime = ismatch and ServerTime.CurServerTime() or nil if (etype == PvpProxy.Type.TeamPws or etype == PvpProxy.Type.FreeBattle) then if (not ismatch) then self:ClearTeamPwsPreInfo() end self.matchStateMap[etype].isprepare = false end self.latestEtype = etype self.latestMatchInfo = self.matchStateMap[etype] end function PvpProxy:GetStartMatchTime(etype) if(self.matchStateMap == nil)then return nil; end return self.matchStateMap[etype].startMatchTime end function PvpProxy:GetMatchState(etype) if(self.matchStateMap == nil)then return nil; end return self.matchStateMap[etype]; end function PvpProxy:GetNowMatchInfo() return self.latestEtype, self.latestMatchInfo end function PvpProxy:Is_polly_match() local matchStatus = self:GetMatchState(PvpProxy.Type.MvpFight); if(matchStatus == nil)then return false; end return matchStatus.ismatch; end function PvpProxy:ClearMatchInfo() if(self.matchStateMap == nil)then return; end TableUtility.TableClear(self.matchStateMap); self.latestEtype = nil; self.latestMatchInfo = nil; end function PvpProxy:RecvGodEndTime(endtime) self.godendtime = endtime; end function PvpProxy:GetGodEndTime() return self.godendtime; end function PvpProxy:GetMvpResult() return self.mvpResultList end -- TeamPws and FreeBattle Prepare Info Begin function PvpProxy:RecvTeamPwsPreInfoMatchCCmd(serverData) self:ClearTeamPwsPreInfo() if (not self.matchStateMap) then self.matchStateMap = {} end if (not self.matchStateMap[serverData.etype]) then self.matchStateMap[serverData.etype] = {ismatch = true, isfighting = false} end self.matchStateMap[serverData.etype].isprepare = true self.teamPwsPreInfo = ReusableTable.CreateTable() self.teamPwsPreInfo.type = serverData.etype for i = 1, #serverData.teaminfos do local list, isMyTeam = self:ProcessPreInfo(serverData.teaminfos[i].charids) if (isMyTeam) then if (self.teamPwsPreInfo.myTeam) then LogUtility.Error("排位賽/休閑賽準備數據出錯!") self:ClearTeamPwsPreInfo() self.teamPwsPreInfo = ReusableTable.CreateTable() end self.teamPwsPreInfo.myTeam = list else if (self.teamPwsPreInfo.enemyTeam) then LogUtility.Error("排位賽/休閑賽準備數據出錯!") self:ClearTeamPwsPreInfo() self.teamPwsPreInfo = ReusableTable.CreateTable() end self.teamPwsPreInfo.enemyTeam = list end end self.teamPwsPreStartTime = ServerTime.CurServerTime() if (not TeamPwsPreparePopUp) then autoImport("TeamPwsPreparePopUp") end TeamPwsPreparePopUp.Show(serverData.etype) end function PvpProxy:ProcessPreInfo(datas) local isMyTeam = false local list = ReusableTable.CreateArray() local preData for i = 1, #datas do preData = ReusableTable.CreateTable() list[#list + 1] = TeamPwsData.ParsePrepareData(preData, datas[i]) if (preData.charID == Game.Myself.data.id) then isMyTeam = true end end return list, isMyTeam end function PvpProxy:GetTeamPwsPreStartTime() return self.teamPwsPreStartTime -- TeamPws and FreeBattle end function PvpProxy:RecvUpdatePreInfoMatchCCmd(serverData) if (not self.teamPwsPreInfo or self.teamPwsPreInfo.type ~= serverData.etype and serverData.etype ~= 0) then LogUtility.Error(string.format("排位賽/休閑賽準備數據出錯!本地型別: %s, 伺服器型別: %s", self.teamPwsPreInfo.type, serverData.etype)) return end local charID = serverData.charid local datas = self.teamPwsPreInfo.myTeam local found = false for i = 1, #datas do if (datas[i].charID == charID) then datas[i].isReady = true found = true break end end if (not found) then datas = self.teamPwsPreInfo.enemyTeam for i = 1, #datas do if (datas[i].charID == charID) then datas[i].isReady = true break end end end end function PvpProxy:GetTeamPwsPreInfo() return self.teamPwsPreInfo -- TeamPws and FreeBattle end function PvpProxy:ClearTeamPwsPreInfo() if (not self.teamPwsPreInfo) then return end if (self.teamPwsPreInfo.myTeam) then for i = 1, #self.teamPwsPreInfo.myTeam do ReusableTable.DestroyAndClearTable(self.teamPwsPreInfo.myTeam[i]) end ReusableTable.DestroyAndClearArray(self.teamPwsPreInfo.myTeam) end if (self.teamPwsPreInfo.enemyTeam) then for i = 1, #self.teamPwsPreInfo.enemyTeam do ReusableTable.DestroyAndClearTable(self.teamPwsPreInfo.enemyTeam[i]) end ReusableTable.DestroyAndClearArray(self.teamPwsPreInfo.enemyTeam) end ReusableTable.DestroyAndClearTable(self.teamPwsPreInfo) self.teamPwsPreInfo = nil end function PvpProxy:ClearTeamPwsMatchInfo() if (not self.matchStateMap) then return end if (self.matchStateMap[PvpProxy.Type.TeamPws]) then TableUtility.TableClear(self.matchStateMap[PvpProxy.Type.TeamPws]) end if (self.matchStateMap[PvpProxy.Type.FreeBattle]) then TableUtility.TableClear(self.matchStateMap[PvpProxy.Type.FreeBattle]) end end -- TeamPws and FreeBattle Prepare Info End -- TeamPws Report Info Begin function PvpProxy:RecvQueryTeamPwsUserInfoFubenCmd(serverData) self:CreateTeamPwsReportData(serverData.teaminfo) end function PvpProxy:RecvTeamPwsReportFubenCmd(serverData) self:CreateTeamPwsReportData(serverData.teaminfo, serverData.mvpuserinfo.charid) local data = {winTeamColor = serverData.winteam, mvpUserInfo = serverData.mvpuserinfo} GameFacade.Instance:sendNotification(UIEvent.JumpPanel, {view = PanelConfig.TeamPwsFightResultPopUp, viewdata = data}) end function PvpProxy:CreateTeamPwsReportData(serverTeamInfos, mvpID) self:ClearTeamPwsReportData() self.teamPwsReportMap = ReusableTable.CreateArray() local teamInfo, teamID, color, userInfos, data for i = 1, #serverTeamInfos do teamInfo = serverTeamInfos[i] teamID = teamInfo.teamid color = teamInfo.color userInfos = teamInfo.userinfos for i = 1, #userInfos do data = TeamPwsData.ParseReportData(ReusableTable.CreateTable(), userInfos[i], teamID, color) if (mvpID and mvpID == data.charID) then data.isMvp = true end self.teamPwsReportMap[#self.teamPwsReportMap + 1] = data end end end function PvpProxy:GetTeamPwsReportData() return self.teamPwsReportMap end function PvpProxy:ClearTeamPwsReportData() if (self.teamPwsReportMap) then for i = 1, #self.teamPwsReportMap do ReusableTable.DestroyAndClearTable(self.teamPwsReportMap[i]) end ReusableTable.DestroyAndClearArray(self.teamPwsReportMap) self.teamPwsReportMap = nil end end -- TeamPws Report Info End -- 組隊競技戰 副本資訊 begin function PvpProxy:UpdateTeamPwsInfos(syncdata, sparetime) local mt = self.server_teamPwsInfo; if(mt == nil)then mt = {} self.server_teamPwsInfo = mt; end if(syncdata)then local sd, d; local ballDirty = false; for i=1,#syncdata do sd = syncdata[i]; d = mt[sd.color]; if(d == nil)then d = {}; mt[sd.color] = d; end d.teamid = sd.teamid; d.teamname = sd.teamname; d.color = sd.color; d.score = sd.score; local oldballs = d.balls; if(not ballDirty and oldballs == nil)then ballDirty = true; end d.balls = {}; for i=1,#sd.balls do local id = sd.balls[i]; d.balls[id] = 1; if(not ballDirty and not oldballs[id])then ballDirty = true; end end if(not ballDirty)then ballDirty = next(oldballs) ~= nil; end -- helplog(string.format("TeamPws UpdateTeamPwsInfos. TeamId:%s | teamname:%s | color:%s | avescore:%s | effectcd:%s", -- tostring(sd.teamid), -- tostring(sd.teamname), -- tostring(sd.color), -- tostring(sd.score), -- tostring(sd.effectcd))); end for i=1,#syncdata do sd = syncdata[i]; for k,v in pairs(mt)do if(k ~= sd.color)then v.effectcd = sd.effectcd; v.effectid = sd.magicid; end end end if(ballDirty)then GameFacade.Instance:sendNotification(PVPEvent.TeamPws_PlayerBuffBallChange); end end if(sparetime)then -- helplog("UpdateTeamPwsInfos sparetime:", os.date(DATA_FORMAT, sparetime)); self.sparetime = sparetime; end end function PvpProxy:GetTeamPwsInfo(color) return self.server_teamPwsInfo[color]; end function PvpProxy:GetSpareTime() return self.sparetime or 0; end function PvpProxy:ClearTeamPwsInfos() helplog("ClearTeamPwsInfos"); self.sparetime = nil; self.server_teamPwsInfo = nil; end -- 組隊競技戰 副本資訊 end