Decompiled source of SpookifiedMod v0.2.0

Terren-HalloweenMod.dll

Decompiled a year ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using DM;
using HalloweenMod.Classes;
using HalloweenMod.Patches;
using HalloweenMod.Tags;
using HarmonyLib;
using Landfall.TABS;
using Landfall.TABS.GameMode;
using Landfall.TABS.GameState;
using Landfall.TABS.UnitEditor;
using Landfall.TABS.Workshop;
using Landfall.TABS_Input;
using TFBGames;
using UFoxLib;
using UFoxLib.Classes;
using UFoxLib.SecretManagement;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyCompany("Terren")]
[assembly: AssemblyTitle("Harren's Halloween Mod")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace HalloweenMod.Classes
{
	public class AddEffectVariation : TargetableEffect
	{
		public UnitEffectBase EffectPrefab;

		public UnitEffectBase EffectForWings;

		public List<string> exceptionUnits;

		[Header("BUG DLC")]
		public UnitEffectBase EBugPrefab;

		public UnitEffectBase EBugForWingsPrefab;

		private GameModeService gameModeService;

		private bool isRestricedInGameMode;

		public override void DoEffect(Transform startPoint, Transform target)
		{
			DataHandler componentInChildren = ((Component)((Component)target).transform.root).GetComponentInChildren<DataHandler>();
			if ((Object.op_Implicit((Object)(object)componentInChildren) && componentInChildren.Dead) || !Object.op_Implicit((Object)(object)componentInChildren))
			{
				return;
			}
			Wings componentInChildren2 = ((Component)((Component)target).transform.root).GetComponentInChildren<Wings>();
			if (Object.op_Implicit((Object)(object)componentInChildren2) && !exceptionUnits.Contains(componentInChildren.unit.unitBlueprint.Entity.Name.ToString()))
			{
				if (componentInChildren2.useWings)
				{
					EffectOnWings(target);
				}
				if (!componentInChildren2.useWings)
				{
					EffectOnAny(target);
				}
			}
			else if (!Object.op_Implicit((Object)(object)componentInChildren2) || exceptionUnits.Contains(componentInChildren.unit.unitBlueprint.Entity.Name.ToString()))
			{
				EffectOnAny(target);
			}
		}

		public override void DoEffect(Vector3 startPoint, Vector3 endPoint, Rigidbody targetRig = null)
		{
		}

		private void EffectOnWings(Transform targ)
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			if (!Application.isEditor)
			{
				ActivateBugDLC();
			}
			UnitEffectBase val = UnitEffectBase.AddEffectToTarget(((Component)targ).gameObject, EffectForWings);
			if ((Object)(object)val == (Object)null)
			{
				GameObject val2 = Object.Instantiate<GameObject>(((Component)EffectForWings).gameObject, ((Component)targ).transform.root);
				val2.transform.position = ((Component)targ).transform.root.position;
				UnitEffectBase component = val2.GetComponent<UnitEffectBase>();
				component.damageMultiplier = base.damageMultiplier;
				component.DoEffect();
				if (Object.op_Implicit((Object)(object)val2))
				{
					TeamHolder.AddTeamHolder(val2, ((Component)this).gameObject);
				}
			}
			else
			{
				val.Ping();
			}
		}

		private void EffectOnAny(Transform targ)
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			if (!Application.isEditor)
			{
				ActivateBugDLC();
			}
			UnitEffectBase val = UnitEffectBase.AddEffectToTarget(((Component)targ).gameObject, EffectPrefab);
			if ((Object)(object)val == (Object)null)
			{
				GameObject val2 = Object.Instantiate<GameObject>(((Component)EffectPrefab).gameObject, ((Component)targ).transform.root);
				val2.transform.position = ((Component)targ).transform.root.position;
				UnitEffectBase component = val2.GetComponent<UnitEffectBase>();
				component.damageMultiplier = base.damageMultiplier;
				component.DoEffect();
				if (Object.op_Implicit((Object)(object)val2))
				{
					TeamHolder.AddTeamHolder(val2, ((Component)this).gameObject);
				}
			}
			else
			{
				val.Ping();
			}
		}

		private void Awake()
		{
			gameModeService = ServiceLocator.GetService<GameModeService>();
			if ((Object)(object)gameModeService != (Object)null)
			{
				isRestricedInGameMode = gameModeService.IsGameModeRestricted();
			}
		}

		private void ActivateBugDLC()
		{
			if (Bugs._DLC_ACTIVATED && SpookifiedNewContentManager.value_BugFlagmanSayan == 1)
			{
				if (Object.op_Implicit((Object)(object)EBugPrefab))
				{
					EffectPrefab = EBugPrefab;
				}
				if (Object.op_Implicit((Object)(object)EBugForWingsPrefab))
				{
					EffectForWings = EBugForWingsPrefab;
				}
			}
		}
	}
	public class Effect_KnockOut : UnitEffectBase
	{
		private Unit unit;

		private StandingHandler stand;

		private DataHandler data;

		private ParticleSystem particle;

		private GooglyEye[] eyes;

		public float removedStand;

		private bool mimir;

		public bool m_Initialized;

		public float knockedFor;

		private Wings[] wings;

		public bool affectWings = true;

		private float wingSpeed1;

		private float wingSpeed2;

		private bool wingsHaveAnimator;

		public UnityEvent onStunEvent;

		public UnityEvent onUnstunEvent;

		private float timer;

		private bool canTimer;

		public override void DoEffect()
		{
			if (!canTimer)
			{
				canTimer = true;
			}
			if (!mimir)
			{
				mimir = true;
			}
			if (!m_Initialized)
			{
				m_Initialized = true;
				Init();
			}
			((MonoBehaviour)this).StartCoroutine(NockEmOut());
		}

		public override void Ping()
		{
			if ((Object)(object)particle != (Object)null)
			{
				particle.Play();
			}
			_ = knockedFor;
			timer += knockedFor;
		}

		private void Init()
		{
			//IL_012e: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			particle = ((Component)this).GetComponentInChildren<ParticleSystem>();
			Random.InitState(((Object)((Component)this).transform.root).GetInstanceID());
			unit = ((Component)((Component)this).transform.parent).GetComponentInChildren<Unit>();
			data = ((Component)((Component)this).transform.parent).GetComponentInChildren<DataHandler>();
			stand = ((Component)((Component)this).transform.parent).GetComponentInChildren<StandingHandler>();
			eyes = ((Component)((Component)this).transform.parent).GetComponentsInChildren<GooglyEye>();
			if (affectWings)
			{
				wings = ((Component)((Component)this).transform.parent).GetComponentsInChildren<Wings>();
			}
			for (int i = 0; i < wings.Length; i++)
			{
				if (Object.op_Implicit((Object)(object)wings[i].animator1) && Object.op_Implicit((Object)(object)wings[i].animator2))
				{
					wingSpeed1 = wings[i].animator1.speed;
					wingSpeed2 = wings[i].animator2.speed;
					wingsHaveAnimator = true;
				}
			}
			Transform transform = ((Component)((Component)((Component)this).transform.parent).GetComponentInChildren<Head>()).transform;
			if (Object.op_Implicit((Object)(object)transform))
			{
				((Component)this).transform.position = transform.position;
				((Component)this).transform.rotation = transform.rotation;
				((Component)this).transform.parent = transform;
			}
		}

		private void Update()
		{
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Invalid comparison between Unknown and I4
			if (canTimer)
			{
				timer = knockedFor - Time.deltaTime;
			}
			if (mimir)
			{
				for (int i = 0; i < eyes.Length; i++)
				{
					if ((int)eyes[i].currentEyeState != 3)
					{
						eyes[i].SetState((EyeState)3);
					}
				}
				if ((Object)(object)unit.data.weaponHandler != (Object)null)
				{
					unit.data.weaponHandler.StopAttacksFor(1f + Time.deltaTime);
				}
			}
			if (unit.data.health <= 0f)
			{
				Object.Destroy((Object)(object)((Component)this).gameObject);
				particle.Stop();
				((MonoBehaviour)this).StopCoroutine(NockEmOut());
			}
		}

		private IEnumerator NockEmOut()
		{
			yield return (object)new WaitForSeconds(0.02f);
			OnStun();
			yield return (object)new WaitForSeconds(timer);
			OnUnstun();
		}

		public Effect_KnockOut()
		{
			removedStand = 5f;
			mimir = true;
			knockedFor = 5f;
		}

		private void OnStun()
		{
			onStunEvent.Invoke();
			if (Object.op_Implicit((Object)(object)stand))
			{
				StandingHandler obj = stand;
				obj.selfOffset += removedStand;
			}
			if (!affectWings)
			{
				return;
			}
			for (int i = 0; i < wings.Length; i++)
			{
				if (wings[i].useWings)
				{
					if (wingsHaveAnimator)
					{
						wings[i].animator1.speed = 0f;
						wings[i].animator2.speed = 0f;
					}
					wings[i].DiableFlight();
				}
			}
		}

		private void OnUnstun()
		{
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			onUnstunEvent.Invoke();
			if (Object.op_Implicit((Object)(object)stand))
			{
				StandingHandler obj = stand;
				obj.selfOffset -= removedStand;
			}
			if (affectWings)
			{
				for (int i = 0; i < wings.Length; i++)
				{
					if (!wings[i].useWings)
					{
						if (wingsHaveAnimator)
						{
							wings[i].animator1.speed = wingSpeed1;
							wings[i].animator2.speed = wingSpeed2;
						}
						wings[i].EnableFlight();
					}
				}
			}
			if (!mimir)
			{
				return;
			}
			mimir = false;
			for (int j = 0; j < eyes.Length; j++)
			{
				if ((int)eyes[j].currentEyeState != 0)
				{
					eyes[j].SetState((EyeState)0);
				}
			}
			if ((Object)(object)unit.data.weaponHandler != (Object)null)
			{
				unit.data.weaponHandler.StopAttacksFor(0f);
			}
		}

		public void ResetTimer()
		{
			timer = 0f;
		}
	}
	public class ExplosionAddEVariation : ExplosionEffect
	{
		public UnitEffectBase EffectPrefab;

		public UnitEffectBase EffectForWings;

		public List<string> exceptionUnits;

		public override void DoEffect(GameObject target)
		{
			Wings componentInChildren = ((Component)target.transform.root).GetComponentInChildren<Wings>();
			if (Object.op_Implicit((Object)(object)componentInChildren) && !exceptionUnits.Contains(((Component)target.transform.root).GetComponent<Unit>().unitBlueprint.Entity.Name.ToString()))
			{
				if (componentInChildren.useWings)
				{
					EffectOnWings(target);
				}
				if (!componentInChildren.useWings)
				{
					EffectOnAny(target);
				}
			}
			else if (!Object.op_Implicit((Object)(object)componentInChildren) || exceptionUnits.Contains(((Component)target.transform.root).GetComponent<Unit>().unitBlueprint.Entity.Name.ToString()))
			{
				EffectOnAny(target);
			}
		}

		private void EffectOnAny(GameObject target)
		{
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			((object)EffectPrefab).GetType();
			UnitEffectBase val = UnitEffectBase.AddEffectToTarget(target.gameObject, EffectPrefab);
			if ((Object)(object)val == (Object)null)
			{
				GameObject obj = Object.Instantiate<GameObject>(((Component)EffectPrefab).gameObject, target.transform.root);
				obj.transform.position = target.transform.root.position;
				obj.transform.rotation = Quaternion.LookRotation(target.transform.root.position - ((Component)this).transform.position);
				TeamHolder.AddTeamHolder(obj, ((Component)((Component)this).transform.root).gameObject);
				obj.GetComponent<UnitEffectBase>().DoEffect();
				val = obj.GetComponent<UnitEffectBase>();
			}
			else
			{
				val.Ping();
			}
			TargetableEffect[] componentsInChildren = ((Component)val).gameObject.GetComponentsInChildren<TargetableEffect>();
			for (int i = 0; i < componentsInChildren.Length; i++)
			{
				componentsInChildren[i].DoEffect(((Component)this).transform, target.transform);
			}
		}

		private void EffectOnWings(GameObject target)
		{
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			((object)EffectForWings).GetType();
			UnitEffectBase val = UnitEffectBase.AddEffectToTarget(target.gameObject, EffectForWings);
			if ((Object)(object)val == (Object)null)
			{
				GameObject obj = Object.Instantiate<GameObject>(((Component)EffectForWings).gameObject, target.transform.root);
				obj.transform.position = target.transform.root.position;
				obj.transform.rotation = Quaternion.LookRotation(target.transform.root.position - ((Component)this).transform.position);
				TeamHolder.AddTeamHolder(obj, ((Component)((Component)this).transform.root).gameObject);
				obj.GetComponent<UnitEffectBase>().DoEffect();
				val = obj.GetComponent<UnitEffectBase>();
			}
			else
			{
				val.Ping();
			}
			TargetableEffect[] componentsInChildren = ((Component)val).gameObject.GetComponentsInChildren<TargetableEffect>();
			for (int i = 0; i < componentsInChildren.Length; i++)
			{
				componentsInChildren[i].DoEffect(((Component)this).transform, target.transform);
			}
		}
	}
	public class MapPropExtened : GameStateListener
	{
		public bool external_isDestructible;

		public UnityEvent eventsOnBreak;

		public bool external_destructibleStateCheck;

		public GameObject activeClonedProp;

		public override void OnEnterBattleState()
		{
			if (!external_destructibleStateCheck)
			{
				external_destructibleStateCheck = true;
			}
			if (Object.op_Implicit((Object)(object)activeClonedProp))
			{
				Rigidbody component = activeClonedProp.GetComponent<Rigidbody>();
				if (Object.op_Implicit((Object)(object)component))
				{
					component.isKinematic = false;
				}
			}
		}

		public override void OnEnterPlacementState()
		{
			//IL_0056: 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)
			if (external_destructibleStateCheck)
			{
				external_destructibleStateCheck = false;
			}
			((Component)this).gameObject.SetActive(false);
			Rigidbody component = ((Component)this).GetComponent<Rigidbody>();
			if (Object.op_Implicit((Object)(object)component))
			{
				component.isKinematic = true;
			}
			if (Object.op_Implicit((Object)(object)activeClonedProp))
			{
				Object.Destroy((Object)(object)activeClonedProp);
			}
			activeClonedProp = Object.Instantiate<GameObject>(((Component)this).gameObject, ((Component)this).transform.position, ((Component)this).transform.rotation, ((Component)this).transform.parent);
			activeClonedProp.SetActive(true);
			Object.Destroy((Object)(object)activeClonedProp.GetComponent<MapProp>());
		}

		public void PropBreak()
		{
			eventsOnBreak.Invoke();
			if (Object.op_Implicit((Object)(object)activeClonedProp))
			{
				Object.Destroy((Object)(object)activeClonedProp);
			}
		}
	}
	public class MapPropBreakableModule : Damagable
	{
		public float m_propHealth = 100f;

		private MapPropExtened m_prop;

		private float m_currentDamage;

		public float m_minimumDamage;

		private void Start()
		{
			m_prop = ((Component)this).gameObject.GetComponent<MapPropExtened>();
		}

		public override void TakeDamage(float damage, Vector3 direction, Unit unit, DamageType damageType = 0)
		{
			if (Object.op_Implicit((Object)(object)m_prop) && m_prop.external_isDestructible && m_prop.external_destructibleStateCheck)
			{
				m_currentDamage += damage;
				if (m_currentDamage >= m_propHealth && damage > m_minimumDamage)
				{
					Destruct();
				}
			}
		}

		private void Destruct()
		{
			m_prop.PropBreak();
		}
	}
	public class MeleeWeaponCollisionEnrage : MonoBehaviour
	{
		private bool canDoSpecialEvents;

		public UnityEvent dealDamageEvent;

		public bool playAura;

		public float chance;

		public float stayFor;

		public ParticleSystem idleAura;

		private Unit self;

		public float timeBetweenSwings = 0.3f;

		private MeleeWeapon meleeWeapon;

		public float maxChance;

		private bool isEnragedAlready;

		private float baseDamage;

		public float plusToDamage;

		private CollisionWeapon colWeapon;

		public float stopForWhenSwinging;

		public int amountOfSwings;

		public void ChanceDecide()
		{
			if (!isEnragedAlready && Random.Range(0f, maxChance) >= chance)
			{
				((MonoBehaviour)this).StartCoroutine(Boost());
			}
		}

		private void Start()
		{
			meleeWeapon = ((Component)this).GetComponent<MeleeWeapon>();
			colWeapon = ((Component)this).GetComponent<CollisionWeapon>();
			if (Object.op_Implicit((Object)(object)colWeapon))
			{
				baseDamage = colWeapon.damage;
			}
			self = ((Component)((Component)this).transform.root).GetComponent<Unit>();
			CollisionEvent component = ((Component)this).GetComponent<CollisionEvent>();
			if (Object.op_Implicit((Object)(object)component))
			{
				component.collisionAction = (Action<Collision>)Delegate.Combine(component.collisionAction, new Action<Collision>(DoCollision));
			}
			CollisionWeapon component2 = ((Component)this).GetComponent<CollisionWeapon>();
			if ((Object)(object)component2 != (Object)null)
			{
				component2.AddDealDamageAction((Action<Collision, float, Vector3>)DoWeaponCollision);
			}
		}

		private void DoCollision(Collision collision)
		{
			if (canDoSpecialEvents)
			{
				dealDamageEvent.Invoke();
			}
		}

		public void DoWeaponCollision(Collision collision, float damage, Vector3 dir)
		{
			DoCollision(collision);
		}

		private IEnumerator Boost()
		{
			if (!isEnragedAlready)
			{
				isEnragedAlready = true;
			}
			if (!canDoSpecialEvents)
			{
				canDoSpecialEvents = true;
			}
			if (Object.op_Implicit((Object)(object)idleAura) && playAura)
			{
				idleAura.Play();
			}
			self.WeaponHandler.StopAttacksFor(stopForWhenSwinging);
			CollisionWeapon obj = colWeapon;
			obj.damage += plusToDamage;
			for (int i = 0; i < amountOfSwings; i++)
			{
				Swing(self.data.targetData.torso.position, self.data.targetMainRig, Vector3.zero, recursive: false);
				yield return (object)new WaitForSeconds(timeBetweenSwings);
			}
			yield return (object)new WaitForSeconds(stayFor);
			CollisionWeapon obj2 = colWeapon;
			obj2.damage += baseDamage;
			self.WeaponHandler.StopAttacksFor(0f);
			if (canDoSpecialEvents)
			{
				canDoSpecialEvents = false;
			}
			if (Object.op_Implicit((Object)(object)idleAura) && playAura)
			{
				idleAura.Stop();
			}
			if (isEnragedAlready)
			{
				isEnragedAlready = false;
			}
		}

		private void Swing(Vector3 position, Rigidbody targetRig, Vector3 forcedDirection, bool recursive)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			((Weapon)meleeWeapon).Attack(position, targetRig, forcedDirection, false);
		}
	}
	public class StoneSkin : MonoBehaviour
	{
		private DataHandler data;

		public UnityEvent whatHappensWhenHurt;

		public ParticleSystem hurtParticle;

		private ShapeModule partShapeModule;

		private int stacks = 2;

		public int maxEmmits;

		private SkinnedMeshRenderer[] allSkinnedMeshes;

		private SkinnedMeshRenderer mainSkinnedMesh;

		[Tooltip("Set to small values. Doing this because some effects like life drain will make this boy go wild with particles and such ( ..)")]
		public float cooldownTime;

		private bool cooldownIsGoing;

		public float strengthCap;

		public float speedCap;

		private float prevDamageMultiplier = 1f;

		private float prevSpeedMultiplier = 1f;

		private float damageMultiplier = 1f;

		private float speedMultiplier = 1f;

		private List<CollisionWeapon> colWeapon = new List<CollisionWeapon>();

		private float prevPartMultiplier = 1f;

		private float partMultiplier = 1f;

		private void Start()
		{
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0153: Unknown result type (might be due to invalid IL or missing references)
			data = ((Component)((Component)this).transform.root).GetComponentInChildren<DataHandler>();
			data.unit.AddWasDamagedAction((Action<Rigidbody, Rigidbody>)OnUnitDamaged);
			allSkinnedMeshes = ((Component)((Component)this).transform.root).GetComponentsInChildren<SkinnedMeshRenderer>();
			if (Object.op_Implicit((Object)(object)data.weaponHandler))
			{
				if (Object.op_Implicit((Object)(object)data.weaponHandler.rightWeapon) && Object.op_Implicit((Object)(object)((Component)data.weaponHandler.rightWeapon).GetComponent<CollisionWeapon>()))
				{
					colWeapon.Add(((Component)data.weaponHandler.rightWeapon).GetComponent<CollisionWeapon>());
				}
				if (Object.op_Implicit((Object)(object)data.weaponHandler.leftWeapon) && Object.op_Implicit((Object)(object)((Component)data.weaponHandler.leftWeapon).GetComponent<CollisionWeapon>()))
				{
					colWeapon.Add(((Component)data.weaponHandler.leftWeapon).GetComponent<CollisionWeapon>());
				}
			}
			for (int i = 0; i < allSkinnedMeshes.Length; i++)
			{
				if (((Component)allSkinnedMeshes[i]).CompareTag("UnitMesh"))
				{
					mainSkinnedMesh = allSkinnedMeshes[i];
					break;
				}
			}
			if (Object.op_Implicit((Object)(object)mainSkinnedMesh))
			{
				partShapeModule = hurtParticle.shape;
				((ShapeModule)(ref partShapeModule)).skinnedMeshRenderer = mainSkinnedMesh;
			}
		}

		private void Update()
		{
		}

		public void OnUnitDamaged(Rigidbody enemyWeapon, Rigidbody enemyTorso)
		{
			if (!cooldownIsGoing)
			{
				((MonoBehaviour)this).StartCoroutine(CooldownEvents());
			}
		}

		private void ParticleEmmision()
		{
			if (stacks < maxEmmits)
			{
				partMultiplier = Mathf.Clamp(1f + data.maxHealth / data.health, 2f, (float)maxEmmits);
				stacks += (int)((float)stacks * (partMultiplier - prevPartMultiplier));
				prevPartMultiplier = partMultiplier;
			}
			hurtParticle.Emit(stacks);
		}

		private IEnumerator CooldownEvents()
		{
			if (!cooldownIsGoing)
			{
				cooldownIsGoing = true;
				if (!data.Dead)
				{
					whatHappensWhenHurt.Invoke();
					ParticleEmmision();
					MeleeBuff();
				}
			}
			yield return (object)new WaitForSeconds(cooldownTime);
			if (cooldownIsGoing)
			{
				cooldownIsGoing = false;
			}
		}

		private void MeleeBuff()
		{
			damageMultiplier = Mathf.Clamp(1f + data.maxHealth / data.health, 1f, strengthCap);
			foreach (CollisionWeapon item in colWeapon)
			{
				item.damage += item.damage * (damageMultiplier - prevDamageMultiplier);
			}
			prevDamageMultiplier = damageMultiplier;
			speedMultiplier = Mathf.Clamp(1f + data.maxHealth / data.health, 1f, speedCap);
			WeaponHandler weaponHandler = data.weaponHandler;
			weaponHandler.attackSpeedMultiplier += data.weaponHandler.attackSpeedMultiplier * (speedMultiplier - prevSpeedMultiplier);
			prevSpeedMultiplier = speedMultiplier;
		}
	}
	public class TombstonePieceTag : MonoBehaviour
	{
	}
	public class TombstonePiecesManager : MonoBehaviour
	{
		public float removeAfter;

		public float forceForward;

		public bool debug;

		private TombstonePieceTag[] pieces;

		public float rigMass = 13f;

		public float rigDrags = 3f;

		private List<MeshRenderer> meshes = new List<MeshRenderer>();

		private List<MeshCollider> collision = new List<MeshCollider>();

		public void WakeUpPieces()
		{
			if (pieces == null)
			{
				Debug.LogError((object)(((Object)((Component)this).gameObject).name.ToString() + " is erroring for some reason. You need to have pieces objects in prefab"));
			}
			else
			{
				GoForAll(removeAfter, forceForward, rigMass, rigDrags);
			}
		}

		private void Start()
		{
			pieces = ((Component)this).GetComponentsInChildren<TombstonePieceTag>();
			List<MeshRenderer> list = new List<MeshRenderer>();
			List<MeshCollider> list2 = new List<MeshCollider>();
			for (int i = 0; i < pieces.Length; i++)
			{
				MeshRenderer component = ((Component)pieces[i]).GetComponent<MeshRenderer>();
				MeshCollider component2 = ((Component)pieces[i]).GetComponent<MeshCollider>();
				list.Add(component);
				list2.Add(component2);
			}
			meshes.AddRange(list);
			collision.AddRange(list2);
			foreach (MeshRenderer mesh in meshes)
			{
				if (((Renderer)mesh).enabled)
				{
					((Renderer)mesh).enabled = false;
				}
			}
			foreach (MeshCollider item in collision)
			{
				if (((Collider)item).enabled)
				{
					((Collider)item).enabled = false;
				}
			}
		}

		private void GoForAll(float removeTime, float force, float mass, float drag)
		{
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			for (int i = 0; i < pieces.Length; i++)
			{
				((Component)pieces[i]).transform.SetParent((Transform)null, true);
				Rigidbody val = ((Component)pieces[i]).gameObject.AddComponent<Rigidbody>();
				if (Object.op_Implicit((Object)(object)val))
				{
					val.mass = mass;
					val.drag = drag;
					val.angularDrag = drag;
					val.interpolation = (RigidbodyInterpolation)1;
					RemoveAfterSeconds obj = ((Component)pieces[i]).gameObject.AddComponent<RemoveAfterSeconds>();
					obj.shrink = true;
					obj.extraRandom = 0.5f;
					obj.seconds = removeTime;
					AddForce obj2 = ((Component)pieces[i]).gameObject.AddComponent<AddForce>();
					obj2.force = new Vector3(0f, 0f, force);
					obj2.playOnStart = true;
				}
			}
			foreach (MeshRenderer mesh in meshes)
			{
				if (!((Renderer)mesh).enabled)
				{
					((Renderer)mesh).enabled = true;
				}
			}
			foreach (MeshCollider item in collision)
			{
				if (!((Collider)item).enabled)
				{
					((Collider)item).enabled = true;
				}
			}
		}
	}
	public class VampireLifeDrain : MonoBehaviour
	{
		private Unit unit;

		private DataHandler targetData;

		public ParticleSystem part;

		public Transform partForceField;

		public Transform partFollow;

		private ShapeModule shape;

		private bool setPositions;

		private DataHandler myData;

		public float healthToTakePer;

		public float rate;

		public float maxDist;

		private bool checkerOnce;

		public Transform soundChecker;

		private bool onCooldown;

		public float cooldown = 8f;

		public float healthToAddPer;

		public UnityEvent eventsForTransformation;

		private SkinnedMeshRenderer ownSkinnedMesh;

		public int neededForTransformation;

		private int counterForTransformation;

		public bool useSameHealthVal;

		private bool overdoseChecker;

		public UnityEvent eachBiteEvent;

		public bool sendDebugLog;

		public float targetMass;

		private UnitHalfHealhtEvent myCaller;

		[Header("Target Color")]
		public AnimationCurve curveTarget;

		public UnitColorInstance colorTarget;

		private void Start()
		{
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			unit = ((Component)((Component)this).transform.root).GetComponent<Unit>();
			myData = unit.data;
			shape = part.shape;
			SkinnedMeshRenderer componentInChildren = ((Component)((Component)unit).transform.root).GetComponentInChildren<SkinnedMeshRenderer>();
			if (Object.op_Implicit((Object)(object)componentInChildren) && ((Component)componentInChildren).CompareTag("UnitMesh"))
			{
				ownSkinnedMesh = componentInChildren;
			}
			myCaller = ((Component)((Component)this).transform).GetComponent<UnitHalfHealhtEvent>();
		}

		private void Update()
		{
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			if (setPositions)
			{
				((Component)partFollow).transform.position = targetData.torso.position;
				((Component)partFollow).transform.rotation = targetData.torso.rotation;
			}
			((Component)partForceField).transform.position = unit.data.head.position;
			((Component)partForceField).transform.rotation = unit.data.head.rotation;
		}

		private IEnumerator DoRemoteBite()
		{
			if (!myData.Dead && Object.op_Implicit((Object)(object)targetData))
			{
				SkinnedMeshRenderer componentInChildren = ((Component)((Component)targetData).transform.root).GetComponentInChildren<SkinnedMeshRenderer>();
				if (Object.op_Implicit((Object)(object)componentInChildren) && ((Component)componentInChildren).CompareTag("UnitMesh"))
				{
					((ShapeModule)(ref shape)).skinnedMeshRenderer = componentInChildren;
				}
				while (!overdoseChecker && !myData.Dead && !targetData.Dead && myData.health < myData.maxHealth && Vector3.Distance(myData.torso.position, targetData.torso.position) < maxDist)
				{
					if (!checkerOnce)
					{
						part.Play();
						if (!((Component)soundChecker).gameObject.activeSelf)
						{
							((Component)soundChecker).gameObject.SetActive(true);
						}
						checkerOnce = true;
					}
					if (!setPositions)
					{
						setPositions = true;
					}
					YouAndMeGetHurt();
					int num = counterForTransformation;
					eachBiteEvent.Invoke();
					counterForTransformation = num + 1;
					if (counterForTransformation > neededForTransformation)
					{
						((MonoBehaviour)this).StartCoroutine(OverdoseEvent());
					}
					yield return (object)new WaitForSeconds(rate);
				}
				if (!onCooldown)
				{
					onCooldown = true;
				}
				part.Stop();
				yield return (object)new WaitForSeconds(0.2f);
				if (setPositions)
				{
					setPositions = false;
				}
				if (((Component)soundChecker).gameObject.activeSelf)
				{
					((Component)soundChecker).gameObject.SetActive(false);
				}
				myCaller.ForceResetChecker();
				checkerOnce = false;
			}
			yield return (object)new WaitForSeconds(cooldown);
			if (onCooldown)
			{
				onCooldown = false;
			}
		}

		private void YouAndMeGetHurt()
		{
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)myData) && Object.op_Implicit((Object)(object)targetData))
			{
				((Damagable)targetData.healthHandler).TakeDamage(healthToTakePer, Vector3.down, (Unit)null, (DamageType)0);
				if (useSameHealthVal)
				{
					((Damagable)myData.healthHandler).TakeDamage(0f - healthToTakePer, Vector3.zero, (Unit)null, (DamageType)0);
				}
				if (!useSameHealthVal)
				{
					((Damagable)myData.healthHandler).TakeDamage(0f - healthToAddPer, Vector3.zero, (Unit)null, (DamageType)0);
				}
				((MonoBehaviour)this).StartCoroutine(DoColor());
			}
		}

		public void StartDrain()
		{
			if (!overdoseChecker && !onCooldown)
			{
				targetData = myData.targetData;
				if (targetData.unit.unitBlueprint.massMultiplier <= targetMass)
				{
					((MonoBehaviour)this).StartCoroutine(DoRemoteBite());
				}
			}
		}

		private IEnumerator OverdoseEvent()
		{
			((MonoBehaviour)this).StopCoroutine(DoRemoteBite());
			if (part.isPlaying)
			{
				part.Stop();
			}
			if (((Component)soundChecker).gameObject.activeSelf)
			{
				((Component)soundChecker).gameObject.SetActive(false);
			}
			eventsForTransformation.Invoke();
			if (!overdoseChecker)
			{
				overdoseChecker = true;
				if (sendDebugLog)
				{
					Debug.Log((object)("Reached " + counterForTransformation));
				}
			}
			yield break;
		}

		private IEnumerator DoColor()
		{
			UnitColorHandler componentInParent = ((Component)targetData).GetComponentInParent<UnitColorHandler>();
			if (Object.op_Implicit((Object)(object)componentInParent))
			{
				float num = 0f;
				float time = ((Keyframe)(ref curveTarget.keys[curveTarget.keys.Length - 1])).time;
				while (num < time)
				{
					componentInParent.SetColor(colorTarget, curveTarget.Evaluate(num));
				}
			}
			yield break;
		}
	}
}
namespace HalloweenMod.Tags
{
	public class Tag_SpecterBody : MonoBehaviour
	{
	}
	public class Tag_ShieldProjectileEvent : MonoBehaviour
	{
		public UnityEvent projectileHitEvent;

