---@class WB_PoisonCircle_C:UAEUserWidget ---@field CanvasPanel_Poison UCanvasPanel ---@field CanvasPanel_Update UCanvasPanel ---@field HorizontalBox_Alive UHorizontalBox ---@field HorizontalBox_Circle UHorizontalBox ---@field HorizontalBox_Dis UHorizontalBox ---@field Image_ UImage ---@field Image_XinHaoQuan UImage ---@field TextBlock_Circle UTextBlock ---@field TextBlock_CountDown UTextBlock ---@field TextBlock_Dots UTextBlock ---@field TextBlock_LastDis UTextBlock ---@field WidgetSwitcher_Main UWidgetSwitcher --Edit Below-- ---@type WB_PoisonCircle_C local WB_PoisonCircle = { bInitDoOnce = false; }; WB_PoisonCircle.XinHaoQuanMaterial = nil; WB_PoisonCircle.RefreshStringList = { [0] = ' . ', [1] = ' . . ', [2] = ' . . . '}; WB_PoisonCircle.RefreshCount = 0; function WB_PoisonCircle:Construct() self:LuaInit(); end function WB_PoisonCircle:LuaInit() if self.bInitDoOnce then return end self:GetDynamicMaterial(); UGCEventSystem.AddListener(EventTypes.PlayerPoisonDamage, self.OnPlayerTakePoisonDamage, self) UGCEventSystem.AddListener(EventTypes.PlayerInCircle, self.OnPlayerInCircle, self) self.bInitDoOnce = true; end function WB_PoisonCircle:Tick(MyGeometry, InDeltaTime) end function WB_PoisonCircle:CustomTick(InDeltaTime) self:DistanceTick(InDeltaTime); self:RunningTick(InDeltaTime); end function WB_PoisonCircle:DistanceToPoisonCenter() if LocalPlayerKey == nil then return false end local Pawn = UGCGameSystem.GetPlayerPawnByPlayerKey(LocalPlayerKey); --UGCLogSystem.Log("[WB_PoisonCircle:DistanceToPoisonCenter] Local PlayerPawn = %s", UE.GetName(Pawn)); if Pawn == nil then return end local PoisonCircle = GameState:FindPoisonCircle() if PoisonCircle then local OuterActor = PoisonCircle:GetOuterActor(); if OuterActor then local Dis = VectorHelper.GetActorDis2D(Pawn, OuterActor); local Len = Dis / 100 - PoisonCircle:GetPoisonRadius(); if Len < 0 then self.HorizontalBox_Dis:SetVisibility(ESlateVisibility.Collapsed); self.CanvasPanel_Update:SetVisibility(ESlateVisibility.Collapsed); else self.HorizontalBox_Dis:SetVisibility(ESlateVisibility.SelfHitTestInvisible); self.CanvasPanel_Update:SetVisibility(ESlateVisibility.SelfHitTestInvisible); self.TextBlock_LastDis:SetText(string.format('%0.1f', Len)); self:OnHealthChange(Pawn); end end end return false; end function WB_PoisonCircle:GetDynamicMaterial() if self.XinHaoQuanMaterial == nil then self.XinHaoQuanMaterial = self.Image_XinHaoQuan:GetDynamicMaterial(); end return self.XinHaoQuanMaterial; end WB_PoisonCircle.RefreshTime = 0; WB_PoisonCircle.RefreshTimeCount = 1; function WB_PoisonCircle:RunningTick(InDeltaTime) local PoisonCircle = UGCGameSystem.GameState:FindPoisonCircle() if PoisonCircle == nil then return end if PoisonCircle:GetCurrState() == PoisonCircleState.RUNNING then self.HorizontalBox_Circle:SetVisibility(ESlateVisibility.SelfHitTestInvisible); else self.HorizontalBox_Circle:SetVisibility(ESlateVisibility.Collapsed); end self.RefreshTime = self.RefreshTime + InDeltaTime; if self.RefreshTime >= self.RefreshTimeCount then self.RefreshTime = self.RefreshTime - self.RefreshTimeCount; self.RefreshCount = (self.RefreshCount + 1) % 3 self.TextBlock_Dots:SetText(self.RefreshStringList[self.RefreshCount]); end end WB_PoisonCircle.PoisonDamage = 0; --- 受到毒圈伤害 ---@param InPlayerKey PlayerKey ---@param InDamage float function WB_PoisonCircle:OnPlayerTakePoisonDamage(InPlayerKey, InDamage) local PoisonCircle = GameState:FindPoisonCircle(); self.PoisonDamage = InDamage / PoisonCircle.ConstCurrCountTime; end function WB_PoisonCircle:OnHealthChange(Pawn) local Health = UGCPawnAttrSystem.GetHealth(Pawn) local MaxHealth = UGCPawnAttrSystem.GetHealthMax(Pawn); --UGCLogSystem.Log("[WB_PoisonCircle:OnHealthChange] Health = %f, MaxHealth = %f, PoisonDamage = %s", Health, MaxHealth, tostring(self.PoisonDamage)); if self.PoisonDamage == 0 then self.CanvasPanel_Update:SetVisibility(ESlateVisibility.Collapsed); return; end local Time = Health / self.PoisonDamage; local Text = ""; if Time >= 10. then Text = string.format("%d", math.floor(Time)); else Text = string.format("%.1f", Time); end self.TextBlock_CountDown:SetText(Text); self.XinHaoQuanMaterial:SetScalarParameterValue("Mask_Percent", 1 - Health / MaxHealth); end ---@param InPlayerKey PlayerKey ---@param InCircle float function WB_PoisonCircle:OnPlayerInCircle(InPlayerKey, InCircle) UGCLogSystem.Log("[WB_PoisonCircle:OnPlayerInCircle] LocalPlayerKey = %s", tostring(LocalPlayerKey)); if InPlayerKey ~= LocalPlayerKey then return end if InCircle then self.CanvasPanel_Update:SetVisibility(ESlateVisibility.SelfHitTestInvisible); self.HorizontalBox_Dis:SetVisibility(ESlateVisibility.SelfHitTestInvisible); else self.CanvasPanel_Update:SetVisibility(ESlateVisibility.Collapsed); self.HorizontalBox_Dis:SetVisibility(ESlateVisibility.Collapsed); end end function WB_PoisonCircle:DistanceTick(DeltaTime) self:DistanceToPoisonCenter(); end -- function WB_PoisonCircle:Destruct() -- end return WB_PoisonCircle;