Decompiled source of InfernalDyrnwyn v1.0.1

BepInEx/plugins/InfernalDyrnwyn/InfernalDyrnwyn.dll

Decompiled a day ago
using 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();
			}
		}
	}
}