		public bool canDoEvents;

		public float cooldownTime;

		private bool cooldownIsGoing;

		public bool AllowEventing
		{
			get
			{
				return canDoEvents;
			}
			set
			{
				canDoEvents = value;
			}
		}

		public IEnumerator CooldownEvents()
		{
			if (!cooldownIsGoing)
			{
				cooldownIsGoing = true;
				if (canDoEvents)
				{
					projectileHitEvent.Invoke();
				}
			}
			yield return (object)new WaitForSeconds(cooldownTime);
			if (cooldownIsGoing)
			{
				cooldownIsGoing = false;
			}
		}

		public void DoEvents()
		{
			((MonoBehaviour)this).StartCoroutine(CooldownEvents());
		}
	}
}
namespace HalloweenMod.Patches
{
	[HarmonyPatch(typeof(ProjectileHit), "Hit")]
	internal class SpecterProjectileHitPatch
	{
		public static GameObject hitPoof;

		public static bool Prefix(ProjectileHit __instance, RaycastHit sentHit)
		{
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			Tag_SpecterBody tag_SpecterBody = ((!Object.op_Implicit((Object)(object)((RaycastHit)(ref sentHit)).rigidbody)) ? ((Component)((RaycastHit)(ref sentHit)).collider).gameObject.GetComponentInChildren<Tag_SpecterBody>() : ((Component)((RaycastHit)(ref sentHit)).rigidbody).gameObject.GetComponentInChildren<Tag_SpecterBody>());
			if (Object.op_Implicit((Object)(object)tag_SpecterBody))
			{
				Object.Instantiate<GameObject>(hitPoof, ((Component)__instance).transform.position, Quaternion.identity);
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(ProjectileHit), "Hit")]
	internal class HMShieldProjectilePatch
	{
		public static bool Prefix(ProjectileHit __instance, RaycastHit sentHit)
		{
			Tag_ShieldProjectileEvent tag_ShieldProjectileEvent = ((!Object.op_Implicit((Object)(object)((RaycastHit)(ref sentHit)).rigidbody)) ? ((Component)((RaycastHit)(ref sentHit)).collider).gameObject.GetComponentInChildren<Tag_ShieldProjectileEvent>() : ((Component)((RaycastHit)(ref sentHit)).rigidbody).gameObject.GetComponentInChildren<Tag_ShieldProjectileEvent>());
			if (Object.op_Implicit((Object)(object)tag_ShieldProjectileEvent) && tag_ShieldProjectileEvent.canDoEvents)
			{
				tag_ShieldProjectileEvent.DoEvents();
			}
			return true;
		}
	}
}
namespace HalloweenMod.Classes
{
	public class SoulessDeathEffect : UnitEffectBase
	{
		public UnityEvent pingEvent;

