2025-01-08 22:46:12 +08:00

100 lines
4.1 KiB
Lua

---@class BP_Crystal_C:BP_DamageableActor_C
---@field NarrationWidget UWidgetComponent
---@field Sphere USphereComponent
---@field Chicken USkeletalMeshComponent
---@field HealthWidget UWidgetComponent
---@field Capsule UCapsuleComponent
---@field SM_Floor UStaticMeshComponent
---@field Arrow_4 UArrowComponent
---@field Arrow_3 UArrowComponent
---@field Arrow_2 UArrowComponent
---@field Arrow_1 UArrowComponent
---@field BuffComponent USTBaseBuffSystemComponent
--Edit Below--
local BP_Crystal = {
bHasNoticedAttacked = false,
bHasNoticedBossAttacked = false,
};
function BP_Crystal:ReceiveBeginPlay()
BP_Crystal.SuperClass.ReceiveBeginPlay(self)
self.OnCurrentHpReachedZeroByAnyDamage:Add(
function(BP_Crystal, Damage, DamageType, InstigatedBy, DamageCauser)
UE.Log("[BP_Crystal:OnCurrentHpReachedZeroByAnyDamage] BP_Crystal=%s, Damage=%s, DamageType=%s, InstigatedBy=%s, DamageCauser=%s",
KismetSystemLibrary.GetObjectName(BP_Crystal),
tostring(Damage),
tostring(DamageType),
KismetSystemLibrary.GetObjectName(InstigatedBy),
KismetSystemLibrary.GetObjectName(DamageCauser))
--UnrealNetwork.CallUnrealRPC_Multicast(self, self, "Client_MulticastRPC_SetFailedSkeletalLocation", self)
-- EventSystem:SendEvent(EventType.OnCrystalHPReachedZero)
EventSystem:SendEvent(EventType.OnSendGameEnd, "ChickenDead")
end
)
self.OnAnyDamage:Add(
function(BP_Crystal, Damage, DamageType, InstigatedBy, DamageCauser)
UE.Log("[BP_Crystal:OnAnyDamage] BP_Crystal=%s, Damage=%s, DamageType=%s, InstigatedBy=%s, DamageCauser=%s",
KismetSystemLibrary.GetObjectName(BP_Crystal),
tostring(Damage),
tostring(DamageType),
KismetSystemLibrary.GetObjectName(InstigatedBy),
KismetSystemLibrary.GetObjectName(DamageCauser))
if self.bHasNoticedAttacked == false then
NoticeTipsTools.MulticastNoticeTips(ECustomNoticeType.GlobalWarningNotice, "光子鸡正遭到攻击", 6.0, true)
self.bHasNoticedAttacked = true
EventSystem.SetTimer(self, function()
self.bHasNoticedAttacked = false
end, 6.5)
end
if self.bHasNoticedBossAttacked == false then
if UE.IsValid(DamageCauser) and UE.IsA(DamageCauser, UE.LoadClass(BPClassPath.MonsterBase)) then
if DamageCauser:GetMonsterType() == EMonsterType.Boss then
self.bHasNoticedBossAttacked = true
UnrealNetwork.CallUnrealRPC_Multicast_Unreliable(UGCGameSystem.GameState, "Client_MulticastRPC_ShowCrystalAttackedByBoss")
end
end
end
end
)
end
function BP_Crystal:GetAvailableServerRPCs()
return
-- "Client_MulticastRPC_SetFailedSkeletalLocation"
end
function BP_Crystal:OnRep_CurrentHp()
BP_Crystal.SuperClass.OnRep_CurrentHp(self)
if (not UGCGameSystem.IsServer()) and EventSystem and UE.IsValid(UGCGameSystem.GameState) then
local HpPercentage = self.CurrentHp / self.MaxHp
UE.Log("[BP_Crystal:OnRep_CurrentHp] CurrentHP = %.2f, Max=%.2f, Percent = %.2f", self.CurrentHp, self.MaxHp, HpPercentage)
EventSystem:SendEvent(EventType.OnCrystalHPChanged, HpPercentage)
self.NarrationWidget.Widget:UpdateOwnerHealthPercent(HpPercentage)
end
end
function BP_Crystal:BP_PreTakeDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser)
if UE.IsValid(DamageCauser) and UE.IsA(DamageCauser, UE.LoadClass(BPClassPath.MonsterBase)) then
local Type = DamageCauser:GetMonsterType()
if Type == EMonsterType.Boss then
return 5.0
elseif Type == EMonsterType.Common then
return 1.0
end
end
return 0.0
end
function BP_Crystal:Client_MulticastRPC_SetFailedSkeletalLocation(Crystal)
Crystal.Chicken:K2_SetRelativeRotation(VectorHelper.NewRot(-90, 0, 180), false, nil, false)
Crystal.Chicken:K2_SetRelativeLocation(VectorHelper.NewVec(0, -180, 10), false, nil, false)
end
return BP_Crystal;