From 4f546bc87e4de080fb6c549057f76f4d12e9f241 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= <159546+serprex@users.noreply.github.com> Date: Mon, 28 Sep 2026 14:11:22 +0000 Subject: [PATCH] Fix Link being out of bounds while loading into scene on epona with spinning free cam (#7270) --- ...FreeLookDoorCamRelease.cpp => FreeLook.cpp} | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) rename soh/soh/Enhancements/camera/{FreeLookDoorCamRelease.cpp => FreeLook.cpp} (51%) diff --git a/soh/soh/Enhancements/camera/FreeLookDoorCamRelease.cpp b/soh/soh/Enhancements/camera/FreeLook.cpp similarity index 51% rename from soh/soh/Enhancements/camera/FreeLookDoorCamRelease.cpp rename to soh/soh/Enhancements/camera/FreeLook.cpp index 6eeb09757e..0390738722 100644 --- a/soh/soh/Enhancements/camera/FreeLookDoorCamRelease.cpp +++ b/soh/soh/Enhancements/camera/FreeLook.cpp @@ -8,10 +8,13 @@ extern "C" { #include "global.h" +#include "src/overlays/actors/ovl_En_Horse/z_en_horse.h" } -void RegisterFreeLookDoorCamRelease() { - COND_VB_SHOULD(VB_RELEASE_DOORC_CAMERA, CVarGetInteger(CVAR_SETTING("FreeLook.Enabled"), 0), { +void RegisterFreeLookFixes() { + bool freeLook = CVarGetInteger(CVAR_SETTING("FreeLook.Enabled"), 0); + + COND_VB_SHOULD(VB_RELEASE_DOORC_CAMERA, freeLook, { Camera* camera = va_arg(args, Camera*); // Also release the door peek camera when free look moves it, reusing SetCameraManual's threshold. @@ -23,6 +26,15 @@ void RegisterFreeLookDoorCamRelease() { *should = true; } }); + + // EnHorse_Init sets riderPos as a world position instead of an offset, + // putting Link out of bounds until horse drawn. + COND_ID_HOOK(OnActorInit, ACTOR_EN_HORSE, freeLook, [](void* refActor) { + EnHorse* enHorse = reinterpret_cast(refActor); + enHorse->riderPos.x = 0.0f; + enHorse->riderPos.y = 70.0f; + enHorse->riderPos.z = 0.0f; + }); } -static RegisterShipInitFunc initFunc(RegisterFreeLookDoorCamRelease, { CVAR_SETTING("FreeLook.Enabled") }); +static RegisterShipInitFunc initFunc(RegisterFreeLookFixes, { CVAR_SETTING("FreeLook.Enabled") });