UGCProjects/GZJ/Script/UI/WBP_AttackBossPanel.lua

157 lines
5.6 KiB
Lua
Raw Normal View History

2025-01-08 22:46:12 +08:00
---@class WBP_AttackBossPanel_C:UUserWidget
---@field Anim_Fade_Out UWidgetAnimation
---@field Anim_Fade_In UWidgetAnimation
---@field Button_Trigger UButton
---@field CheckBox_Boss_1 UCheckBox
---@field CheckBox_Boss_2 UCheckBox
---@field CheckBox_Boss_3 UCheckBox
---@field CheckBox_Boss_4 UCheckBox
---@field Panel_Button_Trigger UCanvasPanel
---@field Panel_Info UCanvasPanel
---@field Panel_Player_1 UCanvasPanel
---@field Panel_Player_2 UCanvasPanel
---@field Panel_Player_3 UCanvasPanel
---@field Panel_Player_4 UCanvasPanel
---@field ProogressBar_Damage_Player_1 UProgressBar
---@field ProogressBar_Damage_Player_2 UProgressBar
---@field ProogressBar_Damage_Player_3 UProgressBar
---@field ProogressBar_Damage_Player_4 UProgressBar
---@field TextBlock_Damage_Player_1 UTextBlock
---@field TextBlock_Damage_Player_2 UTextBlock
---@field TextBlock_Damage_Player_3 UTextBlock
---@field TextBlock_Damage_Player_4 UTextBlock
---@field TextBlock_Name_Player_1 UTextBlock
---@field TextBlock_Name_Player_2 UTextBlock
---@field TextBlock_Name_Player_3 UTextBlock
---@field TextBlock_Name_Player_4 UTextBlock
---@field TextBlock_Percent_Player_1 UTextBlock
---@field TextBlock_Percent_Player_2 UTextBlock
---@field TextBlock_Percent_Player_3 UTextBlock
---@field TextBlock_Percent_Player_4 UTextBlock
---@field WidgetSwitcher_Trigger UWidgetSwitcher
--Edit Below--
local WBP_AttackBossPanel = {
bInitDoOnce = false,
bHasTriggered = false,
CheckBoxList = {},
CurIndex = 0,
PlayerDamageList = {},
}
function WBP_AttackBossPanel:Construct()
WBP_AttackBossPanel.SuperClass.Construct(self)
if self.bInitDoOnce then
return
end
self.bInitDoOnce = true
self.CurIndex = 1
local AnimFinishDelegate = ObjectExtend.CreateDelegate(self,
function()
if self.bHasTriggered then
self.Panel_Info:SetRenderOpacity(1)
else
self.Panel_Info:SetRenderOpacity(0)
end
end)
self:BindToAnimationFinished(self.Anim_Fade_In, AnimFinishDelegate)
self.Button_Trigger.OnClicked:Add(WBP_AttackBossPanel.OnTriggerButtonClicked, self)
self.CheckBoxList ={
self.CheckBox_Boss_1,
self.CheckBox_Boss_2,
self.CheckBox_Boss_3,
self.CheckBox_Boss_4,
}
for index, CheckBox in ipairs(self.CheckBoxList) do
CheckBox.OnCheckStateChanged:Add(
function(bIsChecked)
if bIsChecked then
self.CurIndex = index
self:OnCurIndexChanged(self.CurIndex)
end
end, self)
end
EventSystem:AddListener(EventType.OnPlayerDamageChanged, WBP_AttackBossPanel.OnPlayerDamageChanged, self)
end
function WBP_AttackBossPanel:Destruct()
EventSystem:RemoveListener(EventType.OnPlayerDamageChanged, WBP_AttackBossPanel.OnPlayerDamageChanged, self)
self:UnbindAllFromAnimationFinished(self.Anim_Fade_In)
self.Button_Trigger.OnClicked:Remove(WBP_AttackBossPanel.OnTriggerButtonClicked, self)
WBP_AttackBossPanel.SuperClass.Destruct(self)
end
function WBP_AttackBossPanel:OnTriggerButtonClicked()
self.bHasTriggered = not self.bHasTriggered
local Anim = self.bHasTriggered and self.Anim_Fade_In or self.Anim_Fade_Out
self:PlayAnimation(Anim, 0.0, 1, EUMGSequencePlayMode.Forward, 1.0)
local WidgetIndex = self.bHasTriggered and 1 or 0
self.WidgetSwitcher_Trigger:SetActiveWidgetIndex(WidgetIndex)
if self.bHasTriggered then
self:OnPlayerDamageChanged(UGCGameSystem.GameState.PlayerDamageList)
end
end
function WBP_AttackBossPanel:OnCurIndexChanged(InIndex)
for index, CheckBox in ipairs(self.CheckBoxList) do
if index ~= InIndex then
CheckBox:SetIsChecked(false)
end
end
for i = 1, 4 do
self["Panel_Player_"..tostring(i)]:SetVisibility(ESlateVisibility.Collapsed)
self["CheckBox_Boss_"..tostring(i)]:SetVisibility(ESlateVisibility.Collapsed)
end
for index, _ in pairs(self.BossList) do
self["CheckBox_Boss_"..tostring(index)]:SetVisibility(ESlateVisibility.Visible)
end
local TotalDamage = 0.0
local CurBossID = self.BossList[self.CurIndex]
local CurDamageInfoList = {}
for PlayerKey, DamageInfo in pairs(self.PlayerDamageList) do
local DamageValue = tonumber(DamageInfo[CurBossID])
TotalDamage = TotalDamage + DamageValue
local CurDamageInfo = {PlayerName = "", CurDamage = 0.0}
CurDamageInfo.PlayerName = self.PlayerDataList[PlayerKey].PlayerName
CurDamageInfo.CurDamage = DamageValue
table.insert(CurDamageInfoList, CurDamageInfo)
end
for index, DamageInfo in pairs(CurDamageInfoList) do
self["Panel_Player_"..tostring(index)]:SetVisibility(ESlateVisibility.HitTestInvisible)
self["TextBlock_Name_Player_"..tostring(index)]:SetText(DamageInfo.PlayerName)
self["TextBlock_Damage_Player_"..tostring(index)]:SetText(tostring(math.ceil(DamageInfo.CurDamage)))
local DamagePercent = math.isNearlyEqual(TotalDamage, 0.0, 0.001) and 0 or DamageInfo.CurDamage / TotalDamage
self["ProogressBar_Damage_Player_"..tostring(index)]:SetPercent(DamagePercent)
self["TextBlock_Percent_Player_"..tostring(index)]:SetText(tostring(math.ceil(DamagePercent * 100).."%"))
end
end
function WBP_AttackBossPanel:OnPlayerDamageChanged(InPlayerDamageList)
if self.bHasTriggered then
self.PlayerDamageList = InPlayerDamageList
self.BossList = UGCGameSystem.GameState.BossList
self.PlayerDataList = UGCGameSystem.GameState.PlayerDataList
self.CheckBoxList[self.CurIndex]:SetIsChecked(true)
self:OnCurIndexChanged(self.CurIndex)
end
end
return WBP_AttackBossPanel;