Decompiled source of BetterDeathRaiser v2.1.0

GsiX.BetterDeathRaiser.dll

Decompiled 4 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Jotunn.Configs;
using Jotunn.Entities;
using Jotunn.GUI;
using Jotunn.Managers;
using Jotunn.Utils;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("BetterDeathRiser")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("BetterDeathRiser")]
[assembly: AssemblyCopyright("Copyright ©  2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("e3243d22-4307-4008-ba36-9f326008cde5")]
[assembly: AssemblyFileVersion("0.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
namespace BetterDeathRaiser;

[BepInPlugin("GsiX.BetterDeathRaiser", "GsiX Better Death Raiser", "2.1.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
internal class BetterDeathRaiserPlugin : BaseUnityPlugin
{
	[HarmonyPatch(typeof(Player), "Update")]
	private static class Player_Update_Patch
	{
		private static void Postfix(Player __instance)
		{
			//IL_01a9: 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_039a: 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)
			if (!PluginEnable.Value || (Object)(object)__instance == (Object)null)
			{
				return;
			}
			if (Undead.MainAttack != null && Undead.MainAttack.IsDone())
			{
				Undead.MainDelayStart = Time.time;
				Undead.MainAttack = null;
			}
			if (Undead.MainDelayStart != -1f && Time.time - Undead.MainDelayStart > 2f)
			{
				Undead.MainDelayStart = -1f;
			}
			if (EnableHumanRegen.Value && Time.time - Undead.PlayerHealInterval > 1f && Undead.HaveStatusEffect((Character)(object)__instance, "BDRStatusEffect"))
			{
				Undead.PlayerHealInterval = Time.time;
				Undead.CharacterHeal((Character)(object)__instance, HumanHealthRegen.Value);
			}
			if ((Object)(object)__instance != (Object)(object)Player.m_localPlayer)
			{
				return;
			}
			if (float.IsNaN(__instance.m_stamina))
			{
				__instance.m_stamina = 0f;
			}
			if (Undead.CurseInProgress)
			{
				if (!(Time.time - Undead.CurseDelayStart > Undead.CurseAnimationDelay))
				{
					return;
				}
				Character component = ((Component)__instance).GetComponent<Character>();
				if ((Object)(object)component != (Object)null)
				{
					float num = 0f;
					foreach (Character allCharacter in Character.GetAllCharacters())
					{
						if ((Object)(object)allCharacter != (Object)null && !allCharacter.IsDead() && (allCharacter.m_tamed || ((Object)allCharacter).name == Undead.ObjectName_Player || (int)allCharacter.m_faction == 0) && Vector3.Distance(((Component)component).transform.position, ((Component)allCharacter).transform.position) < UndeadCurseRadius.Value)
						{
							num += 1f;
							float num2 = allCharacter.GetHealth() + UndeadInstantHealth.Value;
							if (num2 > allCharacter.GetMaxHealth())
							{
								num2 = allCharacter.GetMaxHealth();
							}
							allCharacter.SetHealth(num2);
							allCharacter.m_seman.AddStatusEffect(Undead.UndeadSEEffect.StatusEffect.NameHash(), true, 0, 0f);
							if (Undead.AnimeLoadedSkull)
							{
								Undead.PlayCastAnimation(((Component)allCharacter).gameObject, Undead.SkullItems);
							}
							if (((Object)allCharacter).name == Undead.ObjectName_Player && (Object)(object)allCharacter != (Object)(object)component)
							{
								Undead.PrintCenterMessage(((Component)allCharacter).gameObject, "Undead Buff from " + __instance.GetPlayerName());
							}
						}
					}
					if (num == 1f)
					{
						Undead.PrintCenterMessage(((Component)component).gameObject, "Undead Cursed Himself");
					}
					else if (num > 1f)
					{
						Undead.PrintCenterMessage(((Component)component).gameObject, $"Undead Cursed {num} Subjects");
					}
				}
				Undead.CurseInProgress = false;
				Undead.PlayerCanMove = true;
			}
			else if (Undead.TeleInProgress)
			{
				if (!(Time.time - Undead.TeleDelayStart > Undead.TeleportAnimationDelay))
				{
					return;
				}
				MonsterAI val = default(MonsterAI);
				foreach (Character allCharacter2 in Character.GetAllCharacters())
				{
					if (!allCharacter2.IsDead() && ((Component)allCharacter2).TryGetComponent<MonsterAI>(ref val) && (Object)(object)val.GetFollowTarget() == (Object)(object)((Component)__instance).gameObject)
					{
						if (!allCharacter2.IsOwner())
						{
							allCharacter2.m_nview.ClaimOwnership();
						}
						((Component)allCharacter2).transform.position = ((Component)__instance).transform.position;
						((BaseAI)val).SetAlerted(false);
						val.m_targetCreature = null;
						val.m_targetStatic = null;
						val.m_timeSinceAttacking = 0f;
					}
				}
				Undead.TeleInProgress = false;
				Undead.PlayerCanMove = true;
			}
			else
			{
				if (!Undead.UnsummonProgress || !(Time.time - Undead.UnsummonDelayStart > Undead.UnsummonAnimationDelay))
				{
					return;
				}
				MonsterAI val2 = default(MonsterAI);
				foreach (Character allCharacter3 in Character.GetAllCharacters())
				{
					if (!allCharacter3.IsDead() && ((Component)allCharacter3).TryGetComponent<MonsterAI>(ref val2) && (Object)(object)val2.GetFollowTarget() == (Object)(object)((Component)__instance).gameObject)
					{
						if (!allCharacter3.IsOwner())
						{
							allCharacter3.m_nview.ClaimOwnership();
						}
						Tameable component2 = ((Component)allCharacter3).GetComponent<Tameable>();
						if ((Object)(object)component2 != (Object)null)
						{
							Undead.PlayCastAnimation(((Component)component2).gameObject, Undead.SkullItems);
							component2.UnSummon();
						}
					}
				}
				Undead.UnsummonProgress = false;
				Undead.PlayerCanMove = true;
			}
		}
	}

	[HarmonyPatch(typeof(Player), "GetComfortLevel")]
	private class Player_GetComfortLevel_Patch
	{
		private static void Postfix(Player __instance, ref int __result, ref bool __runOriginal)
		{
			if (!((Object)(object)__instance == (Object)null) && PluginEnable.Value)
			{
				if ((Object)(object)__instance != (Object)null && StatusEffectConfort.Value > 0 && Undead.HaveStatusEffect((Character)(object)__instance, "BDRStatusEffect"))
				{
					__result = __instance.m_comfortLevel + StatusEffectConfort.Value;
					__runOriginal = false;
				}
			}
		}
	}

	[HarmonyPatch(typeof(Humanoid), "Start")]
	private static class Humanoid_Start_Patch
	{
		private static bool Prefix(Humanoid __instance, ref bool __runOriginal)
		{
			if (PluginEnable.Value && (Object)(object)__instance != (Object)null && !((Character)__instance).IsPlayer() && ((Object)__instance).name == Undead.ObjectName_Vanilla)
			{
				Tameable component = ((Component)__instance).GetComponent<Tameable>();
				if ((Object)(object)component != (Object)null)
				{
					GameObject followTarget = component.m_monsterAI.GetFollowTarget();
					if ((Object)(object)Undead.UndeadSpawnOwner != (Object)null && (Object)(object)Undead.UndeadSpawnOwner == (Object)(object)followTarget)
					{
						component.m_commandable = true;
						Undead.UndeadUpdateInterval(component, set: true);
						for (int i = 0; i < 4; i++)
						{
							Undead.GiveDefaultItem(__instance, Undead.UndeadEquipmentEnum[i]);
						}
						string text = "";
						if (Undead.UndeadSpawnWeapon == Undeads.Weapon.Bow)
						{
							text = Undead.UndeadText[1];
							Undead.GiveDefaultItem(__instance, Undead.UndeadEquipmentEnum[6]);
							Undead.GiveDefaultItem(__instance, Undead.UndeadEquipmentEnum[7]);
						}
						else if (Undead.UndeadSpawnWeapon == Undeads.Weapon.Sword)
						{
							text = Undead.UndeadText[2];
							Undead.GiveDefaultItem(__instance, Undead.UndeadEquipmentEnum[4]);
							Undead.GiveDefaultItem(__instance, Undead.UndeadEquipmentEnum[5]);
						}
						else if (Undead.UndeadSpawnWeapon == Undeads.Weapon.Mace)
						{
							text = Undead.UndeadText[3];
							Undead.GiveDefaultItem(__instance, Undead.UndeadEquipmentEnum[8]);
							Undead.GiveDefaultItem(__instance, Undead.UndeadEquipmentEnum[5]);
						}
						component.SetText(component.GetText() + " " + text);
						Undead.UndeadSpawnOwner = null;
						__runOriginal = false;
						return false;
					}
					Undeads.Weapon undeadWeaponType = Undead.GetUndeadWeaponType(component);
					if (undeadWeaponType != 0)
					{
						component.m_commandable = true;
						Undead.UndeadUpdateInterval(component, set: true);
						for (int j = 0; j < 4; j++)
						{
							Undead.GiveDefaultItem(__instance, Undead.UndeadEquipmentEnum[j]);
						}
						switch (undeadWeaponType)
						{
						case Undeads.Weapon.Bow:
							Undead.GiveDefaultItem(__instance, Undead.UndeadEquipmentEnum[7]);
							Undead.GiveDefaultItem(__instance, Undead.UndeadEquipmentEnum[6]);
							break;
						case Undeads.Weapon.Sword:
							Undead.GiveDefaultItem(__instance, Undead.UndeadEquipmentEnum[5]);
							Undead.GiveDefaultItem(__instance, Undead.UndeadEquipmentEnum[4]);
							break;
						case Undeads.Weapon.Mace:
							Undead.GiveDefaultItem(__instance, Undead.UndeadEquipmentEnum[5]);
							Undead.GiveDefaultItem(__instance, Undead.UndeadEquipmentEnum[8]);
							break;
						}
						__runOriginal = false;
						return false;
					}
				}
			}
			__runOriginal = true;
			return true;
		}
	}

	[HarmonyPatch(typeof(Humanoid), "StartAttack")]
	private static class Humanoid_StartAttack_Patch
	{
		private static bool Prefix(Humanoid __instance, Character target, bool secondaryAttack, ref bool __result, ref bool __runOriginal)
		{
			if (PluginEnable.Value && (Object)(object)__instance != (Object)null && Undead.IsHoldingUndead(((Component)__instance).gameObject, EnabledTweakVanilla.Value))
			{
				Player component = ((Component)__instance).gameObject.GetComponent<Player>();
				if ((Object)(object)Player.m_localPlayer != (Object)(object)component || (Object)(object)Undead.UndeadSpawnOwner != (Object)null || Undead.MainDelayStart != -1f || Undead.MainAttack != null)
				{
					__result = false;
					__runOriginal = false;
					return __runOriginal;
				}
				__runOriginal = false;
				if ((((Character)__instance).InAttack() && !__instance.HaveQueuedChain()) || ((Character)__instance).InDodge() || !((Character)__instance).CanMove() || ((Character)__instance).IsKnockedBack() || ((Character)__instance).IsStaggering() || ((Character)__instance).InMinorAction())
				{
					__result = false;
					return false;
				}
				ItemData currentWeapon = __instance.GetCurrentWeapon();
				if (currentWeapon == null)
				{
					__result = false;
					return false;
				}
				if (secondaryAttack && !currentWeapon.HaveSecondaryAttack())
				{
					__result = false;
					return false;
				}
				if (!secondaryAttack && !currentWeapon.HavePrimaryAttack())
				{
					__result = false;
					return false;
				}
				if (__instance.m_currentAttack != null)
				{
					__instance.m_currentAttack.Stop();
					__instance.m_previousAttack = __instance.m_currentAttack;
					__instance.m_currentAttack = null;
				}
				Undead.MainAttack = ((!secondaryAttack) ? (Undead.MainAttack = currentWeapon.m_shared.m_attack.Clone()) : (Undead.MainAttack = currentWeapon.m_shared.m_secondaryAttack.Clone()));
				if (Undead.MainAttack.Start(__instance, ((Character)__instance).m_body, ((Character)__instance).m_zanim, ((Character)__instance).m_animEvent, __instance.m_visEquipment, currentWeapon, __instance.m_previousAttack, __instance.m_timeSinceLastAttack, __instance.GetAttackDrawPercentage()))
				{
					__instance.ClearActionQueue();
					__instance.m_currentAttack = Undead.MainAttack;
					__instance.m_currentAttackIsSecondary = secondaryAttack;
					__instance.m_lastCombatTimer = 0f;
					Undead.UndeadSpawnOwner = ((Component)Player.m_localPlayer).gameObject;
					Undead.UndeadSpawnWeapon = Undead.UndeadWeapon;
					__result = true;
					return false;
				}
				Undead.MainAttack = null;
				__result = false;
				return false;
			}
			__runOriginal = true;
			return true;
		}
	}

	[HarmonyPatch(typeof(Humanoid), "EquipItem")]
	private static class Humanoid_EquipItem_Patch
	{
		private static void Postfix(Humanoid __instance, ItemData item, bool triggerEquipEffects = true)
		{
			if (Undead.CastIsInAnimation || (!PluginEnable.Value && (Object)(object)__instance == (Object)null) || item == null || !Undead.IsHoldingUndead(((Component)__instance).gameObject, EnabledTweakVanilla.Value))
			{
				return;
			}
			UpdateStaffSkele_Undead(__instance.m_leftItem);
			UpdateStaffSkele_Vanilla(__instance.m_leftItem);
			Player component = ((Component)__instance).gameObject.GetComponent<Player>();
			if ((Object)(object)Player.m_localPlayer == (Object)(object)component)
			{
				if (Undead.UndeadWeapon == Undeads.Weapon.Bow)
				{
					Undead.PrintCenterMessage(((Component)__instance).gameObject, Undead.UndeadText[1]);
				}
				else if (Undead.UndeadWeapon == Undeads.Weapon.Sword)
				{
					Undead.PrintCenterMessage(((Component)__instance).gameObject, Undead.UndeadText[2]);
				}
				else if (Undead.UndeadWeapon == Undeads.Weapon.Mace)
				{
					Undead.PrintCenterMessage(((Component)__instance).gameObject, Undead.UndeadText[3]);
				}
			}
		}
	}

	[HarmonyPatch(typeof(Humanoid), "IsBlocking")]
	private static class Humanoid_IsBlocking_Patch
	{
		private static bool Prefix(Humanoid __instance, ref bool __result, ref bool __runOriginal)
		{
			__runOriginal = true;
			if (!PluginEnable.Value && (Object)(object)__instance == (Object)null)
			{
				return true;
			}
			Player component = ((Component)__instance).GetComponent<Player>();
			if ((Object)(object)component != (Object)null && (Object)(object)Player.m_localPlayer != (Object)null && (Object)(object)component == (Object)(object)Player.m_localPlayer)
			{
				if (__instance.m_leftItem == null || !Undead.IsHoldingUndead(((Component)__instance).gameObject, EnabledTweakVanilla.Value))
				{
					return true;
				}
				__runOriginal = false;
				__result = false;
				if (((Character)component).InAttack() || ((Character)component).InDodge() || ((Character)component).InPlaceMode() || ((Character)component).IsStaggering() || ((Character)component).InMinorAction())
				{
					return false;
				}
				if (Undead.TeleInProgress || Undead.CurseInProgress || Undead.UnsummonProgress)
				{
					return false;
				}
				if (ZInput.GetKey((KeyCode)324, true) && Time.time - Undead.WeaponSelectionStart > Undead.WeaponSelectionDelay)
				{
					Undead.WeaponSelectionStart = Time.time;
					if (ZInput.GetButton(Shortcut_Selection.Name))
					{
						TogglePanel();
					}
					else if (ZInput.GetButton(Shortcut_Teleport.Name))
					{
						UndeadTeleport();
					}
					else if (ZInput.GetButton(Shortcut_Curse.Name))
					{
						UndeadCurse();
					}
					else if (ZInput.GetButton(Shortcut_Unsummon.Name))
					{
						UndeadUnsummon();
					}
				}
				return false;
			}
			return true;
		}
	}

	[HarmonyPatch(typeof(Tameable), "Update")]
	private static class Tameable_Update_Patch
	{
		private static void Postfix(Tameable __instance)
		{
			if (!PluginEnable.Value || !((Object)(object)__instance != (Object)null) || !Undead.IsTamedUndead(__instance) || !Undead.UndeadUpdateInterval(__instance))
			{
				return;
			}
			if (DisableUndeadHungry.Value)
			{
				__instance.ResetFeedingTimer();
			}
			if (!EnableUndeadRegen.Value)
			{
				return;
			}
			if (UndeadCursedHealOnly.Value)
			{
				Character component = ((Component)__instance).gameObject.GetComponent<Character>();
				if (Undead.HaveStatusEffect(component, "BDRStatusEffect"))
				{
					Undead.CharacterHeal(__instance.m_character, UndeadHealthRegen.Value);
				}
			}
			else
			{
				Undead.CharacterHeal(__instance.m_character, UndeadHealthRegen.Value);
			}
		}
	}

	[HarmonyPatch(typeof(Tameable), "Interact")]
	private static class Tameable_Interact_Patch
	{
		private static bool Prefix(Tameable __instance, Humanoid user, bool hold, bool alt, ref bool __result, ref bool __runOriginal)
		{
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			if (PluginEnable.Value && (Object)(object)__instance != (Object)null && __instance.m_nview.IsValid() && Undead.IsTamedUndead(__instance))
			{
				if (Time.time - __instance.m_lastPetTime > 1f)
				{
					__instance.m_lastPetTime = Time.time;
					__instance.m_petEffect.Create(((Component)__instance).transform.position, ((Component)__instance).transform.rotation, (Transform)null, 1f, -1);
					__instance.Command(user, true);
				}
				__runOriginal = false;
				__result = false;
				return false;
			}
			__runOriginal = true;
			return true;
		}
	}

	[HarmonyPatch(typeof(Tameable), "UnsummonMaxInstances")]
	private static class Tameable_UnsummonMaxInstances_Patch
	{
		private static void Prefix(Tameable __instance, ref int maxInstances)
		{
			if (PluginEnable.Value && !((Object)(object)__instance == (Object)null) && __instance.m_nview.IsValid() && __instance.m_nview.IsOwner() && !(((Object)__instance).name != Undead.ObjectName_Vanilla))
			{
				GameObject followTarget = __instance.m_monsterAI.GetFollowTarget();
				if ((Object)(object)Undead.UndeadSpawnOwner != (Object)null && (Object)(object)Undead.UndeadSpawnOwner == (Object)(object)followTarget)
				{
					ModifyMaxSummon(ref maxInstances);
				}
				else if (Undead.IsTamedUndead(__instance))
				{
					ModifyMaxSummon(ref maxInstances);
				}
			}
			static void ModifyMaxSummon(ref int maxinstances)
			{
				if (!MaxSummonStaffLevel.Value)
				{
					maxinstances = Undead.UndeadMaxSummon;
				}
				else
				{
					maxinstances += 2;
					if (maxinstances > Undead.UndeadMaxSummon)
					{
						maxinstances = Undead.UndeadMaxSummon;
					}
				}
			}
		}
	}

	[HarmonyPatch(typeof(Tameable), "GetHoverText")]
	private static class Tameable_GetHoverText_Patch
	{
		private static void Postfix(Tameable __instance, ref string __result)
		{
			if (!PluginEnable.Value || (Object)(object)__instance == (Object)null || !__instance.m_nview.IsValid() || !Undead.IsTamedUndead(__instance))
			{
				return;
			}
			bool flag = Undead.IsHoldingUndead(((Component)Player.m_localPlayer).gameObject, EnabledTweakVanilla.Value);
			string text = "";
			GameObject followTarget = __instance.m_monsterAI.GetFollowTarget();
			if ((Object)(object)followTarget != (Object)null)
			{
				Player component = followTarget.GetComponent<Player>();
				if ((Object)(object)component != (Object)null)
				{
					text = component.GetPlayerName();
				}
			}
			string text2 = ((!(text == "")) ? Localization.instance.Localize("Following <color=green>" + text + "</color>\n[<color=yellow><b>$KEY_Use</b></color>] Commands") : Localization.instance.Localize("<color=#858585>Roaming</color>\n[<color=yellow><b>$KEY_Use</b></color>] Commands"));
			string text3 = ((ZInput.IsNonClassicFunctionality() && ZInput.IsGamepadActive()) ? ((!flag || !KeyTextEnabled.Value) ? text2 : SetupText(text2)) : ((!flag || !KeyTextEnabled.Value) ? text2 : SetupText(text2)));
			__result = text3;
			static string SetupText(string input)
			{
				//IL_0010: 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)
				//IL_0042: Unknown result type (might be due to invalid IL or missing references)
				//IL_005b: Unknown result type (might be due to invalid IL or missing references)
				return input + Localization.instance.Localize($"\n[<color=yellow><b> {ConfigTeleport.Value} </b></color>] Teleport" + $"\n[<color=yellow><b> {ConfigSelection.Value} </b></color>] Selection" + $"\n[<color=yellow><b> {ConfigCurse.Value} </b></color>] Curse" + $"\n[<color=yellow><b> {ConfigUnsummon.Value} </b></color>] Unsummon");
			}
		}
	}

	[HarmonyPatch(typeof(Character), "OnCollisionStay")]
	private static class Character_OnCollisionStay_Patch
	{
		private static void Postfix(Character __instance, Collision collision)
		{
			if (PluginEnable.Value && (Object)(object)__instance != (Object)null && collision != null)
			{
				Character component = collision.gameObject.GetComponent<Character>();
				if ((Object)(object)component != (Object)null && ((Object)component).name == Undead.ObjectName_Vanilla && ((Object)__instance).name == Undead.ObjectName_Player)
				{
					Physics.IgnoreCollision(collision.collider, ((Component)__instance).gameObject.GetComponent<Collider>());
				}
				else if ((Object)(object)component != (Object)null && ((Object)component).name == Undead.ObjectName_Player && ((Object)__instance).name == Undead.ObjectName_Vanilla)
				{
					Physics.IgnoreCollision(collision.collider, ((Component)__instance).gameObject.GetComponent<Collider>());
				}
				else if (((Object)__instance).name == Undead.ObjectName_Vanilla && (Object)(object)collision.gameObject.GetComponentInParent<Vagon>() != (Object)null)
				{
					Physics.IgnoreCollision(collision.collider, ((Component)__instance).gameObject.GetComponent<Collider>());
				}
			}
		}
	}

	[HarmonyPatch(typeof(Player), "CanMove")]
	private static class Player_CanMove_Patch
	{
		private static void Postfix(Player __instance, ref bool __result)
		{
			if (PluginEnable.Value && !((Object)(object)__instance == (Object)null) && !((Object)(object)__instance != (Object)(object)Player.m_localPlayer))
			{
				__result = Undead.PlayerCanMove;
			}
		}
	}

	[HarmonyPatch(typeof(ItemDrop), "Awake")]
	private static class ItemDrop_Awake_Patch
	{
		private static void Postfix(ItemDrop __instance)
		{
			if (PluginEnable.Value)
			{
				_ = (Object)(object)__instance == (Object)null;
			}
		}
	}

	[HarmonyPatch(typeof(ZNetScene), "Awake")]
	private static class ZNetScene_Awake_Patch
	{
		private static void Postfix(ZNetScene __instance)
		{
			if (!((Object)(object)__instance != (Object)null))
			{
				return;
			}
			UpdatePrefabDB();
			Undead.AnimeLoadedOrbs = Undead.GetAnimationProp(ZNetScene.instance.GetPrefab(Undead.StaffSkeleton_Shield), out Undead.OrbsItems);
			Undead.AnimeLoadedSkull = Undead.GetAnimationProp(ZNetScene.instance.GetPrefab(Undead.StaffSkeleton_Raiser), out Undead.SkullItems);
			for (int i = 0; i < 9; i++)
			{
				if ((Object)(object)Undead.UndeadEquipmentEnum[i] == (Object)null)
				{
					Undead.UndeadEquipmentEnum[i] = ZNetScene.instance.GetPrefab(Undead.UndeadEquipmentName[i]);
				}
			}
			GameObject prefab = ZNetScene.instance.GetPrefab("skeleton_bow2");
			if ((Object)(object)prefab != (Object)null)
			{
				Undead.CachedBowAi = prefab.GetComponent<ItemDrop>();
			}
		}
	}

	public const string PluginGUID = "GsiX.BetterDeathRaiser";

	public const string PluginName = "GsiX Better Death Raiser";

	public const string PluginVersion = "2.1.0";

	public static string PluginNamespace = "BetterDeathRaiser";

	public readonly Harmony harmony = new Harmony("GsiX.BetterDeathRaiser");

	private static ManualLogSource DeLog;

	private static ItemConfig UndeadItemConfig;

	private static GameObject SleectPanel;

	private static ButtonConfig Shortcut_Teleport;

	private static ButtonConfig Shortcut_Selection;

	private static ButtonConfig Shortcut_Curse;

	private static ButtonConfig Shortcut_Unsummon;

	public static ConfigEntry<bool> PluginEnable;

	public static ConfigEntry<float> UndeadHealthRegen;

	public static ConfigEntry<bool> EnableUndeadRegen;

	public static ConfigEntry<bool> UndeadCursedHealOnly;

	public static ConfigEntry<bool> DisableUndeadHungry;

	public static ConfigEntry<bool> MaxSummonStaffLevel;

	public static ConfigEntry<float> UndeadCurseRadius;

	public static ConfigEntry<float> UndeadInstantHealth;

	public static ConfigEntry<bool> EnabledTweakVanilla;

	public static ConfigEntry<float> CostCastHealthVanilla;

	public static ConfigEntry<float> CostCastHealthPerVanilla;

	public static ConfigEntry<float> CostCastStaminaVanilla;

	public static ConfigEntry<float> CostCastEitrVanilla;

	public static ConfigEntry<float> DurabilityCastCostVanilla;

	public static ConfigEntry<bool> EnabledTweakUndead;

	public static ConfigEntry<float> CostCastHealthUndead;

	public static ConfigEntry<float> CostCastHealthPerUndead;

	public static ConfigEntry<float> CostCastStaminaUndead;

	public static ConfigEntry<float> CostCastEitrUndead;

	public static ConfigEntry<float> DurabilityCastCostUndead;

	public static ConfigEntry<bool> EnableHumanRegen;

	public static ConfigEntry<float> HumanHealthRegen;

	public static ConfigEntry<bool> CastCurseCanMove;

	public static ConfigEntry<bool> CastTelepCanMove;

	public static ConfigEntry<string> CraftWorkStation;

	public static ConfigEntry<int> CraftMaxQuality;

	public static ConfigEntry<string> CraftingRequirement1;

	public static ConfigEntry<string> CraftingRequirement2;

	public static ConfigEntry<string> CraftingRequirement3;

	public static ConfigEntry<float> TeleUseInterval;

	public static ConfigEntry<float> CurseUseInterval;

	public static ConfigEntry<float> UnsummonUseInterval;

	public static ConfigEntry<float> RightClickCost;

	public static ConfigEntry<float> CurseEffectDuration;

	public static ConfigEntry<int> StatusEffectConfort;

	public static ConfigEntry<bool> KeysHintEnabled;

	public static ConfigEntry<bool> KeyTextEnabled;

	public static ConfigEntry<KeyboardShortcut> ConfigTeleport;

	public static ConfigEntry<KeyboardShortcut> ConfigSelection;

	public static ConfigEntry<KeyboardShortcut> ConfigCurse;

	public static ConfigEntry<KeyboardShortcut> ConfigUnsummon;

	private static float Buff_TeleUseInterval;

	private static float Buff_CurseUseInterval;

	private static float Buff_UnsummonUseInterval;

	private static Undeads Undead;

	private static readonly Dictionary<string, Texture2D> cachedTextures = new Dictionary<string, Texture2D>();

	public void Awake()
	{
		//IL_0034: 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)
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		//IL_004d: Expected O, but got Unknown
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Expected O, but got Unknown
		//IL_007b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0080: 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_0094: Expected O, but got Unknown
		//IL_0094: Unknown result type (might be due to invalid IL or missing references)
		//IL_009e: Expected O, but got Unknown
		//IL_00c2: 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_00ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_00db: Expected O, but got Unknown
		//IL_00db: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e5: Expected O, but got Unknown
		//IL_0109: Unknown result type (might be due to invalid IL or missing references)
		//IL_010e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0115: Unknown result type (might be due to invalid IL or missing references)
		//IL_0122: Expected O, but got Unknown
		//IL_0122: Unknown result type (might be due to invalid IL or missing references)
		//IL_012c: Expected O, but got Unknown
		//IL_0150: Unknown result type (might be due to invalid IL or missing references)
		//IL_0155: Unknown result type (might be due to invalid IL or missing references)
		//IL_015c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0169: Expected O, but got Unknown
		//IL_0169: Unknown result type (might be due to invalid IL or missing references)
		//IL_0173: Expected O, but got Unknown
		//IL_019b: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a7: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b4: Expected O, but got Unknown
		//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01be: Expected O, but got Unknown
		//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ff: Expected O, but got Unknown
		//IL_01ff: Unknown result type (might be due to invalid IL or missing references)
		//IL_0209: Expected O, but got Unknown
		//IL_0231: Unknown result type (might be due to invalid IL or missing references)
		//IL_0236: Unknown result type (might be due to invalid IL or missing references)
		//IL_023d: Unknown result type (might be due to invalid IL or missing references)
		//IL_024b: Expected O, but got Unknown
		//IL_024b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0255: Expected O, but got Unknown
		//IL_0279: Unknown result type (might be due to invalid IL or missing references)
		//IL_027e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0285: Unknown result type (might be due to invalid IL or missing references)
		//IL_0293: Expected O, but got Unknown
		//IL_0293: Unknown result type (might be due to invalid IL or missing references)
		//IL_029d: Expected O, but got Unknown
		//IL_02c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ca: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_02df: Expected O, but got Unknown
		//IL_02df: Unknown result type (might be due to invalid IL or missing references)
		//IL_02e9: Expected O, but got Unknown
		//IL_0311: Unknown result type (might be due to invalid IL or missing references)
		//IL_0316: Unknown result type (might be due to invalid IL or missing references)
		//IL_031d: Unknown result type (might be due to invalid IL or missing references)
		//IL_032b: Expected O, but got Unknown
		//IL_032b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0335: Expected O, but got Unknown
		//IL_035d: 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_0369: Unknown result type (might be due to invalid IL or missing references)
		//IL_0377: Expected O, but got Unknown
		//IL_0377: Unknown result type (might be due to invalid IL or missing references)
		//IL_0381: Expected O, but got Unknown
		//IL_03a9: Unknown result type (might be due to invalid IL or missing references)
		//IL_03ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_03b5: Unknown result type (might be due to invalid IL or missing references)
		//IL_03c3: Expected O, but got Unknown
		//IL_03c3: Unknown result type (might be due to invalid IL or missing references)
		//IL_03cd: Expected O, but got Unknown
		//IL_03f5: Unknown result type (might be due to invalid IL or missing references)
		//IL_03fa: 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_040f: Expected O, but got Unknown
		//IL_040f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0419: Expected O, but got Unknown
		//IL_043d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0442: Unknown result type (might be due to invalid IL or missing references)
		//IL_0449: Unknown result type (might be due to invalid IL or missing references)
		//IL_0457: Expected O, but got Unknown
		//IL_0457: Unknown result type (might be due to invalid IL or missing references)
		//IL_0461: Expected O, but got Unknown
		//IL_0489: Unknown result type (might be due to invalid IL or missing references)
		//IL_048e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0495: Unknown result type (might be due to invalid IL or missing references)
		//IL_04a3: Expected O, but got Unknown
		//IL_04a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_04ad: Expected O, but got Unknown
		//IL_04d5: Unknown result type (might be due to invalid IL or missing references)
		//IL_04da: Unknown result type (might be due to invalid IL or missing references)
		//IL_04e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_04ef: Expected O, but got Unknown
		//IL_04ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_04f9: Expected O, but got Unknown
		//IL_0521: Unknown result type (might be due to invalid IL or missing references)
		//IL_0526: Unknown result type (might be due to invalid IL or missing references)
		//IL_052d: Unknown result type (might be due to invalid IL or missing references)
		//IL_053b: Expected O, but got Unknown
		//IL_053b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0545: Expected O, but got Unknown
		//IL_056d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0572: Unknown result type (might be due to invalid IL or missing references)
		//IL_0579: Unknown result type (might be due to invalid IL or missing references)
		//IL_0587: Expected O, but got Unknown
		//IL_0587: Unknown result type (might be due to invalid IL or missing references)
		//IL_0591: Expected O, but got Unknown
		//IL_05b9: Unknown result type (might be due to invalid IL or missing references)
		//IL_05be: Unknown result type (might be due to invalid IL or missing references)
		//IL_05c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_05d3: Expected O, but got Unknown
		//IL_05d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_05dd: Expected O, but got Unknown
		//IL_0601: Unknown result type (might be due to invalid IL or missing references)
		//IL_0606: Unknown result type (might be due to invalid IL or missing references)
		//IL_060d: Unknown result type (might be due to invalid IL or missing references)
		//IL_061b: Expected O, but got Unknown
		//IL_061b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0625: Expected O, but got Unknown
		//IL_0649: Unknown result type (might be due to invalid IL or missing references)
		//IL_064e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0655: Unknown result type (might be due to invalid IL or missing references)
		//IL_0663: Expected O, but got Unknown
		//IL_0663: Unknown result type (might be due to invalid IL or missing references)
		//IL_066d: Expected O, but got Unknown
		//IL_0691: Unknown result type (might be due to invalid IL or missing references)
		//IL_0696: Unknown result type (might be due to invalid IL or missing references)
		//IL_069d: Unknown result type (might be due to invalid IL or missing references)
		//IL_06ab: Expected O, but got Unknown
		//IL_06ab: Unknown result type (might be due to invalid IL or missing references)
		//IL_06b5: Expected O, but got Unknown
		//IL_06dd: Unknown result type (might be due to invalid IL or missing references)
		//IL_06e2: Unknown result type (might be due to invalid IL or missing references)
		//IL_06e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_06f7: Expected O, but got Unknown
		//IL_06f7: Unknown result type (might be due to invalid IL or missing references)
		//IL_0701: Expected O, but got Unknown
		//IL_0729: Unknown result type (might be due to invalid IL or missing references)
		//IL_072e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0735: Unknown result type (might be due to invalid IL or missing references)
		//IL_0743: Expected O, but got Unknown
		//IL_0743: Unknown result type (might be due to invalid IL or missing references)
		//IL_074d: Expected O, but got Unknown
		//IL_0775: Unknown result type (might be due to invalid IL or missing references)
		//IL_077a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0781: Unknown result type (might be due to invalid IL or missing references)
		//IL_078f: Expected O, but got Unknown
		//IL_078f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0799: Expected O, but got Unknown
		//IL_07c1: Unknown result type (might be due to invalid IL or missing references)
		//IL_07c6: Unknown result type (might be due to invalid IL or missing references)
		//IL_07cd: Unknown result type (might be due to invalid IL or missing references)
		//IL_07db: Expected O, but got Unknown
		//IL_07db: Unknown result type (might be due to invalid IL or missing references)
		//IL_07e5: Expected O, but got Unknown
		//IL_080d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0812: Unknown result type (might be due to invalid IL or missing references)
		//IL_0819: Unknown result type (might be due to invalid IL or missing references)
		//IL_0827: Expected O, but got Unknown
		//IL_0827: Unknown result type (might be due to invalid IL or missing references)
		//IL_0831: Expected O, but got Unknown
		//IL_0855: Unknown result type (might be due to invalid IL or missing references)
		//IL_085a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0861: Unknown result type (might be due to invalid IL or missing references)
		//IL_086f: Expected O, but got Unknown
		//IL_086f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0879: Expected O, but got Unknown
		//IL_08a1: Unknown result type (might be due to invalid IL or missing references)
		//IL_08a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_08ad: Unknown result type (might be due to invalid IL or missing references)
		//IL_08bb: Expected O, but got Unknown
		//IL_08bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_08c5: Expected O, but got Unknown
		//IL_08ed: Unknown result type (might be due to invalid IL or missing references)
		//IL_08f2: Unknown result type (might be due to invalid IL or missing references)
		//IL_08f9: Unknown result type (might be due to invalid IL or missing references)
		//IL_0907: Expected O, but got Unknown
		//IL_0907: Unknown result type (might be due to invalid IL or missing references)
		//IL_0911: Expected O, but got Unknown
		//IL_0939: Unknown result type (might be due to invalid IL or missing references)
		//IL_093e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0945: Unknown result type (might be due to invalid IL or missing references)
		//IL_0953: Expected O, but got Unknown
		//IL_0953: Unknown result type (might be due to invalid IL or missing references)
		//IL_095d: Expected O, but got Unknown
		//IL_0985: Unknown result type (might be due to invalid IL or missing references)
		//IL_098a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0991: Unknown result type (might be due to invalid IL or missing references)
		//IL_099f: Expected O, but got Unknown
		//IL_099f: Unknown result type (might be due to invalid IL or missing references)
		//IL_09a9: Expected O, but got Unknown
		//IL_09d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_09d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_09dd: Unknown result type (might be due to invalid IL or missing references)
		//IL_09eb: Expected O, but got Unknown
		//IL_09eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_09f5: Expected O, but got Unknown
		//IL_0a1a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a1f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a26: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a34: Expected O, but got Unknown
		//IL_0a34: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a3e: Expected O, but got Unknown
		//IL_0a62: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a67: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a6e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a7c: Expected O, but got Unknown
		//IL_0a7c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0a86: Expected O, but got Unknown
		//IL_0aaa: Unknown result type (might be due to invalid IL or missing references)
		//IL_0aaf: Unknown result type (might be due to invalid IL or missing references)
		//IL_0ab6: Unknown result type (might be due to invalid IL or missing references)
		//IL_0ac4: Expected O, but got Unknown
		//IL_0ac4: Unknown result type (might be due to invalid IL or missing references)
		//IL_0ace: Expected O, but got Unknown
		//IL_0aea: Unknown result type (might be due to invalid IL or missing references)
		//IL_0afd: Unknown result type (might be due to invalid IL or missing references)
		//IL_0b02: Unknown result type (might be due to invalid IL or missing references)
		//IL_0b09: Unknown result type (might be due to invalid IL or missing references)
		//IL_0b17: Expected O, but got Unknown
		//IL_0b17: Unknown result type (might be due to invalid IL or missing references)
		//IL_0b21: Expected O, but got Unknown
		//IL_0b3d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0b50: Unknown result type (might be due to invalid IL or missing references)
		//IL_0b55: Unknown result type (might be due to invalid IL or missing references)
		//IL_0b5c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0b6a: Expected O, but got Unknown
		//IL_0b6a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0b74: Expected O, but got Unknown
		//IL_0b90: Unknown result type (might be due to invalid IL or missing references)
		//IL_0ba3: Unknown result type (might be due to invalid IL or missing references)
		//IL_0ba8: Unknown result type (might be due to invalid IL or missing references)
		//IL_0baf: Unknown result type (might be due to invalid IL or missing references)
		//IL_0bbd: Expected O, but got Unknown
		//IL_0bbd: Unknown result type (might be due to invalid IL or missing references)
		//IL_0bc7: Expected O, but got Unknown
		//IL_0be3: Unknown result type (might be due to invalid IL or missing references)
		//IL_0bf6: Unknown result type (might be due to invalid IL or missing references)
		//IL_0bfb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0c02: Unknown result type (might be due to invalid IL or missing references)
		//IL_0c10: Expected O, but got Unknown
		//IL_0c10: Unknown result type (might be due to invalid IL or missing references)
		//IL_0c1a: Expected O, but got Unknown
		DeLog = ((BaseUnityPlugin)this).Logger;
		Undead = new Undeads();
		PluginEnable = ((BaseUnityPlugin)this).Config.Bind<bool>("PLUGIN ENABLED", "PluginEnable", true, new ConfigDescription("Plugin Enabled/Disabled", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 1
		} }));
		EnableUndeadRegen = ((BaseUnityPlugin)this).Config.Bind<bool>("UNDEAD TWEAK", "EnableUndeadRegen", true, new ConfigDescription("Allow undead to regen healt during Cursed", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 2
		} }));
		UndeadCursedHealOnly = ((BaseUnityPlugin)this).Config.Bind<bool>("UNDEAD TWEAK", "UndeadCursedHealOnly", true, new ConfigDescription("If on, undead only heal up when received Cursed buff.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 3
		} }));
		DisableUndeadHungry = ((BaseUnityPlugin)this).Config.Bind<bool>("UNDEAD TWEAK", "DisableUndeadHungry", true, new ConfigDescription("If on, undead never go hungry.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 4
		} }));
		MaxSummonStaffLevel = ((BaseUnityPlugin)this).Config.Bind<bool>("UNDEAD TWEAK", "MaxSummonStaffLevel", true, new ConfigDescription("If on, number of undead can be summon base on Staff upgrade level.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 6
		} }));
		UndeadHealthRegen = ((BaseUnityPlugin)this).Config.Bind<float>("UNDEAD TWEAK", "UndeadRegenHealth", 2f, new ConfigDescription("Undead health healed per sec during Cursed", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 7
		} }));
		UndeadCurseRadius = ((BaseUnityPlugin)this).Config.Bind<float>("UNDEAD TWEAK", "UndeadCurseRadius", 6f, new ConfigDescription("Radius effected to get Cursed buff.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 8
		} }));
		UndeadInstantHealth = ((BaseUnityPlugin)this).Config.Bind<float>("UNDEAD TWEAK", "UndeadInstantHealth", 50f, new ConfigDescription("Non regen instant Health added to player and undead during receiving buff.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 9
		} }));
		EnabledTweakVanilla = ((BaseUnityPlugin)this).Config.Bind<bool>("VANILLA CASTING COST", "EnabledTweakVanilla", false, new ConfigDescription("If true, Vanilla Death Raiser also will be modify.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 10
		} }));
		CostCastHealthVanilla = ((BaseUnityPlugin)this).Config.Bind<float>("VANILLA CASTING COST", "VanillaCastCost_Health", 0f, new ConfigDescription("Value zero Off. Vanilla 0. How much health cost to cast Undead.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 11
		} }));
		CostCastHealthPerVanilla = ((BaseUnityPlugin)this).Config.Bind<float>("VANILLA CASTING COST", "VanillaCastCost_HealthPer", 50f, new ConfigDescription("Value zero Off. Vanilla 50%. How much health percentage cost to cast Undead. Override CostCastHealth", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 12
		} }));
		CostCastStaminaVanilla = ((BaseUnityPlugin)this).Config.Bind<float>("VANILLA CASTING COST", "VanillaCastCost_Stamina", 0f, new ConfigDescription("Value zero Off. Vanilla 0. How much stamina cost to cast Undead.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 13
		} }));
		CostCastEitrVanilla = ((BaseUnityPlugin)this).Config.Bind<float>("VANILLA CASTING COST", "VanillaCastCost_Eitr", 100f, new ConfigDescription("Value zero Off. How much eitr cost to cast Undead.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 14
		} }));
		DurabilityCastCostVanilla = ((BaseUnityPlugin)this).Config.Bind<float>("VANILLA CASTING COST", "VanillaCastCost_Durability", 1f, new ConfigDescription("StaffSkeleton durability cost for each cast.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 15
		} }));
		EnabledTweakUndead = ((BaseUnityPlugin)this).Config.Bind<bool>("UNDEAD CASTING COST", "EnabledTweakUndead", true, new ConfigDescription("If true, Custom Death Raiser can be use ingame.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 16
		} }));
		CostCastHealthUndead = ((BaseUnityPlugin)this).Config.Bind<float>("UNDEAD CASTING COST", "UndeadCastCost_Health", 0f, new ConfigDescription("Value zero Off. Vanilla 0. How much health cost to cast Undead.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 17
		} }));
		CostCastHealthPerUndead = ((BaseUnityPlugin)this).Config.Bind<float>("UNDEAD CASTING COST", "UndeadCastCost_HealthPer", 20f, new ConfigDescription("Value zero Off. Vanilla 50%. How much health percentage cost to cast Undead. Override CostCastHealth", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 18
		} }));
		CostCastStaminaUndead = ((BaseUnityPlugin)this).Config.Bind<float>("UNDEAD CASTING COST", "UndeadCastCost_Stamina", 50f, new ConfigDescription("Value zero Off. Vanilla 0. How much stamina cost to cast Undead.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 19
		} }));
		CostCastEitrUndead = ((BaseUnityPlugin)this).Config.Bind<float>("UNDEAD CASTING COST", "UndeadCastCost_Eitr", 0f, new ConfigDescription("Value zero Off. How much eitr cost to cast Undead.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 20
		} }));
		DurabilityCastCostUndead = ((BaseUnityPlugin)this).Config.Bind<float>("UNDEAD CASTING COST", "UndeadCastCost_Durability", 1f, new ConfigDescription("StaffUndead durability cost for each cast.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 21
		} }));
		EnableHumanRegen = ((BaseUnityPlugin)this).Config.Bind<bool>("HUMAN", "EnableHumanRegen", true, new ConfigDescription("Allow human to regen healt during Cursed", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 22
		} }));
		CastCurseCanMove = ((BaseUnityPlugin)this).Config.Bind<bool>("HUMAN", "MoveDuringTeleportCast", false, new ConfigDescription("Allow player to move during casting teleport", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 23
		} }));
		CastTelepCanMove = ((BaseUnityPlugin)this).Config.Bind<bool>("HUMAN", "MoveDuringCurseCast", false, new ConfigDescription("Allow player to move during casting Cursed", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 24
		} }));
		HumanHealthRegen = ((BaseUnityPlugin)this).Config.Bind<float>("HUMAN", "HumanRegenHealth", 2f, new ConfigDescription("Human health healed per sec during Cursed", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 25
		} }));
		CraftWorkStation = ((BaseUnityPlugin)this).Config.Bind<string>("CRAFTING UNDEAD", "CraftingStation", "workbench", new ConfigDescription("Valid list - workbench, forge, stonecutter, artisanstation, blackforge, magetable", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 26
		} }));
		CraftingRequirement1 = ((BaseUnityPlugin)this).Config.Bind<string>("CRAFTING UNDEAD", "CraftingRequirement1", "TrophyEikthyr|5", new ConfigDescription("Drop Prefab Name | Amount.Empty to disable. https://valheim-modding.github.io/Jotunn/data/objects/item-list.html", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 27
		} }));
		CraftingRequirement2 = ((BaseUnityPlugin)this).Config.Bind<string>("CRAFTING UNDEAD", "CraftingRequirement2", "HardAntler|5", new ConfigDescription("Drop Prefab Name|Amount. Empty to disable. https://valheim-modding.github.io/Jotunn/data/objects/item-list.html", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 28
		} }));
		CraftingRequirement3 = ((BaseUnityPlugin)this).Config.Bind<string>("CRAFTING UNDEAD", "CraftingRequirement3", "AncientSeed|2", new ConfigDescription("Drop Prefab Name|Amount. Empty to disable. https://valheim-modding.github.io/Jotunn/data/objects/item-list.html", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 29
		} }));
		CraftMaxQuality = ((BaseUnityPlugin)this).Config.Bind<int>("CRAFTING UNDEAD", "CraftMaxLevel", 5, new ConfigDescription("Max level StaffUndead can be upgrade. Do not exceed crafting station maximum level.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 30
		} }));
		TeleUseInterval = ((BaseUnityPlugin)this).Config.Bind<float>("OTHER", "TeleUseInterval", 5f, new ConfigDescription("Interval before Teleport can be use again.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 31
		} }));
		CurseUseInterval = ((BaseUnityPlugin)this).Config.Bind<float>("OTHER", "SummonUseInterval", 5f, new ConfigDescription("Interval before Summoning can be use again.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 32
		} }));
		UnsummonUseInterval = ((BaseUnityPlugin)this).Config.Bind<float>("OTHER", "UnsummonUseInterval", 5f, new ConfigDescription("Interval before Unsummon can be use again.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 33
		} }));
		RightClickCost = ((BaseUnityPlugin)this).Config.Bind<float>("OTHER", "RightClickCost", 2f, new ConfigDescription("Durability cost everytime right click used.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 34
		} }));
		CurseEffectDuration = ((BaseUnityPlugin)this).Config.Bind<float>("OTHER", "CurseActiveDuration", 240f, new ConfigDescription("How long Curse status effect remain active.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 35
		} }));
		StatusEffectConfort = ((BaseUnityPlugin)this).Config.Bind<int>("OTHER", "StatusEffectConfort", 10, new ConfigDescription("Comfort stacked during Curse buff active. Set zero to turn off.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = true,
			Order = 36
		} }));
		KeysHintEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("KEY CONFIG", "KeysHintEnabled", true, new ConfigDescription("If true, Shortcut key hint displayed when equipping Staff Undead.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = false,
			Order = 37
		} }));
		KeyTextEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("KEY CONFIG", "KeyTextEnabled", false, new ConfigDescription("If true, Skeleton hover name display button hint.", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = false,
			Order = 38
		} }));
		ConfigTeleport = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("KEY CONFIG", "KeyTeleport", new KeyboardShortcut((KeyCode)116, Array.Empty<KeyCode>()), new ConfigDescription("Teleport", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = false,
			Order = 39
		} }));
		ConfigSelection = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("KEY CONFIG", "KeyUIPanel", new KeyboardShortcut((KeyCode)101, Array.Empty<KeyCode>()), new ConfigDescription("UI Panel Selection", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = false,
			Order = 40
		} }));
		ConfigCurse = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("KEY CONFIG", "KeyCurse", new KeyboardShortcut((KeyCode)104, Array.Empty<KeyCode>()), new ConfigDescription("Cast Curse", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = false,
			Order = 41
		} }));
		ConfigUnsummon = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("KEY CONFIG", "KeyUnsummon", new KeyboardShortcut((KeyCode)107, Array.Empty<KeyCode>()), new ConfigDescription("Unsummon", (AcceptableValueBase)null, new object[1] { (object)new ConfigurationManagerAttributes
		{
			IsAdminOnly = false,
			Order = 42
		} }));
		CreateConfig();
		AddLocalizations();
		UndeadStatusEffects();
		PrefabManager.OnVanillaPrefabsAvailable += CreateStaffUndead;
		harmony.PatchAll();
		EnabledTweakVanilla.SettingChanged += delegate
		{
			UndeadItemConfigChanges(Undead.StaffSRaiser_Localize);
		};
		CostCastHealthVanilla.SettingChanged += delegate
		{
			UndeadItemConfigChanges(Undead.StaffSRaiser_Localize);
		};
		CostCastHealthPerVanilla.SettingChanged += delegate
		{
			UndeadItemConfigChanges(Undead.StaffSRaiser_Localize);
		};
		CostCastStaminaVanilla.SettingChanged += delegate
		{
			UndeadItemConfigChanges(Undead.StaffSRaiser_Localize);
		};
		CostCastEitrVanilla.SettingChanged += delegate
		{
			UndeadItemConfigChanges(Undead.StaffSRaiser_Localize);
		};
		DurabilityCastCostVanilla.SettingChanged += delegate
		{
			UndeadItemConfigChanges(Undead.StaffSRaiser_Localize);
		};
		EnabledTweakUndead.SettingChanged += delegate
		{
			UndeadItemConfigChanges(Undead.StaffUndead_Localize);
		};
		CostCastHealthUndead.SettingChanged += delegate
		{
			UndeadItemConfigChanges(Undead.StaffUndead_Localize);
		};
		CostCastHealthPerUndead.SettingChanged += delegate
		{
			UndeadItemConfigChanges(Undead.StaffUndead_Localize);
		};
		CostCastStaminaUndead.SettingChanged += delegate
		{
			UndeadItemConfigChanges(Undead.StaffUndead_Localize);
		};
		CostCastEitrUndead.SettingChanged += delegate
		{
			UndeadItemConfigChanges(Undead.StaffUndead_Localize);
		};
		DurabilityCastCostUndead.SettingChanged += delegate
		{
			UndeadItemConfigChanges(Undead.StaffUndead_Localize);
		};
		TeleUseInterval.SettingChanged += delegate
		{
			ConfigChanges();
		};
		CurseUseInterval.SettingChanged += delegate
		{
			ConfigChanges();
		};
		UnsummonUseInterval.SettingChanged += delegate
		{
			ConfigChanges();
		};
		SynchronizationManager.OnConfigurationSynchronized += delegate(object obj, ConfigurationSynchronizationEventArgs attr)
		{
			if (attr.InitialSynchronization)
			{
				CraftingRequirementEvent(initial: true);
				ConfigChanges();
				UpdatePrefabDB();
			}
			else
			{
				CraftingRequirementEvent(initial: false);
				ConfigChanges();
				UpdatePrefabDB();
				UndeadItemConfigChanges(Undead.StaffSRaiser_Localize);
				UndeadItemConfigChanges(Undead.StaffUndead_Localize);
			}
		};
	}

	private static void UpdateStaffSkele_Undead(ItemData item)
	{
		if (item == null || ((Object)item.m_dropPrefab).name != Undead.StaffSkeleton_Undead)
		{
			return;
		}
		if (EnabledTweakUndead.Value)
		{
			if (CostCastHealthPerUndead.Value > 0f)
			{
				if (item.m_shared.m_attack.m_attackHealthPercentage != CostCastHealthPerUndead.Value)
				{
					item.m_shared.m_attack.m_attackHealthPercentage = CostCastHealthPerUndead.Value;
					item.m_shared.m_attack.m_attackHealth = 0f;
				}
			}
			else if (item.m_shared.m_attack.m_attackHealth != CostCastHealthUndead.Value)
			{
				item.m_shared.m_attack.m_attackHealthPercentage = 0f;
				item.m_shared.m_attack.m_attackHealth = CostCastHealthUndead.Value;
			}
			if (item.m_shared.m_attack.m_attackStamina != CostCastStaminaUndead.Value)
			{
				item.m_shared.m_attack.m_attackStamina = CostCastStaminaUndead.Value;
			}
			if (item.m_shared.m_attack.m_attackEitr != CostCastEitrUndead.Value)
			{
				item.m_shared.m_attack.m_attackEitr = CostCastEitrUndead.Value;
			}
			if (item.m_shared.m_maxQuality != CraftMaxQuality.Value)
			{
				item.m_shared.m_maxQuality = CraftMaxQuality.Value;
			}
			if (item.m_shared.m_useDurabilityDrain != DurabilityCastCostUndead.Value)
			{
				item.m_shared.m_useDurabilityDrain = DurabilityCastCostUndead.Value;
			}
		}
		else
		{
			item.m_shared.m_attack.m_attackHealthPercentage = 1000f;
			item.m_shared.m_attack.m_attackHealth = 1000f;
			item.m_shared.m_attack.m_attackStamina = 1000f;
			item.m_shared.m_attack.m_attackEitr = 1000f;
			item.m_shared.m_maxQuality = 1;
			item.m_shared.m_useDurabilityDrain = 200f;
		}
	}

	private static void UpdateStaffSkele_Vanilla(ItemData item)
	{
		if (item == null || item.m_shared.m_name != Undead.StaffSRaiser_Localize)
		{
			return;
		}
		if (EnabledTweakVanilla.Value)
		{
			if (CostCastHealthPerVanilla.Value > 0f)
			{
				if (item.m_shared.m_attack.m_attackHealthPercentage != CostCastHealthPerVanilla.Value)
				{
					item.m_shared.m_attack.m_attackHealthPercentage = CostCastHealthPerVanilla.Value;
					item.m_shared.m_attack.m_attackHealth = 0f;
				}
			}
			else if (item.m_shared.m_attack.m_attackHealth != CostCastHealthVanilla.Value)
			{
				item.m_shared.m_attack.m_attackHealthPercentage = 0f;
				item.m_shared.m_attack.m_attackHealth = CostCastHealthVanilla.Value;
			}
			if (item.m_shared.m_attack.m_attackStamina != CostCastStaminaVanilla.Value)
			{
				item.m_shared.m_attack.m_attackStamina = CostCastStaminaVanilla.Value;
			}
			if (item.m_shared.m_attack.m_attackEitr != CostCastEitrVanilla.Value)
			{
				item.m_shared.m_attack.m_attackEitr = CostCastEitrVanilla.Value;
			}
			if (item.m_shared.m_maxQuality != CraftMaxQuality.Value)
			{
				item.m_shared.m_maxQuality = CraftMaxQuality.Value;
			}
			if (item.m_shared.m_useDurabilityDrain != DurabilityCastCostVanilla.Value)
			{
				item.m_shared.m_useDurabilityDrain = DurabilityCastCostVanilla.Value;
			}
		}
		else
		{
			item.m_shared.m_attack.m_attackHealthPercentage = 50f;
			item.m_shared.m_attack.m_attackHealth = 0f;
			item.m_shared.m_attack.m_attackStamina = 0f;
			item.m_shared.m_attack.m_attackEitr = 100f;
			item.m_shared.m_maxQuality = 3;
			item.m_shared.m_useDurabilityDrain = 1f;
		}
	}

	private static bool GetRequirement(string value, ref string[] require, ref int amount)
	{
		string text = value.Replace(" ", "");
		require = text.Split(new char[1] { '|' });
		if (require.Length < 2)
		{
			ELog("***** Vertical Bar \"|\" Error *****");
			return false;
		}
		amount = Convert.ToInt32(require[1].Replace(" ", ""));
		if (amount == 0)
		{
			ELog("***** " + require[0] + " amount result with error *****");
			return false;
		}
		return true;
	}

	private static void CraftingRequirementEvent(bool initial)
	{
		bool flag = false;
		if ((Object)(object)Undead.PrefabUndead != (Object)null)
		{
			ItemDrop component = Undead.PrefabUndead.GetComponent<ItemDrop>();
			if ((Object)(object)component != (Object)null)
			{
				Recipe recipe = ObjectDB.instance.GetRecipe(component.m_itemData);
				if ((Object)(object)recipe != (Object)null)
				{
					string workStationName = Undead.GetWorkStationName(CraftWorkStation.Value);
					if (workStationName == "")
					{
						ELog("***** CraftingStation name error *****");
						return;
					}
					CraftingStation val = null;
					GameObject prefab = ZNetScene.instance.GetPrefab(workStationName);
					if ((Object)(object)prefab != (Object)null)
					{
						val = prefab.GetComponent<CraftingStation>();
					}
					Requirement val2 = AddRequirement(CraftingRequirement1.Value);
					Requirement val3 = AddRequirement(CraftingRequirement2.Value);
					Requirement val4 = AddRequirement(CraftingRequirement3.Value);
					if ((Object)(object)val != (Object)null && (val2 != null || val3 != null || val4 != null))
					{
						List<Requirement> list = new List<Requirement>();
						if (val2 != null)
						{
							list.Add(val2);
						}
						if (val3 != null)
						{
							list.Add(val3);
						}
						if (val4 != null)
						{
							list.Add(val4);
						}
						recipe.m_resources = list.ToArray();
						recipe.m_craftingStation = val;
						recipe.m_repairStation = val;
						recipe.m_requireOnlyOneIngredient = false;
						flag = true;
					}
				}
			}
		}
		if (initial)
		{
			if (flag)
			{
				DLog("Server Initial Config sync received success.");
			}
			else
			{
				DLog("Server Initial Config sync received failed.");
			}
		}
		else if (flag)
		{
			DLog("Server Config sync changes received success.");
		}
		else
		{
			DLog("Server Config sync changes received failed.");
		}
		static Requirement AddRequirement(string config)
		{
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Expected O, but got Unknown
			if (config.Length > 3)
			{
				string[] require = new string[0];
				int amount = 0;
				if (!GetRequirement(config, ref require, ref amount))
				{
					ELog("***** Get requirement from config error *****");
					return null;
				}
				GameObject prefab2 = ZNetScene.instance.GetPrefab(require[0]);
				if ((Object)(object)prefab2 != (Object)null)
				{
					ItemDrop component2 = prefab2.GetComponent<ItemDrop>();
					if ((Object)(object)component2 != (Object)null)
					{
						return new Requirement
						{
							m_resItem = component2,
							m_amount = amount,
							m_extraAmountOnlyOneIngredient = 0,
							m_amountPerLevel = amount,
							m_recover = true
						};
					}
				}
			}
			else
			{
				DLog("***** Empty Config Requirement *****");
			}
			return null;
		}
	}

	private static void UpdatePrefabDB()
	{
		Undead.PrefabUndead = ZNetScene.instance.GetPrefab(Undead.StaffSkeleton_Undead);
		ItemDrop val = default(ItemDrop);
		if ((Object)(object)Undead.PrefabUndead != (Object)null && Undead.PrefabUndead.TryGetComponent<ItemDrop>(ref val))
		{
			UpdateStaffSkele_Undead(val.m_itemData);
			val.m_itemData.m_shared.m_value = 99;
			val.m_itemData.m_shared.m_weight = 5f;
		}
		if (EnabledTweakVanilla.Value)
		{
			Undead.PrefabVanilla = ZNetScene.instance.GetPrefab(Undead.StaffSkeleton_Raiser);
			ItemDrop val2 = default(ItemDrop);
			if ((Object)(object)Undead.PrefabVanilla != (Object)null && Undead.PrefabVanilla.TryGetComponent<ItemDrop>(ref val2))
			{
				UpdateStaffSkele_Vanilla(val2.m_itemData);
				val2.m_itemData.m_shared.m_value = 99;
				val2.m_itemData.m_shared.m_weight = 5f;
			}
		}
	}

	private static void ConfigChanges()
	{
		Buff_TeleUseInterval = TeleUseInterval.Value;
		Buff_CurseUseInterval = CurseUseInterval.Value;
		Buff_UnsummonUseInterval = UnsummonUseInterval.Value;
		if (Buff_TeleUseInterval < Undead.TeleportAnimationDelay + 0.1f)
		{
			Buff_TeleUseInterval = Undead.TeleportAnimationDelay + 0.1f;
		}
		if (Buff_CurseUseInterval < Undead.CurseAnimationDelay + 0.1f)
		{
			Buff_CurseUseInterval = Undead.CurseAnimationDelay + 0.1f;
		}
		if (Buff_UnsummonUseInterval < Undead.UnsummonAnimationDelay + 0.1f)
		{
			Buff_UnsummonUseInterval = Undead.UnsummonAnimationDelay + 0.1f;
		}
	}

	private static void UndeadItemConfigChanges(string m_name)
	{
		if (!((Object)(object)Player.m_localPlayer != (Object)null))
		{
			return;
		}
		Humanoid component = ((Component)Player.m_localPlayer).GetComponent<Humanoid>();
		if (!((Object)(object)component != (Object)null))
		{
			return;
		}
		Inventory inventory = component.GetInventory();
		if (inventory == null)
		{
			return;
		}
		List<ItemData> list = new List<ItemData>();
		inventory.GetAllItems(m_name, list);
		if (list.Count <= 0)
		{
			return;
		}
		foreach (ItemData item in list)
		{
			if (m_name == Undead.StaffUndead_Localize)
			{
				UpdateStaffSkele_Undead(item);
				Debug.Log((object)"============================= UpdateStaffSkele_Undead");
			}
			else
			{
				UpdateStaffSkele_Vanilla(item);
				Debug.Log((object)"============================= UpdateStaffSkele_Vanilla");
			}
		}
	}

	private static void DLog(string text, bool isError = false)
	{
		if (isError)
		{
			DeLog.LogError((object)text);
		}
		else
		{
			DeLog.LogMessage((object)text);
		}
	}

	private static void ELog(string text)
	{
		DeLog.LogError((object)text);
	}

	public void OnDestroy()
	{
		harmony.UnpatchSelf();
	}

	private void CreateConfig()
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		//IL_0005: 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_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_002b: Expected O, but got Unknown
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0044: Unknown result type (might be due to invalid IL or missing references)
		//IL_004f: 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_006a: Expected O, but got Unknown
		//IL_007e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0083: 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)
		//IL_0099: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a9: Expected O, but got Unknown
		//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cd: 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_00e8: Expected O, but got Unknown
		//IL_0101: Unknown result type (might be due to invalid IL or missing references)
		//IL_0106: Unknown result type (might be due to invalid IL or missing references)
		//IL_0127: Unknown result type (might be due to invalid IL or missing references)
		//IL_012c: Unknown result type (might be due to invalid IL or missing references)
		//IL_014d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0152: Unknown result type (might be due to invalid IL or missing references)
		//IL_0173: Unknown result type (might be due to invalid IL or missing references)
		//IL_0178: Unknown result type (might be due to invalid IL or missing references)
		//IL_0194: Unknown result type (might be due to invalid IL or missing references)
		//IL_019b: Expected O, but got Unknown
		//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e1: Expected O, but got Unknown
		//IL_01e3: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e8: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_0200: Expected O, but got Unknown
		//IL_0202: Unknown result type (might be due to invalid IL or missing references)
		//IL_0207: Unknown result type (might be due to invalid IL or missing references)
		//IL_020e: Unknown result type (might be due to invalid IL or missing references)
		//IL_021f: Expected O, but got Unknown
		//IL_0221: Unknown result type (might be due to invalid IL or missing references)
		//IL_0226: Unknown result type (might be due to invalid IL or missing references)
		//IL_022d: Unknown result type (might be due to invalid IL or missing references)
		//IL_023e: Expected O, but got Unknown
		//IL_0240: Unknown result type (might be due to invalid IL or missing references)
		//IL_0245: Unknown result type (might be due to invalid IL or missing references)
		//IL_024c: Unknown result type (might be due to invalid IL or missing references)
		//IL_025d: Expected O, but got Unknown
		Shortcut_Teleport = new ButtonConfig
		{
			Name = "Teleport",
			HintToken = "$Hint_Teleoprt",
			ShortcutConfig = ConfigTeleport
		};
		InputManager.Instance.AddButton("GsiX.BetterDeathRaiser", Shortcut_Teleport);
		Shortcut_Selection = new ButtonConfig
		{
			Name = "Selection",
			HintToken = "$Hint_Selection",
			ShortcutConfig = ConfigSelection
		};
		InputManager.Instance.AddButton("GsiX.BetterDeathRaiser", Shortcut_Selection);
		Shortcut_Curse = new ButtonConfig
		{
			Name = "Cursed",
			HintToken = "$Hint_Curse",
			ShortcutConfig = ConfigCurse
		};
		InputManager.Instance.AddButton("GsiX.BetterDeathRaiser", Shortcut_Curse);
		Shortcut_Unsummon = new ButtonConfig
		{
			Name = "Unsummon",
			HintToken = "$Hint_Unsummon",
			ShortcutConfig = ConfigUnsummon
		};
		InputManager.Instance.AddButton("GsiX.BetterDeathRaiser", Shortcut_Unsummon);
		KeyboardShortcut value = ConfigTeleport.Value;
		string text = ((object)(KeyboardShortcut)(ref value)).ToString();
		text = "Mouse-2 + " + text;
		value = ConfigSelection.Value;
		string text2 = ((object)(KeyboardShortcut)(ref value)).ToString();
		text2 = "Mouse-2 + " + text2;
		value = ConfigCurse.Value;
		string text3 = ((object)(KeyboardShortcut)(ref value)).ToString();
		text3 = "Mouse-2 + " + text3;
		value = ConfigUnsummon.Value;
		string text4 = ((object)(KeyboardShortcut)(ref value)).ToString();
		text4 = "Mouse-2 + " + text4;
		KeyHintConfig val = new KeyHintConfig();
		val.Item = Undead.StaffSkeleton_Undead;
		if (KeysHintEnabled.Value)
		{
			val.ButtonConfigs = (ButtonConfig[])(object)new ButtonConfig[5]
			{
				new ButtonConfig
				{
					Name = "Mouse-1",
					HintToken = "$Hint_Primary"
				},
				new ButtonConfig
				{
					Name = text,
					HintToken = Shortcut_Teleport.HintToken
				},
				new ButtonConfig
				{
					Name = text2,
					HintToken = Shortcut_Selection.HintToken
				},
				new ButtonConfig
				{
					Name = text3,
					HintToken = Shortcut_Curse.HintToken
				},
				new ButtonConfig
				{
					Name = text4,
					HintToken = Shortcut_Unsummon.HintToken
				}
			};
		}
		KeyHintManager.Instance.AddKeyHint(val);
	}

	private void AddLocalizations()
	{
		CustomLocalization localization = LocalizationManager.Instance.GetLocalization();
		string text = "English";
		localization.AddTranslation(ref text, new Dictionary<string, string>
		{
			{ "bdrstateffect_fffectname", "Cursed" },
			{ "item_StaffUndead", "Staff Undead" },
			{ "item_StaffUndead_desc", "Undead Necromancer Raiser" },
			{ "Hint_Primary", "Summon" },
			{ "Hint_Teleoprt", "Teleport" },
			{ "Hint_Selection", "Selection" },
			{ "Hint_Curse", "Curse" },
			{ "Hint_Unsummon", "Unsummon" }
		});
	}

	private void UndeadStatusEffects()
	{
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_006a: Unknown result type (might be due to invalid IL or missing references)
		//IL_006f: 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_00dd: Expected O, but got Unknown
		SE_Stats val = ScriptableObject.CreateInstance<SE_Stats>();
		((Object)val).name = "BDRStatusEffect";
		((StatusEffect)val).m_name = "$bdrstateffect_fffectname";
		Texture2D val2 = LoadTexture(PluginNamespace, "BetterDeathRaiser_effect.png");
		((StatusEffect)val).m_icon = Sprite.Create(val2, new Rect(0f, 0f, (float)((Texture)val2).width, (float)((Texture)val2).height), Vector2.zero);
		val.m_jumpModifier = new Vector3(0.3f, 0.3f, 0.3f);
		val.m_speedModifier = 0.2f;
		val.m_jumpStaminaUseModifier = -0.7f;
		val.m_runStaminaDrainModifier = -0.7f;
		val.m_staminaRegenMultiplier = 3f;
		val.m_fallDamageModifier = -0.5f;
		val.m_addMaxCarryWeight = 550f;
		val.m_eitrRegenMultiplier = 11f;
		val.m_stealthModifier = 2f;
		Undead.UndeadSEEffect = new CustomStatusEffect((StatusEffect)(object)val, false);
		Undead.UndeadSEEffect.StatusEffect.m_ttl = CurseEffectDuration.Value;
		ItemManager.Instance.AddStatusEffect(Undead.UndeadSEEffect);
	}

	private void CreateStaffUndead()
	{
		//IL_0067: Unknown result type (might be due to invalid IL or missing references)
		//IL_006c: 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_008e: Expected O, but got Unknown
		//IL_0132: Unknown result type (might be due to invalid IL or missing references)
		//IL_013c: Expected O, but got Unknown
		//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d8: Expected O, but got Unknown
		//IL_0170: Unknown result type (might be due to invalid IL or missing references)
		//IL_017a: Expected O, but got Unknown
		//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b8: Expected O, but got Unknown
		string workStationName = Undead.GetWorkStationName(CraftWorkStation.Value);
		if (workStationName == "")
		{
			PrefabManager.OnVanillaPrefabsAvailable -= CreateStaffUndead;
			ELog("***** CraftingStation name error *****");
			return;
		}
		Texture2D val = LoadTexture(PluginNamespace, "BetterDeathRaiser_icon.png");
		Sprite val2 = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), Vector2.zero);
		Texture2D styleTex = LoadTexture(PluginNamespace, "BetterDeathRaiser_texture.png");
		ItemConfig val3 = new ItemConfig();
		val3.Name = Undead.StaffUndead_Localize;
		val3.Description = "$item_StaffUndead_desc";
		val3.Icons = (Sprite[])(object)new Sprite[1] { val2 };
		val3.StyleTex = styleTex;
		val3.Amount = 1;
		val3.MinStationLevel = 1;
		val3.QualityResultAmountMultiplier = 2;
		val3.CraftingStation = workStationName;
		val3.RepairStation = workStationName;
		UndeadItemConfig = val3;
		string[] require = new string[0];
		int amount = 0;
		if (CraftingRequirement1.Value.Length > 3 && GetRequirement(CraftingRequirement1.Value, ref require, ref amount))
		{
			UndeadItemConfig.AddRequirement(new RequirementConfig(require[0], amount, 1, true));
		}
		if (CraftingRequirement2.Value.Length > 3 && GetRequirement(CraftingRequirement2.Value, ref require, ref amount))
		{
			UndeadItemConfig.AddRequirement(new RequirementConfig(require[0], amount, 1, true));
		}
		if (CraftingRequirement3.Value.Length > 3 && GetRequirement(CraftingRequirement3.Value, ref require, ref amount))
		{
			UndeadItemConfig.AddRequirement(new RequirementConfig(require[0], amount, 1, true));
		}
		CustomItem val4 = new CustomItem(Undead.StaffSkeleton_Undead, Undead.StaffSkeleton_Raiser, UndeadItemConfig);
		ItemManager.Instance.AddItem(val4);
		PrefabManager.OnVanillaPrefabsAvailable -= CreateStaffUndead;
	}

	private static Texture2D LoadTexture(string pluginNameSpace, string fileName)
	{
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Expected O, but got Unknown
		//IL_0059: Expected O, but got Unknown
		Texture2D val;
		if (cachedTextures.ContainsKey(fileName))
		{
			val = cachedTextures[fileName];
		}
		else
		{
			Stream? manifestResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(pluginNameSpace + ".Package.Assets." + fileName);
			byte[] array = new byte[manifestResourceStream.Length];
			manifestResourceStream.Read(array, 0, array.Length);
			Texture2D val2 = new Texture2D(0, 0);
			ImageConversion.LoadImage(val2, array);
			val = val2;
			cachedTextures.Add(fileName, val);
		}
		return val;
	}

	private static void UndeadTeleport()
	{
		Player localPlayer = Player.m_localPlayer;
		if (!Undead.IsHoldingUndead(((Component)localPlayer).gameObject, EnabledTweakVanilla.Value))
		{
			return;
		}
		if (Time.time - Undead.TeleUseStart < Buff_TeleUseInterval)
		{
			Undead.PrintCenterMessage(((Component)localPlayer).gameObject, "Undead Teleport Cooldown");
			return;
		}
		Humanoid component = ((Component)localPlayer).GetComponent<Humanoid>();
		if (!((Object)(object)component != (Object)null))
		{
			return;
		}
		ItemData leftItem = component.m_leftItem;
		ProcessTimeStart(component, leftItem, ref Undead.TeleUseStart, ref Undead.TeleDelayStart, ref Undead.TeleInProgress);
		PlayCharacterAnimation(component, leftItem);
		MonsterAI val = default(MonsterAI);
		foreach (Character allCharacter in Character.GetAllCharacters())
		{
			if (!allCharacter.IsDead() && ((Component)allCharacter).TryGetComponent<MonsterAI>(ref val) && (Object)(object)val.GetFollowTarget() == (Object)(object)((Component)localPlayer).gameObject)
			{
				if (!allCharacter.IsOwner())
				{
					allCharacter.m_nview.ClaimOwnership();
				}
				if (Undead.AnimeLoadedSkull)
				{
					Undead.PlayCastAnimation(((Component)allCharacter).gameObject, Undead.SkullItems);
					UpdateWeaponDurability(leftItem);
				}
			}
		}
	}

	private static void UndeadCurse()
	{
		Player localPlayer = Player.m_localPlayer;
		if (!Undead.IsHoldingUndead(((Component)localPlayer).gameObject, EnabledTweakVanilla.Value))
		{
			return;
		}
		if (Time.time - Undead.CurseUseStart < Buff_CurseUseInterval)
		{
			Undead.PrintCenterMessage(((Component)localPlayer).gameObject, "Undead Curse Cooldown");
			return;
		}
		Humanoid component = ((Component)localPlayer).GetComponent<Humanoid>();
		if ((Object)(object)component != (Object)null)
		{
			ItemData leftItem = component.m_leftItem;
			ProcessTimeStart(component, leftItem, ref Undead.CurseUseStart, ref Undead.CurseDelayStart, ref Undead.CurseInProgress);
			PlayCharacterAnimation(component, leftItem);
			if (Undead.AnimeLoadedOrbs)
			{
				Undead.PlayCastAnimation(((Component)component).gameObject, Undead.OrbsItems);
				UpdateWeaponDurability(leftItem);
			}
		}
	}

	private static void UndeadUnsummon()
	{
		Player localPlayer = Player.m_localPlayer;
		if (!Undead.IsHoldingUndead(((Component)localPlayer).gameObject, EnabledTweakVanilla.Value))
		{
			return;
		}
		if (Time.time - Undead.UnsummonUseStart < Buff_UnsummonUseInterval)
		{
			Undead.PrintCenterMessage(((Component)localPlayer).gameObject, "Undead Unsummon Cooldown");
			return;
		}
		Humanoid component = ((Component)localPlayer).GetComponent<Humanoid>();
		if ((Object)(object)component != (Object)null)
		{
			ItemData leftItem = component.m_leftItem;
			ProcessTimeStart(component, leftItem, ref Undead.UnsummonUseStart, ref Undead.UnsummonDelayStart, ref Undead.UnsummonProgress);
			PlayCharacterAnimation(component, leftItem);
			UpdateWeaponDurability(leftItem);
		}
	}

	private static void ProcessTimeStart(Humanoid human, ItemData leftitem, ref float usestart, ref float delaystart, ref bool progress)
	{
		usestart = Time.time;
		delaystart = Time.time;
		leftitem.m_lastAttackTime = Time.time;
		leftitem.m_durability -= RightClickCost.Value;
		human.m_lastCombatTimer = 0f;
		progress = true;
		Undead.PlayerCanMove = false;
	}

	private static void PlayCharacterAnimation(Humanoid human, ItemData leftitem)
	{
		if (Undead.AnimeLoadedSkull)
		{
			Undead.CastIsInAnimation = true;
			human.UnequipItem(leftitem, false);
			if (human.EquipItem(leftitem, false))
			{
				((Character)human).m_zanim.SetTrigger(Undead.SkullItems.m_itemData.m_shared.m_attack.m_attackAnimation);
				Undead.PlayCastAnimation(((Component)human).gameObject, Undead.SkullItems);
			}
			Undead.CastIsInAnimation = false;
		}
	}

	private static void UpdateWeaponDurability(ItemData weapon)
	{
		weapon.m_durability -= weapon.m_shared.m_useDurabilityDrain;
		if (weapon.m_durability < 0f)
		{
			weapon.m_durability = 0f;
		}
	}

	private static void TogglePanel()
	{
		//IL_0053: Unknown result type (might be due to invalid IL or missing references)
		//IL_0062: Unknown result type (might be due to invalid IL or missing references)
		//IL_0071: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
		//IL_012d: Unknown result type (might be due to invalid IL or missing references)
		//IL_013c: 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_0161: Unknown result type (might be due to invalid IL or missing references)
		//IL_0167: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c5: Expected O, but got Unknown
		//IL_01e3: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ed: Expected O, but got Unknown
		//IL_020b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0215: Expected O, but got Unknown
		//IL_0233: Unknown result type (might be due to invalid IL or missing references)
		//IL_023d: Expected O, but got Unknown
		//IL_025b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0265: Expected O, but got Unknown
		//IL_0283: Unknown result type (might be due to invalid IL or missing references)
		//IL_028d: Expected O, but got Unknown
		if (!Object.op_Implicit((Object)(object)SleectPanel))
		{
			if (GUIManager.Instance == null)
			{
				DLog("GUIManager instance is null", isError: true);
				return;
			}
			if (!Object.op_Implicit((Object)(object)GUIManager.CustomGUIFront))
			{
				DLog("GUIManager CustomGUI is null", isError: true);
				return;
			}
			SleectPanel = GUIManager.Instance.CreateWoodpanel(GUIManager.CustomGUIFront.transform, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0f, 0f), 850f, 400f, false);
			SleectPanel.SetActive(false);
			SleectPanel.AddComponent<DragWindowCntrl>();
			GUIManager.Instance.CreateText("UNDEAD SELECTION", SleectPanel.transform, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(80f, -60f), GUIManager.Instance.AveriaSerifBold, 30, GUIManager.Instance.ValheimOrange, true, Color.black, 450f, 40f, false);
			GUIManager.Instance.CreateText("UNDEAD CAST", SleectPanel.transform, new Vector2(0.5f, 1f), new Vector2(0.5f, 1f), new Vector2(130f, -260f), GUIManager.Instance.AveriaSerifBold, 30, GUIManager.Instance.ValheimOrange, true, Color.black, 450f, 40f, false);
			float posX2 = -250f;
			float posX3 = 0f;
			float posX4 = 250f;
			float posY2 = 80f;
			float posY3 = -120f;
			((UnityEvent)CreateButton("UNDEAD ARCHER", posX2, posY2).GetComponent<Button>().onClick).AddListener(new UnityAction(SetType_Archer));
			((UnityEvent)CreateButton("UNDEAD WARRIOR", posX3, posY2).GetComponent<Button>().onClick).AddListener(new UnityAction(SetType_Warrior));
			((UnityEvent)CreateButton("UNDEAD BRUTE", posX4, posY2).GetComponent<Button>().onClick).AddListener(new UnityAction(SetType_Brute));
			((UnityEvent)CreateButton("UNDEAD CURSE", posX2, posY3).GetComponent<Button>().onClick).AddListener(new UnityAction(SetType_Curse));
			((UnityEvent)CreateButton("UNDEAD TELEPORT", posX3, posY3).GetComponent<Button>().onClick).AddListener(new UnityAction(SetType_Teleport));
			((UnityEvent)CreateButton("UNDEAD UNSUMMON", posX4, posY3).GetComponent<Button>().onClick).AddListener(new UnityAction(SetType_Unsummon));
		}
		bool flag = !SleectPanel.activeSelf;
		SleectPanel.SetActive(flag);
		GUIManager.BlockInput(flag);
		static GameObject CreateButton(string name, float posX, float posY)
		{
			//IL_001a: 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)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			GameObject obj = GUIManager.Instance.CreateButton(name, SleectPanel.transform, new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(posX, posY), 200f, 60f);
			obj.SetActive(true);
			return obj;
		}
		static void SetType_Archer()
		{
			Undead.UndeadWeapon = Undeads.Weapon.Bow;
			Undead.PrintCenterMessage(null, Undead.UndeadText[(int)Undead.UndeadWeapon]);
			TogglePanel();
		}
		static void SetType_Brute()
		{
			Undead.UndeadWeapon = Undeads.Weapon.Mace;
			Undead.PrintCenterMessage(null, Undead.UndeadText[(int)Undead.UndeadWeapon]);
			TogglePanel();
		}
		static void SetType_Curse()
		{
			UndeadCurse();
			TogglePanel();
		}
		static void SetType_Teleport()
		{
			UndeadTeleport();
			TogglePanel();
		}
		static void SetType_Unsummon()
		{
			UndeadUnsummon();
			TogglePanel();
		}
		static void SetType_Warrior()
		{
			Undead.UndeadWeapon = Undeads.Weapon.Sword;
			Undead.PrintCenterMessage(null, Undead.UndeadText[(int)Undead.UndeadWeapon]);
			TogglePanel();
		}
	}
}
internal class Undeads
{
	public enum Gears
	{
		Cape,
		Helmet,
		Chest,
		Legs,
		Sword,
		Shield,
		Bow,
		Arrow,
		Mace,
		len
	}

