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 DecalsPeakTools v1.0.0
DecalsPeakTools.dll
Decompiled a week agousing System; using System.Collections; 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.Logging; using DecalsPeakTools.Behaviours; using DecalsPeakTools.Interfaces; using DecalsPeakTools.Models; using DecalsPeakTools.Models.Configuration; using DecalsPeakTools.Tools; using HarmonyLib; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Photon.Pun; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.SceneManagement; using UnityEngine.UI; using Zorro.Core; using Zorro.Core.Editor; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("DecalsPeakTools")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+fe234e17b2060982e7dbd8d565e92f1cc4986e4a")] [assembly: AssemblyProduct("DecalsPeakTools")] [assembly: AssemblyTitle("DecalsPeakTools")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace DecalsPeakTools { public class Constants { public const string Guid = "decalfree.decalspeaktools"; public const string Name = "DecalsPeakTools"; public const string Version = "1.0.0"; } [BepInPlugin("decalfree.decalspeaktools", "DecalsPeakTools", "1.0.0")] public class Plugin : BaseUnityPlugin { public Plugin() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) Logging.Initialize(); try { Main main = new GameObject("DecalsPeakTools v1.0.0").AddComponent<Main>(); main.Construct(); Object.DontDestroyOnLoad((Object)(object)main); Harmony.CreateAndPatchAll(((object)this).GetType().Assembly, "decalfree.decalspeaktools"); } catch (Exception arg) { Logging.Error(string.Format("Failed to load {0}: {1}", "DecalsPeakTools", arg)); } } } } namespace DecalsPeakTools.Tools { public static class Logging { private static ManualLogSource _logSource; public static void Initialize() { _logSource = Logger.CreateLogSource("DecalsPeakTools"); } private static void Log(LogLevel logLevel, object data) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) _logSource.Log(logLevel, data); } public static void Info(object data) { Log((LogLevel)16, data); } public static void Warning(object data) { Log((LogLevel)4, data); } public static void Error(object data) { Log((LogLevel)2, data); } } } namespace DecalsPeakTools.Patches { [HarmonyPatch(typeof(BoardingPass))] public static class PatchBoardingPass { [HarmonyPatch("Initialize")] [HarmonyPostfix] public static void BoardingPassInitialized(BoardingPass __instance) { Events.BoardingPassInitialized_Invoke(__instance); } } [HarmonyPatch(typeof(DesertRockSpawner))] public static class PatchDesertRockSpawner { [HarmonyPatch("Go")] [HarmonyPrefix] public static bool OverrideTombSpawnChance(DesertRockSpawner __instance) { //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) Logging.Info("DesertRockSpawner - Go has been called."); ((LevelGenStep)__instance).Clear(); for (int i = 0; i < __instance.enterences.childCount; i++) { Transform child = __instance.enterences.GetChild(i); if (i == Random.Range(0, __instance.enterences.childCount) && Random.value < DataManager.Singleton.PlayerConfig.TombSpawnChance.Value) { HelperFunctions.InstantiatePrefab(__instance.enterenceObjects[Random.Range(0, __instance.enterenceObjects.Length)], child.position, child.rotation, child).transform.localScale = Vector3.one * 2f; __instance.inside.position = new Vector3(child.position.x, __instance.inside.position.y, child.position.z); } else { HelperFunctions.InstantiatePrefab(__instance.blockerObjects[Random.Range(0, __instance.blockerObjects.Length)], child.position, child.rotation, child).transform.localScale = Vector3.one * 2f; } } return false; } } [HarmonyPatch(typeof(MapBaker))] public static class PatchMapBaker { [HarmonyPatch("GetLevel")] [HarmonyPrefix] public static bool ShouldOverrideMap(MapBaker __instance, ref string __result) { if (Main.Singleton.LevelSelector.currentLevelIndex == 0) { return true; } __result = PathUtil.WithoutExtensions(PathUtil.GetFileName(__instance.AllLevels[Main.Singleton.LevelSelector.currentLevelIndex - 1])); return false; } } [HarmonyPatch(typeof(VersionString))] public static class PatchVersionString { [HarmonyPatch("Update")] [HarmonyPostfix] public static void RenderExtraInformation(VersionString __instance) { if (PhotonNetwork.InRoom && Main.Singleton.currentSceneName.Contains("Level")) { bool activeSelf = ((Component)Main.Singleton.thirdBiomeObject.transform.GetChild(1)).gameObject.activeSelf; TextMeshProUGUI text = __instance.m_text; ((TMP_Text)text).text = ((TMP_Text)text).text + $"\nIsMesaSeed: {activeSelf}"; } } } } namespace DecalsPeakTools.Models { public static class Events { public delegate void BoardingPassInitializedHandler(BoardingPass boardingPass); public static event BoardingPassInitializedHandler OnBoardingPassInitialized; internal static void BoardingPassInitialized_Invoke(BoardingPass boardingPass) { Events.OnBoardingPassInitialized?.Invoke(boardingPass); } } public class LevelSelector : MonoBehaviour { private readonly List<string> _availableLevels = new List<string>(); public int currentLevelIndex = 0; private TextMeshProUGUI _titleText; private Button _incrementLevelButton; private Button _decrementLevelButton; private int MaxLevelIndex => SingletonAsset<MapBaker>.Instance.AllLevels.Length; private void Start() { //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Expected O, but got Unknown //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Expected O, but got Unknown _titleText = ((Component)((Component)this).transform.Find("Level/Title")).GetComponent<TextMeshProUGUI>(); ((TMP_Text)((Component)((Component)this).transform.Find("BOARDING PASS")).GetComponent<TextMeshProUGUI>()).text = "LEVEL SELECTOR"; ((TMP_Text)((Component)((Component)this).transform.Find("PassengerName")).GetComponent<TextMeshProUGUI>()).text = NetworkConnector.GetUsername(); ((TMP_Text)((Component)((Component)this).transform.Find("StartGameButton/Text")).GetComponent<TextMeshProUGUI>()).text = $"LEVELS:\n0 - {MaxLevelIndex - 1}"; _incrementLevelButton = ((Component)((Component)this).transform.Find("Level/IncrementButton")).GetComponent<Button>(); ((UnityEvent)_incrementLevelButton.onClick).AddListener((UnityAction)delegate { currentLevelIndex++; UpdateLevel(); }); _decrementLevelButton = ((Component)((Component)this).transform.Find("Level/DecrementButton")).GetComponent<Button>(); ((UnityEvent)_decrementLevelButton.onClick).AddListener((UnityAction)delegate { currentLevelIndex--; UpdateLevel(); }); _availableLevels.Add("Level_Daily"); for (int i = 0; i < MaxLevelIndex; i++) { _availableLevels.Add($"Level_{i}"); } UpdateLevel(); } public void UpdateLevel() { ((Selectable)_incrementLevelButton).interactable = currentLevelIndex < MaxLevelIndex; ((Selectable)_decrementLevelButton).interactable = currentLevelIndex > 0; ((TMP_Text)_titleText).text = _availableLevels[currentLevelIndex]; } } public class PlayerConfig { [CompilerGenerated] private sealed class <GetAllConfigOptions>d__8 : IEnumerable<ISharedConfigOption>, IEnumerable, IEnumerator<ISharedConfigOption>, IEnumerator, IDisposable { private int <>1__state; private ISharedConfigOption <>2__current; private int <>l__initialThreadId; public PlayerConfig <>4__this; ISharedConfigOption IEnumerator<ISharedConfigOption>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <GetAllConfigOptions>d__8(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = <>4__this.MonitorResolution; <>1__state = 1; return true; case 1: <>1__state = -1; <>2__current = <>4__this.TombSpawnChance; <>1__state = 2; return true; case 2: <>1__state = -1; return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator<ISharedConfigOption> IEnumerable<ISharedConfigOption>.GetEnumerator() { <GetAllConfigOptions>d__8 result; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; result = this; } else { result = new <GetAllConfigOptions>d__8(0) { <>4__this = <>4__this }; } return result; } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<ISharedConfigOption>)this).GetEnumerator(); } } public StringConfigOption MonitorResolution { get; set; } = new StringConfigOption("Monitor Resolution", "Chosen monitor resolution.", new string[4] { "2560x1440", "1920x1440", "1920x1200", "1920x1080" }, "1920x1080"); public FloatConfigOption TombSpawnChance { get; set; } = new FloatConfigOption("Tomb Spawn Chance", "The chance the Tomb can spawn, 0.5 being 50%, 0 being default seed generation.", new float[11] { 0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1f }, 0f); [IteratorStateMachine(typeof(<GetAllConfigOptions>d__8))] public IEnumerable<ISharedConfigOption> GetAllConfigOptions() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <GetAllConfigOptions>d__8(-2) { <>4__this = this }; } } } namespace DecalsPeakTools.Models.Configuration { public class BooleanConfigOption : SharedConfigOption<bool> { [CompilerGenerated] [DebuggerBrowsable(DebuggerBrowsableState.Never)] private bool <defaultValue>P; private readonly bool[] _acceptedValues; [JsonProperty] public override bool Value { get { return base.Value; } protected set { base.Value = (_acceptedValues.Contains(value) ? value : <defaultValue>P); } } public BooleanConfigOption(string optionName, string optionDescription, bool[] acceptedValues, bool defaultValue) { <defaultValue>P = defaultValue; _acceptedValues = acceptedValues; base..ctor(optionName, optionDescription, acceptedValues, <defaultValue>P); } public override bool IsValid() { return _acceptedValues.Contains(Value); } } public class FloatConfigOption : SharedConfigOption<float> { [CompilerGenerated] [DebuggerBrowsable(DebuggerBrowsableState.Never)] private float <defaultValue>P; private readonly float[] _acceptedValues; [JsonProperty] public override float Value { get { return base.Value; } protected set { base.Value = (_acceptedValues.Contains(value) ? value : <defaultValue>P); } } public FloatConfigOption(string optionName, string optionDescription, float[] acceptedValues, float defaultValue) { <defaultValue>P = defaultValue; _acceptedValues = acceptedValues; base..ctor(optionName, optionDescription, acceptedValues, <defaultValue>P); } public override bool IsValid() { return _acceptedValues.Contains(Value); } } public abstract class SharedConfigOption<T> : ISharedConfigOption { public string OptionName { get; } public string OptionDescription { get; } public T[] AcceptedValues { get; } public T DefaultValue { get; } public virtual T Value { get; protected set; } object ISharedConfigOption.DefaultValue => DefaultValue; object ISharedConfigOption.Value { get { return Value; } set { Value = (T)value; } } protected SharedConfigOption(string optionName, string optionDescription, T[] acceptedValues, T defaultValue) { OptionName = optionName; OptionDescription = optionDescription; AcceptedValues = acceptedValues; DefaultValue = defaultValue; Value = defaultValue; base..ctor(); } public abstract bool IsValid(); public void ResetToDefault() { Value = DefaultValue; } } public class StringConfigOption : SharedConfigOption<string> { [CompilerGenerated] [DebuggerBrowsable(DebuggerBrowsableState.Never)] private string <defaultValue>P; private readonly string[] _acceptedValues; [JsonProperty] public override string Value { get { return base.Value; } protected set { base.Value = (_acceptedValues.Contains(value) ? value : <defaultValue>P); } } public StringConfigOption(string optionName, string optionDescription, string[] acceptedValues, string defaultValue) { <defaultValue>P = defaultValue; _acceptedValues = acceptedValues; base..ctor(optionName, optionDescription, acceptedValues, <defaultValue>P); } public override bool IsValid() { return _acceptedValues.Contains(Value); } } } namespace DecalsPeakTools.Interfaces { public interface ISharedConfigOption { string OptionName { get; } string OptionDescription { get; } object DefaultValue { get; } object Value { get; set; } bool IsValid(); void ResetToDefault(); } } namespace DecalsPeakTools.Behaviours { public class DataManager : MonoBehaviour { private bool _initialized; public static DataManager Singleton; public PlayerConfig PlayerConfig; private string PlayerConfigJsonPath => Paths.ConfigPath + "/DecalsPeakTools.json"; private void Start() { if (_initialized || Object.op_Implicit((Object)(object)Singleton)) { return; } Singleton = this; if (!File.Exists(PlayerConfigJsonPath)) { PlayerConfig = new PlayerConfig(); } else { string text = File.ReadAllText(PlayerConfigJsonPath); PlayerConfig = JsonConvert.DeserializeObject<PlayerConfig>(text); foreach (ISharedConfigOption allConfigOption in PlayerConfig.GetAllConfigOptions()) { if (!allConfigOption.IsValid()) { Logging.Warning(allConfigOption.OptionName + " has an invalid value, resetting to default value!"); allConfigOption.ResetToDefault(); } } } SavePlayerConfig(); _initialized = true; } public void SavePlayerConfig() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown using StreamWriter streamWriter = File.CreateText(PlayerConfigJsonPath); JsonSerializer val = new JsonSerializer { Formatting = (Formatting)1 }; val.Serialize((TextWriter)streamWriter, (object)PlayerConfig); } } public class Main : MonoBehaviour { private bool _initialized; public static Main Singleton; public string currentSceneName; public GameObject thirdBiomeObject; private Transform _levelSelectorPanel; private Transform _levelSelectorBorder; private readonly Dictionary<string, Vector3> _levelSelectorPanelPositions = new Dictionary<string, Vector3> { { "2560x1440", new Vector3(1280f, 220f, 0f) }, { "1920x1440", new Vector3(960f, 220f, 0f) }, { "1920x1200", new Vector3(960f, 180f, 0f) }, { "1920x1080", new Vector3(960f, 165f, 0f) } }; public PlayerConnectionLog PlayerConnectionLog => Object.FindFirstObjectByType<PlayerConnectionLog>(); public LevelSelector LevelSelector => ((Component)_levelSelectorPanel).GetComponent<LevelSelector>(); public void Construct() { if (_initialized || Object.op_Implicit((Object)(object)Singleton)) { Logging.Error("Failed to initialize DecalsPeakTools as it's already initialized."); return; } Singleton = this; ((Component)this).gameObject.AddComponent<DataManager>(); SceneManager.sceneLoaded += SceneLoaded; string text = SingletonAsset<MapBaker>.Instance.AllLevels.Aggregate(string.Empty, (string current, string level) => current + level + "\n"); Logging.Info("Current Levels:\n" + text); Events.OnBoardingPassInitialized += delegate(BoardingPass boardingPass) { //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_01a3: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) if (PhotonNetwork.IsMasterClient) { if (Object.op_Implicit((Object)(object)_levelSelectorPanel) || Object.op_Implicit((Object)(object)_levelSelectorBorder)) { _levelSelectorPanel.position = _levelSelectorPanelPositions[DataManager.Singleton.PlayerConfig.MonitorResolution.Value]; _levelSelectorBorder.position = _levelSelectorPanelPositions[DataManager.Singleton.PlayerConfig.MonitorResolution.Value]; } else { _levelSelectorPanel = Object.Instantiate<Transform>(((Component)boardingPass).transform.Find("BoardingPass/Panel"), ((Component)boardingPass).transform.Find("BoardingPass"), true); ((Component)_levelSelectorPanel).gameObject.AddComponent<LevelSelector>(); ((Object)_levelSelectorPanel).name = "Level Selector Panel"; _levelSelectorPanel.position = _levelSelectorPanelPositions[DataManager.Singleton.PlayerConfig.MonitorResolution.Value]; _levelSelectorPanel.localScale = new Vector3(0.5f, 0.5f, 0.5f); _levelSelectorBorder = Object.Instantiate<Transform>(((Component)boardingPass).transform.Find("BoardingPass/Border"), ((Component)boardingPass).transform.Find("BoardingPass"), true); ((Object)_levelSelectorBorder).name = "Level Selector Border"; _levelSelectorBorder.position = _levelSelectorPanelPositions[DataManager.Singleton.PlayerConfig.MonitorResolution.Value]; _levelSelectorBorder.localScale = new Vector3(0.5f, 0.5f, 0.5f); Object.Destroy((Object)(object)((Component)_levelSelectorPanel.GetChild(2)).GetComponent<LocalizedText>()); Object.Destroy((Object)(object)((Component)_levelSelectorPanel.GetChild(16)).GetComponent<Button>()); Object.Destroy((Object)(object)((Component)_levelSelectorPanel.GetChild(16)).GetComponent<Animator>()); Object.Destroy((Object)(object)((Component)_levelSelectorPanel.GetChild(16).GetChild(0)).GetComponent<LocalizedText>()); ((Component)_levelSelectorPanel.GetChild(16).Find("Scouts")).gameObject.SetActive(false); ((Component)_levelSelectorPanel.GetChild(16).Find("Image")).gameObject.SetActive(false); ((Object)_levelSelectorPanel.GetChild(17)).name = "Level"; ((Component)_levelSelectorPanel.GetChild(17).GetChild(1)).gameObject.SetActive(false); } } }; _initialized = true; Logging.Info(string.Format("Successfully initialized {0}: {1}", "DecalsPeakTools", _initialized)); } private void SceneLoaded(Scene scene, LoadSceneMode loadSceneMode) { currentSceneName = ((Scene)(ref scene)).name; Logging.Info("Loaded scene " + ((Scene)(ref scene)).name); if (!currentSceneName.Contains("Level")) { return; } thirdBiomeObject = GameObject.Find("Map/Biome_3"); if (!Mathf.Approximately(DataManager.Singleton.PlayerConfig.TombSpawnChance.Value, 0f) && ((Component)thirdBiomeObject.transform.GetChild(1)).gameObject.activeSelf) { Transform val = thirdBiomeObject.transform.Find("Desert/Desert_Segment/Platteau/Rocks/Timple"); DesertRockSpawner val2 = default(DesertRockSpawner); if (((Component)val).TryGetComponent<DesertRockSpawner>(ref val2)) { ((LevelGenStep)val2).Go(); } } } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }