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 RunesTeleportGodes v0.0.2
RunesTeleportGodes.dll
Decompiled a year 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.InteropServices; using System.Runtime.Versioning; using System.Security.Permissions; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Jotunn; using Jotunn.Configs; using Jotunn.Entities; using Jotunn.Managers; using Jotunn.Utils; 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("RunesTeleportGodes")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("RunesTeleportGodes")] [assembly: AssemblyCopyright("Copyright © 2021")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("e3243d22-4307-4008-ba36-9f326008cde5")] [assembly: AssemblyFileVersion("0.0.1.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.1.0")] public class SE_TeleportStun : SE_Stats { private float _origWalkSpeed; private float _origRunSpeed; private float _origSpeed; private float _origAcceleration; private float _origJumpStaminaUsage; public SE_TeleportStun() { ((StatusEffect)this).m_name = "TeleportStun"; ((StatusEffect)this).m_tooltip = "You are frozen by teleport magic!"; ((StatusEffect)this).m_ttl = 0f; } public override void Setup(Character character) { ((SE_Stats)this).Setup(character); if (!((Object)(object)((StatusEffect)this).m_character == (Object)null)) { _origWalkSpeed = ((StatusEffect)this).m_character.m_walkSpeed; _origRunSpeed = ((StatusEffect)this).m_character.m_runSpeed; _origSpeed = ((StatusEffect)this).m_character.m_speed; _origAcceleration = ((StatusEffect)this).m_character.m_acceleration; _origJumpStaminaUsage = ((StatusEffect)this).m_character.m_jumpStaminaUsage; } } public override void UpdateStatusEffect(float dt) { ((SE_Stats)this).UpdateStatusEffect(dt); if (!((Object)(object)((StatusEffect)this).m_character == (Object)null)) { ((StatusEffect)this).m_character.m_walkSpeed = 0f; ((StatusEffect)this).m_character.m_runSpeed = 0f; ((StatusEffect)this).m_character.m_speed = 0f; ((StatusEffect)this).m_character.m_acceleration = 0f; ((StatusEffect)this).m_character.m_jumpStaminaUsage = 9999f; } } public void RestoreSpeedValues() { if (!((Object)(object)((StatusEffect)this).m_character == (Object)null)) { ((StatusEffect)this).m_character.m_walkSpeed = _origWalkSpeed; ((StatusEffect)this).m_character.m_runSpeed = _origRunSpeed; ((StatusEffect)this).m_character.m_speed = _origSpeed; ((StatusEffect)this).m_character.m_acceleration = _origAcceleration; ((StatusEffect)this).m_character.m_jumpStaminaUsage = _origJumpStaminaUsage; } } } namespace RunesTeleportGodes; public static class RunesTeleportGodesConfig { private static ConfigFile _config; public static ConfigEntry<bool> EnableDebugMode; public static ConfigEntry<bool> RunaT1_CraftEnabled; public static ConfigEntry<bool> RunaT1_BossDropEnabled; public static ConfigEntry<string> RunaT1_BossPrefab; public static ConfigEntry<float> RunaT1_BossDropChance; public static ConfigEntry<int> RunaT1_BossDropAmount; public static ConfigEntry<float> RunaT1_Cooldown; public static ConfigEntry<float> RunaT1_Weight; public static ConfigEntry<string> RunaT1_CraftStation; public static ConfigEntry<int> RunaT1_MinStationLevel; public static ConfigEntry<string> RunaT1_RecipeString; public static ConfigEntry<string> RunaT1_AllowedItemsCSV; public static ConfigEntry<bool> RunaT2_CraftEnabled; public static ConfigEntry<bool> RunaT2_BossDropEnabled; public static ConfigEntry<string> RunaT2_BossPrefab; public static ConfigEntry<float> RunaT2_BossDropChance; public static ConfigEntry<int> RunaT2_BossDropAmount; public static ConfigEntry<float> RunaT2_Cooldown; public static ConfigEntry<float> RunaT2_Weight; public static ConfigEntry<string> RunaT2_CraftStation; public static ConfigEntry<int> RunaT2_MinStationLevel; public static ConfigEntry<string> RunaT2_RecipeString; public static ConfigEntry<string> RunaT2_AllowedItemsCSV; public static ConfigEntry<bool> RunaT3_CraftEnabled; public static ConfigEntry<bool> RunaT3_BossDropEnabled; public static ConfigEntry<string> RunaT3_BossPrefab; public static ConfigEntry<float> RunaT3_BossDropChance; public static ConfigEntry<int> RunaT3_BossDropAmount; public static ConfigEntry<float> RunaT3_Cooldown; public static ConfigEntry<float> RunaT3_Weight; public static ConfigEntry<string> RunaT3_CraftStation; public static ConfigEntry<int> RunaT3_MinStationLevel; public static ConfigEntry<string> RunaT3_RecipeString; public static ConfigEntry<string> RunaT3_AllowedItemsCSV; public static ConfigEntry<bool> RunaT4_CraftEnabled; public static ConfigEntry<bool> RunaT4_BossDropEnabled; public static ConfigEntry<string> RunaT4_BossPrefab; public static ConfigEntry<float> RunaT4_BossDropChance; public static ConfigEntry<int> RunaT4_BossDropAmount; public static ConfigEntry<float> RunaT4_Cooldown; public static ConfigEntry<float> RunaT4_Weight; public static ConfigEntry<string> RunaT4_CraftStation; public static ConfigEntry<int> RunaT4_MinStationLevel; public static ConfigEntry<string> RunaT4_RecipeString; public static ConfigEntry<string> RunaT4_AllowedItemsCSV; public static ConfigEntry<bool> RunaT5_CraftEnabled; public static ConfigEntry<bool> RunaT5_BossDropEnabled; public static ConfigEntry<string> RunaT5_BossPrefab; public static ConfigEntry<float> RunaT5_BossDropChance; public static ConfigEntry<int> RunaT5_BossDropAmount; public static ConfigEntry<float> RunaT5_Cooldown; public static ConfigEntry<float> RunaT5_Weight; public static ConfigEntry<string> RunaT5_CraftStation; public static ConfigEntry<int> RunaT5_MinStationLevel; public static ConfigEntry<string> RunaT5_RecipeString; public static ConfigEntry<string> RunaT5_AllowedItemsCSV; public static ConfigEntry<bool> RunaT6_CraftEnabled; public static ConfigEntry<bool> RunaT6_BossDropEnabled; public static ConfigEntry<string> RunaT6_BossPrefab; public static ConfigEntry<float> RunaT6_BossDropChance; public static ConfigEntry<int> RunaT6_BossDropAmount; public static ConfigEntry<float> RunaT6_Cooldown; public static ConfigEntry<float> RunaT6_Weight; public static ConfigEntry<string> RunaT6_CraftStation; public static ConfigEntry<int> RunaT6_MinStationLevel; public static ConfigEntry<string> RunaT6_RecipeString; public static ConfigEntry<string> RunaT6_AllowedItemsCSV; public static ConfigEntry<bool> RunaT7_CraftEnabled; public static ConfigEntry<bool> RunaT7_BossDropEnabled; public static ConfigEntry<string> RunaT7_BossPrefab; public static ConfigEntry<float> RunaT7_BossDropChance; public static ConfigEntry<int> RunaT7_BossDropAmount; public static ConfigEntry<float> RunaT7_Cooldown; public static ConfigEntry<float> RunaT7_Weight; public static ConfigEntry<string> RunaT7_CraftStation; public static ConfigEntry<int> RunaT7_MinStationLevel; public static ConfigEntry<string> RunaT7_RecipeString; public static ConfigEntry<string> RunaT7_AllowedItemsCSV; public static void Initialize(ConfigFile config) { _config = config; _config.SaveOnConfigSet = true; CreateConfigValues(); } private static void CreateConfigValues() { EnableDebugMode = _config.Bind<bool>("General", "EnableDebugMode", false, "Habilita el registro de depuración para RunesTeleportGodes."); RunaT1_CraftEnabled = _config.Bind<bool>("RunaT1", "CraftEnabled", true, "¿Se craftea la runa T1?"); RunaT1_BossDropEnabled = _config.Bind<bool>("RunaT1", "BossDropEnabled", false, "¿La runa T1 la suelta un boss?"); RunaT1_BossPrefab = _config.Bind<string>("RunaT1", "BossPrefab", "Eikthyr", "Boss que suelta RunaT1."); RunaT1_BossDropChance = _config.Bind<float>("RunaT1", "BossDropChance", 1f, "Prob (0..1) de dropear T1."); RunaT1_BossDropAmount = _config.Bind<int>("RunaT1", "BossDropAmount", 1, "Cantidad de RunaT1 que suelta el boss."); RunaT1_Cooldown = _config.Bind<float>("RunaT1", "CooldownSeconds", 180f, "Cooldown (seg) de la runa T1."); RunaT1_Weight = _config.Bind<float>("RunaT1", "Weight", 0.5f, "Peso de la runa T1."); RunaT1_CraftStation = _config.Bind<string>("RunaT1", "CraftStation", "piece_workbench", "Estación de crafteo p/T1."); RunaT1_MinStationLevel = _config.Bind<int>("RunaT1", "MinStationLevel", 1, "Nivel mínimo estación p/T1."); RunaT1_RecipeString = _config.Bind<string>("RunaT1", "RecipeString", "Wood:100,Resin:100", "Receta T1, formato 'Mat:Qty,Mat2:Qty'"); RunaT1_AllowedItemsCSV = _config.Bind<string>("RunaT1", "AllowedItemsCSV", "", "Ítems no teleporteables permitidos en T1."); RunaT2_CraftEnabled = _config.Bind<bool>("RunaT2", "CraftEnabled", true, "¿Se craftea la runa T2?"); RunaT2_BossDropEnabled = _config.Bind<bool>("RunaT2", "BossDropEnabled", false, "¿La runa T2 la suelta un boss?"); RunaT2_BossPrefab = _config.Bind<string>("RunaT2", "BossPrefab", "Eikthyr", "Boss que suelta RunaT2."); RunaT2_BossDropChance = _config.Bind<float>("RunaT2", "BossDropChance", 1f, "Prob (0..1) de dropear T2."); RunaT2_BossDropAmount = _config.Bind<int>("RunaT2", "BossDropAmount", 1, "Cantidad de RunaT2 que suelta el boss."); RunaT2_Cooldown = _config.Bind<float>("RunaT2", "CooldownSeconds", 300f, "Cooldown (seg) de la runa T2."); RunaT2_Weight = _config.Bind<float>("RunaT2", "Weight", 0.7f, "Peso de la runa T2."); RunaT2_CraftStation = _config.Bind<string>("RunaT2", "CraftStation", "forge", "Estación de crafteo p/T2."); RunaT2_MinStationLevel = _config.Bind<int>("RunaT2", "MinStationLevel", 1, "Nivel mínimo estación p/T2."); RunaT2_RecipeString = _config.Bind<string>("RunaT2", "RecipeString", "TrophyEikthyr:5,Bronze:20", "Receta T2, formato 'Mat:Qty,Mat2:Qty'"); RunaT2_AllowedItemsCSV = _config.Bind<string>("RunaT2", "AllowedItemsCSV", "TinOre,Tin,CopperOre,CopperScrap,chest_hildir1,Copper,Bronze", "Ítems no teleporteables permitidos en T2."); RunaT3_CraftEnabled = _config.Bind<bool>("RunaT3", "CraftEnabled", true, "¿Se craftea la runa T3?"); RunaT3_BossDropEnabled = _config.Bind<bool>("RunaT3", "BossDropEnabled", false, "¿La runa T3 la suelta un boss?"); RunaT3_BossPrefab = _config.Bind<string>("RunaT3", "BossPrefab", "gd_king", "Boss que suelta RunaT3."); RunaT3_BossDropChance = _config.Bind<float>("RunaT3", "BossDropChance", 1f, "Prob (0..1) de dropear T3."); RunaT3_BossDropAmount = _config.Bind<int>("RunaT3", "BossDropAmount", 1, "Cantidad de RunaT3 que suelta el boss."); RunaT3_Cooldown = _config.Bind<float>("RunaT3", "CooldownSeconds", 480f, "Cooldown (seg) de la runa T3."); RunaT3_Weight = _config.Bind<float>("RunaT3", "Weight", 0.7f, "Peso de la runa T3."); RunaT3_CraftStation = _config.Bind<string>("RunaT3", "CraftStation", "forge", "Estación de crafteo p/T3."); RunaT3_MinStationLevel = _config.Bind<int>("RunaT3", "MinStationLevel", 3, "Nivel mínimo estación p/T3."); RunaT3_RecipeString = _config.Bind<string>("RunaT3", "RecipeString", "TrophyTheElder:5,Iron:20", "Receta T3, formato 'Mat:Qty,Mat2:Qty'"); RunaT3_AllowedItemsCSV = _config.Bind<string>("RunaT3", "AllowedItemsCSV", "TinOre,Tin,CopperOre,CopperScrap,chest_hildir1,Copper,Bronze,Ironpit,IronOre,IronScrap,Iron", "Ítems no teleporteables permitidos en T3."); RunaT4_CraftEnabled = _config.Bind<bool>("RunaT4", "CraftEnabled", true, "¿Se craftea la runa T4?"); RunaT4_BossDropEnabled = _config.Bind<bool>("RunaT4", "BossDropEnabled", false, "¿La runa T4 la suelta un boss?"); RunaT4_BossPrefab = _config.Bind<string>("RunaT4", "BossPrefab", "Bonemass", "Boss que suelta RunaT4."); RunaT4_BossDropChance = _config.Bind<float>("RunaT4", "BossDropChance", 1f, "Prob (0..1) de dropear T4."); RunaT4_BossDropAmount = _config.Bind<int>("RunaT4", "BossDropAmount", 1, "Cantidad de RunaT4 que suelta el boss."); RunaT4_Cooldown = _config.Bind<float>("RunaT4", "CooldownSeconds", 600f, "Cooldown (seg) de la runa T4."); RunaT4_Weight = _config.Bind<float>("RunaT4", "Weight", 0.7f, "Peso de la runa T4."); RunaT4_CraftStation = _config.Bind<string>("RunaT4", "CraftStation", "forge", "Estación de crafteo p/T4."); RunaT4_MinStationLevel = _config.Bind<int>("RunaT4", "MinStationLevel", 4, "Nivel mínimo estación p/T4."); RunaT4_RecipeString = _config.Bind<string>("RunaT4", "RecipeString", "TrophyBonemass:5,Guck:30", "Receta T4, formato 'Mat:Qty,Mat2:Qty'"); RunaT4_AllowedItemsCSV = _config.Bind<string>("RunaT4", "AllowedItemsCSV", "TinOre,Tin,CopperOre,CopperScrap,chest_hildir1,Copper,Bronze,Ironpit,IronOre,IronScrap,Iron,Silver,SilverOre,DragonEgg,chest_hildir2", "Ítems no teleporteables permitidos en T4."); RunaT5_CraftEnabled = _config.Bind<bool>("RunaT5", "CraftEnabled", true, "¿Se craftea la runa T5?"); RunaT5_BossDropEnabled = _config.Bind<bool>("RunaT5", "BossDropEnabled", false, "¿La runa T5 la suelta un boss?"); RunaT5_BossPrefab = _config.Bind<string>("RunaT5", "BossPrefab", "Dragon", "Boss que suelta RunaT5."); RunaT5_BossDropChance = _config.Bind<float>("RunaT5", "BossDropChance", 1f, "Prob (0..1) de dropear T5."); RunaT5_BossDropAmount = _config.Bind<int>("RunaT5", "BossDropAmount", 1, "Cantidad de RunaT5 que suelta el boss."); RunaT5_Cooldown = _config.Bind<float>("RunaT5", "CooldownSeconds", 780f, "Cooldown (seg) de la runa T5."); RunaT5_Weight = _config.Bind<float>("RunaT5", "Weight", 0.7f, "Peso de la runa T5."); RunaT5_CraftStation = _config.Bind<string>("RunaT5", "CraftStation", "piece_artisanstation", "Estación de crafteo p/T5."); RunaT5_MinStationLevel = _config.Bind<int>("RunaT5", "MinStationLevel", 1, "Nivel mínimo estación p/T5."); RunaT5_RecipeString = _config.Bind<string>("RunaT5", "RecipeString", "TrophyDragonQueen:5,DragonEgg:5", "Receta T5, formato 'Mat:Qty,Mat2:Qty'"); RunaT5_AllowedItemsCSV = _config.Bind<string>("RunaT5", "AllowedItemsCSV", "TinOre,Tin,CopperOre,CopperScrap,chest_hildir1,Copper,Bronze,Ironpit,IronOre,IronScrap,Iron,Silver,SilverOre,DragonEgg,chest_hildir2,BlackMetalScrap,BlackMetal,chest_hildir3", "Ítems no teleporteables permitidos en T5."); RunaT6_CraftEnabled = _config.Bind<bool>("RunaT6", "CraftEnabled", true, "¿Se craftea la runa T6?"); RunaT6_BossDropEnabled = _config.Bind<bool>("RunaT6", "BossDropEnabled", false, "¿La runa T6 la suelta un boss?"); RunaT6_BossPrefab = _config.Bind<string>("RunaT6", "BossPrefab", "GoblinKing", "Boss que suelta RunaT6."); RunaT6_BossDropChance = _config.Bind<float>("RunaT6", "BossDropChance", 1f, "Prob (0..1) de dropear T6."); RunaT6_BossDropAmount = _config.Bind<int>("RunaT6", "BossDropAmount", 1, "Cantidad de RunaT6 que suelta el boss."); RunaT6_Cooldown = _config.Bind<float>("RunaT6", "CooldownSeconds", 900f, "Cooldown (seg) de la runa T6."); RunaT6_Weight = _config.Bind<float>("RunaT6", "Weight", 0.7f, "Peso de la runa T6."); RunaT6_CraftStation = _config.Bind<string>("RunaT6", "CraftStation", "blackforge", "Estación de crafteo p/T6."); RunaT6_MinStationLevel = _config.Bind<int>("RunaT6", "MinStationLevel", 1, "Nivel mínimo estación p/T6."); RunaT6_RecipeString = _config.Bind<string>("RunaT6", "RecipeString", "TrophyGoblinKing:5,BlackMetal:20", "Receta T6, formato 'Mat:Qty,Mat2:Qty'"); RunaT6_AllowedItemsCSV = _config.Bind<string>("RunaT6", "AllowedItemsCSV", "TinOre,Tin,CopperOre,CopperScrap,chest_hildir1,Copper,Bronze,Ironpit,IronOre,IronScrap,Iron,Silver,SilverOre,DragonEgg,chest_hildir2,BlackMetalScrap,BlackMetal,chest_hildir3,DvergrNeedle,CharredCogwheel,Ironpit,MechanicalSpring", "Ítems no teleporteables permitidos en T6."); RunaT7_CraftEnabled = _config.Bind<bool>("RunaT7", "CraftEnabled", true, "¿Se craftea la runa T7?"); RunaT7_BossDropEnabled = _config.Bind<bool>("RunaT7", "BossDropEnabled", false, "¿La runa T7 la suelta un boss?"); RunaT7_BossPrefab = _config.Bind<string>("RunaT7", "BossPrefab", "SeekerQueen", "Boss que suelta RunaT7."); RunaT7_BossDropChance = _config.Bind<float>("RunaT7", "BossDropChance", 1f, "Prob (0..1) de dropear T7."); RunaT7_BossDropAmount = _config.Bind<int>("RunaT7", "BossDropAmount", 1, "Cantidad de RunaT7 que suelta el boss."); RunaT7_Cooldown = _config.Bind<float>("RunaT7", "CooldownSeconds", 1200f, "Cooldown (seg) de la runa T7."); RunaT7_Weight = _config.Bind<float>("RunaT7", "Weight", 0.7f, "Peso de la runa T7."); RunaT7_CraftStation = _config.Bind<string>("RunaT7", "CraftStation", "blackforge", "Estación de crafteo p/T7."); RunaT7_MinStationLevel = _config.Bind<int>("RunaT7", "MinStationLevel", 2, "Nivel mínimo estación p/T7."); RunaT7_RecipeString = _config.Bind<string>("RunaT7", "RecipeString", "TrophySeekerQueen:5,BlackMarble:20", "Receta T7, formato 'Mat:Qty,Mat2:Qty'"); RunaT7_AllowedItemsCSV = _config.Bind<string>("RunaT7", "AllowedItemsCSV", "TinOre,Tin,CopperOre,CopperScrap,chest_hildir1,Copper,Bronze,Ironpit,IronOre,IronScrap,Iron,Silver,SilverOre,DragonEgg,chest_hildir2,BlackMetalScrap,BlackMetal,chest_hildir3,DvergrNeedle,CharredCogwheel,Ironpit,MechanicalSpring,FlametalNew,FlametalOreNew", "Ítems no teleporteables permitidos en T7."); } } [BepInPlugin("Azathoth18.RunesTeleportGodes", "RunesTeleportGodes", "0.0.2")] [BepInDependency(/*Could not decode attribute arguments.*/)] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] public class RunesTeleportGodes : BaseUnityPlugin { public const string PluginGUID = "Azathoth18.RunesTeleportGodes"; public const string PluginName = "RunesTeleportGodes"; public const string PluginVersion = "0.0.2"; internal static AssetBundle EmbeddedResourceBundle; private CustomLocalization _localization; private void Awake() { RunesTeleportGodesConfig.Initialize(((BaseUnityPlugin)this).Config); LoadAssets(); AddLocalizations(); RunesTeleportGodesItems runesTeleportGodesItems = new RunesTeleportGodesItems(EmbeddedResourceBundle); } private void LoadAssets() { EmbeddedResourceBundle = AssetUtils.LoadAssetBundleFromResources("RunesTeleportGodes.AssetsEmbedded.runesteleportgodes", typeof(RunesTeleportGodes).Assembly); if ((Object)(object)EmbeddedResourceBundle == (Object)null) { ((BaseUnityPlugin)this).Logger.LogError((object)"Failed to load the main AssetBundle: runesteleportgodes"); } else if (RunesTeleportGodesConfig.EnableDebugMode.Value) { ((BaseUnityPlugin)this).Logger.LogInfo((object)("Main Asset Names: " + string.Join(",", EmbeddedResourceBundle.GetAllAssetNames()))); } } private void AddLocalizations() { _localization = LocalizationManager.Instance.GetLocalization(); string[] manifestResourceNames = typeof(RunesTeleportGodes).Assembly.GetManifestResourceNames(); foreach (string text in manifestResourceNames) { if (text.Contains("localizations")) { ((BaseUnityPlugin)this).Logger.LogInfo((object)("Loading localization: " + text)); string text2 = ReadEmbeddedResourceFile(text); if (string.IsNullOrWhiteSpace(text2)) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("Localization file " + text + " is empty or could not be read.")); continue; } string text3 = Regex.Replace(text2, "\\/\\/.*", ""); string text4 = text.Split(new char[1] { '.' })[^2]; ((BaseUnityPlugin)this).Logger.LogInfo((object)("Adding localization for language: '" + text4 + "'")); _localization.AddJsonFile(text4, text3); } } } private string ReadEmbeddedResourceFile(string filename) { using Stream stream = typeof(RunesTeleportGodes).Assembly.GetManifestResourceStream(filename); if (stream == null) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("No se encontró recurso incrustado: " + filename)); return ""; } using StreamReader streamReader = new StreamReader(stream); return streamReader.ReadToEnd(); } private void OnDestroy() { if ((Object)(object)EmbeddedResourceBundle != (Object)null) { EmbeddedResourceBundle.Unload(false); EmbeddedResourceBundle = null; } } } internal class RunesTeleportGodesItems { [HarmonyPatch(typeof(InventoryGui), "OnRightClickItem")] private static class Player_ConsumeRune_Patch { private static bool Prefix(InventoryGrid grid, ItemData item) { //IL_019c: Unknown result type (might be due to invalid IL or missing references) //IL_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: Unknown result type (might be due to invalid IL or missing references) //IL_01ab: Unknown result type (might be due to invalid IL or missing references) //IL_01b3: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01de: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: Unknown result type (might be due to invalid IL or missing references) //IL_01e8: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_01f5: Unknown result type (might be due to invalid IL or missing references) //IL_01f7: Unknown result type (might be due to invalid IL or missing references) if (grid.m_inventory != ((Humanoid)(Player.m_localPlayer?)).m_inventory || item == null) { return true; } GameObject dropPrefab = item.m_dropPrefab; string text = ((dropPrefab != null) ? ((Object)dropPrefab).name : null); if (string.IsNullOrEmpty(text) || !_runaConfigs.TryGetValue(text, out var value)) { return true; } if (DateTime.Now < _globalNextUse) { double totalSeconds = (_globalNextUse - DateTime.Now).TotalSeconds; string text2 = string.Format(Localization.instance.Localize("$cooldown_message"), totalSeconds); MessageHud.instance.ShowMessage((MessageType)2, text2, 0, (Sprite)null, false); return false; } List<string> allowed = (from x in value.AllowedItemsCSVCE.Value.Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries) select x.Trim()).ToList(); if (!CheckTeleportable(allowed)) { string text3 = Localization.instance.Localize("$item_not_permitted"); MessageHud.instance.ShowMessage((MessageType)2, text3, 0, (Sprite)null, false); return false; } float value2 = value.CooldownCE.Value; _globalNextUse = DateTime.Now.AddSeconds(value2); grid.m_inventory.RemoveOneItem(item); if ((Object)(object)value.VfxPrefab != (Object)null) { Vector3 val = ((Component)Player.m_localPlayer).transform.position + Vector3.up; Object.Instantiate<GameObject>(value.VfxPrefab, val, Quaternion.identity); } if ((Object)(object)value.SfxPrefab != (Object)null) { Vector3 val2 = ((Component)Player.m_localPlayer).transform.position + Vector3.up; Object.Instantiate<GameObject>(value.SfxPrefab, val2, Quaternion.identity); } ((MonoBehaviour)PlayerTeleportation.Instance).StartCoroutine(TeleportSequence(3f, 6f)); return false; } private static IEnumerator TeleportSequence(float sfxDuration, float vfxDuration) { yield return (object)new WaitForSeconds(sfxDuration); float extraTime = vfxDuration - sfxDuration; if (extraTime > 0f) { yield return (object)new WaitForSeconds(extraTime); } PlayerProfile profile = Game.instance.GetPlayerProfile(); if (profile != null && profile.HaveCustomSpawnPoint()) { Vector3 bedPos = profile.GetCustomSpawnPoint(); ((Character)Player.m_localPlayer).TeleportTo(bedPos, ((Component)Player.m_localPlayer).transform.rotation, true); } else { Game.instance.RequestRespawn(2f, false); } } private static bool CheckTeleportable(List<string> allowed) { Inventory inventory = ((Humanoid)Player.m_localPlayer).m_inventory; foreach (ItemData allItem in inventory.GetAllItems()) { if (!allItem.m_shared.m_teleportable) { GameObject dropPrefab = allItem.m_dropPrefab; string item = ((dropPrefab != null) ? ((Object)dropPrefab).name : null) ?? ""; if (!allowed.Contains(item)) { return false; } } } return true; } } internal class RunaItemConfig { public string Id; public string PrefabName; public ConfigEntry<float> CooldownCE; public ConfigEntry<float> WeightCE; public ConfigEntry<bool> CraftEnabledCE; public ConfigEntry<bool> BossDropEnabledCE; public ConfigEntry<string> BossPrefabCE; public ConfigEntry<float> BossDropChanceCE; public ConfigEntry<int> BossDropAmountCE; public ConfigEntry<string> CraftStationCE; public ConfigEntry<int> MinStationLevelCE; public ConfigEntry<string> RecipeStringCE; public ConfigEntry<string> AllowedItemsCSVCE; public string IconFileName; public string VfxName; public string SfxName; public GameObject VfxPrefab; public GameObject SfxPrefab; public string NameCode; public string DescriptionCode; public RunaItemConfig(string id, string prefabName) { Id = id; PrefabName = prefabName; } } internal static Dictionary<string, RunaItemConfig> _runaConfigs = new Dictionary<string, RunaItemConfig>(); internal static DateTime _globalNextUse = DateTime.MinValue; public RunesTeleportGodesItems(AssetBundle assetBundle) { //IL_0a19: Unknown result type (might be due to invalid IL or missing references) RunaData runaData = new RunaData { Id = "RunaT1", PrefabName = "RunaT1", VfxName = "vfx_Celestial_heavy", SfxName = "sfx_runateleportsound", CooldownSec = RunesTeleportGodesConfig.RunaT1_Cooldown.Value, Weight = RunesTeleportGodesConfig.RunaT1_Weight.Value, CraftEnabled = RunesTeleportGodesConfig.RunaT1_CraftEnabled.Value, BossDropEnabled = RunesTeleportGodesConfig.RunaT1_BossDropEnabled.Value, BossPrefabName = RunesTeleportGodesConfig.RunaT1_BossPrefab.Value, BossDropChance = RunesTeleportGodesConfig.RunaT1_BossDropChance.Value, BossDropAmount = RunesTeleportGodesConfig.RunaT1_BossDropAmount.Value, CraftStation = RunesTeleportGodesConfig.RunaT1_CraftStation.Value, MinStationLevel = RunesTeleportGodesConfig.RunaT1_MinStationLevel.Value, RecipeString = RunesTeleportGodesConfig.RunaT1_RecipeString.Value, AllowedItemsCSV = RunesTeleportGodesConfig.RunaT1_AllowedItemsCSV.Value, IconFileName = "Runa_T1.png", NameCode = "RunaT1_name", DescriptionCode = "RunaT1_desc" }; RegisterRuna(assetBundle, runaData.Id, RunesTeleportGodesConfig.RunaT1_Cooldown, RunesTeleportGodesConfig.RunaT1_Weight, RunesTeleportGodesConfig.RunaT1_CraftEnabled, RunesTeleportGodesConfig.RunaT1_BossDropEnabled, RunesTeleportGodesConfig.RunaT1_BossPrefab, RunesTeleportGodesConfig.RunaT1_BossDropChance, RunesTeleportGodesConfig.RunaT1_BossDropAmount, RunesTeleportGodesConfig.RunaT1_CraftStation, RunesTeleportGodesConfig.RunaT1_MinStationLevel, RunesTeleportGodesConfig.RunaT1_RecipeString, RunesTeleportGodesConfig.RunaT1_AllowedItemsCSV, runaData.PrefabName, runaData.IconFileName, runaData.VfxName, runaData.SfxName, runaData.NameCode, runaData.DescriptionCode); RunaData runaData2 = new RunaData { Id = "RunaT2", PrefabName = "RunaT2", VfxName = "vfx_Celestial_heavy", SfxName = "sfx_runateleportsound", CooldownSec = RunesTeleportGodesConfig.RunaT2_Cooldown.Value, Weight = RunesTeleportGodesConfig.RunaT2_Weight.Value, CraftEnabled = RunesTeleportGodesConfig.RunaT2_CraftEnabled.Value, BossDropEnabled = RunesTeleportGodesConfig.RunaT2_BossDropEnabled.Value, BossPrefabName = RunesTeleportGodesConfig.RunaT2_BossPrefab.Value, BossDropChance = RunesTeleportGodesConfig.RunaT2_BossDropChance.Value, BossDropAmount = RunesTeleportGodesConfig.RunaT2_BossDropAmount.Value, CraftStation = RunesTeleportGodesConfig.RunaT2_CraftStation.Value, MinStationLevel = RunesTeleportGodesConfig.RunaT2_MinStationLevel.Value, RecipeString = RunesTeleportGodesConfig.RunaT2_RecipeString.Value, AllowedItemsCSV = RunesTeleportGodesConfig.RunaT2_AllowedItemsCSV.Value, IconFileName = "Runa_T2.png", NameCode = "RunaT2_name", DescriptionCode = "RunaT2_desc" }; RegisterRuna(assetBundle, runaData2.Id, RunesTeleportGodesConfig.RunaT2_Cooldown, RunesTeleportGodesConfig.RunaT2_Weight, RunesTeleportGodesConfig.RunaT2_CraftEnabled, RunesTeleportGodesConfig.RunaT2_BossDropEnabled, RunesTeleportGodesConfig.RunaT2_BossPrefab, RunesTeleportGodesConfig.RunaT2_BossDropChance, RunesTeleportGodesConfig.RunaT2_BossDropAmount, RunesTeleportGodesConfig.RunaT2_CraftStation, RunesTeleportGodesConfig.RunaT2_MinStationLevel, RunesTeleportGodesConfig.RunaT2_RecipeString, RunesTeleportGodesConfig.RunaT2_AllowedItemsCSV, runaData2.PrefabName, runaData2.IconFileName, runaData2.VfxName, runaData2.SfxName, runaData2.NameCode, runaData2.DescriptionCode); RunaData runaData3 = new RunaData { Id = "RunaT3", PrefabName = "RunaT3", VfxName = "vfx_Celestial_heavy", SfxName = "sfx_runateleportsound", CooldownSec = RunesTeleportGodesConfig.RunaT3_Cooldown.Value, Weight = RunesTeleportGodesConfig.RunaT3_Weight.Value, CraftEnabled = RunesTeleportGodesConfig.RunaT3_CraftEnabled.Value, BossDropEnabled = RunesTeleportGodesConfig.RunaT3_BossDropEnabled.Value, BossPrefabName = RunesTeleportGodesConfig.RunaT3_BossPrefab.Value, BossDropChance = RunesTeleportGodesConfig.RunaT3_BossDropChance.Value, BossDropAmount = RunesTeleportGodesConfig.RunaT3_BossDropAmount.Value, CraftStation = RunesTeleportGodesConfig.RunaT3_CraftStation.Value, MinStationLevel = RunesTeleportGodesConfig.RunaT3_MinStationLevel.Value, RecipeString = RunesTeleportGodesConfig.RunaT3_RecipeString.Value, AllowedItemsCSV = RunesTeleportGodesConfig.RunaT3_AllowedItemsCSV.Value, IconFileName = "Runa_T3.png", NameCode = "RunaT3_name", DescriptionCode = "RunaT3_desc" }; RegisterRuna(assetBundle, runaData3.Id, RunesTeleportGodesConfig.RunaT3_Cooldown, RunesTeleportGodesConfig.RunaT3_Weight, RunesTeleportGodesConfig.RunaT3_CraftEnabled, RunesTeleportGodesConfig.RunaT3_BossDropEnabled, RunesTeleportGodesConfig.RunaT3_BossPrefab, RunesTeleportGodesConfig.RunaT3_BossDropChance, RunesTeleportGodesConfig.RunaT3_BossDropAmount, RunesTeleportGodesConfig.RunaT3_CraftStation, RunesTeleportGodesConfig.RunaT3_MinStationLevel, RunesTeleportGodesConfig.RunaT3_RecipeString, RunesTeleportGodesConfig.RunaT3_AllowedItemsCSV, runaData3.PrefabName, runaData3.IconFileName, runaData3.VfxName, runaData3.SfxName, runaData3.NameCode, runaData3.DescriptionCode); RunaData runaData4 = new RunaData { Id = "RunaT4", PrefabName = "RunaT4", VfxName = "vfx_Celestial_heavy", SfxName = "sfx_runateleportsound", CooldownSec = RunesTeleportGodesConfig.RunaT4_Cooldown.Value, Weight = RunesTeleportGodesConfig.RunaT4_Weight.Value, CraftEnabled = RunesTeleportGodesConfig.RunaT4_CraftEnabled.Value, BossDropEnabled = RunesTeleportGodesConfig.RunaT4_BossDropEnabled.Value, BossPrefabName = RunesTeleportGodesConfig.RunaT4_BossPrefab.Value, BossDropChance = RunesTeleportGodesConfig.RunaT4_BossDropChance.Value, BossDropAmount = RunesTeleportGodesConfig.RunaT4_BossDropAmount.Value, CraftStation = RunesTeleportGodesConfig.RunaT4_CraftStation.Value, MinStationLevel = RunesTeleportGodesConfig.RunaT4_MinStationLevel.Value, RecipeString = RunesTeleportGodesConfig.RunaT4_RecipeString.Value, AllowedItemsCSV = RunesTeleportGodesConfig.RunaT4_AllowedItemsCSV.Value, IconFileName = "Runa_T4.png", NameCode = "RunaT4_name", DescriptionCode = "RunaT4_desc" }; RegisterRuna(assetBundle, runaData4.Id, RunesTeleportGodesConfig.RunaT4_Cooldown, RunesTeleportGodesConfig.RunaT4_Weight, RunesTeleportGodesConfig.RunaT4_CraftEnabled, RunesTeleportGodesConfig.RunaT4_BossDropEnabled, RunesTeleportGodesConfig.RunaT4_BossPrefab, RunesTeleportGodesConfig.RunaT4_BossDropChance, RunesTeleportGodesConfig.RunaT4_BossDropAmount, RunesTeleportGodesConfig.RunaT4_CraftStation, RunesTeleportGodesConfig.RunaT4_MinStationLevel, RunesTeleportGodesConfig.RunaT4_RecipeString, RunesTeleportGodesConfig.RunaT4_AllowedItemsCSV, runaData4.PrefabName, runaData4.IconFileName, runaData4.VfxName, runaData4.SfxName, runaData4.NameCode, runaData4.DescriptionCode); RunaData runaData5 = new RunaData { Id = "RunaT5", PrefabName = "RunaT5", VfxName = "vfx_Celestial_heavy", SfxName = "sfx_runateleportsound", CooldownSec = RunesTeleportGodesConfig.RunaT5_Cooldown.Value, Weight = RunesTeleportGodesConfig.RunaT5_Weight.Value, CraftEnabled = RunesTeleportGodesConfig.RunaT5_CraftEnabled.Value, BossDropEnabled = RunesTeleportGodesConfig.RunaT5_BossDropEnabled.Value, BossPrefabName = RunesTeleportGodesConfig.RunaT5_BossPrefab.Value, BossDropChance = RunesTeleportGodesConfig.RunaT5_BossDropChance.Value, BossDropAmount = RunesTeleportGodesConfig.RunaT5_BossDropAmount.Value, CraftStation = RunesTeleportGodesConfig.RunaT5_CraftStation.Value, MinStationLevel = RunesTeleportGodesConfig.RunaT5_MinStationLevel.Value, RecipeString = RunesTeleportGodesConfig.RunaT5_RecipeString.Value, AllowedItemsCSV = RunesTeleportGodesConfig.RunaT5_AllowedItemsCSV.Value, IconFileName = "Runa_T5.png", NameCode = "RunaT5_name", DescriptionCode = "RunaT5_desc" }; RegisterRuna(assetBundle, runaData5.Id, RunesTeleportGodesConfig.RunaT5_Cooldown, RunesTeleportGodesConfig.RunaT5_Weight, RunesTeleportGodesConfig.RunaT5_CraftEnabled, RunesTeleportGodesConfig.RunaT5_BossDropEnabled, RunesTeleportGodesConfig.RunaT5_BossPrefab, RunesTeleportGodesConfig.RunaT5_BossDropChance, RunesTeleportGodesConfig.RunaT5_BossDropAmount, RunesTeleportGodesConfig.RunaT5_CraftStation, RunesTeleportGodesConfig.RunaT5_MinStationLevel, RunesTeleportGodesConfig.RunaT5_RecipeString, RunesTeleportGodesConfig.RunaT5_AllowedItemsCSV, runaData5.PrefabName, runaData5.IconFileName, runaData5.VfxName, runaData5.SfxName, runaData5.NameCode, runaData5.DescriptionCode); RunaData runaData6 = new RunaData { Id = "RunaT6", PrefabName = "RunaT6", VfxName = "vfx_Celestial_heavy", SfxName = "sfx_runateleportsound", CooldownSec = RunesTeleportGodesConfig.RunaT6_Cooldown.Value, Weight = RunesTeleportGodesConfig.RunaT6_Weight.Value, CraftEnabled = RunesTeleportGodesConfig.RunaT6_CraftEnabled.Value, BossDropEnabled = RunesTeleportGodesConfig.RunaT6_BossDropEnabled.Value, BossPrefabName = RunesTeleportGodesConfig.RunaT6_BossPrefab.Value, BossDropChance = RunesTeleportGodesConfig.RunaT6_BossDropChance.Value, BossDropAmount = RunesTeleportGodesConfig.RunaT6_BossDropAmount.Value, CraftStation = RunesTeleportGodesConfig.RunaT6_CraftStation.Value, MinStationLevel = RunesTeleportGodesConfig.RunaT6_MinStationLevel.Value, RecipeString = RunesTeleportGodesConfig.RunaT6_RecipeString.Value, AllowedItemsCSV = RunesTeleportGodesConfig.RunaT6_AllowedItemsCSV.Value, IconFileName = "Runa_T6.png", NameCode = "RunaT6_name", DescriptionCode = "RunaT6_desc" }; RegisterRuna(assetBundle, runaData6.Id, RunesTeleportGodesConfig.RunaT6_Cooldown, RunesTeleportGodesConfig.RunaT6_Weight, RunesTeleportGodesConfig.RunaT6_CraftEnabled, RunesTeleportGodesConfig.RunaT6_BossDropEnabled, RunesTeleportGodesConfig.RunaT6_BossPrefab, RunesTeleportGodesConfig.RunaT6_BossDropChance, RunesTeleportGodesConfig.RunaT6_BossDropAmount, RunesTeleportGodesConfig.RunaT6_CraftStation, RunesTeleportGodesConfig.RunaT6_MinStationLevel, RunesTeleportGodesConfig.RunaT6_RecipeString, RunesTeleportGodesConfig.RunaT6_AllowedItemsCSV, runaData6.PrefabName, runaData6.IconFileName, runaData6.VfxName, runaData6.SfxName, runaData6.NameCode, runaData6.DescriptionCode); RunaData runaData7 = new RunaData { Id = "RunaT7", PrefabName = "RunaT7", VfxName = "vfx_Celestial_heavy", SfxName = "sfx_runateleportsound", CooldownSec = RunesTeleportGodesConfig.RunaT7_Cooldown.Value, Weight = RunesTeleportGodesConfig.RunaT7_Weight.Value, CraftEnabled = RunesTeleportGodesConfig.RunaT7_CraftEnabled.Value, BossDropEnabled = RunesTeleportGodesConfig.RunaT7_BossDropEnabled.Value, BossPrefabName = RunesTeleportGodesConfig.RunaT7_BossPrefab.Value, BossDropChance = RunesTeleportGodesConfig.RunaT7_BossDropChance.Value, BossDropAmount = RunesTeleportGodesConfig.RunaT7_BossDropAmount.Value, CraftStation = RunesTeleportGodesConfig.RunaT7_CraftStation.Value, MinStationLevel = RunesTeleportGodesConfig.RunaT7_MinStationLevel.Value, RecipeString = RunesTeleportGodesConfig.RunaT7_RecipeString.Value, AllowedItemsCSV = RunesTeleportGodesConfig.RunaT7_AllowedItemsCSV.Value, IconFileName = "Runa_T7.png", NameCode = "RunaT7_name", DescriptionCode = "RunaT7_desc" }; RegisterRuna(assetBundle, runaData7.Id, RunesTeleportGodesConfig.RunaT7_Cooldown, RunesTeleportGodesConfig.RunaT7_Weight, RunesTeleportGodesConfig.RunaT7_CraftEnabled, RunesTeleportGodesConfig.RunaT7_BossDropEnabled, RunesTeleportGodesConfig.RunaT7_BossPrefab, RunesTeleportGodesConfig.RunaT7_BossDropChance, RunesTeleportGodesConfig.RunaT7_BossDropAmount, RunesTeleportGodesConfig.RunaT7_CraftStation, RunesTeleportGodesConfig.RunaT7_MinStationLevel, RunesTeleportGodesConfig.RunaT7_RecipeString, RunesTeleportGodesConfig.RunaT7_AllowedItemsCSV, runaData7.PrefabName, runaData7.IconFileName, runaData7.VfxName, runaData7.SfxName, runaData7.NameCode, runaData7.DescriptionCode); new Harmony("Azathoth18.RunesTeleportGodes").PatchAll(typeof(Player_ConsumeRune_Patch)); PrefabManager.OnVanillaPrefabsAvailable += AddExtraBossDrops; } private void RegisterRuna(AssetBundle assetBundle, string runaId, ConfigEntry<float> cooldownCE, ConfigEntry<float> weightCE, ConfigEntry<bool> craftEnabledCE, ConfigEntry<bool> bossDropEnabledCE, ConfigEntry<string> bossPrefabCE, ConfigEntry<float> bossDropChanceCE, ConfigEntry<int> bossDropAmountCE, ConfigEntry<string> craftStationCE, ConfigEntry<int> minStationLevelCE, ConfigEntry<string> recipeStringCE, ConfigEntry<string> allowedItemsCSVCE, string prefabName, string iconFile, string vfxName, string sfxName, string nameCode, string descriptionCode) { //IL_033b: Unknown result type (might be due to invalid IL or missing references) //IL_0340: Unknown result type (might be due to invalid IL or missing references) //IL_0358: Unknown result type (might be due to invalid IL or missing references) //IL_0370: Unknown result type (might be due to invalid IL or missing references) //IL_0379: Unknown result type (might be due to invalid IL or missing references) //IL_031f: Unknown result type (might be due to invalid IL or missing references) //IL_0393: Unknown result type (might be due to invalid IL or missing references) //IL_03ad: Unknown result type (might be due to invalid IL or missing references) //IL_03b7: Expected O, but got Unknown //IL_041b: Unknown result type (might be due to invalid IL or missing references) //IL_0420: Unknown result type (might be due to invalid IL or missing references) //IL_043c: Unknown result type (might be due to invalid IL or missing references) //IL_044d: Unknown result type (might be due to invalid IL or missing references) //IL_0454: Expected O, but got Unknown //IL_03f0: Unknown result type (might be due to invalid IL or missing references) //IL_03fa: Expected O, but got Unknown GameObject val = assetBundle.LoadAsset<GameObject>(prefabName); if ((Object)(object)val == (Object)null) { Logger.LogWarning((object)("No se encontró prefab '" + prefabName + "' para la runa " + runaId + ".")); return; } if ((Object)(object)val.GetComponent<ItemDrop>() == (Object)null) { Logger.LogError((object)("El prefab '" + prefabName + "' no tiene ItemDrop. Se aborta registro de " + runaId + ".")); return; } GameObject val2 = null; if (!string.IsNullOrEmpty(vfxName)) { val2 = assetBundle.LoadAsset<GameObject>(vfxName + ".prefab"); if ((Object)(object)val2 != (Object)null && (Object)(object)PrefabManager.Instance.GetPrefab(vfxName) == (Object)null) { PrefabManager.Instance.AddPrefab(val2); } } GameObject val3 = null; if (!string.IsNullOrEmpty(sfxName)) { val3 = assetBundle.LoadAsset<GameObject>(sfxName + ".prefab"); if ((Object)(object)val3 != (Object)null && (Object)(object)PrefabManager.Instance.GetPrefab(sfxName) == (Object)null) { PrefabManager.Instance.AddPrefab(val3); } } RunaItemConfig runaItemConfig = new RunaItemConfig(runaId, prefabName) { CooldownCE = cooldownCE, WeightCE = weightCE, CraftEnabledCE = craftEnabledCE, BossDropEnabledCE = bossDropEnabledCE, BossPrefabCE = bossPrefabCE, BossDropChanceCE = bossDropChanceCE, BossDropAmountCE = bossDropAmountCE, CraftStationCE = craftStationCE, MinStationLevelCE = minStationLevelCE, RecipeStringCE = recipeStringCE, AllowedItemsCSVCE = allowedItemsCSVCE, IconFileName = iconFile, VfxName = vfxName, SfxName = sfxName, VfxPrefab = val2, SfxPrefab = val3, NameCode = nameCode, DescriptionCode = descriptionCode }; cooldownCE.SettingChanged += delegate { ReapplyRune(runaId); }; weightCE.SettingChanged += delegate { ReapplyRune(runaId); }; craftEnabledCE.SettingChanged += delegate { ReapplyRune(runaId); }; bossDropEnabledCE.SettingChanged += delegate { ReapplyRune(runaId); }; bossDropChanceCE.SettingChanged += delegate { ReapplyRune(runaId); }; bossDropAmountCE.SettingChanged += delegate { ReapplyRune(runaId); }; craftStationCE.SettingChanged += delegate { ReapplyRune(runaId); }; minStationLevelCE.SettingChanged += delegate { ReapplyRune(runaId); }; recipeStringCE.SettingChanged += delegate { ReapplyRune(runaId); }; allowedItemsCSVCE.SettingChanged += delegate { ReapplyRune(runaId); }; Sprite val4 = LoadIcon(assetBundle, iconFile); if ((Object)(object)val4 == (Object)null) { Logger.LogWarning((object)("No se encontró ícono '" + iconFile + "' para runa " + runaId + ". Usando ícono por defecto.")); val4 = RenderManager.Instance.Render(val, RenderManager.IsometricRotation); } List<(string, int)> list = ParseRecipeString(recipeStringCE.Value); ItemConfig val5 = new ItemConfig { Name = "$" + runaItemConfig.NameCode, Description = "$" + runaItemConfig.DescriptionCode, Icon = val4, CraftingStation = (craftEnabledCE.Value ? craftStationCE.Value : null), MinStationLevel = (craftEnabledCE.Value ? minStationLevelCE.Value : 0), Amount = 1 }; if (craftEnabledCE.Value) { foreach (var (text, num) in list) { val5.AddRequirement(new RequirementConfig(text, num, 0, false)); } } CustomItem val6 = new CustomItem(val, false, val5); val6.ItemDrop.m_itemData.m_shared.m_weight = weightCE.Value; val6.ItemDrop.m_itemData.m_shared.m_itemType = (ItemType)2; CustomItem val7 = val6; ItemManager.Instance.AddItem(val7); _runaConfigs[runaId] = runaItemConfig; Logger.LogInfo((object)$"Registrada runa {runaId} (prefab '{prefabName}'), craft={craftEnabledCE.Value}, bossDrop={bossDropEnabledCE.Value}"); } private void ReapplyRune(string runeId) { //IL_023e: Unknown result type (might be due to invalid IL or missing references) //IL_0243: Unknown result type (might be due to invalid IL or missing references) //IL_025f: Unknown result type (might be due to invalid IL or missing references) //IL_0271: Unknown result type (might be due to invalid IL or missing references) //IL_027a: Unknown result type (might be due to invalid IL or missing references) //IL_0285: Expected O, but got Unknown //IL_02b0: Unknown result type (might be due to invalid IL or missing references) //IL_02ba: Expected O, but got Unknown //IL_02d8: Unknown result type (might be due to invalid IL or missing references) //IL_02df: Expected O, but got Unknown if (!_runaConfigs.TryGetValue(runeId, out var config)) { return; } Logger.LogInfo((object)("[ReapplyRune] Re-aplicando valores en caliente para " + runeId + "...")); float value = config.WeightCE.Value; bool value2 = config.CraftEnabledCE.Value; string value3 = config.RecipeStringCE.Value; string craftingStation = (value2 ? config.CraftStationCE.Value : null); int minStationLevel = (value2 ? config.MinStationLevelCE.Value : 0); foreach (GameObject item in from o in Resources.FindObjectsOfTypeAll<GameObject>() where ((Object)o).name == config.PrefabName || ((Object)o).name.StartsWith(config.PrefabName + "(Clone)", StringComparison.OrdinalIgnoreCase) select o) { ItemDrop component = item.GetComponent<ItemDrop>(); if ((Object)(object)component != (Object)null) { component.m_itemData.m_shared.m_weight = value; Logger.LogInfo((object)$" => {((Object)item).name}: Nuevo peso = {value}"); } } HashSet<CustomRecipe> hashSet = AccessTools.Field(typeof(ItemManager), "Recipes").GetValue(ItemManager.Instance) as HashSet<CustomRecipe>; List<CustomRecipe> list = hashSet.Where((CustomRecipe r) => (Object)(object)((r != null) ? r.Recipe : null) != (Object)null && (Object)(object)r.Recipe.m_item != (Object)null && ((Object)r.Recipe.m_item).name == config.PrefabName).ToList(); foreach (CustomRecipe item2 in list) { Logger.LogInfo((object)("[ReapplyRune] Eliminando receta previa '" + ((Object)item2.Recipe).name + "'.")); hashSet.Remove(item2); if ((Object)(object)ObjectDB.instance != (Object)null) { ObjectDB.instance.m_recipes.Remove(item2.Recipe); } } if (!value2) { Logger.LogInfo((object)(" => Craft deshabilitado para " + runeId + "; no se registra receta nueva.")); ReapplyBossDrop(config); return; } List<(string, int)> list2 = ParseRecipeString(value3); RecipeConfig val = new RecipeConfig { Name = "Recipe_" + config.PrefabName, Item = config.PrefabName, CraftingStation = craftingStation, MinStationLevel = minStationLevel }; foreach (var (text, num) in list2) { val.AddRequirement(new RequirementConfig(text, num, 0, false)); } CustomRecipe val2 = new CustomRecipe(val); if ((Object)(object)ObjectDB.instance != (Object)null) { hashSet.Add(val2); ObjectDB.instance.m_recipes.Add(val2.Recipe); int num2 = ObjectDB.instance.m_recipes.IndexOf(val2.Recipe); if (num2 != -1) { Recipe val3 = ObjectDB.instance.m_recipes[num2]; Requirement[] resources = val3.m_resources; foreach (Requirement val4 in resources) { GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(((Object)val4.m_resItem).name.Replace("JVLmock_", "")); if ((Object)(object)itemPrefab != (Object)null) { val4.m_resItem = itemPrefab.GetComponent<ItemDrop>(); } } try { GameObject prefab = PrefabManager.Instance.GetPrefab(((Object)val3.m_craftingStation).name.Replace("JVLmock_", "")); val3.m_repairStation = (val3.m_craftingStation = (Object.op_Implicit((Object)(object)prefab) ? prefab.GetComponent<CraftingStation>() : null)); GameObject prefab2 = PrefabManager.Instance.GetPrefab(config.PrefabName); val3.m_item = ((prefab2 != null) ? prefab2.GetComponent<ItemDrop>() : null); } catch { } } Logger.LogInfo((object)$"[ReapplyRune] Receta nueva para {config.PrefabName} añadida con {list2.Count} requisitos."); } else { Logger.LogWarning((object)"[ReapplyRune] ObjectDB.instance es null; no se pudo agregar receta."); } ReapplyBossDrop(config); Logger.LogInfo((object)("[ReapplyRune] " + runeId + " reaplicado con éxito.")); } private void ReapplyBossDrop(RunaItemConfig config) { //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0177: Expected O, but got Unknown bool value = config.BossDropEnabledCE.Value; float value2 = config.BossDropChanceCE.Value; int value3 = config.BossDropAmountCE.Value; string value4 = config.BossPrefabCE.Value; if (string.IsNullOrEmpty(value4)) { return; } GameObject prefab = PrefabManager.Instance.GetPrefab(value4); if ((Object)(object)prefab == (Object)null) { Logger.LogWarning((object)("[ReapplyBossDrop] No se encontró boss prefab '" + value4 + "' para " + config.Id)); return; } CharacterDrop component = prefab.GetComponent<CharacterDrop>(); if ((Object)(object)component == (Object)null) { Logger.LogWarning((object)("El boss '" + value4 + "' no tiene CharacterDrop. No se añade/quita drop.")); return; } component.m_drops.RemoveAll((Drop d) => (Object)(object)d.m_prefab != (Object)null && ((Object)d.m_prefab).name == config.PrefabName); if (value) { GameObject prefab2 = PrefabManager.Instance.GetPrefab(config.PrefabName); if ((Object)(object)prefab2 == (Object)null) { Logger.LogWarning((object)("No se encontró prefab runa '" + config.PrefabName + "' para re-aplicar bossDrop.")); return; } Drop item = new Drop { m_prefab = prefab2, m_amountMin = value3, m_amountMax = value3, m_chance = value2, m_levelMultiplier = false }; component.m_drops.Add(item); Logger.LogInfo((object)$" => BossDrop re-aplicado: {value4} dropea {config.PrefabName} x{value3} chance={value2}"); } else { Logger.LogInfo((object)(" => BossDrop deshabilitado para " + config.Id + ".")); } } private void AddExtraBossDrops() { foreach (KeyValuePair<string, RunaItemConfig> runaConfig in _runaConfigs) { ReapplyBossDrop(runaConfig.Value); } } private Sprite LoadIcon(AssetBundle bundle, string iconFileName) { //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) if (string.IsNullOrEmpty(iconFileName)) { return null; } Texture2D val = bundle.LoadAsset<Texture2D>(iconFileName); return Object.op_Implicit((Object)(object)val) ? Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f)) : null; } private List<(string mat, int amt)> ParseRecipeString(string recipeStr) { List<(string, int)> list = new List<(string, int)>(); if (string.IsNullOrEmpty(recipeStr)) { return list; } string[] array = recipeStr.Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries); foreach (string text in array) { string[] array2 = text.Split(new char[1] { ':' }, StringSplitOptions.RemoveEmptyEntries); if (array2.Length == 2) { string item = array2[0].Trim(); if (int.TryParse(array2[1].Trim(), out var result)) { list.Add((item, result)); } } } return list; } } internal class PlayerTeleportation : MonoBehaviour { private static PlayerTeleportation _instance; public static PlayerTeleportation Instance { get { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown if ((Object)(object)_instance == (Object)null) { GameObject val = new GameObject("PlayerTeleportation"); _instance = val.AddComponent<PlayerTeleportation>(); Object.DontDestroyOnLoad((Object)(object)val); } return _instance; } } } internal class RunaData { public string Id; public string PrefabName; public string VfxName; public string SfxName; public float CooldownSec; public float Weight; public bool CraftEnabled; public bool BossDropEnabled; public string BossPrefabName; public float BossDropChance; public int BossDropAmount; public string CraftStation; public int MinStationLevel; public string RecipeString; public string AllowedItemsCSV; public string IconFileName; public string NameCode; public string DescriptionCode; }