122 lines
4.0 KiB
Lua
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; |