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 LethalUtilities v1.2.21
LethalUtilities.dll
Decompiled 2 years ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using LethalUtilities.Configuration; using Newtonsoft.Json; using TMPro; using Unity.Netcode; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("LethalUtilities")] [assembly: AssemblyDescription("A Lethal Company mod made by Kyxino.")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Kyxino")] [assembly: AssemblyProduct("LethalUtilities")] [assembly: AssemblyCopyright("Copyright © 2023")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("d1273c8d-cadb-4ba8-9306-763e5ed6813c")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] public enum ClockType { Display12Hour, Display24Hour, DisplayMilitary } public enum RunConfig { Enabled, UseLoadSettings, ConfigDisabled } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } } namespace LethalEditor { internal class ConfigUtils { public static string MakeNameFileSafe(string FileName) { return (FileName == "") ? $"MISSING_NAME_{Random.Range(0, 1000)}" : Regex.Replace(FileName, "[\\/:*?\"<>|]", ""); } } internal class AnimationCurve_TypeConverter : TypeConverter { public AnimationCurve_TypeConverter() { ((TypeConverter)this).ConvertToObject = delegate(string input, Type type) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Expected O, but got Unknown //IL_02e4: Unknown result type (might be due to invalid IL or missing references) //IL_02eb: Expected O, but got Unknown //IL_02c5: Unknown result type (might be due to invalid IL or missing references) //IL_02c7: Unknown result type (might be due to invalid IL or missing references) if (type != typeof(AnimationCurve)) { return (object)new AnimationCurve(); } string text = Regex.Replace(input, "[\\s%()%[\\]]+", ""); string[] array2 = text.Split(new char[1] { ',' }); if (string.IsNullOrEmpty(array2[0])) { return (object)new AnimationCurve(); } Keyframe[] array3 = (Keyframe[])(object)new Keyframe[array2.Length]; Keyframe val2 = default(Keyframe); for (int j = 0; j < array3.Length; j++) { string[] array4 = array2[j].Split(new char[1] { ';' }); string[] array5 = ((array4 != null && array4.Length >= 1) ? ((array4 != null) ? array4[0]?.Split(new char[1] { ':' }) : null) : null); string[] array6 = ((array4 != null && array4.Length >= 2) ? ((array4 != null) ? array4[1]?.Split(new char[1] { '|' }) : null) : null); string[] array7 = ((array4 != null && array4.Length >= 3) ? ((array4 != null) ? array4[2]?.Split(new char[1] { ':' }) : null) : null); string[] array8 = ((array7 != null && array7.Length >= 2) ? ((array7 != null) ? array7[1] : null) : ((array7 != null) ? array7[0] : null))?.Split(new char[1] { '|' }); float result = (float.TryParse(((array5 != null) ? array5[0] : null) ?? "0", out result) ? result : 0f); float result2 = (float.TryParse((array5 != null && array5.Length >= 2) ? ((array5 != null) ? array5[1] : null) : "0", out result2) ? result2 : 0f); float result3 = (float.TryParse(((array6 != null) ? array6[0] : null) ?? "0", out result3) ? result3 : 0f); float result4 = (float.TryParse((array6 != null && array6.Length >= 2) ? ((array6 != null) ? array6[1] : null) : (((array6 != null) ? array6[0] : null) ?? "0"), out result4) ? result4 : 0f); float result5 = (float.TryParse(((array8 != null) ? array8[0] : null) ?? "0", out result5) ? result5 : 0f); float result6 = (float.TryParse((array8 != null && array8.Length >= 2) ? ((array8 != null) ? array8[1] : null) : (((array8 != null) ? array8[0] : null) ?? "0"), out result6) ? result6 : 0f); int result7 = (int.TryParse(((array7 != null) ? array7[0] : null) ?? "0", out result7) ? result7 : 0); ((Keyframe)(ref val2))..ctor(result, result2, result3, result4, result5, result6); ((Keyframe)(ref val2)).weightedMode = (WeightedMode)result7; array3[j] = val2; } return (object)new AnimationCurve(array3); }; ((TypeConverter)this).ConvertToString = delegate(object input, Type type) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0084: 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_00c6: Expected I4, but got Unknown if (type != typeof(AnimationCurve)) { return ""; } Keyframe[] keys = ((AnimationCurve)input).keys; if (keys.Length == 0) { return ""; } if (keys.Length == 1) { return ((Keyframe)(ref keys[0])).value.ToString(); } StringBuilder stringBuilder = new StringBuilder(); Keyframe[] array = keys; for (int i = 0; i < array.Length; i++) { Keyframe val = array[i]; float time = ((Keyframe)(ref val)).time; float value = ((Keyframe)(ref val)).value; float inTangent = ((Keyframe)(ref val)).inTangent; float outTangent = ((Keyframe)(ref val)).outTangent; float inWeight = ((Keyframe)(ref val)).inWeight; float outWeight = ((Keyframe)(ref val)).outWeight; int num = (int)((Keyframe)(ref val)).weightedMode; stringBuilder.Append($"{time}:{value}"); if (inTangent != 0f || outTangent != 0f) { if (inTangent == outTangent) { stringBuilder.Append($";({inTangent})"); } else { stringBuilder.Append($";({inTangent}|{outTangent})"); } if (inWeight != 0f || outWeight != 0f) { if (num != 0) { stringBuilder.Append($";{num}:"); } else { stringBuilder.Append(";"); } if (inWeight == outWeight) { stringBuilder.Append($"[{inWeight}]"); } else { stringBuilder.Append($"[{inWeight}|{outWeight}]"); } } else if (num != 0) { stringBuilder.Append($";{num}"); } } stringBuilder.Append(", "); } return stringBuilder.ToString(0, Math.Max(0, stringBuilder.Length - 2)); }; } } internal class StringArray_TypeConverter : TypeConverter { public StringArray_TypeConverter() { ((TypeConverter)this).ConvertToObject = (string input, Type type) => (type != typeof(string[])) ? new string[0] : JsonConvert.DeserializeObject<string[]>(input); ((TypeConverter)this).ConvertToString = (object input, Type type) => (type != typeof(string[])) ? "[]" : JsonConvert.SerializeObject(input); } } internal class Battery_TypeConverter : TypeConverter { public Battery_TypeConverter() { ((TypeConverter)this).ConvertToObject = (string input, Type type) => (type != typeof(Battery)) ? ((object)new Battery(false, 1f)) : ((object)JsonConvert.DeserializeObject<Battery>(input)); ((TypeConverter)this).ConvertToString = (object input, Type type) => (type != typeof(Battery)) ? JsonConvert.SerializeObject((object)new Battery(false, 1f)) : JsonConvert.SerializeObject(input); } } internal class IntWithRarityArray_TypeConverter : TypeConverter { public IntWithRarityArray_TypeConverter() { ((TypeConverter)this).ConvertToObject = delegate(string input, Type type) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Expected O, but got Unknown if (type != typeof(IntWithRarity[])) { return new IntWithRarity[0]; } Dictionary<int, int> dictionary2 = JsonConvert.DeserializeObject<Dictionary<int, int>>(input); List<IntWithRarity> list = new List<IntWithRarity>(); foreach (KeyValuePair<int, int> item in dictionary2) { list.Add(new IntWithRarity { id = item.Key, rarity = item.Value }); } return list.ToArray(); }; ((TypeConverter)this).ConvertToString = delegate(object input, Type type) { if (type != typeof(IntWithRarity[])) { return "{}"; } Dictionary<int, int> dictionary = new Dictionary<int, int>(); IntWithRarity[] array = (IntWithRarity[])input; foreach (IntWithRarity val in array) { dictionary.Add(val.id, val.rarity); } return JsonConvert.SerializeObject((object)dictionary); }; } } internal class CompatibleNounArray_TypeConverter : TypeConverter { public CompatibleNounArray_TypeConverter() { ((TypeConverter)this).ConvertToObject = delegate(string input, Type type) { //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Expected O, but got Unknown if (type != typeof(CompatibleNoun[])) { return new CompatibleNoun[0]; } Dictionary<string, string> dictionary2 = JsonConvert.DeserializeObject<Dictionary<string, string>>(input); List<CompatibleNoun> list = new List<CompatibleNoun>(); foreach (KeyValuePair<string, string> PAIR in dictionary2) { IEnumerable<TerminalKeyword> source = from X in Resources.FindObjectsOfTypeAll<TerminalKeyword>() where ConfigUtils.MakeNameFileSafe(((Object)X).name) == PAIR.Key select X; IEnumerable<TerminalNode> source2 = from X in Resources.FindObjectsOfTypeAll<TerminalNode>() where ConfigUtils.MakeNameFileSafe(((Object)X).name) == PAIR.Value select X; list.Add(new CompatibleNoun { noun = ((source.Count() > 0) ? source.First() : null), result = ((source2.Count() > 0) ? source2.First() : null) }); } return list.ToArray(); }; ((TypeConverter)this).ConvertToString = delegate(object input, Type type) { if (type != typeof(CompatibleNoun[])) { return "{}"; } Dictionary<string, string> dictionary = new Dictionary<string, string>(); CompatibleNoun[] array = (CompatibleNoun[])input; foreach (CompatibleNoun val in array) { if (!((Object)(object)val.noun == (Object)null)) { TerminalKeyword noun = val.noun; if (!dictionary.ContainsKey(((noun != null) ? ((Object)noun).name : null) ?? "")) { TerminalKeyword noun2 = val.noun; string key = ((noun2 != null) ? ((Object)noun2).name : null) ?? ""; TerminalNode result = val.result; dictionary.Add(key, ((result != null) ? ((Object)result).name : null) ?? ""); } } } return JsonConvert.SerializeObject((object)dictionary); }; } } internal class TerminalKeyword_TypeConverter : TypeConverter { public TerminalKeyword_TypeConverter() { ((TypeConverter)this).ConvertToObject = delegate(string input, Type type) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown if (type != typeof(TerminalKeyword)) { return (object)new TerminalKeyword(); } IEnumerable<TerminalKeyword> source = from X in Resources.FindObjectsOfTypeAll<TerminalKeyword>() where ConfigUtils.MakeNameFileSafe(((Object)X).name) == input select X; return (source.Count() > 0) ? source.First() : null; }; ((TypeConverter)this).ConvertToString = (object input, Type type) => (type != typeof(TerminalKeyword)) ? "" : ((Object)(TerminalKeyword)input).name; } } internal class TerminalNode_TypeConverter : TypeConverter { public TerminalNode_TypeConverter() { ((TypeConverter)this).ConvertToObject = delegate(string input, Type type) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown if (type != typeof(TerminalNode)) { return (object)new TerminalNode(); } IEnumerable<TerminalNode> source = from X in Resources.FindObjectsOfTypeAll<TerminalNode>() where ConfigUtils.MakeNameFileSafe(((Object)X).name) == input select X; return (source.Count() > 0) ? source.First() : null; }; ((TypeConverter)this).ConvertToString = (object input, Type type) => (type != typeof(TerminalNode)) ? "" : ((Object)(TerminalNode)input).name; } } internal class SpawnableEnemyWithRarityArray_TypeConverter : TypeConverter { public SpawnableEnemyWithRarityArray_TypeConverter() { ((TypeConverter)this).ConvertToObject = delegate(string input, Type type) { //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Expected O, but got Unknown if (type != typeof(SpawnableEnemyWithRarity[])) { return new SpawnableEnemyWithRarity[0]; } Dictionary<string, int> dictionary2 = JsonConvert.DeserializeObject<Dictionary<string, int>>(input); List<SpawnableEnemyWithRarity> list = new List<SpawnableEnemyWithRarity>(); foreach (KeyValuePair<string, int> PAIR in dictionary2) { IEnumerable<EnemyType> source = from X in Resources.FindObjectsOfTypeAll<EnemyType>() where ConfigUtils.MakeNameFileSafe(X.enemyName) == PAIR.Key select X; list.Add(new SpawnableEnemyWithRarity { enemyType = ((source.Count() > 0) ? source.First() : null), rarity = PAIR.Value }); } return list.ToArray(); }; ((TypeConverter)this).ConvertToString = delegate(object input, Type type) { if (type != typeof(SpawnableEnemyWithRarity[])) { return "{}"; } Dictionary<string, int> dictionary = new Dictionary<string, int>(); SpawnableEnemyWithRarity[] array = (SpawnableEnemyWithRarity[])input; foreach (SpawnableEnemyWithRarity val in array) { string key = val.enemyType?.enemyName ?? "LE-MISSING"; if (dictionary.ContainsKey(key)) { dictionary[key] += val.rarity; } else { dictionary.Add(key, val.rarity); } } return JsonConvert.SerializeObject((object)dictionary); }; } } internal class SpawnableItemWithRarityArray_TypeConverter : TypeConverter { public SpawnableItemWithRarityArray_TypeConverter() { ((TypeConverter)this).ConvertToObject = delegate(string input, Type type) { //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Expected O, but got Unknown if (type != typeof(SpawnableItemWithRarity[])) { return new SpawnableItemWithRarity[0]; } Dictionary<string, int> dictionary2 = JsonConvert.DeserializeObject<Dictionary<string, int>>(input); List<SpawnableItemWithRarity> list = new List<SpawnableItemWithRarity>(); foreach (KeyValuePair<string, int> PAIR in dictionary2) { IEnumerable<Item> source = from X in Resources.FindObjectsOfTypeAll<Item>() where ConfigUtils.MakeNameFileSafe(X.itemName) == PAIR.Key select X; list.Add(new SpawnableItemWithRarity { spawnableItem = ((source.Count() > 0) ? source.First() : null), rarity = PAIR.Value }); } return list.ToArray(); }; ((TypeConverter)this).ConvertToString = delegate(object input, Type type) { if (type != typeof(SpawnableItemWithRarity[])) { return "{}"; } Dictionary<string, int> dictionary = new Dictionary<string, int>(); SpawnableItemWithRarity[] array = (SpawnableItemWithRarity[])input; foreach (SpawnableItemWithRarity val in array) { string key = val.spawnableItem?.itemName ?? "LE-MISSING"; if (dictionary.ContainsKey(key)) { dictionary[key] += val.rarity; } else { dictionary.Add(key, val.rarity); } } return JsonConvert.SerializeObject((object)dictionary); }; } } internal class SpawnableEnemyWithRarityList_TypeConverter : TypeConverter { public SpawnableEnemyWithRarityList_TypeConverter() { ((TypeConverter)this).ConvertToObject = delegate(string input, Type type) { //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_0087: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Expected O, but got Unknown if (type != typeof(List<SpawnableEnemyWithRarity>)) { return new List<SpawnableEnemyWithRarity>(); } Dictionary<string, int> dictionary2 = JsonConvert.DeserializeObject<Dictionary<string, int>>(input); List<SpawnableEnemyWithRarity> list = new List<SpawnableEnemyWithRarity>(); foreach (KeyValuePair<string, int> PAIR in dictionary2) { IEnumerable<EnemyType> source = from X in Resources.FindObjectsOfTypeAll<EnemyType>() where ConfigUtils.MakeNameFileSafe(X.enemyName) == PAIR.Key select X; list.Add(new SpawnableEnemyWithRarity { enemyType = ((source.Count() > 0) ? source.First() : null), rarity = PAIR.Value }); } return list; }; ((TypeConverter)this).ConvertToString = delegate(object input, Type type) { if (type != typeof(List<SpawnableEnemyWithRarity>)) { return "{}"; } Dictionary<string, int> dictionary = new Dictionary<string, int>(); foreach (SpawnableEnemyWithRarity item in (List<SpawnableEnemyWithRarity>)input) { string key = item.enemyType?.enemyName ?? "LE-MISSING"; if (dictionary.ContainsKey(key)) { dictionary[key] += item.rarity; } else { dictionary.Add(key, item.rarity); } } return JsonConvert.SerializeObject((object)dictionary); }; } } internal class SpawnableItemWithRarityList_TypeConverter : TypeConverter { public SpawnableItemWithRarityList_TypeConverter() { ((TypeConverter)this).ConvertToObject = delegate(string input, Type type) { //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_0087: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Expected O, but got Unknown if (type != typeof(List<SpawnableItemWithRarity>)) { return new List<SpawnableItemWithRarity>(); } Dictionary<string, int> dictionary2 = JsonConvert.DeserializeObject<Dictionary<string, int>>(input); List<SpawnableItemWithRarity> list = new List<SpawnableItemWithRarity>(); foreach (KeyValuePair<string, int> PAIR in dictionary2) { IEnumerable<Item> source = from X in Resources.FindObjectsOfTypeAll<Item>() where ConfigUtils.MakeNameFileSafe(X.itemName) == PAIR.Key select X; list.Add(new SpawnableItemWithRarity { spawnableItem = ((source.Count() > 0) ? source.First() : null), rarity = PAIR.Value }); } return list; }; ((TypeConverter)this).ConvertToString = delegate(object input, Type type) { if (type != typeof(List<SpawnableItemWithRarity>)) { return "{}"; } Dictionary<string, int> dictionary = new Dictionary<string, int>(); foreach (SpawnableItemWithRarity item in (List<SpawnableItemWithRarity>)input) { string key = item.spawnableItem?.itemName ?? "LE-MISSING"; if (dictionary.ContainsKey(key)) { dictionary[key] += item.rarity; } else { dictionary.Add(key, item.rarity); } } return JsonConvert.SerializeObject((object)dictionary); }; } } internal class EnemyType_TypeConverter : TypeConverter { public EnemyType_TypeConverter() { ((TypeConverter)this).ConvertToObject = delegate(string input, Type type) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown if (type != typeof(EnemyType)) { return (object)new EnemyType(); } IEnumerable<EnemyType> source = from X in Resources.FindObjectsOfTypeAll<EnemyType>() where ConfigUtils.MakeNameFileSafe(X.enemyName) == input select X; return (source.Count() > 0) ? source.First() : null; }; ((TypeConverter)this).ConvertToString = (object input, Type type) => (type != typeof(EnemyType)) ? "" : ((EnemyType)input).enemyName; } } internal class ItemGroupList_TypeConverter : TypeConverter { public ItemGroupList_TypeConverter() { ((TypeConverter)this).ConvertToObject = delegate(string input, Type type) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Expected O, but got Unknown if (type != typeof(List<ItemGroup>)) { return new List<ItemGroup>(); } List<ItemGroup> list2 = new List<ItemGroup>(); foreach (string item in JsonConvert.DeserializeObject<List<string>>(input)) { list2.Add(new ItemGroup { name = item }); } return list2; }; ((TypeConverter)this).ConvertToString = delegate(object input, Type type) { if (type != typeof(List<ItemGroup>)) { return "{}"; } List<string> list = new List<string>(); foreach (ItemGroup item2 in (List<ItemGroup>)input) { list.Add(((Object)item2).name); } return JsonConvert.SerializeObject((object)list); }; } } internal class RandomWeatherWithVariablesArray_TypeConverter : TypeConverter { public RandomWeatherWithVariablesArray_TypeConverter() { ((TypeConverter)this).ConvertToObject = delegate(string input, Type type) { //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_005d: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Expected O, but got Unknown //IL_00b3: Expected O, but got I4 //IL_005f->IL005f: Incompatible stack types: O vs I4 //IL_005d->IL005f: Incompatible stack types: I4 vs O //IL_005d->IL005f: Incompatible stack types: O vs I4 if (type != typeof(RandomWeatherWithVariables[])) { return new RandomWeatherWithVariables[0]; } Dictionary<string, List<int>> dictionary2 = JsonConvert.DeserializeObject<Dictionary<string, List<int>>>(input); List<RandomWeatherWithVariables> list = new List<RandomWeatherWithVariables>(); foreach (KeyValuePair<string, List<int>> item in dictionary2) { object obj = list; ? val2 = new RandomWeatherWithVariables(); val2 = val2; int num; if (!Enum.TryParse<LevelWeatherType>(item.Key, out LevelWeatherType result)) { num = -1; obj = num; num = (int)obj; } else { obj = result; num = (int)obj; } ((RandomWeatherWithVariables)val2).weatherType = (LevelWeatherType)obj; ((RandomWeatherWithVariables)val2).weatherVariable = ((item.Value.Count > 0) ? item.Value[0] : 0); ((RandomWeatherWithVariables)val2).weatherVariable2 = ((item.Value.Count > 1) ? item.Value[1] : 0); ((List<RandomWeatherWithVariables>)num).Add((RandomWeatherWithVariables)val2); } return list.ToArray(); }; ((TypeConverter)this).ConvertToString = delegate(object input, Type type) { if (type != typeof(RandomWeatherWithVariables[])) { return "{}"; } Dictionary<string, List<int>> dictionary = new Dictionary<string, List<int>>(); RandomWeatherWithVariables[] array = (RandomWeatherWithVariables[])input; foreach (RandomWeatherWithVariables val in array) { dictionary.Add(((object)(LevelWeatherType)(ref val.weatherType)).ToString(), new List<int> { val.weatherVariable, val.weatherVariable2 }); } return JsonConvert.SerializeObject((object)dictionary); }; } } } namespace LethalUtilities { public enum MapLevel { None = -1, CompanyBuilding = 3, Level1Experimentation = 0, Level2Assurance = 1, Level3Vow = 2, Level7Offense = 7, Level4March = 4, Level5Rend = 5, Level6Dine = 6, Level8Titan = 8 } internal static class MapSettings { public static ConfigEntry<bool> ConfigEnabled = UtilsMod.MapConfig.Bind("Active Settings", "ConfigEnabled", defaultValue: false, "Whether or not the MapConfig executes.", 0); public static ConfigEntry<bool> ScrapModifiersEnabled = UtilsMod.MapConfig.Bind("Active Settings", "ScrapModifiersEnabled", defaultValue: false, "Whether or not the scrap multipliers apply.", 0); public static ConfigEntry<bool> MapModifiersEnabled = UtilsMod.MapConfig.Bind("Active Settings", "MapModifiersEnabled", defaultValue: false, "Whether or not the map multipliers apply.", 0); public static ConfigEntry<bool> TimeModifiersEnabled = UtilsMod.MapConfig.Bind("Active Settings", "TimeModifiersEnabled", defaultValue: false, "Whether or not the time multipliers apply.", 0); public static ConfigEntry<bool> SpawnModifiersEnabled = UtilsMod.MapConfig.Bind("Active Settings", "SpawnModifiersEnabled", defaultValue: false, "Whether or not the map spawn modifiers will apply.", 0); public static ConfigEntry<float> ScrapAmountScalar = UtilsMod.MapConfig.Bind("Global Map Settings", "ScrapAmountScalar", 1f, "The overall multiplier of spawned scrap.\n(Multiplies on top of individual scalars.)", 1); public static ConfigEntry<float> ScrapValueScalar = UtilsMod.MapConfig.Bind("Global Map Settings", "ScrapValueScalar", 0.4f, "The overall multiplier of scrap value.\n(Multiplies on top of individual scalars.)", 1); public static ConfigEntry<float> MapScalar = UtilsMod.MapConfig.Bind("Global Map Settings", "MapScalar", 1f, "The overall map scale.\nValues under 1 will be capped off at 1 before applying because it crashes the game.\n(Multiplies on top of individual scalars.)", 1); public static ConfigEntry<float> DayScalar = UtilsMod.MapConfig.Bind("Global Map Settings", "DayScalar", 1f, "[LU-DEPRECATED]: Please use TimeSpeedScalar instead or individual map time settings.\nThe overall map day speed multiplier.\n(Ex: 0 starts at 6:00AM, 1 starts at 7:40AM, disregarding ship landing time.)\n(Multiplies on top of individual scalars.)", 1); public static ConfigEntry<float> TimeSpeedScalar = UtilsMod.MapConfig.Bind("Global Map Settings", "TimeSpeedScalar", 1.4f, "The overall time speed multiplier.\n(Multiplies on top of individual scalars.)", 1); public static Dictionary<MapLevel, Dictionary<string, ConfigEntryBase>> Settings = new Dictionary<MapLevel, Dictionary<string, ConfigEntryBase>> { [MapLevel.Level1Experimentation] = AddMapSettings("Experimentation", 11, 1f, 0f, 1f, 4f, 5f, 8, 12, 4, 8, 5, 51, 58, 28, 13, 16, 31, 1, 28, 1, 0, 0, 0, 0, 75, 0, 56, 0, 22, 74, 52), [MapLevel.Level2Assurance] = AddMapSettings("Assurance", 12, 1f, 0f, 1f, 3f, 10f, 13, 17, 6, 8, 7, 93, 69, 78, 14, 24, 28, 1, 14, 1, 0, 0, 0, 0, 78, 1, 95, 20, 58, 100, 43), [MapLevel.Level3Vow] = AddMapSettings("Vow", 13, 2.5f, 0f, 1.15f, 3f, 7f, 10, 13, 7, 6, 17, 61, 40, 63, 80, 9, 28, 0, 19, 0, 6, 0, 0, 0, 4, 100, 18, 0, 61, 100, 67), [MapLevel.Level7Offense] = AddMapSettings("Offense", 15, 2f, 0f, 1.25f, 4f, 10f, 14, 18, 12, 8, 20, 27, 44, 16, 3, 55, 32, 0, 7, 2, 25, 0, 0, 0, 100, 9, 37, 60, 58, 100, 43), [MapLevel.Level4March] = AddMapSettings("March", 16, 2.75f, 0f, 2f, 4f, 7f, 13, 17, 14, 12, 20, 38, 64, 36, 56, 74, 15, 0, 9, 3, 10, 1, 0, 0, 38, 64, 16, 72, 72, 83, 49), [MapLevel.Level5Rend] = AddMapSettings("Rend", 17, 2.7f, 0f, 1.2f, 3f, 10f, 18, 26, 10, 6, 20, 31, 43, 0, 51, 0, 6, 20, 7, 100, 70, 69, 0, 25, 74, 60, 18), [MapLevel.Level6Dine] = AddMapSettings("Dine", 18, 2.7f, 0f, 1.3f, 4f, 10f, 20, 28, 15, 6, 20, 52, 64, 48, 25, 48, 39, 18, 16, 60, 53, 66, 0, 0, 79, 28, 57), [MapLevel.Level8Titan] = AddMapSettings("Titan", 19, 6f, 0f, 2.35f, 2f, 10f, 23, 38, 18, 7, 20, 54, 59, 38, 62, 54, 20, 28, 16, 32, 59, 71, 0, 32, 80, 32, 4) }; private static ConfigEntry<T> NewFormattedEntry<T>(string PrefixName, string Variable, T DefaultValue, string Description, int Order = -1) { return UtilsMod.MapConfig.Bind(PrefixName + " Settings", Variable ?? "", DefaultValue, Description.Replace("$VAR", Variable), Order); } private static Dictionary<string, ConfigEntryBase> AddMapSettings(string MapName, int Order = -1, float TimeToArrive = 1f, float OffsetFromGlobalTime = 0f, float FactorySizeMultiplier = 1f, float SpawnProbabilityRange = 1f, float DaytimeEnemiesProbabilityRange = 1f, int MinScrapAmount = 0, int MaxScrapAmount = 0, int MaxEnemyPower = 10, int MaxOutsideEnemyPower = 10, int MaxDaytimeEnemyPower = 20, int Centipede = 0, int SandSpider = 0, int HoarderBug = 0, int Flowerman = 0, int Crawler = 0, int Blob = 0, int DressGirl = 0, int Puffer = 0, int Nutcracker = 0, int SpringMan = 0, int Jester = 0, int LassoMan = 0, int Mask = 0, int MouthDog = 0, int ForestGiant = 0, int SandWorm = 0, int BaboonHawk = 0, int RedLocustBees = 0, int Doublewing = 0, int DocileLocustBees = 0) { return new Dictionary<string, ConfigEntryBase> { ["ScrapAmountScalar"] = NewFormattedEntry(MapName + " Scrap", "ScrapAmountScalar", 1f, "The " + MapName + " multiplier of spawned scrap.", Order), ["ScrapValueScalar"] = NewFormattedEntry(MapName + " Scrap", "ScrapValueScalar", 1f, "The " + MapName + " multiplier of scrap value.", Order), ["MapScalar"] = NewFormattedEntry(MapName + " Map", "MapScalar", 1f, "The " + MapName + " scalar of the inside.\nValues under 1 will be capped off at 1 before applying because it crashes the game.", Order), ["DayScalar"] = NewFormattedEntry(MapName + " Time", "DayScalar", 1f, "[LU-DEPRECATED]: Please use TimeSpeedScalar instead or individual map time settings.\nThe " + MapName + " speed scalar of the day.\n(Ex: 0 starts at 6:00AM, 1 starts at 7:40AM, disregarding ship landing time.)", Order), ["TimeSpeedScalar"] = NewFormattedEntry(MapName + " Time", "TimeSpeedScalar", 1f, "The " + MapName + " time scalar of the day.", Order), ["LengthOfHours"] = NewFormattedEntry(MapName + " Time", "LengthOfHours", 100f, "The " + MapName + " length of hours.", Order), ["NumberOfHours"] = NewFormattedEntry(MapName + " Time", "NumberOfHours", 7, "The " + MapName + " number of hours. (I think this is for day time?)", Order), ["TimeToArrive"] = NewFormattedEntry(MapName + " Time", "TimeToArrive", TimeToArrive, "The " + MapName + " $VAR.", Order), ["OffsetFromGlobalTime"] = NewFormattedEntry(MapName + " Time", "OffsetFromGlobalTime", OffsetFromGlobalTime, "The " + MapName + " $VAR.", Order), ["SpawnProbabilityRange"] = NewFormattedEntry(MapName + " Spawn", "SpawnProbabilityRange", SpawnProbabilityRange, "(Careful) The " + MapName + " $VAR.", Order), ["DaytimeEnemiesProbabilityRange"] = NewFormattedEntry(MapName + " Spawn", "DaytimeEnemiesProbabilityRange", DaytimeEnemiesProbabilityRange, "(Careful) The " + MapName + " $VAR.", Order), ["MinScrapAmount"] = NewFormattedEntry(MapName + " Scrap", "MinScrapAmount", MinScrapAmount, "The " + MapName + " $VAR.", Order), ["MaxScrapAmount"] = NewFormattedEntry(MapName + " Scrap", "MaxScrapAmount", MaxScrapAmount, "The " + MapName + " $VAR.", Order), ["MinEnemiesToSpawn"] = NewFormattedEntry(MapName + " Spawn", "MinEnemiesToSpawn", 0, "(Careful) The " + MapName + " $VAR.", Order), ["MinOutsideEnemiesToSpawn"] = NewFormattedEntry(MapName + " Spawn", "MinOutsideEnemiesToSpawn", 0, "(Careful) The " + MapName + " $VAR.", Order), ["HourTimeBetweenEnemySpawnBatches"] = NewFormattedEntry(MapName + " Spawn", "HourTimeBetweenEnemySpawnBatches", 2, "The " + MapName + " $VAR.", Order), ["MaxEnemyPower"] = NewFormattedEntry(MapName + " Spawn", "MaxInsideEnemyPower", MaxEnemyPower, "(Careful) The " + MapName + " $VAR.", Order), ["MaxOutsideEnemyPower"] = NewFormattedEntry(MapName + " Spawn", "MaxOutsideEnemyPower", MaxOutsideEnemyPower, "(Careful) The " + MapName + " $VAR.", Order), ["MaxDaytimeEnemyPower"] = NewFormattedEntry(MapName + " Spawn", "MaxDaytimeEnemyPower", MaxDaytimeEnemyPower, "(Careful) The " + MapName + " $VAR.", Order), ["CentipedeSpawnWeight"] = NewFormattedEntry(MapName + " Spawn", "CentipedeSpawnWeight", Centipede, "(Inside) The " + MapName + " $VAR.", Order), ["Bunker SpiderSpawnWeight"] = NewFormattedEntry(MapName + " Spawn", "SandSpiderSpawnWeight", SandSpider, "(Inside) The " + MapName + " $VAR.", Order), ["Hoarding bugSpawnWeight"] = NewFormattedEntry(MapName + " Spawn", "HoarderBugSpawnWeight", HoarderBug, "(Inside) The " + MapName + " $VAR.", Order), ["FlowermanSpawnWeight"] = NewFormattedEntry(MapName + " Spawn", "FlowermanSpawnWeight", Flowerman, "(Inside) The " + MapName + " $VAR.", Order), ["CrawlerSpawnWeight"] = NewFormattedEntry(MapName + " Spawn", "CrawlerSpawnWeight", Crawler, "(Inside) The " + MapName + " $VAR.", Order), ["BlobSpawnWeight"] = NewFormattedEntry(MapName + " Spawn", "BlobSpawnWeight", Blob, "(Inside) The " + MapName + " $VAR.", Order), ["GirlSpawnWeight"] = NewFormattedEntry(MapName + " Spawn", "DressGirlSpawnWeight", DressGirl, "(Inside) The " + MapName + " $VAR.", Order), ["PufferSpawnWeight"] = NewFormattedEntry(MapName + " Spawn", "PufferSpawnWeight", Puffer, "(Inside) The " + MapName + " $VAR.", Order), ["NutcrackerSpawnWeight"] = NewFormattedEntry(MapName + " Spawn", "NutcrackerSpawnWeight", Nutcracker, "(Inside) The " + MapName + " $VAR.", Order), ["SpringSpawnWeight"] = NewFormattedEntry(MapName + " Spawn", "SpringManSpawnWeight", SpringMan, "(Inside) The " + MapName + " $VAR.", Order), ["JesterSpawnWeight"] = NewFormattedEntry(MapName + " Spawn", "JesterSpawnWeight", Jester, "(Inside) The " + MapName + " $VAR.", Order), ["LassoSpawnWeight"] = NewFormattedEntry(MapName + " Spawn", "LassoManSpawnWeight", LassoMan, "(Inside) The " + MapName + " $VAR.", Order), ["MaskedSpawnWeight"] = NewFormattedEntry(MapName + " Spawn", "MaskSpawnWeight", Mask, "(Inside) The " + MapName + " $VAR.", Order), ["MouthDogSpawnWeight"] = NewFormattedEntry(MapName + " Spawn", "MouthDogSpawnWeight", MouthDog, "(Outside) The " + MapName + " $VAR.", Order), ["ForestGiantSpawnWeight"] = NewFormattedEntry(MapName + " Spawn", "ForestGiantSpawnWeight", ForestGiant, "(Outside) The " + MapName + " $VAR.", Order), ["Earth LeviathanSpawnWeight"] = NewFormattedEntry(MapName + " Spawn", "SandWormSpawnWeight", SandWorm, "(Outside) The " + MapName + " $VAR.", Order), ["Baboon hawkSpawnWeight"] = NewFormattedEntry(MapName + " Spawn", "BaboonHawkSpawnWeight", BaboonHawk, "(Outside) The " + MapName + " $VAR.", Order), ["Red Locust BeesSpawnWeight"] = NewFormattedEntry(MapName + " Spawn", "RedLocustBeesSpawnWeight", RedLocustBees, "(Daytime) The " + MapName + " $VAR.", Order), ["ManticoilSpawnWeight"] = NewFormattedEntry(MapName + " Spawn", "DoublewingSpawnWeight", Doublewing, "(Daytime) (Manticoil) The " + MapName + " $VAR.", Order), ["Docile Locust BeesSpawnWeight"] = NewFormattedEntry(MapName + " Spawn", "DocileLocustBeesSpawnWeight", DocileLocustBees, "(Daytime) The " + MapName + " $VAR.", Order) }; } } internal class MapPatch { [HarmonyPatch(typeof(RoundManager), "GenerateNewFloor")] [HarmonyPrefix] private static void PatchLevelMultiplierSettings(RoundManager __instance) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) float num = (float)MapSettings.MapScalar.DefaultValue; MapLevel levelID = (MapLevel)__instance.currentLevel.levelID; LevelWeatherType currentWeather = __instance.currentLevel.currentWeather; if (MapSettings.MapModifiersEnabled.Value) { num = MapSettings.MapScalar.Value; if (MapSettings.Settings.ContainsKey(levelID)) { Dictionary<string, ConfigEntryBase> dictionary = MapSettings.Settings[levelID]; num *= (dictionary["MapScalar"] as ConfigEntry<float>).Value; } } else if (MapSettings.Settings.ContainsKey(levelID)) { Dictionary<string, ConfigEntryBase> dictionary2 = MapSettings.Settings[levelID]; num *= (float)(dictionary2["MapScalar"] as ConfigEntry<float>).DefaultValue; } if (WeatherSettings.MapModifiersEnabled.Value && WeatherSettings.Settings.ContainsKey(currentWeather)) { Dictionary<string, ConfigEntryBase> dictionary3 = WeatherSettings.Settings[currentWeather]; num *= (dictionary3["MapScalar"] as ConfigEntry<float>).Value; } __instance.mapSizeMultiplier = Mathf.Max(num, 1f); } } internal static class TimeSettings { } internal class TimePatch { [HarmonyPatch(typeof(TimeOfDay), "Update")] [HarmonyPrefix] public static void Update(TimeOfDay __instance, bool ___timeStartedThisFrame) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) if (!__instance.currentDayTimeStarted || !___timeStartedThisFrame) { return; } MapLevel levelID = (MapLevel)__instance.currentLevel.levelID; LevelWeatherType currentWeather = __instance.currentLevel.currentWeather; float num = 1f; float num2 = 1.4f; if (MapSettings.ConfigEnabled.Value && MapSettings.TimeModifiersEnabled.Value) { num = MapSettings.DayScalar.Value; num2 = MapSettings.TimeSpeedScalar.Value; if (MapSettings.Settings.ContainsKey(levelID)) { Dictionary<string, ConfigEntryBase> dictionary = MapSettings.Settings[levelID]; num *= (dictionary["DayScalar"] as ConfigEntry<float>).Value; num2 *= (dictionary["TimeSpeedScalar"] as ConfigEntry<float>).Value; __instance.lengthOfHours = (dictionary["LengthOfHours"] as ConfigEntry<float>).Value; __instance.numberOfHours = (dictionary["NumberOfHours"] as ConfigEntry<int>).Value; } } if (WeatherSettings.ConfigEnabled.Value && WeatherSettings.TimeModifiersEnabled.Value && WeatherSettings.Settings.TryGetValue(currentWeather, out var value)) { num *= (value["DayScalar"] as ConfigEntry<float>).Value; num2 *= (value["TimeSpeedScalar"] as ConfigEntry<float>).Value; } __instance.currentLevel.DaySpeedMultiplier = num; __instance.globalTimeSpeedMultiplier = num2; UtilsMod.MLS.LogWarning((object)"IT'S A BRAND NEW DAYYYYYYY."); } [HarmonyPatch(typeof(RoundManager), "LoadNewLevel")] [HarmonyPrefix] [HarmonyPriority(1114)] private static void TimePatchLoadNewLevel(ref SelectableLevel newLevel) { if (MapSettings.TimeModifiersEnabled.Value && MapSettings.Settings.TryGetValue((MapLevel)newLevel.levelID, out var value)) { newLevel.timeToArrive = ((ConfigEntry<float>)value["TimeToArrive"]).Value; newLevel.OffsetFromGlobalTime = ((ConfigEntry<float>)value["OffsetFromGlobalTime"]).Value; } } } internal static class WeatherSettings { public static ConfigEntry<bool> ConfigEnabled = UtilsMod.WeatherConfig.Bind("Active Settings", "ConfigEnabled", defaultValue: false, "Whether or not the WeatherConfig executes."); public static ConfigEntry<bool> ScrapModifiersEnabled = UtilsMod.WeatherConfig.Bind("Active Settings", "ScrapModifiersEnabled", defaultValue: false, "Whether or not the scrap multipliers apply."); public static ConfigEntry<bool> MapModifiersEnabled = UtilsMod.WeatherConfig.Bind("Active Settings", "MapModifiersEnabled", defaultValue: false, "Whether or not the map multipliers apply. (Why not? Make Eclipsed have giant maps if you want.)"); public static ConfigEntry<bool> TimeModifiersEnabled = UtilsMod.WeatherConfig.Bind("Active Settings", "TimeModifiersEnabled", defaultValue: false, "Whether or not the time multipliers apply."); public static ConfigEntry<bool> SpawnModifiersEnabled = UtilsMod.WeatherConfig.Bind("Active Settings", "SpawnModifiersEnabled", defaultValue: false, "Whether or not the weather spawn modifiers will apply. (Will set default values beforehand for compatibility/stability reasons.)"); public static Dictionary<LevelWeatherType, Dictionary<string, ConfigEntryBase>> Settings = new Dictionary<LevelWeatherType, Dictionary<string, ConfigEntryBase>> { [(LevelWeatherType)(-1)] = AddMapSettings("Normal"), [(LevelWeatherType)0] = AddMapSettings("Dusty"), [(LevelWeatherType)1] = AddMapSettings("Rainy"), [(LevelWeatherType)2] = AddMapSettings("Stormy"), [(LevelWeatherType)3] = AddMapSettings("Foggy"), [(LevelWeatherType)4] = AddMapSettings("Flooded"), [(LevelWeatherType)5] = AddMapSettings("Eclipsed") }; private static ConfigEntry<float> NewFloatEntryWithMapVar(string PrefixName, string Variable, string AddPrefixToNew, float DefaultValue, string Description) { ConfigDefinition configDefinition = new ConfigDefinition(PrefixName + " Weather Settings", ((PrefixName == "Normal") ? "DefaultWeather" : PrefixName) + Variable); ConfigEntry<float> configEntry = UtilsMod.WeatherConfig.Bind(configDefinition, DefaultValue); ConfigEntry<float> configEntry2 = UtilsMod.WeatherConfig.Bind(PrefixName + " " + AddPrefixToNew + " Settings", Variable, DefaultValue, Description.Replace("$VAR", Variable)); if (configEntry.Value != (float)configEntry.DefaultValue && configEntry2.Value == (float)configEntry2.DefaultValue) { configEntry2.Value = configEntry.Value; } UtilsMod.WeatherConfig.Remove(configDefinition); UtilsMod.WeatherConfig.Save(); return configEntry2; } private static ConfigEntry<T> NewEntry<T>(string PrefixName, string Variable, T DefaultValue, string Description) { return UtilsMod.WeatherConfig.Bind(PrefixName + " Settings", Variable ?? "", DefaultValue, Description.Replace("$VAR", Variable)); } private static Dictionary<string, ConfigEntryBase> AddMapSettings(string WeatherType) { Dictionary<string, ConfigEntryBase> dictionary = new Dictionary<string, ConfigEntryBase>(); dictionary["ScrapAmountScalar"] = NewFloatEntryWithMapVar(WeatherType, "ScrapAmountScalar", "Scrap", 1f, "The " + WeatherType + " multiplier of spawned scrap."); dictionary["ScrapValueScalar"] = NewFloatEntryWithMapVar(WeatherType, "ScrapValueScalar", "Scrap", 1f, "The " + WeatherType + " multiplier of scrap value."); dictionary["MapScalar"] = NewFloatEntryWithMapVar(WeatherType, "MapScalar", "Map", 1f, "The " + WeatherType + " scalar of the inside.\nValues under 1 will be capped off at 1 before applying because it crashes the game."); dictionary["DayScalar"] = NewFloatEntryWithMapVar(WeatherType, "DayScalar", "Time", 1f, "The " + WeatherType + " speed scalar of the day.\n(Ex: 0 starts at 6:00AM, 1 starts at 7:40AM, disregarding ship landing time.)"); dictionary["TimeSpeedScalar"] = NewEntry(WeatherType + " Time", "TimeSpeedScalar", 1f, "The " + WeatherType + " time scalar of the day."); dictionary["CentipedeMapSpawnMultiplier"] = NewEntry(WeatherType + " Spawn", "CentipedeMapSpawnMultiplier", 1f, "(Inside) The " + WeatherType + " $VAR.\n(Multiplier of the map spawn weight during " + WeatherType + " weather."); dictionary["CentipedeAddSpawnWeight"] = NewEntry(WeatherType + " Spawn", "CentipedeAddSpawnWeight", 0, "(Inside) The " + WeatherType + " $VAR.\n(Additional spawn weight (aka chance, somewhat) added to the enemy during " + WeatherType + " weather.)"); dictionary["Bunker SpiderMapSpawnMultiplier"] = NewEntry(WeatherType + " Spawn", "SandSpiderMapSpawnMultiplier", 1f, "(Inside) The " + WeatherType + " $VAR.\n(Multiplier of the map spawn weight during " + WeatherType + " weather."); dictionary["Bunker SpiderAddSpawnWeight"] = NewEntry(WeatherType + " Spawn", "SandSpiderAddSpawnWeight", 0, "(Inside) The " + WeatherType + " $VAR.\n(Additional spawn weight (aka chance, somewhat) added to the enemy during " + WeatherType + " weather.)"); dictionary["Hoarding bugMapSpawnMultiplier"] = NewEntry(WeatherType + " Spawn", "HoarderBugMapSpawnMultiplier", 1f, "(Inside) The " + WeatherType + " $VAR.\n(Multiplier of the map spawn weight during " + WeatherType + " weather."); dictionary["Hoarding bugAddSpawnWeight"] = NewEntry(WeatherType + " Spawn", "HoarderBugAddSpawnWeight", 0, "(Inside) The " + WeatherType + " $VAR.\n(Additional spawn weight (aka chance, somewhat) added to the enemy during " + WeatherType + " weather.)"); dictionary["FlowermanMapSpawnMultiplier"] = NewEntry(WeatherType + " Spawn", "FlowermanMapSpawnMultiplier", 1f, "(Inside) The " + WeatherType + " $VAR.\n(Multiplier of the map spawn weight during " + WeatherType + " weather."); dictionary["FlowermanAddSpawnWeight"] = NewEntry(WeatherType + " Spawn", "FlowermanAddSpawnWeight", 0, "(Inside) The " + WeatherType + " $VAR.\n(Additional spawn weight (aka chance, somewhat) added to the enemy during " + WeatherType + " weather.)"); dictionary["CrawlerMapSpawnMultiplier"] = NewEntry(WeatherType + " Spawn", "CrawlerMapSpawnMultiplier", 1f, "(Inside) The " + WeatherType + " $VAR.\n(Multiplier of the map spawn weight during " + WeatherType + " weather."); dictionary["CrawlerAddSpawnWeight"] = NewEntry(WeatherType + " Spawn", "CrawlerAddSpawnWeight", 0, "(Inside) The " + WeatherType + " $VAR.\n(Additional spawn weight (aka chance, somewhat) added to the enemy during " + WeatherType + " weather.)"); dictionary["BlobMapSpawnMultiplier"] = NewEntry(WeatherType + " Spawn", "BlobMapSpawnMultiplier", 1f, "(Inside) The " + WeatherType + " $VAR.\n(Multiplier of the map spawn weight during " + WeatherType + " weather."); dictionary["BlobAddSpawnWeight"] = NewEntry(WeatherType + " Spawn", "BlobAddSpawnWeight", 0, "(Inside) The " + WeatherType + " $VAR.\n(Additional spawn weight (aka chance, somewhat) added to the enemy during " + WeatherType + " weather.)"); dictionary["GirlMapSpawnMultiplier"] = NewEntry(WeatherType + " Spawn", "DressGirlMapSpawnMultiplier", 1f, "(Inside) The " + WeatherType + " $VAR.\n(Multiplier of the map spawn weight during " + WeatherType + " weather."); dictionary["GirlAddSpawnWeight"] = NewEntry(WeatherType + " Spawn", "DressGirlAddSpawnWeight", 0, "(Inside) The " + WeatherType + " $VAR.\n(Additional spawn weight (aka chance, somewhat) added to the enemy during " + WeatherType + " weather.)"); dictionary["PufferMapSpawnMultiplier"] = NewEntry(WeatherType + " Spawn", "PufferMapSpawnMultiplier", 1f, "(Inside) The " + WeatherType + " $VAR.\n(Multiplier of the map spawn weight during " + WeatherType + " weather."); dictionary["PufferAddSpawnWeight"] = NewEntry(WeatherType + " Spawn", "PufferAddSpawnWeight", 0, "(Inside) The " + WeatherType + " $VAR.\n(Additional spawn weight (aka chance, somewhat) added to the enemy during " + WeatherType + " weather.)"); dictionary["NutcrackerMapSpawnMultiplier"] = NewEntry(WeatherType + " Spawn", "NutcrackerMapSpawnMultiplier", 1f, "(Inside) The " + WeatherType + " $VAR.\n(Multiplier of the map spawn weight during " + WeatherType + " weather."); dictionary["NutcrackerAddSpawnWeight"] = NewEntry(WeatherType + " Spawn", "NutcrackerAddSpawnWeight", 0, "(Inside) The " + WeatherType + " $VAR.\n(Additional spawn weight (aka chance, somewhat) added to the enemy during " + WeatherType + " weather.)"); dictionary["SpringMapSpawnMultiplier"] = NewEntry(WeatherType + " Spawn", "SpringManMapSpawnMultiplier", 1f, "(Inside) The " + WeatherType + " $VAR.\n(Multiplier of the map spawn weight during " + WeatherType + " weather."); dictionary["SpringAddSpawnWeight"] = NewEntry(WeatherType + " Spawn", "SpringManAddSpawnWeight", 0, "(Inside) The " + WeatherType + " $VAR.\n(Additional spawn weight (aka chance, somewhat) added to the enemy during " + WeatherType + " weather.)"); dictionary["JesterMapSpawnMultiplier"] = NewEntry(WeatherType + " Spawn", "JesterMapSpawnMultiplier", 1f, "(Inside) The " + WeatherType + " $VAR.\n(Multiplier of the map spawn weight during " + WeatherType + " weather."); dictionary["JesterAddSpawnWeight"] = NewEntry(WeatherType + " Spawn", "JesterAddSpawnWeight", 0, "(Inside) The " + WeatherType + " $VAR.\n(Additional spawn weight (aka chance, somewhat) added to the enemy during " + WeatherType + " weather.)"); dictionary["LassoMapSpawnMultiplier"] = NewEntry(WeatherType + " Spawn", "LassoManMapSpawnMultiplier", 1f, "(Inside) The " + WeatherType + " $VAR.\n(Multiplier of the map spawn weight during " + WeatherType + " weather."); dictionary["LassoAddSpawnWeight"] = NewEntry(WeatherType + " Spawn", "LassoManAddSpawnWeight", 0, "(Inside) The " + WeatherType + " $VAR.\n(Additional spawn weight (aka chance, somewhat) added to the enemy during " + WeatherType + " weather.)"); dictionary["MaskedMapSpawnMultiplier"] = NewEntry(WeatherType + " Spawn", "MaskMapSpawnMultiplier", 1f, "(Inside) The " + WeatherType + " $VAR.\n(Multiplier of the map spawn weight during " + WeatherType + " weather."); dictionary["MaskedAddSpawnWeight"] = NewEntry(WeatherType + " Spawn", "MaskAddSpawnWeight", 0, "(Inside) The " + WeatherType + " $VAR.\n(Additional spawn weight (aka chance, somewhat) added to the enemy during " + WeatherType + " weather.)"); dictionary["MouthDogMapSpawnMultiplier"] = NewEntry(WeatherType + " Spawn", "MouthDogMapSpawnMultiplier", 1f, "(Outside) The " + WeatherType + " $VAR.\n(Multiplier of the map spawn weight during " + WeatherType + " weather."); dictionary["MouthDogAddSpawnWeight"] = NewEntry(WeatherType + " Spawn", "MouthDogAddSpawnWeight", 0, "(Outside) The " + WeatherType + " $VAR.\n(Additional spawn weight (aka chance, somewhat) added to the enemy during " + WeatherType + " weather.)"); dictionary["ForestGiantMapSpawnMultiplier"] = NewEntry(WeatherType + " Spawn", "ForestGiantMapSpawnMultiplier", 1f, "(Outside) The " + WeatherType + " $VAR.\n(Multiplier of the map spawn weight during " + WeatherType + " weather."); dictionary["ForestGiantAddSpawnWeight"] = NewEntry(WeatherType + " Spawn", "ForestGiantAddSpawnWeight", 0, "(Outside) The " + WeatherType + " $VAR.\n(Additional spawn weight (aka chance, somewhat) added to the enemy during " + WeatherType + " weather.)"); dictionary["Earth LeviathanMapSpawnMultiplier"] = NewEntry(WeatherType + " Spawn", "SandWormMapSpawnMultiplier", 1f, "(Outside) The " + WeatherType + " $VAR.\n(Multiplier of the map spawn weight during " + WeatherType + " weather."); dictionary["Earth LeviathanAddSpawnWeight"] = NewEntry(WeatherType + " Spawn", "SandWormAddSpawnWeight", 0, "(Outside) The " + WeatherType + " $VAR.\n(Additional spawn weight (aka chance, somewhat) added to the enemy during " + WeatherType + " weather.)"); dictionary["Baboon hawkMapSpawnMultiplier"] = NewEntry(WeatherType + " Spawn", "BaboonHawkMapSpawnMultiplier", 1f, "(Outside) The " + WeatherType + " $VAR.\n(Multiplier of the map spawn weight during " + WeatherType + " weather."); dictionary["Baboon hawkAddSpawnWeight"] = NewEntry(WeatherType + " Spawn", "BaboonHawkAddSpawnWeight", 0, "(Outside) The " + WeatherType + " $VAR.\n(Additional spawn weight (aka chance, somewhat) added to the enemy during " + WeatherType + " weather.)"); dictionary["Red Locust BeesMapSpawnMultiplier"] = NewEntry(WeatherType + " Spawn", "RedLocustBeesMapSpawnMultiplier", 1f, "(Daytime) The " + WeatherType + " $VAR.\n(Multiplier of the map spawn weight during " + WeatherType + " weather."); dictionary["Red Locust BeesAddSpawnWeight"] = NewEntry(WeatherType + " Spawn", "RedLocustBeesAddSpawnWeight", 0, "(Daytime) The " + WeatherType + " $VAR.\n(Additional spawn weight (aka chance, somewhat) added to the enemy during " + WeatherType + " weather.)"); dictionary["ManticoilMapSpawnMultiplier"] = NewEntry(WeatherType + " Spawn", "DoublewingMapSpawnMultiplier", 1f, "(Daytime) (Manticoil) The " + WeatherType + " $VAR.\n(Multiplier of the map spawn weight during " + WeatherType + " weather."); dictionary["ManticoilAddSpawnWeight"] = NewEntry(WeatherType + " Spawn", "DoublewingAddSpawnWeight", 0, "(Daytime) (Manticoil) The " + WeatherType + " $VAR.\n(Additional spawn weight (aka chance, somewhat) added to the enemy during " + WeatherType + " weather.)"); dictionary["Docile Locust BeesMapSpawnMultiplier"] = NewEntry(WeatherType + " Spawn", "DocileLocustBeesMapSpawnMultiplier", 1f, "(Daytime) The " + WeatherType + " $VAR.\n(Multiplier of the map spawn weight during " + WeatherType + " weather."); dictionary["Docile Locust BeesAddSpawnWeight"] = NewEntry(WeatherType + " Spawn", "DocileLocustBeesAddSpawnWeight", 0, "(Daytime) The " + WeatherType + " $VAR.\n(Additional spawn weight (aka chance, somewhat) added to the enemy during " + WeatherType + " weather.)"); return dictionary; } } internal class WeatherPatch { } internal static class SpawnSettings { } internal class SpawnPatch { [HarmonyPatch(typeof(RoundManager), "LoadNewLevel")] [HarmonyPostfix] private static void PatchCHECK(ref SelectableLevel newLevel) { //IL_000b: 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) MapLevel levelID = (MapLevel)newLevel.levelID; LevelWeatherType currentWeather = newLevel.currentWeather; UtilsMod.MLS.LogInfo((object)$"{RoundManager.Instance.hourTimeBetweenEnemySpawnBatches} {RoundManager.Instance.minEnemiesToSpawn} {RoundManager.Instance.minOutsideEnemiesToSpawn} {newLevel.maxEnemyPowerCount} {newLevel.maxOutsideEnemyPowerCount} {newLevel.maxDaytimeEnemyPowerCount} {newLevel.spawnProbabilityRange} {newLevel.daytimeEnemiesProbabilityRange} {newLevel.timeToArrive} {newLevel.OffsetFromGlobalTime}"); } private static void AddEnemiesToLevel(List<SpawnableEnemyWithRarity> TypeOfEnemies, List<SpawnableEnemyWithRarity> AddToEnemies) { //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Expected O, but got Unknown foreach (SpawnableEnemyWithRarity AddToEnemy in AddToEnemies) { EnemyType enemyType = AddToEnemy.enemyType; GameObject enemyPrefab = enemyType.enemyPrefab; EnemyAI component = enemyPrefab.GetComponent<EnemyAI>(); if (!Object.op_Implicit((Object)(object)component)) { continue; } bool flag = false; foreach (SpawnableEnemyWithRarity TypeOfEnemy in TypeOfEnemies) { if (TypeOfEnemy.enemyType.enemyName != enemyType.enemyName) { continue; } flag = true; break; } if (!flag) { SpawnableEnemyWithRarity val = new SpawnableEnemyWithRarity(); val.enemyType = enemyType; val.rarity = 0; TypeOfEnemies.Add(val); } } } private static void ChangeEnemyRarities(List<SpawnableEnemyWithRarity> TypeOfEnemies, MapLevel Map, LevelWeatherType Weather) { //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < TypeOfEnemies.Count; i++) { SpawnableEnemyWithRarity val = TypeOfEnemies[i]; if (!MapSettings.Settings.ContainsKey(Map)) { continue; } Dictionary<string, ConfigEntryBase> dictionary = MapSettings.Settings[Map]; if (dictionary.ContainsKey(((Object)val.enemyType).name + "SpawnWeight")) { ConfigEntry<int> configEntry = (ConfigEntry<int>)dictionary[((Object)val.enemyType).name + "SpawnWeight"]; val.rarity = (MapSettings.SpawnModifiersEnabled.Value ? configEntry.Value : ((int)configEntry.DefaultValue)); if (WeatherSettings.SpawnModifiersEnabled.Value && WeatherSettings.Settings.ContainsKey(Weather)) { Dictionary<string, ConfigEntryBase> dictionary2 = WeatherSettings.Settings[Weather]; val.rarity = (int)((float)val.rarity * (dictionary2[((Object)val.enemyType).name + "MapSpawnMultiplier"] as ConfigEntry<float>).Value) + (dictionary2[((Object)val.enemyType).name + "AddSpawnWeight"] as ConfigEntry<int>).Value; } } } } [HarmonyPatch(typeof(RoundManager), "LoadNewLevel")] [HarmonyPrefix] [HarmonyPriority(1114)] private static void PatchLoadNewLevel(ref SelectableLevel newLevel) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_02cc: Unknown result type (might be due to invalid IL or missing references) //IL_02d5: Unknown result type (might be due to invalid IL or missing references) //IL_02df: Unknown result type (might be due to invalid IL or missing references) MapLevel levelID = (MapLevel)newLevel.levelID; LevelWeatherType currentWeather = newLevel.currentWeather; if (MapSettings.Settings.ContainsKey(levelID)) { Dictionary<string, ConfigEntryBase> dictionary = MapSettings.Settings[levelID]; if (MapSettings.SpawnModifiersEnabled.Value) { if (((ConfigEntry<int>)dictionary["HourTimeBetweenEnemySpawnBatches"]).Value != 2) { RoundManager.Instance.hourTimeBetweenEnemySpawnBatches = ((ConfigEntry<int>)dictionary["HourTimeBetweenEnemySpawnBatches"]).Value; } if (((ConfigEntry<int>)dictionary["MinEnemiesToSpawn"]).Value != 0) { RoundManager.Instance.minEnemiesToSpawn = ((ConfigEntry<int>)dictionary["MinEnemiesToSpawn"]).Value; } if (((ConfigEntry<int>)dictionary["MinOutsideEnemiesToSpawn"]).Value != 0) { RoundManager.Instance.minOutsideEnemiesToSpawn = ((ConfigEntry<int>)dictionary["MinOutsideEnemiesToSpawn"]).Value; } newLevel.maxEnemyPowerCount = ((ConfigEntry<int>)dictionary["MaxEnemyPower"]).Value; newLevel.maxOutsideEnemyPowerCount = ((ConfigEntry<int>)dictionary["MaxOutsideEnemyPower"]).Value; newLevel.maxDaytimeEnemyPowerCount = ((ConfigEntry<int>)dictionary["MaxDaytimeEnemyPower"]).Value; newLevel.spawnProbabilityRange = ((ConfigEntry<float>)dictionary["SpawnProbabilityRange"]).Value; newLevel.daytimeEnemiesProbabilityRange = ((ConfigEntry<float>)dictionary["DaytimeEnemiesProbabilityRange"]).Value; } } UtilsMod.MLS.LogInfo((object)$"{RoundManager.Instance.hourTimeBetweenEnemySpawnBatches} {RoundManager.Instance.minEnemiesToSpawn} {RoundManager.Instance.minOutsideEnemiesToSpawn} {newLevel.maxEnemyPowerCount} {newLevel.maxOutsideEnemyPowerCount} {newLevel.maxDaytimeEnemyPowerCount} {newLevel.spawnProbabilityRange} {newLevel.daytimeEnemiesProbabilityRange} {newLevel.timeToArrive} {newLevel.OffsetFromGlobalTime}"); List<SpawnableEnemyWithRarity> enemies = newLevel.Enemies; List<SpawnableEnemyWithRarity> outsideEnemies = newLevel.OutsideEnemies; List<SpawnableEnemyWithRarity> daytimeEnemies = newLevel.DaytimeEnemies; SelectableLevel[] levels = StartOfRound.Instance.levels; for (int i = 0; i < levels.Length; i++) { AddEnemiesToLevel(enemies, levels[i].Enemies); AddEnemiesToLevel(outsideEnemies, levels[i].OutsideEnemies); AddEnemiesToLevel(daytimeEnemies, levels[i].DaytimeEnemies); } ChangeEnemyRarities(enemies, levelID, currentWeather); ChangeEnemyRarities(outsideEnemies, levelID, currentWeather); ChangeEnemyRarities(daytimeEnemies, levelID, currentWeather); } } public enum UsernameFilter { Default, Nothing } internal static class LobbySettings { public static ConfigEntry<bool> ConfigEnabled = UtilsMod.LobbyConfig.Bind("Active Settings", "ConfigEnabled", defaultValue: false, "Whether or not the LobbyConfig executes. (NOT TESTED)"); public static ConfigEntry<UsernameFilter> UsernameFiltering = UtilsMod.LobbyConfig.Bind("Lobby Settings", "UsernameFiltering", UsernameFilter.Default, "How names should be filtered. (Nothing might be unstable, but unknown.)"); } internal class LobbyPatch { [HarmonyPatch(typeof(PlayerControllerB), "NoPunctuation")] [HarmonyPrefix] public static bool PlayerNoPunctuation(ref string __result, string input) { if (LobbySettings.UsernameFiltering.Value == UsernameFilter.Default) { return true; } __result = input; return false; } [HarmonyPatch(typeof(GameNetworkManager), "NoPunctuation")] [HarmonyPrefix] public static bool NetworkNoPunctuation(ref string __result, string input) { if (LobbySettings.UsernameFiltering.Value == UsernameFilter.Default) { return true; } __result = input; return false; } [HarmonyPatch(typeof(StartOfRound), "NoPunctuation")] [HarmonyPrefix] public static bool RoundNoPunctuation(ref string __result, string input) { if (LobbySettings.UsernameFiltering.Value == UsernameFilter.Default) { return true; } __result = input; return false; } } public enum DoorInSpace { DoesNothing, OpenWithBarrier } internal static class ShipSettings { public static ConfigEntry<bool> ConfigEnabled = UtilsMod.ShipConfig.Bind("Active Settings", "ConfigEnabled", defaultValue: false, "Whether or not the ShipConfig executes."); public static ConfigEntry<DoorInSpace> DoorInSpaceOptions = UtilsMod.ShipConfig.Bind("Ship Settings", "DoorInSpace", DoorInSpace.DoesNothing, "Settings for the door while in space."); } internal class ShipPatch { [HarmonyPatch(typeof(HangarShipDoor), "PlayDoorAnimation")] [HarmonyPrefix] private static void SetPlayDoorAnimation(HangarShipDoor __instance, ref bool ___buttonsEnabled) { if (ShipSettings.DoorInSpaceOptions.Value != 0) { __instance.buttonsEnabled = true; } } } public enum UponDeathShipLoses { Nothing, ScrapOnly } internal static class RoundSettings { public static ConfigEntry<bool> ConfigEnabled = UtilsMod.RoundConfig.Bind("Active Settings", "ConfigEnabled", defaultValue: false, "Whether or not the RoundConfig executes."); public static ConfigEntry<UponDeathShipLoses> LoseUponDeath = UtilsMod.RoundConfig.Bind("Round Settings", "LoseUponDeath", UponDeathShipLoses.ScrapOnly, "What you lose when everybody dies."); } internal class RoundPatch { public static bool AllPlayersDead; [HarmonyPatch(typeof(RoundManager), "DespawnPropsAtEndOfRound")] [HarmonyPrefix] private static void PreSkipPropDespawn() { if (RoundSettings.LoseUponDeath.Value != UponDeathShipLoses.ScrapOnly) { AllPlayersDead = StartOfRound.Instance.allPlayersDead; StartOfRound.Instance.allPlayersDead = false; } } [HarmonyPatch(typeof(RoundManager), "DespawnPropsAtEndOfRound")] [HarmonyPostfix] private static void PostSkipPropDespawn() { if (RoundSettings.LoseUponDeath.Value == UponDeathShipLoses.ScrapOnly) { StartOfRound.Instance.allPlayersDead = AllPlayersDead; } } } public enum MonsterAggression { Hostile, OnlyVerbal, NonHostile } internal static class CompanySettings { public static ConfigEntry<bool> ConfigEnabled = UtilsMod.CompanyConfig.Bind("Active Settings", "ConfigEnabled", defaultValue: false, "Whether or not the CompanyConfig executes."); public static ConfigEntry<MonsterAggression> SetMonsterAggression = UtilsMod.CompanyConfig.Bind("Company Settings", "SetMonsterAggression", MonsterAggression.Hostile, "Whether or not the monster will attack you."); public static ConfigEntry<bool> AlwaysFullBuyingRate = UtilsMod.CompanyConfig.Bind("Company Settings", "AlwaysFullBuyingRate", defaultValue: false, "Whether or not the Company is buying at full rate at all times."); public static ConfigEntry<float> BellCooldown = UtilsMod.CompanyConfig.Bind("Company Settings", "BellCooldown", 1f, new ConfigDescription("How long the cooldown is for ringing the bell. (You should make it 0 and spam until you die, yes yes.)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 30f))); public static ConfigEntry<float> GrabObjectsWaitTime = UtilsMod.CompanyConfig.Bind("Company Settings", "GrabObjectsWaitTime", 10f, new ConfigDescription("How long until the Company takes your stuff.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 30f))); } internal class CompanyPatch { [HarmonyPatch(typeof(DepositItemsDesk), "Start")] [HarmonyPrefix] private static void PatchDepositDesk(ref float ___grabObjectsWaitTime) { if (CompanySettings.GrabObjectsWaitTime.Value != 10f) { ___grabObjectsWaitTime = CompanySettings.GrabObjectsWaitTime.Value; } } [HarmonyPatch(typeof(InteractTrigger), "Start")] [HarmonyPostfix] private static void PatchBellCooldown(InteractTrigger __instance, ref float ___cooldownTime, ref float ___currentCooldownValue) { if (CompanySettings.BellCooldown.Value != (float)CompanySettings.BellCooldown.DefaultValue && !((Object)(object)((Component)__instance).gameObject != (Object)(object)GameObject.Find("BellDinger/Trigger"))) { ___cooldownTime = CompanySettings.BellCooldown.Value; ___currentCooldownValue = ___cooldownTime; } } [HarmonyPatch(typeof(TimeOfDay), "SetBuyingRateForDay")] [HarmonyPostfix] private static void SetBuyingRateForDay() { if (CompanySettings.AlwaysFullBuyingRate.Value) { StartOfRound.Instance.companyBuyingRate = 1f; } } [HarmonyPatch(typeof(DepositItemsDesk), "Attack")] [HarmonyPrefix] private static bool PatchPreAttack(DepositItemsDesk __instance) { if (CompanySettings.SetMonsterAggression.Value == MonsterAggression.OnlyVerbal) { __instance.timeSinceAttacking = 0f; __instance.patienceLevel += 6f; if (!__instance.doorOpen) { __instance.OpenShutDoor(true); } __instance.MakeLoudNoise(2); return false; } return true; } [HarmonyPatch(typeof(DepositItemsDesk), "Update")] [HarmonyPostfix] private static void PatchDepositItems(ref float ___patienceLevel) { if (CompanySettings.SetMonsterAggression.Value == MonsterAggression.NonHostile) { ___patienceLevel = 3f; } } } internal static class CharacterSettings { public static ConfigEntry<bool> ConfigEnabled = UtilsMod.CharacterConfig.Bind("Active Settings", "ConfigEnabled", defaultValue: false, "Whether or not the CharacterConfig executes."); public static ConfigEntry<bool> InfStamina = UtilsMod.CharacterConfig.Bind("Character Settings", "InfStamina", defaultValue: false, "Whether or not the player has infinite stamina."); public static ConfigEntry<bool> FallDamage = UtilsMod.CharacterConfig.Bind("Character Settings", "FallDamage", defaultValue: true, "Whether or not the player takes fall damage."); public static ConfigEntry<bool> ApplyMovementModifiers = UtilsMod.CharacterConfig.Bind("Movement Settings", "ApplyMovementModifiers", defaultValue: false, "Whether or not the Movement Settings apply."); public static ConfigEntry<float> WalkSpeed = UtilsMod.CharacterConfig.Bind("Movement Settings", "WalkSpeed", 4.6f, "Walking speed."); public static ConfigEntry<float> SprintTime = UtilsMod.CharacterConfig.Bind("Movement Settings", "SprintTime", 10f, "Sprint time."); public static ConfigEntry<float> SprintMultiplier = UtilsMod.CharacterConfig.Bind("Movement Settings", "SprintMultiplier", 2.25f, "Sprint walking speed multiplier."); public static ConfigEntry<float> ClimbSpeed = UtilsMod.CharacterConfig.Bind("Movement Settings", "ClimbSpeed", 4f, "Ladder climb speed."); public static ConfigEntry<float> FastClimbTime = UtilsMod.CharacterConfig.Bind("Movement Settings", "FastClimbTime", 10f, "Fast climbing time."); public static ConfigEntry<float> FastClimbMultiplier = UtilsMod.CharacterConfig.Bind("Movement Settings", "FastClimbMultiplier", 1f, "Fast climbing speed multiplier."); public static ConfigEntry<bool> NoJumpDelay = UtilsMod.CharacterConfig.Bind("Movement Settings", "NoJumpDelay", defaultValue: false, "Whether or not the vanilla jump delay is removed."); public static ConfigEntry<float> JumpForce = UtilsMod.CharacterConfig.Bind("Movement Settings", "JumpingForce", 13f, "Jumping force."); public static ConfigEntry<float> JumpStaminaUse = UtilsMod.CharacterConfig.Bind("Movement Settings", "JumpStaminaUse", 0.08f, "How much stamina jumping uses."); } internal class CharacterPatch { private static float PreviousSprintMeter = 1f; [HarmonyPatch(typeof(PlayerControllerB), "Jump_performed")] [HarmonyPrefix] public static void PreJump(PlayerControllerB __instance) { if (CharacterSettings.ApplyMovementModifiers.Value && ((NetworkBehaviour)__instance).IsOwner && __instance.isPlayerControlled) { PreviousSprintMeter = __instance.sprintMeter; __instance.jumpForce = CharacterSettings.JumpForce.Value; } } [HarmonyPatch(typeof(PlayerControllerB), "Jump_performed")] [HarmonyPostfix] public static void PostJump(PlayerControllerB __instance) { if (CharacterSettings.ApplyMovementModifiers.Value && ((NetworkBehaviour)__instance).IsOwner && __instance.isPlayerControlled) { float num = PreviousSprintMeter - __instance.sprintMeter; if (!(num < 0f)) { __instance.sprintMeter = Mathf.Clamp(PreviousSprintMeter + num - CharacterSettings.JumpStaminaUse.Value, 0f, 1f); } } } [HarmonyPatch(typeof(PlayerControllerB), "PlayerJump")] [HarmonyTranspiler] private static IEnumerable<CodeInstruction> NoJumpDelayTranspiler(IEnumerable<CodeInstruction> instructions) { List<CodeInstruction> list = instructions.ToList(); if (!CharacterSettings.ApplyMovementModifiers.Value || !CharacterSettings.NoJumpDelay.Value) { return list; } for (int i = 0; i < list.Count; i++) { if (!(list[i].opcode != OpCodes.Ldc_R4)) { list[i].operand = 0f; } } return list; } [HarmonyPatch(typeof(PlayerControllerB), "Update")] [HarmonyPrefix] private static void PatchPlayerPreUpdate(PlayerControllerB __instance, ref Coroutine ___jumpCoroutine) { if (CharacterSettings.ApplyMovementModifiers.Value && ((NetworkBehaviour)__instance).IsOwner && __instance.isPlayerControlled) { PreviousSprintMeter = __instance.sprintMeter; __instance.sprintTime = CharacterSettings.SprintTime.Value; } } [HarmonyPatch(typeof(PlayerControllerB), "Update")] [HarmonyPostfix] private static void PatchPlayerUpdate(PlayerControllerB __instance, ref bool ___isWalking, ref float ___sprintMultiplier) { if (!((NetworkBehaviour)__instance).IsOwner || !__instance.isPlayerControlled) { return; } if (CharacterSettings.ApplyMovementModifiers.Value) { float num = PreviousSprintMeter - __instance.sprintMeter; if (___isWalking) { float value = CharacterSettings.WalkSpeed.Value; float num2 = (___sprintMultiplier - 1f) / 1.25f; float value2 = CharacterSettings.SprintMultiplier.Value; __instance.movementSpeed = (value + (value2 * value - value) * num2) / ___sprintMultiplier; } if (__instance.isClimbingLadder) { float num3 = CharacterSettings.ClimbSpeed.Value; if (__instance.isSprinting) { __instance.sprintMeter = Mathf.Clamp(PreviousSprintMeter - num * __instance.sprintTime / CharacterSettings.FastClimbTime.Value, 0f, 1f); num3 *= CharacterSettings.FastClimbMultiplier.Value; } if (num3 != 4f) { __instance.climbSpeed = num3; } } } if (CharacterSettings.InfStamina.Value) { __instance.sprintMeter = 1f; } if (!CharacterSettings.FallDamage.Value) { __instance.takingFallDamage = false; } } } internal static class GeneralSettings { public static ConfigEntry<bool> ConfigEnabled = UtilsMod.GeneralConfig.Bind("Active Settings", "ConfigEnabled", defaultValue: false, "Whether or not the GeneralConfig executes."); public static ConfigEntry<int> SaveItemCount = UtilsMod.GeneralConfig.Bind("General Settings", "SaveItemCount", 45, "The amount of items that save."); public static ConfigEntry<bool> PlayBootAnimation = UtilsMod.GeneralConfig.Bind("Active Settings", "PlayBootAnimation", defaultValue: true, "Whether or not to play the booting animation."); } internal class GeneralPatch { [HarmonyPatch(typeof(StartOfRound), "Awake")] [HarmonyPostfix] private static void PatchMaxItemCapacity(ref int ___maxShipItemCapacity) { if (GeneralSettings.SaveItemCount.Value != 45) { ___maxShipItemCapacity = GeneralSettings.SaveItemCount.Value; } } [HarmonyPatch(typeof(InitializeGame), "Awake")] [HarmonyPrefix] private static void SkipBoot(ref bool ___runBootUpScreen) { if (!GeneralSettings.PlayBootAnimation.Value) { ___runBootUpScreen = false; } } } internal static class HUDSettings { public static ConfigEntry<bool> ConfigEnabled = UtilsMod.HUDConfig.Bind("Active Settings", "ConfigEnabled", defaultValue: false, "Whether or not the HUDConfig executes."); public static ConfigEntry<bool> BlockPlayerModListLC_API = UtilsMod.HUDConfig.Bind("HUD Settings", "BlockPlayerModListLC_API", defaultValue: false, "Whether or not you want to hide the annoying LC_API mod list every time somebody joins. (Doesn't block the very first when loading a lobby, however.)"); public static ConfigEntry<bool> ViewClockInShip = UtilsMod.HUDConfig.Bind("Clock Settings", "ViewClockInShip", defaultValue: false, "Whether or not people can view the clock inside the ship."); public static ConfigEntry<bool> ViewClockOutside = UtilsMod.HUDConfig.Bind("Clock Settings", "ViewClockOutside", defaultValue: true, "Whether or not people can view the clock outside. (You should make it false and suffer.)"); public static ConfigEntry<bool> ViewClockInBuilding = UtilsMod.HUDConfig.Bind("Clock Settings", "ViewClockInBuilding", defaultValue: false, "Whether or not people can view the clock inside the building."); public static ConfigEntry<ClockType> TimeDisplay = UtilsMod.HUDConfig.Bind("Clock Settings", "TimeDisplay", ClockType.Display12Hour, "How the clock displays time."); } internal class HUDPatch { [HarmonyPatch(typeof(HUDManager), "SetClock")] [HarmonyPrefix] private static bool Patch24HourClock(ref TextMeshProUGUI ___clockNumber, ref float timeNormalized, ref float numberOfHours) { if (HUDSettings.TimeDisplay.Value == ClockType.Display12Hour) { return true; } int num = (int)(timeNormalized * (60f * numberOfHours)) + 360; int num2 = (int)Mathf.Floor((float)(num / 60)); int num3 = num % 60; ((TMP_Text)___clockNumber).text = string.Format("{0:00}{1}{2:00}", num2, (HUDSettings.TimeDisplay.Value == ClockType.Display24Hour) ? ":" : "", num3).TrimStart(new char[1] { '0' }); return false; } [HarmonyPatch(typeof(TimeOfDay), "SetInsideLightingDimness")] [HarmonyPostfix] public static void PatchClockVisibility() { if (HUDSettings.ViewClockInShip.Value || !HUDSettings.ViewClockOutside.Value || HUDSettings.ViewClockInBuilding.Value) { PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController; if (!localPlayerController.isPlayerDead) { bool isInsideFactory = localPlayerController.isInsideFactory; bool isInHangarShipRoom = localPlayerController.isInHangarShipRoom; bool clockVisible = (isInsideFactory && HUDSettings.ViewClockInBuilding.Value) || (isInHangarShipRoom && HUDSettings.ViewClockInShip.Value) || (!isInsideFactory && !isInHangarShipRoom && HUDSettings.ViewClockOutside.Value); HUDManager.Instance.SetClockVisible(clockVisible); } } } [HarmonyPatch(typeof(HUDManager), "CanTipDisplay")] [HarmonyPrefix] public static bool CanTipDisplay(string prefsKey, ref bool __result) { if (!HUDSettings.BlockPlayerModListLC_API.Value || !((TMP_Text)HUDManager.Instance.tipsPanelHeader).text.StartsWith("Mod List")) { return true; } __result = false; return false; } } internal static class MultipliersSettings { } internal class MultipliersPatch { [HarmonyPatch(typeof(RoundManager), "SpawnScrapInLevel")] [HarmonyPrefix] private static void PatchMultiplierSettings(RoundManager __instance) { //IL_0013: 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_0148: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) MapLevel levelID = (MapLevel)__instance.currentLevel.levelID; LevelWeatherType currentWeather = __instance.currentLevel.currentWeather; if (MapSettings.ConfigEnabled.Value && MapSettings.ScrapModifiersEnabled.Value && MapSettings.Settings.ContainsKey(levelID)) { Dictionary<string, ConfigEntryBase> dictionary = MapSettings.Settings[levelID]; __instance.currentLevel.minScrap = ((ConfigEntry<int>)dictionary["MinScrapAmount"]).Value; __instance.currentLevel.maxScrap = ((ConfigEntry<int>)dictionary["MaxScrapAmount"]).Value; } float num = 1f; float num2 = 0.4f; if (MapSettings.ConfigEnabled.Value && MapSettings.ScrapModifiersEnabled.Value) { num = MapSettings.ScrapAmountScalar.Value; num2 = MapSettings.ScrapValueScalar.Value; if (MapSettings.Settings.ContainsKey(levelID)) { Dictionary<string, ConfigEntryBase> dictionary2 = MapSettings.Settings[levelID]; num *= (dictionary2["ScrapAmountScalar"] as ConfigEntry<float>).Value; num2 *= (dictionary2["ScrapValueScalar"] as ConfigEntry<float>).Value; } } if (WeatherSettings.ConfigEnabled.Value && WeatherSettings.ScrapModifiersEnabled.Value && WeatherSettings.Settings.ContainsKey(currentWeather)) { Dictionary<string, ConfigEntryBase> dictionary3 = WeatherSettings.Settings[currentWeather]; num *= (dictionary3["ScrapAmountScalar"] as ConfigEntry<float>).Value; num2 *= (dictionary3["ScrapValueScalar"] as ConfigEntry<float>).Value; } __instance.scrapAmountMultiplier = num; __instance.scrapValueMultiplier = num2; } [HarmonyPatch(typeof(LungProp), "DisconnectFromMachinery")] [HarmonyPostfix] private static void FixApparatusScrapValMult(LungProp __instance) { ((GrabbableObject)__instance).SetScrapValue((int)((float)((GrabbableObject)__instance).scrapValue * RoundManager.Instance.scrapValueMultiplier / 0.4f)); } } internal static class GearSettings { public static ConfigEntry<bool> ConfigEnabled = UtilsMod.GearConfig.Bind("Active Settings", "ConfigEnabled", defaultValue: false, "Whether or not the GearConfig executes."); public static ConfigEntry<bool> InfFlashlight = UtilsMod.GearConfig.Bind("Flashlight Settings", "InfFlashlight", defaultValue: false, "Whether or not the flashlight has infinite energy."); public static ConfigEntry<bool> InfProFlashlight = UtilsMod.GearConfig.Bind("Flashlight Settings", "InfProFlashlight", defaultValue: false, "Whether or not the pro flashlight has infinite energy."); public static ConfigEntry<bool> InfWalkie = UtilsMod.GearConfig.Bind("Walkie Talkie Settings", "InfWalkie", defaultValue: false, "Whether or not the walkie has infinite energy."); public static ConfigEntry<bool> InfPaint = UtilsMod.GearConfig.Bind("Spray Paint Settings", "InfPaint", defaultValue: false, "Whether or not the spray paint is infinite."); public static ConfigEntry<bool> RequireShaking = UtilsMod.GearConfig.Bind("Spray Paint Settings", "RequireShaking", defaultValue: true, "Whether or not the spray paint needs to be shook."); public static ConfigEntry<float> SprayPaintVolume = UtilsMod.GearConfig.Bind("Spray Paint Settings", "SprayPaintVolume", 1f, "The general volume of the spray paint."); public static ConfigEntry<float> PaintSpeed = UtilsMod.GearConfig.Bind("Spray Paint Settings", "PaintSpeed", 0.2f, "Interval at which the paint decals apply."); public static ConfigEntry<int> MaxPaintDecals = UtilsMod.GearConfig.Bind("Spray Paint Settings", "MaxPaintDecals", 1000, "How many spray paint decals stay at once."); public static ConfigEntry<bool> InfBoombox = UtilsMod.GearConfig.Bind("Boombox Settings", "InfBoombox", defaultValue: false, "Whether or not the boombox has infinite energy."); public static ConfigEntry<bool> PocketBoombox = UtilsMod.GearConfig.Bind("Boombox Settings", "PocketBoombox", defaultValue: false, "Whether or not the boombox continues to play when put away."); public static ConfigEntry<bool> GroundBoombox = UtilsMod.GearConfig.Bind("Boombox Settings", "GroundBoombox", defaultValue: true, "Whether or not the boombox continues to play when thrown down."); public static ConfigEntry<bool> ReusableUnlockKeys = UtilsMod.GearConfig.Bind("Key Settings", "ReusableUnlockKeys", defaultValue: false, "Whether or not the key is reusable for unlocking."); public static ConfigEntry<bool> ReusableLockKeys = UtilsMod.GearConfig.Bind("Key Settings", "ReusableLockKeys", defaultValue: false, "Whether or not the key is reusable for locking."); public static ConfigEntry<bool> KeysCanLockDoors = UtilsMod.GearConfig.Bind("Key Settings", "KeysCanLockDoors", defaultValue: false, "Whether or not the key can lock doors."); } internal class GearPatch { public static bool BoomboxBeingPocketed; [HarmonyPatch(typeof(DoorLock), "UnlockDoor")] [HarmonyPrefix] private static bool PatchUnlockDoor(ref DoorLock __instance, ref bool ___isDoorOpened) { if (__instance.isLocked || !GearSettings.KeysCanLockDoors.Value) { return true; } if (___isDoorOpened) { return false; } __instance.doorLockSFX.PlayOneShot(__instance.unlockSFX); __instance.LockDoor(30f); return false; } [HarmonyPatch(typeof(DoorLock), "Update")] [HarmonyPrefix] private static void PreLockpickDoor(ref DoorLock __instance, ref InteractTrigger ___doorTrigger, out bool __state) { __state = false; if (__instance.isLocked && __instance.isPickingLock && GearSettings.KeysCanLockDoors.Value) { __state = true; __instance.isPickingLock = false; } } [HarmonyPatch(typeof(DoorLock), "Update")] [HarmonyPostfix] private static void PostLockpickDoor(ref DoorLock __instance, ref InteractTrigger ___doorTrigger, bool __state) { if (__state) { DoorLock obj = __instance; obj.lockPickTimeLeft -= Time.deltaTime; ___doorTrigger.disabledHoverTip = $"Picking lock: {(int)__instance.lockPickTimeLeft} sec."; if (((NetworkBehaviour)__instance).IsServer && __instance.lockPickTimeLeft < 0f) { __instance.UnlockDoorServerRpc(); } __instance.isPickingLock = true; } } [HarmonyPatch(typeof(DoorLock), "UnlockDoorSyncWithServer")] [HarmonyPrefix] private static bool UnlockDoorSyncWithServer(ref DoorLock __instance) { if (!GearSettings.KeysCanLockDoors.Value) { return true; } if (__instance.isLocked) { __instance.UnlockDoorServerRpc(); } return false; } [HarmonyPatch(typeof(KeyItem), "ItemActivate")] [HarmonyPrefix] private static bool ItemActivatePatch(ref KeyItem __instance) { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) if (!GearSettings.KeysCanLockDoors.Value) { return true; } PlayerControllerB playerHeldBy = ((GrabbableObject)__instance).playerHeldBy; if (!Object.op_Implicit((Object)(object)playerHeldBy) || !((NetworkBehaviour)__instance).IsOwner) { return false; } RaycastHit val = default(RaycastHit); if (!Physics.Raycast(new Ray(((Component)playerHeldBy.gameplayCamera).transform.position, ((Component)playerHeldBy.gameplayCamera).transform.forward), ref val, 3f, 2816)) { return false; } DoorLock component = ((Component)((RaycastHit)(ref val)).transform).GetComponent<DoorLock>(); if (!Object.op_Implicit((Object)(object)component) || component.isPickingLock) { return false; } if (!component.isLocked && !GearSettings.KeysCanLockDoors.Value) { return false; } component.UnlockDoorServerRpc(); if ((component.isLocked && !GearSettings.ReusableUnlockKeys.Value) || !GearSettings.ReusableLockKeys.Value) { playerHeldBy.DespawnHeldObject(); } return false; } [HarmonyPatch(typeof(WalkieTalkie), "Start")] [HarmonyPostfix] private static void PatchInfWalkie(ref Item ___itemProperties) { if (GearSettings.InfWalkie.Value) { ___itemProperties.requiresBattery = false; } } [HarmonyPatch(typeof(FlashlightItem), "Start")] [HarmonyPostfix] private static void PatchInfFlashlight(ref Item ___itemProperties) { if (!((___itemProperties.itemId == 1) ? (!GearSettings.InfProFlashlight.Value) : (!GearSettings.InfFlashlight.Value))) { ___itemProperties.requiresBattery = false; } } [HarmonyPatch(typeof(SprayPaintItem), "Start")] [HarmonyPostfix] private static void PatchPaintStart(ref Item ___itemProperties, SprayPaintItem __instance) { if (GearSettings.PaintSpeed.Value != 0.2f) { __instance.sprayIntervalSpeed = GearSettings.PaintSpeed.Value; } if (GearSettings.MaxPaintDecals.Value != 1000) { __instance.maxSprayPaintDecals = GearSettings.MaxPaintDecals.Value; } __instance.sprayAudio.volume = GearSettings.SprayPaintVolume.Value; } [HarmonyPatch(typeof(SprayPaintItem), "LateUpdate")] [HarmonyPostfix] private static void PatchInfPaint(ref float ___sprayCanTank, ref float ___sprayCanShakeMeter) { if (GearSettings.InfPaint.Value) { ___sprayCanTank = 1f; } if (!GearSettings.RequireShaking.Value) { ___sprayCanShakeMeter = 1f; } } [HarmonyPatch(typeof(BoomboxItem), "Start")] [HarmonyPostfix] private static void PatchInfBoombox(ref Item ___itemProperties) { if (GearSettings.InfBoombox.Value) { ___itemProperties.requiresBattery = false; } } [HarmonyPatch(typeof(BoomboxItem), "PocketItem")] [HarmonyPrefix] private static void PatchPocketBoombox() { if (GearSettings.PocketBoombox.Value) { BoomboxBeingPocketed = true; } } [HarmonyPatch(typeof(BoomboxItem), "StartMusic")] [HarmonyPrefix] private static bool PatchStartMusic() { if (!GearSettings.PocketBoombox.Value || !BoomboxBeingPocketed) { return true; } BoomboxBeingPocketed = false; return false; } [HarmonyPatch(typeof(PlayerControllerB), "SetObjectAsNoLongerHeld")] [HarmonyPrefix] private static void PatchSetObjectAsNoLongerHeld(ref GrabbableObject dropObject) { if (!GearSettings.GroundBoombox.Value && dropObject is BoomboxItem) { dropObject.ItemActivate(false, true); } } } public enum ItemsOnTPOptions { Drop, DropExceptGear, DropExceptGearAndHeldItem, DropExceptHeldItem, DontDrop } internal static class TeleportSettings { public static ConfigEntry<bool> ConfigEnabled = UtilsMod.TeleportConfig.Bind("Active Settings", "ConfigEnabled", defaultValue: false, "Whether or not the TeleportConfig executes."); public static ConfigEntry<ItemsOnTPOptions> ItemsOnTP = UtilsMod.TeleportConfig.Bind("TP Settings", "ItemsOnTP", ItemsOnTPOptions.Drop, "Whether or not you keep your items upon teleportation."); public static ConfigEntry<int> CooldownTP = UtilsMod.TeleportConfig.Bind("TP Settings", "CooldownTP", 10, "How long until you can use the teleporter."); public static ConfigEntry<ItemsOnTPOptions> ItemsOnInverseTP = UtilsMod.TeleportConfig.Bind("TP Settings", "ItemsOnInverseTP", ItemsOnTPOptions.Drop, "Whether or not you keep your items upon inverse teleportation."); public static ConfigEntry<int> CooldownInverseTP = UtilsMod.TeleportConfig.Bind("TP Settings", "CooldownInverseTP", 210, "How long until you can use the inverse teleporter."); } internal class TeleportPatch { [HarmonyPatch(typeof(ShipTeleporter), "Awake")] [HarmonyPrefix] private static void PostShipTPAwake(ref float ___cooldownAmount, ref float ___cooldownTime, ref bool ___isInverseTeleporter) { int num = (___isInverseTeleporter ? TeleportSettings.CooldownInverseTP.Value : TeleportSettings.CooldownTP.Value); if (!(___isInverseTeleporter ? (num == 210) : (num == 10))) { ___cooldownAmount = num; ___cooldownTime = ___cooldownAmount; } } [HarmonyPatch(typeof(PlayerControllerB), "DropAllHeldItems")] [HarmonyPrefix] private static bool PreDropAllHeldItems(PlayerControllerB __instance, out object[] __state) { __state = new object[6]; GrabbableObject[] array = (GrabbableObject[])(object)new GrabbableObject[__instance.ItemSlots.Length]; __state[0] = array; __state[1] = __instance.isHoldingObject; __state[2] = __instance.activatingItem; __state[3] = __instance.twoHanded; __state[4] = __instance.currentlyHeldObjectServer; __state[5] = false; int shipTeleporterId = __instance.shipTeleporterId; bool flag = shipTeleporterId == 1; bool flag2 = shipTeleporterId == 2; if (!flag && !flag2) { return true; } ItemsOnTPOptions itemsOnTPOptions = (flag2 ? TeleportSettings.ItemsOnInverseTP.Value : TeleportSettings.ItemsOnTP.Value); int num; switch (itemsOnTPOptions) { case ItemsOnTPOptions.Drop: return true; case ItemsOnTPOptions.DontDrop: return false; default: num = ((itemsOnTPOptions == ItemsOnTPOptions.DropExceptGearAndHeldItem) ? 1 : 0); break; case ItemsOnTPOptions.DropExceptHeldItem: num = 1; break; } bool flag3 = (byte)num != 0; bool flag4 = itemsOnTPOptions == ItemsOnTPOptions.DropExceptGear || itemsOnTPOptions == ItemsOnTPOptions.DropExceptGearAndHeldItem; for (int i = 0; i < __instance.ItemSlots.Length; i++) { GrabbableObject val = __instance.ItemSlots[i]; if (Object.op_Implicit((Object)(object)val) && ((flag3 && !val.isPocketed) || (flag4 && (val is ExtensionLadderItem || val is JetpackItem || val is KeyItem || val is RadarBoosterItem || val is RemoteProp || val is BoomboxItem || val is ClipboardItem || val is FlashlightItem || val is LockPicker || val is MapDevice || val is Shovel || val is WalkieTalkie || val is StunGrenadeItem || val is TetraChemicalItem || val is ShotgunItem || val is HauntedMaskItem || val is GunAmmo || val is WhoopieCushionItem || val is SprayPaintItem)))) { if (!val.isPocketed) { flag3 = true; } array[i] = val; __instance.ItemSlots[i] = null; } } __state[5] = flag3; if (flag3) { __instance.isHoldingObject = false; } return true; } [HarmonyPatch(typeof(PlayerControllerB), "DropAllHeldItems")] [HarmonyPostfix] private static void PostDropAllHeldItems(PlayerControllerB __instance, object[] __state) { //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Expected O, but got Unknown GrabbableObject[] array = (GrabbableObject[])__state[0]; float num = 1f; for (int i = 0; i < array.Length; i++) { GrabbableObject val = array[i]; if (Object.op_Implicit((Object)(object)val)) { __instance.ItemSlots[i] = val; array[i] = null; num += Mathf.Clamp(val.itemProperties.weight - 1f, 0f, 10f); } } __instance.carryWeight = num; if ((bool)__state[5]) { __instance.isHoldingObject = (bool)__state[1]; __instance.activatingItem = (bool)__state[2]; __instance.twoHanded = (bool)__state[3]; __instance.currentlyHeldObjectServer = (GrabbableObject)__state[4]; } } [HarmonyPatch(typeof(ShipTeleporter), "TeleportPlayerOutWithInverseTeleporter")] [HarmonyPrefix] private static bool TeleportPlayerOutWithInverseTeleporter(ShipTeleporter __instance, ref int[] ___playersBeingTeleported, int playerObj, Vector3 teleportPos) { //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) PlayerControllerB val = StartOfRound.Instance.allPlayerScripts[playerObj]; if (val.isPlayerDead) { return true; } val.DropAllHeldItems(true, false); val.shipTeleporterId = -1; ___playersBeingTeleported[val.playerClientId] = (int)val.playerClientId; if (Object.op_Implicit((Object)(object)Object.FindObjectOfType<AudioReverbPresets>())) { Object.FindObjectOfType<AudioReverbPresets>().audioPresets[2].ChangeAudioReverbForPlayer(val); } val.isInElevator = false; val.isInHangarShipRoom = false; val.isInsideFactory = true; val.averageVelocity = 0f; val.velocityLastFrame = Vector3.zero; val.TeleportPlayer(teleportPos, false, 0f, false, true); val.beamOutParticle.Play(); __instance.shipTeleporterAudio.PlayOneShot(__instance.teleporterBeamUpSFX); val.movementAudio.PlayOneShot(__instance.teleporterBeamUpSFX); if ((Object)(object)val == (Object)(object)GameNetworkManager.Instance.localPlayerController) { Debug.Log((object)"Teleporter shaking camera"); HUDManager.Instance.ShakeCamera((ScreenShakeType)1); } return false; } } [BepInPlugin("Kyxino.LethalUtils", "LethalUtilities", "1.2.21")] public class UtilsMod : BaseUnityPlugin { public const bool DEBUGGINGMODE = false; private const string ModGUID = "Kyxino.LethalUtils"; private const string ModName = "LethalUtilities"; private const string ModVersion = "1.2.21"; private const string ModWebsite = "https://discord.gg/rzQcgRDQw3"; private const string ModDescription = "(Enemy Spawn Weights FULLY Fixed!) Customize all kinds of things like your gear, sprint, teleporters, map/weather multipliers for spawning and scrap value/amount, and even disable LC_API mod list!"; public static BepInPlugin Metadata = MetadataHelper.GetMetadata(typeof(UtilsMod)); private string[] Dependencies = new string[1] { "BepInEx-BepInExPack-5.4.2100" }; private readonly Harmony harmony = new Harmony("Kyxino.LethalUtils"); public static ManualLogSource MLS; public static ConfigFile GeneralConfig = new ConfigFile(Paths.ConfigPath + "\\LethalUtilities\\GeneralSettings.cfg", saveOnInit: true, Metadata); public static ConfigFile RoundConfig = new ConfigFile(Paths.ConfigPath + "\\LethalUtilities\\RoundSettings.cfg", saveOnInit: true, Metadata); public static ConfigFile CompanyConfig = new ConfigFile(Paths.ConfigPath + "\\LethalUtilities\\CompanySettings.cfg", saveOnInit: true, Metadata); public static ConfigFile HUDConfig = new ConfigFile(Paths.ConfigPath + "\\LethalUtilities\\HUDSettings.cfg", saveOnInit: true, Metadata); public static ConfigFile CharacterConfig = new ConfigFile(Paths.ConfigPath + "\\LethalUtilities\\CharacterSettings.cfg", saveOnInit: true, Metadata); public static ConfigFile TeleportConfig = new ConfigFile(Paths.ConfigPath + "\\LethalUtilities\\TeleportSettings.cfg", saveOnInit: true, Metadata); public static ConfigFile GearConfig = new ConfigFile(Paths.ConfigPath + "\\LethalUtilities\\GearSettings.cfg", saveOnInit: true, Metadata); public static ConfigFile MapConfig = new ConfigFile(Paths.ConfigPath + "\\LethalUtilities\\MapSettings.cfg", saveOnInit: true, Metadata); public static ConfigFile WeatherConfig = new ConfigFile(Paths.ConfigPath + "\\LethalUtilities\\WeatherSettings.cfg", saveOnInit: true, Metadata); public static ConfigFile ShipConfig = new ConfigFile(Paths.ConfigPath + "\\LethalUtilities\\ShipSettings.cfg", saveOnInit: true, Metadata); public static ConfigFile LobbyConfig = new ConfigFile(Paths.ConfigPath + "\\LethalUtilities\\LobbySettings.cfg", saveOnInit: true, Metadata); public static ConfigEntry<string> MODVERSION = GeneralConfig.Bind("Active Settings", "ModVersion", "1.2.21", "Version of the mod from which the configs were saved."); public static ConfigEntry<T> ConfigTransfer<T>(ConfigFile FromConfigFile, ConfigFile ToConfigFile, ConfigDefinition FromDefinition, ConfigDefinition ToDefinition, T DefaultValue, ConfigDescription Description) { ConfigEntry<T> configEntry = FromConfigFile.Bind(FromDefinition, DefaultValue); ConfigEntry<T> configEntry2 = ToConfigFile.Bind(ToDefinition, DefaultValue, Description); if (!configEntry.Value.Equals((T)configEntry.DefaultValue) && configEntry2.Value.Equals((T)configEntry2.DefaultValue)) { configEntry2.Value = configEntry.Value; if (FromConfigFile != ToConfigFile) { ToConfigFile.Save(); } } FromConfigFile.Remove(FromDefinition); FromConfigFile.Save(); return configEntry2; } public static ConfigEntry<T> ConfigTransfer<T>(ConfigFile FromConfigFile, ConfigFile ToConfigFile, string FromCategory, string FromVariable, string ToCategory, string ToVariable, T DefaultValue, string Description) { return ConfigTransfer(FromConfigFile, ToConfigFile, new ConfigDefinition(FromCategory, FromVariable), new ConfigDefinition(ToCategory, ToVariable), DefaultValue, new ConfigDescription(Description, null)); } public static ConfigEntry<T> ConfigTransfer<T>(ConfigFile ConfigFile, string FromCategory, string FromVariable, string ToCategory, string ToVariable, T DefaultValue, string Description) { return ConfigTransfer(ConfigFile, ConfigFile, new ConfigDefinition(FromCategory, FromVariable), new ConfigDefinition(ToCategory, ToVariable), DefaultValue, new ConfigDescription(Description, null)); } public static ConfigEntry<T> ConfigTransfer<T>(ConfigFile ConfigFile, ConfigDefinition FromDefinition, ConfigDefinition ToDefinition, T DefaultValue, string Description) { return ConfigTransfer(ConfigFile, ConfigFile, FromDefinition, ToDefinition, DefaultValue, new ConfigDescription(Description, null)); } public static ConfigEntry<T> ConfigTransfer<T>(ConfigFile ConfigFile, string Category, string FromVariable, string ToVariable, T DefaultValue, string Description) { return ConfigTransfer(ConfigFile, ConfigFile, new ConfigDefinition(Category, FromVariable), new ConfigDefinition(Category, ToVariable), DefaultValue, new ConfigDescription(Description, null)); } private void Awake() { MLS = Logger.CreateLogSource("Kyxino.LethalUtils"); bool flag = false; if (Directory.Exists(Paths.PluginPath + "\\kyxino-LethalUtilities\\config")) { Directory.Delete(Paths.PluginPath + "\\kyxino-LethalUtilities\\config", recursive: true); } MLS.LogInfo((object)"Loading all settings."); MLS.LogInfo((object)"YEEEEEEEET"); if (GeneralSettings.ConfigEnabled.Value) { harmony.PatchAll(typeof(GeneralPatch)); } if (RoundSettings.ConfigEnabled.Value) { harmony.PatchAll(typeof(RoundPatch)); } if (CompanySettings.ConfigEnabled.Value) { harmony.PatchAll(typeof(CompanyPatch)); } if (HUDSettings.ConfigEnabled.Value) { harmony.PatchAll(typeof(HUDPatch)); } if (CharacterSettings.ConfigEnabled.Value) { harmony.PatchAll(typeof(CharacterPatch)); } if (TeleportSettings.ConfigEnabled.Value) { harmony.PatchAll(typeof(TeleportPatch)); } if (GearSettings.ConfigEnabled.Value) { harmony.PatchAll(typeof(GearPatch)); } if (MapSettings.ConfigEnabled.Value || WeatherSettings.ConfigEnabled.Value) { if (MapSettings.ScrapModifiersEnabled.Value || WeatherSettings.ScrapModifiersEnabled.Value) { harmony.PatchAll(typeof(MultipliersPatch)); } if (MapSettings.MapModifiersEnabled.Value || WeatherSettings.MapModifiersEnabled.Value) { harmony.PatchAll(typeof(MapPatch)); } if (MapSettings.TimeModifiersEnabled.Value || WeatherSettings.TimeModifiersEnabled.Value) { harmony.PatchAll(typeof(TimePatch)); } if (MapSettings.SpawnModifiersEnabled.Value || WeatherSettings.SpawnModifiersEnabled.Value) { harmony.PatchAll(typeof(SpawnPatch)); } } if (ShipSettings.ConfigEnabled.Value) { harmony.PatchAll(typeof(ShipPatch)); } if (LobbySettings.ConfigEnabled.Value) { harmony.PatchAll(typeof(LobbyPatch)); } MLS.LogInfo((object)"All enabled patches have been executed."); GeneralConfig.Bind("Active Settings", "ModVersion", "1.2.21", "Version of the mod from which the configs were saved.").Value = "1.2.21"; GeneralConfig.Save(); MLS.LogInfo((object)"Saved mod version to GeneralConfig."); } } } namespace LethalUtilities.Configuration { public sealed class SettingChangedEventArgs : EventArgs { public ConfigEntryBase ChangedSetting { get; } public SettingChangedEventArgs(ConfigEntryBase cha