static void Postfix(MainCameraControl __instance) { Transform forwardRefTransform = __instance.GetComponentInParent <PlayerController>().forwardReference;//forwardReference is the main camera transform if (pdaIsClosing && pdaCloseTimer < pdaCloseDelay) { pdaCloseTimer += Time.deltaTime; } else if (pdaCloseTimer >= pdaCloseDelay || (pdaIsClosing && Player.main.GetPDA().state == PDA.State.Opened)) { pdaIsClosing = false; pdaCloseTimer = 0; } if (Player.main.GetPDA().state == PDA.State.Closing) { pdaIsClosing = true; } //when the pda is opened the viewmodel is moved forward but even when the state is closed, it is kept foward for a short while which was causing the neck to //show if I also moved the model forward at the same time. So I maintain my own closing state with pdaIsClosing and only move the model forward after pdaCloseDelay. //There may be a better way to solve this so someone please fix it. //I think the shifting of the model happens because of local position changes in the actual 3D model since the offset values didn't change during the model shift. if (Player.main.GetPDA().state == PDA.State.Closed && !pdaIsClosing) { if (Player.main.motorMode == Player.MotorMode.Seaglide) { __instance.viewModel.transform.localPosition = __instance.viewModel.transform.parent.worldToLocalMatrix.MultiplyPoint(forwardRefTransform.position + (forwardRefTransform.up * seaglideYOffset) + forwardRefTransform.forward * seaglideZOffset); } else if (Player.main.transform.position.y < Ocean.main.GetOceanLevel() + 1f && !Player.main.IsInside() && !Player.main.precursorOutOfWater) { //use the viewModel transform instead of forwardRef since the player body pitches while swimming. string clipName = Player.main.playerAnimator.GetCurrentAnimatorClipInfo(0)[0].clip.name; if (clipName == "Back_lean" || clipName == "view_surface_swim_forward") { __instance.viewModel.transform.localPosition = __instance.viewModel.transform.parent.worldToLocalMatrix.MultiplyPoint(forwardRefTransform.position + (__instance.viewModel.transform.up * (swimYOffset - 0.1f)) + __instance.viewModel.transform.forward * (swimZOffset - 0.1f)); } else { __instance.viewModel.transform.localPosition = __instance.viewModel.transform.parent.worldToLocalMatrix.MultiplyPoint(forwardRefTransform.position + (__instance.viewModel.transform.up * swimYOffset) + __instance.viewModel.transform.forward * swimZOffset); } } else if (!__instance.cinematicMode && Player.main.motorMode != Player.MotorMode.Vehicle && Player.main.motorMode != Player.MotorMode.Seaglide) { if (Player.main.movementSpeed == 0) { __instance.viewModel.transform.localPosition = __instance.viewModel.transform.parent.worldToLocalMatrix.MultiplyPoint(forwardRefTransform.position + Vector3.up * defaultYOffset + new Vector3(forwardRefTransform.forward.x, 0f, forwardRefTransform.forward.z).normalized *defaultZOffset); } else { __instance.viewModel.transform.localPosition = __instance.viewModel.transform.parent.worldToLocalMatrix.MultiplyPoint(forwardRefTransform.position + Vector3.up * defaultYOffset + new Vector3(forwardRefTransform.forward.x, 0f, forwardRefTransform.forward.z).normalized *(defaultZOffset - 0.1f)); } } } }
public static void MCC_Update_Postfix(MainCameraControl __instance) { Transform forwardReference = __instance.GetComponentInParent <PlayerController>().forwardReference; if (MainPatcher.pdaIsClosing && MainPatcher.pdaCloseTimer < MainPatcher.pdaCloseDelay) { MainPatcher.pdaCloseTimer += Time.deltaTime; } else if (MainPatcher.pdaCloseTimer >= MainPatcher.pdaCloseDelay || (MainPatcher.pdaIsClosing && Player.main.GetPDA().state == PDA.State.Opened)) { MainPatcher.pdaIsClosing = false; MainPatcher.pdaCloseTimer = 0f; } if (Player.main.GetPDA().state == PDA.State.Closing) { MainPatcher.pdaIsClosing = true; } if (Player.main.GetPDA().state == PDA.State.Closed && !MainPatcher.pdaIsClosing) { if (Player.main.motorMode == Player.MotorMode.Seaglide) { __instance.viewModel.transform.localPosition = __instance.viewModel.transform.parent.worldToLocalMatrix.MultiplyPoint(forwardReference.position + forwardReference.up * MainPatcher.seaglideYOffset + forwardReference.forward * MainPatcher.seaglideZOffset); return; } #if SN1 if (Player.main.transform.position.y < Ocean.main.GetOceanLevel() + 1f && !Player.main.IsInside() && !Player.main.precursorOutOfWater) #elif BZ if (Player.main.transform.position.y < Ocean.GetOceanLevel() + 1f && !Player.main.IsInside() && !Player.main.forceWalkMotorMode) #endif { string name = Player.main.playerAnimator.GetCurrentAnimatorClipInfo(0)[0].clip.name; if (name == "Back_lean" || name == "view_surface_swim_forward") { __instance.viewModel.transform.localPosition = __instance.viewModel.transform.parent.worldToLocalMatrix.MultiplyPoint(forwardReference.position + __instance.viewModel.transform.up * (MainPatcher.swimYOffset - 0.1f) + __instance.viewModel.transform.forward * (MainPatcher.swimZOffset - 0.1f)); return; } __instance.viewModel.transform.localPosition = __instance.viewModel.transform.parent.worldToLocalMatrix.MultiplyPoint(forwardReference.position + __instance.viewModel.transform.up * MainPatcher.swimYOffset + __instance.viewModel.transform.forward * MainPatcher.swimZOffset); return; } else if (!__instance.cinematicMode && Player.main.motorMode != Player.MotorMode.Vehicle && Player.main.motorMode != Player.MotorMode.Seaglide) { if (Player.main.movementSpeed == 0f) { __instance.viewModel.transform.localPosition = __instance.viewModel.transform.parent.worldToLocalMatrix.MultiplyPoint(forwardReference.position + Vector3.up * MainPatcher.defaultYOffset + new Vector3(forwardReference.forward.x, 0f, forwardReference.forward.z).normalized *MainPatcher.defaultZOffset); return; } __instance.viewModel.transform.localPosition = __instance.viewModel.transform.parent.worldToLocalMatrix.MultiplyPoint(forwardReference.position + Vector3.up * MainPatcher.defaultYOffset + new Vector3(forwardReference.forward.x, 0f, forwardReference.forward.z).normalized *(MainPatcher.defaultZOffset - 0.1f)); } } }