Decompiled source of ChaosPoppycarsCards v1.4.2

ChaosPoppycarsCards.dll

Decompiled 2 weeks 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.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using CPCCardInfostuffs;
using CPCTabInfoSTATS;
using CardChoiceSpawnUniqueCardPatch.CustomCategories;
using CardThemeLib;
using ChaosPoppycarsCards.Cards;
using ChaosPoppycarsCards.Cards.Minecrafter;
using ChaosPoppycarsCards.Extensions;
using ChaosPoppycarsCards.Lightsaber;
using ChaosPoppycarsCards.Lightsaber.Extensions;
using ChaosPoppycarsCards.MonoBehaviours;
using ChaosPoppycarsCards.MonoBehaviours.SodaMonos;
using ChaosPoppycarsCards.Utilities;
using ClassesManagerReborn;
using ClassesManagerReborn.Util;
using DoggoBonk.MonoBehaviors.Squish.Lanky;
using DoggoBonk.MonoBehaviors.Squish.Wide;
using HarmonyLib;
using InControl;
using Jotunn.Utils;
using Microsoft.CodeAnalysis;
using ModdingUtils.Extensions;
using ModdingUtils.GameModes;
using ModdingUtils.MonoBehaviours;
using ModdingUtils.RoundsEffects;
using ModdingUtils.Utils;
using Nullmanager;
using PSA.Extensions;
using Photon.Pun;
using PlayerActionsHelper;
using PlayerActionsHelper.Extensions;
using PlayerTimeScale;
using RarityLib.Utils;
using SimulationChamber;
using Sonigon;
using TMPro;
using TabInfo.Utils;
using UnboundLib;
using UnboundLib.Cards;
using UnboundLib.Extensions;
using UnboundLib.GameModes;
using UnboundLib.Networking;
using UnboundLib.Utils;
using UnboundLib.Utils.UI;
using UnityEngine;
using UnityEngine.Events;
using WWMO.MonoBehaviours;
using WillsWackyManagers.Utils;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.1", FrameworkDisplayName = ".NET Framework 4.7.1")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
public class CardHolder : MonoBehaviour
{
	public List<GameObject> Cards;

	public List<GameObject> HiddenCards;

	internal void RegisterCards()
	{
		foreach (GameObject card in Cards)
		{
			CustomCard.RegisterUnityCard(card, "CPC", card.GetComponent<CardInfo>().cardName, true, (Action<CardInfo>)null);
		}
		foreach (GameObject hiddenCard in HiddenCards)
		{
		}
	}
}
public class CursorGun : MonoBehaviour
{
	private Player player;

	private Gun gun;

	private float cd = 0f;

	public SimulatedGun[] savedGuns = (SimulatedGun[])(object)new SimulatedGun[1];

	public static GameObject _stopRecursionObj;

	public static GameObject StopRecursionObj
	{
		get
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Expected O, but got Unknown
			if ((Object)(object)_stopRecursionObj == (Object)null)
			{
				_stopRecursionObj = new GameObject("A_StopRecursion", new Type[1] { typeof(StopRecursion) });
				Object.DontDestroyOnLoad((Object)(object)_stopRecursionObj);
			}
			return _stopRecursionObj;
		}
	}

	public static ObjectsToSpawn[] StopRecursionSpawn => (ObjectsToSpawn[])(object)new ObjectsToSpawn[1]
	{
		new ObjectsToSpawn
		{
			AddToProjectile = StopRecursionObj
		}
	};

	public void Start()
	{
		//IL_006e: Unknown result type (might be due to invalid IL or missing references)
		player = ((Component)this).GetComponentInParent<Player>();
		gun = player.data.weaponHandler.gun;
		Gun obj = gun;
		obj.ShootPojectileAction = (Action<GameObject>)Delegate.Combine(obj.ShootPojectileAction, new Action<GameObject>(OnShootProjectileAction));
		if ((Object)(object)savedGuns[0] == (Object)null)
		{
			savedGuns[0] = new GameObject("Cursor_One").AddComponent<SimulatedGun>();
		}
	}

	public void OnShootProjectileAction(GameObject obj)
	{
		//IL_010e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0113: 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_013b: 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)
		if (obj.GetComponentsInChildren<StopRecursion>().Length == 0)
		{
			SimulatedGun val = savedGuns[0];
			val.CopyGunStatsExceptActions(gun);
			val.CopyAttackAction(gun);
			val.CopyShootProjectileAction(gun);
			((Gun)val).ShootPojectileAction = (Action<GameObject>)Delegate.Remove(((Gun)val).ShootPojectileAction, new Action<GameObject>(OnShootProjectileAction));
			((Gun)val).numberOfProjectiles = 1;
			((Gun)val).bursts = 0;
			((Gun)val).damage = ((Gun)val).damage * 0.5f;
			((Gun)val).objectsToSpawn = ((Gun)val).objectsToSpawn.Concat(StopRecursionSpawn).ToArray();
			if ((player.data.view.IsMine || PhotonNetwork.OfflineMode) && cd <= 0f)
			{
				cd += 0.15f;
				val.SimulatedAttack(player.playerID, new Vector3(MainCam.instance.cam.ScreenToWorldPoint(Input.mousePosition).x, MainCam.instance.cam.ScreenToWorldPoint(Input.mousePosition).y, 0f), new Vector3(player.data.input.aimDirection.x, player.data.input.aimDirection.y, 0f), 1f, 1f, (Transform)null, false);
			}
		}
	}

	public void Update()
	{
		if (cd >= 0f)
		{
			cd -= TimeHandler.deltaTime;
		}
	}

	public void OnDestroy()
	{
		Gun obj = gun;
		obj.ShootPojectileAction = (Action<GameObject>)Delegate.Remove(obj.ShootPojectileAction, new Action<GameObject>(OnShootProjectileAction));
		Object.Destroy((Object)(object)savedGuns[0]);
	}
}
namespace CPCTabInfoSTATS
{
	public class TabinfoInterface
	{
		public static void Setup()
		{
			StatCategory val = TabInfoManager.RegisterCategory("Other Stats", 0);
			TabInfoManager.RegisterStat(val, "Max Dashes", (Func<Player, bool>)((Player p) => p.data.stats.GetAdditionalData().dashes != 0), (Func<Player, string>)((Player p) => $"{p.data.stats.GetAdditionalData().dashes:F0}"));
			TabInfoManager.RegisterStat(val, "Blocks are", (Func<Player, bool>)((Player p) => p.data.stats.GetAdditionalData().blockMover && !p.data.stats.GetAdditionalData().blockPush), (Func<Player, string>)((Player p) => "pulling"));
			TabInfoManager.RegisterStat(val, "Blocks <b>are</b>", (Func<Player, bool>)((Player p) => p.data.stats.GetAdditionalData().blockMover && p.data.stats.GetAdditionalData().blockPush), (Func<Player, string>)((Player p) => "pushing"));
			StatCategory val2 = TabInfoManager.RegisterCategory("Minecraft Stats", 1);
			TabInfoManager.RegisterStat(val2, "Totems", (Func<Player, bool>)((Player p) => p.data.stats.GetAdditionalData().totems != 0), (Func<Player, string>)((Player p) => $"{p.data.stats.GetAdditionalData().totems:F0}"));
			TabInfoManager.RegisterStat(val2, "Remaining Totems", (Func<Player, bool>)((Player p) => p.data.stats.GetAdditionalData().remainingTotems != 0), (Func<Player, string>)((Player p) => $"{p.data.stats.GetAdditionalData().remainingTotems:F0}"));
			TabInfoManager.RegisterStat(val2, "Glowstone", (Func<Player, bool>)((Player p) => p.data.stats.GetAdditionalData().Glowstone > 0), (Func<Player, string>)((Player p) => $"{p.data.stats.GetAdditionalData().Glowstone:F0}"));
			TabInfoManager.RegisterStat(val2, "Redstone", (Func<Player, bool>)((Player p) => p.data.stats.GetAdditionalData().Redstone > 0), (Func<Player, string>)((Player p) => $"{p.data.stats.GetAdditionalData().Redstone:F0}"));
			StatCategory val3 = TabInfoManager.RegisterCategory("Critical Hit Stats", 5);
			TabInfoManager.RegisterStat(val3, "Crit Damage", (Func<Player, bool>)((Player p) => p.data.weaponHandler.gun.GetAdditionalData().criticalHitDamage1 != 1f), (Func<Player, string>)((Player p) => $"{(p.data.weaponHandler.gun.GetAdditionalData().criticalHitDamage1 - 1f) * 100f:F0}%"));
			TabInfoManager.RegisterStat(val3, "Crit Chance", (Func<Player, bool>)((Player p) => p.data.weaponHandler.gun.GetAdditionalData().criticalHitChance1 != 0f), (Func<Player, string>)((Player p) => $"{p.data.weaponHandler.gun.GetAdditionalData().criticalHitChance1 * 100f:F0}%"));
			TabInfoManager.RegisterStat(val3, "Crit Slow", (Func<Player, bool>)((Player p) => p.data.weaponHandler.gun.GetAdditionalData().CritSlow > 0f), (Func<Player, string>)((Player p) => $"{p.data.weaponHandler.gun.GetAdditionalData().CritSlow * 100f:F0}%"));
			TabInfoManager.RegisterStat(val3, "Crit Bounces", (Func<Player, bool>)((Player p) => p.data.weaponHandler.gun.GetAdditionalData().criticalHitBounces != 0), (Func<Player, string>)((Player p) => $"{p.data.weaponHandler.gun.GetAdditionalData().criticalHitBounces:F0}"));
			TabInfoManager.RegisterStat(val3, "Damage on Bounce when you Crit", (Func<Player, bool>)((Player p) => p.data.weaponHandler.gun.GetAdditionalData().criticalHitDamageOnBounce > 0f), (Func<Player, string>)((Player p) => $"{p.data.weaponHandler.gun.GetAdditionalData().criticalHitDamageOnBounce * 100f:F0}%"));
			TabInfoManager.RegisterStat(val3, "Guranteed Crits", (Func<Player, bool>)((Player p) => p.data.weaponHandler.gun.GetAdditionalData().guranteedCrits), (Func<Player, string>)((Player p) => "True"));
			TabInfoManager.RegisterStat(val3, "Crit Bullet Speed", (Func<Player, bool>)((Player p) => p.data.weaponHandler.gun.GetAdditionalData().criticalBulletSpeed > 1f), (Func<Player, string>)((Player p) => $"{(p.data.weaponHandler.gun.GetAdditionalData().criticalBulletSpeed - 1f) * 100f:F0}%"));
			TabInfoManager.RegisterStat(val3, "Crit Simulation Speed", (Func<Player, bool>)((Player p) => p.data.weaponHandler.gun.GetAdditionalData().criticalSimulationSpeed > 1f), (Func<Player, string>)((Player p) => $"{(p.data.weaponHandler.gun.GetAdditionalData().criticalSimulationSpeed - 1f) * 100f:F0}%"));
			TabInfoManager.RegisterStat(val3, "Unblockable Crits", (Func<Player, bool>)((Player p) => p.data.weaponHandler.gun.GetAdditionalData().unblockableCrits), (Func<Player, string>)((Player p) => "True"));
			TabInfoManager.RegisterStat(val3, "Blocking Crits", (Func<Player, bool>)((Player p) => p.data.weaponHandler.gun.GetAdditionalData().BlockingCrits), (Func<Player, string>)((Player p) => "True"));
			TabInfoManager.RegisterStat(val3, "Crit Heal", (Func<Player, bool>)((Player p) => p.data.weaponHandler.gun.GetAdditionalData().criticalHeal > 0f), (Func<Player, string>)((Player p) => $"{p.data.weaponHandler.gun.GetAdditionalData().criticalHeal:F0}"));
			TabInfoManager.RegisterStat(val3, "Crit CD Reduction", (Func<Player, bool>)((Player p) => p.data.weaponHandler.gun.GetAdditionalData().criticalBlockCDReduction > 0f), (Func<Player, string>)((Player p) => $"{p.data.weaponHandler.gun.GetAdditionalData().criticalBlockCDReduction:F0}%"));
		}
	}
}
namespace Assets._CatsCards.Code.CatsCards.MonoBehaviors.BonkSquishPlayer
{
	internal class ReverseBonkEffect
	{
	}
}
namespace DoggoBonk.MonoBehaviors.Squish
{
	public abstract class OnFlipEffect : MonoBehaviour
	{
		public abstract void Selected();

		public abstract void Unselected();
	}
}
namespace DoggoBonk.MonoBehaviors.Squish.Patches
{
	[Serializable]
	[HarmonyPatch(typeof(Player), "FullReset")]
	internal class PlayerFullResetPatch
	{
		private static void Prefix(Player __instance)
		{
			WidePlayerEffect[] componentsInChildren = ((Component)__instance).gameObject.GetComponentsInChildren<WidePlayerEffect>();
			foreach (WidePlayerEffect widePlayerEffect in componentsInChildren)
			{
				if ((Object)(object)widePlayerEffect != (Object)null)
				{
					Object.Destroy((Object)(object)widePlayerEffect);
				}
			}
			LankyPlayerEffect[] componentsInChildren2 = ((Component)__instance).gameObject.GetComponentsInChildren<LankyPlayerEffect>();
			foreach (LankyPlayerEffect lankyPlayerEffect in componentsInChildren2)
			{
				if ((Object)(object)lankyPlayerEffect != (Object)null)
				{
					Object.Destroy((Object)(object)lankyPlayerEffect);
				}
			}
			((Component)((Component)__instance).gameObject.transform.GetChild(3)).gameObject.GetComponentInChildren<LegRaycasters>().force = 1000f;
			Object.Destroy((Object)(object)((Component)__instance).GetComponentInChildren<A_HoldableObject>());
		}
	}
}
namespace DoggoBonk.MonoBehaviors.Squish.Wide
{
	internal class WidePlayerEffect : MonoBehaviour
	{
		private float startTime = -1f;

		internal float ratio = 1f;

		public bool isMult;

		public float ratioOffset;

		public float yOffset;

		internal Vector3 restore_scale = Vector3.zero;

		private void Start()
		{
			//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_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_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			if (isMult)
			{
				ratio *= ratioOffset;
			}
			else
			{
				ratio += ratioOffset;
			}
			restore_scale = ((Component)this).gameObject.transform.localScale;
			foreach (object item in ((Component)this).gameObject.transform.parent.GetChild(4))
			{
				Transform val = (Transform)item;
				val.localPosition += new Vector3(0f, yOffset, 0f);
			}
			ResetScale();
			Widen();
			ResetTimer();
		}

		private void Update()
		{
			//IL_002e: 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_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			if (Time.time >= startTime + 0.5f)
			{
				ResetTimer();
				if (((Component)this).gameObject.transform.localScale.x == ((Component)this).gameObject.transform.localScale.y)
				{
					restore_scale = ((Component)this).gameObject.transform.localScale;
					Widen();
				}
			}
		}

		internal void Widen()
		{
			//IL_000c: 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_0065: 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)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			if (Mathf.Abs(((Component)this).gameObject.transform.localScale.y / ((Component)this).gameObject.transform.localScale.x - ratio) >= 0.0001f)
			{
				((Component)this).gameObject.transform.localScale = 1.25f * new Vector3(((Component)this).gameObject.transform.localScale.x, ((Component)this).gameObject.transform.localScale.x * ratio, ((Component)this).gameObject.transform.localScale.z);
				((Component)this).gameObject.transform.localPosition = new Vector3(0f, yOffset, 0f);
			}
		}

		internal void ResetScale()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: 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)
			if (restore_scale != Vector3.zero)
			{
				((Component)this).gameObject.transform.localScale = restore_scale;
			}
		}

		private void ResetTimer()
		{
			startTime = Time.time;
		}

		private void OnDestroy()
		{
			//IL_0022: 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_0059: 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_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			ResetScale();
			((Component)this).gameObject.transform.localPosition = new Vector3(0f, 0f, 0f);
			foreach (object item in ((Component)this).gameObject.transform.parent.GetChild(4))
			{
				Transform val = (Transform)item;
				val.localPosition -= new Vector3(0f, yOffset, 0f);
			}
		}
	}
	internal class WideVisualEffect : OnFlipEffect
	{
		private bool wide;

		private Vector3 restore_scale;

		private float signy = 1f;

		public override void Selected()
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: 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_0080: Unknown result type (might be due to invalid IL or missing references)
			if (!wide)
			{
				wide = true;
				restore_scale = ((Component)this).gameObject.transform.localScale;
				((Component)this).gameObject.transform.localScale = new Vector3(((Component)this).gameObject.transform.localScale.x * 1.35f, ((Component)this).gameObject.transform.localScale.y * 0.45f, ((Component)this).gameObject.transform.localScale.z);
			}
		}

		public override void Unselected()
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			wide = false;
			((Component)this).gameObject.transform.localScale = restore_scale;
		}

		private void Update()
		{
			//IL_002b: 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_008c: 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)
			if (wide)
			{
				if (Mathf.Abs(restore_scale.y * 0.45f - ((Component)this).gameObject.transform.localScale.y) >= 0.1f)
				{
					signy *= -1f;
				}
				((Component)this).gameObject.transform.localScale = ((Component)this).gameObject.transform.localScale + new Vector3(0f, signy * 0.02f, 0f);
			}
		}

		private void OnDisable()
		{
			wide = false;
		}

		private void OnDestroy()
		{
			wide = false;
		}
	}
}
namespace DoggoBonk.MonoBehaviors.Squish.Lanky
{
	public class LankyPlayerEffect : MonoBehaviour
	{
		private float startTime = -1f;

		internal float ratio = 1f;

		public bool isMult;

		public float ratioOffset;

		public float yOffset;

		internal Vector3 restore_scale = Vector3.zero;

		private void Start()
		{
			//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_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_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			if (isMult)
			{
				ratio *= ratioOffset;
			}
			else
			{
				ratio += ratioOffset;
			}
			restore_scale = ((Component)this).gameObject.transform.localScale;
			foreach (object item in ((Component)this).gameObject.transform.parent.GetChild(4))
			{
				Transform val = (Transform)item;
				val.localPosition += new Vector3(0f, yOffset, 0f);
			}
			ResetScale();
			Lanken();
			ResetTimer();
		}

		private void Update()
		{
			//IL_002e: 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_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			if (Time.time >= startTime + 0.5f)
			{
				ResetTimer();
				if (((Component)this).gameObject.transform.localScale.x == ((Component)this).gameObject.transform.localScale.y)
				{
					restore_scale = ((Component)this).gameObject.transform.localScale;
					Lanken();
				}
			}
		}

		internal void Lanken()
		{
			//IL_000c: 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_0065: 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_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			if (Mathf.Abs(((Component)this).gameObject.transform.localScale.x / ((Component)this).gameObject.transform.localScale.y - ratio) >= 0.0001f)
			{
				((Component)this).gameObject.transform.localScale = 1.25f * new Vector3(((Component)this).gameObject.transform.localScale.x * ratio, ((Component)this).gameObject.transform.localScale.x, ((Component)this).gameObject.transform.localScale.z);
				((Component)this).gameObject.transform.localPosition = new Vector3(0f, yOffset, 0f);
			}
		}

		internal void ResetScale()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: 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)
			if (restore_scale != Vector3.zero)
			{
				((Component)this).gameObject.transform.localScale = restore_scale;
			}
		}

		private void ResetTimer()
		{
			startTime = Time.time;
		}

		private void OnDestroy()
		{
			//IL_0022: 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_005b: 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)
			ResetScale();
			((Component)this).gameObject.transform.localPosition = new Vector3(0f, 0f, 0f);
			foreach (object item in ((Component)this).gameObject.transform.parent.GetChild(4))
			{
				Transform val = (Transform)item;
				val.localPosition -= new Vector3(0f, yOffset, 0f);
			}
		}
	}
	internal class LankyVisualEffect : OnFlipEffect
	{
		private bool lanky;

		private Vector3 restore_scale;

		private float signy = 1f;

		public override void Selected()
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: 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_0080: Unknown result type (might be due to invalid IL or missing references)
			if (!lanky)
			{
				lanky = true;
				restore_scale = ((Component)this).gameObject.transform.localScale;
				((Component)this).gameObject.transform.localScale = new Vector3(((Component)this).gameObject.transform.localScale.x * 0.6f, ((Component)this).gameObject.transform.localScale.y * 1.1f, ((Component)this).gameObject.transform.localScale.z);
			}
		}

		public override void Unselected()
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			lanky = false;
			((Component)this).gameObject.transform.localScale = restore_scale;
		}

		private void Update()
		{
			//IL_002b: 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_008c: 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)
			if (lanky)
			{
				if (Mathf.Abs(restore_scale.y * 1.1f - ((Component)this).gameObject.transform.localScale.y) >= 0.1f)
				{
					signy *= -1f;
				}
				((Component)this).gameObject.transform.localScale = ((Component)this).gameObject.transform.localScale + new Vector3(0f, signy * 0.02f, 0f);
			}
		}

		private void OnDisable()
		{
			lanky = false;
		}

		private void OnDestroy()
		{
			lanky = false;
		}
	}
}
namespace CPCCardInfostuffs
{
	public class CPCCardInfo : MonoBehaviour
	{
		[Header("CPC Settings")]
		public float GunCritDamage2 = 0f;

		public float GunCritChance2 = 0f;

		public int GunCritBounces = 0;

		public float GunCritDamageOnBounce = 0f;

		public bool GunConsecutiveCrits = false;

		public float GunConsecutiveCritsDamage = 0f;

		public bool GunGuranteedCrits = false;

		public float GunCritSlow = 0f;

		public Color GunCritColor = Color.red;

		public Color GunDoubleCritColor = Color.cyan;

		public float GunCritBulletSpeed = 0f;

		public float GunCritSimulationSpeed = 0f;

		public bool GunUnblockableCrits = false;

		public float GunCritHeal = 0f;

		public float GunCritBlockCDReduction = 0f;

		public bool GunBlockingCrits = false;

		public string Tag = "CPC";

