using System; using System.Collections.Generic; using System.Linq; using System.Reflection.Emit; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using UnityEngine; using UnityEngine.UI; namespace CheatEnabler; [BepInPlugin(PluginInfo.PLUGIN_GUID, PluginInfo.PLUGIN_NAME, PluginInfo.PLUGIN_VERSION)] public class CheatEnabler : BaseUnityPlugin { public new static readonly BepInEx.Logging.ManualLogSource Logger = BepInEx.Logging.Logger.CreateLogSource(PluginInfo.PLUGIN_NAME); private static bool _configWinInitialized = false; private static KeyboardShortcut _shortcut = KeyboardShortcut.Deserialize("H + LeftControl"); private static UIConfigWindow _configWin; private static bool _sitiVeinsOnBirthPlanet = true; private static bool _fireIceOnBirthPlanet = false; private static bool _kimberliteOnBirthPlanet = false; private static bool _fractalOnBirthPlanet = false; private static bool _organicOnBirthPlanet = true; private static bool _opticalOnBirthPlanet = false; private static bool _spiniformOnBirthPlanet = false; private static bool _unipolarOnBirthPlanet = false; private static bool _flatBirthPlanet = true; private static bool _highLuminosityBirthStar = true; private static bool _terraformAnyway = false; private static string _unlockTechToMaximumLevel = ""; private static readonly List TechToUnlock = new(); private static Harmony _windowPatch; private static Harmony _patch; private static bool _initialized; private void Awake() { DevShortcuts.Enabled = Config.Bind("General", "DevShortcuts", true, "enable DevMode shortcuts"); AbnormalDisabler.Enabled = Config.Bind("General", "DisableAbnormalChecks", false, "disable all abnormal checks"); ResourcePatch.InfiniteEnabled = Config.Bind("Planet", "AlwaysInfiniteResource", false, "always infinite natural resource"); ResourcePatch.FastEnabled = Config.Bind("Planet", "FastMining", false, "super-fast mining speed"); _unlockTechToMaximumLevel = Config.Bind("General", "UnlockTechToMaxLevel", _unlockTechToMaximumLevel, "Unlock listed tech to MaxLevel").Value; WaterPumperPatch.Enabled = Config.Bind("Planet", "WaterPumpAnywhere", false, "Can pump water anywhere (while water type is not None)"); _sitiVeinsOnBirthPlanet = Config.Bind("Birth", "SiTiVeinsOnBirthPlanet", _sitiVeinsOnBirthPlanet, "Has Silicon/Titanium veins on birth planet").Value; _fireIceOnBirthPlanet = Config.Bind("Birth", "FireIceOnBirthPlanet", _fireIceOnBirthPlanet, "Fire ice on birth planet (You should enable Rare Veins first)").Value; _kimberliteOnBirthPlanet = Config.Bind("Birth", "KimberliteOnBirthPlanet", _kimberliteOnBirthPlanet, "Kimberlite on birth planet (You should enable Rare Veins first)").Value; _fractalOnBirthPlanet = Config.Bind("Birth", "FractalOnBirthPlanet", _fractalOnBirthPlanet, "Fractal silicon on birth planet (You should enable Rare Veins first)").Value; _organicOnBirthPlanet = Config.Bind("Birth", "OrganicOnBirthPlanet", _organicOnBirthPlanet, "Organic crystal on birth planet (You should enable Rare Veins first)").Value; _opticalOnBirthPlanet = Config.Bind("Birth", "OpticalOnBirthPlanet", _opticalOnBirthPlanet, "Optical grating crystal on birth planet (You should enable Rare Veins first)").Value; _spiniformOnBirthPlanet = Config.Bind("Birth", "SpiniformOnBirthPlanet", _spiniformOnBirthPlanet, "Spiniform stalagmite crystal on birth planet (You should enable Rare Veins first)").Value; _unipolarOnBirthPlanet = Config.Bind("Birth", "UnipolarOnBirthPlanet", _unipolarOnBirthPlanet, "Unipolar magnet on birth planet (You should enable Rare Veins first)").Value; _flatBirthPlanet = Config.Bind("Birth", "FlatBirthPlanet", _flatBirthPlanet, "Birth planet is solid flat (no water)").Value; _highLuminosityBirthStar = Config.Bind("Birth", "HighLuminosityBirthStar", _highLuminosityBirthStar, "Birth star has high luminosity").Value; _terraformAnyway = Config.Bind("General", "TerraformAnyway", _terraformAnyway, "Can do terraform without enough sands").Value; I18N.Init(); I18N.Add("CheatEnabler Config", "CheatEnabler Config", "CheatEnabler设置"); I18N.Add("General", "General", "常规"); I18N.Add("Enable Dev Shortcuts", "Enable Dev Shortcuts", "启用开发模式快捷键"); I18N.Add("Disable Abnormal Checks", "Disable Abnormal Checks", "关闭数据异常检查"); I18N.Add("Planet", "Planet", "行星"); I18N.Add("Infinite Natural Resources", "Infinite Natural Resources", "自然资源采集不消耗"); I18N.Add("Fast Mining", "Fast Mining", "高速采集"); I18N.Add("Pump Anywhere", "Pump Anywhere", "平地抽水"); // UI Patch _windowPatch = Harmony.CreateAndPatchAll(typeof(UI.MyWindowManager.Patch)); _patch = Harmony.CreateAndPatchAll(typeof(CheatEnabler)); DevShortcuts.Init(); AbnormalDisabler.Init(); ResourcePatch.Init(); foreach (var idstr in _unlockTechToMaximumLevel.Split(',')) { if (int.TryParse(idstr, out var id)) { TechToUnlock.Add(id); } } if (TechToUnlock.Count > 0) { Harmony.CreateAndPatchAll(typeof(UnlockTechOnGameStart)); } WaterPumperPatch.Init(); if (_sitiVeinsOnBirthPlanet || _fireIceOnBirthPlanet || _kimberliteOnBirthPlanet || _fractalOnBirthPlanet || _organicOnBirthPlanet || _opticalOnBirthPlanet || _spiniformOnBirthPlanet || _unipolarOnBirthPlanet || _flatBirthPlanet || _highLuminosityBirthStar) { Harmony.CreateAndPatchAll(typeof(BirthPlanetCheat)); } if (_terraformAnyway) { Harmony.CreateAndPatchAll(typeof(TerraformAnyway)); } } public void OnDestroy() { WaterPumperPatch.Uninit(); ResourcePatch.Uninit(); AbnormalDisabler.Uninit(); DevShortcuts.Uninit(); _patch?.UnpatchSelf(); _windowPatch?.UnpatchSelf(); } private void Update() { if (VFInput.inputing) { return; } if (_shortcut.IsDown()) ShowConfigWindow(); } [HarmonyPostfix, HarmonyPatch(typeof(UIRoot), "_OnOpen")] public static void UIRoot__OnOpen_Postfix() { if (_initialized) return; { var mainMenu = UIRoot.instance.uiMainMenu; var src = mainMenu.newGameButton.gameObject; var parent = src.transform.parent; var btn = Instantiate(src, parent); btn.name = "btn-cheatenabler-config"; var btnConfig = btn.GetComponent(); btnConfig.text.text = "CheatEnabler Config"; btnConfig.text.fontSize = btnConfig.text.fontSize * 7 / 8; I18N.OnInitialized += () => { btnConfig.text.text = "CheatEnabler Config".Translate(); }; btnConfig.transform.SetParent(parent); var vec = ((RectTransform)mainMenu.exitButton.transform).anchoredPosition3D; var vec2 = ((RectTransform)mainMenu.creditsButton.transform).anchoredPosition3D; var transform1 = (RectTransform)btn.transform; transform1.anchoredPosition3D = new Vector3(vec.x, vec.y + (vec.y - vec2.y) * 2, vec.z); btnConfig.button.onClick.RemoveAllListeners(); btnConfig.button.onClick.AddListener(ShowConfigWindow); } { var panel = UIRoot.instance.uiGame.planetGlobe; var src = panel.button2; var sandboxMenu = UIRoot.instance.uiGame.sandboxMenu; var icon = sandboxMenu.categoryButtons[6].transform.Find("icon")?.GetComponent()?.sprite; var b = GameObject.Instantiate