---@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;