PGRData/Script/matrix/xui/xuifubenunionkill/XUiUnionKillRoom.lua

489 lines
No EOL
18 KiB
Lua

local XUiUnionKillRoom = XLuaUiManager.Register(XLuaUi, "UiUnionKillRoom")
local XUiUnionKillMember = require("XUi/XUiFubenUnionKill/XUiUnionKillMember")
local MAX_CHAT_WIDTH = 450
local CHAT_SUB_LENGTH = 18
function XUiUnionKillRoom:OnAwake()
self.BtnBack.CallBack = function()
self:OnBtnBackClick()
end
self.BtnMainUi.CallBack = function()
self:OnBtnMainUiClick()
end
self:InitMembers()
self.BtnChat.CallBack = function() self:OnBtnChatClick() end
self.BtnAutoMatch.CallBack = function(args) self:OnBtnAutoMatchClick(args) end
self.BtnWaiting.CallBack = function() self:OnBtnWaitingClick() end
self.BtnTongBlack.CallBack = function() self:OnBtnTongBlackClick() end
self.BtnReady.CallBack = function() self:OnBtnReadyClick() end
self.BtnCancelReady.CallBack = function() self:OnBtnCancelReadyClick() end
XEventManager.AddEventListener(XEventId.EVENT_CHAT_RECEIVE_ROOM_MSG, self.OnReceRoomMsg, self)
-- 组队同步信息
XEventManager.AddEventListener(XEventId.EVENT_CHARACTER_SUPPORT, self.OnChangeMyShareRole, self)
XEventManager.AddEventListener(XEventId.EVENT_UNIONKILLROOM_LEADER_CHANGED, self.OnTeamLeaderChanged, self)
XEventManager.AddEventListener(XEventId.EVENT_UNIONKILLROOM_PLAYERSTATE_CHANGED, self.OnPlayerStageChanged, self)
XEventManager.AddEventListener(XEventId.EVENT_UNIONKILLROOM_FIGHTNPC_CHANGED, self.OnFightNpcChanged, self)
XEventManager.AddEventListener(XEventId.EVENT_UNIONKILLROOM_PLAYERENTER, self.OnPlayerEnter, self)
XEventManager.AddEventListener(XEventId.EVENT_UNIONKILLROOM_PLAYERLEAVE, self.OnPlayerLeave, self)
-- 关卡同步信息
XEventManager.AddEventListener(XEventId.EVENT_UNIONKILL_ROOMDATANOTIFY, self.OnStageRoomDataNotify, self)
XEventManager.AddEventListener(XEventId.EVENT_UNIONKILLROOM_KICKOUT, self.OnPlayerKickOut, self)
XEventManager.AddEventListener(XEventId.EVENT_UNIONKILLROOM_AUTOMATCHCHANGE, self.OnAutuMatchChanged, self)
XEventManager.AddEventListener(XEventId.EVENT_UNIONKILL_ACTIVITYINFO, self.OnWeatherChanged, self)
self.TxtMessageContent.text = ""
end
function XUiUnionKillRoom:OnDestroy()
for i = 1, XFubenUnionKillConfigs.MaxTeamCount do
if self.Members[i] then
self.Members[i]:ClearUnuseTImer()
end
end
self:EndAllReadyCountDown()
XDataCenter.ChatManager.ResetRoomChat()
XEventManager.RemoveEventListener(XEventId.EVENT_CHAT_RECEIVE_ROOM_MSG, self.OnReceRoomMsg, self)
XEventManager.RemoveEventListener(XEventId.EVENT_CHARACTER_SUPPORT, self.OnChangeMyShareRole, self)
XEventManager.RemoveEventListener(XEventId.EVENT_UNIONKILLROOM_LEADER_CHANGED, self.OnTeamLeaderChanged, self)
XEventManager.RemoveEventListener(XEventId.EVENT_UNIONKILLROOM_PLAYERSTATE_CHANGED, self.OnPlayerStageChanged, self)
XEventManager.RemoveEventListener(XEventId.EVENT_UNIONKILLROOM_FIGHTNPC_CHANGED, self.OnFightNpcChanged, self)
XEventManager.RemoveEventListener(XEventId.EVENT_UNIONKILLROOM_PLAYERENTER, self.OnPlayerEnter, self)
XEventManager.RemoveEventListener(XEventId.EVENT_UNIONKILLROOM_PLAYERLEAVE, self.OnPlayerLeave, self)
XEventManager.RemoveEventListener(XEventId.EVENT_UNIONKILL_ROOMDATANOTIFY, self.OnStageRoomDataNotify, self)
XEventManager.RemoveEventListener(XEventId.EVENT_UNIONKILLROOM_KICKOUT, self.OnPlayerKickOut, self)
XEventManager.RemoveEventListener(XEventId.EVENT_UNIONKILLROOM_AUTOMATCHCHANGE, self.OnAutuMatchChanged, self)
XEventManager.RemoveEventListener(XEventId.EVENT_UNIONKILL_ACTIVITYINFO, self.OnWeatherChanged, self)
end
function XUiUnionKillRoom:InitMembers()
self.Members = {}
for i = 1, XFubenUnionKillConfigs.MaxTeamCount do
if not self.Members[i] then
local ui = CS.UnityEngine.Object.Instantiate(self.InforGroup.gameObject)
ui.transform:SetParent(self.Content, false)
self.Members[i] = XUiUnionKillMember.New(ui, self, i)
end
self.Members[i].GameObject:SetActiveEx(true)
self.Members[i]:InitNonePlayerView()
end
end
function XUiUnionKillRoom:OnInviteClick(index)
for i = 1, XFubenUnionKillConfigs.MaxTeamCount do
if self.Members[i] then
self.Members[i]:ChangeInviteView(index == i)
end
end
end
function XUiUnionKillRoom:OnOperateClick(index)
for i = 1, XFubenUnionKillConfigs.MaxTeamCount do
if self.Members[i] then
self.Members[i]:ChangeOperationView(index == i)
end
end
end
function XUiUnionKillRoom:OnStart()
self.RoomData = XDataCenter.FubenUnionKillRoomManager.GetUnionRoomData()
if not self.RoomData then return end
self:OnPlayerChanged()
self:OnChangeQuickMatch()
self.UnionKillInfo = XDataCenter.FubenUnionKillManager.GetUnionKillInfo()
if not self.UnionKillInfo or not self.UnionKillInfo.CurSectionId then return end
self.SectionTemplate = XFubenUnionKillConfigs.GetUnionSectionById(self.UnionKillInfo.CurSectionId)
self.SectionConfig = XFubenUnionKillConfigs.GetUnionSectionConfigById(self.UnionKillInfo.CurSectionId)
self.WeatherConfig = XFubenUnionKillConfigs.GetUnionWeatherConfigById(self.UnionKillInfo.WeatherId)
local activityConfig = XFubenUnionKillConfigs.GetUnionActivityConfigById(self.UnionKillInfo.Id)
self.TxtTitle.text = activityConfig.Name
self.TxtEnvBuff.text = CS.XTextManager.GetText("UnionRoomEnvTitle", self.WeatherConfig.Name)
end
function XUiUnionKillRoom:OnEnable()
if not self.RoomData then return end
local playerData = self.RoomData.PlayerDataList[XPlayer.Id]
if not playerData then return end
if XFubenUnionKillConfigs.UnionRoomPlayerState.Select == playerData.State then
XDataCenter.FubenUnionKillRoomManager.ChangePlayerState(XFubenUnionKillConfigs.UnionRoomPlayerState.Normal, function()
playerData.State = XFubenUnionKillConfigs.UnionRoomPlayerState.Normal
self:OnAllPlayerChanged()
self:UpdateBottomButtons()
end)
else
self:OnAllPlayerChanged()
self:UpdateBottomButtons()
end
end
function XUiUnionKillRoom:UpdateBottomButtons()
local isLeader = XDataCenter.FubenUnionKillRoomManager.IsLeader(XPlayer.Id)
local isAllReady = XDataCenter.FubenUnionKillRoomManager.IsAllMemberReady()
if isLeader then
self.BtnReady.gameObject:SetActiveEx(not isLeader)
self.BtnCancelReady.gameObject:SetActiveEx(not isLeader)
self.BtnWaiting.gameObject:SetActiveEx(not isAllReady)
self.BtnTongBlack.gameObject:SetActiveEx(isAllReady)
else
self.BtnWaiting.gameObject:SetActiveEx(isLeader)
self.BtnTongBlack.gameObject:SetActiveEx(isLeader)
local player_state = XDataCenter.FubenUnionKillRoomManager.GetPlayerState(XPlayer.Id)
self.BtnReady.gameObject:SetActiveEx(player_state ~= XFubenUnionKillConfigs.UnionRoomPlayerState.Ready)
self.BtnCancelReady.gameObject:SetActiveEx(player_state == XFubenUnionKillConfigs.UnionRoomPlayerState.Ready)
end
end
function XUiUnionKillRoom:UpdateBtnsStatus(playerId, playerLastState)
self:UpdateBottomButtons()
-- local isLeader = XDataCenter.FubenUnionKillRoomManager.IsLeader(XPlayer.Id)
local isAllReady = XDataCenter.FubenUnionKillRoomManager.IsAllMemberReady()
-- 开启队长死亡倒计时
if not self.RoomData then return end
local teammateCount = 0
local leaderIsSelecting = false
for id, playerData in pairs(self.RoomData.PlayerDataList or {}) do
if id ~= XPlayer.Id then
teammateCount = teammateCount + 1
end
if playerData.Leader and playerId and playerData.Id == playerId then
leaderIsSelecting = true
if playerLastState and playerLastState == XFubenUnionKillConfigs.UnionRoomPlayerState.Fight then
leaderIsSelecting = false
end
end
end
-- 队伍中不止队长一人
if not leaderIsSelecting then
if isAllReady and teammateCount == 3 then
self:StartAllReadyCountDown()
else
self:EndAllReadyCountDown()
end
end
end
function XUiUnionKillRoom:OnPlayerChanged()
self:InitPlayerList()
self:SetTeammates()
self:UpdateBtnsStatus()
end
function XUiUnionKillRoom:InitPlayerList()
self.PlayerList = {}
for id, _ in pairs(self.RoomData.PlayerDataList or {}) do
if id == XPlayer.Id then
table.insert(self.PlayerList, 1, {
PlayerId = id
})
else
table.insert(self.PlayerList, {
PlayerId = id
})
end
end
end
function XUiUnionKillRoom:SetTeammates()
for i = 1, XFubenUnionKillConfigs.MaxTeamCount do
if self.PlayerList[i] then
local memberId = self.PlayerList[i].PlayerId
self.Members[i]:InitPlayerView(self.RoomData.PlayerDataList[memberId])
else
self.Members[i]:InitNonePlayerView()
end
end
end
function XUiUnionKillRoom:OnReceRoomMsg(chatData)
-- 弹tips
if chatData.MsgType == ChatMsgType.Normal then
for i = 1, XFubenUnionKillConfigs.MaxTeamCount do
if self.Members[i] then
self.Members[i]:ProcessTipTalk(chatData.SenderId, chatData.Content)
end
end
elseif chatData.MsgType == ChatMsgType.Emoji then
for i = 1, XFubenUnionKillConfigs.MaxTeamCount do
if self.Members[i] then
self.Members[i]:ProcessTipEmoji(chatData.SenderId, tonumber(chatData.Content))
end
end
end
-- 显示当前说的话
self:RefreshChatMsg(chatData)
end
function XUiUnionKillRoom:RefreshChatMsg(chatDataLua)
local senderName = XDataCenter.SocialManager.GetPlayerRemark(chatDataLua.SenderId, chatDataLua.NickName)
if chatDataLua.MsgType == ChatMsgType.Emoji then
self.TxtMessageContent.text = string.format("%s:%s", senderName, CS.XTextManager.GetText("EmojiText"))
else
self.TxtMessageContent.text = string.format("%s:%s", senderName, chatDataLua.Content)
end
if not string.IsNilOrEmpty(chatDataLua.CustomContent) then
self.TxtMessageContent.supportRichText = true
else
self.TxtMessageContent.supportRichText = false
end
if XUiHelper.CalcTextWidth(self.TxtMessageContent) > MAX_CHAT_WIDTH then
self.TxtMessageContent.text = string.Utf8Sub(self.TxtMessageContent.text, 1, CHAT_SUB_LENGTH) .. [[......]]
end
end
-- 切换角色
function XUiUnionKillRoom:OnChangeMyShareRole(characterId)
-- 只更新我的,我的界面只有我自己能更改
XDataCenter.FubenUnionKillRoomManager.SelectUnionRole(characterId, function()
if not self.RoomData then return end
local playerData = self.RoomData.PlayerDataList[XPlayer.Id]
for i = 1, XFubenUnionKillConfigs.MaxTeamCount do
if self.Members[i] then
self.Members[i]:UpdateShareCharacterById(XPlayer.Id, playerData.FightNpcData)
end
end
end)
end
-- 快速匹配变化
function XUiUnionKillRoom:OnChangeQuickMatch()
if not self.RoomData then return end
self.BtnAutoMatch.ButtonState = self.RoomData.AutoMatch and CS.UiButtonState.Select or CS.UiButtonState.Normal
end
-- 队长变化
function XUiUnionKillRoom:OnTeamLeaderChanged()
if not self.RoomData then return end
for i = 1, XFubenUnionKillConfigs.MaxTeamCount do
if self.PlayerList[i] then
local memberId = self.PlayerList[i].PlayerId
local playerData = self.RoomData.PlayerDataList[memberId]
self.Members[i]:SetLeaderFlag(playerData.Leader)
else
self.Members[i]:SetLeaderFlag(false)
end
end
self:OnAllPlayerChanged()
self:UpdateBtnsStatus()
end
-- 玩家状态改变
function XUiUnionKillRoom:OnPlayerStageChanged(playerId, playerLastState)
if not self.RoomData then return end
for i = 1, XFubenUnionKillConfigs.MaxTeamCount do
if self.PlayerList[i] then
local memberId = self.PlayerList[i].PlayerId
if playerId == memberId then
self.Members[i]:UpdatePlayerState()
end
end
end
self:UpdateBtnsStatus(playerId, playerLastState)
end
function XUiUnionKillRoom:OnAllPlayerChanged()
if not self.RoomData then return end
for i = 1, XFubenUnionKillConfigs.MaxTeamCount do
if self.PlayerList[i] then
self.Members[i]:UpdatePlayerState()
end
end
end
-- 出战角色改变
function XUiUnionKillRoom:OnFightNpcChanged(playerId)
if not self.RoomData then return end
for i = 1, XFubenUnionKillConfigs.MaxTeamCount do
if self.PlayerList[i] then
local memberId = self.PlayerList[i].PlayerId
if playerId == memberId then
local playerData = self.RoomData.PlayerDataList[memberId]
self.Members[i]:UpdateShareCharacterById(playerId, playerData.FightNpcData)
end
end
end
end
-- 其他玩家进入
function XUiUnionKillRoom:OnPlayerEnter()
self:OnPlayerChanged()
end
-- 其他玩家离开
function XUiUnionKillRoom:OnPlayerLeave()
self:OnPlayerChanged()
self:OnTeamLeaderChanged()
end
-- 收到了关卡房间信息
function XUiUnionKillRoom:OnStageRoomDataNotify()
XLuaUiManager.Open("UiUnionKillStage")
end
-- 踢出
function XUiUnionKillRoom:OnPlayerKickOut()
XLuaUiManager.Remove("UiDialog")
XLuaUiManager.Remove("UiReport")
XLuaUiManager.Remove("UiCharacter")
XLuaUiManager.Remove("UiPlayerInfo")
XLuaUiManager.Remove("UiPurchase")
XUiHelper.RemoveUiChatServeMain()
XLuaUiManager.Remove("UiMultiplayerInviteFriend")
if XUiManager.CheckTopUi(CsXUiType.Normal, "UiUnionKillRoom") then
self:Close()
else
self:Remove()
end
end
function XUiUnionKillRoom:OnBtnTongBlackClick()
-- 开始作战
XDataCenter.FubenUnionKillRoomManager.EnterUnionRoomFihgt(function()
end)
end
function XUiUnionKillRoom:OnBtnWaitingClick()
end
function XUiUnionKillRoom:OnBtnCancelReadyClick()
local playerData = self.RoomData.PlayerDataList[XPlayer.Id]
if not playerData then return end
if XFubenUnionKillConfigs.UnionRoomPlayerState.Ready == playerData.State then
XDataCenter.FubenUnionKillRoomManager.ChangePlayerState(XFubenUnionKillConfigs.UnionRoomPlayerState.Normal, function()
playerData.State = XFubenUnionKillConfigs.UnionRoomPlayerState.Normal
self:OnPlayerStageChanged(XPlayer.Id)
end)
end
end
function XUiUnionKillRoom:OnBtnReadyClick()
local playerData = self.RoomData.PlayerDataList[XPlayer.Id]
if not playerData then return end
if XFubenUnionKillConfigs.UnionRoomPlayerState.Normal == playerData.State then
XDataCenter.FubenUnionKillRoomManager.ChangePlayerState(XFubenUnionKillConfigs.UnionRoomPlayerState.Ready, function()
playerData.State = XFubenUnionKillConfigs.UnionRoomPlayerState.Ready
self:OnPlayerStageChanged(XPlayer.Id)
end)
end
end
function XUiUnionKillRoom:OnBtnAutoMatchClick()
if not XDataCenter.FubenUnionKillRoomManager.IsLeader(XPlayer.Id) then
if not self.RoomData then
self.BtnAutoMatch.ButtonState = CS.UiButtonState.Normal
else
self.BtnAutoMatch.ButtonState = self.RoomData.AutoMatch and CS.UiButtonState.Select or CS.UiButtonState.Normal
end
XUiManager.TipMsg(CS.XTextManager.GetText("MultiplayerRoomCanNotChangeAutoMatch"))
return
end
if self.RoomData then
XDataCenter.FubenUnionKillRoomManager.SetUnionQuickMatch(not self.RoomData.AutoMatch)
end
end
function XUiUnionKillRoom:OnAutuMatchChanged()
self.BtnAutoMatch.ButtonState = self.RoomData.AutoMatch and CS.UiButtonState.Select or CS.UiButtonState.Normal
end
function XUiUnionKillRoom:OnWeatherChanged()
self.UnionKillInfo = XDataCenter.FubenUnionKillManager.GetUnionKillInfo()
if not self.UnionKillInfo then return end
self.WeatherConfig = XFubenUnionKillConfigs.GetUnionWeatherConfigById(self.UnionKillInfo.WeatherId)
self.TxtEnvBuff.text = CS.XTextManager.GetText("UnionRoomEnvTitle", self.WeatherConfig.Name)
end
function XUiUnionKillRoom:OnBtnChatClick()
XUiHelper.OpenUiChatServeMain(false, ChatChannelType.Room, ChatChannelType.World)
end
function XUiUnionKillRoom:OnBtnBackClick()
local title = CS.XTextManager.GetText("UnionRoomDialogTitle")
local content = CS.XTextManager.GetText("UnionKillExitRoom")
XUiManager.DialogTip(title, content, XUiManager.DialogType.Normal, function()
end, function()
-- 发送通知
XDataCenter.FubenUnionKillRoomManager.LeaveUnionTeamRoom(function()
self:Close()
end)
end)
end
function XUiUnionKillRoom:OnBtnMainUiClick()
XLuaUiManager.RunMain()
-- local title = CS.XTextManager.GetText("UnionRoomDialogTitle")
-- local content = CS.XTextManager.GetText("UnionRoomExitRoom")
-- XUiManager.DialogTip(title, content, XUiManager.DialogType.Normal, function()
-- end, function()
-- -- 发送通知
-- XDataCenter.FubenUnionKillRoomManager.LeaveUnionTeamRoom(function()
-- end)
-- end)
end
-- 全部准备倒计时
function XUiUnionKillRoom:StartAllReadyCountDown()
self:EndAllReadyCountDown()
local now = XTime.GetServerNowTimestamp()
self.AllReadyEndTime = now + XFubenUnionKillConfigs.AllReadyCount
for i = 1, XFubenUnionKillConfigs.MaxTeamCount do
if self.Members[i] then
self.Members[i]:UpdateAllReadyCountDown(self.AllReadyEndTime - now)
end
end
self.AllReadyTimer = XScheduleManager.ScheduleForever(function()
now = XTime.GetServerNowTimestamp()
if now > self.AllReadyEndTime then
self:EndAllReadyCountDown()
return
end
for i = 1, XFubenUnionKillConfigs.MaxTeamCount do
if self.Members[i] then
self.Members[i]:UpdateAllReadyCountDown(self.AllReadyEndTime - now)
end
end
end, XScheduleManager.SECOND, 0)
end
function XUiUnionKillRoom:EndAllReadyCountDown()
if self.AllReadyTimer ~= nil then
XScheduleManager.UnSchedule(self.AllReadyTimer)
self.AllReadyTimer = nil
end
for i = 1, XFubenUnionKillConfigs.MaxTeamCount do
if self.Members[i] then
self.Members[i]:HideAllReadyCountDown()
end
end
end