168 lines
6.0 KiB
Lua
168 lines
6.0 KiB
Lua
|
---@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;
|