	public enum Weapon
	{
		None,
		Bow,
		Sword,
		Mace
	}

	public readonly string ObjectName_Player = "Player(Clone)";

	public readonly string ObjectName_Vanilla = "Skeleton_Friendly(Clone)";

	public GameObject[] UndeadEquipmentEnum = (GameObject[])(object)new GameObject[9];

	public readonly string[] UndeadEquipmentName = new string[9] { "CapeLox", "HelmetCarapace", "ArmorCarapaceChest", "ArmorCarapaceLegs", "skeleton_sword_hildir", "ShieldCarapace", "BowDraugrFang", "ArrowCarapace", "skeleton_mace" };

	public Weapon UndeadWeapon = Weapon.Bow;

	public Weapon UndeadSpawnWeapon = Weapon.Bow;

	public readonly string[] UndeadText = new string[4] { "Undead None", "Undead Archer", "Undead Warrior", "Undead Brute" };

	public readonly string[] WorkbenchConfig = new string[6] { "workbench", "forge", "stonecutter", "artisanstation", "blackforge", "magetable" };

	public readonly string[] WorkbenchPiece = new string[6] { "piece_workbench", "forge", "piece_stonecutter", "piece_artisanstation", "blackforge", "piece_magetable" };

	public ItemDrop OrbsItems;

