Decompiled source of CustomWands v0.13.0

JujutsuWand.dll

Decompiled 8 hours ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using DungeonGeneration;
using FMOD.Studio;
using FMODUnity;
using HarmonyLib;
using Mirror;
using RootMotion.Dynamics;
using TMPro;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Animations;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
using UnityEngine.InputSystem.Utilities;
using UnityEngine.Playables;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using UnityEngine.VFX;
using Utilities;
using YAPYAP;
using YAPYAP.Npc.CatacombMerchant;
using YAPYAP.Npc.Fairy;
using YAPYAP.Npc.Ghost;
using YAPYAP.Npc.HealFairy;
using YAPYAP.Npc.Jester;
using YAPYAP.Npc.Shopkeeper;
using YAPYAP.Utilities;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: IgnoresAccessChecksTo("Mirror")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public string AssemblyName { get; }

		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
			AssemblyName = assemblyName;
		}
	}
}
namespace JujutsuWand
{
	internal class AnimSpeed : MonoBehaviour
	{
		private Animator anim;

		private float original = 1f;

		private readonly Dictionary<string, float> factors = new Dictionary<string, float>();

		public static void Set(Animator a, string key, float factor)
		{
			if ((Object)(object)a == (Object)null || string.IsNullOrEmpty(key))
			{
				return;
			}
			try
			{
				AnimSpeed animSpeed = ((Component)a).GetComponent<AnimSpeed>();
				if ((Object)(object)animSpeed == (Object)null)
				{
					animSpeed = ((Component)a).gameObject.AddComponent<AnimSpeed>();
					animSpeed.anim = a;
					animSpeed.original = a.speed;
				}
				animSpeed.factors[key] = Mathf.Max(0f, factor);
				animSpeed.Apply();
			}
			catch (Exception)
			{
			}
		}

		public static void Clear(Animator a, string key)
		{
			if ((Object)(object)a == (Object)null)
			{
				return;
			}
			try
			{
				AnimSpeed component = ((Component)a).GetComponent<AnimSpeed>();
				if (!((Object)(object)component == (Object)null) && component.factors.Remove(key))
				{
					if (component.factors.Count == 0)
					{
						component.anim.speed = component.original;
						Object.Destroy((Object)(object)component);
					}
					else
					{
						component.Apply();
					}
				}
			}
			catch (Exception)
			{
			}
		}

		public static void SetAll(Component root, string key, float factor)
		{
			if (!((Object)(object)root == (Object)null))
			{
				Animator[] componentsInChildren = root.GetComponentsInChildren<Animator>(true);
				for (int i = 0; i < componentsInChildren.Length; i++)
				{
					Set(componentsInChildren[i], key, factor);
				}
			}
		}

		public static void ClearAll(Component root, string key)
		{
			if (!((Object)(object)root == (Object)null))
			{
				Animator[] componentsInChildren = root.GetComponentsInChildren<Animator>(true);
				for (int i = 0; i < componentsInChildren.Length; i++)
				{
					Clear(componentsInChildren[i], key);
				}
			}
		}

		private void Apply()
		{
			if ((Object)(object)anim == (Object)null)
			{
				return;
			}
			float num = original;
			foreach (float value in factors.Values)
			{
				num *= value;
			}
			anim.speed = num;
		}

		private void LateUpdate()
		{
			if ((Object)(object)anim == (Object)null)
			{
				Object.Destroy((Object)(object)this);
			}
			else
			{
				Apply();
			}
		}
	}
	internal class SpeedBoost : MonoBehaviour
	{
		private string key;

		private Pawn pawn;

		private ControllerMovementComponent movement;

		private float addWalk;

		private float addSprint;

		private float until;

		private bool applied;

		public static void Apply(Pawn pawn, string key, float multiplier, float duration)
		{
			if ((Object)(object)pawn == (Object)null || multiplier <= 1.001f)
			{
				return;
			}
			SpeedBoost[] components = ((Component)pawn).GetComponents<SpeedBoost>();
			foreach (SpeedBoost speedBoost in components)
			{
				if (!(speedBoost.key != key))
				{
					speedBoost.until = Mathf.Max(speedBoost.until, Time.time + duration);
					return;
				}
			}
			SpeedBoost speedBoost2 = ((Component)pawn).gameObject.AddComponent<SpeedBoost>();
			speedBoost2.key = key;
			speedBoost2.Begin(pawn, multiplier, duration);
		}

		public static void Remove(Pawn pawn, string key)
		{
			if ((Object)(object)pawn == (Object)null)
			{
				return;
			}
			SpeedBoost[] components = ((Component)pawn).GetComponents<SpeedBoost>();
			foreach (SpeedBoost speedBoost in components)
			{
				if (speedBoost.key == key)
				{
					Object.Destroy((Object)(object)speedBoost);
				}
			}
		}

		private void Begin(Pawn pawn, float multiplier, float duration)
		{
			this.pawn = pawn;
			until = Time.time + duration;
			movement = (((Object)(object)pawn.ControllerStateMachine != (Object)null && (Object)(object)pawn.ControllerStateMachine.MoveJumpState != (Object)null) ? pawn.ControllerStateMachine.MoveJumpState.MovementComponent : null);
			if (movement == null || movement._settings == null)
			{
				Plugin.Log.LogWarning((object)"Couldn't find your movement settings to change your speed.");
				Object.Destroy((Object)(object)this);
				return;
			}
			float walkSpeed = movement._settings.walkSpeed;
			float sprintSpeed = movement._settings.sprintSpeed;
			addWalk = walkSpeed * (multiplier - 1f);
			addSprint = (sprintSpeed - walkSpeed) * (multiplier - 1f);
			ControllerMovementComponent obj = movement;
			obj.AdditiveWalkSpeed += addWalk;
			ControllerMovementComponent obj2 = movement;
			obj2.AdditiveSprintSpeed += addSprint;
			if ((Object)(object)pawn.Blackboard != (Object)null && pawn.Blackboard.IsSprinting)
			{
				ControllerMovementComponent obj3 = movement;
				obj3._speed += addSprint;
			}
			applied = true;
		}

		private void Update()
		{
			if (Time.time >= until || (Object)(object)pawn == (Object)null || pawn.IsDead)
			{
				Object.Destroy((Object)(object)this);
			}
		}

		private void OnDestroy()
		{
			if (applied && movement != null)
			{
				ControllerMovementComponent obj = movement;
				obj.AdditiveWalkSpeed -= addWalk;
				ControllerMovementComponent obj2 = movement;
				obj2.AdditiveSprintSpeed -= addSprint;
				if ((Object)(object)pawn != (Object)null && (Object)(object)pawn.Blackboard != (Object)null && pawn.Blackboard.IsSprinting)
				{
					ControllerMovementComponent obj3 = movement;
					obj3._speed -= addSprint;
				}
				applied = false;
			}
		}
	}
	[DefaultExecutionOrder(-900)]
	internal class PawnScaleFx : MonoBehaviour
	{
		private const float BodyHeight = 1.85f;

		private Pawn pawn;

		private float target;

		private float current;

		private float until;

		private bool squeeze;

		private float nextProbe;

		private float fit = 99f;

		private float ragdollScale;

		private float settledSince;

		public static float Of(Pawn pawn)
		{
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			PawnScaleFx pawnScaleFx = (((Object)(object)pawn != (Object)null) ? ((Component)pawn).GetComponent<PawnScaleFx>() : null);
			if (!((Object)(object)pawnScaleFx != (Object)null))
			{
				if (!((Object)(object)pawn != (Object)null))
				{
					return 1f;
				}
				return ((Component)pawn).transform.localScale.y;
			}
			return pawnScaleFx.current;
		}

		public static void Apply(Pawn pawn, float scale, float duration)
		{
			if ((Object)(object)pawn == (Object)null)
			{
				return;
			}
			PawnScaleFx pawnScaleFx = ((Component)pawn).GetComponent<PawnScaleFx>() ?? ((Component)pawn).gameObject.AddComponent<PawnScaleFx>();
			pawnScaleFx.pawn = pawn;
			pawnScaleFx.target = Mathf.Clamp(scale, 0.1f, 4f);
			pawnScaleFx.until = Time.time + duration;
			pawnScaleFx.squeeze = ((NetworkBehaviour)pawn).isLocalPlayer && pawnScaleFx.target > 1.05f;
			pawnScaleFx.current = pawnScaleFx.target;
			pawnScaleFx.ragdollScale = pawnScaleFx.target;
			Set(pawn, pawnScaleFx.target, ragdollToo: true);
			try
			{
				pawn.View.SpawnMagicPoof();
			}
			catch (Exception)
			{
			}
		}

		public static void End(Pawn pawn)
		{
			PawnScaleFx pawnScaleFx = (((Object)(object)pawn != (Object)null) ? ((Component)pawn).GetComponent<PawnScaleFx>() : null);
			if ((Object)(object)pawnScaleFx != (Object)null)
			{
				Object.Destroy((Object)(object)pawnScaleFx);
			}
		}

		private static float Normal(Pawn pawn)
		{
			if (!pawn.IsShrunk)
			{
				return 1f;
			}
			return Mathf.Max(0.1f, pawn.shrunkSize);
		}

		private static void Set(Pawn pawn, float s, bool ragdollToo)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			((Component)pawn).transform.localScale = new Vector3(s, s, s);
			if (!ragdollToo)
			{
				return;
			}
			try
			{
				if ((Object)(object)pawn.View != (Object)null && (Object)(object)pawn.View.PuppetMaster != (Object)null)
				{
					Rigidbody puppetRootRigidbody = pawn.View.PuppetRootRigidbody;
					bool activeSelf = ((Component)puppetRootRigidbody).gameObject.activeSelf;
					if (activeSelf)
					{
						((Component)puppetRootRigidbody).gameObject.SetActive(false);
					}
					((Component)puppetRootRigidbody).transform.localScale = new Vector3(s, s, s);
					if (activeSelf)
					{
						((Component)puppetRootRigidbody).gameObject.SetActive(true);
					}
				}
			}
			catch (Exception ex)
			{
				Plugin.Log.LogWarning((object)("Couldn't resize the player's ragdoll: " + ex.Message));
			}
		}

		private void Update()
		{
			if ((Object)(object)pawn == (Object)null || pawn.IsDead || Time.time >= until)
			{
				Object.Destroy((Object)(object)this);
			}
		}

		private void FixedUpdate()
		{
			if (squeeze && !((Object)(object)pawn == (Object)null))
			{
				if (Time.time >= nextProbe)
				{
					nextProbe = Time.time + 0.1f;
					fit = Probe();
				}
				float num = Mathf.Clamp(fit, 1f, target);
				float num2 = ((num < current) ? 6f : 0.8f);
				float num3 = Mathf.MoveTowards(current, num, num2 * Time.fixedDeltaTime);
				if (Mathf.Abs(num3 - current) > 0.0001f)
				{
					current = num3;
					Set(pawn, current, ragdollToo: false);
					settledSince = Time.time;
				}
				else if (Mathf.Abs(current - ragdollScale) > 0.12f && Time.time - settledSince > 0.3f && !Ragdolled())
				{
					Set(pawn, current, ragdollToo: true);
					ragdollScale = current;
				}
			}
		}

		private bool Ragdolled()
		{
			try
			{
				return (Object)(object)pawn.Blackboard != (Object)null && pawn.Blackboard.IsRagdollMode;
			}
			catch (Exception)
			{
				return true;
			}
		}