		private UnitColorHandler unitColorHandler;

		private int amountCurrent;

		public int amountPerEffect = 1;

		public int amountCap = 8;

		private SkinnedMeshRenderer[] allSkinnedMeshes;

		private SkinnedMeshRenderer mainSkinnedMesh;

		public UnityEvent deathEvent;

		public List<ParticleSystem> fullBodyParticles = new List<ParticleSystem>();

		private ShapeModule partShapeModule_start;

		private ShapeModule partShapeModule_loop;

		public Material deadMat;

		public override void DoEffect()
		{
			SetupParticle();
			((UnitEffectBase)this).Ping();
		}

		public override void Ping()
		{
			AddEffect();
			pingEvent.Invoke();
		}

		private void AddEffect()
		{
			if (amountCurrent >= amountCap)
			{
				unitColorHandler = ((Component)this).GetComponentInParent<UnitColorHandler>();
				if (Object.op_Implicit((Object)(object)unitColorHandler))
				{
					unitColorHandler.SetMaterial(deadMat);
				}
				DataHandler data = ((Component)((Component)this).transform.root).GetComponent<Unit>().data;
				if (Object.op_Implicit((Object)(object)data) && Object.op_Implicit((Object)(object)data.healthHandler) && !data.Dead)
				{
					for (int i = 0; i < data.allRigs.AllRigs.Length; i++)
					{
						data.allRigs.AllRigs[i].useGravity = false;
					}
					((UnityEventBase)data.healthHandler.deathEvent).RemoveAllListeners();
					data.healthHandler.Die((Unit)null);
				}
				deathEvent.Invoke();
			}
			else
			{
				amountCurrent += amountPerEffect;
			}
		}

