The BepInEx console will not appear when launching like it does for other games on Thunderstore (you can turn it back on in your BepInEx.cfg file). If your PEAK crashes on startup, add -dx12 to your launch parameters.
Decompiled source of Custom Biome Intros v1.1.0
CustomBiomeIntros.dll
Decompiled 4 days 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.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using TitlesStorage; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("CustomBiomeIntros")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.1.0.0")] [assembly: AssemblyInformationalVersion("1.1.0")] [assembly: AssemblyProduct("Custom Biome Intros")] [assembly: AssemblyTitle("CustomBiomeIntros")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.1.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace TitlesStorage { [Serializable] public class TitleStorage { public string[] shoreTitles; public string[] tropicsTitles; public string[] alpineTitles; public string[] mesaTitles; public string[] calderaTitles; public string[] kilnTitles; public string[] peakTitles; public string[] tombTitles; public Dictionary<int, string[]> dayCountCaptions; public string[] this[string key] => key switch { "SHORE" => shoreTitles, "TROPICS" => tropicsTitles, "ALPINE" => alpineTitles, "MESA" => mesaTitles, "CALDERA" => calderaTitles, "THE KILN" => kilnTitles, "PEAK" => peakTitles, "TOMB" => tombTitles, _ => null, }; } public class DefaultStorage : TitleStorage { public static TitleStorage defaultTitles = new TitleStorage { shoreTitles = new string[1] { "SHORE" }, tropicsTitles = new string[1] { "TROPICS" }, alpineTitles = new string[1] { "ALPINE" }, mesaTitles = new string[1] { "MESA" }, calderaTitles = new string[1] { "CALDERA" }, kilnTitles = new string[1] { "THE KILN" }, peakTitles = new string[1] { "PEAK" }, tombTitles = new string[1] { "TOMB" }, dayCountCaptions = new Dictionary<int, string[]> { { 1, new string[1] { "DAY #" } } } }; } } namespace CustomBiomeIntros { [BepInPlugin("net.catcraze777.plugins.custombiomeintros", "Custom Biome Intros", "1.1.0")] public class CustomBiomeIntrosPlugin : BaseUnityPlugin { [HarmonyPatch(/*Could not decode attribute arguments.*/)] private class ProgressPointPatcher { private static bool Prefix(ProgressPoint __instance, ref string __result) { try { string[] stringArray; if (customTitles != null && (stringArray = customTitles[__instance.title]) != null) { __result = PickRandomString(stringArray).Trim(); Logger.LogInfo((object)("Selected biome text \"" + __result + "\" for biome " + __instance.title + "!")); return false; } Logger.LogError((object)("Unknown title \"" + __instance.title + "\" received!")); } catch (Exception ex) { Logger.LogError((object)("Error in ProgressPoint localizedTitle patch: " + ex.Message)); } return true; } } [HarmonyPatch(typeof(DayNightManager), "DayCountString")] private class DayNightManagerPatcher { private static bool Prefix(DayNightManager __instance, ref string __result) { try { string text = PickRandomDayString(__instance.dayCount).Trim(); if (text.Length > 0) { __result = text; __result = __result.Replace("#", ((string)typeof(DayNightManager).GetMethod("IntToNumberWord", BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, new object[1] { __instance.dayCount })) ?? ""); Logger.LogInfo((object)$"Selected day count text \"{__result}\" for Day {__instance.dayCount}!"); return false; } } catch (Exception ex) { Logger.LogError((object)("Error in DayNightManager DayCountString patch: " + ex.Message)); } return true; } } internal static ManualLogSource Logger; private static Harmony _harmony; public static TitleStorage customTitles = DefaultStorage.defaultTitles; public const string PLUGIN_GUID = "net.catcraze777.plugins.custombiomeintros"; private static Random random = new Random(); private static ConfigEntry<string> shoreTitlesConfig; private static ConfigEntry<string> tropicsTitlesConfig; private static ConfigEntry<string> alpineTitlesConfig; private static ConfigEntry<string> mesaTitlesConfig; private static ConfigEntry<string> calderaTitlesConfig; private static ConfigEntry<string> kilnTitlesConfig; private static ConfigEntry<string> peakTitlesConfig; private static ConfigEntry<string> tombTitlesConfig; private static Dictionary<int, ConfigEntry<string>> dayCountCaptionsConfig = new Dictionary<int, ConfigEntry<string>>(); private static string PickRandomString(string[] stringArray) { return stringArray[random.Next(stringArray.Length)]; } private static string PickRandomDayString(int dayNumber) { string[] stringArray = new string[1] { "WHAT DAY IS IT" }; int num = -1; foreach (int key in customTitles.dayCountCaptions.Keys) { if (key <= dayNumber && key > num) { stringArray = customTitles.dayCountCaptions[key]; num = key; } } if (num <= 0) { Logger.LogError((object)$"No day caption found for day #{dayNumber}, ensure theres an entry with a day less than or equal to this one!"); return ""; } Logger.LogInfo((object)$"Using day {num} captions for day {dayNumber}..."); return PickRandomString(stringArray); } private static string SerializeArray(string[] strArray) { return string.Join(",", strArray); } private static string[] DeserializeArray(string str) { return str.Split(','); } private void InitConfigEntries() { customTitles = DefaultStorage.defaultTitles; Logger.LogInfo((object)"Binding biome titles..."); shoreTitlesConfig = ((BaseUnityPlugin)this).Config.Bind<string>("Biome Titles", "Shore Titles", SerializeArray(customTitles.shoreTitles), "A list of phrases separated by commas (,)"); tropicsTitlesConfig = ((BaseUnityPlugin)this).Config.Bind<string>("Biome Titles", "Tropics Titles", SerializeArray(customTitles.tropicsTitles), "A list of phrases separated by commas (,)"); alpineTitlesConfig = ((BaseUnityPlugin)this).Config.Bind<string>("Biome Titles", "Alpine Titles", SerializeArray(customTitles.alpineTitles), "A list of phrases separated by commas (,)"); mesaTitlesConfig = ((BaseUnityPlugin)this).Config.Bind<string>("Biome Titles", "Mesa Titles", SerializeArray(customTitles.mesaTitles), "A list of phrases separated by commas (,)"); calderaTitlesConfig = ((BaseUnityPlugin)this).Config.Bind<string>("Biome Titles", "Caldera Titles", SerializeArray(customTitles.calderaTitles), "A list of phrases separated by commas (,)"); kilnTitlesConfig = ((BaseUnityPlugin)this).Config.Bind<string>("Biome Titles", "Kiln Titles", SerializeArray(customTitles.kilnTitles), "A list of phrases separated by commas (,)"); peakTitlesConfig = ((BaseUnityPlugin)this).Config.Bind<string>("Biome Titles", "Peak Titles", SerializeArray(customTitles.peakTitles), "A list of phrases separated by commas (,)"); tombTitlesConfig = ((BaseUnityPlugin)this).Config.Bind<string>("Biome Titles", "Tomb Titles", SerializeArray(customTitles.tombTitles), "A list of phrases separated by commas (,)"); List<int> list = new List<int>(); list.Add(1); if (File.Exists(((BaseUnityPlugin)this).Config.ConfigFilePath)) { try { string text = null; foreach (string item in File.ReadLines(((BaseUnityPlugin)this).Config.ConfigFilePath)) { string text2 = item.Trim(); int num = text2.IndexOf('[') + 1; int num2 = text2.LastIndexOf(']'); if (num != -1 && num2 != -1 && num < num2) { text = text2.Substring(num, num2 - num); } else { if (!(text == "Day Subtitles") || text2.Length <= 0 || text2[0] == '#') { continue; } int num3 = text2.IndexOf("="); if (num3 != -1) { string text3 = text2.Substring(0, num3); text3 = text3.Trim(); if (text3.IndexOf("Day ") == 0 && text3 != "Day 1" && int.TryParse(text3.Substring(4), out var result)) { list.Add(result); } } } } } catch (Exception ex) { Logger.LogError((object)$"An error occured trying to initialize the config entries. ${ex.GetType()} {ex.Message}\n{ex.Source}\n{ex.TargetSite}\n{ex.StackTrace}"); } } string text4 = SerializeArray(customTitles.dayCountCaptions[1]); string text5 = "Binding configs for day subtitle keys "; foreach (int item2 in list) { text5 += $"Day {item2}, "; dayCountCaptionsConfig[item2] = ((BaseUnityPlugin)this).Config.Bind<string>("Day Subtitles", $"Day {item2}", text4, $"A list of phrases separated by commas (,) to show at or past day {item2}. Use '#' and it will automatically be replaced with the current day number. Copy this config entry to add phrases to different days!"); } text5 = text5.Substring(0, text5.Length - 2) + "..."; if (list.Count > 1) { text5 = text5.Substring(0, text5.LastIndexOf(",") + 1) + " and" + text5.Substring(text5.LastIndexOf(",") + 1); } Logger.LogInfo((object)text5); } private void TrySaveTitles() { shoreTitlesConfig.Value = SerializeArray(customTitles.shoreTitles); tropicsTitlesConfig.Value = SerializeArray(customTitles.tropicsTitles); alpineTitlesConfig.Value = SerializeArray(customTitles.alpineTitles); mesaTitlesConfig.Value = SerializeArray(customTitles.mesaTitles); calderaTitlesConfig.Value = SerializeArray(customTitles.calderaTitles); kilnTitlesConfig.Value = SerializeArray(customTitles.kilnTitles); peakTitlesConfig.Value = SerializeArray(customTitles.peakTitles); tombTitlesConfig.Value = SerializeArray(customTitles.tombTitles); foreach (KeyValuePair<int, string[]> dayCountCaption in customTitles.dayCountCaptions) { if (!dayCountCaptionsConfig.ContainsKey(dayCountCaption.Key)) { dayCountCaptionsConfig[dayCountCaption.Key] = ((BaseUnityPlugin)this).Config.Bind<string>("Day Subtitles", $"Day {dayCountCaption.Key}", SerializeArray(DefaultStorage.defaultTitles.dayCountCaptions[1]), $"A list of phrases separated by commas (,) to show at or past day {dayCountCaption.Key}. Use '#' and it will automatically be replaced with the current day number."); } dayCountCaptionsConfig[dayCountCaption.Key].Value = SerializeArray(dayCountCaption.Value); } } private void TryReadTitles() { customTitles.shoreTitles = DeserializeArray(shoreTitlesConfig.Value); customTitles.tropicsTitles = DeserializeArray(tropicsTitlesConfig.Value); customTitles.alpineTitles = DeserializeArray(alpineTitlesConfig.Value); customTitles.mesaTitles = DeserializeArray(mesaTitlesConfig.Value); customTitles.calderaTitles = DeserializeArray(calderaTitlesConfig.Value); customTitles.kilnTitles = DeserializeArray(kilnTitlesConfig.Value); customTitles.peakTitles = DeserializeArray(peakTitlesConfig.Value); customTitles.tombTitles = DeserializeArray(tombTitlesConfig.Value); foreach (KeyValuePair<int, ConfigEntry<string>> item in dayCountCaptionsConfig) { customTitles.dayCountCaptions[item.Key] = DeserializeArray(item.Value.Value); } } private void Awake() { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown Logger = ((BaseUnityPlugin)this).Logger; Logger.LogInfo((object)"Plugin net.catcraze777.plugins.custombiomeintros is reading titles..."); _harmony = new Harmony("net.catcraze777.plugins.custombiomeintros"); _harmony.PatchAll(); try { InitConfigEntries(); TryReadTitles(); TitleStorage tempStorage = DefaultStorage.defaultTitles; bool changesMade = false; if (customTitles == null) { Logger.LogError((object)"Custom titles is null after reading, setting it to the defaults."); changesMade = true; customTitles = DefaultStorage.defaultTitles; } else { removeEmptyStrings(ref customTitles.shoreTitles); removeEmptyStrings(ref customTitles.tropicsTitles); removeEmptyStrings(ref customTitles.alpineTitles); removeEmptyStrings(ref customTitles.mesaTitles); removeEmptyStrings(ref customTitles.calderaTitles); removeEmptyStrings(ref customTitles.kilnTitles); removeEmptyStrings(ref customTitles.peakTitles); removeEmptyStrings(ref customTitles.tombTitles); if (customTitles.shoreTitles == null) { changesMade = true; customTitles.shoreTitles = tempStorage.shoreTitles; Logger.LogError((object)"Shore titles missing after reading, setting it to the defaults."); } if (customTitles.tropicsTitles == null) { changesMade = true; customTitles.tropicsTitles = tempStorage.tropicsTitles; Logger.LogError((object)"Tropics titles missing after reading, setting it to the defaults."); } if (customTitles.alpineTitles == null) { changesMade = true; customTitles.alpineTitles = tempStorage.alpineTitles; Logger.LogError((object)"Alpine titles missing after reading, setting it to the defaults."); } if (customTitles.mesaTitles == null) { changesMade = true; customTitles.mesaTitles = tempStorage.mesaTitles; Logger.LogError((object)"Mesa titles missing after reading, setting it to the defaults."); } if (customTitles.calderaTitles == null) { changesMade = true; customTitles.calderaTitles = tempStorage.calderaTitles; Logger.LogError((object)"Caldera titles missing after reading, setting it to the defaults."); } if (customTitles.kilnTitles == null) { changesMade = true; customTitles.kilnTitles = tempStorage.kilnTitles; Logger.LogError((object)"Kiln titles missing after reading, setting it to the defaults."); } if (customTitles.peakTitles == null) { changesMade = true; customTitles.peakTitles = tempStorage.peakTitles; Logger.LogError((object)"Peak titles missing after reading, setting it to the defaults."); } if (customTitles.tombTitles == null) { changesMade = true; customTitles.tombTitles = tempStorage.tombTitles; Logger.LogError((object)"Tomb titles missing after reading, setting it to the defaults."); } if (customTitles.dayCountCaptions == null) { loadDefaultDayCountCaptions(); } else { Dictionary<int, List<int>> dictionary = new Dictionary<int, List<int>>(); foreach (int key in customTitles.dayCountCaptions.Keys) { for (int i = 0; i < customTitles.dayCountCaptions[key].Length; i++) { if (customTitles.dayCountCaptions[key][i].Trim().Length <= 0) { if (!dictionary.ContainsKey(key)) { dictionary[key] = new List<int>(); } dictionary[key].Add(i); } } } foreach (int key2 in dictionary.Keys) { List<string> list = customTitles.dayCountCaptions[key2].ToList(); for (int num = list.Count - 1; num >= 0; num--) { if (dictionary[key2].Contains(num)) { list.RemoveAt(num); } } customTitles.dayCountCaptions[key2] = list.ToArray(); } List<int> list2 = new List<int>(); foreach (int key3 in customTitles.dayCountCaptions.Keys) { if (customTitles.dayCountCaptions[key3].Length == 0) { list2.Add(key3); changesMade = true; Logger.LogError((object)$"Day count captions for day {key3} is empty, getting rid of this entry."); } } foreach (int item in list2) { customTitles.dayCountCaptions.Remove(item); } if (customTitles.dayCountCaptions.Count <= 0) { loadDefaultDayCountCaptions(); } } } if (changesMade) { TrySaveTitles(); Logger.LogInfo((object)"Saving changes to file..."); } Logger.LogInfo((object)"Plugin net.catcraze777.plugins.custombiomeintros is loaded!"); void loadDefaultDayCountCaptions() { changesMade = true; customTitles.dayCountCaptions = tempStorage.dayCountCaptions; Logger.LogError((object)"Day Count subtitles missing after reading, setting it to the defaults."); } } catch (Exception ex) { Logger.LogError((object)$"An error occured trying to load the title config. ${ex.GetType()} {ex.Message}\n{ex.Source}\n{ex.TargetSite}\n{ex.StackTrace}"); } static void removeEmptyStrings(ref string[] array) { if (array != null) { List<string> list3 = array.ToList(); for (int num2 = list3.Count - 1; num2 >= 0; num2--) { list3[num2] = list3[num2].Trim(); if (list3[num2].Length <= 0) { list3.RemoveAt(num2); } } array = list3.ToArray(); if (array.Length == 0) { array = null; } } } } } public static class MyPluginInfo { public const string PLUGIN_GUID = "CustomBiomeIntros"; public const string PLUGIN_NAME = "Custom Biome Intros"; public const string PLUGIN_VERSION = "1.1.0"; } }