From 8011e49b6dea8b0101b8fe5304d84f526fdb0f75 Mon Sep 17 00:00:00 2001 From: SokyranTheDragon <36712560+SokyranTheDragon@users.noreply.github.com> Date: Sun, 14 Jul 2024 17:40:01 +0200 Subject: [PATCH] Update position of attached motes based on real position (#473) This should fix the issue with Noctol eyes, along with other attached motes being drawn away from the pawns they are attached to. This was likely never really noticed before due to no other vanilla attached motes having their position as important as here. Getting a DrawPos of a pawn during ticking will cause `PawnTweener.TweenedPos` to return `TweenedPosRoot` in MP to make the method deterministic. However, `MoteAttached` updated during simulation will draw it in an incorrect position due to the pawn position not being where it is visually. The fix here is to cause `PawnTweener.TweenedPos` patch not to run while calculating the position of the attached mote. --- Source/Client/Patches/Determinism.cs | 6 ++++-- Source/Client/Patches/Patches.cs | 9 +++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Source/Client/Patches/Determinism.cs b/Source/Client/Patches/Determinism.cs index 5412aaf0..388db51f 100644 --- a/Source/Client/Patches/Determinism.cs +++ b/Source/Client/Patches/Determinism.cs @@ -20,12 +20,14 @@ namespace Multiplayer.Client.Patches [HarmonyPatch(nameof(PawnTweener.TweenedPos), MethodType.Getter)] static class DrawPosPatch { - static bool Prefix() => Multiplayer.Client == null || Multiplayer.InInterface; + public static bool returnTruePosition = false; + + static bool Prefix() => Multiplayer.Client == null || Multiplayer.InInterface || returnTruePosition; // Give the root position during ticking static void Postfix(PawnTweener __instance, ref Vector3 __result) { - if (Multiplayer.Client == null || Multiplayer.InInterface) return; + if (Multiplayer.Client == null || Multiplayer.InInterface || returnTruePosition) return; __result = __instance.TweenedPosRoot(); } } diff --git a/Source/Client/Patches/Patches.cs b/Source/Client/Patches/Patches.cs index a0c35a87..37e4e25c 100644 --- a/Source/Client/Patches/Patches.cs +++ b/Source/Client/Patches/Patches.cs @@ -9,6 +9,7 @@ using System.Reflection.Emit; using System.Text.RegularExpressions; using System.Xml.Linq; +using Multiplayer.Client.Patches; using UnityEngine; using Verse; using Verse.AI; @@ -581,4 +582,12 @@ static void FixStorage(IStoreSettingsParent __instance, StorageSettings ___allow ___allowedNutritionSettings.owner ??= __instance; } } + + [HarmonyPatch(typeof(MoteAttachLink), nameof(MoteAttachLink.UpdateDrawPos))] + static class MoteAttachLinkUsesTruePosition + { + static void Prefix() => DrawPosPatch.returnTruePosition = true; + + static void Finalizer() => DrawPosPatch.returnTruePosition = false; + } }