		public void Start()
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Expected O, but got Unknown
			//IL_00a3: 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_00d4: Unknown result type (might be due to invalid IL or missing references)
			RectTransform[] componentsInChildren = ((Component)this).gameObject.GetComponentsInChildren<RectTransform>();
			GameObject val = new GameObject("ModIDText");
			RectTransform val2 = ((IEnumerable<RectTransform>)componentsInChildren).FirstOrDefault((Func<RectTransform, bool>)((RectTransform obj) => ((Object)((Component)obj).gameObject).name == "EdgePart (2)"));
			if ((Object)(object)val2 != (Object)null)
			{
				GameObject gameObject = ((Component)val2).gameObject;
				val.gameObject.transform.SetParent(gameObject.transform);
			}
			TextMeshProUGUI val3 = val.gameObject.AddComponent<TextMeshProUGUI>();
			((TMP_Text)val3).text = Tag;
			((TMP_Text)val3).autoSizeTextContainer = true;
			val.transform.localEulerAngles = new Vector3(0f, 0f, 135f);
			val.transform.localScale = Vector3.one;
			val.transform.localPosition = new Vector3(-75f, -75f, 0f);
			((TMP_Text)val3).alignment = (TextAlignmentOptions)1026;
			((TMP_Text)val3).alpha = 0.1f;
			((TMP_Text)val3).fontSize = 54f;
		}
	}
}
namespace ChaosPoppycarsCards
{
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("com.Poppycars.CPC.Id", "ChaosPoppycarsCards", "1.4.2")]
	[BepInProcess("Rounds.exe")]
	public class ChaosPoppycarsCards : BaseUnityPlugin
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static Func<Type, bool> <>9__16_0;

			public static Action <>9__16_1;

			public static Predicate<BaseUnityPlugin> <>9__17_4;

			public static UnityAction <>9__17_0;

			public static Func<IGameModeHandler, IEnumerator> <>9__17_1;

			public static Action <>9__17_2;

			public static UnityAction<bool> <>9__19_0;

			internal bool <RegisterCards>b__16_0(Type type)
			{
				return type.IsClass && !type.IsAbstract && type.IsSubclassOf(typeof(CustomCard));
			}

			internal void <RegisterCards>b__16_1()
			{
				CurseManager.instance.RegisterCurse(Anarkey.Card);
				CurseManager.instance.RegisterCurse(BlockConfusion.Card);
				CurseManager.instance.RegisterCurse(BrittleBullets.Card);
				CurseManager.instance.RegisterCurse(FearfulCurse.Card);
				CurseManager.instance.RegisterCurse(NerfGun.Card);
				CurseManager.instance.RegisterCurse(SpeedCurse.Card);
				CurseManager.instance.RegisterCurse(RandomCurse.Card);
			}

			internal bool <Start>b__17_4(BaseUnityPlugin plugin)
			{
				return plugin.Info.Metadata.GUID == "com.willuwontu.rounds.tabinfo";
			}

			internal void <Start>b__17_0()
			{
			}

			internal IEnumerator <Start>b__17_1(IGameModeHandler gm)
			{
				return PoppysChaos.ExtraPicks();
			}

			internal void <Start>b__17_2()
			{
			}

			internal void <NewGUI>b__19_0(bool value)
			{
				MC_Particles.Value = value;
			}
		}

		private const string ModId = "com.Poppycars.CPC.Id";

		private const string ModName = "ChaosPoppycarsCards";

		public const string Version = "1.4.2";

		public const string ModInitials = "CPC";

		internal static List<BaseUnityPlugin> plugins;

		public static ConfigEntry<bool> MC_Particles;

		public static AssetBundle Bundle;

		internal static AssetBundle ArtAssets;

		public static ChaosPoppycarsCards Instance { get; private set; }

		public static object CPC_Assets { get; internal set; }

		private void Awake()
		{
			//IL_0025: 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_0036: Expected O, but got Unknown
			//IL_0036: Expected O, but got Unknown
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Expected O, but got Unknown
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Expected O, but got Unknown
			//IL_005d: Expected O, but got Unknown
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Expected O, but got Unknown
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//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)
			//IL_00ab: Expected O, but got Unknown
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Expected O, but got Unknown
			Bundle = AssetUtils.LoadAssetBundleFromResources("cpcart", typeof(ChaosPoppycarsCards).Assembly);
			PlayerActionManager.RegisterPlayerAction(new ActionInfo("Dash", (BindingSource)new MouseBindingSource((Mouse)3), (BindingSource)new DeviceBindingSource((InputControlType)18)));
			PlayerActionManager.RegisterPlayerAction(new ActionInfo("BlockMoveSwitch", (BindingSource)new KeyBindingSource((Key[])(object)new Key[1] { (Key)53 }), (BindingSource)new DeviceBindingSource((InputControlType)13)));
			CardThemeLib.instance.CreateOrGetType("Evergreen", new CardThemeColor
			{
				bgColor = new Color(0.09f, 0.23f, 0.11f),
				targetColor = new Color(0.28f, 0.8f, 0.32f)
			});
			Harmony val = new Harmony("com.Poppycars.CPC.Id");
			val.PatchAll();
			GameObject val2 = Bundle.LoadAsset<GameObject>("ModCards");
			CardHolder component = val2.GetComponent<CardHolder>();
			component.RegisterCards();
			Bundle.LoadAllAssets();
			MC_Particles = ((BaseUnityPlugin)this).Config.Bind<bool>("com.Poppycars.CPC.Id", "Minecraft_Particles", true, "Enable Minecraft Particles");
		}

		private void RegisterCards()
		{
			GameObject[] source = Bundle.LoadAllAssets<GameObject>();
			List<Type> list = (from type in typeof(ChaosPoppycarsCards).Assembly.GetTypes()
				where type.IsClass && !type.IsAbstract && type.IsSubclassOf(typeof(CustomCard))
				select type).ToList();
			foreach (Type type2 in list)
			{
				try
				{
					GameObject val = source.Where((GameObject a) => a != null && (Object)(object)a.GetComponent<CustomCard>() != (Object)null && ((object)a.GetComponent<CustomCard>()).GetType() == type2).First();
					try
					{
						type2.GetField("Card", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null);
						val.GetComponent<CustomCard>().BuildUnityCard((Action<CardInfo>)delegate(CardInfo cardInfo)
						{
							type2.GetField("Card", BindingFlags.Static | BindingFlags.NonPublic).SetValue(null, cardInfo);
						});
					}
					catch
					{
						val.GetComponent<CustomCard>().BuildUnityCard((Action<CardInfo>)null);
					}
				}
				catch
				{
				}
			}
			ExtensionMethods.ExecuteAfterFrames((MonoBehaviour)(object)this, 10, (Action)delegate
			{
				CurseManager.instance.RegisterCurse(Anarkey.Card);
				CurseManager.instance.RegisterCurse(BlockConfusion.Card);
				CurseManager.instance.RegisterCurse(BrittleBullets.Card);
				CurseManager.instance.RegisterCurse(FearfulCurse.Card);
				CurseManager.instance.RegisterCurse(NerfGun.Card);
				CurseManager.instance.RegisterCurse(SpeedCurse.Card);
				CurseManager.instance.RegisterCurse(RandomCurse.Card);
			});
		}

		private void Start()
		{
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Expected O, but got Unknown
			plugins = (List<BaseUnityPlugin>)typeof(Chainloader).GetField("_plugins", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null);
			Instance = this;
			GameModeManager.AddHook("GameStart", (Func<IGameModeHandler, IEnumerator>)GameStart);
			if (plugins.Exists((BaseUnityPlugin plugin) => plugin.Info.Metadata.GUID == "com.willuwontu.rounds.tabinfo"))
			{
				TabinfoInterface.Setup();
			}
			ArtAssets = AssetUtils.LoadAssetBundleFromResources("cpccart", typeof(ChaosPoppycarsCards).Assembly);
			RegisterCards();
			object obj = <>c.<>9__17_0;
			if (obj == null)
			{
				UnityAction val = delegate
				{
				};
				<>c.<>9__17_0 = val;
				obj = (object)val;
			}
			Unbound.RegisterMenu("ChaosPoppycarsCards", (UnityAction)obj, (Action<GameObject>)NewGUI, (GameObject)null, false);
			GameModeManager.AddHook("RoundEnd", (Func<IGameModeHandler, IEnumerator>)UpgradeAction);
			GameModeManager.AddHook("PointEnd", (Func<IGameModeHandler, IEnumerator>)PointEnd);
			GameModeManager.AddHook("PlayerPickEnd", (Func<IGameModeHandler, IEnumerator>)((IGameModeHandler gm) => PoppysChaos.ExtraPicks()));
			ExtensionMethods.ExecuteAfterFrames((MonoBehaviour)(object)this, 10, (Action)delegate
			{
			});
			ExtensionMethods.ExecuteAfterFrames((MonoBehaviour)(object)this, 60, (Action)delegate
			{
				CardManager.cards.Values.ToList().ForEach(delegate(Card card)
				{
					AddMod(card);
				});
			});
		}

		private void AddMod(Card card)
		{
			string text = "__Rarity-" + ((object)(Rarity)(ref card.cardInfo.rarity)).ToString();
			CardCategory val = CustomCardCategories.instance.CardCategory(text);
			CardCategory[] categories = CollectionExtensions.AddToArray<CardCategory>(card.cardInfo.categories, val);
			card.cardInfo.categories = categories;
		}

		private void NewGUI(GameObject menu)
		{
			TextMeshProUGUI val = default(TextMeshProUGUI);
			MenuHandler.CreateText("ChaosPoppycarsCards", menu, ref val, 60, false, (Color?)null, (TMP_FontAsset)null, (Material)null, (TextAlignmentOptions?)null);
			MenuHandler.CreateToggle(MC_Particles.Value, "Enable Minecraft Particles (only effects potions right now)", menu, (UnityAction<bool>)delegate(bool value)
			{
				MC_Particles.Value = value;
			}, 60, true, (Color?)null, (TMP_FontAsset)null, (Material)null, (TextAlignmentOptions?)null);
			MenuHandler.CreateText("", menu, ref val, 60, true, (Color?)null, (TMP_FontAsset)null, (Material)null, (TextAlignmentOptions?)null);
		}

		private IEnumerator UpgradeAction(IGameModeHandler gm)
		{
			yield return WoodenSword.UpgradeSword(gm);
			yield return WoodenHoe.UpgradeHoe(gm);
			yield return WoodenAxe.UpgradeAxe(gm);
			yield return LetherArmor.UpgradeArmor(gm);
		}

		private IEnumerator PointEnd(IGameModeHandler gm)
		{
			foreach (Player player in PlayerManager.instance.players)
			{
				player.data.stats.GetAdditionalData().firstHit = true;
				player.data.stats.GetAdditionalData().firstDamage = true;
			}
			yield break;
		}

		private IEnumerator GameStart(IGameModeHandler gm)
		{
			foreach (Player player in PlayerManager.instance.players)
			{
				CharacterStatModifiersExtension.GetAdditionalData(player.data.stats).blacklistedCategories.Remove(CPCCardCategories.PotionCategory);
				CharacterStatModifiersExtension.GetAdditionalData(player.data.stats).blacklistedCategories.Add(CPCCardCategories.GeeseCategory);
			}
			yield break;
		}
	}
	internal static class CPCCardCategories
	{
		public static CardCategory PotionCategory = CustomCardCategories.instance.CardCategory("UltimatePotion");

		public static CardCategory GeeseCategory = CustomCardCategories.instance.CardCategory("GeeseCategory");
	}
	public static class Config
	{
		public const bool isDebugBuild = false;
	}
}
namespace ChaosPoppycarsCards.Utilities
{
	internal class CPCDebug
	{
		public static void Log(object message)
		{
			bool flag = false;
		}
	}
	internal class Miscs
	{
		public static bool debugFlag = true;

		public static void Log(object message)
		{
			if (debugFlag)
			{
				Debug.Log(message);
			}
		}

		public static void LogWarn(object message)
		{
			if (debugFlag)
			{
				Debug.LogWarning(message);
			}
		}

		public static void LogError(object message)
		{
			if (debugFlag)
			{
				Debug.LogError(message);
			}
		}

		public static List<string> StringSplit(string input, char splitAt)
		{
			List<string> list = new List<string>();
			string text = "";
			for (int i = 0; i < input.Length; i++)
			{
				if (input[i] != splitAt)
				{
					text += input[i];
					continue;
				}
				list.Add(text);
				text = "";
			}
			if (text != "")
			{
				list.Add(text);
			}
			return list;
		}

		public static int ValidateStringQuery(string targetString, string query)
		{
			int num = 15;
			int num2 = 0;
			int num3 = 0;
			bool flag = true;
			for (int i = 0; i < targetString.Length; i++)
			{
				if (targetString[i] == query[num2])
				{
					num3 += num;
					num2++;
				}
				else
				{
					flag = false;
					num--;
					num2++;
				}
				if (num2 == query.Length)
				{
					if (flag)
					{
						num3 += num * 10;
					}
					break;
				}
			}
			return num3;
		}
	}
	public class CardUtils
	{
		public class PlayerCardData
		{
			public CardInfo cardInfo;

			public Player owner;

			public int index;

			public PlayerCardData(CardInfo cardInfo, Player owner, int index)
			{
				this.cardInfo = cardInfo;
				this.owner = owner;
				this.index = index;
			}
		}

		public static bool PlayerHasCard(Player player, string cardName)
		{
			List<PlayerCardData> playerCardsWithName = GetPlayerCardsWithName(player, cardName);
			return playerCardsWithName.Count > 0;
		}

		public static bool PlayerHasCardCategory(Player player, CardCategory cardCategory)
		{
			List<PlayerCardData> playerCardsWithCategory = GetPlayerCardsWithCategory(player, cardCategory);
			return playerCardsWithCategory.Count > 0;
		}

		public static List<PlayerCardData> GetPlayerCardsWithName(Player player, string targetCardName)
		{
			targetCardName = targetCardName.ToUpper();
			List<PlayerCardData> list = new List<PlayerCardData>();
			List<CardInfo> currentCards = player.data.currentCards;
			for (int i = 0; i < currentCards.Count; i++)
			{
				string text = currentCards[i].cardName.ToUpper();
				if (text.Equals(targetCardName))
				{
					list.Add(new PlayerCardData(currentCards[i], player, i));
				}
			}
			return list;
		}

		public static List<PlayerCardData> GetPlayerCardsWithCategory(Player player, CardCategory targetCategory)
		{
			List<PlayerCardData> list = new List<PlayerCardData>();
			List<CardInfo> currentCards = player.data.currentCards;
			for (int i = 0; i < currentCards.Count; i++)
			{
				bool flag = false;
				CardCategory[] categoriesFromCard = CustomCardCategories.instance.GetCategoriesFromCard(currentCards[i]);
				CardCategory[] array = categoriesFromCard;
				foreach (CardCategory val in array)
				{
					if ((Object)(object)targetCategory == (Object)(object)val)
					{
						flag = true;
						break;
					}
				}
				if (flag)
				{
					list.Add(new PlayerCardData(currentCards[i], player, i));
				}
			}
			return list;
		}

		public static CardInfo GetCardInfo(string modInitial, string cardNameExact)
		{
			string value = "__" + modInitial + "__" + cardNameExact;
			List<CardInfo> list = CardManager.cards.Values.Select((Card c) => c.cardInfo).ToList();
			CardInfo result = null;
			foreach (CardInfo item in list)
			{
				if (((Object)((Component)item).gameObject).name.Contains(value))
				{
					result = item;
					break;
				}
			}
			return result;
		}

		public static CardInfo GetCardInfo(string query, bool searchVanillaOnly = false)
		{
			if (query.Contains("@"))
			{
				List<string> list = Miscs.StringSplit(query, '@');
				if (list.Count == 2)
				{
					if (list[0] == "")
					{
						return GetCardInfo(list[1]);
					}
					if (list[0] == "Vanilla")
					{
						return GetCardInfo(list[1], searchVanillaOnly: true);
					}
					return GetCardInfo(list[0], list[1]);
				}
				Miscs.LogWarn(">> query splitting failed");
				query = list[0];
			}
			query = CardNameSanitize(query, removeWhitespaces: true);
			List<CardInfo> list2 = CardManager.cards.Values.Select((Card c) => c.cardInfo).ToList();
			CardInfo result = null;
			int num = 0;
			foreach (CardInfo item in list2)
			{
				string text = CardNameSanitize(((Object)((Component)item).gameObject).name, removeWhitespaces: true);
				if (searchVanillaOnly && text.Contains("__"))
				{
					continue;
				}
				text = CardNameSanitize(item.cardName, removeWhitespaces: true);
				if (text.Equals(query))
				{
					result = item;
					num = 9999;
					break;
				}
				if (text.Contains(query))
				{
					int num2 = Miscs.ValidateStringQuery(text, query);
					if (num2 > num)
					{
						num = num2;
						result = item;
					}
				}
			}
			return result;
		}

		public static List<PlayerCardData> GetPlayerCardsWithCardInfo(Player player, CardInfo cardInfo)
		{
			string value = ((Object)((Component)cardInfo).gameObject).name.ToUpper();
			List<PlayerCardData> list = new List<PlayerCardData>();
			List<CardInfo> currentCards = player.data.currentCards;
			for (int i = 0; i < currentCards.Count; i++)
			{
				string text = ((Object)((Component)currentCards[i]).gameObject).name.ToUpper();
				if (text.Equals(value))
				{
					list.Add(new PlayerCardData(currentCards[i], player, i));
				}
			}
			return list;
		}

		public static List<PlayerCardData> GetPlayerCardsWithStringList(Player player, List<string> checkList)
		{
			List<PlayerCardData> list = new List<PlayerCardData>();
			List<CardInfo> currentCards = player.data.currentCards;
			foreach (string check in checkList)
			{
				CardInfo cardInfo = GetCardInfo(check);
				if (!((Object)(object)cardInfo == (Object)null))
				{
					list = list.Concat(GetPlayerCardsWithCardInfo(player, cardInfo)).ToList();
				}
			}
			return list;
		}

		public static string CardNameSanitize(string name, bool removeWhitespaces = false)
		{
			string text = name.ToLower();
			if (removeWhitespaces)
			{
				text = text.Replace(" ", "");
			}
			return text;
		}

