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

178 lines
6.1 KiB
Lua

---@class WB_XinHaoQuan_C:UUserWidget
---@field CanvasPanel_Poison UCanvasPanel
---@field CanvasPanel_Update UCanvasPanel
---@field HorizontalBox_Alive UHorizontalBox
---@field HorizontalBox_Dis UHorizontalBox
---@field Image_ UImage
---@field Image_XinHaoQuan UImage
---@field TextBlock_Circle UTextBlock
---@field TextBlock_CountDown UTextBlock
---@field TextBlock_LastDis UTextBlock
---@field WidgetSwitcher_Main UWidgetSwitcher
--Edit Below--
---@type WB_XinHaoQuan_C
local WB_XinHaoQuan = { bInitDoOnce = false; };
WB_XinHaoQuan.XinHaoQuanMaterial = nil;
function WB_XinHaoQuan:Construct()
self.XinHaoQuanMaterial = self.Image_XinHaoQuan:GetDynamicMaterial();
end
WB_XinHaoQuan.CircleUpdateTime = 0.85;
WB_XinHaoQuan.UpdateCount = 0;
WB_XinHaoQuan.PointCount = 0;
function WB_XinHaoQuan:Tick(MyGeometry, InDeltaTime)
if LocalPlayerKey == nil then
self.CanvasPanel_Poison:SetVisibility(ESlateVisibility.Collapsed)
return
end
local System = PoisonCircleSystem.GetPoisonCircleSystem();
local Pawn = UGCGameSystem.GetPlayerPawnByPlayerKey(LocalPlayerKey);
if not UE.IsValid(System) then
self.CanvasPanel_Poison:SetVisibility(ESlateVisibility.Collapsed)
return
end
local State = UGCGameSystem.GameState.RoundInfo.RoundState;
--UGCLogSystem.Log("[WB_XinHaoQuan:Tick] State = %s", tostring(State));
if State == RoundState.InRound then
self.CanvasPanel_Poison:SetVisibility(ESlateVisibility.SelfHitTestInvisible);
else
self.CanvasPanel_Poison:SetVisibility(ESlateVisibility.Collapsed);
return;
end
if UE.IsValid(Pawn) and Pawn:IsAlive() then
self.CanvasPanel_Poison:SetVisibility(ESlateVisibility.SelfHitTestInvisible)
local CurrentInfo = System:GetCurrentInfo();
-- 当前中心
local PawnLoc = Pawn:K2_GetActorLocation()
local CenterLoc = CurrentInfo.Center
local Dis = VectorHelper.GetDistance2D(PawnLoc, CenterLoc) / 100;
if Dis < CurrentInfo.Radius then
self:PlayerInCircle(InDeltaTime);
self.HorizontalBox_Dis:SetVisibility(ESlateVisibility.Collapsed);
self.CanvasPanel_Update:SetVisibility(ESlateVisibility.Collapsed);
else
self:PlayerOutCircle(InDeltaTime);
self.HorizontalBox_Dis:SetVisibility(ESlateVisibility.SelfHitTestInvisible);
self.CanvasPanel_Update:SetVisibility(ESlateVisibility.SelfHitTestInvisible);
self.TextBlock_LastDis:SetText(string.format('%0.fm', Dis - CurrentInfo.Radius));
-- 计算能够存活多久
local Health = UGCPawnAttrSystem.GetHealth(Pawn);
local Time = Health / Pawn.PoisonDamage;
if Time >= 10 then
self.TextBlock_CountDown:SetText(tostring(math.floor(Time)));
else
self.TextBlock_CountDown:SetText(string.format('%0.1f', Time));
end
--- 安全区的进度
if self.XinHaoQuanMaterial == nil then
self.XinHaoQuanMaterial = self.Image_XinHaoQuan:GetDynamicMaterial();
end
self.XinHaoQuanMaterial:SetScalarParameterValue("Mask_Percent", 1. - Health / UGCPawnAttrSystem.GetHealthMax(Pawn));
end
else
self.CanvasPanel_Update:SetVisibility(ESlateVisibility.Collapsed);
self.HorizontalBox_Dis:SetVisibility(ESlateVisibility.Collapsed);
end
--- 正在刷圈
if System:GetCurrState() == PoisonCircleSystem.CircleState.RUNNING then
self.CanvasPanel_Poison:SetVisibility(ESlateVisibility.SelfHitTestInvisible)
self.TextBlock_Circle:SetVisibility(ESlateVisibility.SelfHitTestInvisible);
self.UpdateCount = self.UpdateCount + InDeltaTime;
if self.UpdateCount >= self.CircleUpdateTime then
self.UpdateCount = self.UpdateCount - self.CircleUpdateTime;
local s = ''
for i = 1, self.PointCount + 1 do
s = s .. '. '
end
self.TextBlock_Circle:SetText(string.format('安全区刷新中' .. s))
self.PointCount = (self.PointCount + 1) % 3
end
else
self.TextBlock_Circle:SetVisibility(ESlateVisibility.Collapsed);
end
end
--- 玩家在安全区内
---@param InDeltaTime float
function WB_XinHaoQuan:PlayerInCircle(InDeltaTime)
end
-- 当前的半径
function WB_XinHaoQuan:UpdatePoisonCircle(InDeltaTime)
-- 获取全局的 信号圈
local System = PoisonCircleSystem.GetPoisonCircleSystem();
if not UE.IsValid(System) then
self.CanvasPanel_Update:SetVisibility(ESlateVisibility.Collapsed);
return ;
end
--- 正在刷圈
if System:GetCurrState() == PoisonCircleSystem.CircleState.RUNNING then
self.TextBlock_Circle:SetVisibility(ESlateVisibility.SelfHitTestInvisible);
local Info = System:GetCurrentInfo();
local Material = self.Image_XinHaoQuan:GetDynamicMaterial()
Material:SetScalarParameterValue("Mask_Percent", Info.CurrentPercent);
self.UpdateCount = self.UpdateCount + InDeltaTime;
if self.UpdateCount >= self.CircleUpdateTime then
self.UpdateCount = self.UpdateCount - self.CircleUpdateTime;
local s = ''
for i = 1, self.PointCount + 1 do
s = s .. '. '
end
self.TextBlock_Circle:SetText(string.format('安全区刷新中' .. s))
self.PointCount = (self.PointCount + 1) % 3
end
else
self.TextBlock_Circle:SetVisibility(ESlateVisibility.Collapsed);
end
end
--- 玩家在安全区外
---@param InDeltaTime float
function WB_XinHaoQuan:PlayerOutCircle(InDeltaTime)
end
function WB_XinHaoQuan:DistanceToPoisonCenter()
if LocalPlayerKey == nil then
return ;
end
-- 检查玩家是否存活
local Pawn = UGCGameSystem.GetPlayerPawnByPlayerKey(LocalPlayerKey);
if UE.IsValid(Pawn) and Pawn:IsAlive() then
self.CanvasPanel_Poison:SetVisibility(ESlateVisibility.SelfHitTestInvisible);
local System = PoisonCircleSystem.GetPoisonCircleSystem();
local CurrentInfo = System:GetCurrentInfo();
-- 当前中心
local PawnLoc = Pawn:K2_GetActorLocation()
local CenterLoc = CurrentInfo.Center
local Dis = VectorHelper.GetDistance2D(PawnLoc, CenterLoc) / 100;
if Dis < CurrentInfo.Radius then
-- 说明当前没事
self.HorizontalBox_Dis:SetVisibility(ESlateVisibility.Collapsed);
else
-- 说明当前在圈外
self.HorizontalBox_Dis:SetVisibility(ESlateVisibility.SelfHitTestInvisible);
self.TextBlock_LastDis:SetText(string.format('%0.fm', Dis - CurrentInfo.Radius))
-- 显示还有多长时间存活
end
else
-- 关闭
self.CanvasPanel_Poison:SetVisibility(ESlateVisibility.Collapsed);
end
end
return WB_XinHaoQuan;