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

88 lines
3.4 KiB
Lua

---@class WB_TraceTarget_C:UUserWidget
---@field Border_Target UBorder
---@field Image_Key UImage
---@field Image_Positioning UImage
---@field Overlay_Positioning UOverlay
---@field TextBlock_Dis UTextBlock
--Edit Below--
---@type WB_TraceTarget_C
local WB_TraceTarget = {
bInitDoOnce = false;
TargetPlayerKey = -1;
InterpSpeed = 20;
};
function WB_TraceTarget:Construct()
UGCEventSystem.AddListener(EventEnum.KeyOwnerChange, self.KeyOwnerChange, self)
end
function WB_TraceTarget:KeyOwnerChange(NewOwnerPlayerKey)
self.TargetPlayerKey = NewOwnerPlayerKey
if self.TargetPlayerKey > 0 and UGCSystemLibrary.GetLocalPlayerKey() == self.TargetPlayerKey then
self:SetVisibility(ESlateVisibility.Hidden)
--else
-- self:SetVisibility(ESlateVisibility.SelfHitTestInvisible)
end
end
function WB_TraceTarget:GetKey()
--if self.Key == nil then
-- self.Key = UGCSystemLibrary.GetUniqueInstanceFromPath(UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/SceneKey/BP_Key.BP_Key_C'))
--end
return self.Key
end
function WB_TraceTarget:SetKey(TargetKey, KeyColor)
if UE.IsValid(TargetKey) then
self.Key = TargetKey
if KeyColor then
self.Image_Key:SetColorAndOpacity(KeyColor)
end
end
end
function WB_TraceTarget:Tick(MyGeometry, InDeltaTime)
if self:GetKey() and (self:GetKey():GetIsRealKey() or self:GetKey():GetbEnableKeyPickup()) then
local TraceActorPos = nil
if self:GetKey().bIsRealKey and self.TargetPlayerKey > 0 and UGCSystemLibrary.GetLocalPlayerKey() ~= self.TargetPlayerKey then
local TargetPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(self.TargetPlayerKey)
if UE.IsValid(TargetPawn) then
TraceActorPos = TargetPawn:K2_GetActorLocation()
end
elseif self.TargetPlayerKey < 0 then
TraceActorPos = self:GetKey().Key:K2_GetComponentLocation()
end
if TraceActorPos then
local CanvasSlot = WidgetLayoutLibrary.SlotAsCanvasSlot(self.Border_Target)
local WidgetPosition, TargetDir = WidgetLibrary.SetWidgetAlignToWorldPosition(TraceActorPos, WidgetLayoutLibrary.SlotAsCanvasSlot(self.Border_Target))
if self.NowWidgetPos then
self.NowWidgetPos = KismetMathLibrary.Vector2DInterpTo(self.NowWidgetPos, WidgetPosition, InDeltaTime, self.InterpSpeed)
else
self.NowWidgetPos = WidgetPosition
end
CanvasSlot:SetPosition(self.NowWidgetPos)
if TargetDir then
self.Overlay_Positioning:SetVisibility(ESlateVisibility.SelfHitTestInvisible)
local UpdateAngle = KismetMathLibrary.DegAtan(TargetDir.Y / TargetDir.X)
if TargetDir.X < 0 then
UpdateAngle = UpdateAngle + 180
end
self.Overlay_Positioning:SetRenderAngle(UpdateAngle)
else
self.Overlay_Positioning:SetVisibility(ESlateVisibility.Hidden)
end
local CameraManager = UGCSystemLibrary.GetLocalPlayerController().PlayerCameraManager
local CameraPos = CameraManager:K2_GetActorLocation()
self.TextBlock_Dis:SetText(string.format("%.0fm", VectorHelper.Length(VectorHelper.Sub(TraceActorPos, CameraPos)) / 100))
end
end
end
-- function WB_TraceTarget:Destruct()
-- end
return WB_TraceTarget;