2025-01-07 21:21:33 +08:00

289 lines
9.5 KiB
Lua

---@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: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;