Please disclose if your mod was created primarily 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 GateOfOrethority v1.0.3
plugins/GateOfOrethority.dll
Decompiled 4 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = "")] [assembly: AssemblyCompany("GateOfOrethority")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+21b69cd9a8d66c243380801f10f7a8d8e097103d")] [assembly: AssemblyProduct("GateOfOrethority")] [assembly: AssemblyTitle("GateOfOrethority")] [assembly: AssemblyVersion("1.0.0.0")] [HarmonyPatch(typeof(Character), "OnDeath")] public class BossDeathTracker { private static void Postfix(Character __instance) { string prefabName = Utils.GetPrefabName(((Component)__instance).gameObject); GateOfOrethority.Log.LogInfo((object)("Boss died: prefab = " + prefabName)); if (1 == 0) { } string text = prefabName switch { "Eikthyr" => "defeated_eikthyr", "deer" => "defeated_eikthyr", "gd_king" => "defeated_elder", "Bonemass" => "defeated_bonemass", "Dragon" => "defeated_moder", "GoblinKing" => "defeated_yagluth", "SeekerQueen" => "defeated_queen", "Queen" => "defeated_queen", "Fader" => "defeated_fader", _ => null, }; if (1 == 0) { } string text2 = text; if (text2 == null) { return; } foreach (Player allPlayer in Player.GetAllPlayers()) { if (!allPlayer.m_customData.ContainsKey(text2)) { allPlayer.m_customData[text2] = "true"; GateOfOrethority.Log.LogInfo((object)("Set player key '" + text2 + "' for " + allPlayer.GetPlayerName())); } } } } public static class ConfigSync { [HarmonyPatch(typeof(ZNet), "OnNewConnection")] public class ServerSendConfig { private static void Postfix(ZNet __instance, ZNetPeer peer) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Expected O, but got Unknown if (!ZNet.instance.IsServer()) { return; } ZPackage val = new ZPackage(); foreach (KeyValuePair<string, string> item in GateOfOrethority.ItemBossMap) { val.Write(item.Key); val.Write(item.Value); } peer.m_rpc.Invoke("GateOfOrethority_ReceiveConfig", new object[1] { val }); } } [HarmonyPatch(typeof(ZNet), "Awake")] public class ClientRegisterRPC { private static void Postfix(ZNet __instance) { if (!ZNet.instance.IsServer()) { ZRoutedRpc.instance.Register<ZPackage>("GateOfOrethority_ReceiveConfig", (Action<long, ZPackage>)WrappedReceiveConfig); } } private static void WrappedReceiveConfig(long sender, ZPackage pkg) { ReceiveConfig(pkg); } } public static bool UseServerConfig = false; public static Dictionary<string, string> ServerItemBossMap = new Dictionary<string, string>(); public static void ReceiveConfig(ZPackage pkg) { ServerItemBossMap.Clear(); while (pkg.GetPos() < pkg.Size()) { string key = pkg.ReadString(); string value = pkg.ReadString(); ServerItemBossMap[key] = value; } UseServerConfig = GateOfOrethority.EnableServerOverride.Value; } } public static class FlavorText { private static readonly Dictionary<string, string> itemMessages = new Dictionary<string, string> { { "CopperOre", "The copper resists your passage, bound by roots older than stone." }, { "TinOre", "The forge-born tin trembles, awaiting the Elder’s fall." }, { "Copper", "The copper resists your passage, bound by roots older than stone." }, { "Tin", "The forge-born tin trembles, awaiting the Elder’s fall." }, { "Bronze", "Bronze and tin echo with ancient rites. The forest’s guardian still watches." }, { "IronScrap", "Iron groans with the weight of decay. Bonemass’s curse clings to its core." }, { "Iron", "Iron groans with the weight of decay. Bonemass’s curse clings to its core." }, { "Ironpit", "The pit reeks of rot and resistance. The swamp’s champion must be vanquished." }, { "SilverOre", "Silver shivers with frostbitten fury. The mountain’s dragon still reigns." }, { "Silver", "The metal remembers the cold breath of Moder. You are not yet worthy." }, { "BlackMetalScrap", "The scrap pulses with flame-forged pride. The plains demand tribute." }, { "BlackMetal", "Black metal hums with scorched defiance. Yagluth’s embers burn too bright to pass." }, { "MechanicalSpring", "Mechanical spring resists the warp, loyal to the Mistlands’ sovereign." }, { "BronzeScrap", "The bronze scrap clinks with defiance. The Queen’s will must be broken." }, { "DvergrNeedle", "The extractor trembles, bound by regal decree. The Queen’s dominion remains unbroken." }, { "IronOre", "The Queen is curious to what you are going to do with this." }, { "CharredCogwheel", "The cogwheel crackles with emerald flame. Fader’s wrath must be extinguished." }, { "FlametalOre", "Fader says you spawned the wrong ore" }, { "Flametal", "The Emerald Flame thinks you should try the New flametal" }, { "FlametalOreNew", "The ore smolders with unspent vengeance. Fader’s dominion endures." }, { "FlametalNew", "Flametal recoils from your grasp, forged in fire yet loyal to ash." } }; public static string Get(string itemName) { string value; return itemMessages.TryGetValue(itemName, out value) ? value : "The metal resists your passage. Its guardian still stands."; } } [BepInPlugin("com.stayk.gateoforethority", "Gate of Ore-thority", "1.0.2")] public class GateOfOrethority : BaseUnityPlugin { public static ManualLogSource Log; public static ConfigEntry<bool> EnableServerOverride; public static Dictionary<string, string> ItemBossMap = new Dictionary<string, string>(); public static readonly List<string> AllBossKeys = new List<string> { "defeated_eikthyr", "defeated_elder", "defeated_bonemass", "defeated_moder", "defeated_yagluth", "defeated_queen", "defeated_fader" }; private Dictionary<string, ConfigEntry<string>> RawConfigEntries = new Dictionary<string, ConfigEntry<string>>(); private void Awake() { Log = ((BaseUnityPlugin)this).Logger; EnableServerOverride = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "EnableServerOverride", false, "If true, clients will use server-enforced boss flags for teleport restrictions."); RegisterItem("CopperOre", "defeated_elder"); RegisterItem("TinOre", "defeated_elder"); RegisterItem("Copper", "defeated_elder"); RegisterItem("Tin", "defeated_elder"); RegisterItem("Bronze", "defeated_elder"); RegisterItem("IronScrap", "defeated_bonemass"); RegisterItem("Iron", "defeated_bonemass"); RegisterItem("Ironpit", "defeated_bonemass"); RegisterItem("SilverOre", "defeated_moder"); RegisterItem("Silver", "defeated_moder"); RegisterItem("BlackMetalScrap", "defeated_yagluth"); RegisterItem("BlackMetal", "defeated_yagluth"); RegisterItem("MechanicalSpring", "defeated_queen"); RegisterItem("DvergrNeedle", "defeated_queen"); RegisterItem("IronOre", "defeated_queen"); RegisterItem("BronzeScrap", "defeated_queen"); RegisterItem("CharredCogwheel", "defeated_fader"); RegisterItem("FlametalOre", "defeated_fader"); RegisterItem("Flametal", "defeated_fader"); RegisterItem("FlametalNew", "defeated_fader"); RegisterItem("FlametalOreNew", "defeated_fader"); EnforceServerConfig(); Harmony.CreateAndPatchAll(typeof(GateOfOrethority).Assembly, (string)null); Log.LogInfo((object)"Gate of Ore-thority initialized with server override and player key support."); } private void RegisterItem(string itemName, string defaultBossKey) { ConfigEntry<string> value = ((BaseUnityPlugin)this).Config.Bind<string>("TeleportRestrictions", itemName, defaultBossKey, "Boss flag required to teleport with " + itemName + "."); RawConfigEntries[itemName] = value; } private void EnforceServerConfig() { bool flag = (Object)(object)ZNet.instance != (Object)null && ZNet.instance.IsServer(); bool value = EnableServerOverride.Value; foreach (KeyValuePair<string, ConfigEntry<string>> rawConfigEntry in RawConfigEntries) { string key = rawConfigEntry.Key; string text = rawConfigEntry.Value.Value; if (!flag && value) { text = ((ConfigEntryBase)rawConfigEntry.Value).DefaultValue.ToString(); Log.LogInfo((object)("[Ore-thority] Overriding client config for '" + key + "' → '" + text + "'")); } ItemBossMap[key] = text; } if (!flag && value) { Log.LogInfo((object)"[Ore-thority] Server override is active. Client config values have been replaced."); } else { Log.LogInfo((object)"[Ore-thority] Using local config values."); } } } [HarmonyPatch(typeof(Terminal), "TryRunCommand")] public class PlayerKeyConsolePatch { private static bool Prefix(Terminal __instance, string text) { if (!text.StartsWith("ore_")) { return true; } Player localPlayer = Player.m_localPlayer; if ((Object)(object)localPlayer == (Object)null) { return true; } string[] array = text.Split(new char[1] { ' ' }); string text2 = array[0]; switch (text2) { case "ore_grantkey": if (array.Length < 2) { return false; } localPlayer.m_customData[array[1]] = "true"; __instance.AddString("[Ore-thority] Granted key '" + array[1] + "' to " + localPlayer.GetPlayerName()); return false; case "ore_revokekey": if (array.Length < 2) { return false; } localPlayer.m_customData.Remove(array[1]); __instance.AddString("[Ore-thority] Revoked key '" + array[1] + "' from " + localPlayer.GetPlayerName()); return false; case "ore_listkeys": __instance.AddString("[Ore-thority] Keys for " + localPlayer.GetPlayerName() + ":"); foreach (KeyValuePair<string, string> customDatum in localPlayer.m_customData) { __instance.AddString(" " + customDatum.Key + " = " + customDatum.Value); } return false; case "ore_grantallkeys": foreach (string allBossKey in GateOfOrethority.AllBossKeys) { localPlayer.m_customData[allBossKey] = "true"; } __instance.AddString("[Ore-thority] Granted all progression keys to " + localPlayer.GetPlayerName()); return false; case "ore_resetkeys": foreach (string allBossKey2 in GateOfOrethority.AllBossKeys) { localPlayer.m_customData.Remove(allBossKey2); } __instance.AddString("[Ore-thority] Reset all progression keys for " + localPlayer.GetPlayerName()); return false; default: __instance.AddString("[Ore-thority] Unknown command: " + text2); return false; } } } [HarmonyPatch(typeof(Player), "TeleportTo")] public class TeleportBlocker { private static bool Prefix(Player __instance, Vector3 pos, Quaternion rot, bool distantTeleport) { if (!distantTeleport) { return true; } Inventory inventory = ((Humanoid)__instance).GetInventory(); List<ItemData> allItems = inventory.GetAllItems(); foreach (KeyValuePair<string, string> item in GateOfOrethority.ItemBossMap) { string key = item.Key; string text = ((ConfigSync.UseServerConfig && ConfigSync.ServerItemBossMap.ContainsKey(key)) ? ConfigSync.ServerItemBossMap[key] : item.Value); foreach (ItemData item2 in allItems) { GameObject dropPrefab = item2.m_dropPrefab; string text2 = ((dropPrefab != null) ? ((Object)dropPrefab).name : null) ?? item2.m_shared.m_name; bool flag = __instance.m_customData.ContainsKey(text); GateOfOrethority.Log.LogInfo((object)$"Teleport check: item='{text2}', requiredKey='{text}', playerHasKey={flag}"); if ((text2 == key || item2.m_shared.m_name == key) && !flag) { string text3 = FlavorText.Get(key); if ((Object)(object)__instance == (Object)(object)Player.m_localPlayer && (Object)(object)MessageHud.instance != (Object)null) { MessageHud.instance.ShowMessage((MessageType)2, text3, 0, (Sprite)null, false); } else { GateOfOrethority.Log.LogWarning((object)("[TeleportBlocker] Could not show message: " + text3)); } return false; } } } return true; } }