146 lines
5.0 KiB
Lua
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; |