	public ItemDrop SkullItems;

	public ItemDrop CachedBowAi;

	public GameObject UndeadSpawnOwner;

	public GameObject PrefabUndead;

	public GameObject PrefabVanilla;

	public CustomStatusEffect UndeadSEEffect;

	public bool AnimeLoadedOrbs;

	public bool AnimeLoadedSkull;

	public readonly string StaffSkeleton_Undead = "StaffUndead";

	public readonly string StaffUndead_Localize = "$item_StaffUndead";

	public readonly string StaffSkeleton_Raiser = "StaffSkeleton";

	public readonly string StaffSRaiser_Localize = "$item_staffskeleton";

	public readonly string StaffSkeleton_Shield = "StaffShield";

	public readonly int UndeadMaxSummon = 8;

	public float MainDelayStart = -1f;

	public Attack MainAttack;

	public bool TeleInProgress;

	public float TeleDelayStart = Time.time;

	public float TeleUseStart = Time.time;

	public readonly float TeleportAnimationDelay = 1f;

	public readonly float WeaponSelectionDelay = 0.2f;

	public float WeaponSelectionStart = Time.time;

	public float PlayerHealInterval = Time.time;

	public bool CurseInProgress;

	public float CurseDelayStart = Time.time;

	public float CurseUseStart = Time.time;

