---@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 ---@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;