2025-01-08 22:46:12 +08:00

122 lines
4.0 KiB
Lua

---@class BP_Teleporter_C:AActor
---@field ParticleSystem_Ring UParticleSystemComponent
---@field Arrow UArrowComponent
---@field Sphere USphereComponent
---@field ParticleSystem_Arrow UParticleSystemComponent
---@field DefaultSceneRoot USceneComponent
---@field TeleporterID int32
---@field Type TEnumAsByte<ETeleportType>
---@field ParticleNormal UParticleSystem
---@field ParticleInAttackWave UParticleSystem
--Edit Below--
UGCGameSystem.UGCRequire('Script.Common.ue_enum_custom')
UGCGameSystem.UGCRequire('Script.Common.ue_struct_custom')
UGCGameSystem.UGCRequire('Script.Global.Global')
local BP_Teleporter = {
DestLoc = {},
DestRot = {},
BindPlayerKey = -100,
DestTeleporter = nil,
};
function BP_Teleporter:GetReplicatedProperties()
return
"TeleporterID",
"Type",
"BindPlayerKey"
end
function BP_Teleporter:ReceiveBeginPlay()
BP_Teleporter.SuperClass.ReceiveBeginPlay(self)
if self:HasAuthority() then
self.PlayerPawnClass = UE.LoadClass(BPClassPath.PlayerPawn)
self.Sphere.OnComponentBeginOverlap:Add(BP_Teleporter.Sphere_OnBeginOverlap, self)
else
self:OnRep_BindPlayerKey()
end
end
function BP_Teleporter:ReceiveEndPlay()
if self:HasAuthority() then
self.DestLoc = nil
self.DestRot = nil
self.PlayerPawnClass = nil
self.Sphere.OnComponentBeginOverlap:Remove(BP_Teleporter.Sphere_OnBeginOverlap, self)
end
BP_Teleporter.SuperClass.ReceiveEndPlay(self)
end
function BP_Teleporter:FindDestTeleporter()
local TeleporterClass = UE.LoadClass(BPClassPath.Teleporter)
if UE.IsValid(TeleporterClass) then
local FoundedTeleporters = totable(GameplayStatics.GetAllActorsOfClass(self, TeleporterClass, {}))
for _, Teleporter in pairs(FoundedTeleporters) do
if Teleporter.TeleporterID == self.TeleporterID and Teleporter ~= self and Teleporter.Type ~= self.Type then
self.DestTeleporter = Teleporter
break
end
end
end
end
function BP_Teleporter:OnRep_BindPlayerKey()
local LocalPC = GameDataManager.GetLocalPlayerController()
if UE.IsValid(LocalPC) and LocalPC.PlayerKey == self.BindPlayerKey then
self:SetActorHiddenInGame(false)
else
self:SetActorHiddenInGame(true)
end
end
function BP_Teleporter:SetRingColor(Trigger)
if Trigger == true then
self.ParticleSystem_Ring:SetTemplate(self.ParticleInAttackWave)
else
self.ParticleSystem_Ring:SetTemplate(self.ParticleNormal)
end
end
function BP_Teleporter:GetTeleporterID()
return self.TeleporterID
end
function BP_Teleporter:SetBindPlayerKey(InPlayerKey)
self.BindPlayerKey = InPlayerKey
end
function BP_Teleporter:TeleportPawnToDest(InPawn)
if self.Type == ETeleportType.InArena then
local PlayerController = UGCGameSystem.GetPlayerControllerByPlayerKey(self.BindPlayerKey)
local HangUpRoomPlayerStart = PlayerController.HangUpRoomPlayerStart
if HangUpRoomPlayerStart then
self.DestLoc = HangUpRoomPlayerStart:K2_GetActorLocation()
self.DestRot = HangUpRoomPlayerStart:K2_GetActorRotation()
end
else
if self.DestTeleporter == nil then
self:FindDestTeleporter()
end
self.DestLoc = self.DestTeleporter.Arrow:K2_GetComponentLocation()
self.DestRot = self.DestTeleporter.Arrow:K2_GetComponentRotation()
end
InPawn.bShouldDumpCallstackWhenMovingfast = false
InPawn:SetClientLocationOrRotation(self.DestLoc, self.DestRot, true, false)
InPawn.bShouldDumpCallstackWhenMovingfast = true
UE.Log("[BP_Teleporter:TeleportPawnToDest] ID = %d, TeleportType = %d", self.TeleporterID, self.Type)
end
function BP_Teleporter:Sphere_OnBeginOverlap(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex, bFromSweep, SweepResult)
if UE.IsValid(OtherActor) and UE.IsA(OtherActor, self.PlayerPawnClass) then
if self.BindPlayerKey == UGCPawnAttrSystem.GetPlayerKeyInt64(OtherActor) then
self:TeleportPawnToDest(OtherActor)
end
end
end
return BP_Teleporter;