Please disclose if any significant portion of your mod was created 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 Too Many Balls v1.0.0
LotsOfBalls.dll
Decompiled 8 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: IgnoresAccessChecksTo("")] [assembly: AssemblyCompany("Omniscye")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("LotsOfBalls")] [assembly: AssemblyTitle("LotsOfBalls")] [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; } } } namespace LotsOfBalls { [BepInPlugin("Omniscye.LotsOfBalls", "LotsOfBalls", "1.0")] public class LotsOfBalls : BaseUnityPlugin { internal static LotsOfBalls Instance { get; private set; } internal static ManualLogSource Logger => Instance._logger; private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger; internal Harmony? Harmony { get; set; } private void Awake() { Instance = this; ((Component)this).gameObject.transform.parent = null; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; Patch(); Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!"); } internal void Patch() { //IL_001a: 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_0021: Expected O, but got Unknown //IL_0026: Expected O, but got Unknown if (Harmony == null) { Harmony val = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID); Harmony val2 = val; Harmony = val; } Harmony.PatchAll(); } internal void Unpatch() { Harmony? harmony = Harmony; if (harmony != null) { harmony.UnpatchSelf(); } } private void Update() { } } } namespace EmpressMods.SphereFlood { [BepInPlugin("com.omniscye.levelpointspheres", "Level Point Sphere Flood", "2.1.0")] public class LevelPointSphereFlood : BaseUnityPlugin { private Harmony _harmony; public static LevelPointSphereFlood I; public static ConfigEntry<int> CFG_SphereCount; public static ConfigEntry<float> CFG_SphereScale; public static ConfigEntry<bool> CFG_GridMode; public static ConfigEntry<float> CFG_GridGapMeters; public static ConfigEntry<bool> CFG_SnapToGround; public static ConfigEntry<int> CFG_SnapEveryNth; public static ConfigEntry<float> CFG_RB_Mass; public static ConfigEntry<float> CFG_RB_Drag; public static ConfigEntry<float> CFG_RB_AngularDrag; public static ConfigEntry<float> CFG_RB_SleepThreshold; public static ConfigEntry<float> CFG_CellSize; public static ConfigEntry<int> CFG_ActiveCellRadius; public static ConfigEntry<float> CFG_CullRefreshInterval; public static ConfigEntry<int> CFG_ToggleBudgetPerFrame; public static ConfigEntry<bool> CFG_HideRendererWhenCulled; public static ConfigEntry<int> CFG_MaxActiveCount; public static ConfigEntry<int> CFG_SpheresPerPoint; public static ConfigEntry<float> CFG_PerPointJitterRadius; public static ConfigEntry<bool> CFG_PerPointSpiral; public static ConfigEntry<bool> CFG_AddImpactDetector; public static ConfigEntry<bool> CFG_AddDetectorOnlyIfCompatible; internal static int GenSerialCounter = 0; internal static int LastSpawnedGenSerial = -1; internal static Level LastSpawnedLevelRef = null; internal static bool SpawnedThisLevel = false; private void Awake() { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Expected O, but got Unknown //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Expected O, but got Unknown //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Expected O, but got Unknown //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Expected O, but got Unknown //IL_019a: Unknown result type (might be due to invalid IL or missing references) //IL_01a4: Expected O, but got Unknown //IL_01d7: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Expected O, but got Unknown //IL_0214: Unknown result type (might be due to invalid IL or missing references) //IL_021e: Expected O, but got Unknown //IL_0251: Unknown result type (might be due to invalid IL or missing references) //IL_025b: Expected O, but got Unknown //IL_0283: Unknown result type (might be due to invalid IL or missing references) //IL_028d: Expected O, but got Unknown //IL_02c0: Unknown result type (might be due to invalid IL or missing references) //IL_02ca: Expected O, but got Unknown //IL_02fa: Unknown result type (might be due to invalid IL or missing references) //IL_0304: Expected O, but got Unknown //IL_0354: Unknown result type (might be due to invalid IL or missing references) //IL_035e: Expected O, but got Unknown //IL_038a: Unknown result type (might be due to invalid IL or missing references) //IL_0394: Expected O, but got Unknown //IL_03c7: Unknown result type (might be due to invalid IL or missing references) //IL_03d1: Expected O, but got Unknown //IL_0475: Unknown result type (might be due to invalid IL or missing references) //IL_047f: Expected O, but got Unknown I = this; CFG_SphereCount = ((BaseUnityPlugin)this).Config.Bind<int>("SphereFlood", "SphereCount", 10000, new ConfigDescription("Total spheres to spawn (grid mode).", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 20000), Array.Empty<object>())); CFG_SphereScale = ((BaseUnityPlugin)this).Config.Bind<float>("SphereFlood", "SphereScale", 0.3f, new ConfigDescription("Uniform local scale.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.05f, 2f), Array.Empty<object>())); CFG_GridMode = ((BaseUnityPlugin)this).Config.Bind<bool>("SphereFlood", "GridMode", false, "When true, spawn a grid centered on one discovered anchor (nearest level point). When false, spawn at ALL discovered level points."); CFG_GridGapMeters = ((BaseUnityPlugin)this).Config.Bind<float>("SphereFlood", "GridGapMeters", 0.02f, new ConfigDescription("Extra gap beyond diameter to avoid initial overlaps.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 0.25f), Array.Empty<object>())); CFG_SnapToGround = ((BaseUnityPlugin)this).Config.Bind<bool>("SphereFlood", "SnapToGround", false, "Raycast down to place on ground (expensive at high counts)."); CFG_SnapEveryNth = ((BaseUnityPlugin)this).Config.Bind<int>("SphereFlood", "SnapEveryNth", 0, new ConfigDescription("If >0, only snap every Nth sphere (amortize raycasts).", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 5000), Array.Empty<object>())); CFG_RB_Mass = ((BaseUnityPlugin)this).Config.Bind<float>("Rigidbody", "Mass", 0.05f, new ConfigDescription("Rigidbody mass.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.001f, 5f), Array.Empty<object>())); CFG_RB_Drag = ((BaseUnityPlugin)this).Config.Bind<float>("Rigidbody", "Drag", 0f, new ConfigDescription("Linear drag.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 2f), Array.Empty<object>())); CFG_RB_AngularDrag = ((BaseUnityPlugin)this).Config.Bind<float>("Rigidbody", "AngularDrag", 0.05f, new ConfigDescription("Angular drag.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 2f), Array.Empty<object>())); CFG_RB_SleepThreshold = ((BaseUnityPlugin)this).Config.Bind<float>("Rigidbody", "SleepThreshold", 0.1f, new ConfigDescription("Higher = sleeps more aggressively.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.0001f, 1f), Array.Empty<object>())); CFG_CellSize = ((BaseUnityPlugin)this).Config.Bind<float>("Culling", "CellSize", 20f, new ConfigDescription("Meters per culling cell (XZ).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(2f, 100f), Array.Empty<object>())); CFG_ActiveCellRadius = ((BaseUnityPlugin)this).Config.Bind<int>("Culling", "ActiveCellRadius", 1, new ConfigDescription("Cells active around player (square radius).", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 10), Array.Empty<object>())); CFG_CullRefreshInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Culling", "CullRefreshInterval", 0.25f, new ConfigDescription("Seconds between culling region updates.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.05f, 2f), Array.Empty<object>())); CFG_ToggleBudgetPerFrame = ((BaseUnityPlugin)this).Config.Bind<int>("Culling", "ToggleBudgetPerFrame", 600, new ConfigDescription("Max enable/disable ops per frame to avoid spikes.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(50, 5000), Array.Empty<object>())); CFG_HideRendererWhenCulled = ((BaseUnityPlugin)this).Config.Bind<bool>("Culling", "HideRendererWhenCulled", true, "Also disable MeshRenderer for culled spheres."); CFG_MaxActiveCount = ((BaseUnityPlugin)this).Config.Bind<int>("Culling", "MaxActiveCount", 800, new ConfigDescription("Hard cap on concurrently active (enabled) spheres; nearest to player win.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(100, 20000), Array.Empty<object>())); CFG_SpheresPerPoint = ((BaseUnityPlugin)this).Config.Bind<int>("PerPoint", "SpheresPerPoint", 100, new ConfigDescription("Number of spheres to spawn at each discovered level point.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 10000), Array.Empty<object>())); CFG_PerPointJitterRadius = ((BaseUnityPlugin)this).Config.Bind<float>("PerPoint", "PerPointJitterRadius", 1.5f, new ConfigDescription("Max horizontal jitter radius per point (meters).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 20f), Array.Empty<object>())); CFG_PerPointSpiral = ((BaseUnityPlugin)this).Config.Bind<bool>("PerPoint", "UseSpiralDistribution", true, "Use golden-angle spiral distribution per point."); CFG_AddImpactDetector = ((BaseUnityPlugin)this).Config.Bind<bool>("Compatibility", "AddImpactDetector", false, "Attach PhysGrabObjectImpactDetector (not recommended for thousands). Defaults OFF."); CFG_AddDetectorOnlyIfCompatible = ((BaseUnityPlugin)this).Config.Bind<bool>("Compatibility", "AddDetectorOnlyIfCompatible", true, "Only add detector if PhysGrabObject already exists."); CFG_SpheresPerPoint.Value = 100; CFG_MaxActiveCount.Value = 800; CFG_ActiveCellRadius.Value = 1; CFG_CellSize.Value = 20f; _harmony = new Harmony("com.omniscye.levelpointspheres"); _harmony.PatchAll(); SphereSpawnWatchdog.Ensure(); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"[SphereFlood] v2.1.0 loaded. Grid={CFG_GridMode.Value}, Count={CFG_SphereCount.Value}, Scale={CFG_SphereScale.Value}"); } private void OnDestroy() { try { Harmony harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } } catch { } SphereManager.ClearAll(); GridCuller.Reset(); } internal static void Log(string msg) { if ((Object)(object)I != (Object)null) { ((BaseUnityPlugin)I).Logger.LogInfo((object)msg); } else { Debug.Log((object)msg); } } internal static void LogWarn(string msg) { if ((Object)(object)I != (Object)null) { ((BaseUnityPlugin)I).Logger.LogWarning((object)msg); } else { Debug.LogWarning((object)msg); } } } [HarmonyPatch(typeof(LevelGenerator), "Generate")] public static class Patch_LevelGenerator_Generate { [CompilerGenerated] private sealed class <CoSpawnAfterGen>d__2 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public int genSerial; private LevelGenerator <lg>5__1; private float <timeout>5__2; private List<Transform> <points>5__3; private Vector3 <anchor>5__4; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <CoSpawnAfterGen>d__2(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <lg>5__1 = null; <points>5__3 = null; <>1__state = -2; } private bool MoveNext() { //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; goto IL_0059; case 1: <>1__state = -1; goto IL_0059; case 2: <>1__state = -1; goto IL_00c2; case 3: <>1__state = -1; break; case 4: { <>1__state = -1; break; } IL_0059: if (LooksLikeMenuOrSplash()) { <>2__current = null; <>1__state = 1; return true; } <lg>5__1 = null; <timeout>5__2 = Time.time + 30f; goto IL_00c2; IL_00c2: if (Time.time < <timeout>5__2) { <lg>5__1 = LevelGenerator.Instance; if (!((Object)(object)<lg>5__1 != (Object)null) || !<lg>5__1.Generated) { <>2__current = null; <>1__state = 2; return true; } } if ((Object)(object)<lg>5__1 == (Object)null || !<lg>5__1.Generated) { LevelPointSphereFlood.LogWarn("[SphereFlood] Timeout waiting for LevelGenerator.Generated"); return false; } if (LevelPointSphereFlood.LastSpawnedGenSerial == genSerial) { return false; } <points>5__3 = LevelPoints.FindLikelyLevelPoints_CurrentWorld(); <anchor>5__4 = AnchorChooser.ChooseAnchor(<points>5__3); LevelPointSphereFlood.Log($"[SphereFlood] Candidate points: {<points>5__3.Count}. Anchor at {<anchor>5__4}"); if (LevelPointSphereFlood.CFG_GridMode.Value) { <>2__current = SphereManager.CoSpawnGrid(<anchor>5__4); <>1__state = 3; return true; } <>2__current = SphereManager.CoSpawnOnePerPoint(<points>5__3); <>1__state = 4; return true; } GridCuller.Ensure(); LevelPointSphereFlood.LastSpawnedGenSerial = genSerial; LevelPointSphereFlood.LastSpawnedLevelRef = <lg>5__1.Level; LevelPointSphereFlood.SpawnedThisLevel = true; 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 Prefix(LevelGenerator __instance) { LevelPointSphereFlood.GenSerialCounter++; } public static void Postfix(LevelGenerator __instance) { int genSerialCounter = LevelPointSphereFlood.GenSerialCounter; if ((Object)(object)LevelPointSphereFlood.I != (Object)null) { ((MonoBehaviour)LevelPointSphereFlood.I).StartCoroutine(CoSpawnAfterGen(genSerialCounter)); } } [IteratorStateMachine(typeof(<CoSpawnAfterGen>d__2))] private static IEnumerator CoSpawnAfterGen(int genSerial) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <CoSpawnAfterGen>d__2(0) { genSerial = genSerial }; } private static bool LooksLikeMenuOrSplash() { //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) Scene activeScene = SceneManager.GetActiveScene(); string text = ((Scene)(ref activeScene)).name ?? string.Empty; if (text.IndexOf("Lobby", StringComparison.OrdinalIgnoreCase) >= 0) { return true; } if (text.IndexOf("Menu", StringComparison.OrdinalIgnoreCase) >= 0) { return true; } if (text.IndexOf("Title", StringComparison.OrdinalIgnoreCase) >= 0) { return true; } if (text.IndexOf("Splash", StringComparison.OrdinalIgnoreCase) >= 0) { return true; } return false; } } [HarmonyPatch(typeof(RunManager), "ChangeLevel")] public static class Patch_RunManager_ChangeLevel { private static void Postfix() { LevelPointSphereFlood.SpawnedThisLevel = false; LevelPointSphereFlood.LastSpawnedLevelRef = null; LevelPointSphereFlood.LastSpawnedGenSerial = -1; SphereManager.ClearAll(); GridCuller.Reset(); } } public class SphereSpawnWatchdog : MonoBehaviour { private static SphereSpawnWatchdog _i; private float _next; public static void Ensure() { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Expected O, but got Unknown if (!((Object)(object)_i != (Object)null)) { GameObject val = new GameObject("[SphereFlood] Watchdog"); Object.DontDestroyOnLoad((Object)(object)val); _i = val.AddComponent<SphereSpawnWatchdog>(); } } private void Update() { if (!(Time.time < _next)) { _next = Time.time + 1f; int genSerialCounter = LevelPointSphereFlood.GenSerialCounter; LevelGenerator instance = LevelGenerator.Instance; if (!((Object)(object)instance == (Object)null) && instance.Generated && LevelPointSphereFlood.LastSpawnedGenSerial != genSerialCounter) { Patch_LevelGenerator_Generate.Postfix(instance); } } } } public static class LevelPoints { private static readonly string[] NEEDLES = new string[15] { "levelpoint", "level spawn", "levelspawn", "enemyspawn", "spawnpoint", "spawn point", "aispawn", "respawnpoint", "respawn", "wavespawn", "spawner", "ghostspawn", "eventspawn", "huntspawn", "ghostpoint" }; private static bool LooksLikeSpawnType(string typeNameLower) { for (int i = 0; i < NEEDLES.Length; i++) { if (typeNameLower.Contains(NEEDLES[i])) { return true; } } return false; } private static bool LooksLikeSpawnName(string nameLower) { for (int i = 0; i < NEEDLES.Length; i++) { if (nameLower.Contains(NEEDLES[i])) { return true; } } return false; } public static List<Transform> FindLikelyLevelPoints_CurrentWorld() { List<Transform> list = new List<Transform>(256); MonoBehaviour[] array = Object.FindObjectsOfType<MonoBehaviour>(true); foreach (MonoBehaviour val in array) { if ((Object)(object)val == (Object)null) { continue; } GameObject gameObject = ((Component)val).gameObject; if (Object.op_Implicit((Object)(object)gameObject) && gameObject.activeInHierarchy && !((Object)gameObject).name.StartsWith("[SphereFlood]")) { string typeNameLower = ((object)val).GetType().Name.ToLowerInvariant(); if (LooksLikeSpawnType(typeNameLower)) { list.Add(((Component)val).transform); } } } Transform[] array2 = Object.FindObjectsOfType<Transform>(true); foreach (Transform val2 in array2) { if ((Object)(object)val2 == (Object)null) { continue; } GameObject gameObject2 = ((Component)val2).gameObject; if (Object.op_Implicit((Object)(object)gameObject2) && gameObject2.activeInHierarchy && !((Object)gameObject2).name.StartsWith("[SphereFlood]")) { string nameLower = ((Object)val2).name.ToLowerInvariant(); if (LooksLikeSpawnName(nameLower)) { list.Add(val2); } } } return list.Distinct().ToList(); } } public static class AnchorChooser { public static Vector3 ChooseAnchor(List<Transform> points) { //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: 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_0037: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0103: 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_0115: 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_0069: 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) //IL_0070: Unknown result type (might be due to invalid IL or missing references) PlayerAvatar val = FindLocalPlayer(); Transform val2 = null; if (points != null && points.Count > 0) { if ((Object)(object)val != (Object)null) { Vector3 position = ((Component)val).transform.position; float num = float.MaxValue; for (int i = 0; i < points.Count; i++) { Transform val3 = points[i]; if (Object.op_Implicit((Object)(object)val3)) { Vector3 val4 = val3.position - position; float sqrMagnitude = ((Vector3)(ref val4)).sqrMagnitude; if (sqrMagnitude < num) { num = sqrMagnitude; val2 = val3; } } } } if (!Object.op_Implicit((Object)(object)val2)) { val2 = points[0]; } } if (Object.op_Implicit((Object)(object)val2)) { return val2.position; } if ((Object)(object)val != (Object)null) { return ((Component)val).transform.position + ((Component)val).transform.forward * 2f; } return Vector3.zero; } private static PlayerAvatar FindLocalPlayer() { try { PlayerAvatar[] array = Object.FindObjectsOfType<PlayerAvatar>(true); foreach (PlayerAvatar val in array) { if ((Object)(object)val == (Object)null) { continue; } Type type = ((object)val).GetType(); try { FieldInfo field = type.GetField("isLocal", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null && field.FieldType == typeof(bool) && (bool)field.GetValue(val)) { return val; } } catch { } try { PropertyInfo property = type.GetProperty("IsLocal", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (property != null && property.PropertyType == typeof(bool) && (bool)property.GetValue(val)) { return val; } } catch { } } } catch { } return null; } } public static class SphereManager { public struct SphereRec { public GameObject go; public Rigidbody rb; public Collider col; public MeshRenderer mr; public Vector2Int cell; public bool active; } [CompilerGenerated] private sealed class <CoSpawnGrid>d__11 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public Vector3 anchor; private int <target>5__1; private float <r>5__2; private float <diameter>5__3; private float <spacing>5__4; private int <gridX>5__5; private int <gridZ>5__6; private int <halfX>5__7; private int <halfZ>5__8; private int <snapStride>5__9; private bool <doSnap>5__10; private int <spawned>5__11; private int <yieldBudget>5__12; private int <iz>5__13; private int <ix>5__14; private Vector3 <pos>5__15; private Vector3 <origin>5__16; private RaycastHit <rh>5__17; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <CoSpawnGrid>d__11(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_017b: 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_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_0251: Unknown result type (might be due to invalid IL or missing references) //IL_0256: Unknown result type (might be due to invalid IL or missing references) //IL_01eb: Unknown result type (might be due to invalid IL or missing references) //IL_01f0: Unknown result type (might be due to invalid IL or missing references) //IL_01fa: Unknown result type (might be due to invalid IL or missing references) //IL_01ff: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Unknown result type (might be due to invalid IL or missing references) //IL_020a: Unknown result type (might be due to invalid IL or missing references) //IL_020f: Unknown result type (might be due to invalid IL or missing references) //IL_0231: Unknown result type (might be due to invalid IL or missing references) //IL_0236: Unknown result type (might be due to invalid IL or missing references) //IL_0240: Unknown result type (might be due to invalid IL or missing references) //IL_0245: Unknown result type (might be due to invalid IL or missing references) //IL_024a: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; goto IL_02a6; } <>1__state = -1; ClearAll(); EnsureRoot(); EnsureMaterial(); <target>5__1 = Mathf.Max(1, LevelPointSphereFlood.CFG_SphereCount.Value); <r>5__2 = Mathf.Max(0.01f, LevelPointSphereFlood.CFG_SphereScale.Value); <diameter>5__3 = <r>5__2 * 2f; <spacing>5__4 = <diameter>5__3 + Mathf.Max(0f, LevelPointSphereFlood.CFG_GridGapMeters.Value); <gridX>5__5 = Mathf.CeilToInt(Mathf.Sqrt((float)<target>5__1)); <gridZ>5__6 = Mathf.CeilToInt((float)<target>5__1 / (float)<gridX>5__5); <halfX>5__7 = <gridX>5__5 / 2; <halfZ>5__8 = <gridZ>5__6 / 2; <snapStride>5__9 = Mathf.Max(0, LevelPointSphereFlood.CFG_SnapEveryNth.Value); <doSnap>5__10 = LevelPointSphereFlood.CFG_SnapToGround.Value && (<snapStride>5__9 == 0 || <snapStride>5__9 >= 1); <spawned>5__11 = 0; <yieldBudget>5__12 = Mathf.Max(64, LevelPointSphereFlood.CFG_ToggleBudgetPerFrame.Value); <iz>5__13 = 0; goto IL_02e3; IL_02e3: if (<iz>5__13 < <gridZ>5__6) { <ix>5__14 = 0; goto IL_02b9; } LevelPointSphereFlood.Log($"[SphereFlood] Grid spawn complete. {<spawned>5__11} spheres. Grid {<gridX>5__5}x{<gridZ>5__6}, spacing={<spacing>5__4:0.###}m"); return false; IL_02b9: if (<ix>5__14 < <gridX>5__5 && <spawned>5__11 < <target>5__1) { <pos>5__15 = anchor + new Vector3((float)(<ix>5__14 - <halfX>5__7) * <spacing>5__4, 0f, (float)(<iz>5__13 - <halfZ>5__8) * <spacing>5__4); if (<doSnap>5__10 && (<snapStride>5__9 == 0 || <spawned>5__11 % <snapStride>5__9 == 0)) { <origin>5__16 = <pos>5__15 + Vector3.up * 2f; if (Physics.Raycast(<origin>5__16, Vector3.down, ref <rh>5__17, 6f, -1, (QueryTriggerInteraction)1)) { <pos>5__15 = ((RaycastHit)(ref <rh>5__17)).point + Vector3.up * 0.02f; } } SpawnOne(<pos>5__15, Quaternion.identity, <r>5__2); <spawned>5__11++; if (<spawned>5__11 % <yieldBudget>5__12 == 0) { <>2__current = null; <>1__state = 1; return true; } goto IL_02a6; } <iz>5__13++; goto IL_02e3; IL_02a6: <ix>5__14++; goto IL_02b9; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <CoSpawnOnePerPoint>d__12 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public List<Transform> points; private int <perPoint>5__1; private float <jitter>5__2; private bool <spiral>5__3; private float <r>5__4; private int <snapStride>5__5; private bool <doSnap>5__6; private long <totalPlanned>5__7; private int <spawned>5__8; private int <yieldBudget>5__9; private int <i>5__10; private int <j>5__11; private int <i>5__12; private Transform <p>5__13; private Vector3 <basePos>5__14; private Quaternion <rot>5__15; private int <j>5__16; private Vector3 <pos>5__17; private Vector3 <origin>5__18; private RaycastHit <rh>5__19; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <CoSpawnOnePerPoint>d__12(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <p>5__13 = null; <>1__state = -2; } private bool MoveNext() { //IL_0273: Unknown result type (might be due to invalid IL or missing references) //IL_0290: Unknown result type (might be due to invalid IL or missing references) //IL_0295: Unknown result type (might be due to invalid IL or missing references) //IL_029a: Unknown result type (might be due to invalid IL or missing references) //IL_0336: 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_02ce: Unknown result type (might be due to invalid IL or missing references) //IL_02d3: Unknown result type (might be due to invalid IL or missing references) //IL_02dd: Unknown result type (might be due to invalid IL or missing references) //IL_02e2: Unknown result type (might be due to invalid IL or missing references) //IL_02e7: Unknown result type (might be due to invalid IL or missing references) //IL_02ed: Unknown result type (might be due to invalid IL or missing references) //IL_02f2: Unknown result type (might be due to invalid IL or missing references) //IL_0316: Unknown result type (might be due to invalid IL or missing references) //IL_031b: Unknown result type (might be due to invalid IL or missing references) //IL_0325: Unknown result type (might be due to invalid IL or missing references) //IL_032a: Unknown result type (might be due to invalid IL or missing references) //IL_032f: Unknown result type (might be due to invalid IL or missing references) //IL_0249: Unknown result type (might be due to invalid IL or missing references) //IL_024e: Unknown result type (might be due to invalid IL or missing references) //IL_025a: Unknown result type (might be due to invalid IL or missing references) //IL_025f: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; goto IL_038c; } <>1__state = -1; ClearAll(); EnsureRoot(); EnsureMaterial(); if (points == null || points.Count == 0) { return false; } <i>5__10 = 0; while (<i>5__10 < points.Count) { <j>5__11 = Random.Range(<i>5__10, points.Count); List<Transform> list = points; int index = <i>5__10; List<Transform> list2 = points; int index2 = <j>5__11; Transform value = points[<j>5__11]; Transform value2 = points[<i>5__10]; list[index] = value; list2[index2] = value2; <i>5__10++; } <perPoint>5__1 = Mathf.Max(1, LevelPointSphereFlood.CFG_SpheresPerPoint.Value); <jitter>5__2 = Mathf.Max(0f, LevelPointSphereFlood.CFG_PerPointJitterRadius.Value); <spiral>5__3 = LevelPointSphereFlood.CFG_PerPointSpiral.Value; <r>5__4 = Mathf.Max(0.01f, LevelPointSphereFlood.CFG_SphereScale.Value); <snapStride>5__5 = Mathf.Max(0, LevelPointSphereFlood.CFG_SnapEveryNth.Value); <doSnap>5__6 = LevelPointSphereFlood.CFG_SnapToGround.Value && (<snapStride>5__5 == 0 || <snapStride>5__5 >= 1); <totalPlanned>5__7 = (long)points.Count * (long)<perPoint>5__1; if (<totalPlanned>5__7 > 200000) { LevelPointSphereFlood.LogWarn($"[SphereFlood] Warning: planning to spawn {<totalPlanned>5__7:N0} objects. This will be heavy; culling will cap actives but spawn time/memory will grow."); } <spawned>5__8 = 0; <yieldBudget>5__9 = Mathf.Max(64, LevelPointSphereFlood.CFG_ToggleBudgetPerFrame.Value); <i>5__12 = 0; goto IL_03d0; IL_038c: <j>5__16++; goto IL_039f; IL_03d0: if (<i>5__12 < points.Count) { <p>5__13 = points[<i>5__12]; if (!Object.op_Implicit((Object)(object)<p>5__13)) { goto IL_03be; } <basePos>5__14 = <p>5__13.position; <rot>5__15 = <p>5__13.rotation; <j>5__16 = 0; goto IL_039f; } LevelPointSphereFlood.Log($"[SphereFlood] Per-point spawn complete: {<spawned>5__8} spheres across {points.Count} points (per point={<perPoint>5__1})."); return false; IL_039f: if (<j>5__16 < <perPoint>5__1) { <pos>5__17 = <basePos>5__14 + JitterOffset(<j>5__16, <perPoint>5__1, <jitter>5__2, <spiral>5__3); if (<doSnap>5__6 && (<snapStride>5__5 == 0 || <spawned>5__8 % <snapStride>5__5 == 0)) { <origin>5__18 = <pos>5__17 + Vector3.up * 2f; if (Physics.Raycast(<origin>5__18, Vector3.down, ref <rh>5__19, 6f, -1, (QueryTriggerInteraction)1)) { <pos>5__17 = ((RaycastHit)(ref <rh>5__19)).point + Vector3.up * 0.02f; } } SpawnOne(<pos>5__17, <rot>5__15, <r>5__4); <spawned>5__8++; if (<spawned>5__8 % <yieldBudget>5__9 == 0) { <>2__current = null; <>1__state = 1; return true; } goto IL_038c; } <p>5__13 = null; goto IL_03be; IL_03be: <i>5__12++; goto IL_03d0; } 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 List<SphereRec> _spheres = new List<SphereRec>(16384); private static readonly Dictionary<Vector2Int, List<int>> _cellToIndices = new Dictionary<Vector2Int, List<int>>(1024); private static readonly List<int> _scratch = new List<int>(2048); private static GameObject _root; private static Material _matRed; public static int Count => _spheres.Count; public static void ClearAll() { for (int num = _spheres.Count - 1; num >= 0; num--) { SphereRec sphereRec = _spheres[num]; if (Object.op_Implicit((Object)(object)sphereRec.go)) { Object.Destroy((Object)(object)sphereRec.go); } } _spheres.Clear(); _cellToIndices.Clear(); if (Object.op_Implicit((Object)(object)_root)) { Object.Destroy((Object)(object)_root); _root = null; } } private static void EnsureRoot() { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown if (!Object.op_Implicit((Object)(object)_root)) { _root = new GameObject("[SphereFlood] Root"); Object.DontDestroyOnLoad((Object)(object)_root); } } private static void EnsureMaterial() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown //IL_002a: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)_matRed)) { _matRed = new Material(Shader.Find("Standard")); _matRed.color = Color.red; _matRed.enableInstancing = true; } } [IteratorStateMachine(typeof(<CoSpawnGrid>d__11))] public static IEnumerator CoSpawnGrid(Vector3 anchor) { //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) //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <CoSpawnGrid>d__11(0) { anchor = anchor }; } [IteratorStateMachine(typeof(<CoSpawnOnePerPoint>d__12))] public static IEnumerator CoSpawnOnePerPoint(List<Transform> points) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <CoSpawnOnePerPoint>d__12(0) { points = points }; } private static Vector3 JitterOffset(int j, int perPoint, float radius, bool spiral) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: 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_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_0031: 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_0044: 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_0094: Unknown result type (might be due to invalid IL or missing references) //IL_008b: 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) if (radius <= 0f) { return Vector3.zero; } if (!spiral) { Vector2 val = Random.insideUnitCircle * radius; return new Vector3(val.x, 0f, val.y); } float num = ((perPoint <= 1) ? 0f : (((float)j + 0.5f) / (float)perPoint)); float num2 = Mathf.Sqrt(num) * radius; float num3 = 2.3999631f * (float)j; return new Vector3(Mathf.Cos(num3) * num2, 0f, Mathf.Sin(num3) * num2); } private static void SpawnOne(Vector3 position, Quaternion rotation, float radius) { //IL_0031: 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_004b: 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_01c5: Unknown result type (might be due to invalid IL or missing references) //IL_01c6: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Unknown result type (might be due to invalid IL or missing references) //IL_01de: Unknown result type (might be due to invalid IL or missing references) //IL_0243: Unknown result type (might be due to invalid IL or missing references) //IL_0245: Unknown result type (might be due to invalid IL or missing references) //IL_01ff: Unknown result type (might be due to invalid IL or missing references) GameObject val = GameObject.CreatePrimitive((PrimitiveType)0); ((Object)val).name = "LP_Sphere"; val.transform.SetParent(_root.transform, false); val.transform.position = position; val.transform.rotation = rotation; val.transform.localScale = Vector3.one * Mathf.Max(0.01f, radius); Collider component = val.GetComponent<Collider>(); if ((Object)(object)component != (Object)null) { component.isTrigger = false; } Rigidbody val2 = val.GetComponent<Rigidbody>() ?? val.AddComponent<Rigidbody>(); val2.useGravity = true; val2.collisionDetectionMode = (CollisionDetectionMode)0; val2.interpolation = (RigidbodyInterpolation)0; val2.mass = Mathf.Max(0.001f, LevelPointSphereFlood.CFG_RB_Mass.Value); val2.drag = Mathf.Max(0f, LevelPointSphereFlood.CFG_RB_Drag.Value); val2.angularDrag = Mathf.Max(0f, LevelPointSphereFlood.CFG_RB_AngularDrag.Value); val2.sleepThreshold = Mathf.Clamp(LevelPointSphereFlood.CFG_RB_SleepThreshold.Value, 0.0001f, 1f); MeshRenderer component2 = val.GetComponent<MeshRenderer>(); if ((Object)(object)component2 != (Object)null) { ((Renderer)component2).sharedMaterial = _matRed; ((Renderer)component2).shadowCastingMode = (ShadowCastingMode)0; ((Renderer)component2).receiveShadows = false; } if (LevelPointSphereFlood.CFG_AddImpactDetector.Value) { bool flag = (Object)(object)val.GetComponent<PhysGrabObject>() != (Object)null; if (!LevelPointSphereFlood.CFG_AddDetectorOnlyIfCompatible.Value || flag) { try { PhysGrabObjectImpactDetector val3 = val.AddComponent<PhysGrabObjectImpactDetector>(); if (!flag) { ((Behaviour)val3).enabled = false; } } catch (Exception ex) { LevelPointSphereFlood.LogWarn("[SphereFlood] ImpactDetector add failed: " + ex.Message); } } } Vector2Int val4 = ToCell(position); int count = _spheres.Count; if (!_cellToIndices.TryGetValue(val4, out List<int> value)) { value = new List<int>(32); _cellToIndices[val4] = value; } value.Add(count); _spheres.Add(new SphereRec { go = val, rb = val2, col = component, mr = component2, cell = val4, active = true }); } public static Vector2Int ToCell(Vector3 pos) { //IL_0016: 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_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_003c: Unknown result type (might be due to invalid IL or missing references) float num = Mathf.Max(1f, LevelPointSphereFlood.CFG_CellSize.Value); int num2 = Mathf.FloorToInt(pos.x / num); int num3 = Mathf.FloorToInt(pos.z / num); return new Vector2Int(num2, num3); } internal static void CollectIndicesInCells(HashSet<Vector2Int> cells, List<int> outIndices) { //IL_0014: 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_0020: Unknown result type (might be due to invalid IL or missing references) outIndices.Clear(); foreach (Vector2Int cell in cells) { if (_cellToIndices.TryGetValue(cell, out List<int> value)) { outIndices.AddRange(value); } } } internal static bool TryGetPosition(int idx, out Vector3 pos) { //IL_0002: 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_0053: Unknown result type (might be due to invalid IL or missing references) pos = default(Vector3); if ((uint)idx >= (uint)_spheres.Count) { return false; } SphereRec sphereRec = _spheres[idx]; if (!Object.op_Implicit((Object)(object)sphereRec.go)) { return false; } pos = sphereRec.go.transform.position; return true; } internal static void EnableIndex(int i) { if ((uint)i >= (uint)_spheres.Count) { return; } SphereRec value = _spheres[i]; if (Object.op_Implicit((Object)(object)value.go) && !value.active) { if (Object.op_Implicit((Object)(object)value.col)) { value.col.enabled = true; } if (Object.op_Implicit((Object)(object)value.rb)) { value.rb.isKinematic = false; value.rb.WakeUp(); } if (LevelPointSphereFlood.CFG_HideRendererWhenCulled.Value && Object.op_Implicit((Object)(object)value.mr)) { ((Renderer)value.mr).enabled = true; } value.active = true; _spheres[i] = value; } } internal static void DisableIndex(int i) { if ((uint)i >= (uint)_spheres.Count) { return; } SphereRec value = _spheres[i]; if (Object.op_Implicit((Object)(object)value.go) && value.active) { if (Object.op_Implicit((Object)(object)value.rb)) { value.rb.isKinematic = true; value.rb.Sleep(); } if (Object.op_Implicit((Object)(object)value.col)) { value.col.enabled = false; } if (LevelPointSphereFlood.CFG_HideRendererWhenCulled.Value && Object.op_Implicit((Object)(object)value.mr)) { ((Renderer)value.mr).enabled = false; } value.active = false; _spheres[i] = value; } } } public class GridCuller : MonoBehaviour { private struct Scored { public int idx; public float d2; } private static GridCuller _i; private float _nextAt = 0f; private readonly HashSet<Vector2Int> _activeCells = new HashSet<Vector2Int>(); private readonly HashSet<int> _targetEnabled = new HashSet<int>(); private readonly HashSet<int> _currentlyEnabled = new HashSet<int>(); private readonly List<int> _work = new List<int>(4096); private static readonly List<int> _scratchIndices = new List<int>(8192); private static readonly List<Scored> _scored = new List<Scored>(8192); public static void Ensure() { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown if ((Object)(object)_i == (Object)null) { GameObject val = new GameObject("[SphereFlood] GridCuller"); Object.DontDestroyOnLoad((Object)(object)val); _i = val.AddComponent<GridCuller>(); } _i._nextAt = 0f; } public static void Reset() { if ((Object)(object)_i != (Object)null) { Object.Destroy((Object)(object)((Component)_i).gameObject); _i = null; } } private void Update() { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0067: 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_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Unknown result type (might be due to invalid IL or missing references) //IL_019a: Unknown result type (might be due to invalid IL or missing references) float time = Time.time; if (time < _nextAt) { return; } _nextAt = time + Mathf.Max(0.05f, LevelPointSphereFlood.CFG_CullRefreshInterval.Value); PlayerAvatar val = FindLocalPlayer(); if ((Object)(object)val == (Object)null) { return; } Vector3 position = ((Component)val).transform.position; _activeCells.Clear(); Vector2Int val2 = SphereManager.ToCell(position); int num = Mathf.Max(1, LevelPointSphereFlood.CFG_ActiveCellRadius.Value); for (int i = -num; i <= num; i++) { for (int j = -num; j <= num; j++) { _activeCells.Add(new Vector2Int(((Vector2Int)(ref val2)).x + j, ((Vector2Int)(ref val2)).y + i)); } } _targetEnabled.Clear(); SphereManager.CollectIndicesInCells(_activeCells, _scratchIndices); for (int k = 0; k < _scratchIndices.Count; k++) { _targetEnabled.Add(_scratchIndices[k]); } int num2 = Mathf.Max(100, LevelPointSphereFlood.CFG_MaxActiveCount.Value); if (_targetEnabled.Count > num2) { _scored.Clear(); foreach (int item in _targetEnabled) { if (SphereManager.TryGetPosition(item, out var pos)) { Vector3 val3 = pos - position; float sqrMagnitude = ((Vector3)(ref val3)).sqrMagnitude; _scored.Add(new Scored { idx = item, d2 = sqrMagnitude }); } } _scored.Sort((Scored a, Scored b) => a.d2.CompareTo(b.d2)); _targetEnabled.Clear(); for (int l = 0; l < _scored.Count && l < num2; l++) { _targetEnabled.Add(_scored[l].idx); } } int num3 = Mathf.Max(1, LevelPointSphereFlood.CFG_ToggleBudgetPerFrame.Value); int num4 = 0; if (_currentlyEnabled.Count > 0) { _work.Clear(); _work.AddRange(_currentlyEnabled); for (int m = 0; m < _work.Count; m++) { if (num4 >= num3) { break; } int num5 = _work[m]; if (!_targetEnabled.Contains(num5)) { SphereManager.DisableIndex(num5); _currentlyEnabled.Remove(num5); num4++; } } } if (num4 >= num3) { return; } foreach (int item2 in _targetEnabled) { if (num4 >= num3) { break; } if (!_currentlyEnabled.Contains(item2)) { SphereManager.EnableIndex(item2); _currentlyEnabled.Add(item2); num4++; } } } private static PlayerAvatar FindLocalPlayer() { try { PlayerAvatar[] array = Object.FindObjectsOfType<PlayerAvatar>(true); foreach (PlayerAvatar val in array) { if ((Object)(object)val == (Object)null) { continue; } Type type = ((object)val).GetType(); try { FieldInfo field = type.GetField("isLocal", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null && field.FieldType == typeof(bool) && (bool)field.GetValue(val)) { return val; } } catch { } try { PropertyInfo property = type.GetProperty("IsLocal", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (property != null && property.PropertyType == typeof(bool) && (bool)property.GetValue(val)) { return val; } } catch { } } } catch { } return null; } } }