		private void SetupParticle()
		{
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			allSkinnedMeshes = ((Component)((Component)this).transform.root).GetComponentsInChildren<SkinnedMeshRenderer>();
			for (int i = 0; i < allSkinnedMeshes.Length; i++)
			{
				if (((Component)allSkinnedMeshes[i]).CompareTag("UnitMesh"))
				{
					mainSkinnedMesh = allSkinnedMeshes[i];
					break;
				}
			}
			if (Object.op_Implicit((Object)(object)mainSkinnedMesh))
			{
				partShapeModule_start = fullBodyParticles[0].shape;
				partShapeModule_loop = fullBodyParticles[1].shape;
				((ShapeModule)(ref partShapeModule_start)).skinnedMeshRenderer = mainSkinnedMesh;
				((ShapeModule)(ref partShapeModule_loop)).skinnedMeshRenderer = mainSkinnedMesh;
			}
		}
	}
}
namespace HalloweenMod
{
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("terren.modHalloweenUnits", "HarrensHalloweenMod", "0.2.0")]
	public class HalloweenModInit : BaseUnityPlugin
	{
		private static readonly string code_credit;

		public static ConfigEntry<bool> ConfigFlagmanSayanMode;

		public static ConfigEntry<bool> ConfigArachnophobiaFilter;

		private void Awake()
		{
			SpookifiedNewContentManager.compabilityFlag_holiday = Chainloader.PluginInfos.ContainsKey("teamgrad.holiday");
			((MonoBehaviour)this).StartCoroutine(WaitForService());
		}

		static HalloweenModInit()
		{
			code_credit = "24th of January 2023 i finally finished working on project-side of this mod and was ready to import it into game, only to find out i lost all loader code i made sometime ago. Got tilted for some time, but now i rewrote it and (hopefully) even better, but not without help. Infinite thanks to BD, Arargd and others";
		}

		private IEnumerator WaitForService()
		{
			yield return (object)new WaitUntil((Func<bool>)(() => (Object)(object)Object.FindObjectOfType<ServiceLocator>() != (Object)null));
			yield return (object)new WaitUntil((Func<bool>)(() => ServiceLocator.GetService<ISaveLoaderService>() != null));
			LoadMod_Delayed();
		}

		private void LoadMod_Delayed()
		{
			new SpookifiedNewContentManager();
			SettingsManager();
		}

