2025-01-04 23:00:19 +08:00

142 lines
4.8 KiB
Lua

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