		public static void MakeExclusive(string cardA, string cardB)
		{
			CardInfo cardInfo = GetCardInfo(cardA);
			CardInfo cardInfo2 = GetCardInfo(cardB);
			if ((Object)(object)cardInfo != (Object)null && (Object)(object)cardInfo2 != (Object)null)
			{
				CustomCardCategories.instance.MakeCardsExclusive(cardInfo, cardInfo2);
				Miscs.Log("[CPC] MakeExclusive: card [" + cardA + "] and card [" + cardB + "] made exclusive");
			}
			else
			{
				if ((Object)(object)cardInfo == (Object)null)
				{
					Miscs.LogWarn("[CPC] MakeExclusive: card [" + cardA + "] not found");
				}
				if ((Object)(object)cardInfo2 == (Object)null)
				{
					Miscs.LogWarn("[CPC] MakeExclusive: card [" + cardB + "] not found");
				}
			}
		}
	}
}
namespace ChaosPoppycarsCards.Patches
{
	[HarmonyPatch(typeof(DeathEffect))]
	internal class DeathEffect_Patch
	{
		[HarmonyPostfix]
		[HarmonyPatch("PlayDeath")]
		private static void AdjustedRespawnTime(DeathEffect __instance, Color color, PlayerVelocity playerRig, Vector2 vel, int playerIDToRevive)
		{
			//IL_001c: 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_009c: Unknown result type (might be due to invalid IL or missing references)
			if (playerIDToRevive == -1)
			{
				return;
			}
			Player player = ((CharacterData)ExtensionMethods.GetFieldValue((object)playerRig, "data")).player;
			if (player.data.stats.GetAdditionalData().useNewRespawnTime)
			{
				float newRespawnTime = player.data.stats.GetAdditionalData().newRespawnTime;
				ExtensionMethods.SetFieldValue((object)__instance, "respawnTime", (object)newRespawnTime);
				ParticleSystem[] componentsInChildren = ((Component)__instance).GetComponentsInChildren<ParticleSystem>();
				ParticleSystem[] array = componentsInChildren;
				foreach (ParticleSystem val in array)
				{
					val.playbackSpeed = 2.53f / newRespawnTime;
					MainModule main = val.main;
					((MainModule)(ref main)).simulationSpeed = 2.53f / newRespawnTime;
				}
				((Component)__instance).gameObject.GetComponent<RemoveAfterSeconds>().seconds = 2f * newRespawnTime;
			}
		}
	}
	[Serializable]
	[HarmonyPatch(typeof(GeneralInput), "Update")]
	internal class GeneralInputUpdatePatch
	{
		private static void Postfix(GeneralInput __instance)
		{
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			if (((Component)__instance).GetComponent<Player>().data.stats.GetAdditionalData().forcedMoveEnabled)
			{
				if (Mathf.Abs(__instance.direction.x) < 0.5f)
				{
					__instance.direction = new Vector3(((Component)__instance).GetComponent<Player>().data.stats.GetAdditionalData().forcedMove, __instance.direction.y);
				}
				else
				{
					((Component)__instance).GetComponent<Player>().data.stats.GetAdditionalData().forcedMove = __instance.direction.x;
				}
			}
			if (Mathf.Abs(__instance.direction.x) > 0.5f)
			{
				if (((Component)__instance).GetComponent<Player>().data.stats.GetAdditionalData().speedyHands)
				{
					ExtensionMethods.GetOrAddComponent<SpeedyHandsMono>(((Component)((Component)((Component)__instance).GetComponent<Player>()).transform).gameObject, false);
				}
				if (((Component)__instance).GetComponent<Player>().data.stats.GetAdditionalData().triggerFinger)
				{
					ExtensionMethods.GetOrAddComponent<TriggerFingerMono>(((Component)((Component)((Component)__instance).GetComponent<Player>()).transform).gameObject, false);
				}
				if (((Component)__instance).GetComponent<Player>().data.stats.GetAdditionalData().acceleratedRejuvenation)
				{
					ExtensionMethods.GetOrAddComponent<AcceleratedRejuvenationMono>(((Component)((Component)((Component)__instance).GetComponent<Player>()).transform).gameObject, false);
				}
				if (((Component)__instance).GetComponent<Player>().data.stats.GetAdditionalData().boostedBlock)
				{
					ExtensionMethods.GetOrAddComponent<BoostedBlockMono>(((Component)((Component)((Component)__instance).GetComponent<Player>()).transform).gameObject, false);
				}
			}
			else
			{
				if (((Component)__instance).GetComponent<Player>().data.stats.GetAdditionalData().speedyHands)
				{
					Object.Destroy((Object)(object)ExtensionMethods.GetOrAddComponent<SpeedyHandsMono>(((Component)((Component)((Component)__instance).GetComponent<Player>()).transform).gameObject, false));
				}
				if (((Component)__instance).GetComponent<Player>().data.stats.GetAdditionalData().triggerFinger)
				{
					Object.Destroy((Object)(object)ExtensionMethods.GetOrAddComponent<TriggerFingerMono>(((Component)((Component)((Component)__instance).GetComponent<Player>()).transform).gameObject, false));
				}
				if (((Component)__instance).GetComponent<Player>().data.stats.GetAdditionalData().acceleratedRejuvenation)
				{
					Object.Destroy((Object)(object)ExtensionMethods.GetOrAddComponent<AcceleratedRejuvenationMono>(((Component)((Component)((Component)__instance).GetComponent<Player>()).transform).gameObject, false));
				}
				if (((Component)__instance).GetComponent<Player>().data.stats.GetAdditionalData().boostedBlock)
				{
					Object.Destroy((Object)(object)ExtensionMethods.GetOrAddComponent<BoostedBlockMono>(((Component)((Component)((Component)__instance).GetComponent<Player>()).transform).gameObject, false));
				}
			}
		}
	}
	[Serializable]
	[HarmonyPatch(typeof(HealthHandler), "DoDamage")]
	internal class HealtHandlerPatchDoDamage
	{
		private static void Prefix(HealthHandler __instance, ref Vector2 damage, Vector2 position, Color blinkColor, GameObject damagingWeapon, Player damagingPlayer, bool healthRemoval, ref bool lethal, bool ignoreBlock)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Expected O, but got Unknown
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: 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_0205: Unknown result type (might be due to invalid IL or missing references)
			//IL_021f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0224: Unknown result type (might be due to invalid IL or missing references)
			CharacterData val = (CharacterData)Traverse.Create((object)__instance).Field("data").GetValue();
			Player player = val.player;
			if (!val.isPlaying || val.dead || __instance.isRespawning)
			{
				return;
			}
			if ((Object)(object)damagingPlayer != (Object)null && damagingPlayer.data.stats.GetAdditionalData().firstDamage)
			{
				damagingPlayer.data.stats.GetAdditionalData().damageMult = damagingPlayer.data.stats.GetAdditionalData().damageMultMax;
				damagingPlayer.data.stats.GetAdditionalData().firstDamage = false;
			}
			if ((Object)(object)damagingPlayer != (Object)null && damagingPlayer.data.stats.GetAdditionalData().reducingDmg)
			{
				damage *= damagingPlayer.data.stats.GetAdditionalData().damageMult;
				if (damagingPlayer.data.stats.GetAdditionalData().damageMult > 0.05f)
				{
					damagingPlayer.data.stats.GetAdditionalData().damageMult -= damagingPlayer.data.stats.GetAdditionalData().reducingDmgAmt;
				}
				if (damagingPlayer.data.stats.GetAdditionalData().damageMult < 0.05f)
				{
					damagingPlayer.data.stats.GetAdditionalData().damageMult = 0.05f;
				}
			}
			if (player.data.stats.GetAdditionalData().firstHit)
			{
				player.data.stats.GetAdditionalData().firstHit = false;
				if (player.data.stats.GetAdditionalData().firstHitdmgReduction > 0f)
				{
					damage /= player.data.stats.GetAdditionalData().firstHitdmgReduction;
				}
			}
			if (lethal && val.health < ((Vector2)(ref damage)).magnitude && val.stats.GetAdditionalData().remainingTotems > 0 && (Object)(object)((Component)player).GetComponent<TotemEffect>() != (Object)null)
			{
				((Component)player).GetComponent<TotemEffect>().UseMulligan();
				lethal = false;
			}
		}
	}
	[Serializable]
	[HarmonyPatch(typeof(ProjectileHit), "Hit")]
	internal class ProjectileHitPatchHit
	{
		private static void Postfix(ProjectileHit __instance, ref HitInfo hit, ref Player ___ownPlayer, ref float ___damage, bool forceCall = false)
		{
			if (!((Object)(object)((Component)hit.collider).GetComponent<HealthHandler>() != (Object)null))
			{
				return;
			}
			if ((Object)(object)___ownPlayer != (Object)null && ___ownPlayer.data.stats.GetAdditionalData().firstDamage)
			{
				___ownPlayer.data.stats.GetAdditionalData().damageMult = ___ownPlayer.data.stats.GetAdditionalData().damageMultMax;
				___ownPlayer.data.stats.GetAdditionalData().firstDamage = false;
			}
			if ((Object)(object)___ownPlayer != (Object)null && ___ownPlayer.data.stats.GetAdditionalData().reducingDmg)
			{
				___damage *= ___ownPlayer.data.stats.GetAdditionalData().damageMult;
				if (___ownPlayer.data.stats.GetAdditionalData().damageMult > 0.05f)
				{
					___ownPlayer.data.stats.GetAdditionalData().damageMult -= ___ownPlayer.data.stats.GetAdditionalData().reducingDmgAmt;
				}
				if (___ownPlayer.data.stats.GetAdditionalData().damageMult < 0.05f)
				{
					___ownPlayer.data.stats.GetAdditionalData().damageMult = 0.05f;
				}
			}
		}
	}
	[Serializable]
	[HarmonyPatch(typeof(ProjectileHit), "RPCA_DoHit")]
	internal class ProjectileHitPatchRPCA_DoHit
	{
		private static void Postfix(ProjectileHit __instance, Vector2 hitPoint, Vector2 hitNormal, Vector2 vel, ref Player ___ownPlayer, ref float ___damage, int viewID = -1, int colliderID = -1, bool wasBlocked = false)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_0008: 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_000f: 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_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_0155: Unknown result type (might be due to invalid IL or missing references)
			//IL_0162: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Unknown result type (might be due to invalid IL or missing references)
			//IL_017b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0197: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a1: 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_01ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_0210: Unknown result type (might be due to invalid IL or missing references)
			//IL_0215: 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_022d: Unknown result type (might be due to invalid IL or missing references)
			//IL_023a: 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_0244: Unknown result type (might be due to invalid IL or missing references)
			//IL_0248: Unknown result type (might be due to invalid IL or missing references)
			//IL_0264: Unknown result type (might be due to invalid IL or missing references)
			//IL_026e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0273: 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)
			HitInfo val = new HitInfo();
			val.point = hitPoint;
			val.normal = hitNormal;
			val.collider = null;
			if (viewID != -1)
			{
				PhotonView photonView = PhotonNetwork.GetPhotonView(viewID);
				val.collider = ((Component)photonView).GetComponentInChildren<Collider2D>();
				val.transform = ((Component)photonView).transform;
			}
			else if (colliderID != -1)
			{
				val.collider = ((Component)MapManager.instance.currentMap.Map).GetComponentsInChildren<Collider2D>()[colliderID];
				val.transform = ((Component)val.collider).transform;
			}
			if ((Object)(object)((Component)val.collider).GetComponent<HealthHandler>() == (Object)null && (Object)(object)___ownPlayer != (Object)null && (Object)(object)val.transform != (Object)null && (Object)(object)((Component)___ownPlayer).GetComponent<CooldownBlock>() != (Object)null && ((Component)___ownPlayer).GetComponent<CooldownBlock>().duration <= 0f)
			{
				Vector3 val2;
				if (___ownPlayer.data.stats.GetAdditionalData().blockMover && !___ownPlayer.data.stats.GetAdditionalData().blockPush)
				{
					Smooth orAddComponent = ExtensionMethods.GetOrAddComponent<Smooth>(((Component)val.transform).gameObject, false);
					orAddComponent.currentPos = val.transform.position;
					Vector3 position = val.transform.position;
					val2 = ((Component)___ownPlayer).transform.position - val.transform.position;
					orAddComponent.targetPos = position + ((Vector3)(ref val2)).normalized * ___ownPlayer.data.stats.GetAdditionalData().blockMoveStrength * 3f;
					orAddComponent.speed = 2f;
					((Component)___ownPlayer).GetComponent<CooldownBlock>().duration = 3f;
				}
				else if (___ownPlayer.data.stats.GetAdditionalData().blockMover)
				{
					Smooth orAddComponent2 = ExtensionMethods.GetOrAddComponent<Smooth>(((Component)val.transform).gameObject, false);
					orAddComponent2.currentPos = val.transform.position;
					Vector3 position2 = val.transform.position;
					val2 = val.transform.position - ((Component)___ownPlayer).transform.position;
					orAddComponent2.targetPos = position2 + ((Vector3)(ref val2)).normalized * ___ownPlayer.data.stats.GetAdditionalData().blockMoveStrength * 3f;
					orAddComponent2.speed = 2f;
					((Component)___ownPlayer).GetComponent<CooldownBlock>().duration = 3f;
				}
			}
		}
	}
	[Serializable]
	[HarmonyPatch(typeof(HealthHandler), "Revive")]
	internal class HealtHandlerPatchRevive
	{
		private static void Prefix(HealthHandler __instance, bool isFullRevive = true)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			if (isFullRevive)
			{
				((CharacterData)Traverse.Create((object)__instance).Field("data").GetValue()).stats.GetAdditionalData().remainingTotems = ((CharacterData)Traverse.Create((object)__instance).Field("data").GetValue()).stats.GetAdditionalData().totems;
			}
		}
	}
	[Serializable]
	[HarmonyPatch(typeof(HealthHandler), "RPCA_SendTakeDamage")]
	internal class HealtHandlerPatchRPCASendTakeDamage
	{
		internal static Player GetPlayerWithID(int playerID)
		{
			for (int i = 0; i < PlayerManager.instance.players.Count; i++)
			{
				if (PlayerManager.instance.players[i].playerID == playerID)
				{
					return PlayerManager.instance.players[i];
				}
			}
			return null;
		}

		private static void SimGun(Player player, Vector2 damage)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0187: Unknown result type (might be due to invalid IL or missing references)
			//IL_019d: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c0: 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_01fa: 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_0209: Unknown result type (might be due to invalid IL or missing references)
			//IL_021d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0241: Unknown result type (might be due to invalid IL or missing references)
			//IL_0257: Unknown result type (might be due to invalid IL or missing references)
			//IL_0267: Unknown result type (might be due to invalid IL or missing references)
			//IL_026c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0280: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e3: Unknown result type (might be due to invalid IL or missing references)
			SimulatedGun[] array = (SimulatedGun[])(object)new SimulatedGun[1];
			if ((Object)(object)array[0] == (Object)null)
			{
				array[0] = new GameObject("DamageGun").AddComponent<SimulatedGun>();
			}
			SimulatedGun val = array[0];
			Gun gun = player.data.weaponHandler.gun;
			val.CopyGunStatsExceptActions(gun);
			val.CopyAttackAction(gun);
			val.CopyShootProjectileAction(gun);
			((Gun)val).objectsToSpawn = ((Gun)val).objectsToSpawn.Concat(SimulatedGunTest.StopRecursionSpawn).ToArray();
			((Gun)val).bursts = 0;
			((Gun)val).numberOfProjectiles = 1;
			((Gun)val).damage = Mathf.Clamp(((Vector2)(ref damage)).magnitude / 110f, 0f, player.data.health / 55f);
			((Gun)val).reflects = 0;
			((Gun)val).chargeNumberOfProjectilesTo = 0f;
			if (player.data.view.IsMine || PhotonNetwork.OfflineMode)
			{
				Vector3 val2 = default(Vector3);
				((Vector3)(ref val2))..ctor(player.data.input.aimDirection.x, player.data.input.aimDirection.y, 0f);
				Debug.Log((object)("X " + val2.x + " Y " + val2.y + " Damage " + ((Vector2)(ref damage)).magnitude));
				val.SimulatedAttack(player.playerID, Vector2.op_Implicit(new Vector2(((Component)player).transform.position.x + 1.5f, ((Component)player).transform.position.y)), new Vector3(1f, 0f, 0f), 1f, 1f, (Transform)null, false);
				val.SimulatedAttack(player.playerID, Vector2.op_Implicit(new Vector2(((Component)player).transform.position.x - 1.5f, ((Component)player).transform.position.y)), new Vector3(-1f, 0f, 0f), 1f, 1f, (Transform)null, false);
				val.SimulatedAttack(player.playerID, Vector2.op_Implicit(new Vector2(((Component)player).transform.position.x + 1.5f, ((Component)player).transform.position.y + 0.5f)), new Vector3(0.5f, 1f, 0f), 1f, 1f, (Transform)null, false);
				val.SimulatedAttack(player.playerID, Vector2.op_Implicit(new Vector2(((Component)player).transform.position.x - 1.5f, ((Component)player).transform.position.y + 0.5f)), new Vector3(-0.5f, 1f, 0f), 1f, 1f, (Transform)null, false);
			}
		}

		private static void Prefix(HealthHandler __instance, ref Vector2 damage, Vector2 position, bool lethal, int playerID)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Expected O, but got Unknown
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			CharacterData val = (CharacterData)Traverse.Create((object)__instance).Field("data").GetValue();
			Player player = val.player;
			Player playerWithID = GetPlayerWithID(playerID);
			if (player.data.stats.GetAdditionalData().damagingBullet)
			{
				SimGun(player, damage);
			}
		}
	}
}
namespace ChaosPoppycarsCards.Lightsaber
{
	public class A_HoldableObject : MonoBehaviour
	{
		public static GameObject weapon;

		public UnityEvent eventTrigger;

		public const float Volume = 0.5f;

		internal const float SwitchDelay = 0.25f;

		private float StabTimer = 0f;

		private Player Player;

		private bool wasOut = false;

		public bool IsOut { get; private set; } = false;


		public float switchTimer { get; private set; } = 0f;