		private void SettingsManager()
		{
			ConfigFlagmanSayanMode = ((BaseUnityPlugin)this).Config.Bind<bool>("Bug", "StandardBearerSayanMode", true, "Enables true powers within Standard Bearer and it's weapon.");
			ConfigArachnophobiaFilter = ((BaseUnityPlugin)this).Config.Bind<bool>("Gameplay", "ArachnophobiaFilter", true, "Disables certain spider-like designs and replaces with less triggering appearance.");
			TerrenModUtilities.CreateSetting(true, (SettingsType)0, "BUG_HM_FLAGMANSAYANMODE", "Standard Bearer True Power", "tooltip sucks amiright", "BUG", 0f, (float)((!ConfigFlagmanSayanMode.Value) ? 1 : 0), new string[2] { "Disabled", "E N A B L E D" }, 0f, 1f).OnValueChanged += SpookifiedNewContentManager.FlagmanSayanMode_OnValueChanged;
			TerrenModUtilities.CreateSetting(true, (SettingsType)0, "SETTING_HM_SPIDERFILTER", "Arachnophobia Filter", "tooltip sucks amiright", "GAMEPLAY", 0f, (float)((!ConfigArachnophobiaFilter.Value) ? 1 : 0), new string[2] { "Disabled", "Enabled" }, 0f, 1f).OnValueChanged += SpookifiedNewContentManager.SpiderFilter_OnValueChanged;
		}

		public static void Dummy_OnValueChanged(int value)
		{
		}
	}
}
namespace HalloweenMod.Tags
{
	public class Tag_ArachnophobiaFilter : MonoBehaviour
	{
		public UnityEvent enabled;

		public UnityEvent disabled;

		public void Start()
		{
			if (SpookifiedNewContentManager.value_spiderFilter == 1)
			{
				enabled.Invoke();
			}
			if (SpookifiedNewContentManager.value_spiderFilter == 0)
			{
				disabled.Invoke();
			}
			Object.Destroy((Object)(object)this);
		}
	}
}
namespace HalloweenMod.Patches
{
	[HarmonyPatch(typeof(ModalPanel), "DelayUnlockPanel")]
	internal class ModalPanelSecretPatch
	{
		public class PatchHolder
		{
			[Header("This patch was made with modified Assembly-CSharp.dll so do not edit this. You won't be able to re-compile this anyway")]
			public static AudioClip changedClip;

			public static List<string> triggerDescriptions;

			public static IEnumerator DelayUnlockPanel_Prefix(ModalPanel __instance, float delayTime)
			{
				if (__instance.m_delayUnlock)
				{
					yield break;
				}
				__instance.m_delayUnlock = true;
				yield return (object)new WaitForSecondsRealtime(delayTime);
				__instance.m_delayUnlock = false;
				if (__instance.m_secretUnlockQueue.Count < 1)
				{
					yield break;
				}
				SecretUnlockInfo val = __instance.m_secretUnlockQueue.Dequeue();
				__instance.m_unlockText.LocaleID = val.m_description;
				__instance.m_unlockImage.sprite = val.m_icon;
				__instance.m_LastFrameOpen = Time.frameCount;
				((UnityEventBase)__instance.m_unlockButton.onClick).RemoveAllListeners();
				((UnityEvent)__instance.m_unlockButton.onClick).AddListener(new UnityAction(__instance.CloseUnlockPanel));
				__instance.m_unlockPanelObject.SetActive(true);
				__instance.m_unlockPanelObject.GetComponent<CodeAnimation>().PlayIn();
				AudioSource component = ((Component)__instance).GetComponent<AudioSource>();
				if ((Object)(object)component != (Object)null)
				{
					if (triggerDescriptions.Contains(val.m_description.ToString()))
					{
						component.PlayOneShot(changedClip);
					}
					else
					{
						component.Play();
					}
				}
				if ((int)PlayerActions.Instance.InputType == 0)
				{
					((Selectable)__instance.m_unlockButton).Select();
					if ((Object)(object)__instance.m_BackButtonImage != (Object)null)
					{
						((Behaviour)__instance.m_BackButtonImage).enabled = false;
					}
				}
				else if ((Object)(object)__instance.m_BackButtonImage != (Object)null && !((Behaviour)__instance.m_BackButtonImage).isActiveAndEnabled)
				{
					((Behaviour)__instance.m_BackButtonImage).enabled = true;
				}
				__instance.m_pauseGame = true;
			}

			static PatchHolder()
			{
				triggerDescriptions = new List<string>();
			}
		}

		[HarmonyPrefix]
		public static bool Prefix(ModalPanel __instance, ref IEnumerator __result, float delayTime)
		{
			__result = PatchHolder.DelayUnlockPanel_Prefix(__instance, delayTime);
			return false;
		}
	}
}
namespace HalloweenMod.Classes
{
	public class UndeadFlagAttack : UnitEffectBase
	{
		public enum attackType
		{
			Ground,
			AntiAir
		}

		public LayerMask m_mapMask;

		private bool isWinged;

		private bool m_initialized;

		private Unit m_unit;

		public SpawnObject spawner;

		public UnityEvent initEvent;

		public float spawnDelay;

		public float removeDelay;

		public Transform[] rangedPoints;

		public attackType m_attackType;

		public override void DoEffect()
		{
			if (!m_initialized)
			{
				m_initialized = true;
				Init();
			}
		}

		public override void Ping()
		{
			((UnitEffectBase)this).DoEffect();
		}

		private void Init()
		{
			m_unit = ((Component)((Component)this).transform.parent).GetComponentInChildren<Unit>();
			if (m_attackType == attackType.Ground)
			{
				((MonoBehaviour)this).StartCoroutine(SpawnAttackTimed());
			}
			if (m_attackType == attackType.AntiAir)
			{
				((MonoBehaviour)this).StartCoroutine(ShootAttackTimed());
			}
		}

		private void SpawnAttack()
		{
			//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_001a: 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_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)
			RaycastHit val = default(RaycastHit);
			Physics.Raycast(new Ray(m_unit.data.hip.position, Vector3.down), ref val, 150f, LayerMask.op_Implicit(m_mapMask));
			spawner.Spawn(((RaycastHit)(ref val)).point, Vector3.zero);
		}

		private IEnumerator SpawnAttackTimed()
		{
			if (Object.op_Implicit((Object)(object)m_unit) && !m_unit.data.Dead)
			{
				initEvent.Invoke();
				yield return (object)new WaitForSeconds(spawnDelay);
				SpawnAttack();
				yield return (object)new WaitForSeconds(removeDelay);
				Object.Destroy((Object)(object)((Component)this).gameObject);
			}
		}

		private IEnumerator ShootAttackTimed()
		{
			if (Object.op_Implicit((Object)(object)m_unit) && !m_unit.data.Dead)
			{
				initEvent.Invoke();
				yield return (object)new WaitForSeconds(spawnDelay);
				Transform[] array = rangedPoints;
				for (int i = 0; i < array.Length; i++)
				{
					array[i].LookAt(m_unit.data.torso, Vector3.forward);
					((Component)array[i]).GetComponent<SpawnObject>().SpawnAtObjectRotation();
				}
				yield return (object)new WaitForSeconds(removeDelay);
				Object.Destroy((Object)(object)((Component)this).gameObject);
			}
		}
	}
	public class Effect_CurseOfWeakness : UnitEffectBase
	{
		private bool m_inited;

		public UnityEvent effectEvent;

		public UnityEvent pingEvent;

		public float effectDuration;

		private Unit self;

		private WeaponHandler weaponHandler;

		[Header("Public for debug purposes")]
		public float m_holdableLeftForce;

		public float m_holdableLeftTorque;

		public float m_holdableLeftMass;

		public float m_holdableRightForce;

		public float m_holdableRightTorque;

		public float m_holdableRightMass;

		public Holdable m_holdableLeft;

		public Holdable m_holdableRight;

		public float rigMassMultiplier;

		public void Start()
		{
		}

		public override void DoEffect()
		{
			if (Object.op_Implicit((Object)(object)self))
			{
				return;
			}
			self = ((Component)((Component)this).transform.root).GetComponent<Unit>();
			if (Object.op_Implicit((Object)(object)self))
			{
				weaponHandler = self.data.weaponHandler;
				if (Object.op_Implicit((Object)(object)weaponHandler))
				{
					DoTheThing();
				}
			}
		}

		public override void Ping()
		{
			((UnitEffectBase)this).DoEffect();
			pingEvent.Invoke();
		}

		private void DoTheThing()
		{
			if (!m_inited)
			{
				m_inited = true;
				Weapon rightWeapon = weaponHandler.rightWeapon;
				if (Object.op_Implicit((Object)(object)rightWeapon))
				{
					m_holdableRight = ((Component)rightWeapon).GetComponent<Holdable>();
				}
				Weapon leftWeapon = weaponHandler.leftWeapon;
				if (Object.op_Implicit((Object)(object)leftWeapon))
				{
					m_holdableLeft = ((Component)leftWeapon).GetComponent<Holdable>();
				}
				((MonoBehaviour)this).StartCoroutine(DoWeakness());
				effectEvent.Invoke();
			}
		}

		private IEnumerator DoWeakness()
		{
			if (Object.op_Implicit((Object)(object)m_holdableLeft))
			{
				Rigidbody component = ((Component)m_holdableLeft).GetComponent<Rigidbody>();
				float mass = component.mass * rigMassMultiplier;
				m_holdableLeftForce = m_holdableLeft.pidData.proportionalForce;
				m_holdableLeftTorque = m_holdableLeft.pidData.proportionalTorque;
				m_holdableLeftMass = component.mass;
				m_holdableLeft.pidData.proportionalForce = 0f;
				m_holdableLeft.pidData.proportionalTorque = 0f;
				component.mass = mass;
			}
			if (Object.op_Implicit((Object)(object)m_holdableRight))
			{
				Rigidbody component2 = ((Component)m_holdableRight).GetComponent<Rigidbody>();
				float mass2 = component2.mass * rigMassMultiplier;
				m_holdableRightForce = m_holdableRight.pidData.proportionalForce;
				m_holdableRightTorque = m_holdableRight.pidData.proportionalTorque;
				m_holdableRightMass = component2.mass;
				m_holdableRight.pidData.proportionalForce = 0f;
				m_holdableRight.pidData.proportionalTorque = 0f;
				component2.mass = mass2;
			}
			yield return (object)new WaitForSeconds(effectDuration);
			if (Object.op_Implicit((Object)(object)m_holdableLeft))
			{
				Rigidbody component3 = ((Component)m_holdableLeft).GetComponent<Rigidbody>();
				m_holdableLeft.pidData.proportionalForce = m_holdableLeftForce;
				m_holdableLeft.pidData.proportionalTorque = m_holdableLeftTorque;
				component3.mass = m_holdableLeftMass;
			}
			if (Object.op_Implicit((Object)(object)m_holdableRight))
			{
				Rigidbody component4 = ((Component)m_holdableRight).GetComponent<Rigidbody>();
				m_holdableRight.pidData.proportionalForce = m_holdableRightForce;
				m_holdableRight.pidData.proportionalTorque = m_holdableRightTorque;
				component4.mass = m_holdableRightMass;
			}
		}
	}
}
namespace HalloweenMod
{
	public class SpookifiedNewContentManager
	{
		public static AssetBundle spookifiedContent;

