120 lines
3.5 KiB
Lua
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; |