Decompiled source of Monster Modifiers v1.0.16

MonsterModifiers.dll

Decompiled 2 weeks ago
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using JetBrains.Annotations;
using Jotunn;
using Jotunn.Entities;
using Jotunn.Managers;
using Jotunn.Utils;
using Microsoft.CodeAnalysis;
using MonsterModifiers.Custom_Components;
using MonsterModifiers.Modifiers;
using MonsterModifiers.StatusEffects;
using ServerSync;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using YamlDotNet.Core;
using YamlDotNet.Core.Events;
using YamlDotNet.Core.Tokens;
using YamlDotNet.Helpers;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.BufferedDeserialization;
using YamlDotNet.Serialization.BufferedDeserialization.TypeDiscriminators;
using YamlDotNet.Serialization.Converters;
using YamlDotNet.Serialization.EventEmitters;
using YamlDotNet.Serialization.NamingConventions;
using YamlDotNet.Serialization.NodeDeserializers;
using YamlDotNet.Serialization.NodeTypeResolvers;
using YamlDotNet.Serialization.ObjectFactories;
using YamlDotNet.Serialization.ObjectGraphTraversalStrategies;
using YamlDotNet.Serialization.ObjectGraphVisitors;
using YamlDotNet.Serialization.Schemas;
using YamlDotNet.Serialization.TypeInspectors;
using YamlDotNet.Serialization.TypeResolvers;
using YamlDotNet.Serialization.Utilities;
using YamlDotNet.Serialization.ValueDeserializers;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("MonsterModifiers")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyProduct("MonsterModifiers")]
[assembly: AssemblyCopyright("Copyright ©  2022")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("E0E2F92E-557C-4A05-9D89-AA92A0BD75C4")]
[assembly: AssemblyFileVersion("1.0.16")]
[assembly: AssemblyCompany("warpalicious")]
[assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.16.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[<ca05fdb9-20f8-4e1e-bcd3-20157a4fdca8>Embedded]
	internal sealed class <ca05fdb9-20f8-4e1e-bcd3-20157a4fdca8>EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[<ca05fdb9-20f8-4e1e-bcd3-20157a4fdca8>Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	[CompilerGenerated]
	internal sealed class <fc81162b-65fc-471a-9ad3-59efd7a37bc0>NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public <fc81162b-65fc-471a-9ad3-59efd7a37bc0>NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public <fc81162b-65fc-471a-9ad3-59efd7a37bc0>NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[<ca05fdb9-20f8-4e1e-bcd3-20157a4fdca8>Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class <5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public <5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace MonsterModifiers
{
	[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(0)]
	[BepInPlugin("warpalicious.MonsterModifiers", "MonsterModifiers", "1.0.16")]
	[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
	public class MonsterModifiersPlugin : BaseUnityPlugin
	{
		[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(0)]
		public enum Toggle
		{
			On = 1,
			Off = 0
		}

		[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(0)]
		private class ConfigurationManagerAttributes
		{
			[UsedImplicitly]
			public int? Order = null;

			[UsedImplicitly]
			public bool? Browsable = null;

			[UsedImplicitly]
			[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(2)]
			public string Category = null;

			[UsedImplicitly]
			[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(new byte[] { 2, 1 })]
			public Action<ConfigEntryBase> CustomDrawer = null;
		}

		[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(0)]
		private class AcceptableShortcuts : AcceptableValueBase
		{
			public AcceptableShortcuts()
				: base(typeof(KeyboardShortcut))
			{
			}

			public override object Clamp(object value)
			{
				return value;
			}

			public override bool IsValid(object value)
			{
				return true;
			}

			public override string ToDescriptionString()
			{
				return "# Acceptable values: " + string.Join(", ", UnityInput.Current.SupportedKeyCodes);
			}
		}

		internal const string ModName = "MonsterModifiers";

		internal const string ModVersion = "1.0.16";

		internal const string Author = "warpalicious";

		private const string ModGUID = "warpalicious.MonsterModifiers";

		private static string ConfigFileName = "warpalicious.MonsterModifiers.cfg";

		private static string ConfigFileFullPath;

		internal static string ConnectionError;

		private readonly Harmony _harmony = new Harmony("warpalicious.MonsterModifiers");

		public static readonly ManualLogSource MonsterModifiersLogger;

		private static readonly ConfigSync ConfigSync;

		public Texture2D tex = null;

		private static ConfigEntry<Toggle> _serverConfigLocked;

		public void Awake()
		{
			bool saveOnConfigSet = ((BaseUnityPlugin)this).Config.SaveOnConfigSet;
			((BaseUnityPlugin)this).Config.SaveOnConfigSet = false;
			_serverConfigLocked = config("1 - General", "Lock Configuration", Toggle.On, "If on, the configuration is locked and can be changed by server admins only.");
			ConfigSync.AddLockingConfigEntry<Toggle>(_serverConfigLocked);
			Assembly executingAssembly = Assembly.GetExecutingAssembly();
			_harmony.PatchAll(executingAssembly);
			SetupWatcher();
			if (saveOnConfigSet)
			{
				((BaseUnityPlugin)this).Config.SaveOnConfigSet = saveOnConfigSet;
				((BaseUnityPlugin)this).Config.Save();
			}
			YamlUtils.ParseDefaultYamls();
			TranslationUtils.AddLocalizations();
			ModifierAssetUtils.Setup();
			ModifierAssetUtils.LoadAllIcons();
			ShieldDome.LoadShieldDome();
			CompatibilityUtils.RunCompatibiltyChecks();
			StatusEffectUtils.CreateCustomStatusEffects();
			PrefabManager.OnVanillaPrefabsAvailable += PrefabUtils.CreateCustomPrefabs;
		}

		private void OnDestroy()
		{
			((BaseUnityPlugin)this).Config.Save();
		}

		private void SetupWatcher()
		{
			FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(Paths.ConfigPath, ConfigFileName);
			fileSystemWatcher.Changed += ReadConfigValues;
			fileSystemWatcher.Created += ReadConfigValues;
			fileSystemWatcher.Renamed += ReadConfigValues;
			fileSystemWatcher.IncludeSubdirectories = true;
			fileSystemWatcher.SynchronizingObject = ThreadingHelper.SynchronizingObject;
			fileSystemWatcher.EnableRaisingEvents = true;
		}

		private void ReadConfigValues(object sender, FileSystemEventArgs e)
		{
			if (!File.Exists(ConfigFileFullPath))
			{
				return;
			}
			try
			{
				MonsterModifiersLogger.LogDebug((object)"ReadConfigValues called");
				((BaseUnityPlugin)this).Config.Reload();
			}
			catch
			{
				MonsterModifiersLogger.LogError((object)("There was an issue loading your " + ConfigFileName));
				MonsterModifiersLogger.LogError((object)"Please check your config entries for spelling and format!");
			}
		}

		private ConfigEntry<T> config<[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(2)] T>(string group, string name, T value, ConfigDescription description, bool synchronizedSetting = true)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			ConfigDescription val = new ConfigDescription(description.Description + (synchronizedSetting ? " [Synced with Server]" : " [Not Synced with Server]"), description.AcceptableValues, description.Tags);
			ConfigEntry<T> val2 = ((BaseUnityPlugin)this).Config.Bind<T>(group, name, value, val);
			SyncedConfigEntry<T> syncedConfigEntry = ConfigSync.AddConfigEntry<T>(val2);
			syncedConfigEntry.SynchronizedConfig = synchronizedSetting;
			return val2;
		}

		private ConfigEntry<T> config<[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(2)] T>(string group, string name, T value, string description, bool synchronizedSetting = true)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Expected O, but got Unknown
			return config(group, name, value, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty<object>()), synchronizedSetting);
		}

		static MonsterModifiersPlugin()
		{
			string configPath = Paths.ConfigPath;
			char directorySeparatorChar = Path.DirectorySeparatorChar;
			ConfigFileFullPath = configPath + directorySeparatorChar + ConfigFileName;
			ConnectionError = "";
			MonsterModifiersLogger = Logger.CreateLogSource("MonsterModifiers");
			ConfigSync = new ConfigSync("warpalicious.MonsterModifiers")
			{
				DisplayName = "MonsterModifiers",
				CurrentVersion = "1.0.16",
				MinimumRequiredVersion = "1.0.16"
			};
			_serverConfigLocked = null;
		}
	}
	public static class KeyboardExtensions
	{
		public static bool IsKeyDown(this KeyboardShortcut shortcut)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			return (int)((KeyboardShortcut)(ref shortcut)).MainKey != 0 && Input.GetKeyDown(((KeyboardShortcut)(ref shortcut)).MainKey) && ((KeyboardShortcut)(ref shortcut)).Modifiers.All((Func<KeyCode, bool>)Input.GetKey);
		}

		public static bool IsKeyHeld(this KeyboardShortcut shortcut)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			return (int)((KeyboardShortcut)(ref shortcut)).MainKey != 0 && Input.GetKey(((KeyboardShortcut)(ref shortcut)).MainKey) && ((KeyboardShortcut)(ref shortcut)).Modifiers.All((Func<KeyCode, bool>)Input.GetKey);
		}
	}
	public class CompatibilityUtils
	{
		public static void RunCompatibiltyChecks()
		{
			if (Chainloader.PluginInfos.ContainsKey("CreatureLevelControl"))
			{
				MonsterModifiersPlugin.MonsterModifiersLogger.LogWarning((object)"CreatureLevelandLootControl plugin is installed. Please ensure special effects and infusions are disabled in CLLC configuration.");
			}
		}
	}
	[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
	[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(0)]
	public class DamageUtils
	{
		public static float TryCurrentWeapon(Humanoid humanoid)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			ItemData currentWeapon = humanoid.GetCurrentWeapon();
			if (currentWeapon == null)
			{
				return 10f;
			}
			DamageTypes damage = currentWeapon.GetDamage();
			if (((DamageTypes)(ref damage)).HaveDamage())
			{
				return 10f;
			}
			float totalDamage = ((DamageTypes)(ref damage)).GetTotalDamage();
			if (totalDamage == 0f)
			{
				return 10f;
			}
			DamageTypes damage2 = humanoid.GetCurrentWeapon().GetDamage();
			return ((DamageTypes)(ref damage2)).GetTotalDamage();
		}

		public static float TryWeaponList(GameObject[] weaponArray)
		{
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			float num = 10f;
			List<GameObject> list = weaponArray.ToList();
			if (list.Count > 0)
			{
				foreach (GameObject item in list)
				{
					ItemData itemData = item.GetComponent<ItemDrop>().m_itemData;
					if (itemData != null)
					{
						DamageTypes damage = itemData.GetDamage();
						float totalDamage = ((DamageTypes)(ref damage)).GetTotalDamage();
						if (totalDamage > num)
						{
							num = totalDamage;
						}
					}
				}
			}
			if (num > 0f)
			{
			}
			return num;
		}

		public static float CalculateDamage(Character character, float percentTotal)
		{
			Humanoid val = (Humanoid)(object)((character is Humanoid) ? character : null);
			if ((Object)(object)val == (Object)null)
			{
				return 10f;
			}
			if (character.IsPlayer())
			{
				return 10f;
			}
			float num = 10f;
			float num2 = TryCurrentWeapon(val);
			if (num2 > 0f && num2 > num)
			{
				num = num2;
			}
			float num3 = TryWeaponList(val.m_defaultItems);
			if (num3 > 0f && num3 > num)
			{
				num = num3;
			}
			float num4 = TryWeaponList(val.m_randomWeapon);
			if (num4 > 0f && num4 > num)
			{
				num = num4;
			}
			return num * percentTotal;
		}
	}
	[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(0)]
	[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
	public class ModifierAssetUtils
	{
		public static AssetBundle ashlandsAssetBundle;

		public static AssetBundle statusEffectBundle;

		public static AssetBundle modiferIconsBundle;

		public static Sprite swordIcon;

		public static Sprite shieldIcon;

		public static Sprite plusSquareIcon;

		public static Sprite circleIcon;

		public static Sprite soulIcon;

		public static Sprite skullIcon;

		public static Sprite appleIcon;

		public static Sprite shieldBrokenIcon;

		public static Sprite potionIcon;

		public static Sprite bloodIcon;

		public static Sprite bloodIconRed;

		public static Sprite heartIcon;

		public static void Setup()
		{
			ashlandsAssetBundle = AssetUtils.LoadAssetBundleFromResources("monster_modifiers_ashlands", Assembly.GetExecutingAssembly());
			statusEffectBundle = AssetUtils.LoadAssetBundleFromResources("statusicon", Assembly.GetExecutingAssembly());
			modiferIconsBundle = AssetUtils.LoadAssetBundleFromResources("modifiericons", Assembly.GetExecutingAssembly());
		}

		public static void LoadAllIcons()
		{
			swordIcon = modiferIconsBundle.LoadAsset<Sprite>("Assets/WarpProjects/Modifiers/NewModifierIcons/Sword.png");
			shieldIcon = modiferIconsBundle.LoadAsset<Sprite>("Assets/WarpProjects/Modifiers/NewModifierIcons/Shield.png");
			plusSquareIcon = modiferIconsBundle.LoadAsset<Sprite>("Assets/WarpProjects/Modifiers/NewModifierIcons/PlusBox.png");
			circleIcon = modiferIconsBundle.LoadAsset<Sprite>("Assets/WarpProjects/Modifiers/NewModifierIcons/Circle.png");
			soulIcon = modiferIconsBundle.LoadAsset<Sprite>("Assets/WarpProjects/Modifiers/NewModifierIcons/SoulEater.png");
			skullIcon = modiferIconsBundle.LoadAsset<Sprite>("Assets/WarpProjects/Modifiers/NewModifierIcons/Skull.png");
			appleIcon = modiferIconsBundle.LoadAsset<Sprite>("Assets/WarpProjects/Modifiers/NewModifierIcons/Apple.png");
			shieldBrokenIcon = modiferIconsBundle.LoadAsset<Sprite>("Assets/WarpProjects/Modifiers/NewModifierIcons/ShieldBroken.png");
			potionIcon = modiferIconsBundle.LoadAsset<Sprite>("Assets/WarpProjects/Modifiers/NewModifierIcons/Potion.png");
			heartIcon = modiferIconsBundle.LoadAsset<Sprite>("Assets/WarpProjects/Modifiers/NewModifierIcons/heartIcon.png");
			bloodIcon = statusEffectBundle.LoadAsset<Sprite>("Assets/WarpProjects/Modifiers/NewModifierIcons/bloodIcon.png");
			bloodIconRed = statusEffectBundle.LoadAsset<Sprite>("Assets/WarpProjects/Modifiers/NewModifierIcons/bloodIconRed.png");
		}
	}
	public enum MonsterModifierTypes
	{
		StaminaSiphon,
		EitrSiphon,
		ShieldBreaker,
		FoodDrain,
		IgnoreArmor,
		PoisonDeath,
		FrostDeath,
		FireDeath,
		HealDeath,
		StaggerDeath,
		TarDeath,
		PersonalShield,
		ShieldDome,
		SoulEater,
		RemoveStatusEffect,
		StaggerImmune,
		FireInfused,
		PoisonInfused,
		FrostInfused,
		LightningInfused,
		ElementalImmunity,
		PhysicalImmunity,
		FastMovement,
		FastAttackSpeed,
		DistantDetection,
		BloodLoss,
		Absorption
	}
	[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
	[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(0)]
	public class ModifierData
	{
		public int weight { get; set; }

		public List<float> color { get; set; }
	}
	[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
	[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(0)]
	public class ModifierUtils
	{
		public static Dictionary<MonsterModifierTypes, ModifierData> modifiers;

		public static Color GetModifierColor(MonsterModifierTypes modifier)
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			List<float> color = modifiers[modifier].color;
			Color result = default(Color);
			((Color)(ref result))..ctor(color[0], color[1], color[2], color[3]);
			return result;
		}

		public static Sprite GetModifierIcon(MonsterModifierTypes modifier)
		{
			if (modifier == MonsterModifierTypes.FireInfused || modifier == MonsterModifierTypes.FrostInfused || modifier == MonsterModifierTypes.PoisonInfused || modifier == MonsterModifierTypes.LightningInfused || modifier == MonsterModifierTypes.RemoveStatusEffect)
			{
				return ModifierAssetUtils.swordIcon;
			}
			if (modifier == MonsterModifierTypes.ShieldBreaker || modifier == MonsterModifierTypes.IgnoreArmor)
			{
				return ModifierAssetUtils.shieldBrokenIcon;
			}
			if (modifier == MonsterModifierTypes.StaminaSiphon || modifier == MonsterModifierTypes.EitrSiphon)
			{
				return ModifierAssetUtils.potionIcon;
			}
			switch (modifier)
			{
			case MonsterModifierTypes.FoodDrain:
				return ModifierAssetUtils.appleIcon;
			default:
				if (modifier != MonsterModifierTypes.TarDeath)
				{
					if (modifier == MonsterModifierTypes.ElementalImmunity || modifier == MonsterModifierTypes.PhysicalImmunity || modifier == MonsterModifierTypes.StaggerImmune)
					{
						return ModifierAssetUtils.shieldIcon;
					}
					if (modifier == MonsterModifierTypes.PersonalShield || modifier == MonsterModifierTypes.ShieldDome)
					{
						return ModifierAssetUtils.circleIcon;
					}
					switch (modifier)
					{
					case MonsterModifierTypes.SoulEater:
						return ModifierAssetUtils.soulIcon;
					default:
						if (modifier != MonsterModifierTypes.DistantDetection)
						{
							switch (modifier)
							{
							case MonsterModifierTypes.BloodLoss:
								return ModifierAssetUtils.bloodIcon;
							case MonsterModifierTypes.Absorption:
								return ModifierAssetUtils.heartIcon;
							default:
								Debug.Log((object)"Could not find icon for modifier");
								return ModifierAssetUtils.plusSquareIcon;
							}
						}
						goto case MonsterModifierTypes.FastMovement;
					case MonsterModifierTypes.FastMovement:
					case MonsterModifierTypes.FastAttackSpeed:
						return ModifierAssetUtils.plusSquareIcon;
					}
				}
				goto case MonsterModifierTypes.PoisonDeath;
			case MonsterModifierTypes.PoisonDeath:
			case MonsterModifierTypes.FrostDeath:
			case MonsterModifierTypes.FireDeath:
			case MonsterModifierTypes.HealDeath:
			case MonsterModifierTypes.StaggerDeath:
				return ModifierAssetUtils.skullIcon;
			}
		}

		public static int GetModifierWeight(MonsterModifierTypes modifier)
		{
			return modifiers[modifier].weight;
		}

		public static List<MonsterModifierTypes> RollRandomModifiers(int numModifiers)
		{
			List<MonsterModifierTypes> list = new List<MonsterModifierTypes>();
			Dictionary<MonsterModifierTypes, ModifierData> dictionary = new Dictionary<MonsterModifierTypes, ModifierData>(modifiers);
			for (int i = 0; i < numModifiers; i++)
			{
				int num = 0;
				foreach (ModifierData value in dictionary.Values)
				{
					num += value.weight;
				}
				int num2 = Random.Range(0, num);
				int num3 = 0;
				MonsterModifierTypes monsterModifierTypes = MonsterModifierTypes.StaminaSiphon;
				foreach (KeyValuePair<MonsterModifierTypes, ModifierData> item in dictionary)
				{
					num3 += item.Value.weight;
					if (num2 < num3)
					{
						monsterModifierTypes = item.Key;
						break;
					}
				}
				list.Add(monsterModifierTypes);
				dictionary.Remove(monsterModifierTypes);
				if (monsterModifierTypes == MonsterModifierTypes.ElementalImmunity)
				{
					dictionary.Remove(MonsterModifierTypes.PhysicalImmunity);
				}
				if (monsterModifierTypes == MonsterModifierTypes.PhysicalImmunity)
				{
					dictionary.Remove(MonsterModifierTypes.ElementalImmunity);
				}
			}
			return list;
		}

		public static void RunBiomeChecks()
		{
		}

		public static bool RunRPCDamageChecks(Character character, HitData hit)
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Invalid comparison between Unknown and I4
			if (hit == null || (Object)(object)character == (Object)null)
			{
				return false;
			}
			if (((DamageTypes)(ref hit.m_damage)).GetTotalDamage() == 0f)
			{
				return false;
			}
			if ((int)hit.m_hitType != 1)
			{
				return false;
			}
			return true;
		}

		public static bool RunRPCDamageChecks(Character character, HitData hit, bool isMonsterAttackingPlayer)
		{
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Invalid comparison between Unknown and I4
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Invalid comparison between Unknown and I4
			if (hit == null || (Object)(object)character == (Object)null)
			{
				Debug.Log((object)"Hit or character is null");
				return true;
			}
			if (((DamageTypes)(ref hit.m_damage)).GetTotalDamage() == 0f)
			{
				Debug.Log((object)"Total damage is 0");
				return true;
			}
			if (isMonsterAttackingPlayer)
			{
				if ((int)hit.m_hitType != 1)
				{
					Debug.Log((object)"hit type is not enemy hit");
					return true;
				}
			}
			else if ((int)hit.m_hitType != 2)
			{
				Debug.Log((object)"hit type is not player hit");
				return true;
			}
			return true;
		}

		public static bool RunHitChecks(HitData hit, bool isMonsterAttackingPlayer)
		{
			Character attacker = hit.GetAttacker();
			if ((Object)(object)attacker == (Object)null)
			{
				return false;
			}
			if (isMonsterAttackingPlayer && attacker.IsPlayer())
			{
				return false;
			}
			if (!isMonsterAttackingPlayer && attacker.IsPlayer())
			{
				return true;
			}
			return true;
		}
	}
	[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
	[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(0)]
	public class PrefabUtils
	{
		public static GameObject leechDeathVFX;

		public static GameObject leechDeathSFX;

		public static void CreateCustomPrefabs()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Expected O, but got Unknown
			//IL_0100: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Expected O, but got Unknown
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			GameObject prefab = PrefabManager.Instance.GetPrefab("shaman_heal_aoe");
			GameObject val = PrefabManager.Instance.CreateClonedPrefab("healCustomPrefab", prefab);
			CustomPrefab val2 = new CustomPrefab(val, false);
			Aoe component = val2.Prefab.GetComponent<Aoe>();
			component.m_statusEffect = "";
			GameObject prefab2 = PrefabManager.Instance.GetPrefab("Mistile");
			GameObject val3 = PrefabManager.Instance.CreateClonedPrefab("mistleCustomPrefab", prefab2);
			CustomPrefab val4 = new CustomPrefab(val3, false);
			Character component2 = (Character)(object)val4.Prefab.GetComponent<Humanoid>();
			component2.m_speed = 0f;
			component2.m_flyFastSpeed = 0f;
			component2.m_flySlowSpeed = 0f;
			component2.m_name = "$modifier_mistile";
			val4.Prefab.GetComponent<CharacterTimedDestruction>().m_timeoutMin = 2f;
			val4.Prefab.GetComponent<CharacterTimedDestruction>().m_timeoutMax = 4f;
			GameObject prefab3 = PrefabManager.Instance.GetPrefab("fx_DvergerMage_Mistile_attack");
			GameObject val5 = PrefabManager.Instance.CreateClonedPrefab("staggerDeathNovaCustomPrefab", prefab3);
			CustomPrefab val6 = new CustomPrefab(val5, false);
			GameObject gameObject = ((Component)ExposedGameObjectExtension.FindDeepChild(val6.Prefab, "shockwave (1)", (IterativeSearchType)1)).gameObject;
			ParticleSystem component3 = gameObject.GetComponent<ParticleSystem>();
			MainModule main = component3.main;
			((MainModule)(ref main)).startRotationX = new MinMaxCurve((float)Math.PI / 2f);
			((MainModule)(ref main)).startRotationY = new MinMaxCurve(0f);
			((MainModule)(ref main)).startRotationZ = new MinMaxCurve(0f);
			PrefabManager.Instance.AddPrefab(val2);
			PrefabManager.Instance.AddPrefab(val4);
			PrefabManager.Instance.AddPrefab(val6);
			leechDeathVFX = PrefabManager.Instance.GetPrefab("vfx_leech_death");
			leechDeathSFX = PrefabManager.Instance.GetPrefab("sfx_leech_death");
			PrefabManager.OnVanillaPrefabsAvailable -= CreateCustomPrefabs;
		}
	}
	public static class SpawnCommands
	{
		[HarmonyPatch(typeof(Terminal), "InitTerminal")]
		private static class Patch_Terminal_InitTerminal
		{
			[Serializable]
			[CompilerGenerated]
			private sealed class <>c
			{
				public static readonly <>c <>9 = new <>c();

				public static ConsoleEvent <>9__1_0;

				[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
				internal void <Postfix>b__1_0(ConsoleEventArgs args)
				{
					if (args.Length > 2)
					{
						string creatureName = args[1];
						string modifierName = args[2];
						SpawnModifier(creatureName, modifierName);
					}
					else
					{
						args.Context.AddString("Usage: modifier [creature] [modifier]");
					}
				}
			}

			[HarmonyPriority(800)]
			private static void Prefix(out bool __state)
			{
				__state = Terminal.m_terminalInitialized;
			}

			private static void Postfix(bool __state)
			{
				//IL_004b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0037: Unknown result type (might be due to invalid IL or missing references)
				//IL_003c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0042: Expected O, but got Unknown
				if (__state)
				{
					return;
				}
				MonsterModifiersPlugin.MonsterModifiersLogger.LogInfo((object)"Adding Terminal Commands for monster modifier spawning.");
				object obj = <>c.<>9__1_0;
				if (obj == null)
				{
					ConsoleEvent val = [<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)] (ConsoleEventArgs args) =>
					{
						if (args.Length > 2)
						{
							string creatureName = args[1];
							string modifierName = args[2];
							SpawnModifier(creatureName, modifierName);
						}
						else
						{
							args.Context.AddString("Usage: modifier [creature] [modifier]");
						}
					};
					<>c.<>9__1_0 = val;
					obj = (object)val;
				}
				new ConsoleCommand("modifier", "[creature] [modifier]", (ConsoleEvent)obj, true, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false);
			}
		}

		[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
		public static void SpawnModifier(string creatureName, string modifierName)
		{
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: 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_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			GameObject prefab = ZNetScene.instance.GetPrefab(creatureName);
			MonsterModifierTypes result;
			if ((Object)(object)prefab == (Object)null)
			{
				((Character)Player.m_localPlayer).Message((MessageType)1, "Missing object " + creatureName, 0, (Sprite)null);
			}
			else if (Enum.TryParse<MonsterModifierTypes>(modifierName, ignoreCase: true, out result))
			{
				Vector3 insideUnitSphere = Random.insideUnitSphere;
				GameObject val = Object.Instantiate<GameObject>(prefab, ((Component)Player.m_localPlayer).transform.position + ((Component)Player.m_localPlayer).transform.forward * 2f + Vector3.up + insideUnitSphere, Quaternion.identity);
				Character component = val.GetComponent<Character>();
				if (component.m_nview.GetZDO().IsOwner())
				{
					component.SetLevel(2);
					string text = string.Join(",", modifierName);
					component.m_nview.GetZDO().Set("modifiers", text);
				}
			}
			else
			{
				((Character)Player.m_localPlayer).Message((MessageType)1, "Invalid modifier name: " + modifierName, 0, (Sprite)null);
			}
		}
	}
	public class StatusEffectUtils
	{
		public static void CreateCustomStatusEffects()
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Expected O, but got Unknown
			BloodLoss_SE bloodLoss_SE = ScriptableObject.CreateInstance<BloodLoss_SE>();
			((Object)bloodLoss_SE).name = "BloodLossStatusEffect";
			((StatusEffect)bloodLoss_SE).m_name = "$se_bloodLoss";
			((StatusEffect)bloodLoss_SE).m_icon = ModifierAssetUtils.bloodIconRed;
			CustomStatusEffect val = new CustomStatusEffect((StatusEffect)(object)bloodLoss_SE, false);
			HealDeath_SE healDeath_SE = ScriptableObject.CreateInstance<HealDeath_SE>();
			((Object)healDeath_SE).name = "HealDeathStatusEffect";
			((StatusEffect)healDeath_SE).m_name = "$se_healDeath";
			((StatusEffect)healDeath_SE).m_ttl = 5f;
			((SE_Stats)healDeath_SE).m_tickInterval = 1f;
			((SE_Stats)healDeath_SE).m_healthOverTimeDuration = 5f;
			((SE_Stats)healDeath_SE).m_healthOverTimeInterval = 0.5f;
			((SE_Stats)healDeath_SE).m_healthOverTimeTicks = 10f;
			((SE_Stats)healDeath_SE).m_healthOverTime = 0f;
			CustomStatusEffect val2 = new CustomStatusEffect((StatusEffect)(object)healDeath_SE, false);
			ItemManager.Instance.AddStatusEffect(val);
			ItemManager.Instance.AddStatusEffect(val2);
		}
	}
	public class TranslationUtils
	{
		[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(1)]
		public static CustomLocalization Localization;

		public static void AddLocalizations()
		{
			Localization = LocalizationManager.Instance.GetLocalization();
			CustomLocalization localization = Localization;
			string text = "English";
			localization.AddTranslation(ref text, new Dictionary<string, string>
			{
				{ "$se_bloodLoss", "Blood Loss" },
				{ "$modifier_mistile", "Stagger Bomb" }
			});
		}
	}
	public class WorldUtils
	{
		[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
		public static List<Character> GetAllCharacter(Vector3 position, float range)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			Collider[] array = Physics.OverlapBox(position, Vector3.one * range, Quaternion.identity);
			List<Character> list = new List<Character>();
			Collider[] array2 = array;
			foreach (Collider val in array2)
			{
				Character componentInChildren = ((Component)((Component)val).transform.root).gameObject.GetComponentInChildren<Character>();
				if ((Object)(object)componentInChildren != (Object)null)
				{
					list.Add(componentInChildren);
				}
			}
			return list;
		}
	}
	public class YamlUtils
	{
		[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(1)]
		public static string defaultModifierValues;

		public static void ParseDefaultYamls()
		{
			defaultModifierValues = AssetUtils.LoadTextFromResources("modifierValues.yml");
			IDeserializer deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();
			ModifierUtils.modifiers = deserializer.Deserialize<Dictionary<MonsterModifierTypes, ModifierData>>(new StringReader(defaultModifierValues));
		}
	}
	[HarmonyPatch(typeof(ZNet), "OnNewConnection")]
	public static class RegisterAndCheckVersion
	{
		[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
		private static void Prefix(ZNetPeer peer, ref ZNet __instance)
		{
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Expected O, but got Unknown
			MonsterModifiersPlugin.MonsterModifiersLogger.LogDebug((object)"Registering version RPC handler");
			peer.m_rpc.Register<ZPackage>("MonsterModifiers_VersionCheck", (Action<ZRpc, ZPackage>)RpcHandlers.RPC_MonsterModifiers_Version);
			MonsterModifiersPlugin.MonsterModifiersLogger.LogDebug((object)"Invoking version check");
			ZPackage val = new ZPackage();
			val.Write("1.0.16");
			peer.m_rpc.Invoke("MonsterModifiers_VersionCheck", new object[1] { val });
		}
	}
	[HarmonyPatch(typeof(ZNet), "RPC_PeerInfo")]
	[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(0)]
	[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
	public static class VerifyClient
	{
		private static bool Prefix(ZRpc rpc, ZPackage pkg, ref ZNet __instance)
		{
			if (!__instance.IsServer() || RpcHandlers.ValidatedPeers.Contains(rpc))
			{
				return true;
			}
			MonsterModifiersPlugin.MonsterModifiersLogger.LogWarning((object)("Peer (" + rpc.m_socket.GetHostName() + ") never sent version or couldn't due to previous disconnect, disconnecting"));
			rpc.Invoke("Error", new object[1] { 3 });
			return false;
		}

		private static void Postfix(ZNet __instance)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			ZRoutedRpc.instance.InvokeRoutedRPC(ZRoutedRpc.instance.GetServerPeerID(), "MonsterModifiersRequestAdminSync", new object[1] { (object)new ZPackage() });
		}
	}
	[HarmonyPatch(typeof(FejdStartup), "ShowConnectError")]
	public class ShowConnectionError
	{
		[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
		private static void Postfix(FejdStartup __instance)
		{
			if (__instance.m_connectionFailedPanel.activeSelf)
			{
				__instance.m_connectionFailedError.fontSizeMax = 25f;
				__instance.m_connectionFailedError.fontSizeMin = 15f;
				TMP_Text connectionFailedError = __instance.m_connectionFailedError;
				connectionFailedError.text = connectionFailedError.text + "\n" + MonsterModifiersPlugin.ConnectionError;
			}
		}
	}
	[HarmonyPatch(typeof(ZNet), "Disconnect")]
	public static class RemoveDisconnectedPeerFromVerified
	{
		[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
		private static void Prefix(ZNetPeer peer, ref ZNet __instance)
		{
			if (__instance.IsServer())
			{
				MonsterModifiersPlugin.MonsterModifiersLogger.LogInfo((object)("Peer (" + peer.m_rpc.m_socket.GetHostName() + ") disconnected, removing from validated list"));
				RpcHandlers.ValidatedPeers.Remove(peer.m_rpc);
			}
		}
	}
	[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(0)]
	[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
	public static class RpcHandlers
	{
		public static readonly List<ZRpc> ValidatedPeers = new List<ZRpc>();

		public static void RPC_MonsterModifiers_Version(ZRpc rpc, ZPackage pkg)
		{
			string text = pkg.ReadString();
			MonsterModifiersPlugin.MonsterModifiersLogger.LogInfo((object)("Version check, local: 1.0.16,  remote: " + text));
			if (text != "1.0.16")
			{
				MonsterModifiersPlugin.ConnectionError = "MonsterModifiers Installed: 1.0.16\n Needed: " + text;
				if (ZNet.instance.IsServer())
				{
					MonsterModifiersPlugin.MonsterModifiersLogger.LogWarning((object)("Peer (" + rpc.m_socket.GetHostName() + ") has incompatible version, disconnecting..."));
					rpc.Invoke("Error", new object[1] { 3 });
				}
			}
			else if (!ZNet.instance.IsServer())
			{
				MonsterModifiersPlugin.MonsterModifiersLogger.LogInfo((object)"Received same version from server!");
			}
			else
			{
				MonsterModifiersPlugin.MonsterModifiersLogger.LogInfo((object)("Adding peer (" + rpc.m_socket.GetHostName() + ") to validated list"));
				ValidatedPeers.Add(rpc);
			}
		}
	}
}
namespace MonsterModifiers.StatusEffects
{
	[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(0)]
	[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
	public class BloodLoss_SE : StatusEffect
	{
		public int bloodLossAmount = 0;

		public int bloodLossCap;

		private float reductionTimer = 0f;

		private bool shouldRemove = false;

		public override void Setup(Character character)
		{
			((StatusEffect)this).Setup(character);
			bloodLossCap = Mathf.FloorToInt(character.GetMaxHealth());
		}

		public override void UpdateStatusEffect(float dt)
		{
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Expected O, but got Unknown
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			reductionTimer += dt;
			if (reductionTimer >= 60f)
			{
				bloodLossAmount = Mathf.Max(0, bloodLossAmount - 10);
				shouldRemove = true;
				reductionTimer = 0f;
			}
			if (bloodLossAmount > bloodLossCap)
			{
				bloodLossAmount = 0;
				HitData val = new HitData
				{
					m_damage = 
					{
						m_slash = base.m_character.GetMaxHealth() * 0.3f
					}
				};
				base.m_character.Damage(val);
				Object.Instantiate<GameObject>(PrefabUtils.leechDeathSFX, ((Component)base.m_character).transform.position, ((Component)base.m_character).transform.rotation);
				Object.Instantiate<GameObject>(PrefabUtils.leechDeathVFX, ((Component)base.m_character).transform.position, ((Component)base.m_character).transform.rotation);
				shouldRemove = true;
			}
		}

		public override string GetIconText()
		{
			return bloodLossAmount.ToString();
		}

		public override void OnDamaged(HitData hit, Character attacker)
		{
			if (ModifierUtils.RunRPCDamageChecks(attacker, hit) && ModifierUtils.RunHitChecks(hit, isMonsterAttackingPlayer: true))
			{
				MonsterModifier component = ((Component)attacker).GetComponent<MonsterModifier>();
				if (!((Object)(object)component == (Object)null) && component.Modifiers.Contains(MonsterModifierTypes.BloodLoss))
				{
					bloodLossAmount += Mathf.FloorToInt(hit.GetTotalDamage());
				}
			}
		}

		public override bool IsDone()
		{
			return shouldRemove || ((StatusEffect)this).IsDone();
		}
	}
	public class HealDeath_SE : SE_Stats
	{
		public override void SetLevel(int itemLevel, float skillLevel)
		{
			base.m_healthPerTick = skillLevel / 10f;
		}
	}
}
namespace MonsterModifiers.Patches
{
	[HarmonyPatch(typeof(EnemyHud), "ShowHud")]
	[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(0)]
	[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
	public static class EnemyHud_ShowHud_Patch
	{
		private static void Postfix(EnemyHud __instance, Character c, bool isMount)
		{
			if (!(c.IsPlayer() || isMount))
			{
				MonsterModifier component = ((Component)c).GetComponent<MonsterModifier>();
				if (!((Object)(object)component == (Object)null))
				{
					ChangeEnemyStars(c, component.Modifiers);
				}
			}
		}

		public static void ChangeEnemyStars(Character character, List<MonsterModifierTypes> modifiers)
		{
			//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
			if (character.GetLevel() <= 1 || character.IsBoss() || !EnemyHud.instance.m_huds.TryGetValue(character, out var value))
			{
				return;
			}
			GameObject gui = value.m_gui;
			for (int i = 0; i < gui.transform.childCount; i++)
			{
				Transform child = gui.transform.GetChild(i);
				if (!((Object)child).name.StartsWith("level_" + (modifiers.Count + 1)) || !((Component)child).gameObject.activeSelf)
				{
					continue;
				}
				for (int j = 0; j < ((Component)child).transform.childCount; j++)
				{
					Transform child2 = ((Component)child).transform.GetChild(j);
					((Component)child2).GetComponent<Image>().sprite = ModifierUtils.GetModifierIcon(modifiers[Mathf.Min(j, character.GetLevel() - 2)]);
					((Graphic)((Component)child2).GetComponent<Image>()).color = ModifierUtils.GetModifierColor(modifiers[Mathf.Min(j, character.GetLevel() - 2)]);
					if (((Object)child2).name.StartsWith("star") && ((Component)child2).gameObject.activeSelf)
					{
						((Component)child2.GetChild(0)).gameObject.SetActive(false);
					}
				}
			}
		}
	}
}
namespace MonsterModifiers.Modifiers
{
	public class Absorption
	{
		[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(0)]
		[HarmonyPatch(typeof(Character), "RPC_Damage")]
		[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
		public class Absorption_Character_RPC_Damage_Patch
		{
			public static void Prefix(Character __instance, HitData hit)
			{
				//IL_006c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0071: Unknown result type (might be due to invalid IL or missing references)
				//IL_0073: Unknown result type (might be due to invalid IL or missing references)
				//IL_0087: Unknown result type (might be due to invalid IL or missing references)
				//IL_009b: Unknown result type (might be due to invalid IL or missing references)
				//IL_00af: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
				//IL_0102: Unknown result type (might be due to invalid IL or missing references)
				//IL_011a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0132: Unknown result type (might be due to invalid IL or missing references)
				if (hit != null && !((Object)(object)__instance == (Object)null))
				{
					MonsterModifier component = ((Component)__instance).GetComponent<MonsterModifier>();
					if (!((Object)(object)component == (Object)null) && component.Modifiers.Contains(MonsterModifierTypes.Absorption) && ((DamageTypes)(ref hit.m_damage)).GetTotalDamage() != 0f)
					{
						DamageModifiers damageModifiers = __instance.GetDamageModifiers((WeakSpot)null);
						HealIfImmune(__instance, damageModifiers, (DamageType)1, hit.m_damage.m_blunt);
						HealIfImmune(__instance, damageModifiers, (DamageType)2, hit.m_damage.m_slash);
						HealIfImmune(__instance, damageModifiers, (DamageType)4, hit.m_damage.m_pierce);
						HealIfImmune(__instance, damageModifiers, (DamageType)8, hit.m_damage.m_chop);
						HealIfImmune(__instance, damageModifiers, (DamageType)16, hit.m_damage.m_pickaxe);
						HealIfImmune(__instance, damageModifiers, (DamageType)32, hit.m_damage.m_fire);
						HealIfImmune(__instance, damageModifiers, (DamageType)64, hit.m_damage.m_frost);
						HealIfImmune(__instance, damageModifiers, (DamageType)128, hit.m_damage.m_lightning);
						HealIfImmune(__instance, damageModifiers, (DamageType)256, hit.m_damage.m_poison);
						HealIfImmune(__instance, damageModifiers, (DamageType)512, hit.m_damage.m_spirit);
					}
				}
			}

			public static void HealIfImmune(Character character, DamageModifiers modifiers, DamageType type, float damage)
			{
				//IL_0009: Unknown result type (might be due to invalid IL or missing references)
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				if (damage > 0f && IsDamageTypeImmune(modifiers, type))
				{
					character.Heal(damage, true);
				}
			}

			public static bool IsDamageTypeImmune(DamageModifiers modifiers, DamageType type)
			{
				//IL_0005: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Invalid comparison between Unknown and I4
				//IL_0042: Unknown result type (might be due to invalid IL or missing references)
				//IL_0048: Invalid comparison between Unknown and I4
				//IL_000a: Unknown result type (might be due to invalid IL or missing references)
				//IL_000c: Invalid comparison between Unknown and I4
				//IL_005e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0064: Invalid comparison between Unknown and I4
				//IL_004a: Unknown result type (might be due to invalid IL or missing references)
				//IL_004d: Invalid comparison between Unknown and I4
				//IL_0031: Unknown result type (might be due to invalid IL or missing references)
				//IL_0034: Invalid comparison between Unknown and I4
				//IL_000e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0010: Unknown result type (might be due to invalid IL or missing references)
				//IL_0026: Expected I4, but got Unknown
				//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d9: Invalid comparison between Unknown and I4
				//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
				//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c1: Invalid comparison between Unknown and I4
				//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a9: Invalid comparison between Unknown and I4
				//IL_0072: Unknown result type (might be due to invalid IL or missing references)
				//IL_0073: Unknown result type (might be due to invalid IL or missing references)
				//IL_0079: Invalid comparison between Unknown and I4
				//IL_007e: 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)
				//IL_0085: Invalid comparison between Unknown and I4
				//IL_008a: Unknown result type (might be due to invalid IL or missing references)
				//IL_008b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0091: Invalid comparison between Unknown and I4
				//IL_0068: Unknown result type (might be due to invalid IL or missing references)
				//IL_006e: Invalid comparison between Unknown and I4
				//IL_0051: Unknown result type (might be due to invalid IL or missing references)
				//IL_0057: Invalid comparison between Unknown and I4
				//IL_0038: Unknown result type (might be due to invalid IL or missing references)
				//IL_003b: Invalid comparison between Unknown and I4
				//IL_0028: Unknown result type (might be due to invalid IL or missing references)
				//IL_002a: Invalid comparison between Unknown and I4
				//IL_00de: Unknown result type (might be due to invalid IL or missing references)
				//IL_00df: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e5: Invalid comparison between Unknown and I4
				//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cd: Invalid comparison between Unknown and I4
				//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
				//IL_00af: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b5: Invalid comparison between Unknown and I4
				//IL_0096: 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_009d: Invalid comparison between Unknown and I4
				if (1 == 0)
				{
				}
				bool result;
				if ((int)type <= 32)
				{
					if ((int)type <= 8)
					{
						switch (type - 1)
						{
						case 0:
							goto IL_0072;
						case 1:
							goto IL_007e;
						case 3:
							goto IL_008a;
						case 2:
							goto IL_00ea;
						}
						if ((int)type != 8)
						{
							goto IL_00ea;
						}
						result = (int)modifiers.m_chop == 3;
					}
					else if ((int)type != 16)
					{
						if ((int)type != 32)
						{
							goto IL_00ea;
						}
						result = (int)modifiers.m_fire == 3;
					}
					else
					{
						result = (int)modifiers.m_pickaxe == 3;
					}
				}
				else if ((int)type <= 128)
				{
					if ((int)type != 64)
					{
						if ((int)type != 128)
						{
							goto IL_00ea;
						}
						result = (int)modifiers.m_lightning == 3;
					}
					else
					{
						result = (int)modifiers.m_frost == 3;
					}
				}
				else if ((int)type != 256)
				{
					if ((int)type != 512)
					{
						goto IL_00ea;
					}
					result = (int)modifiers.m_spirit == 3;
				}
				else
				{
					result = (int)modifiers.m_poison == 3;
				}
				goto IL_00ee;
				IL_008a:
				result = (int)modifiers.m_pierce == 3;
				goto IL_00ee;
				IL_007e:
				result = (int)modifiers.m_slash == 3;
				goto IL_00ee;
				IL_0072:
				result = (int)modifiers.m_blunt == 3;
				goto IL_00ee;
				IL_00ee:
				if (1 == 0)
				{
				}
				return result;
				IL_00ea:
				result = false;
				goto IL_00ee;
			}
		}
	}
	public class BloodLoss
	{
		[HarmonyPatch(typeof(Character), "RPC_Damage")]
		public class RemoveMead_Character_RPC_Damage_Patch
		{
			[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
			public static void Postfix(Character __instance, HitData hit)
			{
				if (ModifierUtils.RunRPCDamageChecks(__instance, hit) && ModifierUtils.RunHitChecks(hit, isMonsterAttackingPlayer: true))
				{
					Character attacker = hit.GetAttacker();
					MonsterModifier component = ((Component)attacker).GetComponent<MonsterModifier>();
					if (!((Object)(object)component == (Object)null) && component.Modifiers.Contains(MonsterModifierTypes.BloodLoss) && !__instance.IsBlocking() && !__instance.GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("BloodLossStatusEffect")))
					{
						__instance.GetSEMan().AddStatusEffect(StringExtensionMethods.GetStableHashCode("BloodLossStatusEffect"), false, 0, 0f);
					}
				}
			}
		}
	}
	[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(0)]
	[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
	public class DistantDetection
	{
		public static void AddDistantDetection(Character character)
		{
			BaseAI baseAI = character.m_baseAI;
			if ((Object)(object)baseAI != (Object)null)
			{
				baseAI.m_hearRange *= 2f;
				baseAI.m_viewRange *= 2f;
			}
		}

		public static void RemoveDistantDetection(Character character)
		{
			BaseAI baseAI = character.m_baseAI;
			if ((Object)(object)baseAI != (Object)null)
			{
				baseAI.m_hearRange /= 2f;
				baseAI.m_viewRange /= 2f;
			}
		}
	}
	public class EitrSiphon
	{
		[HarmonyPatch(typeof(Character), "RPC_Damage")]
		public class EitrSiphon_Character_RPC_Damage_Patch
		{
			[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
			public static void Postfix(Character __instance, HitData hit)
			{
				if (ModifierUtils.RunRPCDamageChecks(__instance, hit) && ModifierUtils.RunHitChecks(hit, isMonsterAttackingPlayer: true) && !__instance.IsBlocking())
				{
					Character attacker = hit.GetAttacker();
					MonsterModifier component = ((Component)attacker).GetComponent<MonsterModifier>();
					if (!((Object)(object)component == (Object)null) && component.Modifiers.Contains(MonsterModifierTypes.EitrSiphon))
					{
						__instance.UseEitr(hit.GetTotalDamage());
					}
				}
			}
		}
	}
	public class FastAttackSpeed
	{
		[HarmonyPatch(typeof(CharacterAnimEvent), "CustomFixedUpdate")]
		public static class FastAttackSpeed_CharacterAnimEvent_CustomFixedUpdate_Patch
		{
			[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
			public static void Prefix(Character ___m_character, ref Animator ___m_animator)
			{
				if (!___m_character.InAttack() || ___m_character.IsPlayer())
				{
					return;
				}
				MonsterModifier component = ((Component)___m_character).GetComponent<MonsterModifier>();
				if (!((Object)(object)component == (Object)null) && component.Modifiers.Contains(MonsterModifierTypes.FastAttackSpeed))
				{
					double num = (double)___m_animator.speed * 10000000.0 % 100.0;
					float num2 = 0.5f;
					if ((!(num < 30.0) || !(num > 10.0)) && !(___m_animator.speed <= 0.001f))
					{
						___m_animator.speed = ___m_animator.speed * (1f + num2) + 1.9E-06f;
					}
				}
			}
		}

		[HarmonyPatch(typeof(Attack), "Start")]
		public static class FastAttackSpeed_Attack_Start_Patch
		{
			[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
			private static void Postfix(Humanoid character, ItemData weapon, bool __result)
			{
				if (((Character)character).InAttack() && !((Character)character).IsPlayer())
				{
					MonsterModifier component = ((Component)character).GetComponent<MonsterModifier>();
					if (!((Object)(object)component == (Object)null) && component.Modifiers.Contains(MonsterModifierTypes.FastAttackSpeed) && !((Character)character).IsPlayer() && __result && !((Character)character).IsBoss())
					{
						float num = 0.5f;
						weapon.m_lastAttackTime -= weapon.m_shared.m_aiAttackInterval * Mathf.Max(0f, num);
					}
				}
			}
		}
	}
	[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(0)]
	[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
	public class FastMovement
	{
		public static void AddFastMovement(Character character)
		{
			character.m_speed *= 1.5f;
			character.m_runSpeed *= 1.5f;
			character.m_walkSpeed *= 1.5f;
		}

		public static void RemoveFastMovement(Character character)
		{
			character.m_speed /= 1.5f;
			character.m_runSpeed /= 1.5f;
			character.m_walkSpeed /= 1.5f;
		}
	}
	public class FoodDrain
	{
		[HarmonyPatch(typeof(Character), "RPC_Damage")]
		public class FoodDrain_Character_RPC_Damage_Patch
		{
			[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
			public static void Postfix(Character __instance, HitData hit)
			{
				if (!ModifierUtils.RunRPCDamageChecks(__instance, hit) || !ModifierUtils.RunHitChecks(hit, isMonsterAttackingPlayer: true) || __instance.IsBlocking())
				{
					return;
				}
				Character attacker = hit.GetAttacker();
				MonsterModifier component = ((Component)attacker).GetComponent<MonsterModifier>();
				if ((Object)(object)component == (Object)null || !component.Modifiers.Contains(MonsterModifierTypes.FoodDrain))
				{
					return;
				}
				Player val = (Player)(object)((__instance is Player) ? __instance : null);
				if ((Object)(object)val != (Object)null)
				{
					List<Food> foods = val.GetFoods();
					int count = foods.Count;
					if (count > 0)
					{
						int index = Random.Range(0, count);
						Food obj = foods[index];
						obj.m_time *= 0.5f;
					}
				}
			}
		}
	}
	public class ElementalInfusions
	{
		[HarmonyPatch(typeof(Character), "RPC_Damage")]
		public class ElementalInfusions_Character_RPC_Damage_Patch
		{
			[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
			public static void Prefix(Character __instance, HitData hit)
			{
				if (!ModifierUtils.RunRPCDamageChecks(__instance, hit) || !ModifierUtils.RunHitChecks(hit, isMonsterAttackingPlayer: true) || __instance.IsBlocking())
				{
					return;
				}
				Character attacker = hit.GetAttacker();
				MonsterModifier component = ((Component)attacker).GetComponent<MonsterModifier>();
				if (!((Object)(object)component == (Object)null))
				{
					if (component.Modifiers.Contains(MonsterModifierTypes.PoisonInfused))
					{
						hit.m_damage.m_poison += hit.GetTotalDamage();
					}
					if (component.Modifiers.Contains(MonsterModifierTypes.FireInfused))
					{
						hit.m_damage.m_fire += hit.GetTotalDamage();
					}
					if (component.Modifiers.Contains(MonsterModifierTypes.LightningInfused))
					{
						hit.m_damage.m_lightning += hit.GetTotalDamage();
					}
					if (component.Modifiers.Contains(MonsterModifierTypes.FrostInfused))
					{
						hit.m_damage.m_frost += hit.GetTotalDamage();
					}
				}
			}
		}
	}
	public class IgnoreArmor
	{
		[HarmonyPatch(typeof(Character), "RPC_Damage")]
		public class IgnoreArmor_Character_RPC_Damage_Patch
		{
			[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
			public static void Prefix(Character __instance, HitData hit)
			{
				if (ModifierUtils.RunRPCDamageChecks(__instance, hit) && ModifierUtils.RunHitChecks(hit, isMonsterAttackingPlayer: true))
				{
					Character attacker = hit.GetAttacker();
					MonsterModifier component = ((Component)attacker).GetComponent<MonsterModifier>();
					if (!((Object)(object)component == (Object)null) && component.Modifiers.Contains(MonsterModifierTypes.IgnoreArmor))
					{
						shouldIgnoreArmor = true;
					}
				}
			}
		}

		[HarmonyPatch(typeof(Player), "GetBodyArmor")]
		public class IgnoreArmor_Player_GetBodyArmor_Patch
		{
			public static void Postfix(ref float __result)
			{
				if (shouldIgnoreArmor)
				{
					__result *= 0.5f;
					shouldIgnoreArmor = false;
				}
			}
		}

		public static bool shouldIgnoreArmor;
	}
	public class StaggerDeath
	{
		[HarmonyPatch(typeof(Character), "OnDeath")]
		public class StaggerDeath_Character_OnDeath_Patch
		{
			[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
			public static void Prefix(Character __instance)
			{
				//IL_005b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0060: Unknown result type (might be due to invalid IL or missing references)
				//IL_008d: Unknown result type (might be due to invalid IL or missing references)
				//IL_009d: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
				//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
				//IL_0172: Unknown result type (might be due to invalid IL or missing references)
				//IL_0142: Unknown result type (might be due to invalid IL or missing references)
				//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
				if ((Object)(object)__instance == (Object)null || __instance.IsPlayer() || (Object)(object)__instance.m_nview == (Object)null || !(((Object)((Component)__instance).gameObject).name == "mistleCustomPrefab(Clone)"))
				{
					return;
				}
				Vector3 position = ((Component)__instance).transform.position;
				GameObject prefab = PrefabManager.Instance.GetPrefab("staggerDeathNovaCustomPrefab");
				if (!((Object)(object)prefab != (Object)null))
				{
					return;
				}
				Object.Instantiate<GameObject>(prefab, new Vector3(((Component)__instance).transform.position.x, ((Component)__instance).transform.position.y - 1f, ((Component)__instance).transform.position.z), ((Component)__instance).transform.rotation);
				List<Character> allCharacter = WorldUtils.GetAllCharacter(((Component)__instance).transform.position, 5f);
				foreach (Character item in allCharacter)
				{
					if (!((Object)(object)item == (Object)(object)__instance) && !((Object)(object)item == (Object)null) && !((Object)(object)item.m_nview == (Object)null) && !item.IsPlayer())
					{
						item.Stagger(position);
					}
				}
				List<Player> list = new List<Player>();
				Player.GetPlayersInRange(((Component)__instance).transform.position, 5f, list);
				foreach (Player item2 in list)
				{
					if (!((Object)(object)item2 == (Object)null) && !((Object)(object)((Character)item2).m_nview == (Object)null))
					{
						((Character)item2).Stagger(position);
					}
				}
			}
		}
	}
	public class StaggerImmune
	{
		[HarmonyPatch(typeof(Character), "Stagger")]
		public class StaminaSiphon_Character_RPC_Damage_Patch
		{
			[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
			public static bool Prefix(Character __instance)
			{
				if ((Object)(object)__instance == (Object)null)
				{
					return true;
				}
				MonsterModifier component = ((Component)__instance).GetComponent<MonsterModifier>();
				if ((Object)(object)component == (Object)null)
				{
					return true;
				}
				if (component.Modifiers.Contains(MonsterModifierTypes.StaggerImmune))
				{
					return false;
				}
				return true;
			}
		}

		[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
		public static void AddStaggerImmune(Character character)
		{
			character.m_staggerWhenBlocked = false;
		}

		[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
		public static void RemoveStaggerImmune(Character character)
		{
			character.m_staggerWhenBlocked = true;
		}
	}
	public class DamageModifiers
	{
		[HarmonyPatch(typeof(Character), "RPC_Damage")]
		public class ModiferDamageModifiers_Character_RPC_Damage_Patch
		{
			[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
			public static void Prefix(Character __instance, HitData hit)
			{
				//IL_0067: Unknown result type (might be due to invalid IL or missing references)
				//IL_0073: 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)
				//IL_008b: 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_00b8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
				if (hit == null || (Object)(object)__instance == (Object)null || ((DamageTypes)(ref hit.m_damage)).GetTotalDamage() == 0f)
				{
					return;
				}
				MonsterModifier component = ((Component)__instance).GetComponent<MonsterModifier>();
				if (!((Object)(object)component == (Object)null))
				{
					if (component.Modifiers.Contains(MonsterModifierTypes.PhysicalImmunity))
					{
						__instance.m_damageModifiers.m_blunt = (DamageModifier)3;
						__instance.m_damageModifiers.m_pierce = (DamageModifier)3;
						__instance.m_damageModifiers.m_slash = (DamageModifier)3;
						__instance.m_damageModifiers.m_chop = (DamageModifier)3;
						__instance.m_damageModifiers.m_pickaxe = (DamageModifier)3;
					}
					if (component.Modifiers.Contains(MonsterModifierTypes.ElementalImmunity))
					{
						__instance.m_damageModifiers.m_fire = (DamageModifier)3;
						__instance.m_damageModifiers.m_frost = (DamageModifier)3;
						__instance.m_damageModifiers.m_lightning = (DamageModifier)3;
						__instance.m_damageModifiers.m_poison = (DamageModifier)3;
						__instance.m_damageModifiers.m_spirit = (DamageModifier)3;
					}
				}
			}
		}
	}
	public class RemoveStatusEffect
	{
		[HarmonyPatch(typeof(Character), "RPC_Damage")]
		public class RemoveMead_Character_RPC_Damage_Patch
		{
			[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
			public static void Postfix(Character __instance, HitData hit)
			{
				if (!ModifierUtils.RunRPCDamageChecks(__instance, hit) || !ModifierUtils.RunHitChecks(hit, isMonsterAttackingPlayer: true) || __instance.IsBlocking())
				{
					return;
				}
				Character attacker = hit.GetAttacker();
				MonsterModifier component = ((Component)attacker).GetComponent<MonsterModifier>();
				if (!((Object)(object)component == (Object)null) && component.Modifiers.Contains(MonsterModifierTypes.RemoveStatusEffect))
				{
					List<StatusEffect> statusEffects = __instance.GetSEMan().GetStatusEffects();
					if (statusEffects.Count > 1)
					{
						int index = Random.Range(0, statusEffects.Count);
						__instance.GetSEMan().RemoveStatusEffect(statusEffects[index], false);
					}
				}
			}
		}
	}
	public class ShieldBreaker
	{
		[HarmonyPatch(typeof(Humanoid), "BlockAttack")]
		public class ShieldBreaker_Humanoid_BlockAttack_Patch
		{
			[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
			public static void Postfix(Humanoid __instance, HitData hit, Character attacker)
			{
				if (hit == null || (Object)(object)__instance == (Object)null || (Object)(object)attacker == (Object)null || attacker.IsPlayer())
				{
					return;
				}
				MonsterModifier component = ((Component)attacker).GetComponent<MonsterModifier>();
				if (!((Object)(object)component == (Object)null) && component.Modifiers.Contains(MonsterModifierTypes.ShieldBreaker))
				{
					ItemData currentBlocker = __instance.GetCurrentBlocker();
					if (currentBlocker != null && (double)currentBlocker.m_durability > (double)currentBlocker.GetMaxDurability() * 0.1)
					{
						currentBlocker.m_durability *= 0.5f;
					}
				}
			}
		}
	}
	[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(0)]
	[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
	public class ShieldDome : MonoBehaviour
	{
		public static CustomPrefab ShieldGenereatorBubbleCustomPrefab;

		public static EffectData shieldDomeBubbleSFX;

		public GameObject shieldGenereatorBubble;

		public Character m_character;

		public ShieldGenerator m_shieldGenerator;

		public ShieldDomeImageEffect m_shieldDomeImageEffect;

		public ZNetView m_nview;

		public static void LoadShieldDome()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Expected O, but got Unknown
			ShieldGenereatorBubbleCustomPrefab = new CustomPrefab(ModifierAssetUtils.ashlandsAssetBundle, "ShieldDome_Bubble", true);
			PrefabManager.Instance.AddPrefab(ShieldGenereatorBubbleCustomPrefab);
		}

		public void AddShieldDome(Character character)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			((Component)character).gameObject.AddComponent<ShieldDome>();
			shieldGenereatorBubble = Object.Instantiate<GameObject>(ShieldGenereatorBubbleCustomPrefab.Prefab, ((Component)character).transform.position, ((Component)character).transform.rotation);
			m_character = character;
			m_shieldGenerator = shieldGenereatorBubble.GetComponent<ShieldGenerator>();
			m_nview = shieldGenereatorBubble.GetComponent<ZNetView>();
			m_shieldGenerator.m_nview = m_nview;
			m_shieldGenerator.m_defaultFuel = 999;
			m_shieldGenerator.m_radius = 10f;
			m_shieldGenerator.m_maxShieldRadius = 10f;
			m_shieldGenerator.m_minShieldRadius = 10f;
			m_shieldDomeImageEffect = Object.FindFirstObjectByType<ShieldDomeImageEffect>();
			if ((Object)(object)m_nview != (Object)null)
			{
				m_nview.Register("RPC_DestroyShieldDome", (Action<long>)RPC_DestroyShieldDome);
			}
		}

		public void Update()
		{
			//IL_0041: 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_0089: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)m_character != (Object)null && (Object)(object)shieldGenereatorBubble != (Object)null)
			{
				m_shieldGenerator.m_shieldDome.transform.position = ((Component)m_character).transform.position;
				m_shieldGenerator.m_shieldDome.transform.rotation = ((Component)m_character).transform.rotation;
				m_shieldDomeImageEffect.SetShieldData(m_shieldGenerator, ((Component)m_character).transform.position, 10f, m_shieldGenerator.m_lastFuel, m_shieldGenerator.m_lastHitTime);
			}
		}

		public void OnDestroy()
		{
			if ((Object)(object)m_nview != (Object)null && m_nview.IsValid() && m_nview.IsOwner())
			{
				m_nview.InvokeRPC(ZNetView.Everybody, "RPC_DestroyShieldDome", Array.Empty<object>());
			}
		}

		private void RPC_DestroyShieldDome(long sender)
		{
			DestroyShieldDome();
		}

		private void DestroyShieldDome()
		{
			if ((Object)(object)m_shieldGenerator != (Object)null)
			{
				m_shieldDomeImageEffect.RemoveShield(m_shieldGenerator);
			}
			if ((Object)(object)shieldGenereatorBubble != (Object)null)
			{
				ZNetScene.instance.Destroy(shieldGenereatorBubble);
			}
			if ((Object)(object)m_shieldGenerator.m_shieldDome != (Object)null)
			{
				ZNetScene.instance.Destroy(m_shieldGenerator.m_shieldDome);
			}
		}
	}
	[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(0)]
	[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
	public class PersonalShield
	{
		public static void AddPersonalShield(Character character)
		{
			int stableHashCode = StringExtensionMethods.GetStableHashCode("GoblinShaman_shield");
			character.GetSEMan().AddStatusEffect(stableHashCode, true, 10, 2f);
		}

		public static void RemovePersonalShield(Character character)
		{
			int stableHashCode = StringExtensionMethods.GetStableHashCode("GoblinShaman_shield");
			character.GetSEMan().RemoveStatusEffect(stableHashCode, false);
		}
	}
	public class DeathSpawns
	{
		[HarmonyPatch(typeof(Character), "OnDeath")]
		public class DeathSpawns_Character_OnDeath_Patch
		{
			[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
			public static void Prefix(Character __instance)
			{
				//IL_007b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0086: Unknown result type (might be due to invalid IL or missing references)
				//IL_0091: Unknown result type (might be due to invalid IL or missing references)
				//IL_0096: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a5: Expected O, but got Unknown
				//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
				//IL_0332: Unknown result type (might be due to invalid IL or missing references)
				//IL_0342: 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_0362: Unknown result type (might be due to invalid IL or missing references)
				//IL_036d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0169: Unknown result type (might be due to invalid IL or missing references)
				//IL_0179: Unknown result type (might be due to invalid IL or missing references)
				//IL_018f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0199: Unknown result type (might be due to invalid IL or missing references)
				//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
				//IL_01af: Unknown result type (might be due to invalid IL or missing references)
				//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
				//IL_01c3: Expected O, but got Unknown
				//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
				//IL_03c6: Unknown result type (might be due to invalid IL or missing references)
				//IL_03d6: Unknown result type (might be due to invalid IL or missing references)
				//IL_03ec: Unknown result type (might be due to invalid IL or missing references)
				//IL_03f6: Unknown result type (might be due to invalid IL or missing references)
				//IL_0401: Unknown result type (might be due to invalid IL or missing references)
				//IL_0287: Unknown result type (might be due to invalid IL or missing references)
				//IL_0297: Unknown result type (might be due to invalid IL or missing references)
				//IL_02ad: Unknown result type (might be due to invalid IL or missing references)
				//IL_02b7: Unknown result type (might be due to invalid IL or missing references)
				//IL_02c2: Unknown result type (might be due to invalid IL or missing references)
				//IL_02cd: Unknown result type (might be due to invalid IL or missing references)
				//IL_02d2: Unknown result type (might be due to invalid IL or missing references)
				//IL_02e1: Expected O, but got Unknown
				//IL_02e7: Unknown result type (might be due to invalid IL or missing references)
				//IL_0593: Unknown result type (might be due to invalid IL or missing references)
				//IL_05a3: Unknown result type (might be due to invalid IL or missing references)
				//IL_05b9: Unknown result type (might be due to invalid IL or missing references)
				//IL_05c3: Unknown result type (might be due to invalid IL or missing references)
				//IL_05ce: Unknown result type (might be due to invalid IL or missing references)
				//IL_0427: Unknown result type (might be due to invalid IL or missing references)
				//IL_05f4: Unknown result type (might be due to invalid IL or missing references)
				//IL_04d1: Unknown result type (might be due to invalid IL or missing references)
				//IL_06a1: Unknown result type (might be due to invalid IL or missing references)
				if ((Object)(object)__instance == (Object)null || __instance.IsPlayer())
				{
					return;
				}
				MonsterModifier component = ((Component)__instance).GetComponent<MonsterModifier>();
				if ((Object)(object)component == (Object)null)
				{
					return;
				}
				if (component.Modifiers.Contains(MonsterModifierTypes.PoisonDeath))
				{
					float poison = DamageUtils.CalculateDamage(__instance, 0.5f);
					GameObject prefab = ZNetScene.instance.GetPrefab("blob_aoe");
					if ((Object)(object)prefab != (Object)null)
					{
						Object.Instantiate<GameObject>(prefab, ((Component)__instance).transform.position, ((Component)__instance).transform.rotation);
						HitData hit = new HitData
						{
							m_damage = 
							{
								m_poison = poison
							}
						};
						ApplyDamageToNearbyPlayers(((Component)__instance).transform.position, hit);
					}
				}
				if (component.Modifiers.Contains(MonsterModifierTypes.FireDeath))
				{
					float fire = DamageUtils.CalculateDamage(__instance, 0.5f);
					GameObject prefab2 = ZNetScene.instance.GetPrefab("fx_fireskeleton_nova");
					ParticleSystem[] componentsInChildren = prefab2.GetComponentsInChildren<ParticleSystem>();
					ParticleSystem[] array = componentsInChildren;
					foreach (ParticleSystem val in array)
					{
						val.startDelay = 0f;
					}
					ZSFX componentInChildren = prefab2.GetComponentInChildren<ZSFX>();
					componentInChildren.m_delay = 0f;
					componentInChildren.m_minDelay = 0f;
					componentInChildren.m_maxDelay = 0f;
					if ((Object)(object)prefab2 != (Object)null)
					{
						Object.Instantiate<GameObject>(prefab2, new Vector3(((Component)__instance).transform.position.x, ((Component)__instance).transform.position.y + 1.25f, ((Component)__instance).transform.position.z), ((Component)__instance).transform.rotation);
						HitData hit2 = new HitData
						{
							m_damage = 
							{
								m_fire = fire
							}
						};
						ApplyDamageToNearbyPlayers(((Component)__instance).transform.position, hit2);
					}
				}
				if (component.Modifiers.Contains(MonsterModifierTypes.FrostDeath))
				{
					float frost = DamageUtils.CalculateDamage(__instance, 0.5f);
					GameObject prefab3 = ZNetScene.instance.GetPrefab("fx_DvergerMage_Nova_ring");
					ParticleSystem[] componentsInChildren2 = prefab3.GetComponentsInChildren<ParticleSystem>();
					ParticleSystem[] array2 = componentsInChildren2;
					foreach (ParticleSystem val2 in array2)
					{
						val2.startDelay = 0f;
					}
					ZSFX componentInChildren2 = prefab3.GetComponentInChildren<ZSFX>();
					componentInChildren2.m_delay = 0f;
					componentInChildren2.m_minDelay = 0f;
					componentInChildren2.m_maxDelay = 0f;
					if ((Object)(object)prefab3 != (Object)null)
					{
						Object.Instantiate<GameObject>(prefab3, new Vector3(((Component)__instance).transform.position.x, ((Component)__instance).transform.position.y + 1f, ((Component)__instance).transform.position.z), ((Component)__instance).transform.rotation);
						HitData hit3 = new HitData
						{
							m_damage = 
							{
								m_frost = frost
							}
						};
						ApplyDamageToNearbyPlayers(((Component)__instance).transform.position, hit3);
					}
				}
				if (component.Modifiers.Contains(MonsterModifierTypes.StaggerDeath))
				{
					GameObject prefab4 = PrefabManager.Instance.GetPrefab("mistleCustomPrefab");
					if ((Object)(object)prefab4 != (Object)null)
					{
						Object.Instantiate<GameObject>(prefab4, new Vector3(((Component)__instance).transform.position.x, ((Component)__instance).transform.position.y + 1f, ((Component)__instance).transform.position.z), ((Component)__instance).transform.rotation);
					}
				}
				if (component.Modifiers.Contains(MonsterModifierTypes.HealDeath))
				{
					GameObject prefab5 = PrefabManager.Instance.GetPrefab("healCustomPrefab");
					float num = __instance.GetMaxHealth() * 0.75f;
					if ((Object)(object)prefab5 != (Object)null)
					{
						Object.Instantiate<GameObject>(prefab5, new Vector3(((Component)__instance).transform.position.x, ((Component)__instance).transform.position.y + 1f, ((Component)__instance).transform.position.z), ((Component)__instance).transform.rotation);
					}
					if (((Character)Player.m_localPlayer).IsOwner())
					{
						List<Character> allCharacter = WorldUtils.GetAllCharacter(((Component)__instance).transform.position, 15f);
						foreach (Character item in allCharacter)
						{
							if (!((Object)(object)item == (Object)(object)__instance) && !((Object)(object)item == (Object)null) && !((Object)(object)item.m_nview == (Object)null) && !item.IsPlayer())
							{
								item.GetSEMan().AddStatusEffect(StringExtensionMethods.GetStableHashCode("HealDeathStatusEffect"), false, 0, num);
							}
						}
						List<Player> list = new List<Player>();
						Player.GetPlayersInRange(((Component)__instance).transform.position, 15f, list);
						foreach (Player item2 in list)
						{
							if (!((Object)(object)item2 == (Object)null) && !((Object)(object)((Character)item2).m_nview == (Object)null))
							{
								((Character)item2).GetSEMan().AddStatusEffect(StringExtensionMethods.GetStableHashCode("HealDeathStatusEffect"), true, 0, num);
							}
						}
					}
				}
				if (!component.Modifiers.Contains(MonsterModifierTypes.TarDeath))
				{
					return;
				}
				GameObject prefab6 = ZNetScene.instance.GetPrefab("blobtar_projectile_tarball");
				if ((Object)(object)prefab6 != (Object)null)
				{
					Object.Instantiate<GameObject>(prefab6, new Vector3(((Component)__instance).transform.position.x, ((Component)__instance).transform.position.y + 1f, ((Component)__instance).transform.position.z), ((Component)__instance).transform.rotation);
				}
				if (!((Character)Player.m_localPlayer).IsOwner())
				{
					return;
				}
				List<Character> allCharacter2 = WorldUtils.GetAllCharacter(((Component)__instance).transform.position, 5f);
				foreach (Character item3 in allCharacter2)
				{
					if (!((Object)(object)item3 == (Object)(object)__instance) && !((Object)(object)item3 == (Object)null) && !((Object)(object)item3.m_nview == (Object)null) && !item3.IsPlayer())
					{
						item3.GetSEMan().AddStatusEffect(StringExtensionMethods.GetStableHashCode("Tared"), false, 0, 0f);
					}
				}
				List<Player> list2 = new List<Player>();
				Player.GetPlayersInRange(((Component)__instance).transform.position, 5f, list2);
				foreach (Player item4 in list2)
				{
					if (!((Object)(object)item4 == (Object)null) && !((Object)(object)((Character)item4).m_nview == (Object)null))
					{
						((Character)item4).GetSEMan().AddStatusEffect(StringExtensionMethods.GetStableHashCode("Tared"), false, 0, 0f);
					}
				}
			}
		}

		[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
		public static void ApplyDamageToNearbyPlayers(Vector3 position, HitData hit)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			List<Player> list = new List<Player>();
			Player.GetPlayersInRange(position, 5f, list);
			foreach (Player item in list)
			{
				((Character)item).Damage(hit);
			}
		}
	}
	public class SoulEater : MonoBehaviour
	{
		[HarmonyPatch(typeof(Character), "OnDeath")]
		public class SoulEater_Character_OnDeath_Patch
		{
			[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
			public static void Prefix(Character __instance)
			{
				//IL_004a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0147: 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)
				MonsterModifier monsterModifier = default(MonsterModifier);
				if ((Object)(object)__instance == (Object)null || __instance.IsPlayer() || (((Component)__instance).TryGetComponent<MonsterModifier>(ref monsterModifier) && monsterModifier.Modifiers.Contains(MonsterModifierTypes.SoulEater)))
				{
					return;
				}
				List<Character> allCharacter = WorldUtils.GetAllCharacter(((Component)__instance).transform.position, 5f);
				foreach (Character item in allCharacter)
				{
					if (!((Object)(object)item == (Object)null) && !((Object)(object)item.m_nview == (Object)null) && item.m_nview.GetZDO() != null && item.m_nview.GetZDO().IsOwner())
					{
						MonsterModifier component = ((Component)item).GetComponent<MonsterModifier>();
						if ((Object)(object)component != (Object)null && component.Modifiers.Contains(MonsterModifierTypes.SoulEater) && item.m_nview.GetZDO().GetInt("MM_soulEaterCount", 0) < 3)
						{
							int num = item.m_nview.GetZDO().GetInt("MM_soulEaterCount", 0) + 1;
							item.m_nview.GetZDO().Set("MM_soulEaterCount", num);
							Transform transform = ((Component)item).transform;
							transform.localScale *= 1.1f;
							Physics.SyncTransforms();
							item.m_health *= 1.1f;
						}
					}
				}
			}
		}

		[HarmonyPatch(typeof(Character), "RPC_Damage")]
		public class SoulEater_Character_RPC_Damage_Patch
		{
			[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
			public static void Prefix(Character __instance, HitData hit)
			{
				if (!ModifierUtils.RunRPCDamageChecks(__instance, hit) || !ModifierUtils.RunHitChecks(hit, isMonsterAttackingPlayer: true))
				{
					return;
				}
				Character attacker = hit.GetAttacker();
				MonsterModifier component = ((Component)attacker).GetComponent<MonsterModifier>();
				if (!((Object)(object)component == (Object)null) && component.Modifiers.Contains(MonsterModifierTypes.SoulEater) && attacker.m_nview.GetZDO().GetInt("MM_soulEaterCount", 0) > 0)
				{
					int @int = attacker.m_nview.GetZDO().GetInt("MM_soulEaterCount", 0);
					float totalDamage = hit.GetTotalDamage();
					float num = totalDamage;
					switch (@int)
					{
					case 1:
						hit.ApplyModifier(1.1f);
						num = totalDamage * 1.1f;
						break;
					case 2:
						hit.ApplyModifier(1.2f);
						num = totalDamage * 1.2f;
						break;
					case 3:
						hit.ApplyModifier(1.3f);
						num = totalDamage * 1.3f;
						break;
					default:
						hit.ApplyModifier(1f);
						num = totalDamage * 1f;
						break;
					}
				}
			}
		}
	}
	public class StaminaSiphon
	{
		[HarmonyPatch(typeof(Character), "RPC_Damage")]
		public class StaminaSiphon_Character_RPC_Damage_Patch
		{
			[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
			public static void Postfix(Character __instance, HitData hit)
			{
				if (ModifierUtils.RunRPCDamageChecks(__instance, hit) && ModifierUtils.RunHitChecks(hit, isMonsterAttackingPlayer: true))
				{
					Character attacker = hit.GetAttacker();
					MonsterModifier component = ((Component)attacker).GetComponent<MonsterModifier>();
					if (!((Object)(object)component == (Object)null) && component.Modifiers.Contains(MonsterModifierTypes.StaminaSiphon) && !__instance.IsBlocking())
					{
						__instance.UseStamina(hit.GetTotalDamage());
					}
				}
			}
		}
	}
}
namespace MonsterModifiers.Custom_Components
{
	[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
	[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(0)]
	public class MonsterModifier : MonoBehaviour
	{
		public List<MonsterModifierTypes> Modifiers = new List<MonsterModifierTypes>();

		public Character character;

		public int level;

		private void Start()
		{
			character = ((Component)this).GetComponent<Character>();
			level = character.GetLevel();
			if ((Object)(object)character.m_nview != (Object)null && character.m_nview.GetZDO().GetString("BountyID", "") != string.Empty)
			{
				Object.Destroy((Object)(object)this);
			}
			else
			{
				if (level <= 1)
				{
					return;
				}
				string @string = character.m_nview.GetZDO().GetString("modifiers", string.Empty);
				if (string.IsNullOrEmpty(@string))
				{
					foreach (MonsterModifierTypes item in ModifierUtils.RollRandomModifiers(level - 1))
					{
						Modifiers.Add(item);
					}
					if (character.m_nview.GetZDO().IsOwner())
					{
						string text = string.Join(",", Modifiers);
						character.m_nview.GetZDO().Set("modifiers", text);
					}
				}
				else
				{
					Modifiers = new List<MonsterModifierTypes>(Array.ConvertAll(@string.Split(new char[1] { ',' }), [<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(0)] (string str) => (MonsterModifierTypes)Enum.Parse(typeof(MonsterModifierTypes), str)));
				}
				ApplyStartModifiers();
			}
		}

		public void ChangeModifiers(List<MonsterModifierTypes> modifierTypesList, int numModifiers)
		{
			if (level <= 1)
			{
				return;
			}
			foreach (MonsterModifierTypes modifierTypes in modifierTypesList)
			{
				Modifiers.Add(modifierTypes);
				Debug.Log((object)("Monster with name " + ((Object)character).name + " has has changed modifiers. New modifier: " + modifierTypes));
			}
			if (character.m_nview.GetZDO().IsOwner())
			{
				string text = string.Join(",", Modifiers);
				character.m_nview.GetZDO().Set("modifiers", text);
			}
		}

		public void ApplyStartModifiers()
		{
			if (Modifiers.Contains(MonsterModifierTypes.PersonalShield))
			{
				PersonalShield.AddPersonalShield(character);
			}
			if (Modifiers.Contains(MonsterModifierTypes.ShieldDome))
			{
				ShieldDome shieldDome = ((Component)character).gameObject.AddComponent<ShieldDome>();
				shieldDome.AddShieldDome(character);
			}
			if (Modifiers.Contains(MonsterModifierTypes.StaggerImmune))
			{
				StaggerImmune.AddStaggerImmune(character);
			}
			if (Modifiers.Contains(MonsterModifierTypes.FastMovement))
			{
				FastMovement.AddFastMovement(character);
			}
			if (Modifiers.Contains(MonsterModifierTypes.DistantDetection))
			{
				DistantDetection.AddDistantDetection(character);
			}
		}
	}
	public class AddMonsterModifiersToCharacter
	{
		[HarmonyPriority(800)]
		[HarmonyPatch(typeof(Character), "Awake")]
		public static class Character_Awake_Patch
		{
			[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
			private static void Postfix(Character __instance)
			{
				if (!__instance.IsPlayer() && !__instance.IsBoss())
				{
					((Component)__instance).gameObject.AddComponent<MonsterModifier>();
				}
			}
		}
	}
}
namespace LocalizationManager
{
	[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(1)]
	[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(0)]
	[PublicAPI]
	public class Localizer
	{
		private static readonly Dictionary<string, Dictionary<string, Func<string>>> PlaceholderProcessors;

		private static readonly Dictionary<string, Dictionary<string, string>> loadedTexts;

		private static readonly ConditionalWeakTable<Localization, string> localizationLanguage;

		private static readonly List<WeakReference<Localization>> localizationObjects;

		[<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(2)]
		private static BaseUnityPlugin _plugin;

		private static readonly List<string> fileExtensions;

		private static BaseUnityPlugin plugin
		{
			get
			{
				//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b2: Expected O, but got Unknown
				if (_plugin == null)
				{
					IEnumerable<TypeInfo> source;
					try
					{
						source = Assembly.GetExecutingAssembly().DefinedTypes.ToList();
					}
					catch (ReflectionTypeLoadException ex)
					{
						source = from t in ex.Types
							where t != null
							select t.GetTypeInfo();
					}
					_plugin = (BaseUnityPlugin)Chainloader.ManagerObject.GetComponent((Type)source.First([<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(0)] (TypeInfo t) => t.IsClass && typeof(BaseUnityPlugin).IsAssignableFrom(t)));
				}
				return _plugin;
			}
		}

		private static void UpdatePlaceholderText(Localization localization, string key)
		{
			localizationLanguage.TryGetValue(localization, out var value);
			string text = loadedTexts[value][key];
			if (PlaceholderProcessors.TryGetValue(key, out var value2))
			{
				text = value2.Aggregate(text, [<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(0)] (string current, KeyValuePair<string, Func<string>> kv) => current.Replace("{" + kv.Key + "}", kv.Value()));
			}
			localization.AddWord(key, text);
		}

		public static void AddPlaceholder<T>(string key, string placeholder, ConfigEntry<T> config, [<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(new byte[] { 2, 1, 1 })] Func<T, string> convertConfigValue = null)
		{
			if (convertConfigValue == null)
			{
				convertConfigValue = (T val) => val.ToString();
			}
			if (!PlaceholderProcessors.ContainsKey(key))
			{
				PlaceholderProcessors[key] = new Dictionary<string, Func<string>>();
			}
			config.SettingChanged += [<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(0)] (object _, EventArgs _) =>
			{
				UpdatePlaceholder();
			};
			if (loadedTexts.ContainsKey(Localization.instance.GetSelectedLanguage()))
			{
				UpdatePlaceholder();
			}
			void UpdatePlaceholder()
			{
				PlaceholderProcessors[key][placeholder] = () => convertConfigValue(config.Value);
				UpdatePlaceholderText(Localization.instance, key);
			}
		}

		public static void AddText(string key, string text)
		{
			List<WeakReference<Localization>> list = new List<WeakReference<Localization>>();
			foreach (WeakReference<Localization> localizationObject in localizationObjects)
			{
				if (localizationObject.TryGetTarget(out var target))
				{
					Dictionary<string, string> dictionary = loadedTexts[localizationLanguage.GetOrCreateValue(target)];
					if (!target.m_translations.ContainsKey(key))
					{
						dictionary[key] = text;
						target.AddWord(key, text);
					}
				}
				else
				{
					list.Add(localizationObject);
				}
			}
			foreach (WeakReference<Localization> item in list)
			{
				localizationObjects.Remove(item);
			}
		}

		public static void Load()
		{
			LoadLocalization(Localization.instance, Localization.instance.GetSelectedLanguage());
		}

		private static void LoadLocalization(Localization __instance, string language)
		{
			if (!localizationLanguage.Remove(__instance))
			{
				localizationObjects.Add(new WeakReference<Localization>(__instance));
			}
			localizationLanguage.Add(__instance, language);
			Dictionary<string, string> dictionary = new Dictionary<string, string>();
			foreach (string item in from f in Directory.GetFiles(Path.GetDirectoryName(Paths.PluginPath), plugin.Info.Metadata.Name + ".*", SearchOption.AllDirectories)
				where fileExtensions.IndexOf(Path.GetExtension(f)) >= 0
				select f)
			{
				string text = Path.GetFileNameWithoutExtension(item).Split(new char[1] { '.' })[1];
				if (dictionary.ContainsKey(text))
				{
					Debug.LogWarning((object)("Duplicate key " + text + " found for " + plugin.Info.Metadata.Name + ". The duplicate file found at " + item + " will be skipped."));
				}
				else
				{
					dictionary[text] = item;
				}
			}
			byte[] array = LoadTranslationFromAssembly("English");
			if (array == null)
			{
				throw new Exception("Found no English localizations in mod " + plugin.Info.Metadata.Name + ". Expected an embedded resource translations/English.json or translations/English.yml.");
			}
			Dictionary<string, string> dictionary2 = new DeserializerBuilder().IgnoreFields().Build().Deserialize<Dictionary<string, string>>(Encoding.UTF8.GetString(array));
			if (dictionary2 == null)
			{
				throw new Exception("Localization for mod " + plugin.Info.Metadata.Name + " failed: Localization file was empty.");
			}
			string text2 = null;
			if (language != "English")
			{
				if (dictionary.ContainsKey(language))
				{
					text2 = File.ReadAllText(dictionary[language]);
				}
				else
				{
					byte[] array2 = LoadTranslationFromAssembly(language);
					if (array2 != null)
					{
						text2 = Encoding.UTF8.GetString(array2);
					}
				}
			}
			if (text2 == null && dictionary.ContainsKey("English"))
			{
				text2 = File.ReadAllText(dictionary["English"]);
			}
			if (text2 != null)
			{
				foreach (KeyValuePair<string, string> item2 in new DeserializerBuilder().IgnoreFields().Build().Deserialize<Dictionary<string, string>>(text2) ?? new Dictionary<string, string>())
				{
					dictionary2[item2.Key] = item2.Value;
				}
			}
			loadedTexts[language] = dictionary2;
			foreach (KeyValuePair<string, string> item3 in dictionary2)
			{
				UpdatePlaceholderText(__instance, item3.Key);
			}
		}

		static Localizer()
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Expected O, but got Unknown
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Expected O, but got Unknown
			PlaceholderProcessors = new Dictionary<string, Dictionary<string, Func<string>>>();
			loadedTexts = new Dictionary<string, Dictionary<string, string>>();
			localizationLanguage = new ConditionalWeakTable<Localization, string>();
			localizationObjects = new List<WeakReference<Localization>>();
			fileExtensions = new List<string> { ".json", ".yml" };
			Harmony val = new Harmony("org.bepinex.helpers.LocalizationManager");
			val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Localization), "LoadCSV", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(Localizer), "LoadLocalization", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}

		[return: <fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(2)]
		private static byte[] LoadTranslationFromAssembly(string language)
		{
			foreach (string fileExtension in fileExtensions)
			{
				byte[] array = ReadEmbeddedFileBytes("translations." + language + fileExtension);
				if (array != null)
				{
					return array;
				}
			}
			return null;
		}

		[<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(2)]
		public static byte[] ReadEmbeddedFileBytes([<fc81162b-65fc-471a-9ad3-59efd7a37bc0>Nullable(1)] string resourceFileName, Assembly containingAssembly = null)
		{
			using MemoryStream memoryStream = new MemoryStream();
			if ((object)containingAssembly == null)
			{
				containingAssembly = Assembly.GetCallingAssembly();
			}
			string text = containingAssembly.GetManifestResourceNames().FirstOrDefault([<5444b883-fc1a-4ed4-a730-e1a13b8910b8>NullableContext(0)] (string str) => str.EndsWith(resourceFileName, StringComparison.Ordinal));
			if (text != null)
			{
				containingAssembly.GetManifestResourceStream(text)?.CopyTo(memoryStream);
			}
			return (memoryStream.Length == 0L) ? null : memoryStream.ToArray();
		}
	}
}
namespace Microsoft.CodeAnalysis
{
	[<78b5b5ac-44d7-450a-b359-66ee8eb7f88d>Embedded]
	[CompilerGenerated]
	internal sealed class <78b5b5ac-44d7-450a-b359-66ee8eb7f88d>EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[<78b5b5ac-44d7-450a-b359-66ee8eb7f88d>Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class <8e0a69f6-f410-4838-be09-e5cac51abcce>NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public <8e0a69f6-f410-4838-be09-e5cac51abcce>NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public <8e0a69f6-f410-4838-be09-e5cac51abcce>NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	[<78b5b5ac-44d7-450a-b359-66ee8eb7f88d>Embedded]
	[CompilerGenerated]
	internal sealed class <2c9cd5fc-5b07-4aca-9cbf-73e36f93465f>NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public <2c9cd5fc-5b07-4aca-9cbf-73e36f93465f>NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	[<78b5b5ac-44d7-450a-b359-66ee8eb7f88d>Embedded]
	[CompilerGenerated]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace ServerSync
{
	[<2c9cd5fc-5b07-4aca-9cbf-73e36f93465f>NullableContext(1)]
	[<8e0a69f6-f410-4838-be09-e5cac51abcce>Nullable(0)]
	[PublicAPI]
	internal abstract class OwnConfigEntryBase
	{
		[<8e0a69f6-f410-4838-be09-e5cac51abcce>Nullable(2)]
		public object LocalBaseValue;

		public bool SynchronizedConfig = true;

		public abstract ConfigEntryBase BaseConfig { get; }
	}
	[<2c9cd5fc-5b07-4aca-9cbf-73e36f93465f>NullableContext(1)]
	[PublicAPI]
	[<8e0a69f6-f410-4838-be09-e5cac51abcce>Nullable(0)]
	internal class SyncedConfigEntry<[<8e0a69f6-f410-4838-be09-e5cac51abcce>Nullable(2)] T> : OwnConfigEntryBase
	{
		public readonly ConfigEntry<T> SourceConfig;

		public override ConfigEntryBase BaseConfig => (ConfigEntryBase)(object)SourceConfig;

		public T Value
		{
			get
			{
				return SourceConfig.Value;
			}
			set
			{
				SourceConfig.Value = value;
			}
		}

		public SyncedConfigEntry(ConfigEntry<T> sourceConfig)
		{
			SourceConfig = sourceConfig;
		}

		public void AssignLocalValue(T value)
		{
			if (LocalBaseValue == null)
			{
				Value = value;
			}
			else
			{
				LocalBaseValue = value;
			}
		}
	}
	[<8e0a69f6-f410-4838-be09-e5cac51abcce>Nullable(0)]
	[<2c9cd5fc-5b07-4aca-9cbf-73e36f93465f>NullableContext(2)]
	internal abstract class CustomSyncedValueBase
	{
		public object LocalBaseValue;

		[<8e0a69f6-f410-4838-be09-e5cac51abcce>Nullable(1)]
		public readonly string Identifier;

		[<8e0a69f6-f410-4838-be09-e5cac51abcce>Nullable(1)]
		public readonly Type Type;

		private object boxedValue;

		protected bool localIsOwner;

		public readonly int Priority;

		public object BoxedValue
		{
			get
			{
				return boxedValue;
			}
			set
			{
				boxedValue = value;
				this.ValueChanged?.Invoke();
			}
		}

		public event Action ValueChanged;

		[<2c9cd5fc-5b07-4aca-9cbf-73e36f93465f>NullableContext(1)]
		protected CustomSyncedValueBase(ConfigSync configSync, string identifier, Type type, int priority)
		{
			Priority = priority;
			Identifier = identifier;
			Type = type;
			configSync.AddCustomValue(this);
			localIsOwner = configSync.IsSourceOfTruth;
			configSync.SourceOfTruthChanged += delegate(bool truth)
			{
				localIsOwner = truth;
			};
		}
	}
	[<8e0a69f6-f410-4838-be09-e5cac51abcce>Nullable(0)]
	[<2c9cd5fc-5b07-4aca-9cbf-73e36f93465f>NullableContext(1)]
	[PublicAPI]
	internal sealed class CustomSyncedValue<[<8e0a69f6-f410-4838-be09-e5cac51abcce>Nullable(2)] T> : CustomSyncedValueBase
	{
		public T Value
		{
			get
			{
				return (T)base.BoxedValue;
			}
			set
			{
				base.BoxedValue = value;
			}
		}

		public CustomSyncedValue(ConfigSync configSync, string identifier, T value = default(T), int priority = 0)
			: base(configSync, identifier, typeof(T), priority)
		{
			Value = value;
		}

		public void AssignLocalValue(T value)
		{
			if (localIsOwner)
			{
				Value = value;
			}
			else
			{
				LocalBaseValue = value;
			}
		}
	}
	internal class ConfigurationManagerAttributes
	{
		[UsedImplicitly]
		public bool? ReadOnly = false;
	}
	[<2c9cd5fc-5b07-4aca-9cbf-73e36f93465f>Nullab