		public static bool compabilityFlag_holiday;

		private string comment = "";

		public static int value_BugFlagmanSayan;

		public static int value_spiderFilter;

		public SpookifiedNewContentManager()
		{
			//IL_0192: Unknown result type (might be due to invalid IL or missing references)
			//IL_019c: Expected O, but got Unknown
			//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: 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_012b: 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_014d: Expected O, but got Unknown
			if (!Object.op_Implicit((Object)(object)spookifiedContent))
			{
				Debug.LogError((object)"---SPOOKIFIED MOD ERROR: Embedded Asset Bundle have failed to load, please reinstall mod from Thunderstore page or from mod manager. If nothing helped, contact the mod author on discord (Terren#9430)");
				return;
			}
			ContentDatabase database = ContentDatabase.Instance();
			TerrenModAssetDatabase component = spookifiedContent.LoadAsset<GameObject>("SpookifiedDatabase").GetComponent<TerrenModAssetDatabase>();
			if (!compabilityFlag_holiday)
			{
				TerrenModUtilities.DeactivateBonusUnit(spookifiedContent, component, "UNIT_ELFZOMB", "Faction_HalloweenMod");
			}
			SoundBank soundBank = ServiceLocator.GetService<SoundPlayer>().soundBank;
			SoundBank[] array = spookifiedContent.LoadAllAssets<SoundBank>();
			foreach (SoundBank val in array)
			{
				SoundBankCategory[] categories = val.Categories;
				for (int j = 0; j < categories.Length; j++)
				{
					categories[j].categoryMixerGroup = soundBank.Categories[0].categoryMixerGroup;
				}
				List<SoundBankCategory> list = soundBank.Categories.ToList();
				list.AddRange(val.Categories);
				soundBank.Categories = list.ToArray();
			}
			TerrenModUtilities.AddLocalization(component.m_localizationEntries);
			ModSceneLoadManagerGlobal.onMapUnlocks.Add(spookifiedContent.LoadAsset<GameObject>("SecretManager").GetComponent<SecretPropCollection>());
			if (compabilityFlag_holiday)
			{
				MainMenuUnlockEntry item = new MainMenuUnlockEntry
				{
					key = "HM_BONUS_ELFZOMBIE",
					description = "BONUS_ELFZOMB_DESC",
					icon = spookifiedContent.LoadAsset<Sprite>("PORTRAIT_ZELF")
				};
				ModSceneLoadManagerGlobal.mainMenuUnlocks.Add(item);
			}
			List<UnitBlueprint> list2 = new List<UnitBlueprint>();
			UnitBlueprint item2 = spookifiedContent.LoadAsset<UnitBlueprint>("CustomZombieHM");
			list2.Add(item2);
			ModSceneLoadManagerGlobal.editorUnitBases.AddRange(list2);
			SpecterProjectileHitPatch.hitPoof = (GameObject)spookifiedContent.LoadAsset("VFX_SpecterEffect");
			ModalPanelSecretPatch.PatchHolder.changedClip = spookifiedContent.LoadAsset<AudioClip>("Unit Unlocked_HalloweenMod");
			ModalPanelSecretPatch.PatchHolder.triggerDescriptions = component.m_secretDescriptionTriggers.ToList();
			new Harmony("HarmoweenMod").PatchAll();
			LoadContentIntoDatabase(database, component);
		}

		public void LoadContentIntoDatabase(ContentDatabase database, TerrenModAssetDatabase modDatabase)
		{
			TerrenModUtilities.AddFactions(database, modDatabase);
			TerrenModUtilities.AddUnitBlueprints(database, modDatabase);
			TerrenModUtilities.AddUnitCreatorPass(database, modDatabase);
			TerrenModUtilities.AddTeamColorPalette(spookifiedContent.LoadAsset<UnitEditorColorPalette>("SpookifiedTeamColors"));
			ServiceLocator.GetService<CustomContentLoaderModIO>().QuickRefresh((WorkshopContentType)0, (Action)null);
			Debug.Log((object)"---SPOOKIFIED MOD: Done loading into database, everything's up and runnin!");
		}

		static SpookifiedNewContentManager()
		{
			spookifiedContent = AssetBundle.LoadFromStream(Assembly.GetExecutingAssembly().GetManifestResourceStream("spookifiedcontent"));
			value_BugFlagmanSayan = 0;
			value_spiderFilter = 0;
		}

		public static void FlagmanSayanMode_OnValueChanged(int value)
		{
			value_BugFlagmanSayan = value;
		}

		public static void SpiderFilter_OnValueChanged(int value)
		{
			value_spiderFilter = value;
		}

		private void DebugItemGuids(TerrenModAssetDatabase items)
		{
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_011d: Unknown result type (might be due to invalid IL or missing references)
			//IL_015c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0161: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_022b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0230: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_02fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ff: Unknown result type (might be due to invalid IL or missing references)
			Debug.Log((object)"---Start printing items...");
			Debug.Log((object)"---PROPS...");
			Dictionary<string, string> dictionary = new Dictionary<string, string>();
			DatabaseID gUID;
			for (int i = 0; i < items.m_props.Count; i++)
			{
				PropItem component = items.m_props[i].GetComponent<PropItem>();
				Debug.Log((object)((CharacterItem)component).Entity.Name.ToString());
				gUID = ((CharacterItem)component).Entity.GUID;
				if (dictionary.ContainsKey(((object)(DatabaseID)(ref gUID)).ToString()))
				{
					Debug.Log((object)("Have faulty guid: " + ((CharacterItem)component).Entity.Name.ToString()));
					continue;
				}
				gUID = ((CharacterItem)component).Entity.GUID;
				dictionary.Add(((object)(DatabaseID)(ref gUID)).ToString(), ((CharacterItem)component).Entity.Name.ToString());
			}
			dictionary.Clear();
			Debug.Log((object)"---WEPONS...");
			for (int j = 0; j < items.m_weapons.Count; j++)
			{
				WeaponItem component2 = items.m_weapons[j].GetComponent<WeaponItem>();
				Debug.Log((object)((CharacterItem)component2).Entity.Name.ToString());
				gUID = ((CharacterItem)component2).Entity.GUID;
				if (dictionary.ContainsKey(((object)(DatabaseID)(ref gUID)).ToString()))
				{
					Debug.Log((object)("Have faulty guid: " + ((CharacterItem)component2).Entity.Name.ToString()));
					continue;
				}
				gUID = ((CharacterItem)component2).Entity.GUID;
				dictionary.Add(((object)(DatabaseID)(ref gUID)).ToString(), ((CharacterItem)component2).Entity.Name.ToString());
			}
			dictionary.Clear();
			Debug.Log((object)"---PROJIES...");
			for (int k = 0; k < items.m_projectiles.Count; k++)
			{
				ProjectileEntity component3 = items.m_projectiles[k].GetComponent<ProjectileEntity>();
				Debug.Log((object)component3.Entity.Name.ToString());
				gUID = component3.Entity.GUID;
				if (dictionary.ContainsKey(((object)(DatabaseID)(ref gUID)).ToString()))
				{
					Debug.Log((object)("Have faulty guid: " + component3.Entity.Name.ToString()));
					continue;
				}
				gUID = component3.Entity.GUID;
				dictionary.Add(((object)(DatabaseID)(ref gUID)).ToString(), component3.Entity.Name.ToString());
			}
			dictionary.Clear();
			Debug.Log((object)"---MOVES...");
			for (int l = 0; l < items.m_combatMoves.Count; l++)
			{
				SpecialAbility component4 = items.m_combatMoves[l].GetComponent<SpecialAbility>();
				Debug.Log((object)((CharacterItem)component4).Entity.Name.ToString());
				gUID = ((CharacterItem)component4).Entity.GUID;
				if (dictionary.ContainsKey(((object)(DatabaseID)(ref gUID)).ToString()))
				{
					Debug.Log((object)("Have faulty guid: " + ((CharacterItem)component4).Entity.Name.ToString()));
					continue;
				}
				gUID = ((CharacterItem)component4).Entity.GUID;
				dictionary.Add(((object)(DatabaseID)(ref gUID)).ToString(), ((CharacterItem)component4).Entity.Name.ToString());
			}
			dictionary.Clear();
			Debug.Log((object)"---Done printing guids for items");
		}
	}
}
namespace HalloweenMod.Classes
{
	public class ArmorWraithSummon : MonoBehaviour
	{
		private List<Unit> wraiths = new List<Unit>();

		public Unit u;

		public Transform[] spawnPoints;

		public Transform linePoint;

		public UnitBlueprint bp_mainAttacker;

		public Transform unitHip;

		public void Go()
		{
			//IL_0016: 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_0027: Unknown result type (might be due to invalid IL or missing references)
			Transform[] array = spawnPoints;
			Unit val2 = default(Unit);
			foreach (Transform val in array)
			{
				bp_mainAttacker.Spawn(val.position, val.rotation, u.Team, ref val2, 1f, false, false, 0, (UnitPoolInfo?)null);
				Rope[] componentsInChildren = ((Component)val2).GetComponentsInChildren<Rope>();
				for (int j = 0; j < componentsInChildren.Length; j++)
				{
					componentsInChildren[j].positionobject2 = linePoint;
				}
				wraiths.Add(val2);
			}
		}