		internal static IEnumerator RemoveAllHoldableObjects(IGameModeHandler gm)
		{
			PlayerManager.instance.ForEachPlayer(delegate(Player p)
			{
				try
				{
					MakeGunHoldable(p.playerID, holdableObj: false);
				}
				catch
				{
				}
			});
			yield break;
		}

		private void Start()
		{
			IsOut = false;
			StabTimer = 0f;
			switchTimer = 0f;
			Player = ((Component)this).GetComponentInParent<Player>();
		}

		private void OnDisable()
		{
			if (Player != null && Player.data.view.IsMine && IsOut && !wasOut)
			{
				IsOut = false;
				wasOut = true;
				NetworkingManager.RPC(typeof(A_HoldableObject), "RPCA_Switch_To_Holdable", new object[2] { Player.playerID, false });
			}
		}

		private void OnEnable()
		{
			if (Player != null && Player.data.view.IsMine && !IsOut && wasOut)
			{
				IsOut = true;
				wasOut = false;
				NetworkingManager.RPC(typeof(A_HoldableObject), "RPCA_Switch_To_Holdable", new object[2] { Player.playerID, true });
			}
		}

		private void Update()
		{
			if (Player == null || (!Player.data.view.IsMine && Player.data.dead))
			{
				return;
			}
			StabTimer -= TimeHandler.deltaTime;
			switchTimer -= TimeHandler.deltaTime;
			if (switchTimer <= 0f)
			{
				switchTimer = (IsOut ? 0f : 0.25f);
				IsOut = !IsOut;
				if (IsOut)
				{
					eventTrigger.Invoke();
				}
				NetworkingManager.RPC(typeof(A_HoldableObject), "RPCA_Switch_To_Holdable", new object[2] { Player.playerID, IsOut });
			}
		}

		[UnboundRPC]
		internal static void RPCA_Switch_To_Holdable(int stabbingPlayerID, bool holdableObj)
		{
			MakeGunHoldable(stabbingPlayerID, holdableObj);
		}

		private static void MoveToHide(Transform transform, bool hide)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			transform.localPosition = new Vector3(transform.localPosition.x, transform.localPosition.y, hide ? (-10000f) : 0f);
		}

		internal static void MakeGunHoldable(int playerID, bool holdableObj)
		{
			Player val = ((IEnumerable<Player>)PlayerManager.instance.players).FirstOrDefault((Func<Player, bool>)((Player p) => p.playerID == playerID));
			if (val != null)
			{
				A_HoldableObject componentInChildren = ((Component)val).GetComponentInChildren<A_HoldableObject>();
				Gun component = ((Component)((Component)val).GetComponent<Holding>().holdable).GetComponent<Gun>();
				GameObject gameObject = ((Component)((Component)component).transform.Find("Spring")).gameObject;
				RightLeftMirrorSpring component2 = ((Component)gameObject.transform.GetChild(2)).GetComponent<RightLeftMirrorSpring>();
				Transform obj = gameObject.transform.Find("Lightsaber(Clone)");
				GameObject val2 = ((obj != null) ? ((Component)obj).gameObject : null);
				if (val2 == null)
				{
					val2 = Object.Instantiate<GameObject>(ChaosPoppycarsCards.ArtAssets.LoadAsset<GameObject>("Lightsaber"), gameObject.transform);
					ObjectMirror orAddComponent = ExtensionMethods.GetOrAddComponent<ObjectMirror>(val2, false);
					ObjectSlash orAddComponent2 = ExtensionMethods.GetOrAddComponent<ObjectSlash>(val2, false);
					orAddComponent2.mirror = orAddComponent;
					GameObject gameObject2 = ((Component)val2.transform.Find("Blade")).gameObject;
					ObjectCollider orAddComponent3 = ExtensionMethods.GetOrAddComponent<ObjectCollider>(((Component)gameObject2.transform.Find("Collider")).gameObject, false);
					BladeColor orAddComponent4 = ExtensionMethods.GetOrAddComponent<BladeColor>(gameObject2, false);
					orAddComponent4.playerID = playerID;
				}
				val2.SetActive(holdableObj);
				MoveToHide(gameObject.transform.Find("Ammo/Canvas"), holdableObj);
				MoveToHide(gameObject.transform.GetChild(2), holdableObj);
				MoveToHide(gameObject.transform.GetChild(3), holdableObj);
				((Behaviour)((Component)gameObject.transform.GetChild(2)).GetComponent<RightLeftMirrorSpring>()).enabled = !holdableObj;
				((Behaviour)((Component)gameObject.transform.GetChild(3)).GetComponent<RightLeftMirrorSpring>()).enabled = !holdableObj;
				component.GetData().disabled = holdableObj;
			}
		}

