Please disclose if any significant portion of your mod was created 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 InfernalDyrnwyn v1.0.1
BepInEx/plugins/InfernalDyrnwyn/InfernalDyrnwyn.dll
Decompiled a day agousing System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Jotunn.Extensions; using Jotunn.Managers; using Jotunn.Utils; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("Infernal Dyrnwyn")] [assembly: AssemblyDescription("Reworks Dyrnwyn with a full-circle Fire Nova secondary attack.")] [assembly: AssemblyCompany("Andoryn")] [assembly: AssemblyProduct("Infernal Dyrnwyn")] [assembly: ComVisible(false)] [assembly: AssemblyFileVersion("1.0.1")] [assembly: AssemblyInformationalVersion("1.0.1")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.1.38645")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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 InfernalDyrnwyn { internal sealed class DyrnwynNovaAoeMarker : MonoBehaviour { } [HarmonyPatch(typeof(Attack), "Update")] internal static class DyrnwynNovaAttackUpdatePatch { private const string NovaAttackPrefabName = "skeleton_firenova_aoe"; private const string NovaVisualPrefabName = "fx_fireskeleton_nova"; [ThreadStatic] internal static Attack ActiveNovaAttack; private static void Prefix(Attack __instance, out Attack __state) { __state = ActiveNovaAttack; if (IsDyrnwynNova(__instance)) { ActiveNovaAttack = __instance; } } private static void Postfix(Attack __instance, Attack __state) { ActiveNovaAttack = __state; } private static bool IsDyrnwynNova(Attack attack) { if ((Object)(object)attack?.m_attackProjectile == (Object)null || ((Object)attack.m_attackProjectile).name != "skeleton_firenova_aoe" || attack.m_startEffect?.m_effectPrefabs == null) { return false; } EffectData[] effectPrefabs = attack.m_startEffect.m_effectPrefabs; foreach (EffectData val in effectPrefabs) { if ((Object)(object)val?.m_prefab != (Object)null && ((Object)val.m_prefab).name == "fx_fireskeleton_nova") { return true; } } return false; } } [HarmonyPatch(typeof(EffectList), "Create")] internal static class DyrnwynNovaEffectOpacityPatch { private const float FlameAndSmokeAlpha = 0.5f; private static void Postfix(EffectList __instance, GameObject[] __result) { Aoe activeNova = DyrnwynNovaInitiatePatch.ActiveNova; if ((Object)(object)activeNova == (Object)null || __instance != activeNova.m_initiateEffect || __result == null) { return; } foreach (GameObject val in __result) { if ((Object)(object)val == (Object)null || !((Object)val).name.StartsWith("fx_fireball_staff_explosion")) { continue; } ParticleSystem[] componentsInChildren = val.GetComponentsInChildren<ParticleSystem>(true); foreach (ParticleSystem val2 in componentsInChildren) { if (((Object)((Component)val2).gameObject).name == "fire" || ((Object)((Component)val2).gameObject).name == "smoke") { SetParticleOpacity(val2, 0.5f); } } } } private static void SetParticleOpacity(ParticleSystem particleSystem, float opacity) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0067: 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) //IL_007f: Unknown result type (might be due to invalid IL or missing references) MainModule main = particleSystem.main; MinMaxGradient startColor = ((MainModule)(ref main)).startColor; if ((int)((MinMaxGradient)(ref startColor)).mode == 0) { Color color = ((MinMaxGradient)(ref startColor)).color; color.a *= opacity; ((MainModule)(ref main)).startColor = new MinMaxGradient(color); } Particle[] array = (Particle[])(object)new Particle[((MainModule)(ref main)).maxParticles]; int particles = particleSystem.GetParticles(array); for (int i = 0; i < particles; i++) { Color val = Color32.op_Implicit(((Particle)(ref array[i])).startColor); val.a *= opacity; ((Particle)(ref array[i])).startColor = Color32.op_Implicit(val); } particleSystem.SetParticles(array, particles); } } [HarmonyPatch(typeof(Aoe), "Setup")] internal static class DyrnwynNovaFollowingPatch { private const string ItemPrefabName = "SwordDyrnwyn"; private const string FireballExplosionPrefabName = "fx_fireball_staff_explosion"; private static void Prefix(Aoe __instance, ItemData item) { //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Expected O, but got Unknown //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Expected O, but got Unknown if ((Object)(object)__instance != (Object)null && (Object)(object)item?.m_dropPrefab != (Object)null && ((Object)item.m_dropPrefab).name == "SwordDyrnwyn") { __instance.m_attachToCaster = true; if ((Object)(object)((Component)__instance).GetComponent<DyrnwynNovaAoeMarker>() == (Object)null) { ((Component)__instance).gameObject.AddComponent<DyrnwynNovaAoeMarker>(); } ZNetScene instance = ZNetScene.instance; GameObject val = ((instance != null) ? instance.GetPrefab("fx_fireball_staff_explosion") : null); if ((Object)(object)val != (Object)null) { EffectList val2 = new EffectList(); val2.m_effectPrefabs = (EffectData[])(object)new EffectData[1] { new EffectData { m_prefab = val, m_enabled = true } }; __instance.m_initiateEffect = val2; } } } private static void Postfix(Aoe __instance, ItemData item) { if ((Object)(object)__instance != (Object)null && (Object)(object)item?.m_dropPrefab != (Object)null && ((Object)item.m_dropPrefab).name == "SwordDyrnwyn") { __instance.m_radius = Plugin.NovaDamageRadius.Value; } } } [HarmonyPatch(typeof(Aoe), "Initiate")] internal static class DyrnwynNovaInitiatePatch { [ThreadStatic] internal static Aoe ActiveNova; private static void Prefix(Aoe __instance, out Aoe __state) { __state = ActiveNova; if ((Object)(object)__instance != (Object)null && (Object)(object)((Component)__instance).GetComponent<DyrnwynNovaAoeMarker>() != (Object)null) { ActiveNova = __instance; } } private static void Postfix(Aoe __instance, Aoe __state) { ActiveNova = __state; } } [HarmonyPatch(typeof(EffectList), "Create")] internal static class DyrnwynNovaVisualScalePatch { private const float BaseNovaRadius = 3f; private const float BaseNovaVisualScale = 1.2f; private const string NovaVisualPrefabName = "fx_fireskeleton_nova"; private static void Postfix(EffectList __instance, GameObject[] __result) { //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) Attack activeNovaAttack = DyrnwynNovaAttackUpdatePatch.ActiveNovaAttack; if (activeNovaAttack == null || __instance != activeNovaAttack.m_startEffect || __result == null) { return; } foreach (GameObject val in __result) { if ((Object)(object)val != (Object)null && ((Object)val).name.StartsWith("fx_fireskeleton_nova")) { float num = Plugin.NovaDamageRadius.Value / 3f; Transform transform = val.transform; transform.localScale *= 1.2f * num; } } } } [HarmonyPatch(typeof(ObjectDB), "Awake")] internal static class DyrnwynRebalancePatch { private const string ItemPrefabName = "SwordDyrnwyn"; private const string NovaAttackPrefabName = "skeleton_firenova_aoe"; private const string NovaVisualPrefabName = "fx_fireskeleton_nova"; private const float MissingHealthDamageMultiplier = 0.002f; private static void Postfix() { ApplyCurrentSettings(); } internal static void ApplyCurrentSettings() { //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_01b7: Unknown result type (might be due to invalid IL or missing references) //IL_01bd: Expected O, but got Unknown //IL_01c6: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Unknown result type (might be due to invalid IL or missing references) //IL_01d2: Unknown result type (might be due to invalid IL or missing references) //IL_01d9: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Expected O, but got Unknown if (!((Object)(object)ObjectDB.instance == (Object)null) && !((Object)(object)ZNetScene.instance == (Object)null)) { GameObject itemPrefab = ObjectDB.instance.GetItemPrefab("SwordDyrnwyn"); ItemDrop val = ((itemPrefab != null) ? itemPrefab.GetComponent<ItemDrop>() : null); GameObject prefab = ZNetScene.instance.GetPrefab("skeleton_firenova_aoe"); GameObject prefab2 = ZNetScene.instance.GetPrefab("fx_fireskeleton_nova"); if (!((Object)(object)val == (Object)null) && !((Object)(object)prefab == (Object)null) && !((Object)(object)prefab2 == (Object)null)) { SharedData shared = val.m_itemData.m_shared; shared.m_damages.m_slash = Plugin.SlashDamage.Value; shared.m_damages.m_fire = Plugin.FireDamage.Value; shared.m_damages.m_spirit = Plugin.SpiritDamage.Value; shared.m_damagesPerLevel.m_slash = Plugin.SlashDamagePerLevel.Value; shared.m_damagesPerLevel.m_fire = Plugin.FireDamagePerLevel.Value; shared.m_damagesPerLevel.m_spirit = Plugin.SpiritDamagePerLevel.Value; shared.m_attack.m_damageMultiplierPerMissingHP = (Plugin.BloodstoneBonusEnabled.Value ? 0.002f : 0f); Attack secondaryAttack = shared.m_secondaryAttack; secondaryAttack.m_attackType = (AttackType)2; secondaryAttack.m_attackAnimation = "staff_trollsummon"; secondaryAttack.m_attackStamina = Plugin.NovaStaminaCost.Value; secondaryAttack.m_forceMultiplier = 4f; secondaryAttack.m_staggerMultiplier = 6f; secondaryAttack.m_damageMultiplier = Plugin.NovaDamageMultiplier.Value; secondaryAttack.m_damageMultiplierPerMissingHP = (Plugin.BloodstoneBonusEnabled.Value ? 0.002f : 0f); secondaryAttack.m_attackRange = Plugin.NovaDamageRadius.Value; secondaryAttack.m_attackAngle = 360f; secondaryAttack.m_attackOriginJoint = "Hips"; secondaryAttack.m_attackProjectile = prefab; EffectList val2 = new EffectList(); val2.m_effectPrefabs = (EffectData[])(object)new EffectData[1] { new EffectData { m_prefab = prefab2, m_enabled = true, m_attach = true } }; secondaryAttack.m_startEffect = val2; } } } } [HarmonyPatch(typeof(Attack), "Start")] internal static class DyrnwynNovaCenteringPatch { private static void Postfix(Attack __instance, ItemData weapon) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Invalid comparison between Unknown and I4 if ((Object)(object)weapon?.m_dropPrefab != (Object)null && ((Object)weapon.m_dropPrefab).name == "SwordDyrnwyn" && (int)__instance.m_attackType == 2) { __instance.m_attackRange = 0f; __instance.m_attackOriginJoint = string.Empty; } } } [HarmonyPatch(typeof(Player), "UpdateEnvStatusEffects")] internal static class DyrnwynWarmthPatch { private const string ItemPrefabName = "SwordDyrnwyn"; private static void Prefix(Player __instance) { //IL_0053: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)__instance != (Object)(object)Player.m_localPlayer) && Plugin.WarmthWhileWielded.Value) { ItemData currentWeapon = ((Humanoid)__instance).GetCurrentWeapon(); if ((Object)(object)currentWeapon?.m_dropPrefab != (Object)null && ((Object)currentWeapon.m_dropPrefab).name == "SwordDyrnwyn") { ((Character)__instance).OnNearFire(((Component)__instance).transform.position); } } } } [BepInPlugin("infernaldyrnwyn.mod", "Infernal Dyrnwyn", "1.0.1")] [BepInDependency(/*Could not decode attribute arguments.*/)] public sealed class Plugin : BaseUnityPlugin { public const string PluginGuid = "infernaldyrnwyn.mod"; public const string PluginName = "Infernal Dyrnwyn"; public const string PluginVersion = "1.0.1"; public static ConfigEntry<float> SlashDamage; public static ConfigEntry<float> FireDamage; public static ConfigEntry<float> SpiritDamage; public static ConfigEntry<float> SlashDamagePerLevel; public static ConfigEntry<float> FireDamagePerLevel; public static ConfigEntry<float> SpiritDamagePerLevel; public static ConfigEntry<bool> BloodstoneBonusEnabled; public static ConfigEntry<bool> WarmthWhileWielded; public static ConfigEntry<float> NovaStaminaCost; public static ConfigEntry<float> NovaDamageRadius; public static ConfigEntry<float> NovaDamageMultiplier; private Harmony _harmony; private void Awake() { //IL_022a: Unknown result type (might be due to invalid IL or missing references) //IL_0234: Expected O, but got Unknown SlashDamage = ConfigFileExtensions.BindConfig<float>(((BaseUnityPlugin)this).Config, "Damage", "Slash Damage", 125f, "Quality 1 slash damage for Dyrnwyn. The secondary attack uses this value too; added quality damage is configured separately.", true, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); FireDamage = ConfigFileExtensions.BindConfig<float>(((BaseUnityPlugin)this).Config, "Damage", "Fire Damage", 40f, "Quality 1 fire damage for Dyrnwyn. The secondary attack uses this value too; added quality damage is configured separately.", true, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); SpiritDamage = ConfigFileExtensions.BindConfig<float>(((BaseUnityPlugin)this).Config, "Damage", "Spirit Damage", 10f, "Quality 1 spirit damage for Dyrnwyn. The secondary attack uses this value too; added quality damage is configured separately.", true, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); SlashDamagePerLevel = ConfigFileExtensions.BindConfig<float>(((BaseUnityPlugin)this).Config, "Damage", "Slash Damage per Quality Level", 5f, "Additional Slash damage added for each quality level above quality 1.", true, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); FireDamagePerLevel = ConfigFileExtensions.BindConfig<float>(((BaseUnityPlugin)this).Config, "Damage", "Fire Damage per Quality Level", 5f, "Additional Fire damage added for each quality level above quality 1.", true, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); SpiritDamagePerLevel = ConfigFileExtensions.BindConfig<float>(((BaseUnityPlugin)this).Config, "Damage", "Spirit Damage per Quality Level", 5f, "Additional Spirit damage added for each quality level above quality 1.", true, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); BloodstoneBonusEnabled = ConfigFileExtensions.BindConfig<bool>(((BaseUnityPlugin)this).Config, "Bloodstone", "Enable Effect", true, "Enable 0.2% bonus damage per point of missing Health on both Dyrnwyn attacks.", true, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); WarmthWhileWielded = ConfigFileExtensions.BindConfig<bool>(((BaseUnityPlugin)this).Config, "Warmth", "Enable While Wielded", true, "While Dyrnwyn is your current weapon, count it as a nearby fire for warmth and cold protection.", true, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); NovaStaminaCost = ConfigFileExtensions.BindConfig<float>(((BaseUnityPlugin)this).Config, "Fire Nova", "Stamina Cost", 30f, "Stamina required to use Dyrnwyn's secondary Fire Nova attack.", true, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); NovaDamageRadius = ConfigFileExtensions.BindConfig<float>(((BaseUnityPlugin)this).Config, "Fire Nova", "Damage Radius", 3f, "Damage radius in meters for Dyrnwyn's secondary Fire Nova attack.", true, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); NovaDamageMultiplier = ConfigFileExtensions.BindConfig<float>(((BaseUnityPlugin)this).Config, "Fire Nova", "Damage Multiplier", 2f, "Base damage multiplier for Dyrnwyn's secondary Fire Nova attack.", true, (int?)null, (AcceptableValueBase)null, (Action<ConfigEntryBase>)null, (ConfigurationManagerAttributes)null); SynchronizationManager.OnConfigurationSynchronized += OnConfigurationSynchronized; _harmony = new Harmony("infernaldyrnwyn.mod"); _harmony.PatchAll(typeof(Plugin).Assembly); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Infernal Dyrnwyn 1.0.1 loaded."); } private void OnConfigurationSynchronized(object sender, ConfigurationSynchronizationEventArgs args) { DyrnwynRebalancePatch.ApplyCurrentSettings(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Applied Infernal Dyrnwyn settings after Jotunn config synchronization."); } private void OnDestroy() { SynchronizationManager.OnConfigurationSynchronized -= OnConfigurationSynchronized; if (_harmony != null) { _harmony.UnpatchSelf(); } } } }