		private float Probe()
		{
			//IL_000b: 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_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: 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_006b: 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_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: 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: 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_0136: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0140: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: Unknown result type (might be due to invalid IL or missing references)
			//IL_0168: Unknown result type (might be due to invalid IL or missing references)
			Vector3 position = ((Component)pawn).transform.position;
			Vector3 val = (((Object)(object)pawn.Rigidbody != (Object)null) ? pawn.Rigidbody.linearVelocity : Vector3.zero);
			val.y = 0f;
			Vector3 normalized;
			if (!(((Vector3)(ref val)).sqrMagnitude > 0.25f))
			{
				Vector3 val2 = DomainHelpers.Flat(((Component)pawn).transform.forward);
				normalized = ((Vector3)(ref val2)).normalized;
			}
			else
			{
				normalized = ((Vector3)(ref val)).normalized;
			}
			Vector3 val3 = normalized;
			float num = 99f;
			float reach = 1.85f * target + 0.6f;
			for (int i = 0; i < 4; i++)
			{
				float num2 = Combat.HeadroomAbove(position + val3 * ((float)i * 0.45f * target) + Vector3.up * 0.5f, ((Component)pawn).transform, reach) + 0.5f;
				num = Mathf.Min(num, (num2 - 0.15f) / 1.85f);
			}
			Vector3 val4 = Vector3.Cross(Vector3.up, val3);
			Vector3 val5 = position + val3 * (0.6f * target) + Vector3.up * 0.9f;
			float num3 = Combat.FreeDistance(val5, val4, 1.5f * target, 0.05f, ((Component)pawn).transform);
			float num4 = Combat.FreeDistance(val5, -val4, 1.5f * target, 0.05f, ((Component)pawn).transform);
			float num5 = num3 + num4;
			if (num5 < 1.4f * target)
			{
				num = Mathf.Min(num, (num5 - 0.1f) / 0.7f);
			}
			return num;
		}

