Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of PortalPreload v1.0.0
PortalPreload.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.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using JetBrains.Annotations; using Microsoft.CodeAnalysis; using ServerSync; using TMPro; using UnityEngine; using UnityEngine.Rendering; using YamlDotNet.Core; using YamlDotNet.Core.Events; using YamlDotNet.Core.ObjectPool; using YamlDotNet.Core.Tokens; using YamlDotNet.Helpers; using YamlDotNet.Serialization; using YamlDotNet.Serialization.BufferedDeserialization; using YamlDotNet.Serialization.BufferedDeserialization.TypeDiscriminators; using YamlDotNet.Serialization.Callbacks; using YamlDotNet.Serialization.Converters; using YamlDotNet.Serialization.EventEmitters; using YamlDotNet.Serialization.NamingConventions; using YamlDotNet.Serialization.NodeDeserializers; using YamlDotNet.Serialization.NodeTypeResolvers; using YamlDotNet.Serialization.ObjectFactories; using YamlDotNet.Serialization.ObjectGraphTraversalStrategies; using YamlDotNet.Serialization.ObjectGraphVisitors; using YamlDotNet.Serialization.Schemas; using YamlDotNet.Serialization.TypeInspectors; using YamlDotNet.Serialization.TypeResolvers; using YamlDotNet.Serialization.Utilities; using YamlDotNet.Serialization.ValueDeserializers; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("PortalPreload")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Azumatt")] [assembly: AssemblyProduct("PortalPreload")] [assembly: AssemblyCopyright("Copyright © 2021")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("4358610B-F3F4-4843-B7AF-98B7BC60DCDE")] [assembly: AssemblyFileVersion("1.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class ExtensionMarkerAttribute : Attribute { public ExtensionMarkerAttribute(string name) { } } } namespace PortalPreload { [HarmonyPatch] internal static class FasterTeleporting { private static bool _destinationPreloaded = false; private static Vector3 _teleportDestination = Vector3.zero; [HarmonyPatch(typeof(Player), "TeleportTo")] [HarmonyPostfix] private static void TeleportTo_Postfix(Player __instance, Vector3 pos, bool __result) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0024: 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_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003d: 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 (__result && !((Object)(object)__instance != (Object)(object)Player.m_localPlayer) && PortalPreloadPlugin.EnableFasterTeleport.Value.IsOn()) { _teleportDestination = pos; Vector2i zone = ZoneSystem.GetZone(pos); _destinationPreloaded = PortalPreloadPlugin.ProtectedZones.Contains(zone) || PortalPreloadPlugin.HasDestinationNear(pos); if (_destinationPreloaded) { __instance.m_teleportTimer = 2.1f; PortalPreloadPlugin.PortalPreloadLogger.LogDebug((object)$"Destination {zone} is preloaded - fast teleport enabled"); } } } [HarmonyPatch(typeof(Player), "UpdateTeleport")] [HarmonyPrefix] private static bool UpdateTeleport_Prefix(Player __instance, float dt) { //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_0075: Unknown result type (might be due to invalid IL or missing references) //IL_0086: 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_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: 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_00e7: 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_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance != (Object)(object)Player.m_localPlayer) { return true; } if (!PortalPreloadPlugin.EnableFasterTeleport.Value.IsOn()) { return true; } if (!__instance.m_teleporting) { return true; } if (!_destinationPreloaded) { return true; } __instance.m_teleportCooldown = 0f; __instance.m_teleportTimer += dt; if (__instance.m_teleportTimer <= 0.5f) { return false; } Vector3 val = __instance.m_teleportTargetRot * Vector3.forward; ((Component)__instance).transform.position = __instance.m_teleportTargetPos; ((Component)__instance).transform.rotation = __instance.m_teleportTargetRot; ((Character)__instance).m_body.linearVelocity = Vector3.zero; ((Character)__instance).m_maxAirAltitude = ((Component)__instance).transform.position.y; ((Character)__instance).SetLookDir(val, 0f); if ((Object)(object)ZoneSystem.instance == (Object)null) { return true; } bool num = ZoneSystem.instance.IsZoneLoaded(__instance.m_teleportTargetPos); float y = default(float); bool flag = ZoneSystem.instance.FindFloor(__instance.m_teleportTargetPos, ref y); if (num && (flag || __instance.m_teleportTimer > 3f)) { if (flag) { Transform transform = ((Component)__instance).transform; Vector3 position = ((Component)__instance).transform.position; position.y = y; transform.position = position; } float teleportTimer = __instance.m_teleportTimer; __instance.m_teleportTimer = 0f; __instance.m_teleporting = false; ((Character)__instance).ResetCloth(); _destinationPreloaded = false; PortalPreloadPlugin.PortalPreloadLogger.LogDebug((object)$"Fast teleport completed in {teleportTimer:F2}s (floor found: {flag})"); return false; } if (__instance.m_teleportTimer > 5f) { _destinationPreloaded = false; PortalPreloadPlugin.PortalPreloadLogger.LogDebug((object)"Fast teleport timeout - falling back to vanilla"); return true; } return false; } [HarmonyPatch(typeof(ZNetScene), "IsAreaReady")] [HarmonyPostfix] private static void IsAreaReady_Postfix(Vector3 point, ref bool __result) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) if (!__result && _destinationPreloaded && Vector3.Distance(point, _teleportDestination) < 10f) { __result = true; } } internal static void Reset() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) _destinationPreloaded = false; _teleportDestination = Vector3.zero; } } [BepInPlugin("Azumatt.PortalPreload", "PortalPreload", "1.0.0")] public class PortalPreloadPlugin : BaseUnityPlugin { public enum Toggle { On = 1, Off = 0 } internal struct PortalTypeInfo { public readonly string PrefabName; public readonly bool ModelFacesForward; public PortalTypeInfo(string prefabName, bool modelFacesForward) { PrefabName = prefabName; ModelFacesForward = modelFacesForward; } } internal struct DestinationEntry { public Vector3 Position; public Vector2i Zone; public int ZoneRadius; } internal struct DeferredDestinationCleanup { public Vector3 DestinationPos; public ZDOID TrackedRemoteID; } [HarmonyPatch(typeof(TeleportWorld), "RPC_SetTag")] public static class TeleportWorld_RPC_SetTag_Patch { [CompilerGenerated] private sealed class <DelayedPreload>d__1 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public TeleportWorld portal; private int <i>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <DelayedPreload>d__1(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: 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) switch (<>1__state) { default: return false; case 0: <>1__state = -1; <i>5__2 = 0; break; case 1: { <>1__state = -1; int num = <i>5__2 + 1; <i>5__2 = num; break; } } if (<i>5__2 < 100) { <>2__current = null; <>1__state = 1; return true; } if (portal.HaveTarget() && portal.TargetFound()) { ZNetView nview = portal.m_nview; if ((Object)(object)nview == (Object)null) { return false; } ZDO zDO = nview.GetZDO(); if (zDO == null) { return false; } ZDOID connectionZDOID = zDO.GetConnectionZDOID((ConnectionType)1); if (connectionZDOID != ZDOID.None) { ZDO zDO2 = ZDOMan.instance.GetZDO(connectionZDOID); if (zDO2 != null) { Vector3 position = zDO2.GetPosition(); PortalPreloadLogger.LogInfo((object)$"RPC_SetTag patch: remote portal at {position} found. Preloading..."); PreloadPortalDestination(position); } } } return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static void Postfix(TeleportWorld __instance) { ((MonoBehaviour)__instance).StartCoroutine(DelayedPreload(__instance)); } [IteratorStateMachine(typeof(<DelayedPreload>d__1))] private static IEnumerator DelayedPreload(TeleportWorld portal) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <DelayedPreload>d__1(0) { portal = portal }; } } [HarmonyPatch(typeof(TeleportWorld), "Awake")] public static class TeleportWorld_Awake_Patch { private static void Postfix(TeleportWorld __instance) { if (!Player.IsPlacementGhost(((Component)__instance).gameObject)) { if ((Object)(object)((Component)__instance).GetComponent<PortalPreview>() == (Object)null) { ((Component)__instance).gameObject.AddComponent<PortalPreview>(); PortalPreloadLogger.LogInfo((object)"Added PortalPreview component to TeleportWorld."); } if ((Object)(object)__instance.m_proximityRoot != (Object)null && (Object)(object)((Component)__instance.m_proximityRoot).GetComponent<PortalProximityTrigger>() == (Object)null) { ((Component)__instance.m_proximityRoot).gameObject.AddComponent<PortalProximityTrigger>(); PortalPreloadLogger.LogInfo((object)"Added PortalProximityTrigger to m_proximityRoot."); } } } } [HarmonyPatch(typeof(Game), "Start")] private static class RegisterRPCGameStartPatch { private static void Postfix(Game __instance) { ZRoutedRpc.instance.Register<ZPackage>("RPC_SetPlayerNearby", (Action<long, ZPackage>)RPC_SetPlayerNearby); } } [HarmonyPatch(typeof(ZNetScene), "OnDestroy")] private static class ZNetSceneOnDestroyCleanupPatch { private static void Postfix() { ClearAllDestinations(); ProtectedZones.Clear(); IsPlayerTeleporting = false; PortalPreview.ClearAllStaticState(); FasterTeleporting.Reset(); PortalPreloadLogger.LogDebug((object)"World unloading - cleared all static state"); } } [HarmonyPatch(typeof(Player), "TeleportTo")] private static class PlayerTeleportToPatch { private static void Postfix(Player __instance, bool __result) { if (__result && (Object)(object)__instance == (Object)(object)Player.m_localPlayer) { IsPlayerTeleporting = true; PortalPreloadLogger.LogDebug((object)"Player started teleporting - protecting zones"); } } } [HarmonyPatch(typeof(Player), "UpdateTeleport")] private static class PlayerUpdateTeleportPatch { [CompilerGenerated] private sealed class <DelayedZoneCleanup>d__1 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public Vector3 landingPos; public Vector2i landingZone; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <DelayedZoneCleanup>d__1(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown //IL_0038: 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_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0098: 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_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(5f); <>1__state = 1; return true; case 1: <>1__state = -1; RemoveDestination(landingPos); if ((Object)(object)Player.m_localPlayer != (Object)null) { Vector2i zone = ZoneSystem.GetZone(((Component)Player.m_localPlayer).transform.position); Vector2i val = default(Vector2i); for (int i = -2; i <= 2; i++) { for (int j = -2; j <= 2; j++) { ((Vector2i)(ref val))..ctor(landingZone.x + i, landingZone.y + j); if (Mathf.Abs(zone.x - val.x) > 3 || Mathf.Abs(zone.y - val.y) > 3) { ProtectedZones.Remove(val); } } } } PortalPreloadLogger.LogDebug((object)"Cleaned up post-teleport zone protection"); return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static void Postfix(Player __instance) { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0086: 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_008f: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance != (Object)(object)Player.m_localPlayer || !IsPlayerTeleporting || ((Character)__instance).IsTeleporting()) { return; } IsPlayerTeleporting = false; PortalPreloadLogger.LogDebug((object)"Player finished teleporting - processing deferred cleanups"); ProcessDeferredCleanups(); Vector3 position = ((Component)__instance).transform.position; Vector2i zone = ZoneSystem.GetZone(position); for (int i = -2; i <= 2; i++) { for (int j = -2; j <= 2; j++) { ProtectedZones.Add(new Vector2i(zone.x + i, zone.y + j)); } } AddDestination(position, 3); ((MonoBehaviour)__instance).StartCoroutine(DelayedZoneCleanup(position, zone)); } [IteratorStateMachine(typeof(<DelayedZoneCleanup>d__1))] private static IEnumerator DelayedZoneCleanup(Vector3 landingPos, Vector2i landingZone) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <DelayedZoneCleanup>d__1(0) { landingPos = landingPos, landingZone = landingZone }; } } internal const string ModName = "PortalPreload"; internal const string ModVersion = "1.0.0"; internal const string Author = "Azumatt"; private const string ModGUID = "Azumatt.PortalPreload"; private static string ConfigFileName = "Azumatt.PortalPreload.cfg"; private static string ConfigFileFullPath; public static readonly ManualLogSource PortalPreloadLogger; private readonly Harmony _harmony = new Harmony("Azumatt.PortalPreload"); private static readonly ConfigSync ConfigSync; private static ConfigEntry<Toggle> _enablePreloading; internal static ConfigEntry<Toggle> EnableFasterTeleport; internal static readonly int PlayerNearbyCountKey; internal static readonly List<PortalTypeInfo> SupportedPortals; private static HashSet<int> _portalPrefabHashes; private static Dictionary<int, PortalTypeInfo> _portalConfigByHash; internal static HashSet<Vector2i> ProtectedZones; internal const float ObjectLoadRadius = 40f; internal const float CloseDistance = 5f; internal const float MediumDistance = 10f; internal const float FarDistance = 15f; internal static bool IsPlayerTeleporting; internal static DestinationEntry[] CachedDestinations; private static readonly Dictionary<Vector3, int> _destRadii; private static readonly Dictionary<Vector3, int> _destRefCounts; internal static readonly List<DeferredDestinationCleanup> DeferredCleanups; internal static HashSet<int> PortalPrefabHashes { get { if (_portalPrefabHashes == null) { RebuildPortalLookups(); } return _portalPrefabHashes; } } internal static bool HasDestinations => CachedDestinations.Length != 0; internal static bool TryGetPortalConfig(int prefabHash, out PortalTypeInfo config) { if (_portalConfigByHash == null) { RebuildPortalLookups(); } return _portalConfigByHash.TryGetValue(prefabHash, out config); } internal static void RebuildPortalLookups() { _portalPrefabHashes = new HashSet<int>(); _portalConfigByHash = new Dictionary<int, PortalTypeInfo>(); foreach (PortalTypeInfo supportedPortal in SupportedPortals) { int stableHashCode = StringExtensionMethods.GetStableHashCode(supportedPortal.PrefabName); _portalPrefabHashes.Add(stableHashCode); _portalConfigByHash[stableHashCode] = supportedPortal; } } internal static int GetZoneRadiusForDistance(float distance) { if (distance <= 5f) { return 3; } if (distance <= 10f) { return 2; } return 1; } internal static void AddDestination(Vector3 pos, int zoneRadius) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0014: 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_0030: Unknown result type (might be due to invalid IL or missing references) if (_destRefCounts.TryGetValue(pos, out var value)) { _destRefCounts[pos] = value + 1; if (zoneRadius > _destRadii[pos]) { _destRadii[pos] = zoneRadius; } } else { _destRefCounts[pos] = 1; _destRadii[pos] = zoneRadius; } RebuildCachedDestinations(); } internal static void UpdateDestinationRadius(Vector3 pos, int zoneRadius) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0013: 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) if (_destRadii.ContainsKey(pos) && _destRadii[pos] != zoneRadius) { _destRadii[pos] = zoneRadius; RebuildCachedDestinations(); } } internal static void RemoveDestination(Vector3 pos) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0033: 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_0025: Unknown result type (might be due to invalid IL or missing references) if (_destRefCounts.TryGetValue(pos, out var value)) { if (value <= 1) { _destRefCounts.Remove(pos); _destRadii.Remove(pos); } else { _destRefCounts[pos] = value - 1; } RebuildCachedDestinations(); } } internal static bool HasDestinationNear(Vector3 pos, float tolerance = 10f) { //IL_0015: 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_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) float num = tolerance * tolerance; DestinationEntry[] cachedDestinations = CachedDestinations; for (int i = 0; i < cachedDestinations.Length; i++) { Vector3 val = cachedDestinations[i].Position - pos; if (((Vector3)(ref val)).sqrMagnitude < num) { return true; } } return false; } private static void RebuildCachedDestinations() { //IL_0050: 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_0072: 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_0069: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) if (_destRadii.Count == 0) { CachedDestinations = Array.Empty<DestinationEntry>(); return; } DestinationEntry[] array = new DestinationEntry[_destRadii.Count]; int num = 0; foreach (KeyValuePair<Vector3, int> destRadius in _destRadii) { array[num++] = new DestinationEntry { Position = destRadius.Key, Zone = (((Object)(object)ZoneSystem.instance != (Object)null) ? ZoneSystem.GetZone(destRadius.Key) : Vector2i.zero), ZoneRadius = destRadius.Value }; } CachedDestinations = array; } internal static void ClearAllDestinations() { _destRadii.Clear(); _destRefCounts.Clear(); DeferredCleanups.Clear(); CachedDestinations = Array.Empty<DestinationEntry>(); } internal static void ProcessDeferredCleanups() { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) if (DeferredCleanups.Count == 0) { return; } Player localPlayer = Player.m_localPlayer; foreach (DeferredDestinationCleanup deferredCleanup in DeferredCleanups) { RemoveDestination(deferredCleanup.DestinationPos); if (deferredCleanup.TrackedRemoteID != ZDOID.None && (Object)(object)localPlayer != (Object)null && ZDOMan.instance != null) { ZDO zDO = ZDOMan.instance.GetZDO(deferredCleanup.TrackedRemoteID); if (zDO != null) { SetPlayerNearby(zDO, deferredCleanup.TrackedRemoteID, localPlayer, entering: false); } } } DeferredCleanups.Clear(); } public void Awake() { _enablePreloading = ((BaseUnityPlugin)this).Config.Bind<Toggle>("General", "EnablePreloading", Toggle.On, "If on, the mod preloads portal destinations."); EnableFasterTeleport = ((BaseUnityPlugin)this).Config.Bind<Toggle>("General", "EnableFasterTeleport", Toggle.On, "If on, the teleportation is faster."); Assembly executingAssembly = Assembly.GetExecutingAssembly(); _harmony.PatchAll(executingAssembly); ((MonoBehaviour)this).InvokeRepeating("UpdateForceActive", 5f, 2f); } private async Task UpdateForceActive() { try { if (ZDOMan.instance == null || (Object)(object)ZoneSystem.instance == (Object)null || ((Object)(object)ZNet.instance != (Object)null && !ZNet.instance.IsDedicated() && !ZNet.instance.IsServer())) { return; } HashSet<int> hashes = PortalPrefabHashes; List<ZDO> obj = await ZoneSystem.instance.GetWorldObjectsAsync((ZDO zdo) => hashes.Contains(zdo.GetPrefab())); ProtectedZones.Clear(); foreach (ZDO item in obj) { if (item != null && item.IsValid() && item.GetInt(PlayerNearbyCountKey, 0) > 0) { ProtectedZones.Add(ZoneSystem.GetZone(item.GetPosition())); } } } catch (Exception ex) { PortalPreloadLogger.LogError((object)("Failed to update force active: " + ex.Message)); } } public static void SetPlayerNearby(ZDO remoteZDO, ZDOID remoteID, Player player, bool entering = true) { //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Expected O, but got Unknown //IL_008d: Unknown result type (might be due to invalid IL or missing references) if (remoteZDO != null && remoteZDO.IsValid() && ZDOMan.instance != null) { int num = (entering ? 1 : (-1)); if (remoteZDO.IsOwner()) { ModifyPlayerNearbyCount(remoteZDO, num); } else if (!remoteZDO.HasOwner()) { remoteZDO.SetOwner(ZDOMan.GetSessionID()); ModifyPlayerNearbyCount(remoteZDO, num); } else if ((Object)(object)ZNet.instance != (Object)null && !ZNet.instance.IsDedicated() && ZNet.instance.IsServer()) { remoteZDO.SetOwner(ZDOMan.GetSessionID()); ModifyPlayerNearbyCount(remoteZDO, num); } else if (ZRoutedRpc.instance != null) { ZPackage val = new ZPackage(); val.Write(remoteID); val.Write(num); ZRoutedRpc.instance.InvokeRoutedRPC(ZRoutedRpc.instance.GetServerPeerID(), "RPC_SetPlayerNearby", new object[1] { val }); } } } private static void ModifyPlayerNearbyCount(ZDO zdo, int delta) { int @int = zdo.GetInt(PlayerNearbyCountKey, 0); int num = Mathf.Max(0, @int + delta); zdo.Set(PlayerNearbyCountKey, num, false); } public static void RPC_SetPlayerNearby(long sender, ZPackage pkg) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) if (ZDOMan.instance == null) { return; } ZDOID val = pkg.ReadZDOID(); int delta = pkg.ReadInt(); ZDO zDO = ZDOMan.instance.GetZDO(val); if (zDO == null || !zDO.IsValid()) { return; } if ((Object)(object)ZNet.instance != (Object)null && ZNet.instance.IsServer()) { if (!zDO.IsOwner()) { zDO.SetOwner(ZDOMan.GetSessionID()); } ModifyPlayerNearbyCount(zDO, delta); } else if (zDO.IsOwner()) { ModifyPlayerNearbyCount(zDO, delta); } } public static void PreloadPortalDestination(Vector3 destinationPos) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) if (_enablePreloading.Value == Toggle.Off) { PortalPreloadLogger.LogDebug((object)"Preloading disabled by config."); return; } PortalPreloadLogger.LogInfo((object)$"Preloading destination at {destinationPos}"); Vector2i zone = ZoneSystem.GetZone(destinationPos); int num = 5; Vector2i item = default(Vector2i); for (int i = -num; i <= num; i++) { for (int j = -num; j <= num; j++) { ((Vector2i)(ref item))..ctor(zone.x + i, zone.y + j); ProtectedZones.Add(item); } } } static PortalPreloadPlugin() { string configPath = Paths.ConfigPath; char directorySeparatorChar = Path.DirectorySeparatorChar; ConfigFileFullPath = configPath + directorySeparatorChar + ConfigFileName; PortalPreloadLogger = Logger.CreateLogSource("PortalPreload"); ConfigSync = new ConfigSync("Azumatt.PortalPreload") { DisplayName = "PortalPreload", CurrentVersion = "1.0.0", MinimumRequiredVersion = "1.0.0" }; _enablePreloading = null; EnableFasterTeleport = null; PlayerNearbyCountKey = StringExtensionMethods.GetStableHashCode("playerNearbyCount"); SupportedPortals = new List<PortalTypeInfo> { new PortalTypeInfo("portal_wood", modelFacesForward: false), new PortalTypeInfo("portal_stone", modelFacesForward: true) }; _portalPrefabHashes = null; _portalConfigByHash = null; ProtectedZones = new HashSet<Vector2i>(); IsPlayerTeleporting = false; CachedDestinations = Array.Empty<DestinationEntry>(); _destRadii = new Dictionary<Vector3, int>(); _destRefCounts = new Dictionary<Vector3, int>(); DeferredCleanups = new List<DeferredDestinationCleanup>(); } } public static class ToggleExtensions { [SpecialName] public sealed class <G>$F0761429328CE66EDE8B39DE93B80CE2 { [SpecialName] public static class <M>$76059A2A9DE173D12B656BE2E483953E { } [ExtensionMarker("<M>$76059A2A9DE173D12B656BE2E483953E")] public bool IsOn() { throw null; } [ExtensionMarker("<M>$76059A2A9DE173D12B656BE2E483953E")] public bool IsOff() { throw null; } } public static bool IsOn(this PortalPreloadPlugin.Toggle toggle) { return toggle == PortalPreloadPlugin.Toggle.On; } public static bool IsOff(this PortalPreloadPlugin.Toggle toggle) { return toggle == PortalPreloadPlugin.Toggle.Off; } } public class PortalPreview : MonoBehaviour { [CompilerGenerated] private sealed class <RegisterWhenReady>d__31 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public PortalPreview <>4__this; private int <attempts>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <RegisterWhenReady>d__31(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { int num = <>1__state; PortalPreview portalPreview = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; <attempts>5__2 = 0; break; case 1: <>1__state = -1; break; } if ((Object)(object)portalPreview.portal != (Object)null && (Object)(object)portalPreview.portal.m_nview != (Object)null && portalPreview.portal.m_nview.GetZDO() == null) { if (++<attempts>5__2 > 600) { PortalPreloadPlugin.PortalPreloadLogger.LogWarning((object)"Timed out waiting for ZDO on PortalPreview"); return false; } <>2__current = null; <>1__state = 1; return true; } if ((Object)(object)portalPreview.portal != (Object)null && (Object)(object)portalPreview.portal.m_nview != (Object)null && portalPreview.portal.m_nview.GetZDO() != null) { RegisterPortal(portalPreview.portal); if (PortalPreloadPlugin.TryGetPortalConfig(portalPreview.portal.m_nview.GetZDO().GetPrefab(), out var config)) { portalPreview._modelFacesForward = config.ModelFacesForward; } } portalPreview._registerCoroutine = null; return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static readonly Dictionary<ZDOID, TeleportWorld> _portalRegistry = new Dictionary<ZDOID, TeleportWorld>(); private static readonly HashSet<PortalPreview> _activePreviewsInRange = new HashSet<PortalPreview>(); private static PortalPreview _closestPreview = null; private static float _closestDistance = float.MaxValue; private static readonly List<PortalPreview> _toRemove = new List<PortalPreview>(); public int textureSize = 512; public float maxPreviewDistance = 12f; public string previewPlaneName = "PortalPreviewPlane"; public Vector3 previewPlanePosition = new Vector3(0f, 1.31f, 0.01f); public Vector3 previewPlaneScale = new Vector3(2.85f, 2.85f, 2.85f); public float raycastWidth = 0.35f; public float nearClipPlaneMin = 0.1f; public float nearClipPlaneMax = 0.5f; public float minWaterDistance = 0.3f; private LayerMask blockCameraMask; private TeleportWorld portal; private Camera previewCam; private RenderTexture rt; private MeshRenderer planeRend; private TeleportWorld _cachedRemoteTW; private Renderer[] _cachedRemoteRenderers; private bool _hasRenderedLiveFrame; private bool _modelFacesForward; private int _framesInRange; private Coroutine _registerCoroutine; public static void RegisterPortal(TeleportWorld tw) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) object obj; if (tw == null) { obj = null; } else { ZNetView nview = tw.m_nview; obj = ((nview != null) ? nview.GetZDO() : null); } if (obj != null) { _portalRegistry[tw.m_nview.GetZDO().m_uid] = tw; } } public static void UnregisterPortal(TeleportWorld tw) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) object obj; if (tw == null) { obj = null; } else { ZNetView nview = tw.m_nview; obj = ((nview != null) ? nview.GetZDO() : null); } if (obj != null) { _portalRegistry.Remove(tw.m_nview.GetZDO().m_uid); } } public static TeleportWorld GetPortalByZDOID(ZDOID id) { //IL_0005: 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) _portalRegistry.TryGetValue(id, out TeleportWorld value); if ((Object)(object)value == (Object)null) { _portalRegistry.Remove(id); return null; } return value; } public static void ClearAllStaticState() { _portalRegistry.Clear(); _activePreviewsInRange.Clear(); _closestPreview = null; _closestDistance = float.MaxValue; } private void Awake() { portal = ((Component)this).GetComponent<TeleportWorld>(); if ((Object)(object)portal == (Object)null) { Debug.LogError((object)"PortalPreview needs TeleportWorld"); } } private void OnEnable() { _registerCoroutine = ((MonoBehaviour)this).StartCoroutine(RegisterWhenReady()); } [IteratorStateMachine(typeof(<RegisterWhenReady>d__31))] private IEnumerator RegisterWhenReady() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <RegisterWhenReady>d__31(0) { <>4__this = this }; } private void OnDisable() { if (_registerCoroutine != null) { ((MonoBehaviour)this).StopCoroutine(_registerCoroutine); _registerCoroutine = null; } RemoveFromActiveRange(); } private void Start() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: 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_0058: Expected O, but got Unknown //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Expected O, but got Unknown //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Expected O, but got Unknown //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_014a: 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_0193: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Expected O, but got Unknown blockCameraMask = LayerMask.op_Implicit(LayerMask.GetMask(new string[5] { "Default", "static_solid", "terrain", "piece", "piece_nonsolid" })); rt = new RenderTexture(textureSize, textureSize, 24, (RenderTextureFormat)0); rt.antiAliasing = 2; ((Texture)rt).filterMode = (FilterMode)1; GameObject val = new GameObject("PortalCam_" + ((Object)this).name); previewCam = val.AddComponent<Camera>(); previewCam.CopyFrom(Camera.main); previewCam.targetTexture = rt; previewCam.cullingMask = -1; previewCam.useOcclusionCulling = false; previewCam.clearFlags = (CameraClearFlags)1; ((Behaviour)previewCam).enabled = false; previewCam.depthTextureMode = (DepthTextureMode)1; Transform val2 = (Object.op_Implicit((Object)(object)portal.m_model) ? ((Component)portal.m_model).transform : ((Component)this).transform); GameObject val3 = new GameObject(previewPlaneName); val3.transform.SetParent(val2, false); val3.transform.localPosition = previewPlanePosition; val3.transform.localRotation = Quaternion.identity; val3.transform.localScale = previewPlaneScale; MeshFilter obj = val3.AddComponent<MeshFilter>(); planeRend = val3.AddComponent<MeshRenderer>(); obj.mesh = CreateCircleMesh(32, 0.5f); Material val4 = new Material(Shader.Find("Sprites/Default")); val4.mainTexture = (Texture)(object)rt; ((Renderer)planeRend).material = val4; ((Renderer)planeRend).shadowCastingMode = (ShadowCastingMode)0; ((Renderer)planeRend).receiveShadows = false; } private Mesh CreateCircleMesh(int segments, float radius) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) Mesh val = new Mesh(); Vector3[] array = (Vector3[])(object)new Vector3[segments + 1]; Vector2[] array2 = (Vector2[])(object)new Vector2[segments + 1]; int[] array3 = new int[segments * 3]; array[0] = Vector3.zero; array2[0] = new Vector2(0.5f, 0.5f); float num = (float)Math.PI * 2f / (float)segments; for (int i = 0; i < segments; i++) { float num2 = (float)i * num; float num3 = Mathf.Cos(num2) * radius; float num4 = Mathf.Sin(num2) * radius; array[i + 1] = new Vector3(num3, num4, 0f); array2[i + 1] = new Vector2(num3 / (2f * radius) + 0.5f, num4 / (2f * radius) + 0.5f); } for (int j = 0; j < segments; j++) { array3[j * 3] = 0; array3[j * 3 + 1] = j + 1; array3[j * 3 + 2] = ((j == segments - 1) ? 1 : (j + 2)); } val.vertices = array; val.uv = array2; val.triangles = array3; val.RecalculateNormals(); val.RecalculateBounds(); return val; } private void LateUpdate() { //IL_0097: 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_007b: 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) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_009c: 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_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0112: 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_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Unknown result type (might be due to invalid IL or missing references) //IL_01b1: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Unknown result type (might be due to invalid IL or missing references) //IL_0284: Unknown result type (might be due to invalid IL or missing references) //IL_0289: Unknown result type (might be due to invalid IL or missing references) //IL_028b: 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_02a4: Unknown result type (might be due to invalid IL or missing references) //IL_02a9: Unknown result type (might be due to invalid IL or missing references) //IL_02ae: Unknown result type (might be due to invalid IL or missing references) //IL_02b3: Unknown result type (might be due to invalid IL or missing references) //IL_02b5: Unknown result type (might be due to invalid IL or missing references) //IL_02b7: Unknown result type (might be due to invalid IL or missing references) //IL_02bc: Unknown result type (might be due to invalid IL or missing references) //IL_02be: Unknown result type (might be due to invalid IL or missing references) //IL_02c3: Unknown result type (might be due to invalid IL or missing references) //IL_02c7: Unknown result type (might be due to invalid IL or missing references) //IL_02c8: Unknown result type (might be due to invalid IL or missing references) //IL_02cd: Unknown result type (might be due to invalid IL or missing references) //IL_02f2: Unknown result type (might be due to invalid IL or missing references) //IL_02e5: Unknown result type (might be due to invalid IL or missing references) //IL_02f7: Unknown result type (might be due to invalid IL or missing references) //IL_02fc: Unknown result type (might be due to invalid IL or missing references) //IL_0300: Unknown result type (might be due to invalid IL or missing references) //IL_0305: Unknown result type (might be due to invalid IL or missing references) //IL_030a: Unknown result type (might be due to invalid IL or missing references) //IL_032c: Unknown result type (might be due to invalid IL or missing references) //IL_032e: Unknown result type (might be due to invalid IL or missing references) //IL_0335: Unknown result type (might be due to invalid IL or missing references) //IL_033a: Unknown result type (might be due to invalid IL or missing references) //IL_033c: Unknown result type (might be due to invalid IL or missing references) //IL_033e: 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_0345: Unknown result type (might be due to invalid IL or missing references) //IL_0348: 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_034c: Unknown result type (might be due to invalid IL or missing references) //IL_034e: Unknown result type (might be due to invalid IL or missing references) //IL_0353: Unknown result type (might be due to invalid IL or missing references) //IL_0355: Unknown result type (might be due to invalid IL or missing references) //IL_0365: Unknown result type (might be due to invalid IL or missing references) //IL_0392: Unknown result type (might be due to invalid IL or missing references) //IL_03a4: Unknown result type (might be due to invalid IL or missing references) //IL_03a6: Unknown result type (might be due to invalid IL or missing references) //IL_03a8: Unknown result type (might be due to invalid IL or missing references) //IL_03ba: 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_03be: 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_03c7: Unknown result type (might be due to invalid IL or missing references) //IL_03cc: Unknown result type (might be due to invalid IL or missing references) //IL_03ce: Unknown result type (might be due to invalid IL or missing references) //IL_03d0: Unknown result type (might be due to invalid IL or missing references) //IL_03d8: 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_03e9: Unknown result type (might be due to invalid IL or missing references) if (!portal.HaveTarget() || !portal.TargetFound()) { RemoveFromActiveRange(); if ((Object)(object)planeRend != (Object)null) { ((Renderer)planeRend).enabled = false; } _hasRenderedLiveFrame = false; return; } Camera main = Camera.main; if ((Object)(object)main == (Object)null) { return; } Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer == (Object)null) { return; } Vector3 val = (((Object)(object)((Character)localPlayer).m_eye != (Object)null) ? ((Character)localPlayer).m_eye.position : (((Component)localPlayer).transform.position + Vector3.up * 1.6f)); float num = Vector3.Distance(val, ((Component)this).transform.position); if (num > maxPreviewDistance) { RemoveFromActiveRange(); if ((Object)(object)planeRend != (Object)null) { ((Renderer)planeRend).enabled = false; } return; } Transform val2 = (Object.op_Implicit((Object)(object)portal.m_model) ? ((Component)portal.m_model).transform : ((Component)this).transform); Vector3 val3 = val - val2.position; float num2 = Vector3.Dot(val2.forward, val3); if (_modelFacesForward ? (num2 < 0f) : (num2 > 0f)) { RemoveFromActiveRange(); if ((Object)(object)planeRend != (Object)null) { ((Renderer)planeRend).enabled = false; } return; } AddToActiveRange(num); if ((Object)(object)_closestPreview != (Object)(object)this) { if ((Object)(object)planeRend != (Object)null) { ((Renderer)planeRend).enabled = _hasRenderedLiveFrame; } return; } ZDOID connectionZDOID = portal.m_nview.GetZDO().GetConnectionZDOID((ConnectionType)1); if (connectionZDOID == ZDOID.None) { return; } ZDO zDO = ZDOMan.instance.GetZDO(connectionZDOID); if (zDO == null) { return; } TeleportWorld portalByZDOID = GetPortalByZDOID(zDO.m_uid); if ((Object)(object)portalByZDOID == (Object)null) { if ((Object)(object)planeRend != (Object)null) { ((Renderer)planeRend).enabled = _hasRenderedLiveFrame; } return; } if ((Object)(object)planeRend != (Object)null) { ((Renderer)planeRend).enabled = true; } _framesInRange++; Transform val4 = (((Object)(object)portal.m_model != (Object)null) ? ((Component)portal.m_model).transform : ((Component)this).transform); Transform obj = (((Object)(object)portalByZDOID.m_model != (Object)null) ? ((Component)portalByZDOID.m_model).transform : ((Component)portalByZDOID).transform); Matrix4x4 worldToLocalMatrix = val4.worldToLocalMatrix; Matrix4x4 localToWorldMatrix = obj.localToWorldMatrix; Matrix4x4 val5 = Matrix4x4.TRS(Vector3.zero, Quaternion.Euler(0f, 180f, 0f), Vector3.one); Matrix4x4 val6 = localToWorldMatrix * val5 * worldToLocalMatrix; Vector3 val7 = ((Matrix4x4)(ref val6)).MultiplyPoint3x4(val); Vector3 val8 = ((Matrix4x4)(ref val6)).MultiplyVector(((Object)(object)((Character)localPlayer).m_eye != (Object)null) ? ((Character)localPlayer).m_eye.forward : ((Component)main).transform.forward); Vector3 val9 = ((Matrix4x4)(ref val6)).MultiplyVector(Vector3.up); float num3 = (((Object)(object)GameCamera.instance != (Object)null) ? GameCamera.instance.m_distance : 4f); Vector3 val10 = -val8 * num3; Vector3 targetCamPos = val7 + val10; targetCamPos = ApplyCameraCollision(val7, targetCamPos, val8); float liquidLevel = Floating.GetLiquidLevel(targetCamPos, 1f, (LiquidType)10); if (targetCamPos.y < liquidLevel + minWaterDistance) { targetCamPos.y = liquidLevel + minWaterDistance; } ((Component)previewCam).transform.position = targetCamPos; ((Component)previewCam).transform.rotation = Quaternion.LookRotation(val8, val9); float nearClipPlane = nearClipPlaneMax; Vector3 val11 = val7 - targetCamPos; Vector3 normalized = ((Vector3)(ref val11)).normalized; if (Physics.CheckSphere(targetCamPos - normalized * nearClipPlaneMax, nearClipPlaneMax, LayerMask.op_Implicit(blockCameraMask))) { nearClipPlane = nearClipPlaneMin; } previewCam.fieldOfView = main.fieldOfView; previewCam.nearClipPlane = nearClipPlane; previewCam.farClipPlane = main.farClipPlane; if ((Object)(object)_cachedRemoteTW != (Object)(object)portalByZDOID || ((Object)(object)_cachedRemoteTW != (Object)null && _cachedRemoteRenderers == null)) { _cachedRemoteTW = portalByZDOID; _cachedRemoteRenderers = ((Component)portalByZDOID).GetComponentsInChildren<Renderer>(); } if (_cachedRemoteRenderers != null) { for (int i = 0; i < _cachedRemoteRenderers.Length; i++) { if ((Object)(object)_cachedRemoteRenderers[i] != (Object)null) { _cachedRemoteRenderers[i].enabled = false; } } } previewCam.Render(); _hasRenderedLiveFrame = true; if (_cachedRemoteRenderers == null) { return; } for (int j = 0; j < _cachedRemoteRenderers.Length; j++) { if ((Object)(object)_cachedRemoteRenderers[j] != (Object)null) { _cachedRemoteRenderers[j].enabled = true; } } } private Vector3 ApplyCameraCollision(Vector3 eyePos, Vector3 targetCamPos, Vector3 forward) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0010: 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_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: 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_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0098: 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_009f: 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_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: 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) Vector3 val = targetCamPos - eyePos; Vector3 normalized = ((Vector3)(ref val)).normalized; float num = Vector3.Distance(eyePos, targetCamPos); RaycastHit val2 = default(RaycastHit); if (Physics.SphereCast(eyePos, raycastWidth, normalized, ref val2, num, LayerMask.op_Implicit(blockCameraMask))) { float num2 = Mathf.Max(((RaycastHit)(ref val2)).distance - nearClipPlaneMin, 0.1f); return eyePos + normalized * num2; } if (Physics.Raycast(eyePos, normalized, ref val2, num, LayerMask.op_Implicit(blockCameraMask))) { float num3 = Mathf.Max(((RaycastHit)(ref val2)).distance - nearClipPlaneMin, 0.1f); Vector3 val3 = eyePos + normalized * num3; if (Vector3.Distance(eyePos, val3) < Vector3.Distance(eyePos, targetCamPos)) { return val3; } } return targetCamPos; } private void AddToActiveRange(float distance) { _activePreviewsInRange.Add(this); if (_activePreviewsInRange.Count == 1) { _closestPreview = this; _closestDistance = distance; } else if (distance < _closestDistance) { _closestPreview = this; _closestDistance = distance; } else if ((Object)(object)_closestPreview == (Object)(object)this && distance > _closestDistance) { RecalculateClosest(); } } private void RemoveFromActiveRange() { _framesInRange = 0; if (_activePreviewsInRange.Remove(this) && (Object)(object)_closestPreview == (Object)(object)this) { RecalculateClosest(); } } private static void RecalculateClosest() { //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: 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_00ff: Unknown result type (might be due to invalid IL or missing references) _closestPreview = null; _closestDistance = float.MaxValue; _toRemove.Clear(); foreach (PortalPreview item in _activePreviewsInRange) { if ((Object)(object)item == (Object)null) { _toRemove.Add(item); } } for (int i = 0; i < _toRemove.Count; i++) { _activePreviewsInRange.Remove(_toRemove[i]); } _toRemove.Clear(); Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer == (Object)null) { return; } Vector3 val = (((Object)(object)((Character)localPlayer).m_eye != (Object)null) ? ((Character)localPlayer).m_eye.position : (((Component)localPlayer).transform.position + Vector3.up * 1.6f)); foreach (PortalPreview item2 in _activePreviewsInRange) { float num = Vector3.Distance(val, ((Component)item2).transform.position); if (num < _closestDistance) { _closestDistance = num; _closestPreview = item2; } } } private void OnDestroy() { UnregisterPortal(portal); RemoveFromActiveRange(); if ((Object)(object)rt != (Object)null) { rt.Release(); Object.Destroy((Object)(object)rt); rt = null; } if ((Object)(object)previewCam != (Object)null) { Object.Destroy((Object)(object)((Component)previewCam).gameObject); previewCam = null; } if ((Object)(object)planeRend != (Object)null && (Object)(object)((Renderer)planeRend).material != (Object)null) { Object.Destroy((Object)(object)((Renderer)planeRend).material); } _cachedRemoteTW = null; _cachedRemoteRenderers = null; } } public class PortalProximityTrigger : MonoBehaviour { public float triggerRadius = 15f; private TeleportWorld portal; private ZDOID _trackedRemoteID = ZDOID.None; private bool _isPlayerInside; private Vector3 _destinationPos = Vector3.zero; private int _currentZoneRadius; private int _stayFrameCounter; private int _rampFrames; private const int RAMP_INTERVAL = 20; private void Awake() { portal = ((Component)this).GetComponentInParent<TeleportWorld>(); if ((Object)(object)portal == (Object)null) { Debug.LogError((object)"PortalProximityTrigger: No TeleportWorld found in parent."); return; } SphereCollider val = ((Component)this).GetComponent<SphereCollider>(); if ((Object)(object)val == (Object)null) { val = ((Component)this).gameObject.AddComponent<SphereCollider>(); } ((Collider)val).isTrigger = true; val.radius = triggerRadius; ((Component)this).gameObject.layer = LayerMask.NameToLayer("character_trigger"); } private void OnTriggerEnter(Collider other) { //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: 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_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: 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) if (_isPlayerInside || !IsLocalPlayer(other)) { return; } Player localPlayer = Player.m_localPlayer; if ((Object)(object)portal == (Object)null || (Object)(object)portal.m_nview == (Object)null) { return; } ZDO zDO = portal.m_nview.GetZDO(); if (zDO == null) { return; } ZDOID connectionZDOID = zDO.GetConnectionZDOID((ConnectionType)1); if (!(connectionZDOID == ZDOID.None) && ZDOMan.instance != null) { ZDO zDO2 = ZDOMan.instance.GetZDO(connectionZDOID); if (zDO2 != null) { Vector3 val = (_destinationPos = zDO2.GetPosition()); int zoneRadiusForDistance = PortalPreloadPlugin.GetZoneRadiusForDistance(Vector3.Distance(((Component)localPlayer).transform.position, ((Component)portal).transform.position)); _rampFrames = 0; _currentZoneRadius = Mathf.Min(zoneRadiusForDistance, 1); PortalPreloadPlugin.AddDestination(val, _currentZoneRadius); _trackedRemoteID = connectionZDOID; _isPlayerInside = true; PortalPreloadPlugin.SetPlayerNearby(zDO2, connectionZDOID, localPlayer); PortalPreloadPlugin.PortalPreloadLogger.LogInfo((object)$"Player near portal – loading destination at {val} (ramping up)"); } } } private void OnTriggerStay(Collider other) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0063: 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) if (!_isPlayerInside || _destinationPos == Vector3.zero) { return; } _rampFrames++; if (++_stayFrameCounter % 10 == 0 && IsLocalPlayer(other)) { int zoneRadiusForDistance = PortalPreloadPlugin.GetZoneRadiusForDistance(Vector3.Distance(((Component)Player.m_localPlayer).transform.position, ((Component)portal).transform.position)); int num = 1 + _rampFrames / 20; int num2 = Mathf.Min(zoneRadiusForDistance, num); if (num2 != _currentZoneRadius) { _currentZoneRadius = num2; PortalPreloadPlugin.UpdateDestinationRadius(_destinationPos, _currentZoneRadius); } } } private void OnTriggerExit(Collider other) { if (_isPlayerInside && IsLocalPlayer(other)) { CleanupDestination(Player.m_localPlayer); PortalPreloadPlugin.PortalPreloadLogger.LogInfo((object)"Player left portal area – destination will unload naturally"); } } private void OnDisable() { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0050: 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) if (_isPlayerInside) { if (PortalPreloadPlugin.IsPlayerTeleporting) { PortalPreloadPlugin.DeferredCleanups.Add(new PortalPreloadPlugin.DeferredDestinationCleanup { DestinationPos = _destinationPos, TrackedRemoteID = _trackedRemoteID }); _isPlayerInside = false; _destinationPos = Vector3.zero; _trackedRemoteID = ZDOID.None; _currentZoneRadius = 0; _rampFrames = 0; } else { CleanupDestination(Player.m_localPlayer); } } } private void CleanupDestination(Player player) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: 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_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0045: 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) if (_destinationPos != Vector3.zero) { PortalPreloadPlugin.RemoveDestination(_destinationPos); } if (_trackedRemoteID != ZDOID.None && (Object)(object)player != (Object)null && ZDOMan.instance != null) { ZDO zDO = ZDOMan.instance.GetZDO(_trackedRemoteID); if (zDO != null) { PortalPreloadPlugin.SetPlayerNearby(zDO, _trackedRemoteID, player, entering: false); } } _isPlayerInside = false; _destinationPos = Vector3.zero; _trackedRemoteID = ZDOID.None; _currentZoneRadius = 0; _rampFrames = 0; } private static bool IsLocalPlayer(Collider other) { Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer == (Object)null) { return false; } if ((Object)(object)other.attachedRigidbody != (Object)null) { return (Object)(object)((Component)other.attachedRigidbody).gameObject == (Object)(object)((Component)localPlayer).gameObject; } return false; } } [PublicAPI] public static class MaterialReplacer { public enum ShaderType { Distortion, PieceShader, VegetationShader, RockShader, RugShader, GrassShader, CustomCreature, UseUnityShader } private static readonly Dictionary<GameObject, bool> ObjectToSwap; private static readonly Dictionary<string, Material> OriginalMaterials; private static readonly Dictionary<GameObject, ShaderType> ObjectsForShaderReplace; private static readonly HashSet<Shader> CachedShaders; private static bool hasRun; static MaterialReplacer() { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Expected O, but got Unknown CachedShaders = new HashSet<Shader>(); hasRun = false; OriginalMaterials = new Dictionary<string, Material>(); ObjectToSwap = new Dictionary<GameObject, bool>(); ObjectsForShaderReplace = new Dictionary<GameObject, ShaderType>(); new Harmony("org.bepinex.helpers.PieceManager").Patch((MethodBase)AccessTools.DeclaredMethod(typeof(ZoneSystem), "Start", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(MaterialReplacer), "ReplaceAllMaterialsWithOriginal", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } public static void RegisterGameObjectForShaderSwap(GameObject go, ShaderType type) { if (!ObjectsForShaderReplace.ContainsKey(go)) { ObjectsForShaderReplace.Add(go, type); } } public static void RegisterGameObjectForMatSwap(GameObject go, bool isJotunnMock = false) { if (!ObjectToSwap.ContainsKey(go)) { ObjectToSwap.Add(go, isJotunnMock); } } internal static void GetAllMaterials() { Material[] array = Resources.FindObjectsOfTypeAll<Material>(); foreach (Material val in array) { OriginalMaterials[((Object)val).name] = val; } } [HarmonyPriority(700)] private static void ReplaceAllMaterialsWithOriginal() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Invalid comparison between Unknown and I4 if ((int)SystemInfo.graphicsDeviceType == 4 || hasRun) { return; } if (OriginalMaterials.Count == 0) { GetAllMaterials(); } foreach (KeyValuePair<GameObject, bool> item in ObjectToSwap) { GameObject key = item.Key; bool value = item.Value; ProcessGameObjectMaterials(key, value); } AssetBundle[] array = Resources.FindObjectsOfTypeAll<AssetBundle>(); foreach (AssetBundle val in array) { IEnumerable<Shader> enumerable3; try { IEnumerable<Shader> enumerable2; if (!val.isStreamedSceneAssetBundle || !Object.op_Implicit((Object)(object)val)) { IEnumerable<Shader> enumerable = val.LoadAllAssets<Shader>(); enumerable2 = enumerable; } else { enumerable2 = from shader in ((IEnumerable<string>)val.GetAllAssetNames()).Select((Func<string, Shader>)val.LoadAsset<Shader>) where (Object)(object)shader != (Object)null select shader; } enumerable3 = enumerable2; } catch (Exception) { continue; } if (enumerable3 == null) { continue; } foreach (Shader item2 in enumerable3) { CachedShaders.Add(item2); } } foreach (KeyValuePair<GameObject, ShaderType> item3 in ObjectsForShaderReplace) { GameObject key2 = item3.Key; ShaderType value2 = item3.Value; ProcessGameObjectShaders(key2, value2); } hasRun = true; } internal static void ProcessGameObjectMaterials(GameObject go, bool isJotunnMock) { Renderer[] componentsInChildren = go.GetComponentsInChildren<Renderer>(true); foreach (Renderer obj in componentsInChildren) { Material[] sharedMaterials = obj.sharedMaterials.Select((Material material) => ReplaceMaterial(material, isJotunnMock)).ToArray(); obj.sharedMaterials = sharedMaterials; } } private static Material ReplaceMaterial(Material originalMaterial, bool isJotunnMock) { string text = (isJotunnMock ? "JVLmock_" : "_REPLACE_"); if (!((Object)originalMaterial).name.StartsWith(text, StringComparison.Ordinal)) { return originalMaterial; } string text2 = ((Object)originalMaterial).name.Replace(" (Instance)", "").Replace(text, ""); if (OriginalMaterials.TryGetValue(text2, out Material value)) { return value; } Debug.LogWarning((object)("No suitable material found to replace: " + text2)); return originalMaterial; } public static void ProcessGameObjectShaders(GameObject go, ShaderType shaderType) { Renderer[] componentsInChildren = go.GetComponentsInChildren<Renderer>(true); for (int i = 0; i < componentsInChildren.Length; i++) { Material[] sharedMaterials = componentsInChildren[i].sharedMaterials; foreach (Material val in sharedMaterials) { if ((Object)(object)val != (Object)null) { val.shader = GetShaderForType(val.shader, shaderType, ((Object)val.shader).name); } } } } private static Shader GetShaderForType(Shader orig, ShaderType shaderType, string originalShaderName) { return (Shader)(shaderType switch { ShaderType.Distortion => FindShaderWithName(orig, "Custom/Distortion"), ShaderType.PieceShader => FindShaderWithName(orig, "Custom/Piece"), ShaderType.VegetationShader => FindShaderWithName(orig, "Custom/Vegetation"), ShaderType.RockShader => FindShaderWithName(orig, "Custom/StaticRock"), ShaderType.RugShader => FindShaderWithName(orig, "Custom/Rug"), ShaderType.GrassShader => FindShaderWithName(orig, "Custom/Grass"), ShaderType.CustomCreature => FindShaderWithName(orig, "Custom/Creature"), ShaderType.UseUnityShader => FindShaderWithName(orig, ((Object)(object)FindShaderWithName(orig, originalShaderName) != (Object)null) ? originalShaderName : "ToonDeferredShading2017"), _ => FindShaderWithName(orig, "Standard"), }); } public static Shader FindShaderWithName(Shader origShader, string name) { foreach (Shader cachedShader in CachedShaders) { if (((Object)cachedShader).name == name) { return cachedShader; } } return origShader; } } [HarmonyPatch] public class ForceActivePatches { private static readonly HashSet<Vector2i> _cachedSectorSet = new HashSet<Vector2i>(); private static readonly List<ZDO> _zdosToCreate = new List<ZDO>(); private static int _frameCounter = 0; [HarmonyPatch(typeof(ZNetScene), "InActiveArea", new Type[] { typeof(Vector2i), typeof(Vector2i) })] [HarmonyPostfix] private static void InActiveArea(ZNetScene __instance, Vector2i zone, Vector2i refCenterZone, ref bool __result) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) if (__result) { return; } PortalPreloadPlugin.DestinationEntry[] cachedDestinations = PortalPreloadPlugin.CachedDestinations; if (cachedDestinations.Length == 0) { return; } for (int i = 0; i < cachedDestinations.Length; i++) { ref PortalPreloadPlugin.DestinationEntry reference = ref cachedDestinations[i]; int zoneRadius = reference.ZoneRadius; if (zone.x >= reference.Zone.x - zoneRadius && zone.x <= reference.Zone.x + zoneRadius && zone.y >= reference.Zone.y - zoneRadius && zone.y <= reference.Zone.y + zoneRadius) { __result = true; break; } } } [HarmonyPatch(typeof(ZNetScene), "OutsideActiveArea", new Type[] { typeof(Vector3), typeof(Vector3) })] [HarmonyPostfix] private static void OutsideActiveArea(Vector3 point, ref bool __result) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) if (!__result) { return; } PortalPreloadPlugin.DestinationEntry[] cachedDestinations = PortalPreloadPlugin.CachedDestinations; if (cachedDestinations.Length == 0) { return; } for (int i = 0; i < cachedDestinations.Length; i++) { ref PortalPreloadPlugin.DestinationEntry reference = ref cachedDestinations[i]; float num = (float)reference.ZoneRadius * 64f + 32f; if (Vector3.Distance(point, reference.Position) <= num) { __result = false; break; } } } [HarmonyPatch(typeof(ZDOMan), "FindSectorObjects")] [HarmonyPostfix] private static void FindSectorObjects(ZDOMan __instance, Vector2i sector, int area, List<ZDO> sectorObjects) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0052: 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_0074: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: 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_0131: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) PortalPreloadPlugin.DestinationEntry[] cachedDestinations = PortalPreloadPlugin.CachedDestinations; if (cachedDestinations.Length == 0) { return; } _cachedSectorSet.Clear(); _cachedSectorSet.Add(sector); for (int i = 1; i <= area; i++) { for (int j = sector.x - i; j <= sector.x + i; j++) { _cachedSectorSet.Add(new Vector2i(j, sector.y - i)); _cachedSectorSet.Add(new Vector2i(j, sector.y + i)); } for (int k = sector.y - i + 1; k <= sector.y + i - 1; k++) { _cachedSectorSet.Add(new Vector2i(sector.x - i, k)); _cachedSectorSet.Add(new Vector2i(sector.x + i, k)); } } Vector2i val = default(Vector2i); for (int l = 0; l < cachedDestinations.Length; l++) { ref PortalPreloadPlugin.DestinationEntry reference = ref cachedDestinations[l]; for (int m = -reference.ZoneRadius; m <= reference.ZoneRadius; m++) { for (int n = -reference.ZoneRadius; n <= reference.ZoneRadius; n++) { ((Vector2i)(ref val))..ctor(reference.Zone.x + n, reference.Zone.y + m); if (!_cachedSectorSet.Contains(val)) { _cachedSectorSet.Add(val); __instance.FindObjects(val, sectorObjects); } } } } } [HarmonyPatch(typeof(ZDOMan), "FindDistantObjects")] [HarmonyPrefix] private static bool FindDistantObjects(Vector2i sector) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) PortalPreloadPlugin.DestinationEntry[] cachedDestinations = PortalPreloadPlugin.CachedDestinations; if (cachedDestinations.Length == 0) { return true; } for (int i = 0; i < cachedDestinations.Length; i++) { ref PortalPreloadPlugin.DestinationEntry reference = ref cachedDestinations[i]; int zoneRadius = reference.ZoneRadius; if (sector.x >= reference.Zone.x - zoneRadius && sector.x <= reference.Zone.x + zoneRadius && sector.y >= reference.Zone.y - zoneRadius && sector.y <= reference.Zone.y + zoneRadius) { return false; } } return true; } [HarmonyPatch(typeof(ZoneSystem), "CreateLocalZones")] [HarmonyPostfix] private static void CreateLocalZones(ZoneSystem __instance, ref bool __result) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0069: 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) PortalPreloadPlugin.DestinationEntry[] cachedDestinations = PortalPreloadPlugin.CachedDestinations; if (cachedDestinations.Length == 0 || __result) { return; } Vector2i val = default(Vector2i); for (int i = 0; i < cachedDestinations.Length; i++) { ref PortalPreloadPlugin.DestinationEntry reference = ref cachedDestinations[i]; if (__instance.PokeLocalZone(reference.Zone)) { __result = true; break; } for (int j = reference.Zone.y - reference.ZoneRadius; j <= reference.Zone.y + reference.ZoneRadius; j++) { for (int k = reference.Zone.x - reference.ZoneRadius; k <= reference.Zone.x + reference.ZoneRadius; k++) { ((Vector2i)(ref val))..ctor(k, j); if (!(val == reference.Zone) && __instance.PokeLocalZone(val)) { __result = true; return; } } } } } [HarmonyPatch(typeof(ZoneSystem), "IsActiveAreaLoaded")] [HarmonyPostfix] private static void IsActiveAreaLoaded(ZoneSystem __instance, ref bool __result) { //IL_0052: Unknown result type (might be due to invalid IL or missing references) PortalPreloadPlugin.DestinationEntry[] cachedDestinations = PortalPreloadPlugin.CachedDestinations; if (cachedDestinations.Length == 0 || !__result) { return; } for (int i = 0; i < cachedDestinations.Length; i++) { ref PortalPreloadPlugin.DestinationEntry reference = ref cachedDestinations[i]; for (int j = -reference.ZoneRadius; j <= reference.ZoneRadius; j++) { for (int k = -reference.ZoneRadius; k <= reference.ZoneRadius; k++) { if (!__instance.m_zones.ContainsKey(new Vector2i(reference.Zone.x + k, reference.Zone.y + j))) { __result = false; return; } } } } } [HarmonyPatch(typeof(ZNetScene), "IsAreaReady")] [HarmonyPostfix] private static void IsAreaReady(Vector3 point, ref bool __result) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) if (__result) { return; } PortalPreloadPlugin.DestinationEntry[] cachedDestinations = PortalPreloadPlugin.CachedDestinations; if (cachedDestinations.Length == 0) { return; } for (int i = 0; i < cachedDestinations.Length; i++) { ref PortalPreloadPlugin.DestinationEntry reference = ref cachedDestinations[i]; float num = (float)reference.ZoneRadius * 64f; if (Vector3.Distance(point, reference.Position) <= num && (Object)(object)ZoneSystem.instance != (Object)null && ZoneSystem.instance.IsZoneLoaded(point)) { __result = true; break; } } } [HarmonyPatch(typeof(ZNetScene), "CreateDestroyObjects")] [HarmonyPostfix] private static void CreateDestroyObjects_ForceCreateNearDestinations(ZNetScene __instance) { //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Invalid comparison between Unknown and I4 //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_00db: 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_00e7: 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) PortalPreloadPlugin.DestinationEntry[] cachedDestinations = PortalPreloadPlugin.CachedDestinations; if (cachedDestinations.Length == 0 || ZDOMan.instance == null) { return; } _frameCounter++; if (_frameCounter % 5 != 0) { return; } float num = 1600f; int num2 = 0; Vector2i val = default(Vector2i); for (int i = 0; i < cachedDestinations.Length; i++) { ref PortalPreloadPlugin.DestinationEntry reference = ref cachedDestinations[i]; for (int j = -reference.ZoneRadius; j <= reference.ZoneRadius; j++) { if (num2 >= 15) { break; } for (int k = -reference.ZoneRadius; k <= reference.ZoneRadius; k++) { if (num2 >= 15) { break; } ((Vector2i)(ref val))..ctor(reference.Zone.x + k, reference.Zone.y + j); _zdosToCreate.Clear(); ZDOMan.instance.FindObjects(val, _zdosToCreate); for (int l = 0; l < _zdosToCreate.Count; l++) { if (num2 >= 15) { break; } ZDO val2 = _zdosToCreate[l]; if (__instance.m_instances.ContainsKey(val2) || !val2.IsValid() || (int)val2.Type > 2) { continue; } Vector3 val3 = val2.GetPosition() - reference.Position; if (!(((Vector3)(ref val3)).sqrMagnitude > num)) { try { __instance.CreateObject(val2); num2++; } catch { } } } } } } } } public static class ZoneSystemExtension { [SpecialName] public sealed class <G>$C4EAF3E49419DCB8F1AA1FAC028204B4 { [SpecialName] public static class <M>$FF334B291A5568FFD90BBDD3AE876A53 { } [ExtensionMarker("<M>$FF334B291A5568FFD90BBDD3AE876A53")] public void SetGlobalKey(string key, object value) { throw null; } [ExtensionMarker("<M>$FF334B291A5568FFD90BBDD3AE876A53")] public string GetGlobalKeyValue(string key) { throw null; } [ExtensionMarker("<M>$FF334B291A5568FFD90BBDD3AE876A53")] public string GetOrAddGlobalKey(string key, string defaultValue) { throw null; } [ExtensionMarker("<M>$FF334B291A5568FFD90BBDD3AE876A53")] public (Vector2i, LocationInstance)[] GetGeneratedLocationsByName(string key) { throw null; } [ExtensionMarker("<M>$FF334B291A5568FFD90BBDD3AE876A53")] public Task<List<ZDO>> GetWorldObjectsAsync(params Func<ZDO, bool>[] customFilters) { throw null; } [ExtensionMarker("<M>$FF334B291A5568FFD90BBDD3AE876A53")] public Task<List<ZDO>> GetWorldObjectsAsync(string prefabName, params Func<ZDO, bool>[] customFilters) { throw null; } } internal static List<Vector3> tempPoints = new List<Vector3>(); internal static bool creatingValidPlacesForLocation; internal static string creatingPlacesFor = ""; public static void SetGlobalKey(this ZoneSystem zoneSystem, string key, object value) { zoneSystem.SetGlobalKey($"{key} {value}"); } public static string GetGlobalKeyValue(this ZoneSystem zoneSystem, string key) { string result = default(string); zoneSystem.GetGlobalKey(key, ref result); return result; } public static string GetOrAddGlobalKey(this ZoneSystem zoneSystem, string key, string defaultValue) { string result = default(string); if (zoneSystem.GetGlobalKey(key, ref result)) { return result; } zoneSystem.SetGlobalKey(key, defaultValue); return defaultValue; } public static (Vector2i, LocationInstance)[] GetGeneratedLocationsByName(this ZoneSystem zoneSystem, string key) { string key2 = key; return (from x in ZoneSystem.instance.m_locationInstances where x.Value.m_location.m_prefabName == key2 select (x.Key, x.Value)).ToArray(); } public static Task<List<ZDO>> GetWorldObjectsAsync(this ZoneSystem zoneSystem, params Func<ZDO, bool>[] customFilters) { Func<ZDO, bool>[] customFilters2 = customFilters; List<ZDO> zdos = new List<ZDO>(ZDOMan.instance.m_objectsByID.Values); return Task.Run(delegate { if (customFilters2 != null && customFilters2.Length != 0) { zdos = zdos.Where(delegate(ZDO x) { ZDO x2 = x; return customFilters2.All((Func<ZDO, bool> filter) => filter?.Invoke(x2) ?? true); }).ToList(); } return zdos; }); } public static async Task<List<ZDO>> GetWorldObjectsAsync(this ZoneSystem zoneSystem, string prefabName, params Func<ZDO, bool>[] customFilters) { int prefabHash = StringExtensionMethods.GetStableHashCode(prefabName); Func<ZDO, bool> func = (ZDO zdo) => zdo.GetPrefab() == prefabHash; return await zoneSystem.GetWorldObjectsAsync(customFilters.Concat<Func<ZDO, bool>>(new Func<ZDO, bool>[1] { func }).ToArray()); } } } namespace ServerSync { [PublicAPI] internal abstract class OwnConfigEntryBase { public object? LocalBaseValue; public bool SynchronizedConfig = true; public abstract ConfigEntryBase BaseConfig { get; } } [PublicAPI] internal class SyncedConfigEntry<T> : OwnConfigEntryBase { public readonly ConfigEntry<T> SourceConfig; public override ConfigEntryBase BaseConfig => (ConfigEntryBase)(object)SourceConfig; public T Value { get { return SourceConfig.Value; } set { SourceConfig.Value = value; } } public SyncedConfigEntry(ConfigEntry<T> sourceConfig) { SourceConfig = sourceConfig; base..ctor(); } public void AssignLocalValue(T value) { if (LocalBaseValue == null) { Value = value; } else { LocalBaseValue = value; } } } internal abstract class CustomSyncedValueBase { public object? LocalBaseValue; public readonly string Identifier; public readonly Type Type; private object? boxedValue; protected bool localIsOwner; public readonly int Priority; public object? BoxedValue { get { return boxedValue; } set { boxedValue = value; this.ValueChanged?.Invoke(); } } public event Action? ValueChanged; protected CustomSyncedValueBase(ConfigSync configSync, string identifier, Type type, int priority) { Priority = priority; Identifier = identifier; Type = type; configSync.AddCustomValue(this); localIsOwner = configSync.IsSourceOfTruth; configSync.SourceOfTruthChanged += delegate(bool truth) { localIsOwner = truth; }; } } [PublicAPI] internal sealed class CustomSyncedValue<T> : CustomSyncedValueBase { public T Value { get { return (T)base.BoxedValue; } set { base.BoxedValue = value; } } public CustomSyncedValue(ConfigSync configSync, string identifier, T value = default(T), int priority = 0) : base(configSync, identifier, typeof(T), priority) { Value = value; } public void AssignLocalValue(T value) { if (localIsOwner) { Value = value; } else { LocalBaseValue = value; } } } internal class ConfigurationManagerAttributes { [UsedImplicitly] public bool? ReadOnly = false; } [PublicAPI] internal class ConfigSync { [HarmonyPatch(typeof(ZRpc), "HandlePackage")] private static class SnatchCurrentlyHandlingRPC { public static ZRpc? currentRpc; [HarmonyPrefix] private static void Prefix(ZRpc __instance) { currentRpc = __instance; } } [HarmonyPatch(typeof(ZNet), "Awake")] internal static class RegisterRPCPatch { [HarmonyPostfix] private static void Postfix(ZNet __instance) { isServer = __instance.IsServer(); foreach (ConfigSync configSync2 in configSyncs) { ZRoutedRpc.instance.Register<ZPackage>(configSync2.Name + " ConfigSync", (Action<long, ZPackage>)configSync2.RPC_FromOtherClientConfigSync); if (isServer) { configSync2.InitialSyncDone = true; Debug.Log((object)("Registered '" + configSync2.Name + " ConfigSync' RPC - waiting for incoming connections")); } } if (isServer) { ((MonoBehaviour)__instance).StartCoroutine(WatchAdminListChanges()); } static void SendAdmin(List<ZNetPeer> peers, bool isAdmin) { ZPackage package = ConfigsToPackage(null, null, new PackageEntry[1] { new PackageEntry { section = "Internal", key = "lockexempt", type = typeof(bool), value = isAdmin } }); ConfigSync configSync = configSyncs.First(); if (configSync != null) { ((MonoBehaviour)ZNet.instance).StartCoroutine(configSync.sendZPackage(peers, package)); } } static IEnumerator WatchAdminListChanges() { MethodInfo listContainsId = AccessTools.DeclaredMethod(typeof(ZNet), "ListContainsId", (Type[])null, (Type[])null); SyncedList adminList = (SyncedList)AccessTools.DeclaredField(typeof(ZNet), "m_adminList").GetValue(ZNet.instance); List<string> CurrentList = new List<string>(adminList.GetList()); while (true) { yield return (object)new WaitForSeconds(30f); if (!adminList.GetList().SequenceEqual(CurrentList)) { CurrentList = new List<string>(adminList.GetList()); List<ZNetPeer> adminPeer = ZNet.instance.GetPeers().Where(delegate(ZNetPeer p) { string hostName = p.m_rpc.GetSocket().GetHostName(); return ((object)listContainsId == null) ? adminList.Contains(hostName) : ((bool)listContainsId.Invoke(ZNet.instance, new object[2] { adminList, hostName })); }).ToList(); List<ZNetPeer> nonAdminPeer = ZNet.instance.GetPeers().Except(adminPeer).ToList(); SendAdmin(nonAdminPeer, isAdmin: false); SendAdmin(adminPeer, isAdmin: true); } } } } } [HarmonyPatch(typeof(ZNet), "OnNewConnection")] private static class RegisterClientRPCPatch { [HarmonyPostfix] private static void Postfix(ZNet __instance, ZNetPeer peer) { if (__instance.IsServer()) { return; } foreach (ConfigSync configSync in configSyncs) { peer.m_rpc.Register<ZPackage>(configSync.Name + " ConfigSync", (Action<ZRpc, ZPackage>)configSync.RPC_FromServerConfigSync); } } } private class ParsedConfigs { public readonly Dictionary<OwnConfigEntryBase, object?> configValues = new Dictionary<OwnConfigEntryBase, object>(); public readonly Dictionary<CustomSyncedValueBase, object?> customValues = new Dictionary<CustomSyncedValueBase, object>(); } [HarmonyPatch(typeof(ZNet), "Shutdown")] private class ResetConfigsOnShutdown { [HarmonyPostfix] private static void Postfix() { ProcessingServerUpdate = true; foreach (ConfigSync configSync in configSyncs) { configSync.resetConfigsFromServer(); configSync.IsSourceOfTruth = true; configSync.InitialSyncDone = false; } ProcessingServerUpdate = false; } } [HarmonyPatch(typeof(ZNet), "RPC_PeerInfo")] private class SendConfigsAfterLogin { private class BufferingSocket : ZPlayFabSocket, ISocket { public volatile bool finished = false; public volatile int versionMatchQueued = -1; public readonly List<ZPackage> Package = new List<ZPackage>(); public readonly ISocket Original; public BufferingSocket(ISocket original) { Original = original; ((ZPlayFabSocket)this)..ctor(); } public bool IsConnected() { return Original.IsConnected(); } public ZPackage Recv() { return Original.Recv(); } public int GetSendQueueSize() { return Original.GetSendQueueSize(); } public int GetCurrentSendRate() { return Original.GetCurrentSendRate(); } public bool IsHost() { return Original.IsHost(); } public void Dispose() { Original.Dispose(); } public bool GotNewData() { return Original.GotNewData(); } public void Close() { Original.Close(); } public string GetEndPointString() { return Original.GetEndPointString(); } public void GetAndResetStats(out int totalSent, out int totalRecv) { Original.GetAndResetStats(ref totalSent, ref totalRecv); } public void GetConnectionQuality(out float localQuality, out float remoteQuality, out int ping, out float outByteSec, out float inByteSec) { Original.GetConnectionQuality(ref localQuality, ref remoteQuality, ref ping, ref outByteSec, ref inByteSec); } public ISocket Accept() { return Original.Accept(); } public int GetHostPort() { return Original.GetHostPort(); } public bool Flush() { return Original.Flush(); } public string GetHostName() { return Original.GetHostName(); } public void VersionMatch() { if (finished) { Original.VersionMatch(); } else { versionMatchQueued = Package.Count; } } public void Send(ZPackage pkg) { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Expected O, but got Unknown int pos = pkg.GetPos(); pkg.SetPos(0); int num = pkg.ReadInt(); if ((num == StringExtensionMethods.GetStableHashCode("PeerInfo") || num == StringExtensionMethods.GetStableHashCode("RoutedRPC") || num == StringExtensionMethods.GetStableHashCode("ZDOData")) && !finished) { ZPackage val = new ZPackage(pkg.GetArray()); val.SetPos(pos); Package.Add(val); } else { pkg.SetPos(pos); Original.Send(pkg); } } } [HarmonyPriority(800)] [HarmonyPrefix] private static void Prefix(ref Dictionary<Assembly, BufferingSocket>? __state, ZNet __instance, ZRpc rpc) {