---@class WBP_TeamPanel_Item_C:UUserWidget ---@field Image_IDBG UImage ---@field Image_ItemBG UImage ---@field Image_PlayerOffOnline UImage ---@field Image_Space1 UImage ---@field Image_UpdateAttack UImage ---@field Panel_Offline UCanvasPanel ---@field ProgressBar_HP UProgressBar ---@field TextBlock_KillPoint UTextBlock ---@field TextBlock_Level UTextBlock ---@field TextBlock_Lv UTextBlock ---@field TextBlock_PlayerName UTextBlock ---@field TextBlock_TeamIndex UTextBlock ---@field WidgetSwitcher_BG UWidgetSwitcher ---@field WidgetSwitcher_Space UWidgetSwitcher ---@field WidgetSwitcher_Update UWidgetSwitcher --Edit Below-- local WBP_TeamPanel_Item = { bInitDoOnce = false, IdxInTeam = 0, PlayerKey = 0, CombatPoint = 0; HideUpdateTimer = nil; TeamColorList = { { R = 0.806952, G = 0.715693, B = 0.052861, A = 1.0 }, { R = 1, G = 0.191202, B = 0.051269, A = 1.0 }, { R = 0.43735, G = 0.219526, B = 0.396755, A = 1.0 }, { R = 0.723055, G = 0.020289, B = 0.011612, A = 1.0 }, }, }; function WBP_TeamPanel_Item:Destruct() EventSystem:RemoveListener(EventType.OnPlayerHPChanged, WBP_TeamPanel_Item.OnPlayerHPChanged, self) EventSystem:RemoveListener(EventType.OnPlayerLevelChanged, WBP_TeamPanel_Item.OnPlayerLevelChange, self) EventSystem:RemoveListener(EventType.OnPlayerCombatPointChanged, WBP_TeamPanel_Item.OnPlayerCombatPointChanged, self) self.WidgetSwitcher_Update:SetVisibility(ESlateVisibility.Collapsed); WBP_TeamPanel_Item.SuperClass.Destruct(self) end function WBP_TeamPanel_Item:SetPlayerData(InPlayerData) if self.bInitDoOnce then return end self.bInitDoOnce = true if InPlayerData.PlayerKey == nil then UE.Log("[WBP_TeamPanel_Item:SetPlayerData] [Error] Invalid PlayerData") return end self:SetVisibility(ESlateVisibility.HitTestInvisible) self.TextBlock_Lv:SetVisibility(ESlateVisibility.Collapsed) self.TextBlock_Level:SetVisibility(ESlateVisibility.Collapsed) self.TextBlock_KillPoint:SetVisibility(ESlateVisibility.Collapsed) self.PlayerKey = InPlayerData.PlayerKey self.IdxInTeam = InPlayerData.IdxInTeam self.PlayerName = InPlayerData.PlayerName self.IsOffline = InPlayerData.IsOffline self.IsDead = InPlayerData.IsDead UE.Log("[WBP_TeamPanel_Item:SetPlayerData] PlayerKey = %d, IdxInTeam = %d, PlayerName = %s, IsOffline = %s, IsDead = %s", self.PlayerKey, self.IdxInTeam, self.PlayerName, tostring(self.IsOffline), tostring(self.IsDead)) self:Init() end function WBP_TeamPanel_Item:Init() self:SetIndexInTeam() self:SetPlayerName() self:SetIsOffline() self:SetIsDead() self:InitData() end function WBP_TeamPanel_Item:InitData() local RelatedPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(self.PlayerKey) local CurHP = UGCPawnAttrSystem.GetHealth(RelatedPawn) local MaxHP = UGCPawnAttrSystem.GetHealthMax(RelatedPawn) self:OnPlayerHPChanged(self.PlayerKey, CurHP, MaxHP, 0) self:OnPlayerLevelChange(UGCGameSystem.GameState:GetAllPlayerLevel()) self:OnPlayerCombatPointChanged(UGCGameSystem.GameState.PlayerCombatPointList) EventSystem:AddListener(EventType.OnPlayerHPChanged, WBP_TeamPanel_Item.OnPlayerHPChanged, self) EventSystem:AddListener(EventType.OnPlayerLevelChanged, WBP_TeamPanel_Item.OnPlayerLevelChange, self) EventSystem:AddListener(EventType.OnPlayerCombatPointChanged, WBP_TeamPanel_Item.OnPlayerCombatPointChanged, self) end function WBP_TeamPanel_Item:SetPlayerName() self.TextBlock_PlayerName:SetText(self.PlayerName) end function WBP_TeamPanel_Item:SetIndexInTeam() self.TextBlock_TeamIndex:SetText(tostring(self.IdxInTeam)) local TeamColor = self.TeamColorList[self.IdxInTeam] if TeamColor ~= nil then self.Image_IDBG:SetColorAndOpacity(TeamColor) -- 设置中间分割的颜色 self.Image_Space1:SetColorAndOpacity(TeamColor) local TextColor = { SpecifiedColor = { R = TeamColor.R, G = TeamColor.G, B = TeamColor.B, A = TeamColor.A }, ColorUseRule = 0, } -- 设置等级的颜色 self.TextBlock_Level:SetColorAndOpacity(TextColor) end end function WBP_TeamPanel_Item:SetIsOffline() if self.IsOffline == false then self.Image_PlayerOffOnline:SetVisibility(ESlateVisibility.Collapsed) else self.Image_PlayerOffOnline:SetVisibility(ESlateVisibility.SelfHitTestInvisible) end end function WBP_TeamPanel_Item:SetIsDead() if self.IsDead == false then self.WidgetSwitcher_BG:SetActiveWidgetIndex(0) self.WidgetSwitcher_Space:SetActiveWidgetIndex(0) else self.WidgetSwitcher_BG:SetActiveWidgetIndex(1) self.WidgetSwitcher_Space:SetActiveWidgetIndex(1) end end function WBP_TeamPanel_Item:SetPlayerLevel(InLevel) self.TextBlock_Lv:SetVisibility(ESlateVisibility.HitTestInvisible) self.TextBlock_Level:SetVisibility(ESlateVisibility.HitTestInvisible) self.TextBlock_Level:SetText(tostring(InLevel)) end function WBP_TeamPanel_Item:SetPlayerCombatPoint(InCombatPoint) self.CombatPoint = InCombatPoint self.TextBlock_KillPoint:SetVisibility(ESlateVisibility.HitTestInvisible) self.TextBlock_KillPoint:SetText(tostring(InCombatPoint)) end function WBP_TeamPanel_Item:OnPlayerHPChanged(PlayerKey, CurHP, MaxHP, PrevHP) if self.PlayerKey == PlayerKey then self.ProgressBar_HP:SetPercent(CurHP / MaxHP) end end function WBP_TeamPanel_Item:OnPlayerLevelChange(InAllPlayerLevel) for PlayerKey, Level in pairs(InAllPlayerLevel) do if PlayerKey == self.PlayerKey then self:SetPlayerLevel(Level) return end end end function WBP_TeamPanel_Item:OnPlayerCombatPointChanged(InAllCombatPoint) for PlayerKey, CombatPoint in pairs(InAllCombatPoint) do if PlayerKey == self.PlayerKey then local Val = CombatPoint - 7082 CombatPoint = math.clamp(Val, 0, CombatPoint) if CombatPoint > self.CombatPoint then -- 显示上升 self.WidgetSwitcher_Update:SetActiveWidgetIndex(0); self.WidgetSwitcher_Update:SetVisibility(ESlateVisibility.SelfHitTestInvisible) elseif CombatPoint < self.CombatPoint then self.WidgetSwitcher_Update:SetActiveWidgetIndex(1); self.WidgetSwitcher_Update:SetVisibility(ESlateVisibility.SelfHitTestInvisible) else self.WidgetSwitcher_Update:SetVisibility(ESlateVisibility.Collapsed) end if UE.IsValid(self.HideUpdateTimer) then -- 隐藏 EventSystem.StopTimer(self.HideUpdateTimer); end self.HideUpdateTimer = EventSystem.SetTimer(self, function() self.WidgetSwitcher_Update:SetVisibility(ESlateVisibility.Collapsed); end, 1) self:SetPlayerCombatPoint(CombatPoint) return end end end return WBP_TeamPanel_Item;