2025-06-04 05:02:57 +08:00

887 lines
23 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<r.roomid
end
end
function PvpProxy:GetRoomList(type)
local roomlist = self.roomListMap[type];
if(roomlist)then
if(type == PvpProxy.Type.GorgeousMetal)then
if(self.gorgeousMetal_SortFunc == nil)then
self.gorgeousMetal_SortFunc = function(a, b)
local ina = false;
local inb = false;
if(self.myRoomData ~= nil and self.myRoomData.type == type)then
ina = a.guid == self.myRoomData.guid;
inb = b.guid == self.myRoomData.guid;
end
if(ina ~= inb)then
return ina == true;
end
return a.index < b.index;
end
end
table.sort(roomlist, self.gorgeousMetal_SortFunc);
end
return roomlist;
end
end
function PvpProxy:GetRoomData(type, guid)
local roomlist = self.roomListMap[type];
local roomData = nil;
if(roomlist)then
for i=1,#roomlist do
if(roomlist[i].guid == guid)then
roomData = roomlist[i];
break;
end
end
end
return roomData;
end
function PvpProxy:SetRoomDetailInfo(type, guid, detail_info)
if(type == nil)then
return;
end
local roomData = self:GetRoomData(type, guid);
if(roomData)then
roomData:SetRoomDetailInfo(detail_info);
else
helplog("Not Find RoomData:" .. tostring(guid));
end
self.detail_roomid_map[type] = guid;
end
-- function PvpProxy:TestRoomBriefInfo()
-- local testRoomData = {};
-- for i=1,20 do
-- local roombriefInfo = {};
-- roombriefInfo.guid = 10000 + i;
-- roombriefInfo.name = "華麗金屬房間" .. i
-- roombriefInfo.player_num = math.random(3,5);
-- roombriefInfo.num1 = 0;
-- roombriefInfo.num2 = 2;
-- roombriefInfo.num3 = 0;
-- table.insert(testRoomData, roombriefInfo);
-- end
-- self:SetRoomList(PvpProxy.Type.GorgeousMetal, testRoomData);
-- local reqRoomData =
-- {
-- type = PvpProxy.Type.GorgeousMetal,
-- };
-- self:sendNotification(ServiceEvent.MatchCCmdReqRoomListCCmd, reqRoomData);
-- end
-- function PvpProxy:TestYoyoRoom()
-- local testRoomData = {};
-- for i=1,60 do
-- local roombriefInfo = {};
-- roombriefInfo.roomid = i;
-- roombriefInfo.name = "溜溜猴房間" .. i
-- roombriefInfo.player_num = math.random(15,20);
-- table.insert(testRoomData, roombriefInfo);
-- end
-- self:SetRoomList(PvpProxy.Type.Yoyo, testRoomData);
-- end
function PvpProxy:GetFightStatInfo( )
-- body
return self.fightStatInfo
end
function PvpProxy:RecvNtfRankChangeCCmd(data)
local ranks = data.ranks
local rankDatas = {}
for i=1,#ranks do
local tb = {}
tb.name = ranks[i].name
tb.apple = ranks[i].apple
rankDatas[#rankDatas+1] = tb
end
self.fightStatInfo.ranks = rankDatas
end
function PvpProxy:NtfFightStatCCmd(data)
self.fightStatInfo.pvp_type = data.pvp_type
self.fightStatInfo.starttime = data.starttime
self.fightStatInfo.player_num = data.player_num
self.fightStatInfo.score = data.score
self.fightStatInfo.my_teamscore = data.my_teamscore
self.fightStatInfo.enemy_teamscore = data.enemy_teamscore
self.fightStatInfo.remain_hp = data.remain_hp
if(data.myrank == 9999)then
self.fightStatInfo.myrank = nil
else
self.fightStatInfo.myrank = data.myrank
end
end
function PvpProxy:HandlePvpResult(result)
local data = {}
data.result = result
self:sendNotification(UIEvent.JumpPanel, {view = PanelConfig.UIVictoryView, viewdata = data})
end
function PvpProxy:IsSelfInPvp()
local mapid = Game.MapManager:GetMapID()
if mapid then
local mapRaid = Table_MapRaid[mapid]
if mapRaid then
if mapRaid.Type == FunctionDungen.YoyoType or
mapRaid.Type == FunctionDungen.DesertWolfType or
mapRaid.Type == FunctionDungen.GorgeousMetalType then
return true
end
end
end
return false
end
function PvpProxy:IsSelfInGuildBase()
return Game.MapManager:GetMapID() == 10001 or DojoProxy.Instance:IsSelfInDojo()
end
function PvpProxy:RecvSyncMvpInfoFubenCmd(initInfo)
self:ClearBosses()
self.usernum = initInfo.usernum
local liveBosses = initInfo.liveboss
local deadBosses = initInfo.dieboss
for i=1,#liveBosses do
local single = liveBosses[i]
local data = self.bosses[single]
if(not data)then
data = {live = 1,total = 1}
self.bosses[single] = data
else
data.live = data.live + 1
data.total = data.total + 1
end
end
for i=1,#deadBosses do
local single = deadBosses[i]
local data = self.bosses[single]
if(not data)then
data = {live = 0,total = 1}
self.bosses[single] = data
else
data.total = data.total + 1
end
end
end
local function SortMvpResult(l, r)
local lMvpCount = l:GetKillMvpCount()
local rMvpCount = r:GetKillMvpCount()
if lMvpCount == rMvpCount then
local lMiniCount = l:GetKillMiniCount()
local rMiniCount = r:GetKillMiniCount()
if lMiniCount == rMiniCount then
return l.teamid < r.teamid
else
return lMiniCount > 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