178 lines
6.1 KiB
Lua
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; |