---@class BP_Flamethrower_C:BP_TriggerMechanismBase_C ---@field UGC_TerracottaWarriors_Defense UStaticMeshComponent ---@field Sphere USphereComponent ---@field Cone UStaticMeshComponent ---@field Scene USceneComponent ---@field P_Fire UParticleSystemComponent ---@field Flamethrower UStaticMeshComponent ---@field DamageValue float ---@field ChargingDuration float ---@field InterpSpeed float --Edit Below-- ---@type BP_Flamethrower_C local MechanismBase = require('Script.Blueprint.MechanismActor.BP_TriggerMechanismBase') local BP_Flamethrower = setmetatable( { DamageFrequency = 10.; TrackedPlayer = nil; TrackFrequency = 5.; }, { __index = MechanismBase, __metatable = MechanismBase } ); function BP_Flamethrower:ReceiveBeginPlay() self.SuperClass.ReceiveBeginPlay(self); MechanismBase.MechanismBeginPlay(self) self:SetMechanismType(MechanismConfig.TriggerMechanismType.Flamethrower) end function BP_Flamethrower:ReceiveTick(DeltaTime) self.SuperClass.ReceiveTick(self, DeltaTime); if self.TriggeredPlayer > 0 and UE.IsValid(self.TrackedPlayer) and self.TrackedPlayer:IsAlive() then local FlamethrowerRot = self.Flamethrower:K2_GetComponentRotation() local TargetPos = self.TrackedPlayer:K2_GetActorLocation() local TargetDir = VectorHelper.Sub(TargetPos, self:K2_GetActorLocation()) local TargetRot = KismetMathLibrary.MakeRotFromX(TargetDir) local NewRot = KismetMathLibrary.RInterpTo(FlamethrowerRot, TargetRot, DeltaTime, InterpSpeed) self.Flamethrower:K2_SetWorldRotation(NewRot) end end function BP_Flamethrower:ReceiveEndPlay() self:MechanismEndPlay() self.SuperClass.ReceiveEndPlay(self); end function BP_Flamethrower:Trigger(InTriggeredPlayer, InTriggerDevice, InEnergyValue) MechanismBase.Trigger(self, InTriggeredPlayer, InTriggerDevice, InEnergyValue) self.TrackHandle = UGCEventSystem.SetTimerLoop(self, self.DoTreck, 1./ self.TrackFrequency) end function BP_Flamethrower:CloseMechanism() MechanismBase.CloseMechanism(self) if self.TrackHandle then UGCEventSystem.StopTimer(self.TrackHandle) end self.TrackedPlayer = nil DOREPONCE(self, "TrackedPlayer") end function BP_Flamethrower:EnableClientTriggerEffects() MechanismBase.EnableClientTriggerEffects(self) self.P_Fire:SetActive(true, true) end function BP_Flamethrower:DisableClientTriggerEffects() MechanismBase.DisableClientTriggerEffects(self) self.P_Fire:SetActive(false, false) end function BP_Flamethrower:DoTreck() self:DetectTrackedPlayer() self:GiveOverlappingPlayerDamage() end function BP_Flamethrower:DetectTrackedPlayer() local EnableDamagePlayerKeys = self:GetEnableDamagePlayer(self.TriggeredPlayer) local TargetPlayer = nil local Dir = -1 local FlamethrowerPos = self.Flamethrower:K2_GetComponentLocation() for i, PlayerKey in pairs(EnableDamagePlayerKeys) do local TempPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(PlayerKey) if TempPawn and TempPawn:IsAlive() and UGCSystemLibrary.CanSeePlayer(self, self.Scene:K2_GetComponentLocation(), TempPawn) then local TempDir = VectorHelper.Length(VectorHelper.Sub(TempPawn:K2_GetActorLocation(), FlamethrowerPos)) if TargetPlayer == nil or TempDir < Dir then TargetPlayer = TempPawn Dir = TempDir end end end if Dir <= self.Sphere:GetScaledSphereRadius() * 1.5 then self.TrackedPlayer = TargetPlayer else self.TrackedPlayer = nil end DOREPONCE(self, "TrackedPlayer") end function BP_Flamethrower:GiveOverlappingPlayerDamage() local EnableDamagePlayerKeys = self:GetEnableDamagePlayer(self.TriggeredPlayer) local CauserController = UGCGameSystem.GetPlayerControllerByPlayerKey(self.TriggeredPlayer) for i, PlayerKey in pairs(EnableDamagePlayerKeys) do local TempPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(PlayerKey) if TempPawn and TempPawn:IsAlive() and self.Cone:IsOverlappingActor(TempPawn) and UGCSystemLibrary.CanSeePlayer(self, self.Scene:K2_GetComponentLocation(), TempPawn) then UGCGameSystem.ApplyDamage(TempPawn, self.DamageValue / self.TrackFrequency, CauserController, self, self.MechanismType) end end end function BP_Flamethrower:CheckPlayerInRange(PlayerPawn) local FlamethrowerPos = self.Flamethrower:K2_GetComponentLocation() local TempDir = VectorHelper.Length(VectorHelper.Sub(PlayerPawn:K2_GetActorLocation(), FlamethrowerPos)) return self.Sphere:GetScaledSphereRadius() > TempDir and UGCSystemLibrary.CanSeePlayer(self, self.Scene:K2_GetComponentLocation(), PlayerPawn) end function BP_Flamethrower:GetReplicatedProperties() return "TrackedPlayer" end --[[ function BP_Flamethrower:GetAvailableServerRPCs() return end --]] return BP_Flamethrower;