	public readonly float CurseAnimationDelay = 2f;

	public bool UnsummonProgress;

	public float UnsummonDelayStart = Time.time;

	public float UnsummonUseStart = Time.time;

	public readonly float UnsummonAnimationDelay = 2f;

	public bool CastIsInAnimation;

	public bool PlayerCanMove = true;

	public string GetWorkStationName(string configVal)
	{
		for (int i = 0; i < WorkbenchConfig.Length; i++)
		{
			if (WorkbenchConfig[i] == configVal)
			{
				return WorkbenchPiece[i];
			}
		}
		return "";
	}

	public bool IsTamedUndead(Tameable tameable)
	{
		if (((Object)tameable).name == ObjectName_Vanilla)
		{
			return GetUndeadWeaponType(tameable) != Weapon.None;
		}
		return false;
	}

	public bool GetAnimationProp(GameObject type, out ItemDrop item)
	{
		if ((Object)(object)type == (Object)null)
		{
			Print("GetAnimationProp", "obj null");
			item = null;
			return false;
		}
		item = type.GetComponent<ItemDrop>();
		if ((Object)(object)item == (Object)null)
		{
			Print("GetAnimationProp", "item null");
			item = null;
			return false;
		}
		return true;
	}

	public void PlayCastAnimation(GameObject obj, ItemDrop item)
	{
		//IL_0035: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		//IL_0072: 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)
		if ((Object)(object)obj != (Object)null)
		{
			Character component = obj.GetComponent<Character>();
			if ((Object)(object)component != (Object)null)
			{
				item.m_itemData.m_shared.m_startEffect.Create(((Component)component).transform.position, ((Component)component).transform.rotation, ((Component)component).transform, 1f, -1);
				item.m_itemData.m_shared.m_attack.m_startEffect.Create(((Component)component).transform.position, ((Component)component).transform.rotation, ((Component)component).transform, 1f, -1);
				component.AddNoise(0f);
			}
		}
	}

