93 lines
2.8 KiB
Lua
Raw Permalink Normal View History

2025-01-04 23:00:19 +08:00
---@class BP_Note_C:AActor
---@field RandomPosRadius USphereComponent
---@field OverlapSphere USphereComponent
---@field ParticleSystem UParticleSystemComponent
---@field DefaultSceneRoot USceneComponent
---@field UpdatePosDelayTime float
--Edit Below--
local BP_Note = {
StartPos = {X=0,Y=0,Z=0};
Radius = 0;
bCanPickUp = true;
};
function BP_Note:ReceiveBeginPlay()
self.SuperClass.ReceiveBeginPlay(self);
if UGCGameSystem.IsServer() then
self:ParamInit()
end
end
function BP_Note:ParamInit()
self.StartPos = VectorHelper.ToLuaTable(self:K2_GetActorLocation())
self.Radius = self.RandomPosRadius:GetScaledSphereRadius()
UGCSystemLibrary.BindBeginOverlapFunc(self.OverlapSphere, self.OverlapPlayer, self)
end
function BP_Note:OverlapPlayer(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex, bFromSweep, SweepResult)
if self.bCanPickUp then
if OtherActor and OtherActor.PlayerKey then
UGCEventSystem.SendEvent(EventEnum.PlayerPickNote, OtherActor.PlayerKey)
self.bCanPickUp = false
self.UpdatePosHandle = UGCEventSystem.SetTimer(self, self.UpdatePos, self.UpdatePosDelayTime)
UGCSendRPCSystem.ActorRPCNotify(nil, self, "PlayerPickUpEffect", OtherActor.PlayerKey)
end
end
end
function BP_Note:UpdatePos()
self.UpdatePosHandle = nil
local RandomRadius = KismetMathLibrary.RandomFloatInRange(0, self.Radius)
local RandomYaw = KismetMathLibrary.RandomFloatInRange(0, 360)
local AddVector = KismetMathLibrary.GreaterGreater_VectorRotator({X = RandomRadius, Y = 0, Z = 0}, {Roll = 0, Pitch = 0, Yaw = RandomYaw})
local NewPos = VectorHelper.ToLuaTable(VectorHelper.Add(self.StartPos, AddVector))
self:K2_SetActorLocation(NewPos)
UGCSendRPCSystem.ActorRPCNotify(nil, self, "ClientUpdatePos", NewPos)
self.bCanPickUp = true
end
function BP_Note:ClientUpdatePos(NewPos)
-- UGCLogSystem.LogTree("[BP_Note_ClientUpdatePos]", NewPos)
self:K2_SetActorLocation(NewPos)
self:SetActorHiddenInGame(false)
end
function BP_Note:PlayerPickUpEffect(PlayerKey)
self:SetActorHiddenInGame(true)
if PlayerKey == UGCSystemLibrary.GetLocalPlayerKey() then
SoundSystem.PlaySound(SoundSystem.ESound.AddScore)
else
-- SoundSystem.PlaySound(SoundSystem.ESound.)
end
end
--[[
function BP_Note:ReceiveTick(DeltaTime)
self.SuperClass.ReceiveTick(self, DeltaTime);
end
--]]
function BP_Note:ReceiveEndPlay()
self.SuperClass.ReceiveEndPlay(self);
if self.UpdatePosHandle then
UGCEventSystem.StopTimer(self.UpdatePosHandle)
self.UpdatePosHandle = nil
end
end
--[[
function BP_Note:GetReplicatedProperties()
return
end
--]]
--[[
function BP_Note:GetAvailableServerRPCs()
return
end
--]]
return BP_Note;