---@class WB_PoisonCircle_C:UUserWidget ---@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:DistanceToPoisonCenter() if LocalPlayerKey == nil then return end local PoisonCircle = GameState:FindPoisonCircle() if PoisonCircle then local OuterActor = PoisonCircle:GetOuterActor() if OuterActor then local Pawn = UGCGameSystem.GetPlayerPawnByPlayerKey(LocalPlayerKey); if Pawn == nil then return; end 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 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 = 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); 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) 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:EnableTick(IsEnable) if IsEnable then GlobalTickTool:AddTick(self, function(o, dt, ServerTime) o:DistanceTick(dt); o:RunningTick(dt); end); else GlobalTickTool:RemoveAll(self); end end -- function WB_PoisonCircle:Destruct() -- end return WB_PoisonCircle;