---@class BP_Flamethrower_C:BP_PlaceItemBase_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 PlaceItemBase = require("Script.Blueprint.PlaceItems.BP_PlaceItemBase") local BP_Flamethrower = setmetatable( { DamageFrequency = 10.; TrackedPlayer = nil; TrackFrequency = 5.; }, { __index = PlaceItemBase, __metatable = PlaceItemBase } ) function BP_Flamethrower:GetReplicatedProperties() return "TrackedPlayer", PlaceItemBase.GetReplicatedProperties(self) end function BP_Flamethrower:ReceiveBeginPlay() self.SuperClass.ReceiveBeginPlay(self); PlaceItemBase.ParentBeginPlay(self) end function BP_Flamethrower:ReceiveEndPlay() PlaceItemBase.ParentEndPlay(self) self.SuperClass.ReceiveEndPlay(self); end function BP_Flamethrower:ReceiveTick(DeltaTime) self.SuperClass.ReceiveTick(self, DeltaTime); if self.bEnableActive 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) UGCLogSystem.Log("[BP_Flamethrower_ReceiveTick]") end end function BP_Flamethrower:SetActive(InActive) -- UGCLogSystem.Log("[BP_LandMine_SetActive]") PlaceItemBase.SetActive(self, InActive) if InActive then if self.TrackHandle == nil then self.TrackHandle = UGCEventSystem.SetTimerLoop(self, self.DoTrack, 1./ self.TrackFrequency) end -- UGCSendRPCSystem.ActorRPCNotify(nil, self, "EnableClientTriggerEffects") else if self.TrackHandle then UGCEventSystem.StopTimer(self.TrackHandle) self.TrackHandle = nil end self.TrackedPlayer = nil DOREPONCE(self, "TrackedPlayer") -- UGCSendRPCSystem.ActorRPCNotify(nil, self, "DisableClientTriggerEffects") end self.bIsCooling = false end function BP_Flamethrower:OnRep_bEnableActive() if self.bEnableActive then self:EnableClientTriggerEffects() else self:DisableClientTriggerEffects() end end function BP_Flamethrower:EnableClientTriggerEffects() if self then self.P_Fire:SetActive(true, true) end end function BP_Flamethrower:DisableClientTriggerEffects() if self then self.P_Fire:SetActive(false, true) end end function BP_Flamethrower:DoTrack() self:DetectTrackedPlayer() self:GiveOverlappingPlayerDamage() end function BP_Flamethrower:DetectTrackedPlayer() local EnableDamagePlayerKeys = UGCSystemLibrary.GetAllPlayerKeys() local TargetPlayer = nil local Dir = -1 local FlamethrowerPos = self.Flamethrower:K2_GetComponentLocation() local Defender = UGCGameSystem.GameState:GetNowDefender() for i, PlayerKey in pairs(EnableDamagePlayerKeys) do if PlayerKey ~= Defender then 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 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 = UGCSystemLibrary.GetAllPlayerKeys() local Defender = UGCGameSystem.GameState:GetNowDefender() local DefenderPC = UGCGameSystem.GetPlayerControllerByPlayerKey(Defender) for i, PlayerKey in pairs(EnableDamagePlayerKeys) do if PlayerKey ~= Defender then 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 if PlacementModeConfig.IsPlaceMode() then UGCGameSystem.ApplyDamage(TempPawn, self.DamageValue / self.TrackFrequency, TempPawn:GetController(), self, EDamageType.PoisonDamage) UGCLogSystem.Log("[BP_Flamethrower_GiveOverlappingPlayerDamage]1 Damage:%s", tostring(self.DamageValue / self.TrackFrequency)) else UGCGameSystem.ApplyDamage(TempPawn, self.DamageValue / self.TrackFrequency, DefenderPC, self,EDamageType.PoisonDamage) UGCLogSystem.Log("[BP_Flamethrower_GiveOverlappingPlayerDamage]2 Damage:%s", tostring(self.DamageValue / self.TrackFrequency)) end end 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:GetAvailableServerRPCs() return end --]] return BP_Flamethrower;