	public bool IsHoldingUndead(GameObject player, bool allowvanilla)
	{
		Humanoid component = player.GetComponent<Humanoid>();
		if ((Object)(object)component == (Object)null || component.m_leftItem == null)
		{
			return false;
		}
		if (!allowvanilla || !((Object)component.m_leftItem.m_dropPrefab).name.Contains(StaffSkeleton_Raiser))
		{
			return ((Object)component.m_leftItem.m_dropPrefab).name.Contains(StaffSkeleton_Undead);
		}
		return true;
	}

	public void CharacterHeal(Character character, float amount)
	{
		if ((Object)(object)character != (Object)null)
		{
			if (character.GetHealth() + amount < character.GetMaxHealth())
			{
				character.Heal(amount, true);
			}
			else if (character.GetHealth() < character.GetMaxHealth())
			{
				character.SetHealth(character.GetMaxHealth());
			}
		}
	}

	public bool UndeadUpdateInterval(Tameable tameable, bool set = false)
	{
		if (set)
		{
			tameable.m_tamingTime = Time.time;
		}
		else if (Time.time - tameable.m_tamingTime > 1f)
		{
			tameable.m_tamingTime = Time.time;
			return true;
		}
		return false;
	}

	public bool HaveStatusEffect(Character character, string effectname)
	{
		if ((Object)(object)character == (Object)null)
		{
			return false;
		}
		return character.GetSEMan().HaveStatusEffect(effectname);
	}

