#include "FortAthenaCreativePortal.h" #include "FortPlayerPawn.h" #include "FortPlayerControllerAthena.h" void AFortAthenaCreativePortal::TeleportPlayerToLinkedVolumeHook(UObject* Context, FFrame& Stack, void* Ret) { auto Portal = (AFortAthenaCreativePortal*)Context; // Cast? if (!Portal) return TeleportPlayerToLinkedVolumeOriginal(Context, Stack, Ret); AFortPlayerPawn* PlayerPawn = nullptr; bool bUseSpawnTags; Stack.Step(Stack.Object, &PlayerPawn); Stack.Step(Stack.Object, &bUseSpawnTags); LOG_INFO(LogDev, "PlayerPawn: {}", __int64(PlayerPawn)); if (!PlayerPawn) return TeleportPlayerToLinkedVolumeOriginal(Context, Stack, Ret); auto LinkedVolume = Portal->GetLinkedVolume(); LOG_INFO(LogDev, "LinkedVolume: {}", __int64(LinkedVolume)); if (!LinkedVolume) return TeleportPlayerToLinkedVolumeOriginal(Context, Stack, Ret); auto Location = LinkedVolume->GetActorLocation(); Location.Z -= 1000; // proper 1:1 PlayerPawn->TeleportTo(Location, FRotator()); return TeleportPlayerToLinkedVolumeOriginal(Context, Stack, Ret); } void AFortAthenaCreativePortal::TeleportPlayerHook(UObject* Context, FFrame& Stack, void* Ret) { auto Portal = (AFortAthenaCreativePortal*)Context; // Cast? if (!Portal) return TeleportPlayerOriginal(Context, Stack, Ret); AFortPlayerPawn* PlayerPawn = nullptr; FRotator TeleportRotation; Stack.Step(Stack.Object, &PlayerPawn); Stack.Step(Stack.Object, &TeleportRotation); LOG_INFO(LogDev, "PlayerPawn: {}", __int64(PlayerPawn)); if (!PlayerPawn) return TeleportPlayerOriginal(Context, Stack, Ret); static auto bReturnToCreativeHubOffset = Portal->GetOffset("bReturnToCreativeHub"); auto bReturnToCreativeHub = Portal->Get(bReturnToCreativeHubOffset); LOG_INFO(LogDev, "bReturnToCreativeHub: {}", bReturnToCreativeHub); if (bReturnToCreativeHub) { auto Controller = Cast(PlayerPawn->GetController()); if (!Controller) return TeleportPlayerOriginal(Context, Stack, Ret); AFortPlayerControllerAthena::ServerTeleportToPlaygroundLobbyIslandHook(Controller); } else { static auto TeleportLocationOffset = Portal->GetOffset("TeleportLocation"); auto& TeleportLocation = Portal->Get(TeleportLocationOffset); PlayerPawn->TeleportTo(TeleportLocation, TeleportRotation); } return TeleportPlayerOriginal(Context, Stack, Ret); }