2025-01-04 23:00:19 +08:00

146 lines
5.0 KiB
Lua

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