---@class WB_GameEnd_C:UUserWidget ---@field Button_Return UButton ---@field Button_Share UButton ---@field Image_3 UImage ---@field Image_BG UImage ---@field NewButton_History UNewButton ---@field NewButton_Report UNewButton ---@field TextBlock_Return UTextBlock ---@field UIParticleEmitter_127 UUIParticleEmitter ---@field WB_GameEnd_PlayerInfo_Enemy UWB_GameEnd_PlayerInfo_C ---@field WB_GameEnd_PlayerInfo_Self UWB_GameEnd_PlayerInfo_C ---@field WB_PID UWB_PID_C ---@field WB_PlayerInfo UWB_PlayerInfo_C ---@field WidgetSwitcher_Enemy UWidgetSwitcher ---@field WidgetSwitcher_GameEnd UWidgetSwitcher --Edit Below-- ---@type WB_GameEnd_C local WB_GameEnd = { bInitDoOnce = false; }; WB_GameEnd.GameWinner = nil; WB_GameEnd.RoundWinners = {}; function WB_GameEnd:Construct() self:LuaInit(); end function WB_GameEnd:OnShowPanel(...) UE.OnCloseDS(); local vars = { ... }; local EndTime = MiniGameTimes.End; if LocalIsFriendSpectator then EndTime = 18; end GlobalTickTool:AddInternalCount(self, function(o, dt, st, t) self.TextBlock_Return:SetText("返回大厅(" .. tostring(t) .. ')'); end, 1, EndTime, self.ReturnToLobby); self:LuaInit(); UGCLogSystem.Log("[WB_GameEnd:OnShowPanel] 开始绑定设置") if not LocalIsGlobalSpectator then UGCEventSystem.SetTimer(self, function() if GlobalModeType then if GlobalModeType == GameModeConfig.EGameModeType.DefaultMode then UGCLogSystem.Log("[WB_GameEnd:OnShowPanel] 显示 Rank 和成就界面") UGCGameSystem.ShowUGCRankAndAchievementUI(); end else UGCGameSystem.ShowUGCRankAndAchievementUI(); end end, 2); end UGCLogSystem.LogTree(string.format("[WB_GameEnd:OnShowPanel] vars ="), vars); self.GameWinner = vars[1]; self.RoundWinners = vars[2]; if self.GameWinner == nil then self.GameWinner = SoloKingGameWinner; if self.GameWinner == nil then self.GameWinner = GameState.MiniInfo.GameWinner end end if self.RoundWinners == nil then self.RoundWinners = SoloKingRoundWinner; if self.RoundWinners == nil then self.RoundWinners = GameState.MiniInfo.RoundWinners end end -- 通知 GameRecord 组装数据 WidgetManager:GetPanel(WidgetConfig.EUIType.GameRecord, function(Widget) UGCLogSystem.Log("[WB_GameEnd:OnShowPanel] 执行显示 GameRecord") Widget:ShowArchives(); end) UGCLogSystem.Log("[WB_GameEnd:OnShowPanel] GameWinner = %s", tostring(self.GameWinner)); end function WB_GameEnd:LuaInit() if self.bInitDoOnce then return ; end self.bInitDoOnce = true; UGCLogSystem.Log("[WB_GameEnd:LuaInit] 执行") self.WB_PlayerInfo:LuaInit(); UITool.BindButtonClicked(self.Button_Return, self.ReturnToLobby, self); UITool.BindButtonClicked(self.NewButton_History, self.OnClickHistory, self); UITool.BindButtonToShare(self.Button_Share); self.TextBlock_Return:SetText("返回大厅"); self.WidgetSwitcher_GameEnd:SetActiveWidgetIndex(3); self.WB_PID:LuaInit(); UGCEventSystem.AddListener(EventTypes.UpdateRoundWinners, self.GotoGameEnd, self) UGCEventSystem.AddListener(EventTypes.UpdateAccountInfo, self.OnUpdateAccountInfo, self) UGCEventSystem.AddListener(EventTypes.UpdateGameWinner, self.HandleIsWin, self) if LocalIsGlobalSpectator then self.WB_GameEnd_PlayerInfo_Self:LuaInit(); self.WB_GameEnd_PlayerInfo_Enemy:LuaInit(); self.NewButton_History:SetVisibility(ESlateVisibility.Collapsed); self.Button_Share:SetVisibility(ESlateVisibility.Collapsed); else self.WB_GameEnd_PlayerInfo_Self:LuaInit(true); self.WB_GameEnd_PlayerInfo_Enemy:LuaInit(false); end UITool.BindButtonClicked(self.NewButton_Report, self.OnClickReport, self); UGCEventSystem.SetTimer(self, function() self:OnUpdateAccountInfo(); end, 10); if not (LocalIsGlobalSpectator or LocalIsFriendSpectator) then self.NewButton_Report:SetVisibility(ESlateVisibility.Visible); --self.WB_RankingListBtn:SetVisibility(ESlateVisibility.Visible); end --self.WB_RankingListBtn:LuaInit(); end function WB_GameEnd:OnClickSelectMode() UGCMultiMode.RequestMatch(1002, function(Success) UGCLogSystem.Log("[WB_GameEnd:OnClickSelectMode] Success = %s", tostring(Success)); end, self) end function WB_GameEnd:ReturnToLobby() UE.ReturnToLobby(); end function WB_GameEnd:OnNotifyRank(...) local vars = { ... }; UGCLogSystem.LogTree(string.format("[WB_GameEnd:OnNotifyRank] vars ="), vars) --- 显示段位 UI UGCLogSystem.Log("[WB_GameEnd:OnShowPanel] 显示段位UI"); UGCGameSystem.ShowUGCRankAndAchievementUI(); end function WB_GameEnd:HandleIsWin(Winner, WinnerList) UGCLogSystem.Log("[WB_GameEnd:HandleIsWin] 执行胜利方是 %s", tostring(Winner)) local WinnerTable = {}; for i, Info in pairs(WinnerList) do if Info.Winner then WinnerTable[Info.Winner] = (WinnerTable[Info.Winner] or 0) + 1; end end if LocalIsGlobalSpectator then self.WidgetSwitcher_GameEnd:SetActiveWidgetIndex(3); local TeamID = UE.GetTeamID(Winner) UGCLogSystem.Log("[WB_GameEnd:HandleIsWin] TeamID = %s", tostring(TeamID)); if TeamID == 1 then self.WB_GameEnd_PlayerInfo_Self:SetWin(true); self.WB_GameEnd_PlayerInfo_Enemy:SetWin(false); else self.WB_GameEnd_PlayerInfo_Self:SetWin(false); self.WB_GameEnd_PlayerInfo_Enemy:SetWin(true); end else if Winner == LocalPlayerKey then self.WB_GameEnd_PlayerInfo_Self:SetWin(true); self.WB_GameEnd_PlayerInfo_Enemy:SetWin(false); if table.getCount(WinnerTable) == 1 then self.WidgetSwitcher_GameEnd:SetActiveWidgetIndex(2); else self.WidgetSwitcher_GameEnd:SetActiveWidgetIndex(1); end else self.WB_GameEnd_PlayerInfo_Self:SetWin(false); self.WB_GameEnd_PlayerInfo_Enemy:SetWin(true); self.WidgetSwitcher_GameEnd:SetActiveWidgetIndex(0); end end end -- function WB_GameEnd:Tick(MyGeometry, InDeltaTime) -- end -- function WB_GameEnd:Destruct() -- end function WB_GameEnd:GotoGameEnd(RoundInfo) -- 分别计算分数 UGCLogSystem.Log("[WB_GameEnd:GotoGameEnd] 执行") if table.isEmpty(RoundInfo) then return end local ScoreTable = {}; for i, v in pairs(RoundInfo) do if v.Winner then ScoreTable[v.Winner] = 1 + (ScoreTable[v.Winner] or 0); end end UGCLogSystem.LogTree(string.format("[WB_GameEnd:GotoGameEnd] ScoreTable ="), ScoreTable) self.WB_GameEnd_PlayerInfo_Self:SetVisibility(ESlateVisibility.SelfHitTestInvisible); self.WB_GameEnd_PlayerInfo_Enemy:SetVisibility(ESlateVisibility.SelfHitTestInvisible); if LocalIsGlobalSpectator then for PlayerKey, Info in pairs(UE.GetAccountInfo()) do if Info.TeamID == 1 then self.WB_GameEnd_PlayerInfo_Self:SetPlayerInfo(PlayerKey, ScoreTable[PlayerKey], true) else self.WB_GameEnd_PlayerInfo_Enemy:SetPlayerInfo(PlayerKey, ScoreTable[PlayerKey], false) end end self.WidgetSwitcher_GameEnd:SetVisibility(ESlateVisibility.Collapsed); else -- 拿到敌方玩家的 PlayerKey local EnemyPlayerKey = 0; for i, v in pairs(UE.GetAccountInfo()) do if i ~= LocalPlayerKey then EnemyPlayerKey = i; end end self.WB_GameEnd_PlayerInfo_Self:SetPlayerInfo(LocalPlayerKey, ScoreTable[LocalPlayerKey], true) self.WB_GameEnd_PlayerInfo_Enemy:SetPlayerInfo(EnemyPlayerKey, ScoreTable[EnemyPlayerKey], false) self.WidgetSwitcher_GameEnd:SetVisibility(ESlateVisibility.SelfHitTestInvisible); end end function WB_GameEnd:OnUpdateAccountInfo(AccountInfo) UGCLogSystem.Log("[WB_GameEnd:OnUpdateAccountInfo] 执行") if LocalIsGlobalSpectator then for PlayerKey, Data in pairs(UE.GetAccountInfo()) do if Data.TeamID == 1 then self.WB_GameEnd_PlayerInfo_Self:SetPlayerKey(PlayerKey, Data); else self.WB_GameEnd_PlayerInfo_Enemy:SetPlayerKey(PlayerKey, Data); end end else for PlayerKey, Data in pairs(UE.GetAccountInfo()) do if PlayerKey == LocalPlayerKey then self.WB_GameEnd_PlayerInfo_Self:SetPlayerKey(PlayerKey, Data); else self.WB_GameEnd_PlayerInfo_Enemy:SetPlayerKey(PlayerKey, Data); end end end end function WB_GameEnd:OnUpdatePlayerRank(RankScores) UGCLogSystem.LogTree(string.format("[WB_GameEnd:OnUpdatePlayerRank] RankScores ="), RankScores) if not table.isEmpty(RankScores) then local WinnerRank = RankScores[1]; local LoserRank = RankScores[2]; if not LocalIsGlobalSpectator then if WinnerRank.PlayerKey == LocalPlayerKey then self.WB_GameEnd_PlayerInfo_Self:SetTargetRank(WinnerRank); if LoserRank then self.WidgetSwitcher_Enemy:SetActiveWidgetIndex(0); self.WB_GameEnd_PlayerInfo_Enemy:SetTargetRank(LoserRank); else self.WidgetSwitcher_Enemy:SetActiveWidgetIndex(1); end else -- 说明是敌方赢了 self.WB_GameEnd_PlayerInfo_Self:SetTargetRank(LoserRank); if LoserRank then self.WidgetSwitcher_Enemy:SetActiveWidgetIndex(0); self.WB_GameEnd_PlayerInfo_Enemy:SetTargetRank(WinnerRank); else self.WidgetSwitcher_Enemy:SetActiveWidgetIndex(1); end end else -- 分别设置胜利方和失败方 local TeamID = UE.GetTeamID(WinnerRank.PlayerKey); if TeamID == 1 then self.WB_GameEnd_PlayerInfo_Self:SetTargetRank(WinnerRank); if LoserRank then self.WidgetSwitcher_Enemy:SetActiveWidgetIndex(0); self.WB_GameEnd_PlayerInfo_Enemy:SetTargetRank(LoserRank); else self.WidgetSwitcher_Enemy:SetActiveWidgetIndex(1); end else self.WB_GameEnd_PlayerInfo_Enemy:SetTargetRank(WinnerRank); if LoserRank then self.WidgetSwitcher_Enemy:SetActiveWidgetIndex(0); self.WB_GameEnd_PlayerInfo_Self:SetTargetRank(LoserRank); else self.WidgetSwitcher_Enemy:SetActiveWidgetIndex(1); end end end end end function WB_GameEnd:OnClickHistory() WidgetManager:ShowPanel(WidgetConfig.EUIType.GameRecord, false); end function WB_GameEnd:OnClickReport() UGCLogSystem.Log("[WB_GameEnd:OnClickReport] 打开设置界面"); --WidgetManager:ClosePanel(self.UIType); UITool.OpenSettings(); end return WB_GameEnd;