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 Render Limits v1.14.0
RenderLimits.dll
Decompiled a month agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Microsoft.CodeAnalysis; using Service; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyCompany("RenderLimits")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+13ac2c33375513b53f8858c13d207c03d08d0797")] [assembly: AssemblyProduct("RenderLimits")] [assembly: AssemblyTitle("RenderLimits")] [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 Service { public class ConfigWrapper { private readonly ConfigFile ConfigFile; private readonly Dictionary<string, Action<Terminal, string>> SettingHandlers = new Dictionary<string, Action<Terminal, string>>(); public ConfigWrapper(string command, ConfigFile configFile) { //IL_0025: 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_0043: Expected O, but got Unknown //IL_0043: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) ConfigFile = configFile; new ConsoleCommand(command, "[key] [value] - Toggles or sets a config value.", (ConsoleEvent)delegate(ConsoleEventArgs args) { if (args.Length >= 2 && SettingHandlers.TryGetValue(args[1].ToLower(), out Action<Terminal, string> value)) { if (args.Length == 2) { value(args.Context, ""); } else { value(args.Context, string.Join(" ", args.Args.Skip(2))); } } }, false, false, false, false, false, (ConsoleOptionsFetcher)(() => SettingHandlers.Keys.ToList()), false, false, false); } private void HandleChange(ConfigEntry<string> configEntry, Action onChange) { Action onChange2 = onChange; configEntry.SettingChanged += delegate { onChange2(); }; } private void HandleChange(ConfigEntry<string> configEntry, Action<string> onChange) { Action<string> onChange2 = onChange; ConfigEntry<string> configEntry2 = configEntry; configEntry2.SettingChanged += delegate { onChange2(configEntry2.Value); }; onChange2(configEntry2.Value); } private void HandleChange(ConfigEntry<string> configEntry, Action<int> onChange) { Action<int> onChange2 = onChange; HandleChange(configEntry, onSettingChanged); void onSettingChanged(string value) { if (TryParseInt(value, out var result)) { onChange2(result); } } } private void HandleChange(ConfigEntry<string> configEntry, Action<float> onChange) { Action<float> onChange2 = onChange; HandleChange(configEntry, onSettingChanged); void onSettingChanged(string value) { if (TryParseFloat(value, out var result)) { onChange2(result); } } } public ConfigEntry<bool> Bind(string group, string name, bool value, string description) { ConfigEntry<bool> val = ConfigFile.Bind<bool>(group, name, value, description); Register<bool>(val); return val; } public ConfigEntry<string> Bind(string group, string name, string value, string description, Action onChange) { ConfigEntry<string> val = ConfigFile.Bind<string>(group, name, value, description); Register(val); HandleChange(val, onChange); return val; } public ConfigEntry<string> Bind(string group, string name, string value, string description, Action<string> onChange) { ConfigEntry<string> val = ConfigFile.Bind<string>(group, name, value, description); Register(val); HandleChange(val, onChange); return val; } public ConfigEntry<string> Bind(string group, string name, string value, string description, Action<int> onChange) { ConfigEntry<string> val = ConfigFile.Bind<string>(group, name, value, description); Register(val); HandleChange(val, onChange); return val; } public ConfigEntry<string> Bind(string group, string name, string value, string description, Action<float> onChange) { ConfigEntry<string> val = ConfigFile.Bind<string>(group, name, value, description); Register(val); HandleChange(val, onChange); return val; } private static void AddMessage(Terminal context, string message) { context.AddString(message); Player localPlayer = Player.m_localPlayer; if (localPlayer != null) { ((Character)localPlayer).Message((MessageType)1, message, 0, (Sprite)null); } } private void Register(ConfigEntry<string> setting) { ConfigEntry<string> setting2 = setting; string name = ((ConfigEntryBase)setting2).Definition.Key; string key = name.ToLower().Replace(' ', '_'); SettingHandlers.Add(key, delegate(Terminal terminal, string value) { SetValue<string>(terminal, setting2, name, value); }); } private void Register<T>(ConfigEntry<T> setting) { ConfigEntry<T> setting2 = setting; string name = ((ConfigEntryBase)setting2).Definition.Key; string key = name.ToLower().Replace(' ', '_'); SettingHandlers.Add(key, delegate(Terminal terminal, string value) { SetValue<T>(terminal, setting2, name, value); }); } public static int ParseInt(string value, int defaultValue) { if (int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var result)) { return result; } return defaultValue; } public static bool TryParseInt(ConfigEntry<string> setting, out int result) { return TryParseInt(setting.Value, out result); } public static bool TryParseInt(string value, out int result) { return int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out result); } public static int ParseInt(ConfigEntry<string> setting) { if (int.TryParse(setting.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var result)) { return result; } return ParseInt((string)((ConfigEntryBase)setting).DefaultValue, 0); } private static float ParseFloat(string value, float defaultValue) { if (float.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out var result)) { return result; } return defaultValue; } public static float ParseFloat(ConfigEntry<string> setting) { if (float.TryParse(setting.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out var result)) { return result; } return ParseFloat((string)((ConfigEntryBase)setting).DefaultValue, 0f); } public static bool TryParseFloat(string value, out float result) { return float.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out result); } private static void SetValue<T>(Terminal context, ConfigEntry<T> setting, string name, string value) { if (value == "") { AddMessage(context, $"{name}: {setting.Value}."); return; } setting.Value = (T)(object)value; AddMessage(context, name + " set to " + value + "."); } } public class Helper { public static void AddMessage(Terminal context, string message, bool priority = true) { context.AddString(message); MessageHud instance = MessageHud.instance; if (!Object.op_Implicit((Object)(object)instance)) { return; } if (priority) { MsgData[] array = instance.m_msgQeue.ToArray(); instance.m_msgQeue.Clear(); Player localPlayer = Player.m_localPlayer; if (localPlayer != null) { ((Character)localPlayer).Message((MessageType)1, message, 0, (Sprite)null); } MsgData[] array2 = array; foreach (MsgData item in array2) { instance.m_msgQeue.Enqueue(item); } instance.m_msgQueueTimer = 10f; } else { Player localPlayer2 = Player.m_localPlayer; if (localPlayer2 != null) { ((Character)localPlayer2).Message((MessageType)1, message, 0, (Sprite)null); } } } public static void Command(string name, string description, ConsoleEvent action, ConsoleOptionsFetcher? fetcher = null) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) new ConsoleCommand(name, description, Catch(action), false, false, false, false, false, fetcher, false, false, false); } public static void AddError(Terminal context, string message, bool priority = true) { AddMessage(context, "Error: " + message, priority); } public static ConsoleEvent Catch(ConsoleEvent action) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown ConsoleEvent action2 = action; return (ConsoleEvent)delegate(ConsoleEventArgs args) { try { if (!Object.op_Implicit((Object)(object)Player.m_localPlayer)) { throw new InvalidOperationException("Player not found."); } action2.Invoke(args); } catch (InvalidOperationException ex) { AddError(args.Context, ex.Message); } }; } } } namespace RenderLimits { public class Configuration { public static ConfigEntry<string> configActivateArea; public static ConfigEntry<string> configLoadedArea; public static ConfigEntry<string> configGeneratedArea; public static ConfigEntry<string> configRealTerrainVisibility; public static ConfigEntry<string> configClutterVisibility; public static ConfigEntry<string> configForceActive; public static HashSet<Vector2i> ForceActive = new HashSet<Vector2i>(); public static ConfigEntry<string> configMaximumGeneratedArea; public static ConfigEntry<bool> configAllowForceActive; public static ConfigEntry<string> configPixelLightCount; public static ConfigEntry<string> configShadowCascades; public static ConfigEntry<string> configShadowQuality; public static ConfigEntry<string> configShadowDistance; public static ConfigEntry<string> configShadowResolution; public static ConfigEntry<string> configLodBias; public static int ActiveArea => ConfigWrapper.ParseInt(configActivateArea); public static int LoadedArea => ConfigWrapper.ParseInt(configLoadedArea); public static int GeneratedArea => ConfigWrapper.ParseInt(configGeneratedArea); public static int RealTerrainVisibility => ConfigWrapper.ParseInt(configRealTerrainVisibility); public static int ClutterVisibility => ConfigWrapper.ParseInt(configClutterVisibility); public static int MaximumGeneratedArea => Math.Max(1, ConfigWrapper.ParseInt(configMaximumGeneratedArea)); public static bool AllowForceActive => configAllowForceActive.Value; private static void ParseForceActive(string value) { //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) HashSet<Vector2i> hashSet = new HashSet<Vector2i>(); foreach (Vector2i item in (from s in value.Split(new char[1] { '|' }) select s.Trim() into s select s.Split(new char[1] { ',' }) into s where s.Length == 2 select s).Select((Func<string[], Vector2i>)delegate(string[] s) { //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_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) try { return new Vector2i(int.Parse(s[0]), int.Parse(s[1])); } catch { return default(Vector2i); } })) { hashSet.Add(item); } ForceActive = hashSet; } public static void SaveForceActive() { configForceActive.Value = string.Join("|", ForceActive.Select((Vector2i s) => $"{s.x},{s.y}")); } public static void Init(ConfigFile configFile) { ConfigWrapper configWrapper = new ConfigWrapper("render_config", configFile); string group = "1. Zones"; configActivateArea = configWrapper.Bind(group, "Active zones", "1", "Amounts of zones that are active around the player. Creatures are active in this area.", (Action)delegate { LimitManager.UpdateLocalLimits(); ZoneSystemPatches.Update(); }); configLoadedArea = configWrapper.Bind(group, "Loaded zones", "2", "Amounts of zones loaded around the player. Structures are visible in this area. ", (Action)delegate { LimitManager.UpdateLocalLimits(); ZoneSystemPatches.Update(); TerrainVisibility.Update(); }); configGeneratedArea = configWrapper.Bind(group, "Generated zones", "4", "Amounts of zones generated around the player. Large static objects like trees are visible in this area.", (Action)delegate { LimitManager.UpdateLocalLimits(); ZoneSystemPatches.Update(); }); configRealTerrainVisibility = configWrapper.Bind(group, "Real terrain visibility", "0", "Visibility in meters. If 0, automatically calculated from loaded area.", TerrainVisibility.Update); configForceActive = configWrapper.Bind(group, "Force active", "", "Zones that are always active.", (Action)delegate { ParseForceActive(configForceActive.Value); LimitManager.UpdateLocalLimits(); }); group = "2. Quality"; configClutterVisibility = configWrapper.Bind(group, "Clutter visibility", "45", "Visibility in meters.", ClutterDistance.Update); configLodBias = configWrapper.Bind(group, "Lod bias", "", "Level of detail limit (increase to show smaller objects, vanilla is from 1 to 5 but even 100 works).", delegate(int value) { QualitySettings.lodBias = value; }); configPixelLightCount = configWrapper.Bind(group, "Pixel light count", "", "Light detail (bigger the better, vanilla is from 2 to 8).", delegate(int value) { QualitySettings.pixelLightCount = value; }); configShadowCascades = configWrapper.Bind(group, "Shadow cascades", "", "Improves shadows near the camera (bigger the better, vanilla is from 2 to 4).", delegate(int value) { QualitySettings.shadowCascades = value; }); configShadowQuality = configWrapper.Bind(group, "Shadow quality", "", "0: off, 1: hard only, 2: all.", delegate(int value) { QualitySettings.shadows = (ShadowQuality)Math.Max(0, Math.Min(2, value)); }); configShadowDistance = configWrapper.Bind(group, "Shadow distance", "", "Max distance for shadows in meters (vanilla is from 80 to 150).", delegate(float value) { QualitySettings.shadowDistance = value; }); configShadowResolution = configWrapper.Bind(group, "Shadow resolution", "", "Shadow quality. From 0 to 3.", delegate(int value) { QualitySettings.shadowResolution = (ShadowResolution)Math.Max(0, Math.Min(3, value)); }); group = "3. Server limits"; configMaximumGeneratedArea = configWrapper.Bind(group, "Maximum generated zones", "10", "Maximum generated zones that can be received from clients.", (Action<int>)delegate { }); configAllowForceActive = configWrapper.Bind(group, "Allow force active", value: false, "Whether clients can have force active areas."); ParseForceActive(configForceActive.Value); LimitManager.UpdateLocalLimits(); } public static void InitSettings() { if (ConfigWrapper.TryParseInt(configLodBias.Value, out var result)) { QualitySettings.lodBias = result; } if (ConfigWrapper.TryParseInt(configPixelLightCount.Value, out var result2)) { QualitySettings.pixelLightCount = result2; } if (ConfigWrapper.TryParseInt(configShadowCascades.Value, out var result3)) { QualitySettings.shadowCascades = result3; } if (ConfigWrapper.TryParseInt(configShadowQuality.Value, out var result4)) { QualitySettings.shadows = (ShadowQuality)Math.Max(0, Math.Min(2, result4)); } if (ConfigWrapper.TryParseFloat(configShadowDistance.Value, out var result5)) { QualitySettings.shadowDistance = result5; } if (ConfigWrapper.TryParseInt(configShadowResolution.Value, out var result6)) { QualitySettings.shadowResolution = (ShadowResolution)Math.Max(0, Math.Min(3, result6)); } } } [HarmonyPatch(typeof(ClutterSystem), "Awake")] public class ClutterDistance { private static void Postfix(ClutterSystem __instance) { Set(__instance); } private static void Set(ClutterSystem obj) { obj.m_distance = Configuration.ClutterVisibility; obj.ClearAll(); } public static void Update() { if (Object.op_Implicit((Object)(object)ClutterSystem.instance)) { Set(ClutterSystem.instance); } } } public class ForceActiveCommand { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static ConsoleEvent <>9__0_0; public static Func<Vector2i, bool> <>9__0_4; public static Func<Vector2i, bool> <>9__0_5; public static Func<Vector2i, string> <>9__0_2; public static Func<Vector2i, string> <>9__0_3; public static ConsoleEvent <>9__0_1; internal void <.ctor>b__0_0(ConsoleEventArgs args) { //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_0043: 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_0061: 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_00b3: 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_011f: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: 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_0160: Unknown result type (might be due to invalid IL or missing references) //IL_016c: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) string text = "toggle"; if (args.Length > 1) { text = args[1]; } int num = 0; if (args.Length > 2 && int.TryParse(args[2], out var result)) { num = result; } Vector2i zone = ZoneSystem.GetZone(ZNet.instance.GetReferencePosition()); Vector2i val = default(Vector2i); for (int i = -num; i <= num; i++) { for (int j = -num; j <= num; j++) { ((Vector2i)(ref val))..ctor(zone.x + i, zone.y + j); bool flag = Configuration.ForceActive.Contains(val); bool num2 = text == "add" || (text != "remove" && !flag); if (num2 && flag) { Helper.AddMessage(args.Context, $"Zone {val.x},{val.y} is already in active zones."); } if (!num2 && !flag) { Helper.AddMessage(args.Context, $"Zone {val.x},{val.y} is not in active zones."); } if (!num2 && flag) { Helper.AddMessage(args.Context, $"Zone {val.x},{val.y} removed from active zones."); Configuration.ForceActive.Remove(val); } if (num2 && !flag) { Helper.AddMessage(args.Context, $"Zone {val.x},{val.y} added to active zones."); Configuration.ForceActive.Add(val); } } } Configuration.SaveForceActive(); LimitManager.UpdateLocalLimits(); } internal void <.ctor>b__0_1(ConsoleEventArgs args) { Dictionary<Vector2i, ZoneData> zones = ZoneSystem.instance.m_zones; List<Vector2i> list = new List<Vector2i>(); list.AddRange(zones.Keys.Where((Vector2i zone) => Configuration.ForceActive.Contains(zone))); List<Vector2i> source = list; List<Vector2i> list2 = new List<Vector2i>(); list2.AddRange(zones.Keys.Where((Vector2i zone) => !Configuration.ForceActive.Contains(zone))); List<Vector2i> source2 = list2; Helper.AddMessage(args.Context, "Forced: " + string.Join(", ", source.Select((Vector2i zone) => $"{zone.x},{zone.y}"))); Helper.AddMessage(args.Context, "Default: " + string.Join(", ", source2.Select((Vector2i zone) => $"{zone.x},{zone.y}"))); } internal bool <.ctor>b__0_4(Vector2i zone) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) return Configuration.ForceActive.Contains(zone); } internal bool <.ctor>b__0_5(Vector2i zone) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) return !Configuration.ForceActive.Contains(zone); } internal string <.ctor>b__0_2(Vector2i zone) { //IL_0005: 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) return $"{zone.x},{zone.y}"; } internal string <.ctor>b__0_3(Vector2i zone) { //IL_0005: 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) return $"{zone.x},{zone.y}"; } } public ForceActiveCommand() { //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_002f: Expected O, but got Unknown //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_005e: Expected O, but got Unknown object obj = <>c.<>9__0_0; if (obj == null) { ConsoleEvent val = delegate(ConsoleEventArgs args) { //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_0043: 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_0061: 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_00b3: 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_011f: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: 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_0160: Unknown result type (might be due to invalid IL or missing references) //IL_016c: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) string text = "toggle"; if (args.Length > 1) { text = args[1]; } int num = 0; if (args.Length > 2 && int.TryParse(args[2], out var result)) { num = result; } Vector2i zone2 = ZoneSystem.GetZone(ZNet.instance.GetReferencePosition()); Vector2i val3 = default(Vector2i); for (int i = -num; i <= num; i++) { for (int j = -num; j <= num; j++) { ((Vector2i)(ref val3))..ctor(zone2.x + i, zone2.y + j); bool flag = Configuration.ForceActive.Contains(val3); bool num2 = text == "add" || (text != "remove" && !flag); if (num2 && flag) { Helper.AddMessage(args.Context, $"Zone {val3.x},{val3.y} is already in active zones."); } if (!num2 && !flag) { Helper.AddMessage(args.Context, $"Zone {val3.x},{val3.y} is not in active zones."); } if (!num2 && flag) { Helper.AddMessage(args.Context, $"Zone {val3.x},{val3.y} removed from active zones."); Configuration.ForceActive.Remove(val3); } if (num2 && !flag) { Helper.AddMessage(args.Context, $"Zone {val3.x},{val3.y} added to active zones."); Configuration.ForceActive.Add(val3); } } } Configuration.SaveForceActive(); LimitManager.UpdateLocalLimits(); }; <>c.<>9__0_0 = val; obj = (object)val; } Helper.Command("force_active", "[add/remove/toggle] [around=0] - Toggles the force active of the current zone.", (ConsoleEvent)obj); object obj2 = <>c.<>9__0_1; if (obj2 == null) { ConsoleEvent val2 = delegate(ConsoleEventArgs args) { Dictionary<Vector2i, ZoneData> zones = ZoneSystem.instance.m_zones; List<Vector2i> list = new List<Vector2i>(); list.AddRange(zones.Keys.Where((Vector2i zone) => Configuration.ForceActive.Contains(zone))); List<Vector2i> source = list; List<Vector2i> list2 = new List<Vector2i>(); list2.AddRange(zones.Keys.Where((Vector2i zone) => !Configuration.ForceActive.Contains(zone))); List<Vector2i> source2 = list2; Helper.AddMessage(args.Context, "Forced: " + string.Join(", ", source.Select((Vector2i zone) => $"{zone.x},{zone.y}"))); Helper.AddMessage(args.Context, "Default: " + string.Join(", ", source2.Select((Vector2i zone) => $"{zone.x},{zone.y}"))); }; <>c.<>9__0_1 = val2; obj2 = (object)val2; } Helper.Command("check_active", "- Prints currently loaded zones.", (ConsoleEvent)obj2); } } [HarmonyPatch(typeof(SpawnArea), "UpdateSpawn")] public class SpawnArea_UpdateSpawn { private static float GetRange(SpawnArea sa) { //IL_0019: 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_0029: Unknown result type (might be due to invalid IL or missing references) if (Configuration.ForceActive.Count == 0) { return sa.m_triggerDistance; } Vector2i zone = ZoneSystem.GetZone(((Component)sa).transform.position); if (!Configuration.ForceActive.Contains(zone)) { return sa.m_triggerDistance; } return 999999f; } private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_0002: 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: Expected O, but got Unknown return new CodeMatcher(instructions, (ILGenerator)null).MatchForward(false, (CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(SpawnArea), "m_triggerDistance"), (string)null) }).Set(OpCodes.Call, (object)AccessTools.Method(typeof(SpawnArea_UpdateSpawn), "GetRange", (Type[])null, (Type[])null)).InstructionEnumeration(); } } [HarmonyPatch(typeof(CreatureSpawner), "UpdateSpawner")] public class CreatureSpawner_UpdateSpawner { private static float GetRange(CreatureSpawner cs) { //IL_0019: 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_0029: Unknown result type (might be due to invalid IL or missing references) if (Configuration.ForceActive.Count == 0) { return cs.m_triggerDistance; } Vector2i zone = ZoneSystem.GetZone(((Component)cs).transform.position); if (!Configuration.ForceActive.Contains(zone)) { return cs.m_triggerDistance; } return 999999f; } private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_0002: 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: Expected O, but got Unknown return new CodeMatcher(instructions, (ILGenerator)null).MatchForward(false, (CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(CreatureSpawner), "m_triggerDistance"), (string)null) }).Set(OpCodes.Call, (object)AccessTools.Method(typeof(CreatureSpawner_UpdateSpawner), "GetRange", (Type[])null, (Type[])null)).InstructionEnumeration(); } } public class PlayerLimits { public int ActiveArea = Math.Max(0, activeArea); public int LoadedArea = Math.Max(activeArea + 1, loadedArea); public int GeneratedArea = Math.Max(0, generatedArea - loadedArea); public int TotalArea; public HashSet<Vector2i> ForceActive { get; set; } public PlayerLimits(int loadedArea, int activeArea, int generatedArea, HashSet<Vector2i> forceActive) { //IL_0048: 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_004f: Unknown result type (might be due to invalid IL or missing references) TotalArea = generatedArea; HashSet<Vector2i> hashSet2; if (forceActive != null) { HashSet<Vector2i> hashSet = new HashSet<Vector2i>(); foreach (Vector2i item in forceActive) { hashSet.Add(item); } hashSet2 = hashSet; } else { hashSet2 = new HashSet<Vector2i>(); } ForceActive = hashSet2; base..ctor(); } } public static class LimitManager { public static string RPC_PLAYERSETTINGS = "RenderLimits_PlayerSettings"; private static readonly Dictionary<long, PlayerLimits> PlayerLimits = new Dictionary<long, PlayerLimits>(); private static long CurrentId = 0L; private static int MaxTotalArea = 0; public static void SetCurrentPlayer(long uid) { CurrentId = uid; } public static PlayerLimits GetPlayerLimits(long uid) { if (!PlayerLimits.ContainsKey(uid)) { PlayerLimits[uid] = new PlayerLimits(1, 2, 4, new HashSet<Vector2i>()); } return PlayerLimits[uid]; } public static void SetPlayerLimits(long uid, int loadedArea, int activeArea, int generatedArea, HashSet<Vector2i> forceActive) { PlayerLimits[uid] = new PlayerLimits(loadedArea, activeArea, generatedArea, forceActive); MaxTotalArea = CalculateMaxTotal(); } public static void RemovePlayer(long uid) { PlayerLimits.Remove(uid); MaxTotalArea = CalculateMaxTotal(); } private static int CalculateMaxTotal() { return PlayerLimits.Values.Max((PlayerLimits limits) => limits.TotalArea); } public static int GetMaxTotal() { return MaxTotalArea; } public static PlayerLimits GetCurrent() { return GetPlayerLimits(CurrentId); } public static PlayerLimits GetLocalLimits() { return GetPlayerLimits(0L); } public static void UpdateLocalLimits() { SetPlayerLimits(0L, Configuration.LoadedArea, Configuration.ActiveArea, Configuration.GeneratedArea, Configuration.ForceActive); if (Object.op_Implicit((Object)(object)Player.m_localPlayer)) { SetPlayerLimits(Player.m_localPlayer.GetPlayerID(), Configuration.LoadedArea, Configuration.ActiveArea, Configuration.GeneratedArea, Configuration.ForceActive); SendPlayerLimitsToServer(); } } private static void SendPlayerLimitsToServer() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)ZNet.instance) || ZNet.instance.IsServer()) { return; } ZRpc serverRPC = ZNet.instance.GetServerRPC(); ZPackage val = new ZPackage(); val.Write(Configuration.LoadedArea); val.Write(Configuration.ActiveArea); val.Write(Configuration.GeneratedArea); val.Write(Configuration.ForceActive.Count); foreach (Vector2i item in Configuration.ForceActive) { val.Write(item); } if (serverRPC != null) { serverRPC.Invoke(RPC_PLAYERSETTINGS, new object[1] { val }); } } public static void RPC_PlayerSettings(ZRpc rpc, ZPackage pkg) { //IL_0056: Unknown result type (might be due to invalid IL or missing references) if (!ZNet.instance.IsServer()) { return; } ZNetPeer peer = ZNet.instance.GetPeer(rpc); int loadedArea = pkg.ReadInt(); int activeArea = pkg.ReadInt(); int generatedArea = Math.Min(Configuration.MaximumGeneratedArea, pkg.ReadInt()); HashSet<Vector2i> hashSet = new HashSet<Vector2i>(); if (Configuration.AllowForceActive) { int num = pkg.ReadInt(); for (int i = 0; i < num; i++) { hashSet.Add(pkg.ReadVector2i()); } } SetPlayerLimits(peer.m_uid, loadedArea, activeArea, generatedArea, hashSet); } } [HarmonyPatch(typeof(ZNet), "RPC_PeerInfo")] public class ZNet_RPC_PeerInfo_Patch { private static void Postfix(ZNet __instance, ZRpc rpc) { if (__instance.GetPeer(rpc).m_uid != 0L) { if (__instance.IsServer()) { rpc.Register<ZPackage>(LimitManager.RPC_PLAYERSETTINGS, (Action<ZRpc, ZPackage>)LimitManager.RPC_PlayerSettings); } else { LimitManager.UpdateLocalLimits(); } } } } [HarmonyPatch(typeof(ZNet), "Disconnect")] public class ZNet_Disconnect { private static void Postfix(ZNet __instance, ZNetPeer peer) { if (__instance.IsServer()) { LimitManager.RemovePlayer(peer.m_uid); } } } [HarmonyPatch(typeof(SpawnSystem), "GetNrOfInstances", new Type[] { typeof(GameObject), typeof(Vector3), typeof(float), typeof(bool), typeof(bool) })] public class SpawnLimits { private static void Prefix(ref Vector3 center, ref float maxRange) { //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) if (ZoneSystem.instance.m_activeArea != 2 && maxRange == 0f) { maxRange = 181f; if (center == Vector3.zero && Object.op_Implicit((Object)(object)ZNet.instance)) { center.x = ZNet.instance.m_referencePosition.x; center.y = ZNet.instance.m_referencePosition.y; center.z = ZNet.instance.m_referencePosition.z; } } } } [HarmonyPatch(typeof(Heightmap), "Initialize")] public class TerrainVisibility { private static void Postfix(Heightmap __instance) { Set(__instance); } private static void Set(Heightmap obj) { Material materialInstance = obj.m_materialInstance; int num = Configuration.RealTerrainVisibility; if (num == 0) { num = (int)(((double)Configuration.LoadedArea + 0.8) * 64.0); } if (Object.op_Implicit((Object)(object)materialInstance)) { materialInstance.SetFloat("_LodHideDistance", (float)num); } } public static void Update() { Heightmap[] array = Object.FindObjectsByType<Heightmap>((FindObjectsInactive)0, (FindObjectsSortMode)0); for (int i = 0; i < array.Length; i++) { Set(array[i]); } } } [HarmonyPatch(typeof(ZoneSystem))] public class ZoneSystemPatches { [HarmonyPatch("Awake")] [HarmonyPostfix] private static void Awake_Postfix(ZoneSystem __instance) { Set(__instance); } private static void Set(ZoneSystem obj) { PlayerLimits localLimits = LimitManager.GetLocalLimits(); obj.m_activeArea = localLimits.LoadedArea; obj.m_activeDistantArea = localLimits.GeneratedArea; } public static void Update() { if (Object.op_Implicit((Object)(object)ZoneSystem.instance)) { Set(ZoneSystem.instance); } } [HarmonyPatch("CreateLocalZones")] [HarmonyPostfix] private static void CreateLocalZones_Postfix(ZoneSystem __instance, ref bool __result) { //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_002b: Unknown result type (might be due to invalid IL or missing references) HashSet<Vector2i> forceActive = LimitManager.GetLocalLimits().ForceActive; if (forceActive.Count == 0 || __result) { return; } foreach (Vector2i item in forceActive) { if (__instance.PokeLocalZone(item)) { __result = true; break; } } } private static int GetTotalArea() { return LimitManager.GetMaxTotal(); } [HarmonyPatch("CreateGhostZones")] [HarmonyTranspiler] private static IEnumerable<CodeInstruction> CreateGhostZones_Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Expected O, but got Unknown return new CodeMatcher(instructions, (ILGenerator)null).MatchForward(false, (CodeMatch[])(object)new CodeMatch[2] { new CodeMatch((OpCode?)OpCodes.Ldarg_0, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(ZoneSystem), "m_activeArea"), (string)null) }).SetAndAdvance(OpCodes.Call, (object)AccessTools.Method(typeof(ZoneSystemPatches), "GetTotalArea", (Type[])null, (Type[])null)).SetOpcodeAndAdvance(OpCodes.Nop) .SetOpcodeAndAdvance(OpCodes.Nop) .SetOpcodeAndAdvance(OpCodes.Nop) .SetOpcodeAndAdvance(OpCodes.Nop) .InstructionEnumeration(); } [HarmonyPatch("IsActiveAreaLoaded")] [HarmonyPostfix] private static void IsActiveAreaLoaded_Postfix(ZoneSystem __instance, ref bool __result) { //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_0030: Unknown result type (might be due to invalid IL or missing references) HashSet<Vector2i> forceActive = LimitManager.GetLocalLimits().ForceActive; if (forceActive.Count == 0 || !__result) { return; } foreach (Vector2i item in forceActive) { if (!__instance.m_zones.ContainsKey(item)) { __result = false; break; } } } } [HarmonyPatch(typeof(ZNetScene))] public class ZNetScenePatches { [HarmonyPatch("InActiveArea", new Type[] { typeof(Vector2i), typeof(Vector2i) })] [HarmonyPrefix] private static bool InActiveArea_Prefix(Vector2i zone, Vector2i refCenterZone, ref bool __result) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: 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_0037: 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_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: 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) PlayerLimits current = LimitManager.GetCurrent(); if (current.ForceActive.Contains(zone)) { __result = true; return false; } int activeArea = current.ActiveArea; __result = zone.x >= refCenterZone.x - activeArea && zone.x <= refCenterZone.x + activeArea && zone.y <= refCenterZone.y + activeArea && zone.y >= refCenterZone.y - activeArea; return false; } [HarmonyPatch("InActiveArea", new Type[] { typeof(Vector2i), typeof(Vector2i), typeof(int) })] [HarmonyPrefix] private static bool InActiveArea2_Prefix(Vector2i zone, Vector2i refCenterZone, ref bool __result) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: 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_0037: 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_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: 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) PlayerLimits current = LimitManager.GetCurrent(); if (current.ForceActive.Contains(zone)) { __result = true; return false; } int activeArea = current.ActiveArea; __result = zone.x >= refCenterZone.x - activeArea && zone.x <= refCenterZone.x + activeArea && zone.y <= refCenterZone.y + activeArea && zone.y >= refCenterZone.y - activeArea; return false; } [HarmonyPatch("OutsideActiveArea", new Type[] { typeof(Vector3), typeof(Vector3) })] [HarmonyPrefix] private static bool OutsideActiveArea_Prefix(Vector3 point, Vector3 refPoint, ref bool __result) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0018: 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_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_002d: 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_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0043: 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_0053: Unknown result type (might be due to invalid IL or missing references) //IL_005d: 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) PlayerLimits current = LimitManager.GetCurrent(); int activeArea = current.ActiveArea; Vector2i zone = ZoneSystem.GetZone(point); if (current.ForceActive.Contains(zone)) { __result = false; return false; } Vector2i zone2 = ZoneSystem.GetZone(refPoint); __result = zone.x < zone2.x - activeArea || zone.x > zone2.x + activeArea || zone.y > zone2.y + activeArea || zone.y < zone2.y - activeArea; return false; } } [HarmonyPatch(typeof(ZDOMan))] public class ZDOManPatches { [HarmonyPatch("CreateSyncList")] [HarmonyPrefix] private static void CreateSyncList_Prefix(ZDOPeer peer) { LimitManager.SetCurrentPlayer(peer.m_peer.m_uid); } [HarmonyPatch("CreateSyncList")] [HarmonyPostfix] private static void CreateSyncList_Postfix() { LimitManager.SetCurrentPlayer(0L); } [HarmonyPatch("ReleaseNearbyZDOS")] [HarmonyPrefix] private static void ReleaseNearbyZDOS_Prefix(long uid) { LimitManager.SetCurrentPlayer(uid); } [HarmonyPatch("ReleaseNearbyZDOS")] [HarmonyPostfix] private static void ReleaseNearbyZDOS_Postfix() { LimitManager.SetCurrentPlayer(0L); } [HarmonyPatch("FindDistantObjects")] [HarmonyPrefix] private static bool FindDistantObjects_Prefix(Vector2i sector) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) return !LimitManager.GetCurrent().ForceActive.Contains(sector); } [HarmonyPatch("FindSectorObjects")] [HarmonyPrefix] private static void FindSectorObjects_Prefix(ref int area, ref int distantArea) { PlayerLimits current = LimitManager.GetCurrent(); area = current.LoadedArea; if (distantArea != 0) { distantArea = current.GeneratedArea; } } [HarmonyPatch("FindSectorObjects")] [HarmonyPostfix] private static void FindSectorObjects_Postfix(ZDOMan __instance, Vector2i sector, int area, List<ZDO> sectorObjects) { //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_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0066: 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_003b: 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_004b: 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_005b: Unknown result type (might be due to invalid IL or missing references) HashSet<Vector2i> forceActive = LimitManager.GetCurrent().ForceActive; if (forceActive.Count == 0) { return; } foreach (Vector2i item in forceActive) { if (item.x < sector.x - area || item.x > sector.x + area || item.y > sector.y + area || item.y < sector.y - area) { __instance.FindObjects(item, sectorObjects); } } } } [HarmonyPatch(typeof(ZDOPeer))] public class ZDOPeerPatches { [HarmonyPatch("ZDOSectorInvalidated")] [HarmonyPrefix] private static void CreateSyncList_Prefix(ZDOPeer __instance) { LimitManager.SetCurrentPlayer(__instance.m_peer.m_uid); } [HarmonyPatch("ZDOSectorInvalidated")] [HarmonyPostfix] private static void CreateSyncList_Postfix() { LimitManager.SetCurrentPlayer(0L); } } [BepInPlugin("render_limits", "Render Limits", "1.14")] public class RenderLimits : BaseUnityPlugin { private const string GUID = "render_limits"; private const string NAME = "Render Limits"; private const string VERSION = "1.14"; public void Awake() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) Configuration.Init(((BaseUnityPlugin)this).Config); new Harmony("render_limits").PatchAll(); } } [HarmonyPatch(typeof(GraphicsSettingsManager), "ApplyQualitySettings")] public class ApplyQualitySettings { private static void Postfix() { Configuration.InitSettings(); } } [HarmonyPatch(typeof(Terminal), "InitTerminal")] public class SetCommands { private static void Postfix() { new ForceActiveCommand(); } } }