		public void RemoveUnit(Unit guy)
		{
			wraiths.Remove(guy);
		}

		private void Start()
		{
			u = ((Component)((Component)this).transform.root).GetComponentInParent<Unit>();
			unitHip = ((Component)u.data.hip).transform;
		}
	}
	public class ArmorWraith_Behavior : MonoBehaviour
	{
		[HideInInspector]
		public ArmorWraithSummon master;

		public Unit unit;

		public float rebuildDelay;

		public UnityEvent breakEvent;

		public UnityEvent deadEvent;

		public UnityEvent rebuildEvent;

		public UnityEvent doneEvent;

		private bool died;

		public Collider[] unitCols;

		public float breakHealth;

		private float breakHealthMax;

		[Tooltip("Speed Multiplier")]
		public float rebuildTime;

		private bool isBroken;

		public AnimationCurve returnCurve;

		[Tooltip("DEPREKATED")]
		public List<Rigidbody> breakRigs = new List<Rigidbody>();

		[Tooltip("DEPREKATED")]
		public List<Rigidbody> unitRigs = new List<Rigidbody>();

		public Vector2 randomRebuildSpeed;

		public List<ParticleSystem> allParticles = new List<ParticleSystem>();

		public List<TrailRenderer> allTrails = new List<TrailRenderer>();

		private List<Tag_ArmorWraithWeapon> armorWraithWeapons = new List<Tag_ArmorWraithWeapon>();

		public List<ConfigurableJoint> joints = new List<ConfigurableJoint>();

		public void SetMaster(ArmorWraithSummon transform)
		{
			master = transform;
		}

		private void Start()
		{
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Expected O, but got Unknown
			breakHealth = unit.data.maxHealth;
			breakHealthMax = breakHealth;
			Weapon leftWeapon = unit.data.weaponHandler.leftWeapon;
			Weapon rightWeapon = unit.data.weaponHandler.rightWeapon;
			if (Object.op_Implicit((Object)(object)leftWeapon) && Object.op_Implicit((Object)(object)((Component)leftWeapon).GetComponent<Tag_ArmorWraithWeapon>()))
			{
				armorWraithWeapons.Add(((Component)leftWeapon).GetComponent<Tag_ArmorWraithWeapon>());
			}
			if (Object.op_Implicit((Object)(object)rightWeapon) && Object.op_Implicit((Object)(object)((Component)rightWeapon).GetComponent<Tag_ArmorWraithWeapon>()))
			{
				armorWraithWeapons.Add(((Component)rightWeapon).GetComponent<Tag_ArmorWraithWeapon>());
			}
			unit.data.healthHandler.deathEvent.AddListener(new UnityAction(Death));
		}

		public void Death()
		{
			if (!isBroken)
			{
				((MonoBehaviour)this).StartCoroutine(BreakApartDead());
				return;
			}
			((MonoBehaviour)this).StopAllCoroutines();
			((MonoBehaviour)this).StartCoroutine(BreakApartDead());
		}

		public IEnumerator BreakApartNormal()
		{
			breakEvent.Invoke();
			FreezeUnit(freeze: true);
			if (!isBroken)
			{
				isBroken = true;
			}
			for (int i = 0; i < breakRigs.Count; i++)
			{
				breakRigs[i].isKinematic = false;
				((Component)breakRigs[i]).GetComponentInChildren<Collider>().enabled = true;
			}
			for (int j = 0; j < armorWraithWeapons.Count; j++)
			{
				armorWraithWeapons[j].weaponCollider.GetComponent<Collider>().enabled = false;
				armorWraithWeapons[j].dropRig.isKinematic = false;
				armorWraithWeapons[j].dropCollider.GetComponent<Collider>().enabled = true;
			}
			yield return (object)new WaitForSeconds(rebuildDelay);
			float time = ((Keyframe)(ref returnCurve.keys[returnCurve.keys.Length - 1])).time;
			float c = 0f;
			rebuildEvent.Invoke();
			while (c < time)
			{
				for (int k = 0; k < breakRigs.Count; k++)
				{
					breakRigs[k].isKinematic = true;
					((Component)breakRigs[k]).transform.localPosition = Vector3.Lerp(((Component)breakRigs[k]).transform.localPosition, Vector3.zero, returnCurve.Evaluate(c) * Random.Range(randomRebuildSpeed.x, randomRebuildSpeed.y));
					((Component)breakRigs[k]).transform.localRotation = Quaternion.Lerp(((Component)breakRigs[k]).transform.localRotation, Quaternion.identity, returnCurve.Evaluate(c) * Random.Range(randomRebuildSpeed.x, randomRebuildSpeed.y));
				}
				for (int l = 0; l < armorWraithWeapons.Count; l++)
				{
					((Component)armorWraithWeapons[l].dropRig).transform.localPosition = Vector3.Lerp(((Component)armorWraithWeapons[l].dropRig).transform.localPosition, Vector3.zero, returnCurve.Evaluate(c) * Random.Range(randomRebuildSpeed.x, randomRebuildSpeed.y));
					((Component)armorWraithWeapons[l]).transform.localRotation = Quaternion.Lerp(((Component)armorWraithWeapons[l]).transform.localRotation, Quaternion.identity, returnCurve.Evaluate(c) * Random.Range(randomRebuildSpeed.x, randomRebuildSpeed.y));
				}
				c += Time.deltaTime * rebuildTime;
				yield return null;
			}
			breakHealthMax = breakHealth;
			FreezeUnit(freeze: false);
			for (int m = 0; m < armorWraithWeapons.Count; m++)
			{
				armorWraithWeapons[m].weaponCollider.GetComponent<Collider>().enabled = true;
				armorWraithWeapons[m].dropRig.isKinematic = true;
				armorWraithWeapons[m].dropCollider.GetComponent<Collider>().enabled = false;
			}
			for (int n = 0; n < breakRigs.Count; n++)
			{
				((Component)breakRigs[n]).GetComponentInChildren<Collider>().enabled = false;
			}
			doneEvent.Invoke();
			yield return (object)new WaitForSeconds(1f);
			if (isBroken)
			{
				isBroken = false;
			}
		}

		public IEnumerator BreakApartDead()
		{
			deadEvent.Invoke();
			FreezeUnit(freeze: true);
			yield break;
		}

		private void FreezeUnit(bool freeze)
		{
			for (int i = 0; i < unitRigs.Count; i++)
			{
				unitRigs[i].isKinematic = freeze;
			}
			if (!freeze)
			{
				for (int j = 0; j < unitCols.Length; j++)
				{
					if (!unitCols[j].enabled)
					{
						unitCols[j].enabled = true;
					}
				}
				return;
			}
			for (int k = 0; k < unitCols.Length; k++)
			{
				if (unitCols[k].enabled)
				{
					unitCols[k].enabled = false;
				}
			}
		}

		public void TakeDamage(float dmg)
		{
			if (!isBroken)
			{
				breakHealth -= dmg;
				breakHealth = Mathf.Clamp(breakHealth, float.NegativeInfinity, breakHealthMax);
				if (breakHealth <= 0f)
				{
					((MonoBehaviour)this).StartCoroutine(BreakApartJoints());
				}
			}
		}

		public void ManageParticles(bool hide)
		{
			if (!hide)
			{
				for (int i = 0; i < allParticles.Count; i++)
				{
					allParticles[i].Play();
				}
				for (int j = 0; j < allTrails.Count; j++)
				{
					allTrails[j].emitting = false;
				}
			}
			else
			{
				for (int k = 0; k < allParticles.Count; k++)
				{
					allParticles[k].Stop();
				}
				for (int l = 0; l < allTrails.Count; l++)
				{
					allTrails[l].emitting = true;
				}
			}
		}

		public IEnumerator BreakApartJoints()
		{
			breakEvent.Invoke();
			if (!isBroken)
			{
				isBroken = true;
			}
			for (int i = 0; i < joints.Count; i++)
			{
				joints[i].xMotion = (ConfigurableJointMotion)2;
				joints[i].yMotion = (ConfigurableJointMotion)2;
				joints[i].zMotion = (ConfigurableJointMotion)2;
			}
			yield return (object)new WaitForSeconds(rebuildDelay);
			for (int j = 0; j < joints.Count; j++)
			{
				joints[j].xMotion = (ConfigurableJointMotion)0;
				joints[j].yMotion = (ConfigurableJointMotion)0;
				joints[j].zMotion = (ConfigurableJointMotion)0;
			}
			rebuildEvent.Invoke();
			breakHealthMax = breakHealth;
			doneEvent.Invoke();
			yield return (object)new WaitForSeconds(1f);
			if (isBroken)
			{
				isBroken = false;
			}
		}
	}
}
namespace HalloweenMod.Tags
{
	public class Tag_ArmorWraithBodyPart : MonoBehaviour
	{
		public Transform originalTransform;

		private void Start()
		{
			originalTransform = ((Component)this).transform;
		}
	}
}
namespace HalloweenMod.Classes
{
	public class WarlockHandDraw : MonoBehaviour
	{
		public bool drawOnStart;

		[HideInInspector]
		public bool drawn;

		public bool callEvents = true;

		public UnityEvent DrawEvent;

		[HideInInspector]
		public bool stopAim;

		private bool hasHand;

		private DataHandler data;

		private Transform target;

		private Transform startPos;

		private Transform originalParent;

		private ConfigurableJoint handJoint;

		private Rigidbody handToCheck;

		private HealthHandler healthHandler;

		private RangeWeapon bow;

		private ConfigurableJoint[] handjoints;

		private void Start()
		{
			if (drawOnStart)
			{
				GoToHand(callEvents);
			}
		}

