Decompiled source of NetworkingReworked v0.2.2
NetworkingReworked.dll
Decompiled a month ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Text; using BepInEx; using HarmonyLib; using NetworkingRework.Utils; using NetworkingReworked.Physics; using Photon.Pun; using Photon.Realtime; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("NetworkingReworked")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("NetworkingReworked")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("b7ec27b9-952f-42af-894e-fa3d7b78e44b")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] internal static class FakeOwnershipData { private static readonly HashSet<int> simulatedViewIDs = new HashSet<int>(); private static readonly Dictionary<int, bool> locallyGrabbedViews = new Dictionary<int, bool>(); private static readonly Dictionary<int, bool> networkGrabbedViews = new Dictionary<int, bool>(); private static readonly Dictionary<int, int> grabCounts = new Dictionary<int, int>(); private static readonly Dictionary<int, float> recentlyThrown = new Dictionary<int, float>(); private static readonly HashSet<int> itemsInCart = new HashSet<int>(); private static readonly Dictionary<int, int> itemToCartMap = new Dictionary<int, int>(); private static Dictionary<int, object[]> cachedStreamData = new Dictionary<int, object[]>(); public static void AddItemToCart(PhotonView itemView, PhotonView cartView) { if (!itemToCartMap.ContainsKey(itemView.ViewID)) { itemToCartMap.Add(itemView.ViewID, cartView.ViewID); itemsInCart.Add(itemView.ViewID); } } public static void RemoveItemFromCart(PhotonView photonView) { itemToCartMap.Remove(photonView.ViewID); itemsInCart.Remove(photonView.ViewID); } public static bool IsItemInCart(PhotonView photonView) { return itemsInCart.Contains(photonView.ViewID); } public static int GetCartHoldingItem(PhotonView photonView) { int viewID = photonView.ViewID; if (itemsInCart.Contains(viewID)) { return itemToCartMap[viewID]; } return -1; } public static void ClearItemsInCart() { itemsInCart.Clear(); } public static void SimulateOwnership(PhotonView view) { if (!((Object)(object)view == (Object)null)) { simulatedViewIDs.Add(view.ViewID); } } public static void RemoveSimulatedOwnership(PhotonView view) { if (!((Object)(object)view == (Object)null)) { simulatedViewIDs.Remove(view.ViewID); } } public static bool IsSimulated(PhotonView view) { return (Object)(object)view != (Object)null && simulatedViewIDs.Contains(view.ViewID); } public static void SetLocallyGrabbed(PhotonView view, bool isGrabbed) { if (!((Object)(object)view == (Object)null)) { locallyGrabbedViews[view.ViewID] = isGrabbed; } } public static void SetNetworkGrabbed(PhotonView view) { if (!((Object)(object)view == (Object)null)) { int viewID = view.ViewID; networkGrabbedViews[viewID] = true; } } public static void ReleaseNetworkGrab(int id) { networkGrabbedViews[id] = false; } public static bool IsNetworkGrabbed(int photonViewID) { bool value; return networkGrabbedViews.TryGetValue(photonViewID, out value) && value; } public static bool IsLocallyGrabbed(PhotonView view) { bool value = default(bool); return (Object)(object)view != (Object)null && locallyGrabbedViews.TryGetValue(view.ViewID, out value) && value; } public static void SetRecentlyThrown(PhotonView view) { recentlyThrown.Remove(view.ViewID); recentlyThrown.Add(view.ViewID, Time.time); } public static float HowLongAgoThrown(PhotonView view) { if ((Object)(object)view == (Object)null) { return -1f; } if (recentlyThrown.TryGetValue(view.ViewID, out var value)) { return Time.time - value; } return -1f; } public static void AddGrabber(PhotonView view) { if (!((Object)(object)view == (Object)null)) { int viewID = view.ViewID; if (!grabCounts.ContainsKey(viewID)) { grabCounts[viewID] = 1; } else { grabCounts[viewID]++; } } } public static void RemoveGrabber(PhotonView view) { if ((Object)(object)view == (Object)null) { return; } int viewID = view.ViewID; if (grabCounts.ContainsKey(viewID)) { grabCounts[viewID]--; if (grabCounts[viewID] <= 0) { grabCounts.Remove(viewID); } } } public static bool IsGrabbed(PhotonView view) { int value; return (Object)(object)view != (Object)null && grabCounts.TryGetValue(view.ViewID, out value) && value > 0; } public static void ClearItem(PhotonView view) { simulatedViewIDs.Remove(view.ViewID); grabCounts.Remove(view.ViewID); locallyGrabbedViews.Remove(view.ViewID); recentlyThrown.Remove(view.ViewID); itemsInCart.Remove(view.ViewID); itemToCartMap.Remove(view.ViewID); } public static void ClearAll() { simulatedViewIDs.Clear(); grabCounts.Clear(); locallyGrabbedViews.Clear(); recentlyThrown.Clear(); itemsInCart.Clear(); } public static void ClearGrabStates() { grabCounts.Clear(); locallyGrabbedViews.Clear(); } public static void Store(int viewID, object[] data) { cachedStreamData[viewID] = data; } public static object[] Get(int viewID) { cachedStreamData.TryGetValue(viewID, out var value); return value; } public static PhotonStream ReconstructReadStream(int viewID) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Expected O, but got Unknown object[] array = Get(viewID); if (array == null) { return null; } object[] array2 = new object[array.Length - 3]; Array.Copy(array, 3, array2, 0, array2.Length); return new PhotonStream(false, array2); } } public static class PhotonStreamCache { public struct StreamState { public Vector3 position; public Quaternion rotation; public Vector3 velocity; public Vector3 angularVelocity; public float timestamp; } private static readonly Dictionary<int, StreamState> cache = new Dictionary<int, StreamState>(); public static void Update(int viewID, Vector3 pos, Quaternion rot, Vector3 vel, Vector3 angVel) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) cache[viewID] = new StreamState { position = pos, rotation = rot, velocity = vel, angularVelocity = angVel, timestamp = Time.time }; } public static void Update(int viewID, StreamState state) { state.timestamp = Time.time; cache[viewID] = state; } public static bool TryGet(int viewID, out StreamState state) { return cache.TryGetValue(viewID, out state); } public static void Clear() { cache.Clear(); } public static void Store(int viewID, object[] data) { //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) if (data.Length >= 8) { if (data[0] is bool && data[1] is bool && data[2] is bool && data[3] is Vector3 && data[4] is Vector3 && data[5] is Vector3 && data[6] is Vector3 && data[7] is Quaternion) { Vector3 vel = (Vector3)data[3]; Vector3 angVel = (Vector3)data[4]; Vector3 pos = (Vector3)data[5]; Vector3 val = (Vector3)data[6]; Quaternion rot = (Quaternion)data[7]; Update(viewID, pos, rot, vel, angVel); } else if (data[0] is Vector3 && data[1] is Vector3 && data[2] is Vector3 && data[3] is Quaternion && data[4] is Vector3 && data[5] is Vector3 && data[6] is bool && data[7] is bool) { Vector3 vel2 = (Vector3)data[0]; Vector3 angVel2 = (Vector3)data[1]; Vector3 pos2 = (Vector3)data[2]; Quaternion rot2 = (Quaternion)data[3]; Update(viewID, pos2, rot2, vel2, angVel2); } } } } [RequireComponent(typeof(PhotonView), typeof(Rigidbody), typeof(PhysGrabObject))] public class FakeOwnershipController : MonoBehaviourPun { private PhotonView view; private Rigidbody rb; private PhysGrabObject physGrabObject; private PhysGrabCart cart; private bool isSoftSyncing = false; private void Awake() { view = ((Component)this).GetComponent<PhotonView>(); rb = ((Component)this).GetComponent<Rigidbody>(); physGrabObject = ((Component)this).GetComponent<PhysGrabObject>(); cart = ((Component)this).GetComponent<PhysGrabCart>(); if ((Object)(object)cart == (Object)null) { cart = ((Component)this).GetComponentInParent<PhysGrabCart>(); } } private void Start() { if (!PhotonNetwork.IsMasterClient && SemiFunc.IsMultiplayer()) { SimulateOwnership(); } } private void FixedUpdate() { if (!PhotonNetwork.IsMasterClient && SemiFunc.IsMultiplayer()) { CheckSteadyState(); if (FakeOwnershipData.IsLocallyGrabbed(view) && Object.op_Implicit((Object)(object)cart)) { UpdateItemsInCart(); } if (!FakeOwnershipData.IsLocallyGrabbed(view)) { ApplyPassiveSync(); } } } public void CheckSteadyState() { if ((Object)(object)view == (Object)null || (Object)(object)physGrabObject == (Object)null || !((Behaviour)physGrabObject).isActiveAndEnabled) { FakeOwnershipData.ClearItem(view); } } public void HardSync() { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) if (PhotonStreamCache.TryGet(view.ViewID, out var state) && !FakeOwnershipData.IsLocallyGrabbed(view)) { rb.position = state.position; rb.rotation = state.rotation; rb.velocity = state.velocity; rb.angularVelocity = state.angularVelocity; } } private void UpdateItemsInCart() { if ((Object)(object)cart == (Object)null) { return; } Traverse val = Traverse.Create((object)cart).Field("itemsInCart"); if (!(val.GetValue() is List<PhysGrabObject> list)) { return; } foreach (PhysGrabObject item in list) { PhotonView component = ((Component)item).GetComponent<PhotonView>(); if (!((Object)(object)component == (Object)null)) { FakeOwnershipData.AddItemToCart(component, ((MonoBehaviourPun)this).photonView); } } } private void ApplyPassiveSync() { //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) if (!isSoftSyncing && PhotonStreamCache.TryGet(view.ViewID, out var state) && !FakeOwnershipData.IsLocallyGrabbed(view) && (!IsItemInCart() || !CartIsBeingHeld())) { rb.position = Vector3.Lerp(rb.position, state.position, 0.075f); rb.rotation = Quaternion.Slerp(rb.rotation, state.rotation, 0.075f); rb.velocity = Vector3.Lerp(rb.velocity, state.velocity, 0.075f); rb.angularVelocity = Vector3.Lerp(rb.angularVelocity, state.angularVelocity, 0.075f); } } private bool CartIsBeingHeld() { int cartHoldingItem = FakeOwnershipData.GetCartHoldingItem(((MonoBehaviourPun)this).photonView); if (cartHoldingItem <= 0) { return false; } return FakeOwnershipData.IsNetworkGrabbed(cartHoldingItem); } private bool IsItemInCart() { return FakeOwnershipData.IsItemInCart(view); } public void SimulateOwnership() { if (!((Object)(object)view == (Object)null)) { FakeOwnershipData.SimulateOwnership(view); PhysGrabHinge componentInParent = ((Component)this).GetComponentInParent<PhysGrabHinge>(); if (!((Object)(object)componentInParent != (Object)null)) { } } } public void SyncAfterRelease() { if (!((Object)(object)view == (Object)null)) { OverwriteStoredNetworkData(); if (!Object.op_Implicit((Object)(object)cart)) { HardSync(); } } } public void SlowSyncCartWithItems(float duration = 0.2f, float stagger = 0.02f) { if (!isSoftSyncing) { ((MonoBehaviour)this).StartCoroutine(SlowSyncCartRoutine(duration, stagger)); } } private IEnumerator SlowSyncCartRoutine(float duration, float stagger) { isSoftSyncing = true; if (!PhotonStreamCache.TryGet(view.ViewID, out var hostState)) { isSoftSyncing = false; yield break; } Vector3 startPos = rb.position; Quaternion startRot = rb.rotation; Vector3 startVel = rb.velocity; Vector3 startAngVel = rb.angularVelocity; for (float t = 0f; t < duration; t += Time.fixedDeltaTime) { float progress = t / duration; rb.position = Vector3.Lerp(startPos, hostState.position, progress); rb.rotation = Quaternion.Slerp(startRot, hostState.rotation, progress); rb.velocity = Vector3.Lerp(startVel, hostState.velocity, progress); rb.angularVelocity = Vector3.Lerp(startAngVel, hostState.angularVelocity, progress); yield return (object)new WaitForFixedUpdate(); } rb.position = hostState.position; rb.rotation = hostState.rotation; rb.velocity = hostState.velocity; rb.angularVelocity = hostState.angularVelocity; isSoftSyncing = false; if (!((Object)(object)cart != (Object)null)) { yield break; } Traverse itemsInCartField = Traverse.Create((object)cart).Field("itemsInCart"); if (!(itemsInCartField.GetValue() is List<PhysGrabObject> itemsInCart)) { yield break; } foreach (PhysGrabObject item in itemsInCart) { FakeOwnershipController controller = ((Component)item).GetComponent<FakeOwnershipController>(); if ((Object)(object)controller != (Object)null) { yield return (object)new WaitForSeconds(stagger); controller.SoftSyncOnly(duration * 0.8f); } } } public void SoftSyncOnly(float duration) { if (!isSoftSyncing) { ((MonoBehaviour)this).StartCoroutine(SoftSyncRoutine(duration)); } } private IEnumerator SoftSyncRoutine(float duration) { isSoftSyncing = true; if (!PhotonStreamCache.TryGet(view.ViewID, out var hostState)) { isSoftSyncing = false; yield break; } Vector3 startPos = rb.position; Quaternion startRot = rb.rotation; Vector3 startVel = rb.velocity; Vector3 startAngVel = rb.angularVelocity; for (float t = 0f; t < duration; t += Time.fixedDeltaTime) { float progress = t / duration; rb.position = Vector3.Lerp(startPos, hostState.position, progress); rb.rotation = Quaternion.Slerp(startRot, hostState.rotation, progress); rb.velocity = Vector3.Lerp(startVel, hostState.velocity, progress); rb.angularVelocity = Vector3.Lerp(startAngVel, hostState.angularVelocity, progress); yield return (object)new WaitForFixedUpdate(); } rb.position = hostState.position; rb.rotation = hostState.rotation; rb.velocity = hostState.velocity; rb.angularVelocity = hostState.angularVelocity; isSoftSyncing = false; } private void OverwriteStoredNetworkData() { //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Unknown result type (might be due to invalid IL or missing references) PhotonTransformView ptv = ((Component)physGrabObject).GetComponent<PhotonTransformView>(); BindingFlags flags; Type viewType; if (!((Object)(object)ptv == (Object)null)) { flags = BindingFlags.Instance | BindingFlags.NonPublic; viewType = typeof(PhotonTransformView); Vector3 position = rb.position; Quaternion rotation = rb.rotation; SetField("m_StoredPosition", position); SetField("m_Direction", Vector3.zero); SetField("m_NetworkPosition", position); SetField("receivedPosition", position); SetField("prevPosition", position); SetField("m_NetworkRotation", rotation); SetField("receivedRotation", rotation); SetField("prevRotation", rotation); SetField("smoothedRotation", rotation); SetField("receivedVelocity", rb.velocity); SetField("receivedAngularVelocity", rb.angularVelocity); SetField("m_Distance", 0f); SetField("m_Angle", 0f); SetField("m_firstTake", false); SetField("teleport", false); } void SetField(string name, object value) { viewType.GetField(name, flags)?.SetValue(ptv, value); } } } [HarmonyPatch(typeof(PhysGrabObject), "GrabPlayerAddRPC")] public static class GrabAddHook { private static void Prefix(PhysGrabObject __instance, int photonViewID) { if (PhotonNetwork.IsMasterClient || !SemiFunc.IsMultiplayer()) { return; } PhotonView component = ((Component)__instance).GetComponent<PhotonView>(); if (!((Object)(object)component == (Object)null) && !BlockedItems.IsBlockedType(__instance)) { FakeOwnershipData.AddGrabber(component); FakeOwnershipData.SetNetworkGrabbed(component); if (PhotonNetwork.LocalPlayer.ActorNumber == PhotonNetwork.GetPhotonView(photonViewID).OwnerActorNr) { FakeOwnershipData.SetLocallyGrabbed(component, isGrabbed: true); FakeOwnershipData.SimulateOwnership(component); } } } } [HarmonyPatch(typeof(PhysGrabObject), "GrabPlayerRemoveRPC")] public static class GrabReleaseHook { private static void Prefix(PhysGrabObject __instance, int photonViewID) { if (PhotonNetwork.IsMasterClient || !SemiFunc.IsMultiplayer()) { return; } PhotonView component = ((Component)__instance).GetComponent<PhotonView>(); if ((Object)(object)component == (Object)null || BlockedItems.IsBlockedType(__instance)) { return; } FakeOwnershipData.RemoveGrabber(component); FakeOwnershipData.RemoveItemFromCart(component); if (PhotonNetwork.LocalPlayer.ActorNumber == PhotonNetwork.GetPhotonView(photonViewID).OwnerActorNr) { FakeOwnershipData.SetRecentlyThrown(component); FakeOwnershipData.SetLocallyGrabbed(component, isGrabbed: false); FakeOwnershipController component2 = ((Component)__instance).GetComponent<FakeOwnershipController>(); if (!((Object)(object)component2 != (Object)null)) { } } } } public static class SerializeReading { [HarmonyPatch(typeof(RunManager), "Awake")] public static class PatchTrigger { private static void Prefix() { FakeOwnershipData.ClearAll(); if (!PhotonNetwork.IsMasterClient && SemiFunc.IsMultiplayer() && !loadedOnce) { ApplyPatch(); loadedOnce = true; } } } private static readonly string HarmonyID = "com.ovchinikov.jank"; private static bool loadedOnce = false; public static void ApplyPatch() { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Expected O, but got Unknown //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Expected O, but got Unknown MethodInfo methodInfo = AccessTools.Method(typeof(PhotonNetwork), "OnSerializeRead", (Type[])null, (Type[])null); MethodInfo methodInfo2 = AccessTools.Method(typeof(SerializeReading), "OnPhotonSerializeRead_Prefix", (Type[])null, (Type[])null); if (!(methodInfo == null) && !(methodInfo2 == null)) { Harmony val = new Harmony(HarmonyID); val.Patch((MethodBase)methodInfo, new HarmonyMethod(methodInfo2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } private static void OnPhotonSerializeRead_Prefix(object[] data, Player sender, int networkTime, short correctPrefix) { if (data == null || data.Length != 15) { return; } object obj = data[0]; if (!(obj is int)) { return; } int viewID = (int)obj; if (true) { foreach (object obj2 in data) { } object[] array = new object[8]; if (data.Length >= 15 && data[7] is bool && data[8] is bool && data[9] is bool && data[10] is Vector3 && data[11] is Vector3 && data[12] is Vector3 && data[13] is Vector3 && data[14] is Quaternion) { Array.Copy(data, 7, array, 0, 8); PhotonStreamCache.Store(viewID, array); } } } private static PhysGrabHinge isHinge(int pID) { PhotonView photonView = PhotonNetwork.GetPhotonView(pID); if ((Object)(object)photonView == (Object)null) { return null; } PhysGrabObject componentInParent = ((Component)photonView).gameObject.GetComponentInParent<PhysGrabObject>(); if ((Object)(object)componentInParent == (Object)null) { return null; } PhysGrabHinge component = ((Component)componentInParent).GetComponent<PhysGrabHinge>(); if ((Object)(object)component != (Object)null) { return component; } return null; } } [HarmonyPatch(typeof(ItemMelee), "OnPhotonSerializeView")] public static class ItemMeleeSerializationPatch { private static bool Prefix(ItemMelee __instance, PhotonStream stream, PhotonMessageInfo info) { if (!SemiFunc.IsMultiplayer() || PhotonNetwork.IsMasterClient) { return true; } PhysGrabObject component = ((Component)__instance).GetComponent<PhysGrabObject>(); if ((Object)(object)component != (Object)null) { PhotonView component2 = ((Component)component).GetComponent<PhotonView>(); if (!component2.IsMine) { Traverse val = Traverse.Create((object)__instance).Field("isSwinging"); Traverse val2 = Traverse.Create((object)__instance).Field("newSwing"); bool value = val.GetValue<bool>(); if (stream.ReceiveNext() is bool flag) { val.SetValue((object)flag); } else { val.SetValue((object)false); } bool value2 = val.GetValue<bool>(); if (!value && value2) { val2.SetValue((object)true); __instance.ActivateHitbox(); } } } return false; } } [HarmonyPatch(typeof(PhotonView), "get_IsMine")] public static class PhotonView_IsMine_Postfix { public static void Postfix(PhotonView __instance, ref bool __result) { if (FakeOwnershipData.IsSimulated(__instance)) { __result = true; } } } [HarmonyPatch(typeof(PhysGrabObject), "OnPhotonSerializeView")] public static class PhysGrabObjectSerializationPatch { private static bool Prefix(PhysGrabObject __instance, PhotonStream stream, PhotonMessageInfo info) { //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) if (PhotonNetwork.IsMasterClient || !SemiFunc.IsMultiplayer()) { return true; } PhotonView component = ((Component)__instance).GetComponent<PhotonView>(); Traverse val = Traverse.Create((object)__instance).Field("rbVelocity"); Traverse val2 = Traverse.Create((object)__instance).Field("rbAngularVelocity"); Traverse val3 = Traverse.Create((object)__instance).Field("isKinematic"); Traverse val4 = Traverse.Create((object)__instance).Field("lastUpdateTime"); PhysGrabObjectImpactDetector component2 = ((Component)__instance).GetComponent<PhysGrabObjectImpactDetector>(); if ((Object)(object)component2 == (Object)null) { component2 = ((Component)__instance).GetComponent<PhysGrabObjectImpactDetector>(); Traverse.Create((object)__instance).Field("impactDetector").SetValue((object)component2); } try { if (stream.IsWriting && PhotonNetwork.IsMasterClient) { if ((Object)(object)__instance.rb == (Object)null) { __instance.rb = ((Component)__instance).GetComponent<Rigidbody>(); } stream.SendNext((object)val.GetValue<Vector3>()); stream.SendNext((object)val2.GetValue<Vector3>()); stream.SendNext((object)component2.isSliding); stream.SendNext((object)val3.GetValue<bool>()); } else if (!component.IsMine) { Vector3 val5 = (Vector3)stream.ReceiveNext(); Vector3 val6 = (Vector3)stream.ReceiveNext(); bool isSliding = (bool)stream.ReceiveNext(); bool flag = (bool)stream.ReceiveNext(); val.SetValue((object)val5); val2.SetValue((object)val6); component2.isSliding = isSliding; val3.SetValue((object)flag); val4.SetValue((object)Time.time); } } catch (Exception) { return true; } return false; } } [HarmonyPatch(typeof(PhysGrabObject), "GrabPlayerAddRPC")] public static class GrabPlayerAddRPC_Patch { [HarmonyPostfix] public static void Postfix(PhysGrabObject __instance, int photonViewID) { if (!SemiFunc.IsMultiplayer() || PhotonNetwork.IsMasterClient || BlockedItems.IsBlockedType(__instance)) { return; } FakeOwnershipController fakeOwnershipController = ((Component)__instance).GetComponent<FakeOwnershipController>(); if ((Object)(object)fakeOwnershipController == (Object)null) { fakeOwnershipController = ((Component)__instance).gameObject.AddComponent<FakeOwnershipController>(); } fakeOwnershipController.SimulateOwnership(); PhysGrabCart val = default(PhysGrabCart); CartOwnershipFixer cartOwnershipFixer = default(CartOwnershipFixer); if (!((Component)__instance).TryGetComponent<PhysGrabCart>(ref val) || !((Component)__instance).TryGetComponent<CartOwnershipFixer>(ref cartOwnershipFixer)) { return; } foreach (PhysGrabber item in __instance.playerGrabbing) { if (item.isLocal) { cartOwnershipFixer.FixInitialPressTimerRPC(item.photonView.ViewID); break; } } } } [HarmonyPatch(typeof(PhysGrabObjectGrabArea), "Update")] public static class PhysGrabObjectGrabArea_Update_Transpiler { private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Expected O, but got Unknown //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Expected O, but got Unknown Debug.Log((object)"[Transpiler] Patching PhysGrabObjectGrabArea.Update for IsMasterClient"); List<CodeInstruction> list = new List<CodeInstruction>(instructions); MethodInfo methodInfo = AccessTools.PropertyGetter(typeof(PhotonNetwork), "IsMasterClient"); MethodInfo methodInfo2 = AccessTools.Method(typeof(PhysGrabObjectGrabArea_Update_Transpiler), "GetIsMine", (Type[])null, (Type[])null); for (int i = 0; i < list.Count; i++) { if (CodeInstructionExtensions.Calls(list[i], methodInfo)) { Debug.Log((object)"[Transpiler] Found IsMasterClient check, replacing with GetIsMine(__instance)"); list[i] = new CodeInstruction(OpCodes.Ldarg_0, (object)null); list.Insert(i + 1, new CodeInstruction(OpCodes.Call, (object)methodInfo2)); i++; } } return list; } public static bool GetIsMine(PhysGrabObjectGrabArea area) { PhotonView val = default(PhotonView); if (((Component)area).TryGetComponent<PhotonView>(ref val)) { return val.IsMine; } PhotonView componentInParent = ((Component)area).GetComponentInParent<PhotonView>(); if (componentInParent != null) { return componentInParent.IsMine; } return false; } } [HarmonyPatch(typeof(PhysGrabCart), "Start")] public static class CartOwnershipFixer_Attacher { private static void Postfix(PhysGrabCart __instance) { CartOwnershipFixer cartOwnershipFixer = default(CartOwnershipFixer); if (!((Component)__instance).TryGetComponent<CartOwnershipFixer>(ref cartOwnershipFixer)) { CartOwnershipFixer cartOwnershipFixer2 = ((Component)__instance).gameObject.AddComponent<CartOwnershipFixer>(); cartOwnershipFixer2.cart = __instance; Debug.Log((object)("[CartOwnershipFixer] Attached to " + ((Object)__instance).name)); } } } public class CartOwnershipFixer : MonoBehaviourPun { public PhysGrabCart cart; private void Awake() { if ((Object)(object)cart == (Object)null) { cart = ((Component)this).GetComponent<PhysGrabCart>(); } } [PunRPC] public void FixInitialPressTimerRPC(int grabberViewID) { PhysGrabber val = FindGrabberByViewID(grabberViewID); if ((Object)(object)val != (Object)null) { val.initialPressTimer = 1f; Debug.Log((object)("[CartOwnershipFixer] initialPressTimer fixed to 0.1f for " + ((Object)val).name)); } } private PhysGrabber FindGrabberByViewID(int viewID) { foreach (PlayerAvatar item in SemiFunc.PlayerGetList()) { PhysGrabber componentInChildren = ((Component)item).GetComponentInChildren<PhysGrabber>(); if ((Object)(object)componentInChildren != (Object)null && componentInChildren.photonView.ViewID == viewID) { return componentInChildren; } } return null; } } [HarmonyPatch(typeof(PhysGrabCart), "FixedUpdate")] public static class PhysGrabCart_FixedUpdate_Transpiler { private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Expected O, but got Unknown //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(instructions); MethodInfo methodInfo = AccessTools.PropertyGetter(typeof(PhotonNetwork), "IsMasterClient"); for (int i = 0; i < list.Count; i++) { if (CodeInstructionExtensions.Calls(list[i], methodInfo)) { list[i] = new CodeInstruction(OpCodes.Ldarg_0, (object)null); list.Insert(i + 1, new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(PhysGrabCart_CommonHelpers), "GetIsMineOrSingleplayer", (Type[])null, (Type[])null))); i++; } } return list; } } [HarmonyPatch(typeof(PhysGrabCart), "SmallCartLogic")] public static class PhysGrabCart_SmallCartLogic_Transpiler { private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Expected O, but got Unknown //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(instructions); MethodInfo methodInfo = AccessTools.Method(typeof(SemiFunc), "IsMasterClientOrSingleplayer", (Type[])null, (Type[])null); MethodInfo methodInfo2 = AccessTools.Method(typeof(PhysGrabCart_SmallCartLogic_Transpiler), "GetIsMineOrSingleplayer", (Type[])null, (Type[])null); if (methodInfo == null) { Debug.LogError((object)"[Transpiler] Could not find SemiFunc.IsMasterClientOrSingleplayer"); return list; } for (int i = 0; i < list.Count; i++) { CodeInstruction val = list[i]; if (CodeInstructionExtensions.Calls(val, methodInfo)) { List<Label> labels = ((val.labels.Count > 0) ? new List<Label>(val.labels) : new List<Label>()); list[i] = new CodeInstruction(OpCodes.Ldarg_0, (object)null) { labels = labels }; list.Insert(i + 1, new CodeInstruction(OpCodes.Call, (object)methodInfo2)); i++; } } return list; } public static bool GetIsMineOrSingleplayer(PhysGrabCart cart) { PhotonView component = ((Component)cart).GetComponent<PhotonView>(); bool flag = !SemiFunc.IsMultiplayer(); return ((Object)(object)component != (Object)null && component.IsMine) || flag; } } [HarmonyPatch(typeof(PhysGrabCart), "Update")] public static class PhysGrabCart_Update_Transpiler { private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(instructions); MethodInfo methodInfo = AccessTools.Method(typeof(SemiFunc), "IsMasterClientOrSingleplayer", (Type[])null, (Type[])null); for (int i = 0; i < list.Count; i++) { if (CodeInstructionExtensions.Calls(list[i], methodInfo)) { list[i] = new CodeInstruction(OpCodes.Ldarg_0, (object)null); list.Insert(i + 1, new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(PhysGrabCart_CommonHelpers), "GetIsMineOrSingleplayer", (Type[])null, (Type[])null))); i++; } } return list; } } public static class PhysGrabCart_CommonHelpers { public static bool GetIsMineOrSingleplayer(PhysGrabCart cart) { PhotonView component = ((Component)cart).GetComponent<PhotonView>(); bool flag = !SemiFunc.IsMultiplayer(); return ((Object)(object)component != (Object)null && component.IsMine) || flag; } } [HarmonyPatch(typeof(PhysGrabCart), "CartSteer")] public static class PhysGrabCart_CartSteer_Transpiler { private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(instructions); MethodInfo methodInfo = AccessTools.Method(typeof(SemiFunc), "IsMasterClientOrSingleplayer", (Type[])null, (Type[])null); for (int i = 0; i < list.Count - 1; i++) { if (CodeInstructionExtensions.Calls(list[i], methodInfo)) { list[i] = new CodeInstruction(OpCodes.Ldarg_0, (object)null); list.Insert(i + 1, new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(PhysGrabCart_CartSteer_Transpiler), "GetIsMineOrSingleplayer", (Type[])null, (Type[])null))); i++; } } return list; } public static bool GetIsMineOrSingleplayer(PhysGrabCart cart) { PhotonView component = ((Component)cart).GetComponent<PhotonView>(); bool flag = !SemiFunc.IsMultiplayer(); return ((Object)(object)component != (Object)null && component.IsMine) || flag; } } [HarmonyPatch(typeof(PhysGrabHinge), "FixedUpdate")] public static class PhysGrabHinge_FixedUpdatePatch { [HarmonyPrefix] public static bool Prefix(PhysGrabHinge __instance) { //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_0189: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_01a3: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01b0: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01bd: Unknown result type (might be due to invalid IL or missing references) //IL_01c2: Unknown result type (might be due to invalid IL or missing references) //IL_028a: Unknown result type (might be due to invalid IL or missing references) //IL_028e: Unknown result type (might be due to invalid IL or missing references) //IL_0290: Unknown result type (might be due to invalid IL or missing references) //IL_0295: Unknown result type (might be due to invalid IL or missing references) //IL_029a: Unknown result type (might be due to invalid IL or missing references) //IL_029e: Unknown result type (might be due to invalid IL or missing references) //IL_02a3: Unknown result type (might be due to invalid IL or missing references) //IL_02ad: Unknown result type (might be due to invalid IL or missing references) //IL_02b2: Unknown result type (might be due to invalid IL or missing references) //IL_02b6: Unknown result type (might be due to invalid IL or missing references) //IL_02bb: Unknown result type (might be due to invalid IL or missing references) //IL_033b: Unknown result type (might be due to invalid IL or missing references) //IL_0340: Unknown result type (might be due to invalid IL or missing references) //IL_034a: Unknown result type (might be due to invalid IL or missing references) //IL_034f: Unknown result type (might be due to invalid IL or missing references) //IL_02ed: Unknown result type (might be due to invalid IL or missing references) //IL_02f1: Unknown result type (might be due to invalid IL or missing references) //IL_02f3: Unknown result type (might be due to invalid IL or missing references) //IL_02f8: Unknown result type (might be due to invalid IL or missing references) //IL_02fd: Unknown result type (might be due to invalid IL or missing references) //IL_0301: Unknown result type (might be due to invalid IL or missing references) //IL_0306: Unknown result type (might be due to invalid IL or missing references) //IL_0310: Unknown result type (might be due to invalid IL or missing references) //IL_0315: Unknown result type (might be due to invalid IL or missing references) //IL_0319: Unknown result type (might be due to invalid IL or missing references) //IL_031e: Unknown result type (might be due to invalid IL or missing references) //IL_02ca: Unknown result type (might be due to invalid IL or missing references) //IL_035f: Unknown result type (might be due to invalid IL or missing references) //IL_0364: Unknown result type (might be due to invalid IL or missing references) //IL_0359: Unknown result type (might be due to invalid IL or missing references) //IL_035b: Unknown result type (might be due to invalid IL or missing references) //IL_032d: Unknown result type (might be due to invalid IL or missing references) //IL_03b3: Unknown result type (might be due to invalid IL or missing references) //IL_03b8: Unknown result type (might be due to invalid IL or missing references) //IL_03bc: Unknown result type (might be due to invalid IL or missing references) //IL_03c3: Unknown result type (might be due to invalid IL or missing references) //IL_03c8: Unknown result type (might be due to invalid IL or missing references) //IL_03d4: Unknown result type (might be due to invalid IL or missing references) //IL_03d9: Unknown result type (might be due to invalid IL or missing references) //IL_03dd: Unknown result type (might be due to invalid IL or missing references) //IL_03ef: Unknown result type (might be due to invalid IL or missing references) //IL_03f4: Unknown result type (might be due to invalid IL or missing references) //IL_0373: Unknown result type (might be due to invalid IL or missing references) //IL_049c: Unknown result type (might be due to invalid IL or missing references) //IL_04a7: Unknown result type (might be due to invalid IL or missing references) //IL_04ac: Unknown result type (might be due to invalid IL or missing references) //IL_04b0: Unknown result type (might be due to invalid IL or missing references) //IL_04b5: Unknown result type (might be due to invalid IL or missing references) //IL_04ba: Unknown result type (might be due to invalid IL or missing references) //IL_04bc: Unknown result type (might be due to invalid IL or missing references) //IL_04c0: Unknown result type (might be due to invalid IL or missing references) //IL_04c5: Unknown result type (might be due to invalid IL or missing references) //IL_04cd: Unknown result type (might be due to invalid IL or missing references) //IL_056f: Unknown result type (might be due to invalid IL or missing references) //IL_0574: Unknown result type (might be due to invalid IL or missing references) //IL_044b: Unknown result type (might be due to invalid IL or missing references) //IL_0450: Unknown result type (might be due to invalid IL or missing references) //IL_0420: Unknown result type (might be due to invalid IL or missing references) //IL_0425: Unknown result type (might be due to invalid IL or missing references) //IL_06ec: Unknown result type (might be due to invalid IL or missing references) //IL_06f1: Unknown result type (might be due to invalid IL or missing references) //IL_0644: Unknown result type (might be due to invalid IL or missing references) //IL_0649: Unknown result type (might be due to invalid IL or missing references) //IL_05ad: Unknown result type (might be due to invalid IL or missing references) //IL_05b2: Unknown result type (might be due to invalid IL or missing references) //IL_05c1: Unknown result type (might be due to invalid IL or missing references) //IL_05c6: Unknown result type (might be due to invalid IL or missing references) //IL_05e0: Unknown result type (might be due to invalid IL or missing references) //IL_05ee: Unknown result type (might be due to invalid IL or missing references) //IL_05fc: Unknown result type (might be due to invalid IL or missing references) //IL_060d: Unknown result type (might be due to invalid IL or missing references) //IL_07f3: Unknown result type (might be due to invalid IL or missing references) //IL_06e4: Unknown result type (might be due to invalid IL or missing references) //IL_06e6: Unknown result type (might be due to invalid IL or missing references) //IL_068e: Unknown result type (might be due to invalid IL or missing references) //IL_0693: Unknown result type (might be due to invalid IL or missing references) //IL_0698: Unknown result type (might be due to invalid IL or missing references) //IL_06a4: Unknown result type (might be due to invalid IL or missing references) //IL_06a6: Unknown result type (might be due to invalid IL or missing references) //IL_06a8: Unknown result type (might be due to invalid IL or missing references) //IL_06aa: Unknown result type (might be due to invalid IL or missing references) //IL_06ac: Unknown result type (might be due to invalid IL or missing references) //IL_06bf: Expected I4, but got Unknown if (!SemiFunc.IsMultiplayer()) { return true; } PhysGrabObject componentInParent = ((Component)__instance).GetComponentInParent<PhysGrabObject>(); PhotonView component = ((Component)__instance).GetComponent<PhotonView>(); if ((Object)(object)componentInParent == (Object)null || (Object)(object)component == (Object)null) { return false; } PhotonTransformView componentInParent2 = ((Component)component).GetComponentInParent<PhotonTransformView>(); if (GameManager.Multiplayer() && componentInParent2 != null) { componentInParent2.KinematicClientForce(0.1f); } Traverse val = Traverse.Create((object)__instance); bool flag = ReflectionUtils.TryGetStructField<bool>(val, "dead"); bool flag2 = ReflectionUtils.TryGetStructField<bool>(val, "broken"); bool flag3 = ReflectionUtils.TryGetStructField<bool>(val, "closed"); bool flag4 = ReflectionUtils.TryGetStructField<bool>(val, "closing"); bool flag5 = ReflectionUtils.TryGetStructField<bool>(val, "closeHeavy"); bool flag6 = ReflectionUtils.TryGetStructField<bool>(val, "hingePointHasRb"); float num = ReflectionUtils.TryGetStructField<float>(val, "closeDisableTimer"); float num2 = ReflectionUtils.TryGetStructField<float>(val, "closedForceTimer"); float num3 = ReflectionUtils.TryGetStructField<float>(val, "bounceCooldown"); float num4 = ReflectionUtils.TryGetStructField<float>(val, "moveLoopEndDisableTimer"); float num5 = ReflectionUtils.TryGetStructField<float>(val, "closeSpeed"); float num6 = ReflectionUtils.TryGetStructField<float>(val, "hingeOffsetPositiveThreshold"); float num7 = ReflectionUtils.TryGetStructField<float>(val, "hingeOffsetNegativeThreshold"); float num8 = ReflectionUtils.TryGetStructField<float>(val, "hingeOffsetSpeed"); float num9 = ReflectionUtils.TryGetStructField<float>(val, "closeMaxSpeed"); float num10 = ReflectionUtils.TryGetStructField<float>(val, "closeHeavySpeed"); float num11 = ReflectionUtils.TryGetStructField<float>(val, "closeThreshold"); float num12 = ReflectionUtils.TryGetStructField<float>(val, "openForceNeeded"); float num13 = ReflectionUtils.TryGetStructField<float>(val, "bounceAmount"); Vector3 val2 = ReflectionUtils.TryGetStructField<Vector3>(val, "hingePointPosition"); Vector3 val3 = ReflectionUtils.TryGetStructField<Vector3>(val, "restPosition"); Vector3 val4 = ReflectionUtils.TryGetStructField<Vector3>(val, "bounceVelocity"); Vector3 val5 = ReflectionUtils.TryGetStructField<Vector3>(val, "hingeOffsetPositive"); Vector3 val6 = ReflectionUtils.TryGetStructField<Vector3>(val, "hingeOffsetNegative"); Quaternion val7 = ReflectionUtils.TryGetStructField<Quaternion>(val, "restRotation"); BounceEffect val8 = ReflectionUtils.TryGetStructField<BounceEffect>(val, "bounceEffect"); Rigidbody val9 = ReflectionUtils.TryGetField<Rigidbody>(val, "hingePointRb"); HingeJoint val10 = ReflectionUtils.TryGetField<HingeJoint>(val, "joint"); Transform val11 = ReflectionUtils.TryGetField<Transform>(val, "hingePoint"); if (flag || flag2 || !componentInParent.spawned || (GameManager.instance.gameMode != 0 && !PhotonNetwork.IsMasterClient && !component.IsMine)) { return false; } if (flag2) { float value = val.Field("brokenTimer").GetValue<float>(); value += Time.fixedDeltaTime; val.Field("brokenTimer").SetValue((object)value); } if (flag6) { if (val10.angle >= num6) { Vector3 val12 = val2 + val11.TransformDirection(val5); Vector3 val13 = Vector3.Lerp(val9.position, val12, num8 * Time.fixedDeltaTime); if (val9.position != val13) { val9.MovePosition(val13); } } else if (val10.angle <= num7) { Vector3 val14 = val2 + val11.TransformDirection(val6); Vector3 val15 = Vector3.Lerp(val9.position, val14, num8 * Time.fixedDeltaTime); if (val9.position != val15) { val9.MovePosition(val15); } } else { Vector3 val16 = Vector3.Lerp(val9.position, val2, num8 * Time.fixedDeltaTime); if (flag3) { val16 = val2; } if (val9.position != val16) { val9.MovePosition(val16); } } } Vector3 val17; if (!flag3 && num <= 0f && Object.op_Implicit((Object)(object)val10)) { if (!flag4) { val17 = componentInParent.rb.angularVelocity; Vector3 normalized = ((Vector3)(ref val17)).normalized; val17 = -((Joint)val10).axis * val10.angle; float num14 = Vector3.Dot(normalized, ((Vector3)(ref val17)).normalized); val17 = componentInParent.rb.angularVelocity; if (((Vector3)(ref val17)).magnitude < num9 && Mathf.Abs(val10.angle) < num11) { if (!(num14 > 0f)) { val17 = componentInParent.rb.angularVelocity; if (!(((Vector3)(ref val17)).magnitude < 0.1f)) { goto IL_0506; } } flag5 = false; val17 = componentInParent.rb.angularVelocity; num5 = Mathf.Max(((Vector3)(ref val17)).magnitude, 0.2f); if (num5 > num10) { flag5 = true; } flag4 = true; } } else if (componentInParent.playerGrabbing.Count > 0) { flag4 = false; } else { Vector3 eulerAngles = ((Quaternion)(ref val7)).eulerAngles; Quaternion rotation = componentInParent.rb.rotation; Vector3 val18 = eulerAngles - ((Quaternion)(ref rotation)).eulerAngles; val18 = Vector3.ClampMagnitude(val18, num5); componentInParent.rb.AddRelativeTorque(val18, (ForceMode)5); if (Mathf.Abs(val10.angle) < 2f) { num2 = 0.25f; flag4 = false; HingeRPC.CloseImpulse(__instance, flag5); } } } goto IL_0506; IL_0506: if (componentInParent.playerGrabbing.Count > 0) { num = 0.1f; } else if (num > 0f) { num -= Time.fixedDeltaTime; } if (flag3) { if (num2 > 0f) { num2 -= Time.fixedDeltaTime; } else { val17 = componentInParent.rb.angularVelocity; if (((Vector3)(ref val17)).magnitude > num12) { HingeRPC.OpenImpulse(__instance); num = 2f; flag4 = false; } } if (!componentInParent.rb.isKinematic && (componentInParent.rb.position != val3 || componentInParent.rb.rotation != val7)) { componentInParent.rb.MovePosition(val3); componentInParent.rb.MoveRotation(val7); componentInParent.rb.angularVelocity = Vector3.zero; componentInParent.rb.velocity = Vector3.zero; } } if (componentInParent.playerGrabbing.Count <= 0 && !flag4 && !flag3) { Vector3 angularVelocity = componentInParent.rb.angularVelocity; if (((Vector3)(ref angularVelocity)).magnitude <= 0.1f && ((Vector3)(ref val4)).magnitude > 0.5f && num3 <= 0f) { num3 = 1f; componentInParent.rb.AddTorque(num13 * -((Vector3)(ref val4)).normalized, (ForceMode)1); BounceEffect val19 = val8; BounceEffect val20 = val19; switch ((int)val20) { case 2: componentInParent.heavyImpactImpulse = true; break; case 1: componentInParent.mediumImpactImpulse = true; break; case 0: componentInParent.lightImpactImpulse = true; break; } num4 = 1f; } val4 = angularVelocity; } else { val4 = Vector3.zero; } if (num3 > 0f) { num3 -= Time.fixedDeltaTime; } if (!flag4) { componentInParent.OverrideDrag(__instance.drag, 0.1f); componentInParent.OverrideAngularDrag(__instance.drag, 0.1f); } val.Field("closeDisableTimer").SetValue((object)num); val.Field("closedForceTimer").SetValue((object)num2); val.Field("bounceCooldown").SetValue((object)num3); val.Field("moveLoopEndDisableTimer").SetValue((object)num4); val.Field("closing").SetValue((object)flag4); val.Field("closeSpeed").SetValue((object)num5); val.Field("closeHeavy").SetValue((object)flag5); val.Field("bounceVelocity").SetValue((object)val4); return false; } } public static class PhysGrabHinge_OnJointBreakPatch { private static bool Prefix(PhysGrabHinge __instance, float breakForce) { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) if (!SemiFunc.IsMultiplayer()) { return true; } PhotonView component = ((Component)__instance).GetComponent<PhotonView>(); PhysGrabObject component2 = ((Component)__instance).GetComponent<PhysGrabObject>(); if (GameManager.instance.gameMode == 0 || component.IsMine) { component2.rb.AddForce(-component2.rb.velocity * 2f, (ForceMode)1); component2.rb.AddTorque(-component2.rb.angularVelocity * 10f, (ForceMode)1); AccessTools.Field(typeof(PhysGrabHinge), "broken").SetValue(__instance, true); } if (PhotonNetwork.IsMasterClient) { AccessTools.Method(typeof(PhysGrabHinge), "HingeBreakImpulse", (Type[])null, (Type[])null).Invoke(__instance, null); } return false; } } [HarmonyPatch(typeof(PhysGrabObject), "Start")] public static class PhysStartPatch { [HarmonyPostfix] public static void Postfix(PhysGrabObject __instance) { if (!PhotonNetwork.IsMasterClient && SemiFunc.IsMultiplayer() && (Object)(object)((Component)__instance).GetComponent<FakeOwnershipController>() == (Object)null) { WaitForAdd(__instance); } } public static IEnumerator WaitForAdd(PhysGrabObject __instance) { yield return (object)new WaitForSeconds(1f); if ((Object)(object)((Component)__instance).GetComponent<PhysGrabHinge>() == (Object)null) { ((Component)__instance).gameObject.AddComponent<FakeOwnershipController>(); } } } [BepInPlugin("net.ovchinikov.nwrework", "Network Rework", "1.0.0")] public class OwnershipTransferPlugin : BaseUnityPlugin { public static Harmony harmony; private void Awake() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown harmony = new Harmony("net.ovchinikov.nwrework"); harmony.PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"[NetworkRework] Loaded and patched."); } } [HarmonyPatch(typeof(PhysGrabObject), "FixedUpdate")] public static class PhysGrabObject_FixedUpdate_Transpiler { [HarmonyTranspiler] public static IEnumerable<CodeInstruction> ReplaceHostChecksWithIsMine(IEnumerable<CodeInstruction> instructions) { //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Expected O, but got Unknown //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Expected O, but got Unknown //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Expected O, but got Unknown //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Expected O, but got Unknown //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Expected O, but got Unknown //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Expected O, but got Unknown //IL_01c5: Unknown result type (might be due to invalid IL or missing references) //IL_01cf: Expected O, but got Unknown //IL_01df: Unknown result type (might be due to invalid IL or missing references) //IL_01e9: Expected O, but got Unknown Debug.Log((object)"[NetworkingReworked] Transpiler activated"); List<CodeInstruction> list = new List<CodeInstruction>(instructions); MethodInfo methodInfo = AccessTools.PropertyGetter(typeof(PhotonNetwork), "IsMasterClient"); MethodInfo methodInfo2 = AccessTools.Method(typeof(SemiFunc), "IsMasterClientOrSingleplayer", (Type[])null, (Type[])null); FieldInfo fieldInfo = AccessTools.Field(typeof(PhysGrabObject), "isMaster"); MethodInfo methodInfo3 = AccessTools.PropertyGetter(typeof(MonoBehaviourPun), "photonView"); MethodInfo methodInfo4 = AccessTools.PropertyGetter(typeof(PhotonView), "IsMine"); int num = 0; for (int i = 0; i < list.Count; i++) { CodeInstruction val = list[i]; if (methodInfo != null && CodeInstructionExtensions.Calls(val, methodInfo)) { list[i] = new CodeInstruction(OpCodes.Ldarg_0, (object)null); list.Insert(++i, new CodeInstruction(OpCodes.Callvirt, (object)methodInfo3)); list.Insert(++i, new CodeInstruction(OpCodes.Callvirt, (object)methodInfo4)); Debug.Log((object)"[NetworkingReworked] Replaced old 'IsMasterClient' call w/ 'this.photonView.IsMine'"); num++; } else if (methodInfo2 != null && CodeInstructionExtensions.Calls(val, methodInfo2)) { list[i] = new CodeInstruction(OpCodes.Ldarg_0, (object)null); list.Insert(++i, new CodeInstruction(OpCodes.Callvirt, (object)methodInfo3)); MethodInfo methodInfo5 = AccessTools.Method(typeof(PhysGrabObject_FixedUpdate_Transpiler), "GetIsMineOrSingleplayer", (Type[])null, (Type[])null); list.Insert(++i, new CodeInstruction(OpCodes.Call, (object)methodInfo5)); Debug.Log((object)"[NetworkingReworked] Replaced old 'SemiFunc.IsMasterClientOrSingleplayer' w/ 'this.photonView.IsMine'"); num++; } else if (fieldInfo != null && CodeInstructionExtensions.LoadsField(val, fieldInfo, false)) { list[i] = new CodeInstruction(OpCodes.Callvirt, (object)methodInfo3); list.Insert(++i, new CodeInstruction(OpCodes.Callvirt, (object)methodInfo4)); Debug.Log((object)"[NetworkingReworked] Replaced 'isMaster' field read w/ 'this.photonView.IsMine'"); num++; } } Debug.Log((object)$"[NetworkingReworked] Done transpiling. Replacements made: {num}"); return list; } public static bool GetIsMineOrSingleplayer(PhysGrabObject grabObject) { PhotonView component = ((Component)grabObject).GetComponent<PhotonView>(); bool flag = !SemiFunc.IsMultiplayer(); return ((Object)(object)component != (Object)null && component.IsMine) || flag; } } public static class HurtColliderPatch { public static bool IsOwnerOrSingleplayer(GameObject obj) { PhotonView componentInParent = obj.GetComponentInParent<PhotonView>(); return !PhotonNetwork.InRoom || ((Object)(object)componentInParent != (Object)null && componentInParent.IsMine); } [HarmonyTranspiler] public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Expected O, but got Unknown //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(instructions); MethodInfo method = typeof(SemiFunc).GetMethod("IsMasterClientOrSingleplayer"); MethodInfo method2 = typeof(HurtColliderPatch).GetMethod("IsOwnerOrSingleplayer"); int num = 0; for (int i = 0; i < list.Count; i++) { if (num < 1 && list[i].opcode == OpCodes.Call && list[i].operand as MethodInfo == method) { list[i] = new CodeInstruction(OpCodes.Ldarg_0, (object)null); list.Insert(i + 1, new CodeInstruction(OpCodes.Call, (object)method2)); num++; } } return list; } } [HarmonyPatch(typeof(PhysGrabHinge), "Awake")] public static class PhysGrabHinge_Awake_Transpiler { [HarmonyTranspiler] public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { List<CodeInstruction> list = new List<CodeInstruction>(instructions); List<CodeInstruction> list2 = new List<CodeInstruction>(); bool flag = false; int num = 0; for (int i = 0; i < list.Count; i++) { CodeInstruction val = list[i]; if (!flag && val.opcode == OpCodes.Call && val.operand is MethodInfo methodInfo && methodInfo.Name == "Destroy") { Debug.Log((object)"[NetworkingReworked] Found Object.Destroy — starting skip block"); flag = true; num = 0; } else if (flag) { num++; if (num > 5) { Debug.Log((object)"[NetworkingReworked] Ending skip block after ~5 instructions"); flag = false; } } else { list2.Add(val); } } return list2; } } [HarmonyPatch(typeof(PhotonTransformView), "Update")] public static class PhotonTransformView_Update_PrefixPatch { private static bool Prefix(PhotonTransformView __instance) { if (((MonoBehaviourPun)__instance).photonView.IsMine) { FieldInfo fieldInfo = AccessTools.Field(typeof(PhotonTransformView), "kinematicClientForcedTimer"); FieldInfo fieldInfo2 = AccessTools.Field(typeof(PhotonTransformView), "kinematicClientForced"); if (fieldInfo != null && fieldInfo2 != null) { float num = (float)fieldInfo.GetValue(__instance); bool flag = (bool)fieldInfo2.GetValue(__instance); if (num > 0f) { num -= Time.deltaTime; if (num <= 0f) { flag = false; } fieldInfo.SetValue(__instance, num); fieldInfo2.SetValue(__instance, flag); } } return false; } return true; } } [HarmonyPatch(typeof(PhysGrabObject), "OverrideTimersTick")] public static class PhysGrabObject_OverrideTimersTick_Transpiler { public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Expected O, but got Unknown //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Expected O, but got Unknown //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Expected O, but got Unknown //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Expected O, but got Unknown //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_019e: Expected O, but got Unknown //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_01b7: Expected O, but got Unknown //IL_01f9: Unknown result type (might be due to invalid IL or missing references) //IL_0200: Expected O, but got Unknown //IL_0229: Unknown result type (might be due to invalid IL or missing references) //IL_0233: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(instructions); MethodInfo methodInfo = AccessTools.Method(typeof(PhysGrabObject_OverrideTimersTick_Transpiler), "GetIsMineOrSingleplayer", (Type[])null, (Type[])null); MethodInfo methodInfo2 = AccessTools.PropertyGetter(typeof(PhotonNetwork), "IsMasterClient"); MethodInfo methodInfo3 = AccessTools.Method(typeof(SemiFunc), "IsMasterClientOrSingleplayer", (Type[])null, (Type[])null); FieldInfo fieldInfo = AccessTools.Field(typeof(PhysGrabObject), "isMaster"); MethodInfo methodInfo4 = AccessTools.PropertyGetter(typeof(MonoBehaviourPun), "photonView"); MethodInfo methodInfo5 = AccessTools.PropertyGetter(typeof(PhotonView), "IsMine"); for (int i = 0; i < list.Count; i++) { CodeInstruction val = list[i]; if (methodInfo2 != null && CodeInstructionExtensions.Calls(val, methodInfo2)) { List<Label> collection = new List<Label>(val.labels); CodeInstruction val2 = new CodeInstruction(OpCodes.Ldarg_0, (object)null); val2.labels.AddRange(collection); list[i] = val2; list.Insert(++i, new CodeInstruction(OpCodes.Callvirt, (object)methodInfo4)); list.Insert(++i, new CodeInstruction(OpCodes.Callvirt, (object)methodInfo5)); Debug.Log((object)"[NetworkingReworked] Replaced 'PhotonNetwork.IsMasterClient' call with 'this.photonView.IsMine'"); } else if (methodInfo3 != null && CodeInstructionExtensions.Calls(val, methodInfo3)) { List<Label> collection2 = new List<Label>(val.labels); CodeInstruction val3 = new CodeInstruction(OpCodes.Ldarg_0, (object)null); val3.labels.AddRange(collection2); list[i] = val3; list.Insert(++i, new CodeInstruction(OpCodes.Callvirt, (object)methodInfo4)); list.Insert(++i, new CodeInstruction(OpCodes.Call, (object)methodInfo)); Debug.Log((object)"[NetworkingReworked] Replaced 'SemiFunc.IsMasterClientOrSingleplayer' call with 'this.photonView.IsMine'"); } else if (fieldInfo != null && CodeInstructionExtensions.LoadsField(val, fieldInfo, false)) { List<Label> collection3 = new List<Label>(val.labels); CodeInstruction val4 = new CodeInstruction(OpCodes.Callvirt, (object)methodInfo4); val4.labels.AddRange(collection3); list[i] = val4; list.Insert(++i, new CodeInstruction(OpCodes.Callvirt, (object)methodInfo5)); Debug.Log((object)"[NetworkingReworked] Replaced 'isMaster' field read with 'this.photonView.IsMine'"); } } return list; } public static bool GetIsMineOrSingleplayer(PhysGrabObject grabObject) { PhotonView component = ((Component)grabObject).GetComponent<PhotonView>(); bool flag = !SemiFunc.IsMultiplayer(); return ((Object)(object)component != (Object)null && component.IsMine) || flag; } } [HarmonyPatch(typeof(PhysGrabObject), "Update")] public static class PhysGrabObject_Update_Transpiler { public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Expected O, but got Unknown //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Expected O, but got Unknown //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(instructions); MethodInfo methodInfo = AccessTools.Method(typeof(PhysGrabObject_Update_Transpiler), "GetIsMineOrSingleplayer", (Type[])null, (Type[])null); MethodInfo methodInfo2 = AccessTools.Method(typeof(SemiFunc), "IsMasterClientOrSingleplayer", (Type[])null, (Type[])null); MethodInfo methodInfo3 = AccessTools.PropertyGetter(typeof(MonoBehaviourPun), "photonView"); MethodInfo methodInfo4 = AccessTools.PropertyGetter(typeof(PhotonView), "IsMine"); for (int i = 0; i < list.Count; i++) { CodeInstruction val = list[i]; if (methodInfo2 != null && CodeInstructionExtensions.Calls(val, methodInfo2)) { List<Label> collection = new List<Label>(val.labels); CodeInstruction val2 = new CodeInstruction(OpCodes.Ldarg_0, (object)null); val2.labels.AddRange(collection); list[i] = val2; list.Insert(++i, new CodeInstruction(OpCodes.Callvirt, (object)methodInfo3)); list.Insert(++i, new CodeInstruction(OpCodes.Call, (object)methodInfo)); Debug.Log((object)"[NetworkingReworked] Replaced SemiFunc.IsMasterClientOrSingleplayer() with this.photonView.IsMine in Update"); } } return list; } public static bool GetIsMineOrSingleplayer(PhysGrabObject grabObject) { PhotonView component = ((Component)grabObject).GetComponent<PhotonView>(); bool flag = !SemiFunc.IsMultiplayer(); return ((Object)(object)component != (Object)null && component.IsMine) || flag; } } [HarmonyPatch(typeof(PhysGrabObjectImpactDetector), "OnTriggerStay")] public static class PhysGrabObjectImpactDetector_OnTriggerStay_Transpiler { [HarmonyTranspiler] public static IEnumerable<CodeInstruction> Transpile(IEnumerable<CodeInstruction> instructions) { //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Expected O, but got Unknown //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Expected O, but got Unknown //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(instructions); MethodInfo methodInfo = AccessTools.PropertyGetter(typeof(PhotonNetwork), "IsMasterClient"); MethodInfo methodInfo2 = typeof(Component).GetMethods().First((MethodInfo m) => m.Name == "GetComponent" && m.IsGenericMethod && m.GetParameters().Length == 0).MakeGenericMethod(typeof(PhotonView)); MethodInfo methodInfo3 = AccessTools.PropertyGetter(typeof(PhotonView), "IsMine"); for (int i = 0; i < list.Count; i++) { if (CodeInstructionExtensions.Calls(list[i], methodInfo)) { list[i] = new CodeInstruction(OpCodes.Ldarg_0, (object)null); list.Insert(++i, new CodeInstruction(OpCodes.Callvirt, (object)methodInfo2)); list.Insert(++i, new CodeInstruction(OpCodes.Callvirt, (object)methodInfo3)); } } return list; } } [HarmonyPatch(typeof(PhysGrabObjectImpactDetector), "OnCollisionStay")] public static class PhysGrabObjectImpactDetector_OnCollisionStay_Transpiler { [HarmonyTranspiler] public static IEnumerable<CodeInstruction> Transpile(IEnumerable<CodeInstruction> instructions) { //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Expected O, but got Unknown //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Expected O, but got Unknown //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(instructions); MethodInfo methodInfo = AccessTools.PropertyGetter(typeof(PhotonNetwork), "IsMasterClient"); MethodInfo methodInfo2 = typeof(Component).GetMethods().First((MethodInfo m) => m.Name == "GetComponent" && m.IsGenericMethod && m.GetParameters().Length == 0).MakeGenericMethod(typeof(PhotonView)); MethodInfo methodInfo3 = AccessTools.PropertyGetter(typeof(PhotonView), "IsMine"); FieldInfo fieldInfo = AccessTools.Field(typeof(PhysGrabObjectImpactDetector), "photonView"); for (int i = 0; i < list.Count; i++) { if (CodeInstructionExtensions.Calls(list[i], methodInfo)) { list[i] = new CodeInstruction(OpCodes.Ldarg_0, (object)null); list.Insert(++i, new CodeInstruction(OpCodes.Ldfld, (object)fieldInfo)); list.Insert(++i, new CodeInstruction(OpCodes.Callvirt, (object)methodInfo3)); } } return list; } } [HarmonyPatch(typeof(PhysGrabObjectImpactDetector), "Update")] public static class PhysGrabObjectImpactDetector_Update_Transpiler { [HarmonyTranspiler] public static IEnumerable<CodeInstruction> Transpile(IEnumerable<CodeInstruction> instructions) { //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Expected O, but got Unknown //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Expected O, but got Unknown //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(instructions); MethodInfo methodInfo = AccessTools.PropertyGetter(typeof(PhotonNetwork), "IsMasterClient"); MethodInfo methodInfo2 = AccessTools.PropertyGetter(typeof(PhotonView), "IsMine"); FieldInfo fieldInfo = AccessTools.Field(typeof(PhysGrabObjectImpactDetector), "photonView"); for (int i = 0; i < list.Count; i++) { if (CodeInstructionExtensions.Calls(list[i], methodInfo)) { list[i] = new CodeInstruction(OpCodes.Ldarg_0, (object)null); list.Insert(++i, new CodeInstruction(OpCodes.Ldfld, (object)fieldInfo)); list.Insert(++i, new CodeInstruction(OpCodes.Callvirt, (object)methodInfo2)); } } return list; } } [HarmonyPatch(typeof(PhysGrabObjectImpactDetector), "FixedUpdate")] public static class PhysGrabObjectImpactDetector_FixedUpdate_Transpiler { [HarmonyTranspiler] public static IEnumerable<CodeInstruction> Transpile(IEnumerable<CodeInstruction> instructions) { //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Expected O, but got Unknown //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Expected O, but got Unknown //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(instructions); MethodInfo methodInfo = AccessTools.PropertyGetter(typeof(PhotonNetwork), "IsMasterClient"); MethodInfo methodInfo2 = AccessTools.PropertyGetter(typeof(PhotonView), "IsMine"); FieldInfo fieldInfo = AccessTools.Field(typeof(PhysGrabObjectImpactDetector), "photonView"); for (int i = 0; i < list.Count; i++) { if (CodeInstructionExtensions.Calls(list[i], methodInfo)) { list[i] = new CodeInstruction(OpCodes.Ldarg_0, (object)null); list.Insert(++i, new CodeInstruction(OpCodes.Ldfld, (object)fieldInfo)); list.Insert(++i, new CodeInstruction(OpCodes.Callvirt, (object)methodInfo2)); } } return list; } } [HarmonyPatch(typeof(PhysGrabObject), "GrabEnded")] public static class DelayedReleasePatch { public static float lastSyncTS; [HarmonyPrefix] public static bool Prefix(PhysGrabObject __instance) { PhotonView component = ((Component)__instance).GetComponent<PhotonView>(); if ((Object)(object)component == (Object)null) { return true; } PhysGrabber val = null; foreach (PhysGrabber item in __instance.playerGrabbing) { if ((Object)(object)item == (Object)null || !item.isLocal) { continue; } val = item; break; } DelayedReleaseHandler.Schedule(val, __instance); if ((Object)(object)val == (Object)null) { Debug.Log((object)"Couldn't find you grabbing."); return true; } DelayedReleaseHandler.physGrab = __instance; DelayedReleaseHandler.recentlyDropped = true; StoreSnapshot(val); PerformGrabEndedLocally(__instance, val); return false; } public static void PerformGrabEndedLocally(PhysGrabObject __instance, PhysGrabber player) { if (__instance.grabbedLocal) { __instance.grabbedLocal = false; MethodInfo method = typeof(PhysGrabObject).GetMethod("Throw", BindingFlags.Instance | BindingFlags.NonPublic); if (method != null) { method.Invoke(__instance, new object[1] { player }); } if (__instance.playerGrabbing.Contains(player)) { __instance.playerGrabbing.Remove(player); } } } public static void StoreSnapshot(PhysGrabber grabber) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) DelayedReleaseHandler.StreamData value = default(DelayedReleaseHandler.StreamData); value.pullerPos = grabber.physGrabPointPullerPosition; value.planePos = grabber.physGrabPointPlane.position; value.mouseVel = grabber.mouseTurningVelocity; value.isRotating = grabber.isRotating; value.colorState = grabber.colorState; DelayedReleaseHandler.readyForDispatch = value; } } [HarmonyPatch(typeof(PhysGrabber), "PhysGrabBeamDeactivateRPC")] public static class PreventPrematureRPC { [HarmonyPrefix] public static bool Prefix(PhysGrabber __instance) { if (__instance.photonView.IsMine && DelayedReleaseHandler.ignoreNextGrabBeamDeactive) { DelayedReleaseHandler.ignoreNextGrabBeamDeactive = false; if (Object.op_Implicit((Object)(object)DelayedReleaseHandler.physGrab)) { FakeOwnershipController component = ((Component)DelayedReleaseHandler.physGrab).GetComponent<FakeOwnershipController>(); if ((Object)(object)component != (Object)null) { component.SyncAfterRelease(); } DelayedReleaseHandler.physGrab = null; } return false; } return true; } } [HarmonyPatch(typeof(PhysGrabber), "PhysGrabBeamDeactivate")] public static class PreventPhysGrabBeamDeactivatePre { [HarmonyPrefix] public static bool Prefix(PhysGrabber __instance) { if (DelayedReleaseHandler.recentlyDropped) { MethodInfo method = typeof(PhysGrabber).GetMethod("PhysGrabBeamDeactivateRPC", BindingFlags.Instance | BindingFlags.NonPublic); if (method != null) { method.Invoke(__instance, new object[0]); } return false; } return true; } } [HarmonyPatch(typeof(PhysGrabber), "OnPhotonSerializeView")] public static class StreamInjectPatch { [HarmonyPrefix] public static bool Prefix(PhysGrabber __instance, PhotonStream stream) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) if (!stream.IsWriting) { return true; } PhotonView val = (PhotonView)Access(__instance, "photonView"); if ((Object)(object)val == (Object)null) { return true; } int viewID = val.ViewID; DelayedReleaseHandler.StreamData? readyForDispatch = DelayedReleaseHandler.readyForDispatch; if (!readyForDispatch.HasValue) { stream.SendNext((object)__instance.physGrabPointPullerPosition); stream.SendNext((object)__instance.physGrabPointPlane.position); stream.SendNext((object)__instance.mouseTurningVelocity); stream.SendNext((object)__instance.isRotating); stream.SendNext((object)__instance.colorState); return true; } DelayedReleaseHandler.StreamData value = DelayedReleaseHandler.readyForDispatch.Value; stream.SendNext((object)value.pullerPos); stream.SendNext((object)value.planePos); stream.SendNext((object)value.mouseVel); stream.SendNext((object)value.isRotating); stream.SendNext((object)value.colorState); DelayedReleaseHandler.ignoreNextGrabBeamDeactive = true; DelayedReleaseHandler.readyForDispatch = null; DelayedReleaseHandler.recentlyDropped = false; ((MonoBehaviour)DelayedReleaseHandler.handlerInstance).StartCoroutine(DelayedRPCDispatch(__instance, DelayedReleaseHandler.physGrab, viewID)); return false; } private static object Access(object target, string name) { return target.GetType().GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(target); } private static IEnumerator DelayedRPCDispatch(PhysGrabber grabber, PhysGrabObject physGrab, int id) { yield return (object)new WaitForSeconds(0.01f); ((Component)physGrab).GetComponent<PhotonView>().RPC("GrabEndedRPC", (RpcTarget)2, new object[1] { id }); grabber.photonView.RPC("PhysGrabBeamDeactivateRPC", (RpcTarget)0, Array.Empty<object>()); } } public class DelayedReleaseHandler : MonoBehaviour { public struct StreamData { public Vector3 pullerPos; public Vector3 planePos; public Vector3 mouseVel; public bool isRotating; public int colorState; } public static StreamData? readyForDispatch; public static bool recentlyDropped; public static bool ignoreNextGrabBeamDeactive; public static PhysGrabObject physGrab; public static DelayedReleaseHandler handlerInstance; private static GameObject handlerObject; public static void Schedule(PhysGrabber grabber, PhysGrabObject grabbedObject) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown PhotonNetwork.LogLevel = (PunLogLevel)2; if ((Object)(object)handlerObject == (Object)null) { handlerObject = new GameObject("DelayedReleaseHandler"); DelayedReleaseHandler delayedReleaseHandler = handlerObject.AddComponent<DelayedReleaseHandler>(); handlerInstance = delayedReleaseHandler; Object.DontDestroyOnLoad((Object)(object)handlerObject); } } } public static class ReflectionUtils { public static string DumpObject(object obj, int depth = 0, int maxDepth = 1) { if (obj == null) { return "null"; } Type type = obj.GetType(); if (depth > maxDepth || type.IsPrimitive || type == typeof(string) || type.IsEnum) { return obj.ToString(); } StringBuilder stringBuilder = new StringBuilder(); string text = new string(' ', depth * 2); stringBuilder.AppendLine(text + type.Name + " {"); FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); FieldInfo[] array = fields; foreach (FieldInfo fieldInfo in array) { object obj2; try { obj2 = fieldInfo.GetValue(obj); } catch (Exception ex) { obj2 = "Exception: " + ex.Message; } stringBuilder.Append(text + " " + fieldInfo.Name + ": "); if (obj2 == null) { stringBuilder.AppendLine("null"); } else if (fieldInfo.FieldType.IsPrimitive || fieldInfo.FieldType == typeof(string) || fieldInfo.FieldType.IsEnum) { stringBuilder.AppendLine(obj2.ToString()); } else { stringBuilder.AppendLine(DumpObject(obj2, depth + 1, maxDepth)); } } stringBuilder.AppendLine(text + "}"); return stringBuilder.ToString(); } public static T TryGetField<T>(Traverse t, string name) where T : class { Traverse val = t.Field(name); if (val != null && val.FieldExists()) { return val.GetValue<T>(); } return null; } public static T TryGetStructField<T>(Traverse t, string name) where T : struct { Traverse val = t.Field(name); if (val != null && val.FieldExists()) { return val.GetValue<T>(); } return default(T); } } namespace NetworkingRework.Utils { internal class BlockedItems { public static bool IsBlockedType(PhysGrabObject grabObject) { if ((Object)(object)grabObject == (Object)null) { return true; } if (Object.op_Implicit((Object)(object)((Component)grabObject).GetComponent<PhysGrabCart>())) { return false; } if ((Object)(object)((Component)grabObject).GetComponent<Enemy>() != (Object)null || (Object)(object)((Component)grabObject).GetComponent<EnemyRigidbody>() != (Object)null || (Object)(object)((Component)grabObject).GetComponent<PhysGrabHinge>() != (Object)null || (Object)(object)((Component)grabObject).GetComponentInParent<Enemy>() != (Object)null || (Object)(object)((Component)grabObject).GetComponentInParent<EnemyRigidbody>() != (Object)null || (Object)(object)((Component)grabObject).GetComponent<ItemBattery>() != (Object)null || (Object)(object)((Component)grabObject).GetComponent<ItemGun>() != (Object)null || (Object)(object)((Component)grabObject).GetComponent<ItemRubberDuck>() != (Object)null || (Object)(object)((Component)grabObject).GetComponentInParent<ItemBattery>() != (Object)null || (Object)(object)((Component)grabObject).GetComponentInParent<ItemGun>() != (Object)null || (Object)(object)((Component)grabObject).GetComponentInParent<ItemRubberDuck>() != (Object)null) { return true; } Component[] componentsInParent = ((Component)grabObject).GetComponentsInParent<Component>(true); foreach (Component val in componentsInParent) { if (!((Object)(object)val == (Object)null)) { string name = ((object)val).GetType().Name; if (name.StartsWith("ItemGrenade") || name.StartsWith("ItemDrone") || name.StartsWith("ItemUpgrade")) { return true; } } } return false; } } } namespace NetworkingReworked { [HarmonyPatch(typeof(PhotonTransformView))] public static class PhotonTransformViewPatch { private static FieldInfo rbField = typeof(PhotonTransformView).GetField("rb", BindingFlags.Instance | BindingFlags.NonPublic); private static FieldInfo m_NetworkPosition = typeof(PhotonTransformView).GetField("m_NetworkPosition", BindingFlags.Instance | BindingFlags.NonPublic); private static FieldInfo m_NetworkRotation = typeof(PhotonTransformView).GetField("m_NetworkRotation", BindingFlags.Instance | BindingFlags.NonPublic); private static FieldInfo m_Distance = typeof(PhotonTransformView).GetField("m_Distance", BindingFlags.Instance | BindingFlags.NonPublic); private static FieldInfo m_Angle = typeof(PhotonTransformView).GetField("m_Angle", BindingFlags.Instance | BindingFlags.NonPublic); private static FieldInfo teleportField = typeof(PhotonTransformView).GetField("teleport", BindingFlags.Instance | BindingFlags.NonPublic); private static FieldInfo smoothedPositionField = typeof(PhotonTransformView).GetField("smoothedPosition", BindingFlags.Instance | BindingFlags.NonPublic); private static FieldInfo smoothedRotationField = typeof(PhotonTransformView).GetField("smoothedRotation", BindingFlags.Instance | BindingFlags.NonPublic); private static FieldInfo isSleepingField = typeof(PhotonTransformView).GetField("isSleeping", BindingFlags.Instance | BindingFlags.NonPublic); private static FieldInfo receivedVelocityField = typeof(PhotonTransformView).GetField("receivedVelocity", BindingFlags.Instance | BindingFlags.NonPublic); private static FieldInfo receivedAngularVelocityField = typeof(PhotonTransformView).GetField("receivedAngularVelocity", BindingFlags.Instance | BindingFlags.NonPublic); private static FieldInfo kinematicClientForcedTimerField = typeof(PhotonTransformView).GetField("kinematicClientForcedTimer", BindingFlags.Instance | BindingFlags.NonPublic); private static FieldInfo kinematicClientForcedField = typeof(PhotonTransformView).GetField("kinematicClientForced", BindingFlags.Instance | BindingFlags.NonPublic); [HarmonyPrefix] [HarmonyPatch("Update")] public static bool Prefix_Update(PhotonTransformView __instance) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Unknown result type (might be due to invalid IL or missing references) //IL_0234: Unknown result type (might be due to invalid IL or missing references) //IL_0239: Unknown result type (might be due to invalid IL or missing references) //IL_0242: Unknown result type (might be due to invalid IL or missing references) //IL_0247: Unknown result type (might be due to invalid IL or missing references) //IL_0257: Unknown result type (might be due to invalid IL or missing references) //IL_025c: Unknown result type (might be due to invalid IL or missing references) //IL_025f: Unknown result type (might be due to invalid IL or missing references) //IL_0264: Unknown result type (might be due to invalid IL or missing references) //IL_0266: Unknown result type (might be due to invalid IL or missing references) //IL_026b: Unknown result type (might be due to invalid IL or missing references) //IL_027e: Unknown result type (might be due to invalid IL or missing references) //IL_0283: Unknown result type (might be due to invalid IL or missing references) //IL_01f1: Unknown result type (might be due to invalid IL or missing references) //IL_01f3: Unknown result type (might be due to invalid IL or missing references) //IL_0209: Unknown result type (might be due to invalid IL or missing references) //IL_020e: Unknown result type (might be due to invalid IL or missing references) //IL_0210: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Unknown result type (might be due to invalid IL or missing references) //IL_0228: Unknown result type (might be due to invalid IL or missing references) //IL_022d: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_0287: Unknown result type (might be due to invalid IL or missing references) //IL_0290: Unknown result type (might be due to invalid IL or missing references) //IL_029e: Unknown result type (might be due to invalid IL or missing references) //IL_02b1: Unknown result type (might be due to invalid IL or missing references) //IL_01ae: Unknown result type (might be due to invalid IL or missing references) //IL_01b3: Unknown result type (might be due to invalid IL or missing references) //IL_02fa: Unknown result type (might be due to invalid IL or missing references) //IL_0302: Unknown result type (might be due to invalid IL or missing references) //IL_030f: Unknown result type (might be due to invalid IL or missing references) //IL_0321: Unknown result type (might be due to invalid IL or missing references) //IL_02e3: Unknown result type (might be due to invalid IL or missing references) //IL_02ec: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) if (!SemiFunc.IsMultiplayer()) { return true; } PhotonView component = ((Component)__instance).GetComponent<PhotonView>(); Rigidbody val = (Rigidbody)rbField.GetValue(__instance); if ((Object)(object)val == (Object)null || (Object)(object)component == (Object)null) { return false; } Vector3 val2 = (Vector3)m_NetworkPosition.GetValue(__instance); Quaternion val3 = (Quaternion)m_NetworkRotation.GetValue(__instance); float num = (float)m_Distance.GetValue(__instance); float num2 = (float)m_Angle.GetValue(__instance); bool flag = (bool)teleportField.GetValue(__instance); bool flag2 = (bool)isSleepingField.GetValue(__instance); Vector3 val4 = (Vector3)smoothedPositionField.GetValue(__instance); Quaternion val5 = (Quaternion)smoothedRotationField.GetValue(__instance); Vector3 velocity = (Vector3)receivedVelocityField.GetValue(__instance); Vector3 angularVelocity = (Vector3)receivedAngularVelocityField.GetValue(__instance); float num3 = (float)kinematicClientForcedTimerField.GetValue(__instance); bool flag3 = (bool)kinematicClientForcedField.GetValue(__instance); if (!val.IsSleeping()) { Debug.DrawLine(((Component)__instance).transform.position, ((Component)__instance).transform.position + Vector3.up * 5f, Color.red); } if (!component.IsMine) { if (flag2) { if (!val.isKinematic) { val.isKinematic = true; } if (val.position != val2 || val.rotation != val3) { val.position = val2; val.rotation = val3; } return false; } val.interpolation = (RigidbodyInterpolation)1; if (val.isKinematic) { val4 = Vector3.MoveTowards(val4, val2, num * Time.deltaTime * (float)PhotonNetwork.SerializationRate * 0.9f); val5 = Quaternion.RotateTowards(val5, val3, num2 * Time.deltaTime * (float)PhotonNetwork.SerializationRate * 0.9f); } else { float num4 = Vector3.Distance(val.position, val2); val4 = Vector3.MoveTowards(val.position, val2, num4 * Time.deltaTime * (float)PhotonNetwork.SerializationRate); val5 = Quaternion.RotateTowards(val.rotation, val3, Quaternion.Angle(val.rotation, val3) * Time.deltaTime * (float)PhotonNetwork.SerializationRate); } val.MovePosition(val4); val.MoveRotation(val5); smoothedPositionField.SetValue(__instance, val4); smoothedRotationField.SetValue(__instance, val5); if (!flag) { val.interpolation = (RigidbodyInterpolation)1; if (!val.isKinematic) { val.velocity = velocity; val.angularVelocity = angularVelocity; } } else { val.position = val2; val.rotation = val3; smoothedPositionField.SetValue(__instance, val2); smoothedRotationField.SetValue(__instance, val3); teleportField.SetValue(__instance, false); } } if (num3 > 0f) { num3 -= Time.deltaTime; if (num3 <= 0f) { flag3 = false; } kinematicClientForcedTimerField.SetValue(__instance, num3); kinematicClientForcedField.SetValue(__instance, flag3); } return false; } } [HarmonyPatch(typeof(PhotonTransformView))] public static class PhotonTransformViewSerializationPatch { private static readonly BindingFlags instanceFlags = BindingFlags.Instance | BindingFlags.NonPublic; private static readonly FieldInfo rbField = typeof(PhotonTransformView).GetField("rb", instanceFlags); private static readonly FieldInfo m_DirectionField = typeof(PhotonTransformView).GetField("m_Direction", instanceFlags); private static readonly FieldInfo m_StoredPositionField = typeof(PhotonTransformView).GetField("m_StoredPosition", instanceFlags); private static readonly FieldInfo isKinematicField = typeof(PhotonTransformView).GetField("isKinematic", instanceFlags); private static readonly FieldInfo teleportField = typeof(PhotonTransformView).GetField("teleport", instanceFlags); private static readonly FieldInfo kinematicClientForcedField = typeof(PhotonTransformView).GetField("kinematicClientForced", instanceFlags); private static readonly FieldInfo prevRotationField = typeof(PhotonTransformView).GetField("prevRotation", instanceFlags); private static readonly FieldInfo prevPositionField = typeof(PhotonTransformView).GetField("prevPosition", instanceFlags); private static readonly FieldInfo receivedPositionField = typeof(PhotonTransformView).GetField("receivedPosition", instanceFlags); private static readonly FieldInfo receivedRotationField = typeof(PhotonTransformView).GetField("receivedRotation", instanceFlags); private static readonly FieldInfo extrapolateTimerField = typeof(PhotonTransformView).GetField("extrapolateTimer", instanceFlags); private static readonly FieldInfo isSleepingField = typeof(PhotonTransformView).GetField("isSleeping", instanceFlags); private static readonly FieldInfo m_NetworkPositionField = typeof(PhotonTransformView).GetField("m_NetworkPosition", instanceFlags); private static readonly FieldInfo m_NetworkRotationField = typeof(PhotonTransformView).GetField("m_NetworkRotation", instanceFlags); private static readonly FieldInfo m_firstTakeField = typeof(PhotonTransformView).GetField("m_firstTake", instanceFlags); private static readonly FieldInfo m_DistanceField = typeof(PhotonTransformView).GetField("m_Distance", instanceFlags); private static readonly FieldInfo m_AngleField = typeof(PhotonTransformView).GetField("m_Angle", instanceFlags); private static readonly FieldInfo smoothedRotationField = typeof(PhotonTransformView).GetField("smoothedRotation", instanceFlags); private static readonly FieldInfo receivedVelocityField = typeof(PhotonTransformView).GetField("receivedVelocity", instanceFlags); private static readonly FieldInfo receivedAngularVelocityField = typeof(PhotonTransformView).GetField("receivedAngularVelocity", instanceFlags); [HarmonyPrefix] [HarmonyPatch("OnPhotonSerializeView")] public static bool Prefix_OnPhotonSerializeView(PhotonTransformView __instance, PhotonStream stream, PhotonMessageInfo info) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Unknown result type (might be due to invalid IL or missing references) //IL_0252: Unknown result type (might be due to invalid IL or missing references) //IL_025e: Unknown result type (might be due to invalid IL or missing references) //IL_02d1: Unknown result type (might be due to invalid IL or missing references) //IL_02d6: Unknown result type (might be due to invalid IL or missing references) //IL_02de: Unknown result type (might be due to invalid IL or missing references) //IL_02e3: Unknown result type (might be due to invalid IL or missing references) //IL_02eb: Unknown result type (might be due to invalid IL or missing references) //IL_02f0: Unknown result type (might be due to invalid IL or missing references) //IL_02f8: Unknown result type (might be due to invalid IL or missing references) //IL_030b: Unknown result type (might be due to invalid IL or missing references) //IL_031e: Unknown result type (might be due to invalid IL or missing references) //IL_0331: Unknown result type (might be due to invalid IL or missing references) //IL