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