189 lines
5.8 KiB
Lua
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; |