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

155 lines
4.4 KiB
Lua

---@class BP_AttackPoint_C:AActor
---@field Sphere USphereComponent
---@field P_AttackPoint UParticleSystemComponent
---@field DefaultSceneRoot USceneComponent
--Edit Below--
local BP_AttackPoint = {
-- 是否激活
IsActive = false;
-- 占领的时间
LastProgress = 0;
-- 开始占领的时间
StartOccupyTime = 0;
-- 正在占领中
IsOccupying = false;
-- 是否成功占领
IsSuccessfullyOccupied = false;
-- 检测的帧数
FPS = 5.;
}
function BP_AttackPoint:GetReplicatedProperties()
return
"IsActive"
,"LastProgress"
,"StartOccupyTime"
,"IsOccupying"
,"IsSuccessfullyOccupied"
end
--[[
function BP_AttackPoint:ReceiveBeginPlay()
BP_AttackPoint.SuperClass.ReceiveBeginPlay(self)
end
--]]
--[[
function BP_AttackPoint:ReceiveTick(DeltaTime)
BP_AttackPoint.SuperClass.ReceiveTick(self, DeltaTime)
end
--]]
function BP_AttackPoint:ReceiveEndPlay()
if UGCGameSystem.IsServer() then
self:SetActiveAttackPoint(false)
end
BP_AttackPoint.SuperClass.ReceiveEndPlay(self)
end
--[[
function BP_AttackPoint:GetAvailableServerRPCs()
return
end
--]]
function BP_AttackPoint:GetActive()
return self.IsActive
end
function BP_AttackPoint:SetActiveAttackPoint(InIsActive)
if InIsActive ~= self.IsActive then
self.IsActive = InIsActive
if self.IsActive then
-- 初始化
self.LastProgress = 0;
self.IsOccupying = false;
self.IsSuccessfullyOccupied = false;
-- 设置Loop
if self.UpdateHandle == nil then
self.UpdateHandle = UGCEventSystem.SetTimerLoop(self, self.UpdateAttackPointProgress, 1./self.FPS)
end
else
if self.UpdateHandle then
UGCEventSystem.StopTimer(self.UpdateHandle)
self.UpdateHandle = nil
end
end
end
end
function BP_AttackPoint:UpdateAttackPointProgress()
local AttackTeamID = UGCGameSystem.GameState:GetAttackTeam()
local TeamPlayers = UGCTeamSystem.GetPlayerKeysByTeamID(AttackTeamID)
local SelfPos = self:K2_GetActorLocation()
local TargetRadius = self.Sphere:GetScaledSphereRadius()
UGCLogSystem.Log("[BP_AttackPoint_UpdateAttackPointProgress] TargetRadius:%s, AttackTeamID:%s", tostring(TargetRadius), tostring(AttackTeamID))
UGCLogSystem.LogTree("[BP_AttackPoint_UpdateAttackPointProgress]", TeamPlayers)
local IsInRange = false
-- 判断进攻方玩家是否在范围内
for i, v in pairs(TeamPlayers) do
local PlayerPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(v)
if UE.IsValid(PlayerPawn) and PlayerPawn:IsAlive() then
local PawnPos = PlayerPawn:K2_GetActorLocation()
local Dis = VectorHelper.GetDistance(SelfPos, PawnPos)
UGCLogSystem.Log("[BP_AttackPoint_UpdateAttackPointProgress] Length:%s", tostring(Dis))
if Dis <= TargetRadius and PawnPos.Z >= SelfPos.Z then
IsInRange = true
break
end
end
end
UGCLogSystem.Log("[BP_AttackPoint_UpdateAttackPointProgress] IsInRange:%s", tostring(IsInRange))
-- 设置是否有玩家在范围内
if IsInRange then
self:PlayerEnterAttackPoint()
else
self:PlayerLeaveAttackPoint()
end
-- 判断是否占点成功
if not self.IsSuccessfullyOccupied then
if self:CheckIsSuccessfullyOccupied() then
-- 成功后发送通知
UGCEventSystem.SendEvent(EventEnum.UpdateSuccessfullyOccupied)
-- 关闭占点
self:SetActiveAttackPoint(false)
end
end
end
function BP_AttackPoint:PlayerEnterAttackPoint()
if not self.IsOccupying then
self.IsOccupying = true
self.StartOccupyTime = UGCGameSystem.GameState:GetServerGameTime()
end
end
function BP_AttackPoint:PlayerLeaveAttackPoint()
if self.IsOccupying then
self.LastProgress = self:GetProgress()
self.IsOccupying = false
end
end
-- 获取占领进度 返回秒
function BP_AttackPoint:GetProgress()
if self.IsOccupying then
return self.LastProgress + (UGCGameSystem.GameState:GetServerGameTime() - self.StartOccupyTime)
else
return self.LastProgress
end
end
function BP_AttackPoint:CheckIsSuccessfullyOccupied()
if self.IsSuccessfullyOccupied then
return true
end
return self:GetProgress() >= ProjectConfig.AttackPointTime
end
return BP_AttackPoint