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 CustomMoonPrices v1.1.5
CustomMoonPrices.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Versioning; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using CustomMoonPrices; using CustomMoonPrices.Patches; using GameNetcodeStuff; using HarmonyLib; using LCCustomMoonPrices; using LethalConfig; using LethalConfig.ConfigItems; using LethalLevelLoader; using Unity.Collections; 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("CustomMoonPrices")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("CustomMoonPrices")] [assembly: AssemblyCopyright("Copyright © 2024")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("9a728026-3819-4911-81cd-1be3f886290a")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] namespace LCCustomMoonPrices { [Serializable] public class SyncedInstance<T> { private static readonly DataContractSerializer serializer = new DataContractSerializer(typeof(T)); [NonSerialized] protected static int IntSize = 4; internal static CustomMessagingManager MessageManager => NetworkManager.Singleton.CustomMessagingManager; internal static bool IsClient => NetworkManager.Singleton.IsClient; internal static bool IsHost => NetworkManager.Singleton.IsHost; public static T Default { get; private set; } public static T Instance { get; private set; } public static bool Synced { get; internal set; } protected void InitInstance(T instance) { Default = instance; Instance = instance; IntSize = 4; } internal static void SyncInstance(byte[] data) { Instance = DeserializeFromBytes(data); Synced = true; } internal static void RevertSync() { Instance = Default; Synced = false; } public static byte[] SerializeToBytes(T val) { using MemoryStream memoryStream = new MemoryStream(); try { ((XmlObjectSerializer)serializer).WriteObject((Stream)memoryStream, (object)val); return memoryStream.ToArray(); } catch (Exception ex) { CustomMoonPricesMain.CMPLogger.LogError((object)("Error serializing instance: " + ex)); return null; } } public static T DeserializeFromBytes(byte[] data) { BinaryFormatter binaryFormatter = new BinaryFormatter(); using MemoryStream memoryStream = new MemoryStream(data); try { return (T)((XmlObjectSerializer)serializer).ReadObject((Stream)memoryStream); } catch (Exception ex) { CustomMoonPricesMain.CMPLogger.LogError((object)("Error deserializing instance: " + ex)); return default(T); } } } } namespace CustomMoonPrices { [Serializable] public class Config : SyncedInstance<Config> { public Dictionary<string, moonData> moonData; public Config() { InitInstance(this); moonData = new Dictionary<string, moonData>(); } public void updateMoonEnabled(string moonname, bool enabled) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) if (!SyncedInstance<Config>.IsHost) { return; } SyncedInstance<Config>.Instance.moonData[moonname].setEnabled(enabled); FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(30000, (Allocator)2, -1); try { SyncedInstance<Config>.MessageManager.SendNamedMessageToAll("CMP_OSC", val, (NetworkDelivery)3); } finally { ((IDisposable)(FastBufferWriter)(ref val)).Dispose(); } } public void updateMoonPrice(string moonname, int price) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) if (!SyncedInstance<Config>.IsHost) { return; } SyncedInstance<Config>.Instance.moonData[moonname].setPrice(price); FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(30000, (Allocator)2, -1); try { SyncedInstance<Config>.MessageManager.SendNamedMessageToAll("CMP_OSC", val, (NetworkDelivery)3); } finally { ((IDisposable)(FastBufferWriter)(ref val)).Dispose(); } } internal static void RequestSync() { //IL_002a: Unknown result type (might be due to invalid IL or missing references) if (!SyncedInstance<Config>.IsClient) { return; } FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(30000, (Allocator)2, -1); try { SyncedInstance<Config>.MessageManager.SendNamedMessage("CMP_ORS", 0uL, val, (NetworkDelivery)3); } finally { ((IDisposable)(FastBufferWriter)(ref val)).Dispose(); } } internal static void OnRequestSync(ulong clientId, FastBufferReader _) { //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) if (!SyncedInstance<Config>.IsHost) { return; } CustomMoonPricesMain.CMPLogger.LogDebug((object)$"Config sync request received from client: {clientId}"); byte[] array = SyncedInstance<Config>.SerializeToBytes(SyncedInstance<Config>.Instance); int num = array.Length; int num2 = num + SyncedInstance<Config>.IntSize; FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(num2, (Allocator)2, -1); try { bool flag = ((FastBufferWriter)(ref val)).Capacity > 1000; NetworkDelivery val2 = (NetworkDelivery)(flag ? 4 : 2); if (flag) { CustomMoonPricesMain.CMPLogger.LogDebug((object)($"Size of stream ({((FastBufferWriter)(ref val)).Capacity}) was past the max buffer size.\n" + "Config instance will be sent in fragments to avoid overflowing the buffer.")); } ((FastBufferWriter)(ref val)).WriteValueSafe<int>(ref num, default(ForPrimitives)); ((FastBufferWriter)(ref val)).WriteBytesSafe(array, num, 0); SyncedInstance<Config>.MessageManager.SendNamedMessage("CMP_ORCS", clientId, val, val2); } catch (Exception arg) { CustomMoonPricesMain.CMPLogger.LogDebug((object)$"Error occurred syncing config with client: {clientId}\n{arg}"); } finally { ((IDisposable)(FastBufferWriter)(ref val)).Dispose(); } } internal static void OnReceiveSync(ulong _, FastBufferReader reader) { //IL_0040: 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_00a6: Unknown result type (might be due to invalid IL or missing references) CustomMoonPricesMain.CMPLogger.LogDebug((object)"Config sync received from host."); if (!((FastBufferReader)(ref reader)).TryBeginRead(SyncedInstance<Config>.IntSize)) { CustomMoonPricesMain.CMPLogger.LogError((object)"Config sync error: Could not begin reading buffer."); return; } int num = default(int); ((FastBufferReader)(ref reader)).ReadValueSafe<int>(ref num, default(ForPrimitives)); if (!((FastBufferReader)(ref reader)).TryBeginRead(num)) { CustomMoonPricesMain.CMPLogger.LogError((object)"Config sync error: Host could not sync."); return; } byte[] data = new byte[num]; ((FastBufferReader)(ref reader)).ReadBytesSafe(ref data, num, 0); try { SyncedInstance<Config>.SyncInstance(data); FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(30000, (Allocator)2, -1); try { SyncedInstance<Config>.MessageManager.SendNamedMessage("CMP_SC", 0uL, val, (NetworkDelivery)3); } finally { ((IDisposable)(FastBufferWriter)(ref val)).Dispose(); } } catch (Exception arg) { CustomMoonPricesMain.CMPLogger.LogError((object)$"Error syncing config instance!\n{arg}"); } } internal static void OnSettingChange(ulong _, FastBufferReader reader) { if (SyncedInstance<Config>.IsClient) { RequestSync(); } } internal static void OnReceivedSync(ulong senderClientId, FastBufferReader messagePayload) { if (SyncedInstance<Config>.IsHost) { CustomMoonPricesMain.CMPLogger.LogDebug((object)("Client " + senderClientId + " Succesfully Synced.")); } } } [BepInPlugin("zz.cursedbreath.custommoonprices", "Custom Moon Prices", "1.1.2")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInProcess("Lethal Company.exe")] public class CustomMoonPricesMain : BaseUnityPlugin { public const string UMID = "zz.cursedbreath.custommoonprices"; public const string NAME = "Custom Moon Prices"; public const string VERSION = "1.1.2"; private Harmony harmony; public static CustomMoonPricesMain CustomMoonPricesMainInstance; public static ConfigFile LethalConfigSettings; public static bool existLethalLevelLoader; public static ManualLogSource CMPLogger; private void Awake() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown CMPLogger = ((BaseUnityPlugin)this).Logger; harmony = new Harmony("zz.cursedbreath.custommoonprices"); LethalConfigSettings = ((BaseUnityPlugin)this).Config; new Config(); harmony.PatchAll(typeof(MoonPricePatches)); harmony.PatchAll(typeof(ConfigSyncPatch)); foreach (PluginInfo item in Chainloader.PluginInfos.Values.ToList()) { if (item.Metadata.GUID == "imabatby.lethallevelloader") { existLethalLevelLoader = true; } } } } [Serializable] public class moonData { private bool enabled; private int price; public moonData(bool enabled, int price) { this.enabled = enabled; this.price = price; } public bool getEnabled() { return enabled; } public int getPrice() { return price; } public void setEnabled(bool enabled) { this.enabled = enabled; } public void setPrice(int price) { this.price = price; } } } namespace CustomMoonPrices.Patches { public class ConfigSyncPatch { [HarmonyPostfix] [HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")] public static void InitializeLocalPlayer() { //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Expected O, but got Unknown //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Expected O, but got Unknown if (SyncedInstance<Config>.IsHost) { SyncedInstance<Config>.MessageManager.RegisterNamedMessageHandler("CMP_ORS", new HandleNamedMessageDelegate(Config.OnRequestSync)); SyncedInstance<Config>.MessageManager.RegisterNamedMessageHandler("CMP_SC", new HandleNamedMessageDelegate(Config.OnReceivedSync)); SyncedInstance<Config>.Synced = true; } else { SyncedInstance<Config>.Synced = false; SyncedInstance<Config>.MessageManager.RegisterNamedMessageHandler("CMP_OSC", new HandleNamedMessageDelegate(Config.OnSettingChange)); SyncedInstance<Config>.MessageManager.RegisterNamedMessageHandler("CMP_ORCS", new HandleNamedMessageDelegate(Config.OnReceiveSync)); Config.RequestSync(); } } [HarmonyPostfix] [HarmonyPatch(typeof(GameNetworkManager), "StartDisconnect")] public static void PlayerLeave() { SyncedInstance<Config>.RevertSync(); } } [HarmonyPatch(typeof(Terminal))] public class MoonPricePatches { public static Terminal terminal; private static int totalCostOfItems = -5; private static Dictionary<string, int> defaultMoonPrices = new Dictionary<string, int>(); internal static string GetNumberlessPlanetName(SelectableLevel selectableLevel) { if ((Object)(object)selectableLevel != (Object)null) { return new string(selectableLevel.PlanetName.SkipWhile((char c) => !char.IsLetter(c)).ToArray()); } return string.Empty; } private static string GetMoonName(string id) { return id switch { "8" => "titan", "7" => "dine", "85" => "rend", "61" => "march", "56" => "vow", "220" => "assurance", "41" => "experimentation", "21" => "offense", "5" => "embrion", "68" => "artifice", null => null, _ => null, }; } [HarmonyPriority(100)] [HarmonyPatch(typeof(RoundManager), "Start")] [HarmonyPostfix] internal static void RoundManagerStart_Prefix() { //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_01d8: Expected O, but got Unknown //IL_01da: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Expected O, but got Unknown if (!CustomMoonPricesMain.existLethalLevelLoader) { return; } try { foreach (ExtendedLevel customExtendedLevel in PatchedContent.CustomExtendedLevels) { string configname = customExtendedLevel.NumberlessPlanetName; configname = configname.Replace(" ", "").ToLower(); if (!configname.Contains("gordion")) { ConfigEntry<bool> val = CustomMoonPricesMain.LethalConfigSettings.Bind<bool>(configname, "Enable", false, "Setting if custom Price for: " + configname + " should be applied."); ConfigEntry<int> val2 = CustomMoonPricesMain.LethalConfigSettings.Bind<int>(configname, "Price", 0, "Setting the custom Price for: " + configname + "."); val.SettingChanged += delegate { bool value4 = CustomMoonPricesMain.LethalConfigSettings.Bind<bool>(configname, "Enable", false, "Setting if custom Price for: " + configname + " should be applied.").Value; SyncedInstance<Config>.Instance.updateMoonEnabled(configname, value4); }; val2.SettingChanged += delegate { int value3 = CustomMoonPricesMain.LethalConfigSettings.Bind<int>(configname, "Price", 0, "Setting the custom Price for: " + configname + ".").Value; SyncedInstance<Config>.Instance.updateMoonPrice(configname, value3); }; if (SyncedInstance<Config>.Instance.moonData.ContainsKey(configname)) { bool value = CustomMoonPricesMain.LethalConfigSettings.Bind<bool>(configname, "Enable", false, "Setting if custom Price for: " + configname + " should be applied.").Value; int value2 = CustomMoonPricesMain.LethalConfigSettings.Bind<int>(configname, "Price", 0, "Setting the custom Price for: " + configname + ".").Value; SyncedInstance<Config>.Instance.updateMoonEnabled(configname, value); SyncedInstance<Config>.Instance.updateMoonPrice(configname, value2); } else { SyncedInstance<Config>.Instance.moonData[configname] = new moonData(val.Value, val2.Value); } BoolCheckBoxConfigItem val3 = new BoolCheckBoxConfigItem(val); IntInputFieldConfigItem val4 = new IntInputFieldConfigItem(val2); LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val3); LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val4); if (!defaultMoonPrices.ContainsKey(configname)) { defaultMoonPrices.Add(configname, customExtendedLevel.RoutePrice); } } } CustomMoonPricesMain.LethalConfigSettings.Save(); } catch (Exception ex) { CustomMoonPricesMain.CMPLogger.LogError((object)("Error in finding Adding Moons to Dictionary: " + ex)); } } [HarmonyPatch("Awake")] [HarmonyPostfix] private static void FindTerminal() { //IL_0215: Unknown result type (might be due to invalid IL or missing references) //IL_021c: Expected O, but got Unknown //IL_021e: Unknown result type (might be due to invalid IL or missing references) //IL_0225: Expected O, but got Unknown terminal = Object.FindObjectOfType<Terminal>(); if ((Object)(object)terminal == (Object)null) { CustomMoonPricesMain.CMPLogger.LogDebug((object)"Terminal not found!"); } else { CustomMoonPricesMain.CMPLogger.LogDebug((object)"Terminal found!"); } try { SelectableLevel[] levels = StartOfRound.Instance.levels; foreach (SelectableLevel val in levels) { if (!((Object)val).name.Contains("Company")) { string configname = GetNumberlessPlanetName(val).ToLower(); CustomMoonPricesMain.CMPLogger.LogDebug((object)("ConfigName: " + configname)); ConfigEntry<bool> val2 = CustomMoonPricesMain.LethalConfigSettings.Bind<bool>(configname, "Enable", false, "Setting if custom Price for: " + configname + " should be applied."); ConfigEntry<int> val3 = CustomMoonPricesMain.LethalConfigSettings.Bind<int>(configname, "Price", 0, "Setting the custom Price for: " + configname + "."); val2.SettingChanged += delegate { bool value4 = CustomMoonPricesMain.LethalConfigSettings.Bind<bool>(configname, "Enable", false, "Setting if custom Price for: " + configname + " should be applied.").Value; SyncedInstance<Config>.Instance.updateMoonEnabled(configname, value4); }; val3.SettingChanged += delegate { int value3 = CustomMoonPricesMain.LethalConfigSettings.Bind<int>(configname, "Price", 0, "Setting the custom Price for: " + configname + ".").Value; SyncedInstance<Config>.Instance.updateMoonPrice(configname, value3); }; if (SyncedInstance<Config>.Instance.moonData.ContainsKey(configname)) { bool value = CustomMoonPricesMain.LethalConfigSettings.Bind<bool>(configname, "Enable", false, "Setting if custom Price for: " + configname + " should be applied.").Value; int value2 = CustomMoonPricesMain.LethalConfigSettings.Bind<int>(configname, "Price", 0, "Setting the custom Price for: " + configname + ".").Value; SyncedInstance<Config>.Instance.updateMoonEnabled(configname, value); SyncedInstance<Config>.Instance.updateMoonPrice(configname, value2); } else { SyncedInstance<Config>.Instance.moonData[configname] = new moonData(val2.Value, val3.Value); } BoolCheckBoxConfigItem val4 = new BoolCheckBoxConfigItem(val2); IntInputFieldConfigItem val5 = new IntInputFieldConfigItem(val3); LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val4); LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val5); if (!defaultMoonPrices.ContainsKey(configname)) { defaultMoonPrices.Add(configname, 0); } if (!SyncedInstance<Config>.Instance.moonData.ContainsKey(configname)) { SyncedInstance<Config>.Instance.moonData[configname] = new moonData(val2.Value, val3.Value); } } } CustomMoonPricesMain.LethalConfigSettings.Save(); } catch (Exception ex) { CustomMoonPricesMain.CMPLogger.LogError((object)("Error in finding Adding Moons to Dictionary: " + ex)); } } [HarmonyPatch("LoadNewNode")] [HarmonyPrefix] private static void LoadNewNodePatchBefore(ref TerminalNode node) { if (node.buyRerouteToMoon != -2) { return; } Traverse val = Traverse.Create((object)terminal).Field("totalCostOfItems"); string text = ((Object)node).name; if (text.Contains("route")) { text = text.Replace("route", ""); } if (text.Contains("Route") || text.Contains("Confirm")) { text = text.Replace("Route", ""); text = text.Replace("Confirm", ""); } text = ((GetMoonName(text) == null) ? new string(text.SkipWhile((char c) => !char.IsLetter(c)).ToArray()) : GetMoonName(text)); CustomMoonPricesMain.CMPLogger.LogDebug((object)("Moonname: " + text)); if (text == null) { CustomMoonPricesMain.CMPLogger.LogDebug((object)"Moon not found (Just a Reminder when not a moon node)!"); return; } if (text.Equals("CompanyMoon")) { CustomMoonPricesMain.CMPLogger.LogDebug((object)"Company Moon no Costs Possible!"); return; } try { if (defaultMoonPrices[text] == 0) { defaultMoonPrices[text] = node.itemCost; } if (SyncedInstance<Config>.Instance.moonData[text].getEnabled()) { totalCostOfItems = (int)val.GetValue(); val.SetValue((object)SyncedInstance<Config>.Instance.moonData[text].getPrice()); } else { val.SetValue((object)defaultMoonPrices[text]); } } catch (Exception) { } } [HarmonyPatch("LoadNewNode")] [HarmonyPostfix] private static void LoadNewNodePatchAfter(ref TerminalNode node) { Traverse val = Traverse.Create((object)terminal).Field("totalCostOfItems"); if (totalCostOfItems == -5) { return; } string text = ((Object)node).name; if (text.Contains("route")) { text = text.Replace("route", ""); } if (text.Contains("Route") || text.Contains("Confirm")) { text = text.Replace("Route", ""); text = text.Replace("Confirm", ""); } text = ((GetMoonName(text) == null) ? new string(text.SkipWhile((char c) => !char.IsLetter(c)).ToArray()) : GetMoonName(text)); CustomMoonPricesMain.CMPLogger.LogDebug((object)("Moonname: " + text)); if (text == null) { CustomMoonPricesMain.CMPLogger.LogDebug((object)"Moon not found (Just a Reminder when not a moon node)!"); return; } if (text.Equals("CompanyMoon")) { CustomMoonPricesMain.CMPLogger.LogDebug((object)"Company Moon no Costs Possible!"); return; } try { if (SyncedInstance<Config>.Instance.moonData[text].getEnabled()) { val.SetValue((object)SyncedInstance<Config>.Instance.moonData[text].getPrice()); } else { val.SetValue((object)defaultMoonPrices[text]); } totalCostOfItems = -5; } catch (Exception) { } } [HarmonyPatch("LoadNewNodeIfAffordable")] [HarmonyPrefix] private static void LoadNewNodeIfAffordablePatch(ref TerminalNode node) { if ((Object)(object)node == (Object)null || node.buyRerouteToMoon == -1) { return; } string text = ((Object)node).name; if (text.Contains("route")) { text = text.Replace("route", ""); } if (text.Contains("Route") || text.Contains("Confirm")) { text = text.Replace("Route", ""); text = text.Replace("Confirm", ""); } text = ((GetMoonName(text) == null) ? new string(text.SkipWhile((char c) => !char.IsLetter(c)).ToArray()) : GetMoonName(text)); CustomMoonPricesMain.CMPLogger.LogDebug((object)("Moonname: " + text)); if (text == null) { CustomMoonPricesMain.CMPLogger.LogDebug((object)"Moon not found (Just a Reminder when not a moon node)!"); return; } if (text.Equals("CompanyMoon")) { CustomMoonPricesMain.CMPLogger.LogDebug((object)"Company Moon no Costs Possible!"); return; } try { if (SyncedInstance<Config>.Instance.moonData[text].getEnabled()) { node.itemCost = SyncedInstance<Config>.Instance.moonData[text].getPrice(); } else { node.itemCost = defaultMoonPrices[text]; } } catch (Exception) { } } } }