289 lines
8.5 KiB
Lua
289 lines
8.5 KiB
Lua
|
---@class XMoeWarMatch
|
|||
|
local XMoeWarMatch = XClass(nil, "XMoeWarMatch")
|
|||
|
|
|||
|
local tableInsert = table.insert
|
|||
|
local tableSort = table.sort
|
|||
|
local stringFormat = string.format
|
|||
|
local pairs = pairs
|
|||
|
local ipairs = ipairs
|
|||
|
local CsXTextManagerGetText = CS.XTextManager.GetText
|
|||
|
local VoteEndShiftTime = CS.XGame.ClientConfig:GetInt("MoeWarVoteEndShiftTime")
|
|||
|
|
|||
|
local Default = {
|
|||
|
-- 赛事基本信息
|
|||
|
LastRefreshTime = 0,
|
|||
|
RefreshTimeStr = nil,
|
|||
|
}
|
|||
|
|
|||
|
function XMoeWarMatch:Ctor(Id)
|
|||
|
for key in pairs(Default) do
|
|||
|
self[key] = Default[key]
|
|||
|
end
|
|||
|
|
|||
|
self.Players = {}
|
|||
|
self.PairList = {}
|
|||
|
self:LoadMatchCfg(Id)
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:LoadMatchCfg(Id)
|
|||
|
self.Id = Id
|
|||
|
self.Cfg = XMoeWarConfig.GetMatch(Id)
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:UpdateInfo(data)
|
|||
|
--public class XMoeWarPlayer <==> data.Players
|
|||
|
--{
|
|||
|
-- public int PlayerId;
|
|||
|
-- public int GroupId;
|
|||
|
-- public long Vote;
|
|||
|
-- public long VoteShow;
|
|||
|
--}
|
|||
|
for i, playerInfo in ipairs(data.Players) do
|
|||
|
self.Players[playerInfo.PlayerId] = playerInfo
|
|||
|
end
|
|||
|
|
|||
|
-- 服务端定义的数据结构
|
|||
|
--public class XMoeWarPlayerPair <==> pairInfo
|
|||
|
--{
|
|||
|
-- public int WinnerId;
|
|||
|
-- public int SecondId;
|
|||
|
-- public List<int> Players = new List<int>();
|
|||
|
-- public int WarSituation;
|
|||
|
--}
|
|||
|
|
|||
|
self.PairList = {}
|
|||
|
|
|||
|
if self:GetSessionId() == XMoeWarConfig.SessionType.GameInAudition then
|
|||
|
for _, playerInfo in ipairs(data.Players) do
|
|||
|
local player = XDataCenter.MoeWarManager.GetPlayer(playerInfo.PlayerId)
|
|||
|
if player then
|
|||
|
player:UpdateMatchVote(self, playerInfo.VoteShow, {})
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
for _, pairInfo in ipairs(data.Pairs) do
|
|||
|
if self:GetSessionId() ~= XMoeWarConfig.SessionType.GameInAudition then
|
|||
|
for _, playerId in ipairs(pairInfo.Players) do
|
|||
|
local player = XDataCenter.MoeWarManager.GetPlayer(playerId)
|
|||
|
if player then
|
|||
|
player:UpdateMatchVote(self, self.Players[playerId].VoteShow, pairInfo)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
table.sort(pairInfo.Players, function(a, b)
|
|||
|
return a < b
|
|||
|
end)
|
|||
|
tableInsert(self.PairList, pairInfo)
|
|||
|
end
|
|||
|
table.sort(self.PairList,function(a,b)
|
|||
|
local playerA = a.Players[1]
|
|||
|
local playerB = b.Players[1]
|
|||
|
local groupA = XMoeWarConfig.GetPlayerGroup(playerA)
|
|||
|
local groupB = XMoeWarConfig.GetPlayerGroup(playerB)
|
|||
|
|
|||
|
return groupA < groupB
|
|||
|
end)
|
|||
|
|
|||
|
local groupDic = {}
|
|||
|
for _, pair in pairs(self.PairList) do
|
|||
|
local playerA = pair.Players[1]
|
|||
|
local groupA = XMoeWarConfig.GetPlayerGroup(playerA)
|
|||
|
if not groupDic[groupA] then
|
|||
|
groupDic[groupA] = {}
|
|||
|
end
|
|||
|
table.insert(groupDic[groupA], pair)
|
|||
|
end
|
|||
|
self.PairList = {}
|
|||
|
for _, groupList in pairs(groupDic) do
|
|||
|
table.sort(groupList, function(a, b)
|
|||
|
return a.WarSituation < b.WarSituation
|
|||
|
end)
|
|||
|
for _, p in pairs(groupList) do
|
|||
|
table.insert(self.PairList, p)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:GetName()
|
|||
|
return self.Cfg.MatchName
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:GetSubName()
|
|||
|
return self.Cfg.MatchSubName
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:GetType()
|
|||
|
return self.Cfg.Type
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:GetInTime(isRealTime)
|
|||
|
local nowTime = XTime.GetServerNowTimestamp()
|
|||
|
return nowTime >= self:GetStartTime() and nowTime <= self:GetEndTime(isRealTime)
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:GetNotOpen()
|
|||
|
local nowTime = XTime.GetServerNowTimestamp()
|
|||
|
return nowTime <= self:GetStartTime()
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:GetIsEnd(isRealTime)
|
|||
|
local nowTime = XTime.GetServerNowTimestamp()
|
|||
|
return nowTime >= self:GetEndTime(isRealTime)
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:GetVoteEnd()
|
|||
|
if self.Cfg.Type == XMoeWarConfig.MatchType.Voting then
|
|||
|
return XTime.GetServerNowTimestamp() >= self:GetEndTime()
|
|||
|
end
|
|||
|
local twin = XDataCenter.MoeWarManager.GetVoteMatch(self:GetSessionId())
|
|||
|
return twin:GetIsEnd()
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:GetResultOut()
|
|||
|
local match = XDataCenter.MoeWarManager.GetMatch(self:GetSessionId())
|
|||
|
if match:GetType() == XMoeWarConfig.MatchType.Publicity then
|
|||
|
return true
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:GetDailyLimitCount()
|
|||
|
return CS.XGame.Config:GetInt("MoeWarDailyVoteLimit")
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:GetStartTime()
|
|||
|
return XFunctionManager.GetStartTimeByTimeId(self.Cfg.TimeId) or 0
|
|||
|
end
|
|||
|
|
|||
|
-- isRealTime : true则返回配置里定义的时间,否则投票期返回减去统计所需时间
|
|||
|
function XMoeWarMatch:GetEndTime(isRealTime)
|
|||
|
if not isRealTime and self.Cfg.Type == XMoeWarConfig.MatchType.Voting then
|
|||
|
local endTime = XFunctionManager.GetEndTimeByTimeId(self.Cfg.TimeId)
|
|||
|
return endTime and endTime - VoteEndShiftTime or 0
|
|||
|
else
|
|||
|
return XFunctionManager.GetEndTimeByTimeId(self.Cfg.TimeId) or 0
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:GetSessionId()
|
|||
|
return self.Cfg.SessionId
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:GetRefreshVoteTimeInDay()
|
|||
|
return self.Cfg.RefreshVoteHour
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:GetCoverImg()
|
|||
|
return self.Cfg.CoverImg
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:GetPairList(isVotePanel)
|
|||
|
local pairList = {}
|
|||
|
if (self:GetSessionId() == XMoeWarConfig.SessionType.GameInAudition and self:GetType() == XMoeWarConfig.MatchType.Voting) or (self:GetSessionId() == XMoeWarConfig.SessionType.GameInAudition and isVotePanel) then
|
|||
|
local groupDic = {}
|
|||
|
for _, player in pairs(self.Players) do
|
|||
|
local pairInfo = {
|
|||
|
WinnerId = 0,
|
|||
|
SecondId = 0,
|
|||
|
Players = {
|
|||
|
player.PlayerId
|
|||
|
},
|
|||
|
WarSituation = XMoeWarConfig.WarSituationType.Default
|
|||
|
}
|
|||
|
local group = XMoeWarConfig.GetPlayerGroup(player.PlayerId)
|
|||
|
if not groupDic[group] then
|
|||
|
groupDic[group] = {}
|
|||
|
end
|
|||
|
table.insert(groupDic[group], pairInfo)
|
|||
|
end
|
|||
|
for _, pList in pairs(groupDic) do
|
|||
|
table.sort(pList, function(a, b)
|
|||
|
local playerA = self.Players[a.Players[1]]
|
|||
|
local playerB = self.Players[b.Players[1]]
|
|||
|
if playerA.VoteShow ~= playerB.VoteShow then
|
|||
|
return playerA.VoteShow > playerB.VoteShow
|
|||
|
end
|
|||
|
return a.Players[1] < b.Players[1]
|
|||
|
end)
|
|||
|
for _, pair in pairs(pList) do
|
|||
|
table.insert(pairList, pair)
|
|||
|
end
|
|||
|
end
|
|||
|
elseif self:GetSessionId() == XMoeWarConfig.SessionType.FailWeekVotingDown then
|
|||
|
for _, pair in pairs(self.PairList) do
|
|||
|
if pair.WarSituation == XMoeWarConfig.WarSituationType.FailGroup then
|
|||
|
table.insert(pairList,pair)
|
|||
|
end
|
|||
|
end
|
|||
|
else
|
|||
|
pairList = self.PairList
|
|||
|
end
|
|||
|
return pairList
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:GetPlayerList()
|
|||
|
return self.Players
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:GetDesc()
|
|||
|
return self.Cfg.Des
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:GetFinalImg()
|
|||
|
return self.Cfg.FinalImg
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:GetPairListByGroupId(groupId,isVotePanel)
|
|||
|
local groupPairList = {}
|
|||
|
local pairList = self:GetPairList(isVotePanel)
|
|||
|
for i = 1,#pairList do
|
|||
|
local id = XMoeWarConfig.GetPlayerGroup(pairList[i].Players[1])
|
|||
|
if groupId == id then
|
|||
|
tableInsert(groupPairList,pairList[i])
|
|||
|
end
|
|||
|
end
|
|||
|
return groupPairList
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:GetPlayerListByGroupId(groupId)
|
|||
|
local list = {}
|
|||
|
for index,v in pairs(self.Players) do
|
|||
|
if v.GroupId == groupId then
|
|||
|
tableInsert(list, v)
|
|||
|
end
|
|||
|
end
|
|||
|
table.sort(list, function(a, b)
|
|||
|
if a.VoteShow == b.VoteShow then
|
|||
|
return a.PlayerId < b.PlayerId
|
|||
|
end
|
|||
|
return a.VoteShow > b.VoteShow
|
|||
|
end)
|
|||
|
return list
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:GetRefreshVoteText()
|
|||
|
if self.Cfg.Type == XMoeWarConfig.MatchType.Publicity then
|
|||
|
return ""
|
|||
|
end
|
|||
|
|
|||
|
if not self.RefreshTimeStr then
|
|||
|
local refreshTimeStrList = {}
|
|||
|
for i, v in ipairs(self.Cfg.RefreshVoteHour) do
|
|||
|
refreshTimeStrList[i] = CsXTextManagerGetText("MoeWarMatchVoteRefreshTimeUnit", v)
|
|||
|
end
|
|||
|
self.RefreshTimeStr = table.concat(refreshTimeStrList, CsXTextManagerGetText("MoeWarMatchVoteRefreshTimeSplit"))
|
|||
|
end
|
|||
|
|
|||
|
return CsXTextManagerGetText("MoeWarMatchVoteRefresh", self.RefreshTimeStr)
|
|||
|
end
|
|||
|
|
|||
|
--角色是否淘汰
|
|||
|
function XMoeWarMatch:IsPlayerWeedOut(playerId)
|
|||
|
return not self.Players[playerId]
|
|||
|
end
|
|||
|
|
|||
|
function XMoeWarMatch:GetId()
|
|||
|
return self.Id
|
|||
|
end
|
|||
|
|
|||
|
return XMoeWarMatch
|