315 lines
11 KiB
Lua
Raw Permalink Normal View History

2025-01-04 23:00:19 +08:00
---@class WB_Main_C:UAEUserWidget
---@field ShowInfo UWidgetAnimation
---@field ShowScore UWidgetAnimation
---@field Border_LeftSideTeam UBorder
---@field Border_RightSideTeam UBorder
---@field Button_BodySize UButton
---@field Button_FaceNotice UButton
---@field Button_Score UButton
---@field Button_Test UButton
---@field Button_Test_Custom UButton
---@field Button_TestSide UButton
---@field CanvasPanel_2 UCanvasPanel
---@field CanvasPanel_LeftSidechampion UCanvasPanel
---@field CanvasPanel_Prepare UCanvasPanel
---@field CanvasPanel_RightSidechampion UCanvasPanel
---@field CanvasPanel_ScoreBoard UCanvasPanel
---@field CanvasPanel_Test UCanvasPanel
---@field HorizontalBox_5 UHorizontalBox
---@field HorizontalBox_6 UHorizontalBox
---@field Image_BodySizeAlert UImage
---@field Image_LeftSide_ScoreBG UImage
---@field Image_LeftSide_ScoreBG2 UImage
---@field Image_LeftSide_SlotBG UImage
---@field Image_LeftSideKillBar UImage
---@field Image_RightSide_ScoreBG UImage
---@field Image_RightSide_ScoreBG2 UImage
---@field Image_RightSide_SlotBG UImage
---@field Image_RightSideKillBar UImage
---@field LeftSide_ChampionTitle UTextBlock
---@field NewButton_TC_ScoreBoard UNewButton
---@field RightSide_ChampionTitle UTextBlock
---@field TextBlock_BodySize UTextBlock
---@field TextBlock_EnemyScore UTextBlock
---@field TextBlock_GameTime UTextBlock
---@field TextBlock_LeftSide_Champion_Level UTextBlock
---@field TextBlock_LeftSide_Current_Num UTextBlock
---@field TextBlock_LeftSide_Total_Num UTextBlock
---@field TextBlock_MaxHealth UTextBlock
---@field TextBlock_Prepare UTextBlock
---@field TextBlock_RightSide_Champion_Level UTextBlock
---@field TextBlock_RightSide_Current_Num UTextBlock
---@field TextBlock_RightSide_Total_Num UTextBlock
---@field TextBlock_SelfScore UTextBlock
---@field TextBlock_TargetNum UTextBlock
---@field TextBlock_Time UTextBlock
---@field WB_InTest_Side UWB_InTest_Side_C
---@field WB_PlayerInfo_Small UWB_PlayerInfo_Small_C
---@field WB_SelectParts UWB_SelectParts_C
---@field WidgetSwitcher_LeftSide_ScoreBG UWidgetSwitcher
---@field WidgetSwitcher_RightSide_ScoreBG UWidgetSwitcher
--Edit Below--
---@type WB_Main_C
local WB_Main = { bInitDoOnce = false; };
WB_Main.IsTestSideShow = true;
WB_Main.IsTestShow = true;
function WB_Main:Construct()
UGCLogSystem.Log("[WB_Main:Construct] 111")
UGCEventSystem.AddListener(EventTypes.GameProgressCountDownTimeChange, self.OnCountDownChange, self)
UGCEventSystem.AddListener(EventTypes.AllPlayerKDAChange, self.OnAllPlayerKDAChange, self)
UGCEventSystem.AddListener(EventTypes.PlayerAttributeChanged, self.OnAttributeChanged, self)
UGCEventSystem.AddListener(EventTypes.UpdatePlayerDatas, self.OnUpdatePlayerDatas, self)
--UGCEventSystem.AddListener(EventTypes.GameProgressChange_Gaming, self.OnClientAlready, self)
--UGCEventSystem.AddListener(EventTypes.GameProgressChange, self.OnGameProgressChange, self)
UITool.ButtonOnClickShowPanel(self.Button_FaceNotice, WidgetConfig.EUIType.FaceNotice, true)
if DefaultSettings.EnableTest then
self.WB_InTest_Side:LuaInit();
UITool.ButtonOnClickShowPanel(self.Button_Test, WidgetConfig.EUIType.Test, true);
UITool.BindButtonClicked(self.Button_TestSide, self.OnClickTestSide, self);
UITool.BindButtonClicked(self.Button_Test_Custom, self.OnClickCustomTest, self);
else
self.CanvasPanel_Test:SetVisibility(ESlateVisibility.Collapsed);
end
UITool.BindButtonClicked(self.NewButton_TC_ScoreBoard, self.OnShowScore, self)
self.TextBlock_GameTime:SetText("00:00")
self.TextBlock_LeftSide_Current_Num:SetText("00")
self.TextBlock_RightSide_Total_Num:SetText("00")
self.WB_PlayerInfo_Small:SetInGaming();
self:OnPrepare();
self.PrepareTickTimer = UGCEventSystem.SetTimerLoop(self, self.OnPrepareTick, 0.6)
--GlobalTickTool:AddTick(self, self.OnPrepareTick, 0.6)
self:OnBodySizeChange();
self.WB_SelectParts:LuaInit();
self.WB_SelectParts:SetType({ EWeaponPartType.Telescope, EWeaponPartType.Grip, EWeaponPartType.Muzzle, });
-- 检查当前是什么
if GlobalMiniMode ~= nil and GlobalMiniMode.State >= MiniGameState.ROUND_GAMING then
UGCLogSystem.Log("[WB_Main:Construct] 执行")
self.CanvasPanel_Prepare:SetVisibility(ESlateVisibility.Collapsed);
end
GlobalTickTool:AddTick(self, function()
self:CheckMaxHealth();
end, 0.2)
end
function WB_Main:Tick(MyGeometry, InDeltaTime)
end
function WB_Main:Destruct()
UGCEventSystem.RemoveListener(EventTypes.GameProgressCountDownTimeChange, self.OnCountDownChange, self)
end
function WB_Main:OnClickTestSide()
self.WB_InTest_Side:ShowTestWidget(not self.IsTestSideShow);
self.IsTestSideShow = not self.IsTestSideShow;
end
function WB_Main:OnClientAlready()
end
function WB_Main:OnGameProgressChange(Type)
if Type == DefaultSettings.EGameProgress.PREPARE then
self.CanvasPanel_Prepare:SetVisibility(ESlateVisibility.HitTestInvisible);
else
self.CanvasPanel_Prepare:SetVisibility(ESlateVisibility.Collapsed);
end
end
function WB_Main:OnClickCustomTest()
if self.IsTestShow then
self.WB_InTest_Side:SetVisibility(ESlateVisibility.Collapsed)
self.Button_FaceNotice:SetVisibility(ESlateVisibility.Collapsed)
self.Button_Test:SetVisibility(ESlateVisibility.Collapsed)
self.Button_TestSide:SetVisibility(ESlateVisibility.Collapsed)
else
self.WB_InTest_Side:SetVisibility(ESlateVisibility.SelfHitTestInvisible)
self.Button_FaceNotice:SetVisibility(ESlateVisibility.SelfHitTestInvisible)
self.Button_Test:SetVisibility(ESlateVisibility.SelfHitTestInvisible)
self.Button_TestSide:SetVisibility(ESlateVisibility.SelfHitTestInvisible)
end
self.IsTestShow = not self.IsTestShow;
end
function WB_Main:OnCountDownChange(InTime)
--UGCLogSystem.Log("[WB_Main:OnCountDownChange] InTime = %s", tostring(InTime));
if InTime <= 0 then
self.TextBlock_GameTime:SetText("00:00")
else
self.TextBlock_GameTime:SetText(string.format("%02d:%02d", InTime // 60, InTime % 60));
end
end
---@param InList table<int32, PlayerKDA_DamageItem>
function WB_Main:OnAllPlayerKDAChange(InList)
UGCLogSystem.LogTree(string.format("[WB_Main:OnAllPlayerKDAChange] InList ="), InList)
-- 计算总数
local Total = 0;
local Max = 0;
for i, v in pairs(InList) do
-- 加载头像
if v.KDA and v.KDA.Kill then
Total = Total + v.KDA.Kill;
if v.KDA.Kill > Max then Max = v.KDA.Kill; end
if LocalPlayerKey == v.PlayerKey then
self.TextBlock_LeftSide_Current_Num:SetText(string.format("%02d", v.KDA.Kill));
break ;
end
end
end
self.TextBlock_RightSide_Total_Num:SetText(string.format("%02d", Max));
if table.isEmpty(InList) then
self:SetMaxIcon(LocalPlayerKey);
else
self:SetMaxIcon(InList[1].PlayerKey);
end
end
function WB_Main:SetMyselfIcon(InIconUrl)
UITool.DownloadImage(InIconUrl, function(Texture)
self.Image_LeftSide_SlotBG:SetBrushFromTextureDynamic(Texture);
end)
end
function WB_Main:SetMaxIcon(InPlayerKey)
local AccountInfo = GameState.PlayerDatas.AccountInfo[InPlayerKey]
if AccountInfo == nil then
local Path = '/Game/Arts/UI/Atlas/BattleUI/Tmode/Frames/Armament_img_kuang2_50x50_png.Armament_img_kuang2_50x50_png';
UE.AsyncLoadObject_Cached(Path, function(TargetObject)
self.Image_RightSide_SlotBG:SetBrushFromTexture(TargetObject, true);
end)
return ;
end
UITool.DownloadImage(AccountInfo.IconURL, function(Texture)
self.Image_RightSide_SlotBG:SetBrushFromTextureDynamic(Texture);
end)
end
WB_Main.IsShowScore = false;
function WB_Main:OnShowScore()
self.IsShowScore = not self.IsShowScore;
if self.IsShowScore then
self:PlayAnimation(self.ShowScore, 0, 1, EUMGSequencePlayMode.Forward, 1)
self:SetInfos(GameState.PlayerKDA_Damages);
else
self:PlayAnimation(self.ShowScore, 0, 1, EUMGSequencePlayMode.Reverse, 1);
end
end
function WB_Main:SetInfos(InInfo)
self.WB_PlayerInfo_Small:SetInfos(InInfo);
end
function WB_Main:OnPrepare()
--self.CanvasPanel_Prepare:SetVisibility(ESlateVisibility.SelfHitTestInvisible);
end
WB_Main.DotCount = 0;
function WB_Main:OnPrepareTick()
--UGCLogSystem.Log("[WB_Main:OnPrepareTick] DotCount = %s", tostring(self.DotCount));
self.DotCount = (self.DotCount + 1) % 3;
local Str = "游戏准备中."
for i = 1, self.DotCount do Str = Str .. '.' end
self.TextBlock_Prepare:SetText(Str);
end
WB_Main.IsShowDetail = false;
function WB_Main:OnClickBodySize()
--self:PlayAnimation(self.ShowScore, 0, 1, EUMGSequencePlayMode.Forward, 1)
if self.IsShowDetail then
self:PlayAnimation(self.ShowInfo, 0, 1, EUMGSequencePlayMode.Reverse, 1)
else
self:PlayAnimation(self.ShowInfo, 0, 1, EUMGSequencePlayMode.Forward, 1)
end
self.IsShowDetail = not self.IsShowDetail;
end
function WB_Main:OnGameStart()
if self.PrepareTickTimer then
UGCEventSystem.StopTimer(self.PrepareTickTimer);
self.PrepareTickTimer = nil;
end
GlobalTickTool:RemoveAll(self);
self.DotCount = nil;
UGCLogSystem.Log("[WB_Main:OnGameStart] self.CanvasPanel_Prepare Visible = %s", tostring(self.CanvasPanel_Prepare:GetVisibility()));
self.CanvasPanel_Prepare:SetVisibility(ESlateVisibility.Collapsed);
end
function WB_Main:OnAttributeChanged(InAttrs)
if table.isEmpty(InAttrs) then return ; end
if LocalPlayerKey == nil then return end
if table.isEmpty(InAttrs[LocalPlayerKey]) then return ; end
self:OnBodySizeChange(InAttrs[LocalPlayerKey][DefaultSettings.EPawnBenefitType.BodySize])
end
WB_Main.Colors = {
[1] = { 1., 1., 1. }, -- 白色
[2] = { 0, 0.397292, 0.453 }, -- 青色
[3] = { 0.061195, 1, 0 }, -- 绿色
[4] = { 1, 1, 0 }, -- 黄色
[5] = { 1, 0, 0 }, -- 红色
}
function WB_Main:OnBodySizeChange(InSize)
if InSize == nil then InSize = 1; end
if InSize < 0.5 then InSize = 0.5; end
self.Image_BodySizeAlert:SetVisibility(ESlateVisibility.Visible);
if InSize > DefaultSettings.MaxBodySize then
self.TextBlock_BodySize:SetText(string.format("体型:%0.1f(+%0.1f)", DefaultSettings.MaxBodySize, InSize - DefaultSettings.MaxBodySize));
else
self.TextBlock_BodySize:SetText(string.format("体型:%0.1f", InSize));
end
if InSize >= 3 then
self.TextBlock_BodySize:SetColorAndOpacity({ SpecifiedColor = VectorHelper.ArrToColor(self.Colors[5]), ColorUseRule = 0 })
elseif InSize >= 2 then
self.TextBlock_BodySize:SetColorAndOpacity({ SpecifiedColor = VectorHelper.ArrToColor(self.Colors[4]), ColorUseRule = 0 })
elseif InSize > 1 then
self.TextBlock_BodySize:SetColorAndOpacity({ SpecifiedColor = VectorHelper.ArrToColor(self.Colors[2]), ColorUseRule = 0 })
elseif InSize == 1 then
self.TextBlock_BodySize:SetColorAndOpacity({ SpecifiedColor = VectorHelper.ArrToColor(self.Colors[1]), ColorUseRule = 0 })
else
self.TextBlock_BodySize:SetColorAndOpacity({ SpecifiedColor = VectorHelper.ArrToColor(self.Colors[3]), ColorUseRule = 0 })
end
UGCEventSystem.SetTimer(self, function()
self.Image_BodySizeAlert:SetVisibility(ESlateVisibility.Collapsed);
end, 2.5);
end
function WB_Main:CheckMaxHealth()
local Pawn = UGCGameSystem.GetPlayerPawnByPlayerKey(LocalPlayerKey);
if UE.IsValid(Pawn) and Pawn:IsAlive() then
local MaxHealth = UGCPawnAttrSystem.GetHealthMax(Pawn);
UGCLogSystem.Log("[WB_Main:OnBodySizeChange] MaxHealth = %s", tostring(MaxHealth));
self.TextBlock_MaxHealth:SetText(tostring(MaxHealth));
else
self.TextBlock_MaxHealth:SetText("0")
end
end
function WB_Main:SetKillTarget(InVal)
self.TextBlock_TargetNum:SetText(InVal);
end
function WB_Main:OnUpdatePlayerDatas(InDatas)
local Val = InDatas.AccountInfo[LocalPlayerKey]
if Val and Val.IconURL then
self:SetMyselfIcon(Val.IconURL);
end
for i, v in pairs(InDatas.AccountInfo) do
-- 先缓存一波
UITool.DownloadImage(v.IconURL);
end
end
return WB_Main;