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

120 lines
3.5 KiB
Lua

---@class BP_BatteryBullet_C:AActor
---@field BoomEffect UParticleSystemComponent
---@field ParticleTrailing UParticleSystemComponent
---@field BulletMesh UStaticMeshComponent
---@field SphereOverlap USphereComponent
---@field DefaultSceneRoot USceneComponent
---@field LifeTime float
---@field FlySpeed float
---@field Damage float
--Edit Below--
---@type BP_BatteryBullet_C
local BP_BatteryBullet = {
bFlying = false;
StartFlyTime = 0;
-- 预飞行的起始时间
StartPrepareTime = 0;
FlyStartPos = {X = 0, Y = 0, Z = 0};
FlyDir = {X = 0, Y = 0, Z = 0};
};
function BP_BatteryBullet:SetDamage(InDamage)
self.Damage = InDamage;
end
function BP_BatteryBullet:SetFlySpeed(InFlySpeed)
self.FlySpeed = InFlySpeed
end
function BP_BatteryBullet:SetLifeTime(InLifeTime)
self.LifeTime = InLifeTime
end
function BP_BatteryBullet:ReceiveBeginPlay()
self.SuperClass.ReceiveBeginPlay(self);
UGCLogSystem.Log("[BP_BatteryBullet_ReceiveBeginPlay]" .. KismetSystemLibrary.GetObjectName(self))
if UGCGameSystem.IsServer() then
self.SphereOverlap.OnComponentBeginOverlap:Add(self.OnBeginOverlap, self);
else
self.BulletMesh:SetHiddenInGame(true)
end
end
--- 预开火
function BP_BatteryBullet:PrepareToFire(StartTime, DelayFireTime)
self.StartPrepareTime = StartTime
self.StartFlyTime = self.StartPrepareTime + DelayFireTime
self.FlyStartPos = self:K2_GetActorLocation()
self.FlyDir = self:GetActorForwardVector()
self.bFlying = true
if UGCGameSystem.IsServer() then
else
self.BulletMesh:SetHiddenInGame(false)
self.ParticleTrailing:SetActive(true, true)
end
end
---@param OtherActor UGCPlayerPawn_C
function BP_BatteryBullet:OnBeginOverlap(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex, bFromSweep, SweepResult)
if self.bFlying and OtherActor and OtherActor.PlayerKey then
self:HitPlayer(OtherActor)
end
end
--- 击中玩家
function BP_BatteryBullet:HitPlayer(PlayerPawn)
self.bFlying = false
if UGCGameSystem.IsServer() then
UGCSendRPCSystem.ActorRPCNotify(nil, self, "HitPlayer")
UGCPawnAttrSystem.SetHealth(PlayerPawn, UGCPawnAttrSystem.GetHealth(PlayerPawn) - self.Damage)
else
self:FlyEndEffect()
end
end
--- 炮弹移动
function BP_BatteryBullet:ReceiveTick(DeltaTime)
self.SuperClass.ReceiveTick(self, DeltaTime);
if self.bFlying then
local NowTime = UGCGameSystem.GameState:GetServerGameTime()
local FlyTime = NowTime - self.StartFlyTime
if FlyTime > self.LifeTime then
self.bFlying = false
FlyTime = self.LifeTime
if not UGCGameSystem.IsServer() then
self:FlyEndEffect()
end
end
if FlyTime > 0 then
local TargetPos = VectorHelper.Add(self.FlyStartPos, VectorHelper.MulNumber(self.FlyDir, FlyTime * self.FlySpeed))
self:K2_SetActorLocation(TargetPos)
-- UGCLogSystem.Log("[BP_BatteryBullet_ReceiveTick] TargetPos:%s", VectorHelper.ToString(TargetPos))
end
end
end
--- 结束效果
function BP_BatteryBullet:FlyEndEffect()
self.BulletMesh:SetHiddenInGame(true)
self.BoomEffect:SetActive(true, true)
self.ParticleTrailing:SetActive(false, false)
SoundSystem.PlaySound(SoundSystem.ESound.Impact)
end
--[[
function BP_BatteryBullet:ReceiveEndPlay()
self.SuperClass.ReceiveEndPlay(self);
end
--]]
--[[
function BP_BatteryBullet:GetAvailableServerRPCs()
return
end
--]]
return BP_BatteryBullet;