		private void OnDestroy()
		{
			if (Player != null)
			{
				RPCA_Switch_To_Holdable(Player.playerID, holdableObj: false);
				Gun component = ((Component)((Component)Player).GetComponent<Holding>().holdable).GetComponent<Gun>();
				GameObject gameObject = ((Component)((Component)component).transform.Find("Spring")).gameObject;
				Transform obj = gameObject.transform.Find("Lightsaber(Clone)");
				GameObject val = ((obj != null) ? ((Component)obj).gameObject : null);
				if (val != null)
				{
					Object.Destroy((Object)(object)val);
				}
			}
		}
	}
	internal class BladeColor : MonoBehaviour
	{
		public static Player player;

		public int playerID;

		private static Color color;

		private static PlayerSkin skin;

		private static SpriteRenderer render;

		private void Start()
		{
			//IL_003a: 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)
			player = ((IEnumerable<Player>)PlayerManager.instance.players).FirstOrDefault((Func<Player, bool>)((Player p) => p.playerID == playerID));
			skin = ExtraPlayerSkins.GetPlayerSkinColors(PlayerExtensions.colorID(player));
			color = skin.color;
			render = ((Component)this).gameObject.GetComponent<SpriteRenderer>();
			ExtensionMethods.ExecuteAfterFrames((MonoBehaviour)(object)Unbound.Instance, 10, (Action)UpdateBladeColor);
		}

		[UnboundRPC]
		internal static void RPCA_UpdateBladeColor(Color color)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			render.color = color;
		}

		public static void UpdateBladeColor()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			RPCA_UpdateBladeColor(color);
		}
	}
	internal class ObjectCollider : MonoBehaviour
	{
		private ObjectSlash objectStab;

		internal Collider2D collider;

		private void Start()
		{
			objectStab = ((Component)this).GetComponentInParent<ObjectSlash>();
			collider = ((Component)this).GetComponent<Collider2D>();
			collider.isTrigger = false;
			collider.attachedRigidbody.mass = 500f;
			((Component)this).gameObject.layer = LayerMask.NameToLayer("PlayerObjectCollider");
			Collider2D[] componentsInChildren = ((Component)objectStab.player).GetComponentsInChildren<Collider2D>();
			foreach (Collider2D val in componentsInChildren)
			{
				Physics2D.IgnoreCollision(collider, val);
			}
		}

		private void OnTriggerEnter2D(Collider2D collider2D)
		{
			objectStab?.TrySlash(collider2D);
		}

		private void OnTriggerStay2D(Collider2D collider2D)
		{
			objectStab?.TrySlash(collider2D);
		}

		private void OnCollisionEnter2D(Collision2D collision)
		{
			objectStab?.TrySlash(collision);
		}

		private void OnCollisionStay2D(Collision2D collision)
		{
			objectStab?.TrySlash(collision);
		}
	}
	internal class ObjectMirror : MonoBehaviour
	{
		private Holdable holdable;

		private static readonly Vector3 LeftPos = new Vector3(0.1f, 1.95f, 0f);

		private static readonly Vector3 RightPos = new Vector3(0.4f, 1.95f, 0f);

		private static readonly Vector3 LeftScale = new Vector3(-1f, 1f, 1f);

		private static readonly Vector3 RightScale = new Vector3(-1f, -1f, 1f);

		private const float LeftRot = 300f;

		private const float RightRot = 225f;

		internal float rotMod = 0f;

		internal Vector3 positionMod = Vector3.zero;

		private void OnEnable()
		{
			holdable = ((Component)((Component)this).transform.root).GetComponent<Holdable>();
		}

		private void Update()
		{
			//IL_0036: 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_0073: 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_00b6: 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_00d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_010b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			if (holdable != null && holdable?.holder != null)
			{
				bool flag = ((Component)this).transform.root.position.x - 0.1f < ((Component)holdable.holder).transform.position.x;
				((Component)this).transform.localScale = (flag ? LeftScale : RightScale);
				float num = (flag ? 300f : 225f) + rotMod * (flag ? (-1f) : 1f);
				((Component)this).transform.localRotation = Quaternion.Euler(new Vector3(0f, 0f, num));
				Vector3 localPosition = (flag ? LeftPos : RightPos) + new Vector3(positionMod.x * (flag ? (-1f) : 1f), positionMod.y, positionMod.z);
				((Component)this).transform.localPosition = localPosition;
			}
		}
	}
	internal class ObjectSlash : MonoBehaviour
	{
		private A_HoldableObject holdableObj;

		private ObjectCollider objCollider;

		private const float slashAnimDuration = 0.25f;

		private const float slashCooldown = 0.3f;

		private float sinceSlash = 0.3f;

		private bool canDoDamage = false;

		private bool slashing = false;

		private Holdable holdable;

		internal Player player;

		private GeneralInput input;

		internal ObjectMirror mirror;

		private static AnimationCurve[] slashCurves = (AnimationCurve[])(object)new AnimationCurve[3]
		{
			new AnimationCurve((Keyframe[])(object)new Keyframe[7]
			{
				new Keyframe(0f, 0f, 1f, 1f, 1f, 1f),
				new Keyframe(0.0625f, 0.1f, 1f, 1f, 1f, 1f),
				new Keyframe(0.25f, 0.35f, 2f, 2f, 1f, 1f),
				new Keyframe(2f / 3f, 0f, 1f, 1f, 1f, 1f),
				new Keyframe(5f / 6f, -0.2f, 1f, 1f, 1f, 1f),
				new Keyframe(0.875f, -0.1f, 1f, 1f, 1f, 1f),
				new Keyframe(1f, 0f, 1f, 1f, 1f, 1f)
			}),
			new AnimationCurve((Keyframe[])(object)new Keyframe[7]
			{
				new Keyframe(0f, 0f, 1f, 1f, 1f, 1f),
				new Keyframe(0.0625f, -0.15f, 1f, 1f, 1f, 1f),
				new Keyframe(0.25f, 0.2f, 1f, 1f, 1f, 1f),
				new Keyframe(2f / 3f, 0.4f, 1f, 1f, 1f, 1f),
				new Keyframe(5f / 6f, 0.25f, 1f, 1f, 1f, 1f),
				new Keyframe(0.875f, -0.05f, 1f, 1f, 1f, 1f),
				new Keyframe(1f, 0f, 1f, 1f, 1f, 1f)
			}),
			new AnimationCurve((Keyframe[])(object)new Keyframe[7]
			{
				new Keyframe(0f, 0f, 1f, 1f, 1f, 1f),
				new Keyframe(0.0625f, 5f, 1f, 1f, 1f, 1f),
				new Keyframe(0.25f, 40f, 1f, 1f, 1f, 1f),
				new Keyframe(2f / 3f, 0f, 1f, 1f, 1f, 1f),
				new Keyframe(5f / 6f, -20f, 1f, 1f, 1f, 1f),
				new Keyframe(0.875f, -10f, 1f, 1f, 1f, 1f),
				new Keyframe(1f, 0f, 1f, 1f, 1f, 1f)
			})
		};

		private List<Collider2D> hitColliders = new List<Collider2D>();

		private List<Player> hitPlayers = new List<Player>();

		private float slashForceMult = 1500f;

		private float nonslashForceMult = 500f;

		private void Start()
		{
			objCollider = ((Component)((Component)this).gameObject.transform.Find("Blade")).GetComponentInChildren<ObjectCollider>();
		}

		private void OnEnable()
		{
			player = ((Component)((Component)((Component)this).transform.root).GetComponent<Holdable>().holder).GetComponent<Player>();
			holdableObj = ((Component)player).GetComponentInChildren<A_HoldableObject>();
			input = player.data.input;
			slashing = false;
		}

		private void DoSlash()
		{
			if (holdableObj.IsOut)
			{
				sinceSlash = 0f;
				canDoDamage = true;
				DoSlashAnim();
				if (player.data.view.IsMine)
				{
					NetworkingManager.RPC_Others(typeof(ObjectSlash), "RPCO_DoSlashAnim", new object[1] { player.playerID });
				}
			}
		}

		[UnboundRPC]
		private static void RPCO_DoSlashAnim(int playerID)
		{
			Player playerWithID = PlayerManager.instance.GetPlayerWithID(playerID);
			if (playerWithID != null)
			{
				ObjectSlash component = ((Component)((Component)playerWithID.data.weaponHandler.gun).transform.GetChild(1).Find("Lightsaber(Clone)")).GetComponent<ObjectSlash>();
				component.DoSlashAnim();
			}
		}

		internal void DoSlashAnim()
		{
			((MonoBehaviour)this).StartCoroutine(IDoSlashAnim());
		}

		private IEnumerator IDoSlashAnim()
		{
			slashing = true;
			hitPlayers = new List<Player>();
			if (holdable == null)
			{
				holdable = ((Component)((Component)this).transform.root).GetComponent<Holdable>();
			}
			float time = 0f;
			float c = Mathf.Clamp(time / 0.25f, 0f, 1f);
			_ = ((Component)this).transform.root.position.x - 0.1f < ((Component)holdable.holder).transform.position.x;
			mirror.rotMod = slashCurves[2].Evaluate(c);
			while (time < 0.25f)
			{
				yield return null;
				time += TimeHandler.deltaTime;
				float prev = c;
				c = Mathf.Clamp(time / 0.25f, 0f, 1f);
				bool left = ((Component)this).transform.root.position.x - 0.1f < ((Component)holdable.holder).transform.position.x;
				((Component)this).transform.root.position = player.data.hand.position;
				new Vector3(slashCurves[1].Evaluate(prev), slashCurves[0].Evaluate(prev) * (left ? (-1f) : 1f), 0f);
				Vector3 heading = new Vector3(slashCurves[1].Evaluate(c), slashCurves[0].Evaluate(c) * (left ? (-1f) : 1f), 0f);
				Transform root = ((Component)this).transform.root;
				root.position += Quaternion.Euler(0f, 0f, Vector2.Angle(Vector2.op_Implicit(((Vector3)(ref player.data.aimDirection)).normalized), Vector2.op_Implicit(((Vector3)(ref heading)).normalized))) * heading;
				mirror.rotMod = slashCurves[2].Evaluate(c);
				heading = default(Vector3);
			}
			mirror.rotMod = 0f;
			slashing = false;
		}

		private void Update()
		{
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			sinceSlash += TimeHandler.deltaTime;
			if (player.data.view.IsMine && holdableObj.switchTimer <= 0f && sinceSlash >= 0.3f && input.shootWasPressed && holdableObj.IsOut)
			{
				DoSlash();
			}
			if (!slashing)
			{
				((Component)this).transform.root.position = player.data.hand.position;
			}
		}

		internal void TrySlash(Collider2D collider2D)
		{
			if (player.data.view.IsMine && (Object)(object)((collider2D != null) ? ((Component)collider2D).GetComponent<Player>() : null) != (Object)null && !((Component)collider2D).GetComponent<Player>().data.dead && ((Component)collider2D).GetComponent<Player>().playerID != player.playerID && canDoDamage)
			{
				canDoDamage = false;
				NetworkingManager.RPC(typeof(ObjectSlash), "RPCA_SlashPlayer", new object[2]
				{
					player.playerID,
					((Component)collider2D).GetComponent<Player>().playerID
				});
			}
		}

		internal void TrySlash(Collision2D collision)
		{
			//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
			Collider2D collider2D = collision.collider;
			if (!player.data.view.IsMine || collider2D == null || hitColliders.Contains(collider2D) || collision.contactCount <= 0)
			{
				return;
			}
			hitColliders.Add(collider2D);
			ExtensionMethods.ExecuteAfterSeconds((MonoBehaviour)(object)ChaosPoppycarsCards.Instance, 0.25f, (Action)delegate
			{
				hitColliders.Remove(collider2D);
			});
			if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponentInParent<Player>()))
			{
				if (((Component)collider2D).GetComponentInParent<Player>().playerID != player.playerID)
				{
					Player componentInParent = ((Component)collider2D).GetComponentInParent<Player>();
					if (!hitPlayers.Contains(componentInParent))
					{
						hitPlayers.Add(componentInParent);
						HandlePlayer(componentInParent, collision);
					}
				}
			}
			else if (Object.op_Implicit((Object)(object)((Component)collider2D).GetComponentInParent<ProjectileHit>()))
			{
				HandleBullet(((Component)collider2D).GetComponentInParent<ProjectileHit>(), collision);
			}
			else if ((Object)(object)collider2D.attachedRigidbody != (Object)null)
			{
				HandleBox(collider2D.attachedRigidbody, collision);
			}
			else if (Object.op_Implicit((Object)(object)((Component)((Component)collider2D).transform.root).GetComponentInChildren<Damagable>()) && slashing)
			{
				((Component)((Component)collider2D).transform.root).GetComponentInChildren<Damagable>().CallTakeDamage(Vector2.up * 55f, Vector2.op_Implicit(((Component)this).gameObject.transform.position), (GameObject)null, player, true);
			}
		}

		internal void HandlePlayer(Player target, Collision2D collision)
		{
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			if (slashing)
			{
				NetworkingManager.RPC(typeof(ObjectSlash), "RPCA_SlashPlayer", new object[2] { player.playerID, target.playerID });
				float num = Mathf.Pow(player.data.weaponHandler.gun.damage, 2f) * player.data.weaponHandler.gun.knockback * Mathf.Clamp((float)ExtensionMethods.GetFieldValue((object)target.data.playerVel, "mass") / 100f, 0f, 1f);
				target.data.healthHandler.CallTakeForce(num * ((ContactPoint2D)(ref collision.contacts[0])).point, (ForceMode2D)1, false, false, 0f);
			}
		}

		internal void HandleBox(Rigidbody2D box, Collision2D collision)
		{
			//IL_006b: 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_0085: 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_008d: 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_00f5: 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_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)((Component)box).GetComponent<Damagable>()) && slashing)
			{
				Damagable component = ((Component)box).GetComponent<Damagable>();
				float num = 55f * player.data.weaponHandler.gun.damage * player.data.weaponHandler.gun.bulletDamageMultiplier;
				Vector2 val = ((ContactPoint2D)(ref collision.contacts[0])).point - Vector2.op_Implicit(((Component)this).transform.position);
				component.CallTakeDamage(num * ((Vector2)(ref val)).normalized, ((ContactPoint2D)(ref collision.contacts[0])).point, (GameObject)null, (Player)null, true);
			}
			ContactPoint2D[] array = (ContactPoint2D[])(object)new ContactPoint2D[collision.contactCount];
			int contacts = collision.GetContacts(array);
			for (int i = 0; i < contacts; i++)
			{
				box.AddForceAtPosition(player.data.weaponHandler.gun.knockback * box.mass * -1f * ((ContactPoint2D)(ref array[i])).normal * (slashing ? slashForceMult : nonslashForceMult) / (float)contacts, ((ContactPoint2D)(ref array[i])).point);
			}
		}

		internal void HandleBullet(ProjectileHit bullet, Collision2D collision)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			player.data.block.blocked(((Component)bullet).gameObject, ((Component)bullet).gameObject.transform.forward, collision.transform.position);
		}

		[UnboundRPC]
		private static void RPCA_SlashPlayer(int slashingPlayerID, int slashedPlayerID)
		{
			//IL_00c7: 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_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			if (slashedPlayerID == -1)
			{
				return;
			}
			Player val = ((IEnumerable<Player>)PlayerManager.instance.players).FirstOrDefault((Func<Player, bool>)((Player p) => p.playerID == slashingPlayerID));
			Player val2 = ((IEnumerable<Player>)PlayerManager.instance.players).FirstOrDefault((Func<Player, bool>)((Player p) => p.playerID == slashedPlayerID));
			if (val2 == null || val == null)
			{
				return;
			}
			HealthHandler healthHandler = val2.data.healthHandler;
			Vector2 val3 = Vector2.op_Implicit(val.data.weaponHandler.gun.damage * val.data.weaponHandler.gun.bulletDamageMultiplier * 55f * val.data.weaponHandler.gun.shootPosition.forward);
			Vector2 val4 = Vector2.op_Implicit(((Component)val2).transform.position);
			Color white = Color.white;
			CharacterData data = val.data;
			object obj;
			if (data == null)
			{
				obj = null;
			}
			else
			{
				WeaponHandler weaponHandler = data.weaponHandler;
				if (weaponHandler == null)
				{
					obj = null;
				}
				else
				{
					Gun gun = weaponHandler.gun;
					if (gun == null)
					{
						obj = null;
					}
					else
					{
						Transform transform = ((Component)gun).transform;
						if (transform == null)
						{
							obj = null;
						}
						else
						{
							Transform child = transform.GetChild(1);
							if (child == null)
							{
								obj = null;
							}
							else
							{
								Transform obj2 = child.Find("Lightsaber(Clone)");
								obj = ((obj2 != null) ? ((Component)obj2).gameObject : null);
							}
						}
					}
				}
			}
			healthHandler.DoDamage(val3, val4, white, (GameObject)obj, val, false, true, true);
		}
	}
}
namespace ChaosPoppycarsCards.Lightsaber.Patches
{
	internal class AttackPatch
	{
		[HarmonyPatch(typeof(Gun), "Attack")]
		private class GunPatchAttack
		{
			private static bool Prefix(Gun __instance)
			{
				return !__instance.GetData().disabled;
			}
		}
	}
}
namespace ChaosPoppycarsCards.Lightsaber.Extensions
{
	public class GunAdditionalData
	{
		public bool disabled = false;
	}
	public static class GunExtensions
	{
		private static readonly ConditionalWeakTable<Gun, GunAdditionalData> additionalData = new ConditionalWeakTable<Gun, GunAdditionalData>();

		public static GunAdditionalData GetData(this Gun instance)
		{
			return additionalData.GetOrCreateValue(instance);
		}

		public static void DisableGun(this Gun instance)
		{
			instance.GetData().disabled = true;
		}

		public static void EnableGun(this Gun instance)
		{
			instance.GetData().disabled = false;
		}
	}
	internal static class PlayerManagerExtensions
	{
		public static Player GetPlayerWithID(this PlayerManager instance, int playerID)
		{
			return ((IEnumerable<Player>)instance.players).FirstOrDefault((Func<Player, bool>)((Player p) => p.playerID == playerID));
		}

		public static void ForEachPlayer(this PlayerManager instance, Action<Player> action)
		{
			foreach (Player player in instance.players)
			{
				action(player);
			}
		}
	}
}
namespace ChaosPoppycarsCards.MonoBehaviours
{
	public class AcceleratedRejuvenationMono : ReversibleEffect
	{
		public override void OnStart()
		{
			base.healthHandlerModifier.regen_add = Mathf.Abs(base.player.data.stats.movementSpeed * 3f);
			((ReversibleEffect)this).ApplyModifiers();
		}

		public override void OnUpdate()
		{
			base.healthHandlerModifier.regen_add = Mathf.Abs(base.player.data.stats.movementSpeed * 3f);
			((ReversibleEffect)this).ApplyModifiers();
		}

