107 lines
3.6 KiB
Lua
107 lines
3.6 KiB
Lua
|
---@class BP_ActiveMonsterBase_C:BP_MonsterBase_C
|
|||
|
---@field DetailWidget UWidgetComponent
|
|||
|
---@field WidgetComponent UWidgetComponent
|
|||
|
--Edit Below--
|
|||
|
|
|||
|
local MonsterBase = require('Script.Blueprint.Monster.BP_MonsterBase')
|
|||
|
local BP_ActiveMonsterBase = setmetatable(
|
|||
|
{
|
|||
|
--IsSelfDead = false;
|
|||
|
HasBegunPlay = false,
|
|||
|
KilledPlayerNum = 0,
|
|||
|
},
|
|||
|
{
|
|||
|
__index = MonsterBase,
|
|||
|
__metatable = MonsterBase
|
|||
|
}
|
|||
|
)
|
|||
|
|
|||
|
BP_ActiveMonsterBase.MonsterWidgetIndex = 0;
|
|||
|
BP_ActiveMonsterBase.TalkWidgetTimer = nil;
|
|||
|
BP_ActiveMonsterBase.bHasInit = false;
|
|||
|
|
|||
|
function BP_ActiveMonsterBase:ReceiveBeginPlayEx()
|
|||
|
if self:HasAuthority() == false then
|
|||
|
print(string.format("[BP_ActiveMonsterBase:ReceiveBeginPlayEx] 执行"))
|
|||
|
local Loc = { X = 0, Y = 0, Z = self.CapsuleComponent:GetScaledCapsuleHalfHeight() + 20 }
|
|||
|
self.WidgetComponent:K2_SetRelativeLocation(Loc)
|
|||
|
self.WidgetComponent:SetHiddenInGame(false)
|
|||
|
if UE.IsValid(self.WidgetComponent.Widget) then
|
|||
|
self.WidgetComponent.Widget:SetVisibility(ESlateVisibility.SelfHitTestInvisible);
|
|||
|
else
|
|||
|
self:NewHealthWidget();
|
|||
|
end
|
|||
|
|
|||
|
-- 设置仅显示在自己玩家的客户端
|
|||
|
local WidgetPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_ActiveMonsterTalk.WBP_ActiveMonsterTalk_C')
|
|||
|
local DetailsLoc = { X = 0, Y = 0, Z = self.CapsuleComponent:GetScaledCapsuleHalfHeight() + 50 }
|
|||
|
self.MonsterWidgetIndex = UGCWidgetManagerSystem.AddObjectPositionUI(self, WidgetPath, DetailsLoc, true, true, true)
|
|||
|
self.TalkWidgetTimer = EventSystem.SetTimerLoop(self, function()
|
|||
|
local Widget = UGCWidgetManagerSystem.GetObjectPositionUI(self, self.MonsterWidgetIndex);
|
|||
|
if UE.IsValid(Widget) then
|
|||
|
Widget:SetTalkText(self:GetMonsterType());
|
|||
|
EventSystem.StopTimer(self.TalkWidgetTimer)
|
|||
|
EventSystem.SetTimer(self, function()
|
|||
|
UGCWidgetManagerSystem.RemoveObjectPositionUI(self, self.MonsterWidgetIndex);
|
|||
|
end, 3.0)
|
|||
|
end
|
|||
|
end, 0.3)
|
|||
|
self.bHasInit = true
|
|||
|
else
|
|||
|
UnrealNetwork.CallUnrealRPC_Multicast(self, "Multi_BeginPlay")
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function BP_ActiveMonsterBase:Multi_BeginPlay()
|
|||
|
if not self.bHasInit then
|
|||
|
self:ReceiveBeginPlayEx()
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function BP_ActiveMonsterBase:ClientOnHealthChangedEx(CurrentHP, MaxHP)
|
|||
|
UE.Log("[BP_ActiveMonsterBase:ClientOnHealthChangedEx] %s: CurHealth=%.2f, MaxHealth=%.2f",
|
|||
|
KismetSystemLibrary.GetObjectName(self), CurrentHP, MaxHP)
|
|||
|
if not UE.IsValid(self.WidgetComponent.Widget) then
|
|||
|
-- 创建一个 Widget,然后添加进去
|
|||
|
self:NewHealthWidget();
|
|||
|
end
|
|||
|
self.WidgetComponent:SetVisibility(true)
|
|||
|
self.WidgetComponent.Widget:UpdateOwnerHealth(CurrentHP, MaxHP)
|
|||
|
end
|
|||
|
|
|||
|
-- 创建一个 Widget
|
|||
|
function BP_ActiveMonsterBase:NewHealthWidget()
|
|||
|
print(string.format("[BP_ActiveMonsterBase:NewHealthWidget] 执行"))
|
|||
|
local Widget = UserWidget.NewWidgetObjectBP(GameDataManager.GetLocalPlayerController(),
|
|||
|
UE.LoadClass(UGCGameSystem.GetUGCResourcesFullPath('Asset/UI/WBP_BossHealth.WBP_BossHealth_C')))
|
|||
|
self.WidgetComponent:SetWidget(Widget)
|
|||
|
Widget:SetVisibility(ESlateVisibility.SelfHitTestInvisible)
|
|||
|
end
|
|||
|
|
|||
|
function BP_ActiveMonsterBase:ReceiveEndPlayEx()
|
|||
|
if not self:HasAuthority() then
|
|||
|
self:Cleanup()
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function BP_ActiveMonsterBase:ReceiveOnMonsterDeath()
|
|||
|
if not self:HasAuthority() then
|
|||
|
self:Cleanup()
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function BP_ActiveMonsterBase:HideWidget()
|
|||
|
if UE.IsValid(self.WidgetComponent.Widget) then
|
|||
|
self.WidgetComponent.Widget:SetVisibility(ESlateVisibility.Collapsed)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function BP_ActiveMonsterBase:Cleanup()
|
|||
|
self.WidgetComponent:SetHiddenInGame(true)
|
|||
|
self:HideWidget();
|
|||
|
if UE.IsValid(self.TalkWidgetTimer) then
|
|||
|
EventSystem.StopTimer(self.TalkWidgetTimer)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
return BP_ActiveMonsterBase;
|