		public void GoToHand(bool callEvents)
		{
			if (!hasHand)
			{
				bow = ((Component)((Component)this).transform).GetComponentInParent<RangeWeapon>();
				if ((Object)(object)bow == (Object)null)
				{
					return;
				}
				startPos = ((Component)((Component)((Component)bow).transform).GetComponentInChildren<StringStartPos>()).transform;
				originalParent = ((Component)this).transform.parent;
				target = ((Component)((Component)((Component)this).transform.root).GetComponentInChildren<HandRight>()).transform;
				healthHandler = ((Component)((Component)this).transform.root).GetComponentInChildren<HealthHandler>();
				if (Object.op_Implicit((Object)(object)healthHandler))
				{
					healthHandler.AddDieAction((Action)ResetPos);
				}
				handjoints = ((Component)((Component)bow).transform).GetComponents<ConfigurableJoint>();
				for (int i = 0; i < handjoints.Length; i++)
				{
					if (handjoints.Length > 1)
					{
						handToCheck = ((Joint)handjoints[i]).connectedBody;
						if (Object.op_Implicit((Object)(object)handToCheck) && Object.op_Implicit((Object)(object)((Component)((Component)handToCheck).transform).GetComponent<HandLeft>()))
						{
							handJoint = handjoints[i];
							hasHand = true;
						}
					}
				}
			}
			if (drawn || !hasHand)
			{
				return;
			}
			if (Object.op_Implicit((Object)(object)handJoint))
			{
				handJoint.yMotion = (ConfigurableJointMotion)2;
			}
			if (Object.op_Implicit((Object)(object)target))
			{
				((Component)this).transform.SetParent(target);
				if (callEvents)
				{
					DrawEvent.Invoke();
				}
			}
			drawn = true;
		}

		public void GoToStartPos()
		{
			//IL_003f: 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_006b: Unknown result type (might be due to invalid IL or missing references)
			if (drawn)
			{
				if (Object.op_Implicit((Object)(object)handJoint))
				{
					handJoint.yMotion = (ConfigurableJointMotion)0;
				}
				((Component)this).transform.SetParent(originalParent);
				((Component)this).transform.localPosition = startPos.localPosition;
				((Component)this).transform.localRotation = startPos.localRotation;
				((Component)this).transform.localScale = startPos.localScale;
				drawn = false;
			}
		}

		public void ResetPos()
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			((Component)this).transform.SetParent(originalParent);
			((Component)this).transform.localPosition = startPos.localPosition;
			((Component)this).transform.localRotation = startPos.localRotation;
			if (Object.op_Implicit((Object)(object)handJoint))
			{
				handJoint.yMotion = (ConfigurableJointMotion)0;
			}
			stopAim = true;
			drawn = false;
		}
	}
}
namespace HalloweenMod.Patches
{
	[HarmonyPatch(typeof(HealthHandler), "TakeDamage")]
	internal class ArmorWraithTakeHit
	{
		public static bool Prefix(ProjectileHit __instance, float damage, Vector3 direction, Unit damager = null, DamageType damageType = 0)
		{
			ArmorWraith_Behavior componentInChildren = ((Component)((Component)__instance).transform.root).GetComponentInChildren<ArmorWraith_Behavior>();
			if (Object.op_Implicit((Object)(object)componentInChildren))
			{
				componentInChildren.TakeDamage(damage);
				return false;
			}
			return true;
		}
	}
}
namespace HalloweenMod.Tags
{
	public class Tag_ArmorWraithWeapon : MonoBehaviour
	{
		public Rigidbody dropRig;

		public GameObject dropCollider;

		public GameObject weaponCollider;
	}
}
namespace HalloweenMod.Classes
{
	public class ProjectileFlyEater : ProjectileHitEffect
	{
		public float force;

		private Unit currentTarget;

		private SphereCastUnitsTarget target;

		private bool homing;

		public float velocityPreditction;

		public Transform mid;

		public UnityEvent eventOnBounce;

		private ProjectileHit phit;

		public UnityEvent eventOnFail;

		private void Start()
		{
			phit = ((Component)this).GetComponent<ProjectileHit>();
			target = ((Component)this).GetComponent<SphereCastUnitsTarget>();
		}

		public override bool DoEffect(HitData hit)
		{
			//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)
			if (((Component)hit.transform).gameObject.layer != LayerMask.NameToLayer("Map"))
			{
				return false;
			}
			eventOnBounce.Invoke();
			Unit unitTarget = target.GetUnitTarget();
			if ((Object)(object)unitTarget != (Object)null)
			{
				currentTarget = unitTarget;
				ResetProjectile();
				phit.move.velocity = Vector3.zero;
				phit.move.UpdateVelMultiplier(2f);
				if (!homing)
				{
					phit.move.gravity = 0f;
					homing = true;
				}
				return false;
			}
			eventOnFail.Invoke();
			return true;
		}

		private void Update()
		{
			//IL_0026: 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_0050: 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_0060: 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_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: 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_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: 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_00a2: Unknown result type (might be due to invalid IL or missing references)
			if (homing)
			{
				if ((Object)(object)currentTarget != (Object)null)
				{
					MoveTransform move = phit.move;
					Vector3 velocity = move.velocity;
					Vector3 val = currentTarget.data.mainRig.position + currentTarget.data.mainRig.velocity * velocityPreditction - ((Component)this).transform.position;
					move.velocity = velocity + ((Vector3)(ref val)).normalized * force * Time.deltaTime * force;
				}
				else
				{
					homing = false;
				}
			}
		}

		public void ResetProjectile()
		{
			phit.stick.stuck = false;
			phit.stick.target = null;
			phit.stick.targetRig = null;
			phit.done = false;
			phit.allowRepeat = true;
			if (Object.op_Implicit((Object)(object)phit.move) && Object.op_Implicit((Object)(object)phit.stick))
			{
				((Behaviour)phit.move).enabled = true;
			}
			if (Object.op_Implicit((Object)(object)phit.trail))
			{
				((Behaviour)phit.trail).enabled = true;
			}
		}
	}
	public class ManflyWingControl : MonoBehaviour
	{
		public float offDelay;

		public string onAnim;

		public string offAnim;

		private DataHandler data;

		private bool wingsEnabled;

		private Wings wings;

		public PlayAnimationByEvent m_animation;

		private void Start()
		{
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Expected O, but got Unknown
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Expected O, but got Unknown
			data = ((Component)((Component)this).transform.root).GetComponentInChildren<DataHandler>();
			wings = ((Component)this).GetComponent<Wings>();
			if ((Object)(object)data.weaponHandler.rightWeapon != (Object)null)
			{
				RangeWeapon val = default(RangeWeapon);
				((Component)data.weaponHandler.rightWeapon).TryGetComponent<RangeWeapon>(ref val);
				if ((Object)(object)val != (Object)null)
				{
					val.AddAttackCallRecievedAction((Action)Enable);
					val.shootEndEvent.AddListener(new UnityAction(Disable));
				}
			}
			if ((Object)(object)data.weaponHandler.leftWeapon != (Object)null)
			{
				RangeWeapon val2 = default(RangeWeapon);
				((Component)data.weaponHandler.leftWeapon).TryGetComponent<RangeWeapon>(ref val2);
				if ((Object)(object)val2 != (Object)null)
				{
					val2.AddAttackCallRecievedAction((Action)Enable);
					val2.shootEndEvent.AddListener(new UnityAction(Disable));
				}
			}
		}

		public void Enable()
		{
			if (!wingsEnabled)
			{
				wingsEnabled = true;
				wings.EnableFlight();
				m_animation.PlayForAll(onAnim);
			}
		}

		public void Disable()
		{
			if (wingsEnabled)
			{
				wingsEnabled = false;
				((MonoBehaviour)this).StartCoroutine(DisableDelay());
			}
		}

		private IEnumerator DisableDelay()
		{
			yield return (object)new WaitForSeconds(offDelay);
			DisableWings();
		}

		private void DisableWings()
		{
			wings.DiableFlight();
			m_animation.PlayForAll(offAnim);
		}
	}
	public class Effect_Stinky : UnitEffectBase
	{
		public float forceTorque = 100f;

		public float forceAcceler = 2000f;

		public float removeTime = 0.5f;

		[SerializeField]
		private int fliesAttached;

		private float timer;

		public float rate;

		public float damagePerFly;

		public override void DoEffect()
		{
			((UnitEffectBase)this).Ping();
		}

		public override void Ping()
		{
			((MonoBehaviour)this).StartCoroutine(AddFlyBite());
		}

		private void FixedUpdate()
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			if (fliesAttached > 0)
			{
				for (int i = 0; i < ((Component)((Component)((Component)this).transform.root).GetComponent<Unit>().data).GetComponent<RigidbodyHolder>().AllRigs.Length; i++)
				{
					Rigidbody obj = ((Component)((Component)((Component)this).transform.root).GetComponent<Unit>().data).GetComponent<RigidbodyHolder>().AllRigs[i];
					obj.AddTorque(Random.insideUnitSphere * (forceTorque * Mathf.Cos(Time.time * 10f)), (ForceMode)0);
					obj.AddTorque(Random.insideUnitSphere * (forceAcceler * Mathf.Cos(Time.time * 10f)), (ForceMode)5);
				}
			}
		}

		private IEnumerator AddFlyBite()
		{
			fliesAttached++;
			yield return (object)new WaitForSeconds(removeTime);
			if (fliesAttached > 0)
			{
				fliesAttached--;
			}
		}

		public void Update()
		{
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			if (fliesAttached <= 0)
			{
				return;
			}
			HealthHandler componentInParent = ((Component)((Component)this).transform).GetComponentInParent<HealthHandler>();
			if (Object.op_Implicit((Object)(object)componentInParent))
			{
				timer += 1f * Time.deltaTime;
				if (timer >= rate)
				{
					timer = 0f;
					((Damagable)componentInParent).TakeDamage((float)fliesAttached * damagePerFly, Vector3.down, (Unit)null, (DamageType)0);
				}
			}
		}
	}
	public class SayanParticles : MonoBehaviour
	{
		private void Start()
		{
			if (!Application.isEditor && Bugs._DLC_ACTIVATED && SpookifiedNewContentManager.value_BugFlagmanSayan == 1)
			{
				((Component)this).GetComponentInChildren<ParticleSystem>().Play();
			}
		}
	}
}