		private void OnDestroy()
		{
			if ((Object)(object)pawn == (Object)null)
			{
				return;
			}
			try
			{
				Set(pawn, Normal(pawn), ragdollToo: true);
				pawn.View.SpawnMagicPoof();
			}
			catch (Exception)
			{
			}
		}
	}
	[DefaultExecutionOrder(-500)]
	internal class VoiceFx : MonoBehaviour
	{
		private Pawn pawn;

		private float pitch;

		private float wobble;

		private float until;

		public static void Apply(Pawn pawn, float pitch, float wobble, float duration)
		{
			if (!((Object)(object)pawn == (Object)null))
			{
				VoiceFx obj = ((Component)pawn).GetComponent<VoiceFx>() ?? ((Component)pawn).gameObject.AddComponent<VoiceFx>();
				obj.pawn = pawn;
				obj.pitch = Mathf.Clamp(pitch, -1f, 1f);
				obj.wobble = Mathf.Clamp01(wobble);
				obj.until = Time.time + duration;
			}
		}

		public static void End(Pawn pawn)
		{
			VoiceFx voiceFx = (((Object)(object)pawn != (Object)null) ? ((Component)pawn).GetComponent<VoiceFx>() : null);
			if ((Object)(object)voiceFx != (Object)null)
			{
				Object.Destroy((Object)(object)voiceFx);
			}
		}

		private void Update()
		{
			if ((Object)(object)pawn == (Object)null || pawn.IsDead || Time.time >= until)
			{
				Object.Destroy((Object)(object)this);
			}
			else if (!((Object)(object)pawn.Voice == (Object)null))
			{
				pawn.Voice.SetPitchEffect(pitch);
				if (wobble > 0f)
				{
					pawn.Voice.SetWobbleEffect(wobble);
				}
			}
		}
	}
	internal class ThirdPersonHold : MonoBehaviour
	{
		private readonly Dictionary<string, float> holds = new Dictionary<string, float>();

		private Pawn pawn;

		private bool active;

		private float nextCheck;

		public static void Hold(Pawn pawn, string key, float duration)
		{
			if (!((Object)(object)pawn == (Object)null) && ((NetworkBehaviour)pawn).isLocalPlayer && !((Object)(object)pawn.PawnCamera == (Object)null))
			{
				ThirdPersonHold obj = ((Component)pawn).GetComponent<ThirdPersonHold>() ?? ((Component)pawn).gameObject.AddComponent<ThirdPersonHold>();
				obj.pawn = pawn;
				obj.holds[key] = Time.time + duration;
				obj.Apply();
			}
		}

		public static void Release(Pawn pawn, string key)
		{
			ThirdPersonHold thirdPersonHold = (((Object)(object)pawn != (Object)null) ? ((Component)pawn).GetComponent<ThirdPersonHold>() : null);
			if (!((Object)(object)thirdPersonHold == (Object)null))
			{
				thirdPersonHold.holds.Remove(key);
				if (thirdPersonHold.holds.Count == 0)
				{
					Object.Destroy((Object)(object)thirdPersonHold);
				}
			}
		}

		private void Apply()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Invalid comparison between Unknown and I4
			try
			{
				if (!pawn.PawnCamera.overrideForceViewMode.HasValue)
				{
					if ((int)pawn.PawnCamera.CurrentViewMode != 1)
					{
						pawn.PawnCamera.SetThirdPersonViewMode();
					}
					active = true;
				}
			}
			catch (Exception ex)
			{
				Plugin.Log.LogWarning((object)("Couldn't switch to the third-person view: " + ex.Message));
			}
		}

		private void Update()
		{
			if ((Object)(object)pawn == (Object)null)
			{
				Object.Destroy((Object)(object)this);
			}
			else
			{
				if (Time.time < nextCheck)
				{
					return;
				}
				nextCheck = Time.time + 0.4f;
				List<string> list = new List<string>();
				foreach (KeyValuePair<string, float> hold in holds)
				{
					if (Time.time >= hold.Value)
					{
						list.Add(hold.Key);
					}
				}
				foreach (string item in list)
				{
					holds.Remove(item);
				}
				if (holds.Count == 0 || pawn.IsDead)
				{
					Object.Destroy((Object)(object)this);
				}
				else
				{
					Apply();
				}
			}
		}

		private void OnDestroy()
		{
			if (!active || (Object)(object)pawn == (Object)null || (Object)(object)pawn.PawnCamera == (Object)null)
			{
				return;
			}
			try
			{
				pawn.PawnCamera.SetCurrentViewModeState(false);
			}
			catch (Exception)
			{
			}
		}
	}
	internal static class Bones
	{
		private class Rig
		{
			public Animator Animator;

			public readonly Dictionary<HumanBodyBones, Transform> Found = new Dictionary<HumanBodyBones, Transform>();

			public float CheckedAt;
		}

		private static readonly Dictionary<Pawn, Rig> Rigs = new Dictionary<Pawn, Rig>();

		private static readonly Dictionary<HumanBodyBones, string[]> Names = new Dictionary<HumanBodyBones, string[]>
		{
			{
				(HumanBodyBones)10,
				new string[1] { "head" }
			},
			{
				(HumanBodyBones)9,
				new string[1] { "neck" }
			},
			{
				(HumanBodyBones)8,
				new string[5] { "chest", "spine2", "spine02", "spine1", "spine01" }
			},
			{
				(HumanBodyBones)7,
				new string[1] { "spine" }
			},
			{
				(HumanBodyBones)0,
				new string[3] { "hips", "pelvis", "hip" }
			},
			{
				(HumanBodyBones)13,
				new string[6] { "leftarm", "upperarml", "larmupper", "arml", "lupperarm", "leftupperarm" }
			},
			{
				(HumanBodyBones)14,
				new string[6] { "rightarm", "upperarmr", "rarmupper", "armr", "rupperarm", "rightupperarm" }
			},
			{
				(HumanBodyBones)15,
				new string[5] { "leftforearm", "forearml", "lowerarml", "lforearm", "leftlowerarm" }
			},
			{
				(HumanBodyBones)16,
				new string[5] { "rightforearm", "forearmr", "lowerarmr", "rforearm", "rightlowerarm" }
			},
			{
				(HumanBodyBones)17,
				new string[3] { "lefthand", "handl", "lhand" }
			},
			{
				(HumanBodyBones)18,
				new string[3] { "righthand", "handr", "rhand" }
			},
			{
				(HumanBodyBones)1,
				new string[5] { "leftupleg", "thighl", "upperlegl", "lthigh", "leftupperleg" }
			},
			{
				(HumanBodyBones)2,
				new string[5] { "rightupleg", "thighr", "upperlegr", "rthigh", "rightupperleg" }
			},
			{
				(HumanBodyBones)3,
				new string[6] { "leftleg", "calfl", "shinl", "lowerlegl", "lcalf", "leftlowerleg" }
			},
			{
				(HumanBodyBones)4,
				new string[6] { "rightleg", "calfr", "shinr", "lowerlegr", "rcalf", "rightlowerleg" }
			},
			{
				(HumanBodyBones)5,
				new string[3] { "leftfoot", "footl", "lfoot" }
			},
			{
				(HumanBodyBones)6,
				new string[3] { "rightfoot", "footr", "rfoot" }
			}
		};

		public static readonly HumanBodyBones[][] Limbs;

		public static Animator AnimatorOf(Pawn pawn)
		{
			if ((Object)(object)pawn == (Object)null)
			{
				return null;
			}
			try
			{
				PawnView view = pawn.View;
				if ((Object)(object)view != (Object)null && (Object)(object)view.AnimatorTransform != (Object)null)
				{
					Animator component = ((Component)view.AnimatorTransform).GetComponent<Animator>();
					if ((Object)(object)component != (Object)null)
					{
						return component;
					}
				}
				if ((Object)(object)view != (Object)null && (Object)(object)view.NetworkAnimator != (Object)null && (Object)(object)view.NetworkAnimator.animator != (Object)null)
				{
					return view.NetworkAnimator.animator;
				}
			}
			catch (Exception)
			{
			}
			return ((Component)pawn).GetComponentInChildren<Animator>();
		}

		public static Transform Get(Pawn pawn, HumanBodyBones bone)
		{
			//IL_0126: 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_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Invalid comparison between Unknown and I4
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)pawn == (Object)null)
			{
				return null;
			}
			if (!Rigs.TryGetValue(pawn, out var value) || (Object)(object)value.Animator == (Object)null)
			{
				Prune();
				value = new Rig
				{
					Animator = AnimatorOf(pawn)
				};
				Rigs[pawn] = value;
			}
			if (value.Found.TryGetValue(bone, out var value2) && (Object)(object)value2 != (Object)null)
			{
				return value2;
			}
			if (Time.time < value.CheckedAt && value.Found.ContainsKey(bone))
			{
				return null;
			}
			value2 = null;
			try
			{
				if ((int)bone == 10 && (Object)(object)pawn.View != (Object)null && (Object)(object)pawn.View.HeadBone != (Object)null)
				{
					value2 = pawn.View.HeadBone;
				}
				if ((Object)(object)value2 == (Object)null && (Object)(object)value.Animator != (Object)null && value.Animator.isHuman)
				{
					value2 = value.Animator.GetBoneTransform(bone);
				}
				if ((Object)(object)value2 == (Object)null)
				{
					value2 = FindByName(((Object)(object)value.Animator != (Object)null) ? ((Component)value.Animator).transform : ((Component)pawn).transform, bone);
				}
			}
			catch (Exception)
			{
				value2 = null;
			}
			value.Found[bone] = value2;
			if ((Object)(object)value2 == (Object)null)
			{
				value.CheckedAt = Time.time + 2f;
			}
			return value2;
		}

		public static Vector3 Position(Pawn pawn, HumanBodyBones bone)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			Transform val = Get(pawn, bone);
			if ((Object)(object)val != (Object)null)
			{
				return val.position;
			}
			return Guess(pawn, bone);
		}

		public static Vector3 Guess(Pawn pawn, HumanBodyBones bone)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: 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_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: 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)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Expected I4, but got Unknown
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: 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_023f: 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_024a: Unknown result type (might be due to invalid IL or missing references)
			//IL_024f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0255: Unknown result type (might be due to invalid IL or missing references)
			//IL_025a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0260: Unknown result type (might be due to invalid IL or missing references)
			//IL_0262: Unknown result type (might be due to invalid IL or missing references)
			//IL_0268: Unknown result type (might be due to invalid IL or missing references)
			//IL_026d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0272: Unknown result type (might be due to invalid IL or missing references)
			//IL_0278: Unknown result type (might be due to invalid IL or missing references)
			//IL_027d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0283: 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_028b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0290: Unknown result type (might be due to invalid IL or missing references)
			//IL_0295: Unknown result type (might be due to invalid IL or missing references)
			//IL_029b: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02be: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cb: 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_02d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02db: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_02fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0304: Unknown result type (might be due to invalid IL or missing references)
			//IL_0309: Unknown result type (might be due to invalid IL or missing references)
			//IL_030e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0314: Unknown result type (might be due to invalid IL or missing references)
			//IL_0319: Unknown result type (might be due to invalid IL or missing references)
			//IL_031e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0324: Unknown result type (might be due to invalid IL or missing references)
			//IL_0329: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: 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_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_032f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0331: Unknown result type (might be due to invalid IL or missing references)
			//IL_0337: Unknown result type (might be due to invalid IL or missing references)
			//IL_033c: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: 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_0133: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: Unknown result type (might be due to invalid IL or missing references)
			//IL_013d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0143: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: Unknown result type (might be due to invalid IL or missing references)
			//IL_015b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0160: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: Unknown result type (might be due to invalid IL or missing references)
			//IL_016b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: 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_0179: Unknown result type (might be due to invalid IL or missing references)
			//IL_017e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0183: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_018e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0193: Unknown result type (might be due to invalid IL or missing references)
			//IL_0199: Unknown result type (might be due to invalid IL or missing references)
			//IL_019e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01df: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e9: 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_01f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0204: Unknown result type (might be due to invalid IL or missing references)
			//IL_020a: Unknown result type (might be due to invalid IL or missing references)
			//IL_020c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0212: Unknown result type (might be due to invalid IL or missing references)
			//IL_0217: Unknown result type (might be due to invalid IL or missing references)
			//IL_021c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0222: Unknown result type (might be due to invalid IL or missing references)
			//IL_0227: Unknown result type (might be due to invalid IL or missing references)
			//IL_022c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0232: Unknown result type (might be due to invalid IL or missing references)
			//IL_0237: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Invalid comparison between Unknown and I4
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)pawn == (Object)null)
			{
				return Vector3.zero;
			}
			Transform transform = ((Component)pawn).transform;
			float num = Mathf.Clamp(transform.lossyScale.y, 0.1f, 4f);
			Vector3 val = transform.right * num;
			Vector3 val2 = Vector3.up * num;
			Vector3 val3 = transform.forward * num;
			Vector3 position = transform.position;
			switch ((int)bone)
			{
			default:
				if ((int)bone != 54)
				{
					break;
				}
				return position + val2 * 1.36f;
			case 10:
				return position + val2 * 1.62f;
			case 9:
				return position + val2 * 1.48f;
			case 8:
				return position + val2 * 1.3f;
			case 7:
				return position + val2 * 1.1f;
			case 0:
				return position + val2 * 0.95f;
			case 13:
				return position + val2 * 1.4f - val * 0.2f;
			case 14:
				return position + val2 * 1.4f + val * 0.2f;
			case 15:
				return position + val2 * 1.15f - val * 0.3f + val3 * 0.05f;
			case 16:
				return position + val2 * 1.15f + val * 0.3f + val3 * 0.05f;
			case 17:
				return position + val2 * 0.95f - val * 0.32f + val3 * 0.15f;
			case 18:
				return position + val2 * 0.95f + val * 0.32f + val3 * 0.15f;
			case 1:
				return position + val2 * 0.9f - val * 0.11f;
			case 2:
				return position + val2 * 0.9f + val * 0.11f;
			case 3:
				return position + val2 * 0.48f - val * 0.12f;
			case 4:
				return position + val2 * 0.48f + val * 0.12f;
			case 5:
				return position + val2 * 0.08f - val * 0.12f + val3 * 0.05f;
			case 6:
				return position + val2 * 0.08f + val * 0.12f + val3 * 0.05f;
			case 11:
			case 12:
				break;
			}
			return position + val2 * 1.1f;
		}

		public static Vector3 Facing(Pawn pawn)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)pawn == (Object)null)
			{
				return Vector3.forward;
			}
			Vector3 val = pawn.AimDirection;
			if (((Vector3)(ref val)).sqrMagnitude < 0.0001f)
			{
				val = ((Component)pawn).transform.forward;
			}
			return ((Vector3)(ref val)).normalized;
		}

		public static Vector3 Mouth(Pawn pawn)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_004a: 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_0055: 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_0064: 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_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: 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_00c7: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)pawn == (Object)null)
			{
				return Vector3.zero;
			}
			Vector3 val = Facing(pawn);
			float num = Mathf.Clamp(((Component)pawn).transform.lossyScale.y, 0.1f, 4f);
			if (InFirstPerson(pawn))
			{
				return pawn.LookOrigin + val * 0.35f * num - Vector3.up * 0.22f * num;
			}
			Transform val2 = Get(pawn, (HumanBodyBones)10);
			return (((Object)(object)val2 != (Object)null) ? val2.position : Guess(pawn, (HumanBodyBones)10)) + DomainHelpers.Flat(val) * 0.13f * num - Vector3.up * 0.06f * num;
		}

		public static Vector3 Hand(Pawn pawn, bool left)
		{
			//IL_0009: 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_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: 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)
			//IL_0061: 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_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//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_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)pawn == (Object)null)
			{
				return Vector3.zero;
			}
			if (InFirstPerson(pawn))
			{
				Vector3 val = Facing(pawn);
				Vector3 val2 = Vector3.Cross(Vector3.up, val);
				Vector3 normalized = ((Vector3)(ref val2)).normalized;
				float num = Mathf.Clamp(((Component)pawn).transform.lossyScale.y, 0.1f, 4f);
				return pawn.LookOrigin + (val * 0.45f + normalized * (left ? (-0.28f) : 0.28f) - Vector3.up * 0.38f) * num;
			}
			return Position(pawn, (HumanBodyBones)(left ? 17 : 18));
		}

		public static bool InFirstPerson(Pawn pawn)
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Invalid comparison between Unknown and I4
			try
			{
				return (Object)(object)pawn != (Object)null && ((NetworkBehaviour)pawn).isLocalPlayer && (Object)(object)pawn.PawnCamera != (Object)null && (int)pawn.PawnCamera.CurrentViewMode == 0;
			}
			catch (Exception)
			{
				return false;
			}
		}

		private static Transform FindByName(Transform root, HumanBodyBones bone)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)root == (Object)null || !Names.TryGetValue(bone, out var value))
			{
				return null;
			}
			Transform result = null;
			int num = int.MaxValue;
			Transform[] componentsInChildren = ((Component)root).GetComponentsInChildren<Transform>(true);
			foreach (Transform val in componentsInChildren)
			{
				if ((Object)(object)val == (Object)null || Fx.IsEffectOrCamera(val, root))
				{
					continue;
				}
				string text = ((Object)val).name.ToLowerInvariant().Replace(" ", "").Replace("_", "")
					.Replace(".", "")
					.Replace(":", "")
					.Replace("-", "");
				for (int j = 0; j < value.Length && j < num; j++)
				{
					if ((text.EndsWith(value[j], StringComparison.Ordinal) || text.Contains(value[j])) && !text.Contains("finger") && !text.Contains("thumb") && !text.Contains("index") && !text.Contains("twist") && !text.Contains("end"))
					{
						result = val;
						num = j;
						break;
					}
				}
			}
			return result;
		}

		private static void Prune()
		{
			if (Rigs.Count < 16)
			{
				return;
			}
			List<Pawn> list = new List<Pawn>();
			foreach (KeyValuePair<Pawn, Rig> rig in Rigs)
			{
				if ((Object)(object)rig.Key == (Object)null)
				{
					list.Add(rig.Key);
				}
			}
			foreach (Pawn item in list)
			{
				Rigs.Remove(item);
			}
		}

		static Bones()
		{
			HumanBodyBones[][] array = new HumanBodyBones[5][];
			HumanBodyBones[] array2 = new HumanBodyBones[5];
			RuntimeHelpers.InitializeArray(array2, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
			array[0] = (HumanBodyBones[])(object)array2;
			HumanBodyBones[] array3 = new HumanBodyBones[4];
			RuntimeHelpers.InitializeArray(array3, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
			array[1] = (HumanBodyBones[])(object)array3;
			HumanBodyBones[] array4 = new HumanBodyBones[4];
			RuntimeHelpers.InitializeArray(array4, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
			array[2] = (HumanBodyBones[])(object)array4;
			HumanBodyBones[] array5 = new HumanBodyBones[4];
			RuntimeHelpers.InitializeArray(array5, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
			array[3] = (HumanBodyBones[])(object)array5;
			HumanBodyBones[] array6 = new HumanBodyBones[4];
			RuntimeHelpers.InitializeArray(array6, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
			array[4] = (HumanBodyBones[])(object)array6;
			Limbs = array;
		}
	}
	internal sealed class Catalog
	{
		private sealed class Entry
		{
			public GameObject Prefab;

			public Spell Spell;

			public bool OnVoiceWand;
		}

		private readonly List<Entry> entries = new List<Entry>();

		public readonly Dictionary<string, SpellData> DataByKey = new Dictionary<string, SpellData>();

		public readonly List<GameObject> Prefabs = new List<GameObject>();

		private bool loggedPrices;

		public static Catalog Build(YapNetworkManager mgr, bool log)
		{
			Catalog catalog = new Catalog();
			StringBuilder stringBuilder = new StringBuilder();
			foreach (GameObject spawnPrefab in ((NetworkManager)mgr).spawnPrefabs)
			{
				if ((Object)(object)spawnPrefab == (Object)null)
				{
					continue;
				}
				catalog.Prefabs.Add(spawnPrefab);
				Spell[] componentsInChildren = spawnPrefab.GetComponentsInChildren<Spell>(true);
				if (componentsInChildren.Length == 0)
				{
					continue;
				}
				NetworkPuppetWandProp component = spawnPrefab.GetComponent<NetworkPuppetWandProp>();
				bool onVoiceWand = (Object)(object)component != (Object)null && component.Spell is VoiceSpell;
				stringBuilder.Append("\n  ").Append(((Object)spawnPrefab).name).Append(((Object)(object)component != (Object)null) ? " [wand]: " : ": ");
				Spell[] array = componentsInChildren;
				foreach (Spell val in array)
				{
					SpellData spellData = val.SpellData;
					stringBuilder.Append(((object)val).GetType().Name).Append('(').Append(((Object)(object)spellData != (Object)null) ? spellData.voiceCommandKey : "-")
						.Append(val.IsSecret ? ",secret" : "")
						.Append(") ");
					catalog.entries.Add(new Entry
					{
						Prefab = spawnPrefab,
						Spell = val,
						OnVoiceWand = onVoiceWand
					});
					if ((Object)(object)spellData != (Object)null && !string.IsNullOrEmpty(spellData.voiceCommandKey) && !catalog.DataByKey.ContainsKey(spellData.voiceCommandKey))
					{
						catalog.DataByKey[spellData.voiceCommandKey] = spellData;
					}
				}
			}
			if (log)
			{
				Plugin.Log.LogInfo((object)("Game spell catalog (prefab: Spell(voice key)):" + stringBuilder));
			}
			return catalog;
		}

		public T Spell<T>(string voiceKey = null, bool requireVoiceWand = false) where T : Spell
		{
			foreach (Entry entry in entries)
			{
				if (!(((object)entry.Spell).GetType() != typeof(T)) && (!requireVoiceWand || entry.OnVoiceWand) && (voiceKey == null || (!((Object)(object)entry.Spell.SpellData == (Object)null) && !(entry.Spell.SpellData.voiceCommandKey != voiceKey))))
				{
					return (T)(object)entry.Spell;
				}
			}
			return default(T);
		}

		public GameObject WandWith<T>(string voiceKey = null) where T : Spell
		{
			foreach (Entry entry in entries)
			{
				if (entry.OnVoiceWand && !(((object)entry.Spell).GetType() != typeof(T)) && (voiceKey == null || (!((Object)(object)entry.Spell.SpellData == (Object)null) && !(entry.Spell.SpellData.voiceCommandKey != voiceKey))))
				{
					return entry.Prefab;
				}
			}
			return null;
		}

		public GameObject PrefabNamed(string name)
		{
			foreach (GameObject prefab in Prefabs)
			{
				if ((Object)(object)prefab != (Object)null && string.Equals(((Object)prefab).name, name, StringComparison.Ordinal))
				{
					return prefab;
				}
			}
			return null;
		}

		public int AverageWandPrice()
		{
			int num = 0;
			int num2 = 0;
			StringBuilder stringBuilder = new StringBuilder();
			foreach (GameObject prefab in Prefabs)
			{
				if (!((Object)(object)prefab == (Object)null))
				{
					NetworkPuppetWandProp component = prefab.GetComponent<NetworkPuppetWandProp>();
					if (!((Object)(object)component == (Object)null) && component.Spell is VoiceSpell && ((NetworkPuppetProp)component).purchasePrice > 0)
					{
						num += ((NetworkPuppetProp)component).purchasePrice;
						num2++;
						stringBuilder.Append(' ').Append(((Object)prefab).name).Append('=')
							.Append(((NetworkPuppetProp)component).purchasePrice);
					}
				}
			}
			int num3 = ((num2 > 0) ? Mathf.RoundToInt((float)num / (float)num2) : 100);
			if (!loggedPrices)
			{
				loggedPrices = true;
				Plugin.Log.LogInfo((object)$"Game wand prices:{stringBuilder} (average {num3}).");
			}
			return num3;
		}

		public SpellData Data(params string[] keys)
		{
			foreach (string key in keys)
			{
				if (DataByKey.TryGetValue(key, out var value) && (Object)(object)value != (Object)null)
				{
					return value;
				}
			}
			return null;
		}
	}
	internal enum ShopMode
	{
		Rotation,
		Always
	}
	internal static class Cfg
	{
		public static ConfigEntry<int> Price;

		public static ConfigEntry<ShopMode> InShop;

		public static ConfigEntry<bool> TintWands;

		public static ConfigEntry<bool> FriendlyFire;

		public static ConfigEntry<int> InventorySlots;

		public static ConfigEntry<bool> SpellsBreakValuables;

		public static ConfigEntry<string> WandName;

		public static ConfigEntry<string> BoogiePhrase;

		public static ConfigEntry<string> SlicePhrase;

		public static ConfigEntry<string> RikaPhrase;

		public static ConfigEntry<int> BoogieCharges;

		public static ConfigEntry<float> BoogieRecharge;

		public static ConfigEntry<int> SliceCharges;

		public static ConfigEntry<float> SliceRecharge;

		public static ConfigEntry<float> SliceRange;

		public static ConfigEntry<float> SliceRadius;

		public static ConfigEntry<int> SliceEnemyDamage;

		public static ConfigEntry<int> SlicePlayerDamage;

		public static ConfigEntry<int> SlicePropDamage;

		public static ConfigEntry<float> SliceForce;

		public static ConfigEntry<int> RikaCharges;

		public static ConfigEntry<float> RikaRecharge;

		public static ConfigEntry<float> RikaDuration;

		public static ConfigEntry<float> RikaGuardRadius;

		public static ConfigEntry<float> RikaStrikeInterval;

		public static ConfigEntry<int> RikaStrikeDamage;

		public static ConfigEntry<float> RikaScale;

		public static ConfigEntry<int> RikaPropDamage;

		public static ConfigEntry<bool> RikaSmashesObjects;

		public static ConfigEntry<string> VoidPhrase;

		public static ConfigEntry<string> ShrinePhrase;

		public static ConfigEntry<string> CoffinPhrase;

		public static ConfigEntry<int> VoidCharges;

		public static ConfigEntry<float> VoidRecharge;

		public static ConfigEntry<float> VoidRadius;

		public static ConfigEntry<float> VoidFreezeSeconds;

		public static ConfigEntry<int> ShrineCharges;

		public static ConfigEntry<float> ShrineRecharge;

		public static ConfigEntry<float> ShrineDuration;

		public static ConfigEntry<float> ShrineRadius;

		public static ConfigEntry<float> ShrineSlashesPerSecond;

		public static ConfigEntry<float> ShrineSlashRadius;

		public static ConfigEntry<int> ShrineEnemyDamage;

		public static ConfigEntry<int> ShrinePlayerDamage;

		public static ConfigEntry<int> ShrinePropDamage;

		public static ConfigEntry<float> ShrineAimAtMonsters;

		public static ConfigEntry<int> CoffinCharges;

		public static ConfigEntry<float> CoffinRecharge;

		public static ConfigEntry<float> CoffinDuration;

		public static ConfigEntry<float> CoffinRadius;

		public static ConfigEntry<float> CoffinFireballsPerSecond;

		public static ConfigEntry<float> CoffinExplosionRadius;

		public static ConfigEntry<int> CoffinEnemyDamage;

		public static ConfigEntry<int> CoffinPlayerDamage;

		public static ConfigEntry<int> CoffinPropDamage;

		public static ConfigEntry<float> CoffinAimAtMonsters;

		public static ConfigEntry<string> RonWandName;

		public static ConfigEntry<string> PatronusPhrase;

		public static ConfigEntry<string> StupefyPhrase;

		public static ConfigEntry<string> LumosPhrase;

		public static ConfigEntry<string> AvadaPhrase;

		public static ConfigEntry<int> PatronusCharges;

		public static ConfigEntry<float> PatronusRecharge;

		public static ConfigEntry<float> PatronusDuration;

		public static ConfigEntry<float> PatronusWardRadius;

		public static ConfigEntry<float> PatronusPushForce;

		public static ConfigEntry<int> StupefyCharges;

		public static ConfigEntry<float> StupefyRecharge;

		public static ConfigEntry<int> LumosCharges;

		public static ConfigEntry<float> LumosRecharge;

		public static ConfigEntry<float> LumosDuration;

		public static ConfigEntry<float> LumosHighlightRadius;

		public static ConfigEntry<int> AvadaCharges;

		public static ConfigEntry<float> AvadaRecharge;

		public static ConfigEntry<float> AvadaRange;

		public static ConfigEntry<string> CrackWandName;

		public static ConfigEntry<string> CrackHealPhrase;

		public static ConfigEntry<string> CrackPipePhrase;

		public static ConfigEntry<string> CrackSpeedPhrase;

		public static ConfigEntry<string> CrackFlightPhrase;

		public static ConfigEntry<int> CrackHealCharges;

		public static ConfigEntry<float> CrackHealRecharge;

		public static ConfigEntry<int> CrackHealPerSecond;

		public static ConfigEntry<float> CrackHealDuration;

		public static ConfigEntry<int> CrackPipeCharges;

		public static ConfigEntry<float> CrackPipeRecharge;

		public static ConfigEntry<float> CrackPipeRange;

		public static ConfigEntry<float> CrackPipeRadius;

		public static ConfigEntry<int> CrackPipeEnemyDamage;

		public static ConfigEntry<int> CrackPipePlayerDamage;

		public static ConfigEntry<int> CrackPipePropDamage;

		public static ConfigEntry<int> CrackSpeedCharges;

		public static ConfigEntry<float> CrackSpeedRecharge;

		public static ConfigEntry<float> CrackSpeedDuration;

		public static ConfigEntry<float> CrackSpeedMultiplier;

		public static ConfigEntry<int> CrackFlightCharges;

		public static ConfigEntry<float> CrackFlightRecharge;

		public static ConfigEntry<float> CrackFlightVsUpdog;

		public static ConfigEntry<float> CrackFlightSpeed;

		public static ConfigEntry<float> CrackFlightClimb;

		public static ConfigEntry<bool> CrackFlightSecret;

		public static ConfigEntry<string> NarutoWandName;

		public static ConfigEntry<string> RasenganPhrase;

		public static ConfigEntry<string> ChidoriPhrase;

		public static ConfigEntry<string> RaijinPhrase;

		public static ConfigEntry<string> ReaperPhrase;

		public static ConfigEntry<int> RasenganCharges;

		public static ConfigEntry<float> RasenganRecharge;

		public static ConfigEntry<float> RasenganRange;

		public static ConfigEntry<float> RasenganSpeed;

		public static ConfigEntry<float> RasenganRadius;

		public static ConfigEntry<int> RasenganEnemyDamage;

		public static ConfigEntry<int> RasenganPlayerDamage;

		public static ConfigEntry<int> RasenganPropDamage;

		public static ConfigEntry<string> ShadowClonePhrase;

		public static ConfigEntry<string> SagePhrase;

		public static ConfigEntry<int> ShadowCloneCharges;

		public static ConfigEntry<float> ShadowCloneRecharge;

		public static ConfigEntry<int> ShadowCloneCount;

		public static ConfigEntry<float> ShadowCloneDuration;

		public static ConfigEntry<float> ShadowCloneAggroRadius;

		public static ConfigEntry<float> ShadowCloneScale;

		public static ConfigEntry<int> SageCharges;

		public static ConfigEntry<float> SageRecharge;

		public static ConfigEntry<float> SageDuration;

		public static ConfigEntry<int> SageHealth;

		public static ConfigEntry<bool> SageSecret;

		public static ConfigEntry<int> RaijinCharges;

		public static ConfigEntry<float> RaijinRecharge;

		public static ConfigEntry<float> RaijinRange;

		public static ConfigEntry<int> ReaperCharges;

		public static ConfigEntry<float> ReaperRecharge;

		public static ConfigEntry<float> ReaperRange;

		public static ConfigEntry<bool> ReaperSecret;

		public static ConfigEntry<string> PokeWandName;

		public static ConfigEntry<string> ThunderPhrase;

		public static ConfigEntry<string> FireBlastPhrase;

		public static ConfigEntry<string> HyperBeamPhrase;

		public static ConfigEntry<string> QuakePhrase;

		public static ConfigEntry<int> ThunderCharges;

		public static ConfigEntry<float> ThunderRecharge;

		public static ConfigEntry<float> ThunderRange;

		public static ConfigEntry<int> ThunderEnemyDamage;

		public static ConfigEntry<int> ThunderPlayerDamage;

		public static ConfigEntry<int> ThunderPropDamage;

		public static ConfigEntry<int> FireBlastCharges;

		public static ConfigEntry<float> FireBlastRecharge;

		public static ConfigEntry<float> FireBlastRange;

		public static ConfigEntry<float> FireBlastSpeed;

		public static ConfigEntry<float> FireBlastRadius;

		public static ConfigEntry<int> FireBlastEnemyDamage;

		public static ConfigEntry<int> FireBlastPlayerDamage;

		public static ConfigEntry<int> FireBlastPropDamage;

		public static ConfigEntry<int> HyperBeamCharges;

		public static ConfigEntry<float> HyperBeamRecharge;

		public static ConfigEntry<float> HyperBeamDuration;

		public static ConfigEntry<float> HyperBeamRange;

		public static ConfigEntry<int> HyperBeamEnemyDps;

		public static ConfigEntry<int> HyperBeamPlayerDps;

		public static ConfigEntry<int> HyperBeamPropDps;

		public static ConfigEntry<int> QuakeCharges;

		public static ConfigEntry<float> QuakeRecharge;

		public static ConfigEntry<float> QuakeRadius;

		public static ConfigEntry<int> QuakeEnemyDamage;

		public static ConfigEntry<int> QuakePlayerDamage;

		public static ConfigEntry<int> QuakePropDamage;

		public static ConfigEntry<bool> QuakeSecret;

		public static ConfigEntry<string> BleachWandName;

		public static ConfigEntry<string> ZabimaruPhrase;

		public static ConfigEntry<string> FlashStepPhrase;

		public static ConfigEntry<string> GetsugaPhrase;

		public static ConfigEntry<string> KurohitsugiPhrase;

		public static ConfigEntry<int> ZabimaruCharges;

		public static ConfigEntry<float> ZabimaruRecharge;

		public static ConfigEntry<float> ZabimaruReach;

		public static ConfigEntry<float> ZabimaruArc;

		public static ConfigEntry<int> ZabimaruEnemyDamage;

		public static ConfigEntry<int> ZabimaruPlayerDamage;

		public static ConfigEntry<int> ZabimaruPropDamage;

		public static ConfigEntry<float> ZabimaruForce;

		public static ConfigEntry<int> FlashStepCharges;

		public static ConfigEntry<float> FlashStepRecharge;

		public static ConfigEntry<float> FlashStepDistance;

		public static ConfigEntry<int> GetsugaCharges;

		public static ConfigEntry<float> GetsugaRecharge;

		public static ConfigEntry<float> GetsugaRange;

		public static ConfigEntry<float> GetsugaSpeed;

		public static ConfigEntry<float> GetsugaWidth;

		public static ConfigEntry<int> GetsugaEnemyDamage;

		public static ConfigEntry<int> GetsugaPlayerDamage;

		public static ConfigEntry<int> GetsugaPropDamage;

		public static ConfigEntry<int> KurohitsugiCharges;

		public static ConfigEntry<float> KurohitsugiRecharge;

		public static ConfigEntry<float> KurohitsugiRange;

		public static ConfigEntry<float> KurohitsugiSize;

		public static ConfigEntry<int> KurohitsugiEnemyDamage;

		public static ConfigEntry<int> KurohitsugiPlayerDamage;

		public static ConfigEntry<int> KurohitsugiPropDamage;

		public static ConfigEntry<bool> KurohitsugiSecret;

		public static ConfigEntry<string> NenWandName;

		public static ConfigEntry<string> BungeePhrase;

		public static ConfigEntry<string> GodspeedPhrase;

		public static ConfigEntry<string> SpiritualPhrase;

		public static ConfigEntry<string> GuanyinPhrase;

		public static ConfigEntry<int> BungeeCharges;

		public static ConfigEntry<float> BungeeRecharge;

		public static ConfigEntry<float> BungeeRange;

		public static ConfigEntry<float> BungeeSpeed;

		public static ConfigEntry<int> BungeeImpactDamage;

		public static ConfigEntry<int> BungeePropDamage;

		public static ConfigEntry<int> GodspeedCharges;

		public static ConfigEntry<float> GodspeedRecharge;

		public static ConfigEntry<float> GodspeedDuration;

		public static ConfigEntry<float> GodspeedMultiplier;

		public static ConfigEntry<int> SpiritualCharges;

		public static ConfigEntry<float> SpiritualRecharge;

		public static ConfigEntry<int> SpiritualCopies;

		public static ConfigEntry<float> SpiritualDuration;

		public static ConfigEntry<float> SpiritualLead;

		public static ConfigEntry<float> SpiritualSpeed;

		public static ConfigEntry<int> GuanyinCharges;

		public static ConfigEntry<float> GuanyinRecharge;

		public static ConfigEntry<float> GuanyinDuration;

		public static ConfigEntry<float> GuanyinRadius;

		public static ConfigEntry<float> GuanyinStrikeInterval;

		public static ConfigEntry<float> GuanyinPalmRadius;

		public static ConfigEntry<int> GuanyinEnemyDamage;

		public static ConfigEntry<int> GuanyinPlayerDamage;

		public static ConfigEntry<int> GuanyinPropDamage;

		public static ConfigEntry<bool> GuanyinSecret;

		public static ConfigEntry<bool> GrimoirePages;

		public static ConfigEntry<string> SasukeWandName;

		public static ConfigEntry<string> RinneganPhrase;

		public static ConfigEntry<string> GenjutsuPhrase;

		public static ConfigEntry<string> AmaterasuPhrase;

		public static ConfigEntry<string> CurseMarkPhrase;

		public static ConfigEntry<int> SasukeChidoriCharges;

		public static ConfigEntry<float> SasukeChidoriRecharge;

		public static ConfigEntry<float> SasukeChidoriRange;

		public static ConfigEntry<float> SasukeChidoriSpeed;

		public static ConfigEntry<float> SasukeChidoriRadius;

		public static ConfigEntry<int> SasukeChidoriEnemyDamage;

		public static ConfigEntry<int> SasukeChidoriPlayerDamage;

		public static ConfigEntry<int> SasukeChidoriPropDamage;

		public static ConfigEntry<int> RinneganCharges;

		public static ConfigEntry<float> RinneganRecharge;

		public static ConfigEntry<float> RinneganGreySeconds;

		public static ConfigEntry<int> GenjutsuCharges;

		public static ConfigEntry<float> GenjutsuRecharge;

		public static ConfigEntry<float> GenjutsuRadius;

		public static ConfigEntry<float> GenjutsuDuration;

		public static ConfigEntry<int> GenjutsuMaxIllusions;

		public static ConfigEntry<int> AmaterasuCharges;

		public static ConfigEntry<float> AmaterasuRecharge;

		public static ConfigEntry<float> AmaterasuRange;

		public static ConfigEntry<int> AmaterasuEnemyDps;

		public static ConfigEntry<int> AmaterasuPropDps;

		public static ConfigEntry<int> AmaterasuPlayerDps;

		public static ConfigEntry<float> AmaterasuMaxSeconds;

		public static ConfigEntry<int> CurseCharges;

		public static ConfigEntry<float> CurseRecharge;

		public static ConfigEntry<float> CurseDuration;

		public static ConfigEntry<int> CurseHealth;

		public static ConfigEntry<float> CurseSpeed;

		public static ConfigEntry<bool> CurseSecret;

		public static ConfigEntry<string> Poke2WandName;

		public static ConfigEntry<string> BodySlamPhrase;

		public static ConfigEntry<string> GunkShotPhrase;

		public static ConfigEntry<string> TrickRoomPhrase;

		public static ConfigEntry<string> FlyPhrase;

		public static ConfigEntry<int> BodySlamCharges;

		public static ConfigEntry<float> BodySlamRecharge;

		public static ConfigEntry<float> BodySlamLeap;

		public static ConfigEntry<float> BodySlamRadius;

		public static ConfigEntry<int> BodySlamEnemyDamage;

		public static ConfigEntry<int> BodySlamPlayerDamage;

		public static ConfigEntry<int> BodySlamPropDamage;

		public static ConfigEntry<int> GunkCharges;

		public static ConfigEntry<float> GunkRecharge;

		public static ConfigEntry<float> GunkRange;

		public static ConfigEntry<float> GunkSpeed;

		public static ConfigEntry<float> GunkRadius;

		public static ConfigEntry<int> GunkEnemyDamage;

		public static ConfigEntry<int> GunkPlayerDamage;

		public static ConfigEntry<int> GunkPropDamage;

		public static ConfigEntry<int> TrickRoomCharges;

		public static ConfigEntry<float> TrickRoomRecharge;

		public static ConfigEntry<float> TrickRoomDuration;

		public static ConfigEntry<float> TrickRoomRadius;

		public static ConfigEntry<float> TrickRoomEnemySpeed;

		public static ConfigEntry<float> TrickRoomFriendlySpeed;

		public static ConfigEntry<int> FlyCharges;

		public static ConfigEntry<float> FlyRecharge;

		public static ConfigEntry<float> FlyDuration;

		public static ConfigEntry<float> FlySpeed;

		public static ConfigEntry<float> FlyClimb;

		public static ConfigEntry<bool> FlyThirdPerson;

		public static ConfigEntry<bool> FlySecret;

		public static ConfigEntry<string> TransWandName;

		public static ConfigEntry<string> MiniMePhrase;

		public static ConfigEntry<string> SuperSizePhrase;

		public static ConfigEntry<string> CopyPhrase;

		public static ConfigEntry<string> DuplicatePhrase;

		public static ConfigEntry<int> MiniMeCharges;

		public static ConfigEntry<float> MiniMeRecharge;

		public static ConfigEntry<float> MiniMeDuration;

		public static ConfigEntry<float> MiniMeScale;

		public static ConfigEntry<float> MiniMeSpeed;

		public static ConfigEntry<int> SuperSizeCharges;

		public static ConfigEntry<float> SuperSizeRecharge;

		public static ConfigEntry<float> SuperSizeDuration;

		public static ConfigEntry<float> SuperSizeScale;

		public static ConfigEntry<int> SuperSizeEnemyDamage;

		public static ConfigEntry<int> SuperSizePlayerDamage;

		public static ConfigEntry<int> SuperSizePropDamage;

		public static ConfigEntry<int> CopyCharges;

		public static ConfigEntry<float> CopyRecharge;

		public static ConfigEntry<float> CopyDuration;

		public static ConfigEntry<float> CopyRange;

		public static ConfigEntry<bool> CopyThirdPerson;

		public static ConfigEntry<int> DuplicateCharges;

		public static ConfigEntry<float> DuplicateRecharge;

		public static ConfigEntry<float> DuplicateRange;

		public static ConfigEntry<int> DuplicateCopies;

		public static ConfigEntry<float> DuplicateBrawlSeconds;

		public static ConfigEntry<int> DuplicateBrawlDamage;

		public static ConfigEntry<bool> DuplicateSecret;

		public static ConfigEntry<string> ShadowWandName;

		public static ConfigEntry<string> HealBatPhrase;

		public static ConfigEntry<string> HealPulsePhrase;

		public static ConfigEntry<string> RevivePhrase;

		public static ConfigEntry<string> RaiseDeadPhrase;

		public static ConfigEntry<int> HealBatCharges;

		public static ConfigEntry<float> HealBatRecharge;

		public static ConfigEntry<float> HealBatDuration;

		public static ConfigEntry<float> HealBatInterval;

		public static ConfigEntry<int> HealBatAmount;

		public static ConfigEntry<int> HealPulseCharges;

		public static ConfigEntry<float> HealPulseRecharge;

		public static ConfigEntry<float> HealPulseRadius;

		public static ConfigEntry<int> HealPulseAmount;

		public static ConfigEntry<int> ReviveCharges;

		public static ConfigEntry<float> ReviveRecharge;

		public static ConfigEntry<float> ReviveRange;

		public static ConfigEntry<float> ReviveNearbyRadius;

		public static ConfigEntry<float> ReviveRitualSeconds;

		public static ConfigEntry<int> ReviveHealth;

		public static ConfigEntry<int> RaiseDeadCharges;

		public static ConfigEntry<float> RaiseDeadRecharge;

		public static ConfigEntry<int> RaiseDeadCount;

		public static ConfigEntry<float> RaiseDeadDuration;

		public static ConfigEntry<int> RaiseDeadDamage;

		public static ConfigEntry<int> RaiseDeadPropDamage;

		public static ConfigEntry<int> RaiseDeadHitsToBreak;

		public static ConfigEntry<bool> RaiseDeadSecret;

		private const int CurrentSettingsVersion = 1;

		public static ConfigEntry<int> SettingsVersion;

		public static ConfigEntry<string> DagonWandName;

		public static ConfigEntry<string> WaterTorrentPhrase;

		public static ConfigEntry<string> DeathSwarmPhrase;

		public static ConfigEntry<string> SharkPhrase;

		public static ConfigEntry<string> DagonDomainPhrase;

		public static ConfigEntry<int> WaterTorrentCharges;

		public static ConfigEntry<float> WaterTorrentRecharge;

		public static ConfigEntry<float> WaterTorrentRange;

		public static ConfigEntry<float> WaterTorrentWidth;

		public static ConfigEntry<float> WaterTorrentDuration;

		public static ConfigEntry<int> WaterTorrentEnemyDamage;

		public static ConfigEntry<int> WaterTorrentPlayerDamage;

		public static ConfigEntry<int> WaterTorrentPropDamage;

		public static ConfigEntry<float> WaterTorrentForce;

		public static ConfigEntry<int> DeathSwarmCharges;

		public static ConfigEntry<float> DeathSwarmRecharge;

		public static ConfigEntry<float> DeathSwarmRange;

		public static ConfigEntry<float> DeathSwarmWidth;

		public static ConfigEntry<float> DeathSwarmSeconds;

		public static ConfigEntry<int> DeathSwarmEnemyDamage;

		public static ConfigEntry<int> DeathSwarmPlayerDamage;

		public static ConfigEntry<int> DeathSwarmPropDamage;

		public static ConfigEntry<int> SharkCharges;

		public static ConfigEntry<float> SharkRecharge;

		public static ConfigEntry<float> SharkRange;

		public static ConfigEntry<int> SharkDamage;

		public static ConfigEntry<int> SharkPropDamage;

		public static ConfigEntry<bool> SharkDrag;

		public static ConfigEntry<int> DagonDomainCharges;

		public static ConfigEntry<float> DagonDomainRecharge;

		public static ConfigEntry<float> DagonDomainDuration;

		public static ConfigEntry<float> DagonDomainRadius;

		public static ConfigEntry<int> DagonDomainDamage;

		public static ConfigEntry<int> DagonDomainPlayerDamage;

		public static ConfigEntry<int> DagonDomainPropDamage;

		public static ConfigEntry<int> DagonDomainStunEvery;

		public static ConfigEntry<bool> DagonDomainSecret;

		public static ConfigEntry<string> DeidaraWandName;

		public static ConfigEntry<string> C1Phrase;

		public static ConfigEntry<string> ClayBirdPhrase;

		public static ConfigEntry<string> C3Phrase;

		public static ConfigEntry<string> C0Phrase;

		public static ConfigEntry<int> C1Charges;

		public static ConfigEntry<float> C1Recharge;

		public static ConfigEntry<int> C1Bombs;

		public static ConfigEntry<float> C1Range;

		public static ConfigEntry<float> C1Speed;

		public static ConfigEntry<float> C1MaxSeconds;

		public static ConfigEntry<float> C1BlastRadius;

		public static ConfigEntry<int> C1EnemyDamage;

		public static ConfigEntry<int> C1PlayerDamage;

		public static ConfigEntry<int> C1PropDamage;

		public static ConfigEntry<int> ClayBirdCharges;

		public static ConfigEntry<float> ClayBirdRecharge;

		public static ConfigEntry<float> ClayBirdDuration;

		public static ConfigEntry<float> ClayBirdSpeed;

		public static ConfigEntry<float> ClayBirdClimb;

		public static ConfigEntry<bool> ClayBirdThirdPerson;

		public static ConfigEntry<int> C3Charges;

		public static ConfigEntry<float> C3Recharge;

		public static ConfigEntry<float> C3Range;

		public static ConfigEntry<float> C3FallSeconds;

		public static ConfigEntry<float> C3BlastRadius;

		public static ConfigEntry<int> C3EnemyDamage;

		public static ConfigEntry<int> C3PlayerDamage;

		public static ConfigEntry<int> C3PropDamage;

		public static ConfigEntry<int> C0Charges;

		public static ConfigEntry<float> C0Recharge;

		public static ConfigEntry<float> C0ChargeSeconds;

		public static ConfigEntry<float> C0HiddenSeconds;

		public static ConfigEntry<float> C0BlastRadius;

		public static ConfigEntry<int> C0EnemyDamage;

		public static ConfigEntry<int> C0PlayerDamage;

		public static ConfigEntry<int> C0PropDamage;

		public static ConfigEntry<string> GaaraWandName;

		public static ConfigEntry<string> SandCoffinPhrase;

		public static ConfigEntry<string> SandShieldPhrase;

		public static ConfigEntry<string> SandCloudPhrase;

		public static ConfigEntry<string> SandTsunamiPhrase;

		public static ConfigEntry<int> SandCoffinCharges;

		public static ConfigEntry<float> SandCoffinRecharge;

		public static ConfigEntry<float> SandCoffinRange;

		public static ConfigEntry<float> SandCoffinSeconds;

		public static ConfigEntry<float> SandCoffinCrushInterval;

		public static ConfigEntry<int> SandCoffinCrushDamage;

		public static ConfigEntry<int> SandCoffinFinalDamage;

		public static ConfigEntry<int> SandCoffinPlayerDamage;

		public static ConfigEntry<int> SandCoffinPropDamage;

		public static ConfigEntry<int> SandShieldCharges;

		public static ConfigEntry<float> SandShieldRecharge;

		public static ConfigEntry<float> SandShieldDuration;

		public static ConfigEntry<float> SandShieldRadius;

		public static ConfigEntry<int> SandShieldDamage;

		public static ConfigEntry<float> SandShieldPushForce;

		public static ConfigEntry<bool> SandShieldBlocksDamage;

		public static ConfigEntry<int> SandCloudCharges;

		public static ConfigEntry<float> SandCloudRecharge;

		public static ConfigEntry<float> SandCloudDuration;

		public static ConfigEntry<float> SandCloudSpeed;

		public static ConfigEntry<float> SandCloudClimb;

		public static ConfigEntry<bool> SandCloudThirdPerson;

		public static ConfigEntry<int> SandTsunamiCharges;

		public static ConfigEntry<float> SandTsunamiRecharge;

		public static ConfigEntry<float> SandTsunamiLength;

		public static ConfigEntry<float> SandTsunamiWidth;

		public static ConfigEntry<float> SandTsunamiSeconds;

		public static ConfigEntry<int> SandTsunamiEnemyDamage;

		public static ConfigEntry<int> SandTsunamiPlayerDamage;

		public static ConfigEntry<int> SandTsunamiPropDamage;

		public static ConfigEntry<float> SandTsunamiBurySeconds;

		public static ConfigEntry<float> SandTsunamiForce;

		public static ConfigEntry<string> JiraiyaWandName;

		public static ConfigEntry<string> FlameBulletPhrase;

		public static ConfigEntry<string> NeedleJizoPhrase;

		public static ConfigEntry<string> ToadSagePhrase;

		public static ConfigEntry<string> GiantToadPhrase;

		public static ConfigEntry<int> FlameBulletCharges;

		public static ConfigEntry<float> FlameBulletRecharge;

		public static ConfigEntry<float> FlameBulletRange;

		public static ConfigEntry<int> FlameBulletEnemyDamage;

		public static ConfigEntry<int> FlameBulletPlayerDamage;

		public static ConfigEntry<int> FlameBulletPropDamage;

		public static ConfigEntry<float> FlameBulletFireRadius;

		public static ConfigEntry<float> FlameBulletFireSeconds;

		public static ConfigEntry<int> FlameBulletFireEnemyDamage;

		public static ConfigEntry<int> FlameBulletFirePlayerDamage;

		public static ConfigEntry<int> FlameBulletFirePropDamage;

		public static ConfigEntry<int> NeedleJizoCharges;

		public static ConfigEntry<float> NeedleJizoRecharge;

		public static ConfigEntry<float> NeedleJizoDuration;

		public static ConfigEntry<float> NeedleJizoReach;

		public static ConfigEntry<int> NeedleJizoDamage;

		public static ConfigEntry<int> NeedleJizoPropDamage;

		public static ConfigEntry<float> NeedleJizoInterval;

		public static ConfigEntry<int> ToadSageCharges;

		public static ConfigEntry<float> ToadSageRecharge;

		public static ConfigEntry<float> ToadSageDuration;

		public static ConfigEntry<int> ToadSageHealth;

		public static ConfigEntry<int> GiantToadCharges;

		public static ConfigEntry<float> GiantToadRecharge;

		public static ConfigEntry<float> GiantToadRange;

		public static ConfigEntry<float> GiantToadDuration;

		public static ConfigEntry<float> GiantToadLandingRadius;

		public static ConfigEntry<int> GiantToadLandingEnemyDamage;

		public static ConfigEntry<int> GiantToadLandingPlayerDamage;

		public static ConfigEntry<int> GiantToadLandingPropDamage;

		public static ConfigEntry<float> GiantToadStompRadius;

		public static ConfigEntry<int> GiantToadStompEnemyDamage;

		public static ConfigEntry<int> GiantToadStompPropDamage;

		public static ConfigEntry<float> GiantToadReach;

		public static ConfigEntry<float> GiantToadLeapInterval;

		public static ConfigEntry<float> GiantToadSize;

		public static ConfigEntry<string> JogoWandName;

		public static ConfigEntry<string> JogoInsectsPhrase;

		public static ConfigEntry<string> JogoVolcanoPhrase;

		public static ConfigEntry<string> JogoTornadoPhrase;

		public static ConfigEntry<string> JogoDomainPhrase;

		public static ConfigEntry<int> JogoInsectsCharges;

		public static ConfigEntry<float> JogoInsectsRecharge;

		public static ConfigEntry<int> JogoInsectsCount;

		public static ConfigEntry<float> JogoInsectsRange;

		public static ConfigEntry<float> JogoInsectsSpeed;

		public static ConfigEntry<float> JogoInsectsLifeSeconds;

		public static ConfigEntry<float> JogoInsectsBlastRadius;

		public static ConfigEntry<int> JogoInsectsEnemyDamage;

		public static ConfigEntry<int> JogoInsectsPlayerDamage;

		public static ConfigEntry<int> JogoInsectsPropDamage;

		public static ConfigEntry<int> JogoVolcanoCharges;

		public static ConfigEntry<float> JogoVolcanoRecharge;

		public static ConfigEntry<float> JogoVolcanoRange;

		public static ConfigEntry<int> JogoVolcanoMaxVolcanoes;

		public static ConfigEntry<float> JogoVolcanoSpread;

		public static ConfigEntry<float> JogoVolcanoBlastRadius;

		public static ConfigEntry<int> JogoVolcanoEnemyDamage;

		public static ConfigEntry<int> JogoVolcanoPlayerDamage;

		public static ConfigEntry<int> JogoVolcanoPropDamage;

		public static ConfigEntry<float> JogoVolcanoLavaSeconds;

		public static ConfigEntry<int> JogoVolcanoLavaDamage;

		public static ConfigEntry<int> JogoVolcanoLavaPropDamage;

		public static ConfigEntry<int> JogoTornadoCharges;

		public static ConfigEntry<float> JogoTornadoRecharge;

		public static ConfigEntry<float> JogoTornadoBurnRadius;

		public static ConfigEntry<int> JogoTornadoEnemyDamage;

		public static ConfigEntry<int> JogoTornadoPlayerDamage;

		public static ConfigEntry<int> JogoTornadoPropDamage;

		public static ConfigEntry<int> JogoDomainCharges;

		public static ConfigEntry<float> JogoDomainRecharge;

		public static ConfigEntry<float> JogoDomainDuration;

		public static ConfigEntry<float> JogoDomainRadius;

		public static ConfigEntry<int> JogoDomainHeatDamage;

		public static ConfigEntry<int> JogoDomainHeatPlayerDamage;

		public static ConfigEntry<float> JogoDomainGeyserInterval;

		public static ConfigEntry<float> JogoDomainGeyserRadius;

		public static ConfigEntry<int> JogoDomainGeyserDamage;

		public static ConfigEntry<int> JogoDomainGeyserPlayerDamage;

		public static ConfigEntry<int> JogoDomainGeyserPropDamage;

		public static ConfigEntry<bool> JogoDomainSecret;

		public static ConfigEntry<string> KakashiWandName;

		public static ConfigEntry<string> KakashiLightningPhrase;

		public static ConfigEntry<string> KakashiHoundsPhrase;

		public static ConfigEntry<string> KakashiSharinganPhrase;

		public static ConfigEntry<string> KakashiKamuiPhrase;

		public static ConfigEntry<int> KakashiLightningCharges;

		public static ConfigEntry<float> KakashiLightningRecharge;

		public static ConfigEntry<float> KakashiLightningRange;

		public static ConfigEntry<float> KakashiLightningRadius;

		public static ConfigEntry<int> KakashiLightningEnemyDamage;

		public static ConfigEntry<int> KakashiLightningPlayerDamage;

		public static ConfigEntry<int> KakashiLightningPropDamage;

		public static ConfigEntry<float> KakashiLightningForce;

		public static ConfigEntry<int> KakashiHoundsCharges;

		public static ConfigEntry<float> KakashiHoundsRecharge;

		public static ConfigEntry<float> KakashiHoundsRange;

		public static ConfigEntry<int> KakashiHoundsCount;

		public static ConfigEntry<float> KakashiHoundsDuration;

		public static ConfigEntry<int> KakashiHoundsBiteDamage;

		public static ConfigEntry<float> KakashiHoundsBiteInterval;

		public static ConfigEntry<int> KakashiHoundsPropBiteDamage;

		public static ConfigEntry<int> KakashiSharinganCharges;

		public static ConfigEntry<float> KakashiSharinganRecharge;

		public static ConfigEntry<float> KakashiSharinganRadius;

		public static ConfigEntry<float> KakashiSharinganMemory;

		public static ConfigEntry<float> KakashiSharinganCopyLifetime;

		public static ConfigEntry<int> KakashiKamuiCharges;

		public static ConfigEntry<float> KakashiKamuiRecharge;

		public static ConfigEntry<float> KakashiKamuiRange;

		public static ConfigEntry<float> KakashiKamuiSeconds;

		public static ConfigEntry<bool> GameShading;

		public static ConfigEntry<bool> GameEffects;

		public static ConfigEntry<bool> GameCreatures;

		public static ConfigEntry<bool> LootEnabled;

		public static ConfigEntry<string> LootWands;

		public static ConfigEntry<float> LootChance;

		public static ConfigEntry<string> MegumiWandName;

		public static ConfigEntry<string> MegumiDogsPhrase;

		public static ConfigEntry<string> MegumiBirdPhrase;

		public static ConfigEntry<string> MegumiElephantPhrase;

		public static ConfigEntry<string> MegumiGardenPhrase;

		public static ConfigEntry<string> MegumiGeneralPhrase;

		public static ConfigEntry<int> MegumiDogsCharges;

		public static ConfigEntry<float> MegumiDogsRecharge;

		public static ConfigEntry<int> MegumiDogsCount;

		public static ConfigEntry<float> MegumiDogsDuration;

		public static ConfigEntry<int> MegumiDogsDamage;

		public static ConfigEntry<int> MegumiDogsPropDamage;

		public static ConfigEntry<int> MegumiDogsHitsToBreak;

		public static ConfigEntry<int> MegumiBirdCharges;

		public static ConfigEntry<float> MegumiBirdRecharge;

		public static ConfigEntry<float> MegumiBirdDuration;

		public static ConfigEntry<float> MegumiBirdRadius;

		public static ConfigEntry<float> MegumiBirdDiveInterval;

		public static ConfigEntry<int> MegumiBirdDamage;

		public static ConfigEntry<int> MegumiBirdPropDamage;

		public static ConfigEntry<int> MegumiElephantCharges;

		public static ConfigEntry<float> MegumiElephantRecharge;

		public static ConfigEntry<float> MegumiElephantRange;

		public static ConfigEntry<float> MegumiElephantRadius;

		public static ConfigEntry<int> MegumiElephantEnemyDamage;

		public static ConfigEntry<int> MegumiElephantPlayerDamage;

		public static ConfigEntry<int> MegumiElephantPropDamage;

		public static ConfigEntry<int> MegumiElephantSprayDamage;

		public static ConfigEntry<float> MegumiElephantSprayForce;

		public static ConfigEntry<int> MegumiGardenCharges;

		public static ConfigEntry<float> MegumiGardenRecharge;

		public static ConfigEntry<float> MegumiGardenDuration;

		public static ConfigEntry<float> MegumiGardenRadius;

		public static ConfigEntry<float> MegumiGardenAttackInterval;

		public static ConfigEntry<int> MegumiGardenDamage;

		public static ConfigEntry<int> MegumiGardenPropDamage;

		public static ConfigEntry<float> MegumiGardenSinkSpeed;

		public static ConfigEntry<bool> MegumiGardenSecret;

		public static ConfigEntry<int> MegumiGeneralCharges;

		public static ConfigEntry<float> MegumiGeneralRecharge;

		public static ConfigEntry<float> MegumiGeneralDuration;

		public static ConfigEntry<int> MegumiGeneralHealth;

		public static ConfigEntry<float> MegumiGeneralRange;

		public static ConfigEntry<int> MegumiGeneralDamage;

		public static ConfigEntry<int> MegumiGeneralPlayerDamage;

		public static ConfigEntry<int> MegumiGeneralPropDamage;

		public static ConfigEntry<int> MegumiGeneralHitsToAdapt;

		public static ConfigEntry<bool> MegumiGeneralAttacksPlayers;

		public static ConfigEntry<bool> MegumiGeneralSecret;

		public static ConfigEntry<string> OrochimaruWandName;

		public static ConfigEntry<string> ShadowSnakesPhrase;

		public static ConfigEntry<string> KusanagiPhrase;

		public static ConfigEntry<string> HeavenCursePhrase;

		public static ConfigEntry<string> GiantSnakePhrase;

		public static ConfigEntry<int> ShadowSnakesCharges;

		public static ConfigEntry<float> ShadowSnakesRecharge;

		public static ConfigEntry<float> ShadowSnakesRange;

		public static ConfigEntry<int> ShadowSnakesBiteDamage;

		public static ConfigEntry<int> ShadowSnakesPoisonDamage;

		public static ConfigEntry<float> ShadowSnakesPoisonSeconds;

		public static ConfigEntry<int> ShadowSnakesPropDamage;

		public static ConfigEntry<bool> ShadowSnakesYank;

		public static ConfigEntry<int> KusanagiCharges;

		public static ConfigEntry<float> KusanagiRecharge;

		public static ConfigEntry<float> KusanagiRange;

		public static ConfigEntry<int> KusanagiEnemyDamage;

		public static ConfigEntry<int> KusanagiPlayerDamage;

		public static ConfigEntry<int> KusanagiPropDamage;

		public static ConfigEntry<int> HeavenCurseCharges;

		public static ConfigEntry<float> HeavenCurseRecharge;

		public static ConfigEntry<float> HeavenCurseRange;

		public static ConfigEntry<float> HeavenCurseAllySeconds;

		public static ConfigEntry<float> HeavenCurseDamageMultiplier;

		public static ConfigEntry<float> HeavenCurseSpeedMultiplier;

		public static ConfigEntry<float> HeavenCurseEnemySeconds;

		public static ConfigEntry<float> HeavenCursePainInterval;

		public static ConfigEntry<int> HeavenCursePainDamage;

		public static ConfigEntry<int> HeavenCursePropDamage;

		public static ConfigEntry<int> GiantSnakeCharges;

		public static ConfigEntry<float> GiantSnakeRecharge;

		public static ConfigEntry<float> GiantSnakeRange;

		public static ConfigEntry<float> GiantSnakeDuration;

		public static ConfigEntry<float> GiantSnakeEruptRadius;

		public static ConfigEntry<int> GiantSnakeEruptEnemyDamage;

		public static ConfigEntry<int> GiantSnakeEruptPlayerDamage;

		public static ConfigEntry<int> GiantSnakeEruptPropDamage;

		public static ConfigEntry<int> GiantSnakeSqueezeDamage;

		public static ConfigEntry<float> GiantSnakeSqueezeInterval;

		public static ConfigEntry<int> GiantSnakePropDamage;

		public static ConfigEntry<float> GiantSnakeReach;

		public static ConfigEntry<float> GiantSnakeSize;

		public static ConfigEntry<string> SaiWandName;

		public static ConfigEntry<string> SaiLionsPhrase;

		public static ConfigEntry<string> SaiSnakesPhrase;

		public static ConfigEntry<string> SaiMicePhrase;

		public static ConfigEntry<string> SaiBirdPhrase;

		public static ConfigEntry<int> SaiLionsCharges;

		public static ConfigEntry<float> SaiLionsRecharge;

		public static ConfigEntry<int> SaiLionsCount;

		public static ConfigEntry<float> SaiLionsRange;

		public static ConfigEntry<float> SaiLionsSpeed;

		public static ConfigEntry<float> SaiLionsRadius;

		public static ConfigEntry<int> SaiLionsEnemyDamage;

		public static ConfigEntry<int> SaiLionsPlayerDamage;

		public static ConfigEntry<int> SaiLionsPropDamage;

		public static ConfigEntry<int> SaiSnakesCharges;

		public static ConfigEntry<float> SaiSnakesRecharge;

		public static ConfigEntry<float> SaiSnakesRange;

		public static ConfigEntry<float> SaiSnakesHoldSeconds;

		public static ConfigEntry<int> SaiSnakesDamage;

		public static ConfigEntry<int> SaiSnakesPropDamage;

		public static ConfigEntry<int> SaiMiceCharges;

		public static ConfigEntry<float> SaiMiceRecharge;

		public static ConfigEntry<int> SaiMiceCount;

		public static ConfigEntry<float> SaiMiceRange;

		public static ConfigEntry<int> SaiMiceMaxRevealed;

		public static ConfigEntry<float> SaiMiceRevealSeconds;

		public static ConfigEntry<float> SaiMiceRouteSeconds;

		public static ConfigEntry<int> SaiBirdCharges;

		public static ConfigEntry<float> SaiBirdRecharge;

		public static ConfigEntry<float> SaiBirdDuration;

		public static ConfigEntry<float> SaiBirdSpeed;

		public static ConfigEntry<float> SaiBirdClimb;

		public static ConfigEntry<bool> SaiBirdThirdPerson;

		public static ConfigEntry<string> SakuraWandName;

		public static ConfigEntry<string> GroundPoundPhrase;

		public static ConfigEntry<string> MysticalPalmPhrase;

		public static ConfigEntry<string> SlugHealPhrase;

		public static ConfigEntry<string> HundredSealPhrase;

		public static ConfigEntry<int> GroundPoundCharges;

		public static ConfigEntry<float> GroundPoundRecharge;

		public static ConfigEntry<float> GroundPoundRadius;

		public static ConfigEntry<int> GroundPoundEnemyDamage;

		public static ConfigEntry<int> GroundPoundPlayerDamage;

		public static ConfigEntry<int> GroundPoundPropDamage;

		public static ConfigEntry<float> GroundPoundForce;

		public static ConfigEntry<int> MysticalPalmCharges;

		public static ConfigEntry<float> MysticalPalmRecharge;

		public static ConfigEntry<float> MysticalPalmHealPerSecond;

		public static ConfigEntry<float> MysticalPalmMaxSeconds;

		public static ConfigEntry<float> MysticalPalmRange;

		public static ConfigEntry<float> MysticalPalmMoveTolerance;

		public static ConfigEntry<int> SlugHealCharges;

		public static ConfigEntry<float> SlugHealRecharge;

		public static ConfigEntry<float> SlugHealRadius;

		public static ConfigEntry<float> SlugHealPerSecond;

		public static ConfigEntry<float> SlugHealMaxSeconds;

		public static ConfigEntry<int> HundredSealCharges;

		public static ConfigEntry<float> HundredSealRecharge;

		public static ConfigEntry<float> HundredSealDuration;

		public static ConfigEntry<int> HundredSealHealthPerTick;

		public static ConfigEntry<float> HundredSealTickSeconds;

		public static ConfigEntry<float> HundredSealSpeed;

		public static ConfigEntry<bool> TreeEnabled;

		public static ConfigEntry<string> TreeWands;

		public static ConfigEntry<int> TreeWindBranches;

		public static ConfigEntry<string> YamatoWandName;

		public static ConfigEntry<string> WoodPrisonPhrase;

		public static ConfigEntry<string> WoodBarragePhrase;

		public static ConfigEntry<string> WoodClonePhrase;

		public static ConfigEntry<string> SuppressionPhrase;

		public static ConfigEntry<int> WoodPrisonCharges;

		public static ConfigEntry<float> WoodPrisonRecharge;

		public static ConfigEntry<float> WoodPrisonRange;

		public static ConfigEntry<float> WoodPrisonSeconds;

		public static ConfigEntry<float> WoodPrisonRadius;

		public static ConfigEntry<int> WoodBarrageCharges;

		public static ConfigEntry<float> WoodBarrageRecharge;

		public static ConfigEntry<float> WoodBarrageRadius;

		public static ConfigEntry<int> WoodBarrageMaxTargets;

		public static ConfigEntry<int> WoodBarrageEnemyDamage;

		public static ConfigEntry<int> WoodBarragePlayerDamage;

		public static ConfigEntry<int> WoodBarragePropDamage;

		public static ConfigEntry<int> WoodCloneCharges;

		public static ConfigEntry<float> WoodCloneRecharge;

		public static ConfigEntry<int> WoodCloneCount;

		public static ConfigEntry<float> WoodCloneDuration;

		public static ConfigEntry<int> WoodCloneDamage;

		public static ConfigEntry<int> WoodClonePropDamage;

		public static ConfigEntry<int> WoodCloneHitsToBreak;

		public static ConfigEntry<int> SuppressionCharges;

		public static ConfigEntry<float> SuppressionRecharge;

		public static ConfigEntry<float> SuppressionRange;

		public static ConfigEntry<string> YutaWandName;

		public static ConfigEntry<string> YutaKatanaPhrase;

		public static ConfigEntry<string> YutaDashPhrase;

		public static ConfigEntry<string> YutaReversePhrase;

		public static ConfigEntry<string> YutaRikaPhrase;

		public static ConfigEntry<int> YutaKatanaCharges;

		public static ConfigEntry<float> YutaKatanaRecharge;

		public static ConfigEntry<float> YutaKatanaDistance;

		public static ConfigEntry<float> YutaKatanaWidth;

		public static ConfigEntry<int> YutaKatanaEnemyDamage;

		public static ConfigEntry<int> YutaKatanaPlayerDamage;

		public static ConfigEntry<int> YutaKatanaPropDamage;

		public static ConfigEntry<float> YutaKatanaForce;

		public static ConfigEntry<int> YutaDashCharges;

		public static ConfigEntry<float> YutaDashRecharge;

		public static ConfigEntry<float> YutaDashDuration;

		public static ConfigEntry<float> YutaDashSpeed;

		public static ConfigEntry<int> YutaReverseCharges;

		public static ConfigEntry<float> YutaReverseRecharge;

		public static ConfigEntry<float> YutaReverseRadius;

		public static ConfigEntry<int> YutaReverseHealth;

		public static ConfigEntry<bool> YutaReverseFullHeal;

		public static ConfigEntry<int> YutaRikaCharges;

		public static ConfigEntry<float> YutaRikaRecharge;

		public static ConfigEntry<float> YutaRikaDuration;

		public static ConfigEntry<float> YutaRikaReach;

		public static ConfigEntry<float> YutaRikaStrikeInterval;

		public static ConfigEntry<int> YutaRikaStrikeDamage;

		public static ConfigEntry<int> YutaRikaPropDamage;

		public static ConfigEntry<bool> YutaRikaSmashesObjects;

		public static ConfigEntry<float> YutaRikaScale;

		public static ConfigEntry<bool> YutaRikaSecret;

		public static void Bind(ConfigFile c)
		{
			SettingsVersion = c.Bind<int>("Internal", "SettingsVersion", 0, "Used by the mod to update old default settings once after an update. Leave it alone.");
			Price = c.Bind<int>("General", "WandPrice", -1, "Gold cost of each custom wand. -1 = the same price as the game's wand it's built from; 0 = free. Everyone should use the same value.");
			InShop = c.Bind<ShopMode>("General", "ShopStock", ShopMode.Rotation, "Host only. Rotation = the custom wands come and go in the shop's random stock like the game's wands. Always = always put them in the first wand slots (handy for testing).");
			TintWands = c.Bind<bool>("General", "TintWands", true, "Tint the custom wands so they're easy to tell apart.");
			FriendlyFire = c.Bind<bool>("General", "FriendlyFire", true, "Host only: the custom attack spells can hurt other players, like the game's own damaging spells.");
			SpellsBreakValuables = c.Bind<bool>("General", "SpellsBreakValuables", true, "Host only. Spells that break objects break valuables (loot) too. Turn off to keep loot safe from your own spells; furniture still breaks.");
			InventorySlots = c.Bind<int>("General", "InventorySlots", 5, "Inventory slots (game default is 3, max 8). Everyone in the lobby must use the same number. Keys 4 and up select the extra slots.");
			WandName = c.Bind<string>("JujutsuWand", "WandName", "Jujutsu Wand", "Name shown in the shop and when holding the wand.");
			BoogiePhrase = c.Bind<string>("Incantations", "BoogieWoogie", "BOOGIE WOOGIE", "Words to say. Every word must be in the speech model's dictionary. Restart the game after changing.");
			SlicePhrase = c.Bind<string>("Incantations", "Slice", "SLICE", "Words to say. Restart the game after changing.");
			RikaPhrase = c.Bind<string>("Incantations", "ComeRika", "COME RIKA", "Words to say. Restart the game after changing.");
			PatronusPhrase = c.Bind<string>("Incantations", "ExpectoPatronum", "EXPECT PATRONUS", "'Expecto' and 'patronum' aren't in the dictionary; saying 'expecto patronum' is heard as these words.");
			StupefyPhrase = c.Bind<string>("Incantations", "Stupefy", "STUPEFY", "Words to say. Restart the game after changing.");
			LumosPhrase = c.Bind<string>("Incantations", "Lumos", "LUMOS", "Words to say. Restart the game after changing.");
			AvadaPhrase = c.Bind<string>("Incantations", "AvadaKedavra", "AVADA CADAVER", "Secret spell. 'Kedavra' isn't in the dictionary; saying 'avada kedavra' is heard as AVADA CADAVER.");
			BoogieCharges = c.Bind<int>("BoogieWoogie", "Charges", 3, "Max charges.");
			BoogieRecharge = c.Bind<float>("BoogieWoogie", "RechargeSeconds", 10f, "Seconds for each used charge to come back.");
			SliceCharges = c.Bind<int>("Slice", "Charges", 10, "Max charges.");
			SliceRecharge = c.Bind<float>("Slice", "RechargeSeconds", 2f, "Seconds for each used charge to come back.");
			SliceRange = c.Bind<float>("Slice", "Range", 40f, "How far away the slash can land (meters).");
			SliceRadius = c.Bind<float>("Slice", "Radius", 1.6f, "Size of the slashed area (meters).");
			SliceEnemyDamage = c.Bind<int>("Slice", "EnemyDamage", 34, "Damage to monsters (most have 100 health).");
			SlicePlayerDamage = c.Bind<int>("Slice", "PlayerDamage", 25, "Damage to other players when FriendlyFire is on.");
			SlicePropDamage = c.Bind<int>("Slice", "PropDamage", 60, "Damage to breakable furniture (most have 100 health).");
			SliceForce = c.Bind<float>("Slice", "KnockbackForce", 6f, "Knockback applied to whatever gets slashed.");
			RikaCharges = c.Bind<int>("ComeRika", "Charges", 1, "Max charges.");
			RikaRecharge = c.Bind<float>("ComeRika", "RechargeSeconds", 60f, "Seconds for the charge to come back.");
			RikaDuration = c.Bind<float>("ComeRika", "DurationSeconds", 30f, "How long Rika stays.");
			RikaGuardRadius = c.Bind<float>("ComeRika", "GuardRadius", 10f, "Rika attacks monsters within this distance of you (meters).");
			RikaStrikeInterval = c.Bind<float>("ComeRika", "StrikeIntervalSeconds", 1.5f, "Seconds between Rika's attacks.");
			RikaStrikeDamage = c.Bind<int>("ComeRika", "StrikeDamage", 20, "Damage per Rika attack (monsters have ~100 health). Each hit also stuns.");
			RikaPropDamage = c.Bind<int>("ComeRika", "PropDamage", 60, "Damage to breakable objects around whatever Rika claws.");
			RikaSmashesObjects = c.Bind<bool>("ComeRika", "SmashObjectsWhenNoMonsters", true, "With no monsters near you, Rika claws breakable furniture nearby instead (never valuables).");
			RikaScale = c.Bind<float>("ComeRika", "Size", 1f, "Rika's size. 1 = about 3 meters tall (she shrinks to fit under low ceilings).");
			RonWandName = c.Bind<string>("RonWand", "WandName", "Ron Weasley's Wand", "Name shown in the shop and when holding the wand.");
			PatronusCharges = c.Bind<int>("ExpectoPatronum", "Charges", 1, "Max charges.");
			PatronusRecharge = c.Bind<float>("ExpectoPatronum", "RechargeSeconds", 10f, "Seconds for the charge to come back.");
			PatronusDuration = c.Bind<float>("ExpectoPatronum", "DurationSeconds", 8f, "How long the stag stays.");
			PatronusWardRadius = c.Bind<float>("ExpectoPatronum", "WardRadius", 3.5f, "Monsters this close to the stag get knocked back and stunned (meters).");
			PatronusPushForce = c.Bind<float>("ExpectoPatronum", "PushForce", 25f, "How hard the stag knocks monsters back.");
			StupefyCharges = c.Bind<int>("Stupefy", "Charges", 3, "Max charges.");
			StupefyRecharge = c.Bind<float>("Stupefy", "RechargeSeconds", 10f, "Seconds for each used charge to come back.");
			LumosCharges = c.Bind<int>("Lumos", "Charges", 1, "Max charges.");
			LumosRecharge = c.Bind<float>("Lumos", "RechargeSeconds", 20f, "Seconds for the charge to come back.");
			LumosDuration = c.Bind<float>("Lumos", "DurationSeconds", 10f, "How long the wand light and highlights last.");
			LumosHighlightRadius = c.Bind<float>("Lumos", "HighlightRadius", 25f, "Breakable items within this distance get highlighted (meters).");
			AvadaCharges = c.Bind<int>("AvadaKedavra", "Charges", 1, "Max charges.");
			AvadaRecharge = c.Bind<float>("AvadaKedavra", "RechargeSeconds", 60f, "Seconds for the charge to come back.");
			AvadaRange = c.Bind<float>("AvadaKedavra", "Range", 60f, "How far the curse reaches (meters).");
			BindDomains(c);
			BindPookachee(c);
			BindCrackwand(c);
			BindNaruto(c);
			BindBleach(c);
			BindNen(c);
			BindSasuke(c);
			BindPokeyman2(c);
			BindTransmutation(c);
			BindShadow(c);
			BindSakura(c);
			BindKakashi(c);
			BindSai(c);
			BindYamato(c);
			BindJir