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

189 lines
5.8 KiB
Lua

---@class BP_StarManager_C:AActor
---@field Box UBoxComponent
---@field DefaultSceneRoot USceneComponent
---@field MaxStarNum int32
---@field StarPointClass UClass
---@field StarClass UClass
---@field StartStarPoints TArray<AActor*>
---@field SceneMinStarCount int32
---@field MaxSpawnStarNum int32
---@field bEnableToCheckFloor bool
--Edit Below--
local BP_StarManager = {
AllStarPoints = {};
-- 所有Star
AllStars = {};
-- 默认的Star 用于被拾取后刷新位置
-- DefaultStarActor = nil;
NowStarIndex = 1;
NowStarPointIndex = 1;
SpawnCount = 0;
StartStarPointsTable = {}
};
function BP_StarManager:ReceiveBeginPlay()
self.SuperClass.ReceiveBeginPlay(self);
if UGCGameSystem.IsServer() then
self:InitParam()
UGCEventSystem.AddListener(EventEnum.PlayerPickStar, self.PlayerPickStar, self)
-- 校准星星的可视性
self.CheckStarVisHandle= UGCEventSystem.SetTimerLoop(self, self.CheckStarVis, 5)
end
end
function BP_StarManager:InitParam()
for i, v in pairs(self.StartStarPoints) do
self.StartStarPointsTable[#self.StartStarPointsTable + 1] = v
end
-- 获取摆放位置
local TempAllStarPoint = GameplayStatics.GetAllActorsOfClass(self, self.StarPointClass, {})
for i, v in pairs(TempAllStarPoint) do
-- if not table.hasValue(self.StartStarPointsTable, v) then
self.AllStarPoints[#self.AllStarPoints + 1] = v
-- end
end
table.Shuffle(self.AllStarPoints)
-- 生成Star
for i = 1, self.MaxStarNum do
local Star = UGCGameSystem.SpawnActor(self, self.StarClass, VectorHelper.VectorZero(), VectorHelper.RotZero(), VectorHelper.ScaleOne(), nil)
self.AllStars[#self.AllStars + 1] = Star
end
UGCLogSystem.Log("[BP_StarManager_InitParam]")
end
function BP_StarManager:Active()
-- 添加一个Star
for i, v in pairs(self.StartStarPointsTable) do
self:AddStarFromPos(VectorHelper.ToLuaTable(v:K2_GetActorLocation()), false, false)
self.SpawnCount = self.SpawnCount + 1
end
end
function BP_StarManager:AddStarFromPos(NewPos, NeedToCheckFloor, NotifyClient)
local TargetStar = self:GetNewStar()
if NeedToCheckFloor and self.bEnableToCheckFloor then
UGCLogSystem.Log("[BP_StarManager_AddStarFromPos] NewPos:%s", VectorHelper.ToString(NewPos))
local EndPos = {X = NewPos.X, Y = NewPos.Y, Z = NewPos.Z - 1500}
local ObjectTypes = {ECollisionChannel.ECC_WorldStatic};
local bHit, HitResult = KismetSystemLibrary.LineTraceSingleForObjects(self, NewPos, EndPos, ObjectTypes, false, {}, EDrawDebugTrace.None)
if bHit then
NewPos = HitResult.ImpactPoint
end
UGCLogSystem.Log("[BP_StarManager_AddStarFromPos] NewPos Finish:%s", VectorHelper.ToString(NewPos))
end
TargetStar:SetPos(NewPos, NotifyClient)
TargetStar:SetStarEnable(true, NotifyClient)
end
function BP_StarManager:PlayerPickStar(PlayerKey)
if self:GetShowStartNum() <= self.SceneMinStarCount - 1 and self:CanSpawnNewStar() then
self:AddStarFromPos(self:GetNewStarPos(), false, true)
self.SpawnCount = self.SpawnCount + 1
end
UGCSendRPCSystem.ActorRPCNotify(PlayerKey, self, "PlayerPickStarEffect")
end
function BP_StarManager:CanSpawnNewStar()
return self.SpawnCount < self.MaxStarNum
end
function BP_StarManager:PlayerPickStarEffect()
SoundSystem.PlaySound(SoundSystem.ESound.PickUpBuff)
end
function BP_StarManager:GetNewStarPos(FindCount)
if FindCount == nil then FindCount = 1 end
local Res = self.AllStarPoints[self.NowStarPointIndex]
self.NowStarPointIndex = (self.NowStarPointIndex % #self.AllStarPoints) + 1
-- 判断是否满足距离内无玩家的条件,亦或者已查找完一轮
if Res:CanUse() or FindCount > #self.AllStarPoints then
return VectorHelper.ToLuaTable(Res:K2_GetActorLocation())
else
return self:GetNewStarPos(FindCount + 1)
end
end
function BP_StarManager:GetNewStar()
local Res
for i = 1, self.MaxStarNum + 1 do
Res = self.AllStars[self.NowStarIndex]
self.NowStarIndex = (self.NowStarIndex % #self.AllStars) + 1
if Res:GetEnableStar() == false then
break
end
end
return Res
end
function BP_StarManager:GetShowStartNum()
local ShowStartNum = 0
for i, v in pairs(self.AllStars) do
if v:GetEnableStar() then
ShowStartNum = ShowStartNum + 1
end
end
return ShowStartNum
end
--[[
function BP_StarManager:ReceiveTick(DeltaTime)
self.SuperClass.ReceiveTick(self, DeltaTime);
end
--]]
function BP_StarManager:ReceiveEndPlay()
if UGCGameSystem.IsServer() then
for i, v in pairs(self.AllStars) do
if UE.IsValid(v) then
v:K2_DestroyActor()
end
end
if self.CheckStarVisHandle then
UGCEventSystem.StopTimer(self.CheckStarVisHandle)
self.CheckStarVisHandle = nil
end
end
self.AllStars = {}
self.SuperClass.ReceiveEndPlay(self);
end
function BP_StarManager:CheckStarVis()
local VisStars = {}
for i, v in pairs(self.AllStars) do
VisStars[i] = v:GetEnableStar()
end
UGCSendRPCSystem.ActorRPCNotify(nil, self, "ClientCalibrationStarVis", VisStars)
end
function BP_StarManager:ClientCalibrationStarVis(VisStars)
UGCLogSystem.LogTree("[BP_StarManager_ClientCalibrationStarVis]", VisStars)
for i, v in pairs(VisStars) do
if self.AllStars[i] then
self.AllStars[i]:ClientUpdateEnableEffect(v)
else
UGCLogSystem.LogError("[BP_StarManager_ClientCalibrationStarVis] AllStars[%s] is nil", tostring(i))
end
end
end
function BP_StarManager:GetReplicatedProperties()
return "AllStars"
end
--[[
function BP_StarManager:GetAvailableServerRPCs()
return
end
--]]
return BP_StarManager;