		public override void OnOnDisable()
		{
			((ReversibleEffect)this).ClearModifiers(true);
			((ReversibleEffect)this).Destroy();
		}

		public override void OnOnDestroy()
		{
			((ReversibleEffect)this).ClearModifiers(true);
			((ReversibleEffect)this).OnOnDestroy();
		}
	}
	public class BoostedBlockMono : ReversibleEffect
	{
		public override void OnStart()
		{
			base.blockModifier.cdMultiplier_mult = Mathf.Clamp(1f / (Mathf.Abs(base.player.data.stats.movementSpeed) / 3f), 0.2f, 1.25f);
			((ReversibleEffect)this).ApplyModifiers();
		}

		public override void OnUpdate()
		{
			base.blockModifier.cdMultiplier_mult = Mathf.Clamp(1f / (Mathf.Abs(base.player.data.stats.movementSpeed) / 3f), 0.2f, 1.25f);
			((ReversibleEffect)this).ApplyModifiers();
		}

		public override void OnOnDisable()
		{
			((ReversibleEffect)this).ClearModifiers(true);
			((ReversibleEffect)this).Destroy();
		}

		public override void OnOnDestroy()
		{
			((ReversibleEffect)this).ClearModifiers(true);
			((ReversibleEffect)this).OnOnDestroy();
		}
	}
	public class WarpathMono : MonoBehaviour
	{
		private CharacterData data;

		private Player player;

		private Block block;

		private WeaponHandler weaponHandler;

		private Gun gun;

		private void Start()
		{
			data = ((Component)this).gameObject.GetComponentInParent<CharacterData>();
		}

		private void Update()
		{
			if (!Object.op_Implicit((Object)(object)player) && data != null)
			{
				player = data.player;
				block = data.block;
				weaponHandler = data.weaponHandler;
				gun = weaponHandler.gun;
				Gun obj = gun;
				obj.ShootPojectileAction = (Action<GameObject>)Delegate.Combine(obj.ShootPojectileAction, new Action<GameObject>(OnShootProjectileAction));
			}
		}

		private void OnShootProjectileAction(GameObject obj)
		{
			//IL_0016: 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_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_0031: 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)
			Vector2 val = (Vector2)ExtensionMethods.GetFieldValue((object)data.playerVel, "velocity");
			Vector2 val2 = Vector2.op_Implicit(data.input.aimDirection);
			float num = Vector2.Angle(((Vector2)(ref val)).normalized, ((Vector2)(ref val2)).normalized);
			float num2 = (90f - num) / 90f;
			float num3 = ((Vector2)(ref val)).magnitude / 17f;
			ProjectileHit component = obj.GetComponent<ProjectileHit>();
			component.damage *= num3 + num2 * num3;
		}

		private void OnDestroy()
		{
			Gun obj = gun;
			obj.ShootPojectileAction = (Action<GameObject>)Delegate.Remove(obj.ShootPojectileAction, new Action<GameObject>(OnShootProjectileAction));
		}
	}
	public class SpeedstersGunMono : MonoBehaviour
	{
		private CharacterData data;

		private Player player;

		private Block block;

		private WeaponHandler weaponHandler;

		private Gun gun;

		private void Start()
		{
			data = ((Component)this).gameObject.GetComponentInParent<CharacterData>();
		}

		private void Update()
		{
			if (!Object.op_Implicit((Object)(object)player) && data != null)
			{
				player = data.player;
				block = data.block;
				weaponHandler = data.weaponHandler;
				gun = weaponHandler.gun;
				Gun obj = gun;
				obj.ShootPojectileAction = (Action<GameObject>)Delegate.Combine(obj.ShootPojectileAction, new Action<GameObject>(OnShootProjectileAction));
			}
		}

		private void OnShootProjectileAction(GameObject obj)
		{
			//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)
			MoveTransform move = obj.GetComponentInChildren<MoveTransform>();
			Vector2 val = (Vector2)ExtensionMethods.GetFieldValue((object)data.playerVel, "velocity");
			ExtensionMethods.ExecuteAfterFrames((MonoBehaviour)(object)ChaosPoppycarsCards.Instance, 1, (Action)delegate
			{
				//IL_0008: 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_0031: 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)
				MoveTransform obj2 = move;
				obj2.velocity += Vector2.op_Implicit((Vector2)ExtensionMethods.GetFieldValue((object)data.playerVel, "velocity"));
			});
		}

		private void OnDestroy()
		{
			Gun obj = gun;
			obj.ShootPojectileAction = (Action<GameObject>)Delegate.Remove(obj.ShootPojectileAction, new Action<GameObject>(OnShootProjectileAction));
		}
	}
	public class SpeedyHandsMono : ReversibleEffect
	{
		public override void OnStart()
		{
			base.gunAmmoStatModifier.reloadTimeMultiplier_mult = 1f / (Mathf.Abs(base.player.data.stats.movementSpeed) / 2f) * 0.3f * 3f;
			((ReversibleEffect)this).ApplyModifiers();
		}

		public override void OnUpdate()
		{
			base.gunAmmoStatModifier.reloadTimeMultiplier_mult = 1f / (Mathf.Abs(base.player.data.stats.movementSpeed) / 2f) * 0.3f * 3f;
			((ReversibleEffect)this).ApplyModifiers();
		}

		public override void OnOnDisable()
		{
			((ReversibleEffect)this).ClearModifiers(true);
			((ReversibleEffect)this).Destroy();
		}

		public override void OnOnDestroy()
		{
			((ReversibleEffect)this).ClearModifiers(true);
			((ReversibleEffect)this).OnOnDestroy();
		}
	}
	public class TriggerFingerMono : ReversibleEffect
	{
		public override void OnStart()
		{
			base.gunStatModifier.attackSpeed_mult = 1f / (Mathf.Abs(base.player.data.stats.movementSpeed) / 2.5f) * 0.5f * 1.5f;
			((ReversibleEffect)this).ApplyModifiers();
		}

		public override void OnUpdate()
		{
			base.gunStatModifier.attackSpeed_mult = 1f / (Mathf.Abs(base.player.data.stats.movementSpeed) / 2.5f) * 0.5f * 1.5f;
			((ReversibleEffect)this).ApplyModifiers();
		}

		public override void OnOnDisable()
		{
			((ReversibleEffect)this).ClearModifiers(true);
			((ReversibleEffect)this).Destroy();
		}

		public override void OnOnDestroy()
		{
			((ReversibleEffect)this).ClearModifiers(true);
			((ReversibleEffect)this).OnOnDestroy();
		}
	}
	[DisallowMultipleComponent]
	public class CriticalHitBehaviour : MonoBehaviour
	{
		private float critMultiplier = 1f;

		private static bool isCriticalHit;

		private static bool isDoubleCrit;

		private int shoots;

		private float consecutiveCritDamage = 0f;

		private Gun gun;

		private Player player;

		private SpawnedAttack spawnedAttack;

		private HealthHandler healthHandler;

		private const string MessageEvent = "YourMod_MessageEvent";

		public void Start()
		{
			player = ((Component)this).GetComponentInParent<Player>();
			gun = player.data.weaponHandler.gun;
			Gun obj = gun;
			obj.ShootPojectileAction = (Action<GameObject>)Delegate.Combine(obj.ShootPojectileAction, new Action<GameObject>(OnShootProjectileAction));
			healthHandler = player.data.healthHandler;
			isCriticalHit = false;
			isDoubleCrit = false;
		}

		[UnboundRPC]
		public static void SyncCriticalHit(bool ISCRIT)
		{
			isCriticalHit = ISCRIT;
		}

		[UnboundRPC]
		public static void SyncDoubleCrit(bool ISDOUBLECRIT)
		{
			isDoubleCrit = ISDOUBLECRIT;
		}

		public void OnShootProjectileAction(GameObject obj)
		{
			//IL_019d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0292: Unknown result type (might be due to invalid IL or missing references)
			//IL_0297: Unknown result type (might be due to invalid IL or missing references)
			//IL_022c: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_033d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0352: Unknown result type (might be due to invalid IL or missing references)
			//IL_0357: Unknown result type (might be due to invalid IL or missing references)
			//IL_030b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0327: Unknown result type (might be due to invalid IL or missing references)
			//IL_032c: Unknown result type (might be due to invalid IL or missing references)
			spawnedAttack = obj.GetComponent<SpawnedAttack>();
			if (!Object.op_Implicit((Object)(object)spawnedAttack))
			{
				spawnedAttack = obj.AddComponent<SpawnedAttack>();
			}
			ProjectileHit bullet = obj.GetComponent<ProjectileHit>();
			MoveTransform move = obj.GetComponent<MoveTransform>();
			if (PhotonNetwork.IsMasterClient)
			{
				isCriticalHit = Random.value < gun.GetAdditionalData().criticalHitChance1;
				if (gun.GetAdditionalData().guranteedCrits)
				{
					isCriticalHit = true;
					critMultiplier = 0f;
				}
				NetworkingManager.RPC(typeof(CriticalHitBehaviour), "SyncCriticalHit", new object[1] { isCriticalHit });
				if (!gun.GetAdditionalData().guranteedCrits && gun.GetAdditionalData().criticalHitChance1 > 1f)
				{
					float num = (gun.GetAdditionalData().criticalHitChance1 - 1f) % 1f;
					isDoubleCrit = Random.value < num;
					NetworkingManager.RPC(typeof(CriticalHitBehaviour), "SyncDoubleCrit", new object[1] { isDoubleCrit });
				}
			}
			if (shoots > 0)
			{
				shoots--;
			}
			critMultiplier = 0f;
			if (isCriticalHit)
			{
				spawnedAttack.SetColor(gun.GetAdditionalData().CritColor);
				if ((gun.GetAdditionalData().criticalHitChance1 >= 1.1f) & !gun.GetAdditionalData().guranteedCrits)
				{
					int num2 = (int)Math.Round(gun.GetAdditionalData().criticalHitChance1);
					if (isDoubleCrit)
					{
						critMultiplier += (float)num2 + 1f;
						spawnedAttack.SetColor(gun.GetAdditionalData().DoubleCritColor);
					}
					else
					{
						critMultiplier += num2;
						if (gun.GetAdditionalData().consecutiveCrits)
						{
							consecutiveCritDamage = 0f;
						}
					}
				}
				else
				{
					critMultiplier = 0f;
				}
				RayCastTrail component = obj.GetComponent<RayCastTrail>();
				if (gun.GetAdditionalData().CritColor == Color.clear)
				{
					component.mask = component.ignoreWallsMask;
				}
				bullet.unblockable = gun.GetAdditionalData().unblockableCrits;
				if (critMultiplier > 1.1f)
				{
					if (gun.GetAdditionalData().criticalBulletSpeed > 1f)
					{
						MoveTransform obj2 = move;
						obj2.localForce *= gun.GetAdditionalData().criticalBulletSpeed * critMultiplier;
					}
				}
				else
				{
					MoveTransform obj3 = move;
					obj3.localForce *= gun.GetAdditionalData().criticalBulletSpeed;
				}
				if (gun.GetAdditionalData().criticalHitBounces >= 1)
				{
					if (gun.reflects <= 0)
					{
						RayHitReflect val = obj.gameObject.AddComponent<RayHitReflect>();
						if (critMultiplier > 1.1f)
						{
							val.reflects += gun.GetAdditionalData().criticalHitBounces * (int)Math.Round(critMultiplier) - 1;
							val.dmgM += gun.GetAdditionalData().criticalHitDamageOnBounce;
						}
						else
						{
							val.reflects += gun.GetAdditionalData().criticalHitBounces - 1;
							val.dmgM += gun.GetAdditionalData().criticalHitDamageOnBounce;
						}
					}
					if (gun.reflects >= 1)
					{
						RayHitReflect component2 = obj.gameObject.