	public Weapon GetUndeadWeaponType(Tameable tameable)
	{
		string text = tameable.GetText();
		if (text.Contains(UndeadText[1]))
		{
			return Weapon.Bow;
		}
		if (text.Contains(UndeadText[2]))
		{
			return Weapon.Sword;
		}
		if (text.Contains(UndeadText[3]))
		{
			return Weapon.Mace;
		}
		return Weapon.None;
	}

	public void GiveDefaultItem(Humanoid human, GameObject prefab)
	{
		ItemData val = human.PickupPrefab(prefab, 0, false);
		if (val != null)
		{
			if ((Object)(object)CachedBowAi != (Object)null && ((Object)prefab).name == UndeadEquipmentName[6])
			{
				val.m_shared = CachedBowAi.m_itemData.m_shared;
				val.m_shared.m_aiAttackInterval = 0.5f;
				val.m_shared.m_damages.m_poison = 10f;
				val.m_shared.m_damages.m_lightning = 2f;
				val.m_shared.m_damages.m_frost = 2f;
			}
			if (!val.IsWeapon())
			{
				human.EquipItem(val, false);
			}
		}
	}

	public void PrintCenterMessage(GameObject obj, string text)
	{
		GameObject val = obj;
		if ((Object)(object)val == (Object)null)
		{
			val = ((Component)Player.m_localPlayer).gameObject;
		}
		Humanoid component = val.GetComponent<Humanoid>();
		if (component != null)
		{
			((Character)component).Message((MessageType)2, Localization.instance.Localize(text), 0, (Sprite)null);
		}
	}

	public void Print(string args1, string args2)
	{
	}
}