Decompiled source of FullRobotRex v1.0.0

RobotRex.dll

Decompiled a day 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.Logging;
using EntityStates;
using HG;
using HG.Reflection;
using KinematicCharacterController;
using Microsoft.CodeAnalysis;
using On.RoR2;
using R2API;
using R2API.Networking;
using R2API.Networking.Interfaces;
using Rewired.ComponentControls.Effects;
using RoR2;
using RoR2.Audio;
using RoR2.EntitlementManagement;
using RoR2.ExpansionManagement;
using RoR2.Navigation;
using RoR2.Projectile;
using RoR2.Skills;
using RoR2.UI;
using RobotRex.Skills;
using RobotRex.States;
using RobotRex.Utils;
using RobotRex.Utils.Assets;
using RobotRex.Utils.Components;
using Survariants;
using TMPro;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.AddressableAssets;
using UnityEngine.Audio;
using UnityEngine.Networking;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("RobotRex")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("RobotRex")]
[assembly: AssemblyTitle("RobotRex")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
[module: UnverifiableCode]
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;
		}
	}
}
namespace RobotRex
{
	[BepInPlugin("pseudopulse.RobotRex", "RobotRex", "1.0.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class RobotRex : BaseUnityPlugin
	{
		public const string PluginGUID = "pseudopulse.RobotRex";

		public const string PluginAuthor = "pseudopulse";

		public const string PluginName = "RobotRex";

		public const string PluginVersion = "1.0.0";

		public static ManualLogSource ModLogger;

		public static AssetBundle Assets;

		public void Awake()
		{
			ModLogger = ((BaseUnityPlugin)this).Logger;
			Assets = AssetBundle.LoadFromFile(Assembly.GetExecutingAssembly().Location.Replace("RobotRex.dll", "assets"));
			SwapAllShaders(Assets);
			ScanTypes(delegate(SkillBase x)
			{
				x.Init();
			});
			ScanTypes(delegate(SurvivorBase x)
			{
				x.Init();
			});
		}

		public static T Load<T>(string path) where T : Object
		{
			return Assets.LoadAsset<T>(path);
		}

		internal static void ScanTypes<T>(Action<T> action)
		{
			IEnumerable<Type> enumerable = from x in Assembly.GetExecutingAssembly().GetTypes()
				where !x.IsAbstract && x.IsSubclassOf(typeof(T))
				select x;
			foreach (Type item in enumerable)
			{
				T obj = (T)Activator.CreateInstance(item);
				action(obj);
			}
		}

		public void SwapAllShaders(AssetBundle bundle)
		{
			Material[] array = bundle.LoadAllAssets<Material>();
			Material[] array2 = array;
			foreach (Material val in array2)
			{
				switch (((Object)val.shader).name)
				{
				case "Hopoo Games/FX/Cloud Remap":
					val.shader = Shader.HGCloudRemap;
					break;
				case "Stubbed Hopoo Games/Deferred/Standard":
					val.shader = Resources.Load<Shader>("shaders/deferred/hgstandard");
					break;
				case "StubbedShader/deferred/hgstandard":
					val.shader = Shader.HGStandard;
					break;
				case "StubbedShader/fx/hgintersectioncloudremap":
					val.shader = Resources.Load<Shader>("shaders/fx/hgintersectioncloudremap");
					break;
				case "Stubbed Hopoo Games/Deferred/Snow Topped":
					val.shader = Resources.Load<Shader>("shaders/deferred/hgsnowtopped");
					break;
				case "Stubbed Hopoo Games/FX/Cloud Remap":
					val.shader = Resources.Load<Shader>("shaders/fx/hgcloudremap");
					break;
				case "Stubbed Hopoo Games/FX/Cloud Intersection Remap":
					val.shader = Resources.Load<Shader>("shaders/fx/hgintersectioncloudremap");
					break;
				case "Stubbed Hopoo Games/FX/Opaque Cloud Remap":
					val.shader = Resources.Load<Shader>("shaders/fx/hgopaquecloudremap");
					break;
				case "Stubbed Hopoo Games/FX/Distortion":
					val.shader = Resources.Load<Shader>("shaders/fx/hgdistortion");
					break;
				case "Stubbed Hopoo Games/FX/Solid Parallax":
					val.shader = Resources.Load<Shader>("shaders/fx/hgsolidparallax");
					break;
				case "Stubbed Hopoo Games/Environment/Distant Water":
					val.shader = Resources.Load<Shader>("shaders/environment/hgdistantwater");
					break;
				case "StubbedRoR2/Base/Shaders/HGStandard":
					val.shader = LegacyShaderAPI.Find("Hopoo Games/Deferred/Standard");
					break;
				case "StubbedRoR2/Base/Shaders/HGCloudRemap":
					val.shader = Shader.HGCloudRemap;
					break;
				case "StubbedRoR2/Base/Shaders/HGIntersectionCloudRemap":
					val.shader = LegacyShaderAPI.Find("Hopoo Games/FX/Cloud Intersection Remap");
					break;
				}
			}
		}
	}
	public class RRAnimHandler : MonoBehaviour
	{
		public Animator Turret;

		private Animator us;

		public void Start()
		{
			us = ((Component)this).GetComponent<Animator>();
		}

		public void Update()
		{
			us.SetBool("isSprinting", false);
			Turret.SetFloat("aimPitchCycle", us.GetFloat("aimPitchCycle") * 0.35f);
		}
	}
	public class RRBeeUpdater : MonoBehaviour
	{
		public void Start()
		{
			ProjectileImpactExplosion component = ((Component)this).GetComponent<ProjectileImpactExplosion>();
			ProjectileController component2 = ((Component)this).GetComponent<ProjectileController>();
			if (!Object.op_Implicit((Object)(object)component2.owner))
			{
				return;
			}
			CharacterBody component3 = component2.owner.GetComponent<CharacterBody>();
			if (Object.op_Implicit((Object)(object)component3) && Object.op_Implicit((Object)(object)component3.master))
			{
				RRDroneStats component4 = ((Component)component3.master).GetComponent<RRDroneStats>();
				if (Object.op_Implicit((Object)(object)component4))
				{
					((ProjectileExplosion)component).childrenCount = ((ProjectileExplosion)component).childrenCount + component4.BonusMissiles;
				}
			}
		}
	}
	public class RRDroneStats : MonoBehaviour
	{
		public int BonusBullets = 0;

		public float BonusChaingunSpeed = 0f;

		public int BonusMissiles = 0;

		public float BonusRegen = 0f;

		public float BonusHealth = 0f;

		public int BonusArmor = 0;

		public float BonusIncinerationDamage = 0f;

		public float BonusScale = 0f;
	}
	public class RRMissileTracker : HurtboxTracker
	{
		public override void Start()
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			targetingIndicatorPrefab = Survivor.TargetPainter;
			maxSearchAngle = 45f;
			maxSearchDistance = 120f;
			targetType = TargetType.Enemy;
			userIndex = (TeamIndex)1;
			base.Start();
		}
	}
	public class Survivor : SurvivorBase<Survivor>
	{
		public static GameObject LaserSignal;

		public static GameObject OrbitalBeam;

		public static GameObject AcidProjectile;

		public static GameObject PollinateProjectile;

		public static GameObject PollinateBeeMissile;

		public static LazyIndex RobotRex = new LazyIndex("RobotRexBody");

		public static GameObject TargetPainter;

		public static Dictionary<string, Action<RRDroneStats>> DroneMap = new Dictionary<string, Action<RRDroneStats>>
		{
			{
				"Drone1Master",
				delegate(RRDroneStats x)
				{
					x.BonusChaingunSpeed += 0.25f;
					x.BonusArmor += 2;
					x.BonusHealth += 0.05f;
					x.BonusScale += 0.05f;
				}
			},
			{
				"Turret1Master",
				delegate(RRDroneStats x)
				{
					x.BonusBullets += 10;
					x.BonusArmor += 5;
					x.BonusHealth += 0.05f;
					x.BonusScale += 0.15f;
				}
			},
			{
				"Drone2Master",
				delegate(RRDroneStats x)
				{
					x.BonusRegen += 0.1f;
					x.BonusArmor += 2;
					x.BonusHealth += 0.1f;
					x.BonusScale += 0.05f;
				}
			},
			{
				"DroneMissileMaster",
				delegate(RRDroneStats x)
				{
					x.BonusMissiles += 2;
					x.BonusArmor += 5;
					x.BonusHealth += 0.05f;
					x.BonusScale += 0.1f;
				}
			},
			{
				"EmergencyDroneMaster",
				delegate(RRDroneStats x)
				{
					x.BonusRegen += 0.25f;
					x.BonusArmor += 10;
					x.BonusHealth += 0.2f;
					x.BonusScale += 0.1f;
				}
			},
			{
				"FlameDroneMaster",
				delegate(RRDroneStats x)
				{
					x.BonusIncinerationDamage += 0.25f;
					x.BonusArmor += 10;
					x.BonusHealth += 0.05f;
					x.BonusScale += 0.15f;
				}
			},
			{
				"MegaDroneMaster",
				delegate(RRDroneStats x)
				{
					x.BonusArmor += 15;
					x.BonusHealth += 0.2f;
					x.BonusChaingunSpeed += 0.25f;
					x.BonusBullets += 25;
					x.BonusMissiles += 6;
					x.BonusIncinerationDamage += 0.25f;
					x.BonusRegen += 0.2f;
					x.BonusScale += 0.45f;
				}
			}
		};

		public override string Name => "REX?";

		public override string Description => "Having left the plant behind, REX? salvages the parts it can find to build its defenses and perform repairs.\n\n< ! > DIRECTIVE: Suppress can struggle to output sustained damage with its limited ammunition. Tinker with Gunner Turrets to increase it's capacity.\n\n< ! > When under threat, DIRECTIVE: Intercept can temporarily neutralize a focused target. Salvaging Missile Drones will add more missiles to the volley.\n\n< ! > DIRECTIVE: Pursuit provides great mobility and shreds a wide area, but has poor air control.\n\n< ! > DIRECTIVE: Incinerate is able to dish out incredible area of effect damage from long distances. Decommissioning Incinerator Drones will boost its power.";

		public override string Subtitle => "Aimless Construct";

		public override string Outro => "...and so it left, buried behind amalgam.";

		public override string Failure => "...and so it vanished, having never been complete.";

		public override void LoadAssets()
		{
			//IL_025f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0269: Expected O, but got Unknown
			//IL_0271: Unknown result type (might be due to invalid IL or missing references)
			//IL_027b: Expected O, but got Unknown
			//IL_0283: Unknown result type (might be due to invalid IL or missing references)
			//IL_028d: Expected O, but got Unknown
			//IL_02b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_038e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0395: Expected O, but got Unknown
			//IL_03a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a7: Unknown result type (might be due to invalid IL or missing references)
			Body = global::RobotRex.RobotRex.Load<GameObject>("RobotRexBody.prefab");
			Master = PrefabAPI.InstantiateClone(GameObject.TreebotMonsterMaster, "RobotRexMaster");
			Body.GetComponentInChildren<Animator>().runtimeAnimatorController = RuntimeAnimatorController.animTreebot;
			global::RobotRex.RobotRex.Load<GameObject>("DisplayRobotRex.prefab").GetComponentInChildren<Animator>().runtimeAnimatorController = RuntimeAnimatorController.animTreebotDisplay;
			SurvivorDef = global::RobotRex.RobotRex.Load<SurvivorDef>("sdRobotRex.asset");
			Body.GetComponent<CharacterBody>()._defaultCrosshairPrefab = GameObject.TreebotCrosshair;
			CharacterMaster component = Master.GetComponent<CharacterMaster>();
			component.bodyPrefab = Body;
			SkillLocator component2 = Body.GetComponent<SkillLocator>();
			component2.passiveSkill.skillNameToken = "ROBOREX_PASSIVE_NAME";
			component2.passiveSkill.skillDescriptionToken = "ROBOREX_PASSIVE_DESC";
			"ROBOREX_PASSIVE_NAME".Add("Field Modification");
			"ROBOREX_PASSIVE_DESC".Add("Repaired <style=cIsUtility>drones</style> are <style=cIsUtility>merged into you</style> to improve stats and weaponry.");
			ReplaceSkills(component2.primary, SkillBase<global::RobotRex.Skills.Suppress>.instance.skillDef);
			ReplaceSkills(component2.secondary, SkillBase<global::RobotRex.Skills.Intercept>.instance.skillDef);
			ReplaceSkills(component2.utility, SkillBase<Pursuit>.instance.skillDef);
			ReplaceSkills(component2.special, SkillBase<global::RobotRex.Skills.Incinerate>.instance.skillDef);
			ChildLocator componentInChildren = Body.GetComponentInChildren<ChildLocator>();
			Transform val = componentInChildren.FindChild("TurretHull");
			((Component)val).GetComponent<Animator>().runtimeAnimatorController = RuntimeAnimatorController.animTurret1;
			((Component)componentInChildren).gameObject.AddComponent<RRAnimHandler>().Turret = ((Component)val).GetComponent<Animator>();
			Body.GetComponent<KinematicCharacterMotor>().playerCharacter = true;
			ContentAddition.AddNetworkedObject(Body);
			PrefabAPI.RegisterNetworkPrefab(Body);
			Body.GetComponent<CameraTargetParams>().cameraParams = CharacterCameraParams.ccpTreebot;
			Body.AddComponent<RRMissileTracker>();
			LaserSignal = global::RobotRex.RobotRex.Load<GameObject>("LaserSignal.prefab");
			OrbitalBeam = global::RobotRex.RobotRex.Load<GameObject>("OrbitalLaser.prefab");
			DetachLineRendererAndFade detachLineRendererAndFade = LaserSignal.AddComponent<DetachLineRendererAndFade>();
			DetachLineRendererAndFade detachLineRendererAndFade2 = OrbitalBeam.AddComponent<DetachLineRendererAndFade>();
			detachLineRendererAndFade.line = LaserSignal.GetComponentInChildren<LineRenderer>();
			detachLineRendererAndFade.decayTime = 0.4f;
			detachLineRendererAndFade2.line = OrbitalBeam.GetComponentInChildren<LineRenderer>();
			detachLineRendererAndFade2.decayTime = 0.4f;
			CharacterBody.Start += new hook_Start(OnBodyStart);
			RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(HandleDroneStats);
			SummonMasterBehavior.OpenSummon += new hook_OpenSummon(OpenSummon);
			TargetPainter = PrefabAPI.InstantiateClone(GameObject.EngiMissileTrackingIndicator, "RRTargetPainter");
			SpriteRenderer val2 = TargetPainter.FindComponent<SpriteRenderer>("Base Core");
			val2.color = Color.red;
			val2.sprite = Texture2D.texCaptainCrosshairInner.MakeSprite();
			((Component)val2).transform.localScale = new Vector3(0.01f, 0.01f, 0.01f);
			PollinateProjectile = global::RobotRex.RobotRex.Load<GameObject>("PollinateProjectile.prefab");
			PollinateProjectile.gameObject.layer = LayerIndex.projectile.intVal;
			((ProjectileExplosion)PollinateProjectile.GetComponent<ProjectileImpactExplosion>()).explosionEffect = GameObject.CryoCanisterExplosionPrimary;
			PollinateProjectile.AddComponent<RRBeeUpdater>();
			PollinateBeeMissile = global::RobotRex.RobotRex.Load<GameObject>("PollinateMissile.prefab");
			PollinateBeeMissile.gameObject.layer = LayerIndex.projectile.intVal;
			PollinateBeeMissile.GetComponent<ProjectileSingleTargetImpact>().impactEffect = GameObject.ExplosionDroneDeath;
			ContentAddition.AddProjectile(PollinateProjectile);
			ContentAddition.AddProjectile(PollinateBeeMissile);
			SurvivorVariantDef val3 = new SurvivorVariantDef();
			val3.Color = Body.GetComponent<CharacterBody>().bodyColor;
			val3.DisplayName = "REX?";
			val3.TargetSurvivor = global::RobotRex.Utils.Assets.SurvivorDef.Treebot;
			val3.VariantSurvivor = SurvivorDef;
			val3.Description = "Aimless Construct";
			SurvivorDef.hidden = true;
			SurvivorVariantCatalog.AddSurvivorVariant(val3);
		}

		private void OpenSummon(orig_OpenSummon orig, SummonMasterBehavior self, Interactor activator)
		{
			//IL_0027: 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_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: 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_008b: Expected O, but got Unknown
			if (Object.op_Implicit((Object)(object)activator) && Object.op_Implicit((Object)(object)((Component)activator).GetComponent<CharacterBody>()))
			{
				CharacterBody component = ((Component)activator).GetComponent<CharacterBody>();
				if (component.bodyIndex == (BodyIndex)RobotRex)
				{
					string name = ((Object)self.masterPrefab).name;
					if (DroneMap.ContainsKey(name))
					{
						EffectManager.SpawnEffect(GameObject.OmniExplosionVFXRoboBallDeath, new EffectData
						{
							origin = ((Component)self).transform.position,
							scale = 5f
						}, true);
						AkSoundEngine.PostEvent(Events.Play_drone_repair, ((Component)self).gameObject);
						DroneMap[name](((Component)component.master).GetComponent<RRDroneStats>());
						component.statsDirty = true;
						return;
					}
				}
			}
			orig.Invoke(self, activator);
		}

		private void HandleDroneStats(CharacterBody sender, StatHookEventArgs args)
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)sender.master))
			{
				RRDroneStats component = ((Component)sender.master).GetComponent<RRDroneStats>();
				if (Object.op_Implicit((Object)(object)component))
				{
					sender.transform.localScale = Vector3.one * (1f + component.BonusScale);
					((Component)sender).GetComponent<Interactor>().maxInteractionDistance = 3f * (1f + component.BonusScale);
					args.regenMultAdd += component.BonusRegen;
					args.healthMultAdd += component.BonusHealth;
					args.armorAdd += (float)component.BonusArmor;
					sender.skillLocator.primary.SetBonusStockFromBody(component.BonusBullets);
				}
			}
		}

		private void OnBodyStart(orig_Start orig, CharacterBody self)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self);
			if (self.bodyIndex == (BodyIndex)RobotRex && Object.op_Implicit((Object)(object)self.master) && !Object.op_Implicit((Object)(object)((Component)self.master).GetComponent<RRDroneStats>()))
			{
				((Component)(object)self.master).AddComponent<RRDroneStats>();
			}
		}
	}
	public abstract class SkillBase<T> : SkillBase where T : SkillBase<T>
	{
		public static T instance;

		public static implicit operator SkillDef(SkillBase<T> skill)
		{
			return skill.skillDef;
		}

		public SkillBase()
		{
			instance = this as T;
		}
	}
	public abstract class SkillBase
	{
		public SkillDef skillDef;

		public abstract string Name { get; }

		public abstract string Description { get; }

		public virtual string LangToken => GetType().Name.ToUpper();

		public string NameToken => "RobotRex_SKILL_" + LangToken + "_NAME";

		public string DescToken => "RobotRex_SKILL_" + LangToken + "_DESC";

		public abstract Type ActivationStateType { get; }

		public abstract string ActivationMachineName { get; }

		public abstract float Cooldown { get; }

		public virtual bool BeginCooldownOnSkillEnd { get; } = false;


		public virtual bool MustKeyPress { get; } = false;


		public virtual int MaxStock { get; } = 1;


		public virtual int StockToConsume { get; } = 1;


		public virtual int RechargeStock { get; } = 1;


		public virtual bool Agile { get; } = false;


		public virtual bool CanceledFromSprinting => false;

		public virtual string[] Keywords { get; } = null;


		public virtual bool IsCombat => true;

		public virtual InterruptPriority InterruptPriority => (InterruptPriority)1;

		public virtual bool FullRestockOnAssign { get; } = true;


		public abstract Sprite Icon { get; }

		private static bool DefaultEnabledCallback(SkillBase self)
		{
			return true;
		}

		public virtual void Init()
		{
			CreateSkillDef();
			SetupSkillDef();
			CreateLang();
		}

		public virtual void CreateSkillDef()
		{
			skillDef = ScriptableObject.CreateInstance<SkillDef>();
		}

		public virtual void SetupSkillDef()
		{
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			skillDef.skillName = Name;
			skillDef.skillNameToken = NameToken;
			skillDef.skillDescriptionToken = DescToken;
			skillDef.baseRechargeInterval = Cooldown;
			skillDef.canceledFromSprinting = CanceledFromSprinting;
			skillDef.cancelSprintingOnActivation = !Agile;
			skillDef.baseMaxStock = MaxStock;
			skillDef.stockToConsume = StockToConsume;
			skillDef.activationStateMachineName = ActivationMachineName;
			skillDef.activationState = new SerializableEntityStateType(ActivationStateType);
			skillDef.icon = Icon;
			skillDef.rechargeStock = RechargeStock;
			skillDef.isCombatSkill = IsCombat;
			skillDef.keywordTokens = Keywords;
			skillDef.interruptPriority = InterruptPriority;
			skillDef.beginSkillCooldownOnSkillEnd = BeginCooldownOnSkillEnd;
			skillDef.mustKeyPress = MustKeyPress;
			skillDef.fullRestockOnAssign = FullRestockOnAssign;
			ContentAddition.AddSkillDef(skillDef);
		}

		public virtual void CreateLang()
		{
			NameToken.Add(Name);
			DescToken.Add(Description);
		}

		public string GetConfigName()
		{
			return Name;
		}
	}
	public abstract class SurvivorBase<T> : SurvivorBase where T : SurvivorBase<T>
	{
		public static T instance;

		public SurvivorBase()
		{
			instance = this as T;
		}
	}
	public abstract class SurvivorBase
	{
		public GameObject Body;

		public GameObject Master;

		public SurvivorDef SurvivorDef;

		public SkinDef mastery;

		public abstract string Name { get; }

		public abstract string Description { get; }

		public abstract string Subtitle { get; }

		public abstract string Outro { get; }

		public abstract string Failure { get; }

		public static bool DefaultEnabledCallback(SurvivorBase self)
		{
			return true;
		}

		public virtual void Init()
		{
			LoadAssets();
			CreateLang();
			ContentAddition.AddBody(Body);
			ContentAddition.AddMaster(Master);
			ContentAddition.AddSurvivorDef(SurvivorDef);
		}

		public virtual void LoadAssets()
		{
		}

		public virtual void CreateLang()
		{
			CharacterBody component = Body.GetComponent<CharacterBody>();
			component.baseNameToken.Add(Name);
			component.subtitleNameToken.Add(Subtitle);
			SurvivorDef.outroFlavorToken.Add(Outro);
			SurvivorDef.mainEndingEscapeFailureFlavorToken.Add(Failure);
			SurvivorDef.descriptionToken.Add(Description);
		}

		public EntityStateMachine AddESM(GameObject prefab, string name, SerializableEntityStateType initial)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			EntityStateMachine val = prefab.AddComponent<EntityStateMachine>();
			val.customName = name;
			val.initialStateType = initial;
			val.mainStateType = initial;
			return val;
		}

		public void SwapMaterials(GameObject prefab, Material mat, bool all = false, List<int> renders = null)
		{
			CharacterModel componentInChildren = prefab.GetComponentInChildren<CharacterModel>();
			if (all)
			{
				for (int i = 0; i < componentInChildren.baseRendererInfos.Length; i++)
				{
					componentInChildren.baseRendererInfos[i].defaultMaterial = mat;
				}
			}
			if (renders == null)
			{
				return;
			}
			foreach (int render in renders)
			{
				componentInChildren.baseRendererInfos[render].defaultMaterial = mat;
			}
		}

		public void ReplaceSkills(GenericSkill slot, params SkillDef[] skills)
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Expected O, but got Unknown
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			SkillFamily val = ScriptableObject.CreateInstance<SkillFamily>();
			((Object)val).name = slot.skillName ?? "default";
			List<Variant> list = new List<Variant>();
			foreach (SkillDef val2 in skills)
			{
				Variant item = new Variant
				{
					skillDef = val2
				};
				((Variant)(ref item)).viewableNode = new Node(val2.skillNameToken, false, (Node)null);
				list.Add(item);
			}
			val.variants = list.ToArray();
			slot._skillFamily = val;
			ContentAddition.AddSkillFamily(val);
		}

		public string GetConfigName()
		{
			return Name;
		}
	}
}
namespace RobotRex.Utils
{
	public class BasicLaserBeam
	{
		public float DamageCoefficient;

		public CharacterBody Owner;

		public Transform TargetMuzzle;

		private LineRenderer lr;

		public GameObject effectInstance;

		private bool firing = false;

		private float stopwatch = 0f;

		private float growthStopwatch = 0f;

		private float delay;

		private BasicLaserInfo info;

		private Transform origin;

		private Transform end;

		private Vector3 targetEndpoint;

		private float origWidth = 0f;

		public bool Active => firing;

		public BasicLaserBeam(CharacterBody owner, Transform muzzle, BasicLaserInfo info)
		{
			//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_010f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: Unknown result type (might be due to invalid IL or missing references)
			//IL_0146: Unknown result type (might be due to invalid IL or missing references)
			this.info = info;
			delay = 1f / info.TickRate;
			TargetMuzzle = muzzle;
			DamageCoefficient = info.DamageCoefficient * delay;
			effectInstance = Object.Instantiate<GameObject>(info.EffectPrefab, ((Component)muzzle).transform.position, Quaternion.identity);
			growthStopwatch = info.ChargeDelay;
			origin = (info.OriginIsBase ? effectInstance.transform : effectInstance.GetComponent<ChildLocator>().FindChild(info.OriginName));
			end = effectInstance.GetComponent<ChildLocator>().FindChild(info.EndpointName);
			lr = effectInstance.GetComponent<DetachLineRendererAndFade>().line;
			origWidth = lr.widthMultiplier;
			Owner = owner;
			targetEndpoint = GetEndpoint(out var _);
			((Component)end).transform.position = targetEndpoint;
			((Component)origin).transform.position = ((Component)TargetMuzzle).transform.position;
		}

		public void Fire()
		{
			if (Object.op_Implicit((Object)(object)info.FiringMaterial))
			{
				((Renderer)lr).material = info.FiringMaterial;
			}
			lr.widthMultiplier = origWidth * info.FiringWidthMultiplier;
			firing = true;
			stopwatch = 0f;
		}

		public void UpdateVisual(float deltaTime)
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			((Component)origin).transform.position = ((Component)TargetMuzzle).transform.position;
			((Component)end).transform.position = Vector3.MoveTowards(((Component)end).transform.position, targetEndpoint, 250f * deltaTime);
		}

		public void Update(float deltaTime)
		{
			//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_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_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Expected O, but got Unknown
			stopwatch += deltaTime;
			if (stopwatch >= delay)
			{
				targetEndpoint = GetEndpoint(out var unmodified);
				stopwatch = 0f;
				if (firing && ((NetworkBehaviour)Owner).hasAuthority)
				{
					GetBulletAttack().Fire();
					if (Object.op_Implicit((Object)(object)info.ImpactEffect))
					{
						EffectManager.SpawnEffect(info.ImpactEffect, new EffectData
						{
							origin = unmodified,
							scale = 1f
						}, false);
					}
				}
			}
			if (!firing)
			{
				growthStopwatch -= deltaTime;
				lr.widthMultiplier = Mathf.Max(0f, growthStopwatch / info.ChargeDelay);
			}
		}

		public Vector3 GetEndpoint(out Vector3 unmodified)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: 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_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//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_0073: 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)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = ((info.FiringMode == LaserFiringMode.TrackAim) ? Owner.inputBank.aimDirection : TargetMuzzle.forward);
			Vector3 val2 = ((info.FiringMode == LaserFiringMode.TrackAim) ? Owner.inputBank.aimOrigin : TargetMuzzle.position);
			Ray val3 = new Ray(val2, val);
			Vector3 point = ((Ray)(ref val3)).GetPoint(info.MaxRange);
			RaycastHit val4 = default(RaycastHit);
			if (Physics.Raycast(val2, val, ref val4, info.MaxRange, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.world)).mask)))
			{
				point = ((RaycastHit)(ref val4)).point;
			}
			unmodified = point;
			return point + val * 5f;
		}

		public BulletAttack GetBulletAttack()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//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_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			BulletAttack val = new BulletAttack();
			val.radius = lr.startWidth * 0.75f;
			val.damage = Owner.damage * DamageCoefficient;
			val.origin = ((info.FiringMode == LaserFiringMode.TrackAim) ? Owner.inputBank.aimOrigin : TargetMuzzle.position);
			Vector3 val2 = ((Component)end).transform.position - TargetMuzzle.position;
			val.aimVector = ((Vector3)(ref val2)).normalized;
			val.procCoefficient = 1f;
			val.owner = ((Component)Owner).gameObject;
			val.falloffModel = (FalloffModel)0;
			val.isCrit = Util.CheckRoll(Owner.crit, Owner.master);
			val.stopperMask = ((LayerIndex)(ref LayerIndex.world)).mask;
			return val;
		}

		public void Stop()
		{
			Object.Destroy((Object)(object)effectInstance);
		}
	}
	public class BasicLaserInfo
	{
		public GameObject EffectPrefab;

		public string OriginName = "Origin";

		public string EndpointName = "End";

		public bool OriginIsBase = true;

		public float TickRate = 20f;

		public float DamageCoefficient = 1f;

		public Material FiringMaterial;

		public float ChargeDelay = 0.5f;

		public float FiringWidthMultiplier = 2f;

		public LaserFiringMode FiringMode = LaserFiringMode.Straight;

		public float MaxRange = 60f;

		public GameObject ImpactEffect;
	}
	public enum LaserFiringMode
	{
		TrackAim,
		Straight
	}
	public abstract class CoolerBasicMeleeAttack : BasicMeleeAttack
	{
		public abstract float BaseDuration { get; }

		public abstract float DamageCoefficient { get; }

		public abstract string HitboxName { get; }

		public abstract GameObject HitEffectPrefab { get; }

		public abstract float ProcCoefficient { get; }

		public abstract float HitPauseDuration { get; }

		public abstract GameObject SwingEffectPrefab { get; }

		public abstract string MuzzleString { get; }

		public virtual string MechanimHitboxParameter { get; }

		public virtual bool ScaleHitPauseDurationWithAttackSpeed { get; } = true;


		public virtual Func<bool> AlternateActiveParameter { get; } = () => true;


		public override void OnEnter()
		{
			base.baseDuration = BaseDuration;
			base.damageCoefficient = DamageCoefficient;
			base.hitBoxGroupName = HitboxName;
			base.hitEffectPrefab = HitEffectPrefab;
			base.procCoefficient = ProcCoefficient;
			base.hitPauseDuration = HitPauseDuration;
			base.swingEffectPrefab = SwingEffectPrefab;
			base.swingEffectMuzzleString = MuzzleString;
			if (MechanimHitboxParameter != null)
			{
				base.mecanimHitboxActiveParameter = MechanimHitboxParameter;
			}
			base.scaleHitPauseDurationAndVelocityWithAttackSpeed = ScaleHitPauseDurationWithAttackSpeed;
			((BasicMeleeAttack)this).OnEnter();
		}

		public override void FixedUpdate()
		{
			((EntityState)this).fixedAge = ((EntityState)this).fixedAge + Time.fixedDeltaTime;
			if (string.IsNullOrEmpty(MechanimHitboxParameter) && AlternateActiveParameter())
			{
				((BasicMeleeAttack)this).BeginMeleeAttackEffect();
			}
			else if (base.animator.GetFloat(MechanimHitboxParameter) >= 0.5f)
			{
				((BasicMeleeAttack)this).BeginMeleeAttackEffect();
			}
			if (((EntityState)this).isAuthority)
			{
				((BasicMeleeAttack)this).AuthorityFixedUpdate();
			}
		}
	}
	[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
	internal sealed class AutoRunAttribute : Attribute
	{
	}
	internal sealed class AutoRunCollector
	{
		public static void HandleAutoRun()
		{
			Type[] types = Assembly.GetExecutingAssembly().GetTypes();
			List<Type> list = types.ToList();
			list.RemoveAll(asdf);
			types = list.ToArray();
			Type[] array = types;
			foreach (Type type in array)
			{
				if (!type.FullName.Contains("CustomEmotesAPI"))
				{
					continue;
				}
				TypeInfo typeInfo = type.GetTypeInfo();
				MethodInfo[] methods = typeInfo.GetMethods((BindingFlags)(-1));
				foreach (MethodInfo methodInfo in methods)
				{
					AutoRunAttribute customAttribute = methodInfo.GetCustomAttribute<AutoRunAttribute>();
					if (customAttribute != null && methodInfo.IsStatic)
					{
						methodInfo.Invoke(null, null);
					}
				}
			}
		}

		private static bool asdf(Type s)
		{
			return s.FullName.Contains("CustomEmotesAPI");
		}
	}
	public class CallNetworkedMethod : INetMessage, ISerializableObject
	{
		private GameObject obj;

		private string method;

		private uint id;

		public CallNetworkedMethod(GameObject obj, string method)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			this.obj = obj;
			this.method = method;
			NetworkInstanceId netId = obj.GetComponent<NetworkIdentity>().netId;
			id = ((NetworkInstanceId)(ref netId)).Value;
		}

		public void Serialize(NetworkWriter writer)
		{
			writer.Write(id);
			writer.Write(method);
		}

		public void Deserialize(NetworkReader reader)
		{
			id = reader.ReadUInt32();
			method = reader.ReadString();
		}

		public void OnReceived()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			obj = Util.FindNetworkObject(new NetworkInstanceId(id));
			obj.SendMessage(method, (SendMessageOptions)1);
		}

		public CallNetworkedMethod()
		{
		}
	}
	public class LockLocalTransform : MonoBehaviour
	{
		public Vector3 Position;

		public Vector3 Rotation;

		public Vector3 Scale;

		public void LateUpdate()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: 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)
			((Component)this).transform.localPosition = Position;
			((Component)this).transform.localRotation = Quaternion.Euler(Rotation);
			((Component)this).transform.localScale = Scale;
		}
	}
	public static class DamageColourHelper
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static hook_FindColor <0>__DamageColor_FindColor;
		}

		public static List<DamageColorIndex> registeredColorIndicies = new List<DamageColorIndex>();

		internal static void Init()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Expected O, but got Unknown
			object obj = <>O.<0>__DamageColor_FindColor;
			if (obj == null)
			{
				hook_FindColor val = DamageColor_FindColor;
				<>O.<0>__DamageColor_FindColor = val;
				obj = (object)val;
			}
			DamageColor.FindColor += (hook_FindColor)obj;
		}

		private static Color DamageColor_FindColor(orig_FindColor orig, DamageColorIndex colorIndex)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0028: Unknown result type (might be due to invalid IL or missing references)
			if (registeredColorIndicies.Contains(colorIndex))
			{
				return DamageColor.colors[colorIndex];
			}
			return orig.Invoke(colorIndex);
		}

		public static DamageColorIndex RegisterDamageColor(Color color)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			int num = DamageColor.colors.Length;
			DamageColorIndex val = (DamageColorIndex)(byte)num;
			ArrayUtils.ArrayAppend<Color>(ref DamageColor.colors, ref color);
			registeredColorIndicies.Add(val);
			return val;
		}
	}
	public static class CharacterExtensions
	{
		public static bool HasSkillEquipped(this CharacterBody body, SkillDef skill)
		{
			GenericSkill[] components = ((Component)body).GetComponents<GenericSkill>();
			foreach (GenericSkill val in components)
			{
				if ((Object)(object)val.skillDef == (Object)(object)skill)
				{
					return true;
				}
			}
			return false;
		}

		public static void ClearInventory(this CharacterBody body)
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)body.inventory))
			{
				return;
			}
			List<ItemDef> list = new List<ItemDef>();
			foreach (ItemIndex item in body.inventory.itemAcquisitionOrder)
			{
				ItemDef itemDef = ItemCatalog.GetItemDef(item);
				list.Add(itemDef);
			}
			foreach (ItemDef item2 in list)
			{
				body.inventory.RemoveItem(item2, body.inventory.GetItemCount(item2));
			}
		}

		public static void ClearInventory(this CharacterBody body, bool hidden)
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)body.inventory))
			{
				return;
			}
			List<ItemDef> list = new List<ItemDef>();
			foreach (ItemIndex item in body.inventory.itemAcquisitionOrder)
			{
				ItemDef itemDef = ItemCatalog.GetItemDef(item);
				if (hidden)
				{
					list.Add(itemDef);
				}
				else if (!itemDef.hidden)
				{
					list.Add(itemDef);
				}
			}
			foreach (ItemDef item2 in list)
			{
				body.inventory.RemoveItem(item2, body.inventory.GetItemCount(item2));
			}
		}
	}
	public static class EnumeratorExtensions
	{
		public static T GetRandom<T>(this IEnumerable<T> self)
		{
			return self.ElementAt(Random.Range(0, self.Count()));
		}

		public static T GetRandom<T>(this IEnumerable<T> self, Xoroshiro128Plus rng)
		{
			return self.ElementAt(rng.RangeInt(0, self.Count()));
		}

		public static T GetRandom<T>(this IEnumerable<T> self, Func<T, bool> predicate)
		{
			try
			{
				return self.Where(predicate).ElementAt(Random.Range(0, self.Count()));
			}
			catch
			{
				return default(T);
			}
		}

		public static T GetRandom<T>(this IEnumerable<T> self, Xoroshiro128Plus rng, Func<T, bool> predicate)
		{
			try
			{
				return self.Where(predicate).ElementAt(rng.RangeInt(0, self.Count()));
			}
			catch
			{
				return default(T);
			}
		}
	}
	public static class StringExtensions
	{
		public static void Add(this string str, string text)
		{
			LanguageAPI.Add(str, text);
		}

		public static T Load<T>(this string str)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				return Addressables.LoadAssetAsync<T>((object)str).WaitForCompletion();
			}
			catch
			{
				return default(T);
			}
		}

		public static string RemoveUnsafeCharacters(this string str)
		{
			string[] array = new string[17]
			{
				"\n", "'", " ", "!", "`", "&", "-", ")", "(", "{",
				"}", "|", "@", "<", ">", ".", "\\"
			};
			string text = str;
			string[] array2 = array;
			foreach (string oldValue in array2)
			{
				text = text.Replace(oldValue, "");
			}
			return text;
		}

		public static string RemoveUnsafeCharacters(this string str, string[] unsafeChars)
		{
			string text = str;
			foreach (string oldValue in unsafeChars)
			{
				text = text.Replace(oldValue, "");
			}
			return text;
		}

		public static string AutoFormat(this string str)
		{
			return Formatter.FormatString(str);
		}
	}
	internal class Formatter
	{
		internal struct Format
		{
			public string match;

			public string expanded;
		}

		private static List<Format> formats = new List<Format>
		{
			new Format
			{
				match = "$su",
				expanded = "<style=cIsUtility>"
			},
			new Format
			{
				match = "$sd",
				expanded = "<style=cIsDamage>"
			},
			new Format
			{
				match = "$ss",
				expanded = "<style=cStack>"
			},
			new Format
			{
				match = "$sr",
				expanded = "<style=cDeath>"
			},
			new Format
			{
				match = "$sh",
				expanded = "<style=cIsHealing>"
			},
			new Format
			{
				match = "$se",
				expanded = "</style>"
			},
			new Format
			{
				match = "$rc",
				expanded = "<color=#36D7A9>"
			},
			new Format
			{
				match = "$ec",
				expanded = "</color>"
			},
			new Format
			{
				match = "$pc",
				expanded = "<color=#406096>"
			},
			new Format
			{
				match = "$sv",
				expanded = "<style=cIsVoid>"
			}
		};

		internal static string FormatString(string str)
		{
			foreach (Format format in formats)
			{
				str = str.Replace(format.match, format.expanded);
			}
			return str;
		}
	}
	public static class UnityExtensions
	{
		public static void RemoveComponent<T>(this GameObject self) where T : Component
		{
			Object.Destroy((Object)(object)self.GetComponent<T>());
		}

		public static void RemoveComponents<T>(this GameObject self) where T : Component
		{
			T[] components = self.GetComponents<T>();
			for (int i = 0; i < components.Length; i++)
			{
				Object.Destroy((Object)(object)components[i]);
			}
		}

		public static void CallNetworkedMethod(this GameObject self, string method, NetworkDestination dest = 1)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			NetMessageExtensions.Send((INetMessage)(object)new CallNetworkedMethod(self, method), dest);
		}

		public static T FindComponent<T>(this GameObject self, string name) where T : Component
		{
			return self.GetComponentsInChildren<T>().FirstOrDefault((T x) => ((Object)((Component)x).gameObject).name == name);
		}

		public static void RemoveComponent<T>(this Component self) where T : Component
		{
			Object.Destroy((Object)(object)self.GetComponent<T>());
		}

		public static void RemoveComponents<T>(this Component self) where T : Component
		{
			T[] components = self.GetComponents<T>();
			for (int i = 0; i < components.Length; i++)
			{
				Object.Destroy((Object)(object)components[i]);
			}
		}

		public static T AddComponent<T>(this Component self) where T : Component
		{
			return self.gameObject.AddComponent<T>();
		}

		public static Sprite MakeSprite(this Texture2D self)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			return Sprite.Create(self, new Rect(0f, 0f, (float)((Texture)self).width, (float)((Texture)self).height), new Vector2(0.5f, 0.5f), 100f);
		}
	}
	[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
	public class HookAttribute : SearchableAttribute
	{
		public Type type;

		public string eventName;

		public HookAttribute(Type type, string eventName)
		{
			this.type = type;
			this.eventName = eventName;
		}
	}
	public class HookAttributeHandler
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static hook_OnLoad <>9__0_0;

			internal IEnumerator <Hook>b__0_0(orig_OnLoad orig, RoR2Application self)
			{
				Initialize();
				return orig.Invoke(self);
			}
		}

		[AutoRun]
		internal static void Hook()
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			object obj = <>c.<>9__0_0;
			if (obj == null)
			{
				hook_OnLoad val = delegate(orig_OnLoad orig, RoR2Application self)
				{
					Initialize();
					return orig.Invoke(self);
				};
				<>c.<>9__0_0 = val;
				obj = (object)val;
			}
			RoR2Application.OnLoad += (hook_OnLoad)obj;
		}

		internal static void Initialize()
		{
			List<HookAttribute> list = new List<HookAttribute>();
			SearchableAttribute.GetInstances<HookAttribute>(list);
			foreach (HookAttribute item in list)
			{
				if ((((SearchableAttribute)item).target as MethodInfo).IsStatic)
				{
					EventInfo @event = item.type.GetEvent(item.eventName);
					Delegate handler = Delegate.CreateDelegate(@event.EventHandlerType, null, ((SearchableAttribute)item).target as MethodInfo);
					@event.AddEventHandler(@event.DeclaringType, handler);
				}
			}
		}
	}
	public static class ItemHelpers
	{
		public static RendererInfo[] ItemDisplaySetup(GameObject obj, bool debugmode = false)
		{
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: 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_00de: Unknown result type (might be due to invalid IL or missing references)
			List<Renderer> list = new List<Renderer>();
			MeshRenderer[] componentsInChildren = obj.GetComponentsInChildren<MeshRenderer>();
			if (componentsInChildren.Length != 0)
			{
				list.AddRange((IEnumerable<Renderer>)(object)componentsInChildren);
			}
			SkinnedMeshRenderer[] componentsInChildren2 = obj.GetComponentsInChildren<SkinnedMeshRenderer>();
			if (componentsInChildren2.Length != 0)
			{
				list.AddRange((IEnumerable<Renderer>)(object)componentsInChildren2);
			}
			RendererInfo[] array = (RendererInfo[])(object)new RendererInfo[list.Count];
			for (int i = 0; i < list.Count; i++)
			{
				if (debugmode)
				{
					MaterialControllerComponents.HGControllerFinder hGControllerFinder = ((Component)list[i]).gameObject.AddComponent<MaterialControllerComponents.HGControllerFinder>();
					hGControllerFinder.Renderer = list[i];
				}
				array[i] = new RendererInfo
				{
					defaultMaterial = ((list[i] is SkinnedMeshRenderer) ? list[i].sharedMaterial : list[i].material),
					renderer = list[i],
					defaultShadowCastingMode = (ShadowCastingMode)1,
					ignoreOverlays = false
				};
			}
			return array;
		}

		public static string OrderManifestLoreFormatter(string deviceName, string estimatedDelivery, string sentTo, string trackingNumber, string devicePickupDesc, string shippingMethod, string orderDetails)
		{
			string[] value = new string[19]
			{
				"<align=left>Estimated Delivery:<indent=70%>Sent To:</indent></align>",
				"<align=left>" + estimatedDelivery + "<indent=70%>" + sentTo + "</indent></align>",
				"",
				"<indent=1%><style=cIsDamage><size=125%><u>  Shipping Details:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0</u></size></style></indent>",
				"",
				"<indent=2%>-Order: <style=cIsUtility>" + deviceName + "</style></indent>",
				"<indent=4%><style=cStack>Tracking Number:  " + trackingNumber + "</style></indent>",
				"",
				"<indent=2%>-Order Description: " + devicePickupDesc + "</indent>",
				"",
				"<indent=2%>-Shipping Method: <style=cIsHealth>" + shippingMethod + "</style></indent>",
				"",
				"",
				"",
				"<indent=2%>-Order Details: " + orderDetails + "</indent>",
				"",
				"",
				"",
				"<style=cStack>Delivery being brought to you by the brand new </style><style=cIsUtility>Orbital Drop-Crate System (TM)</style>. <style=cStack><u>No refunds.</u></style>"
			};
			return string.Join("\n", value);
		}

		public static void RefreshTimedBuffs(CharacterBody body, BuffDef buffDef, float duration)
		{
			//IL_0039: 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)
			if (!Object.op_Implicit((Object)(object)body) || body.GetBuffCount(buffDef) <= 0)
			{
				return;
			}
			foreach (TimedBuff timedBuff in body.timedBuffs)
			{
				if (buffDef.buffIndex == timedBuff.buffIndex)
				{
					timedBuff.timer = duration;
				}
			}
		}

		public static void RefreshTimedBuffs(CharacterBody body, BuffDef buffDef, float taperStart, float taperDuration)
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)body) || body.GetBuffCount(buffDef) <= 0)
			{
				return;
			}
			int num = 0;
			foreach (TimedBuff timedBuff in body.timedBuffs)
			{
				if (buffDef.buffIndex == timedBuff.buffIndex)
				{
					timedBuff.timer = taperStart + (float)num * taperDuration;
					num++;
				}
			}
		}

		public static void AddBuffAndDot(BuffDef buff, float duration, int stackCount, CharacterBody body)
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Invalid comparison between Unknown and I4
			//IL_0075: 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)
			if (!NetworkServer.active)
			{
				return;
			}
			DotIndex val = (DotIndex)Array.FindIndex(DotController.dotDefs, (DotDef dotDef) => (Object)(object)dotDef.associatedBuff == (Object)(object)buff);
			for (int i = 0; i < stackCount; i++)
			{
				if ((int)val != -1)
				{
					DotController.InflictDot(((Component)body).gameObject, ((Component)body).gameObject, val, duration, 0.25f, (uint?)null);
				}
				else
				{
					body.AddTimedBuff(buff.buffIndex, duration);
				}
			}
		}

		public static DotIndex FindAssociatedDotForBuff(BuffDef buff)
		{
			//IL_0024: 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_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			return (DotIndex)Array.FindIndex(DotController.dotDefs, (DotDef dotDef) => (Object)(object)dotDef.associatedBuff == (Object)(object)buff);
		}
	}
	public static class Keywords
	{
		public static string Poison = "KEYWORD_POISON";

		public static string Regenerative = "KEYWORD_RAPID_REGEN";

		public static string Agile = "KEYWORD_AGILE";

		public static string HealthCost = "KEYWORD_PERCENT_HP";

		public static string Disperse = "KEYWORD_SONIC_BOOM";

		public static string Weak = "KEYWORD_WEAK";

		public static string Heavy = "KEYWORD_HEAVY";

		public static string Freeze = "KEYWORD_FREEZING";

		public static string Stun = "KEYWORD_STUNNING";

		public static string Expose = "KEYWORD_EXPOSE";

		public static string Shock = "KEYWORD_SHOCKING";

		public static string Slayer = "KEYWORD_SLAYER";

		public static string Hemorrhage = "KEYWORD_SUPERBLEED";

		public static string Ignite = "KEYWORD_IGNITE";

		public static string Weakpoint = "KEYWORD_WEAKPOINT";

		public static string ActiveReload = "KEYWORD_ACTIVERELOAD";

		public static string VoidCorruption = "KEYWORD_VOIDCORRUPTION";

		public static string OverdriveFormPrimary = "RobotRex_KEYWORD_OVERDRIVE_PRIMARY";

		public static string OverdriveFormSecondary = "RobotRex_KEYWORD_OVERDRIVE_SECONDARY";

		public static string OverdriveFormAltSecondary = "RobotRex_KEYWORD_OVERDRIVE_SECONDARY_ALT";

		public static string OverdriveFormUtility = "RobotRex_KEYWORD_OVERDRIVE_UTILITY";

		public static string OverdriveFormSpecial = "RobotRex_KEYWORD_OVERDRIVE_SPECIAL";

		public static void SetupKeywords()
		{
			OverdriveFormPrimary.Add("<style=cKeywordName>Overdriven Form</style><style=cIsUtility>Agile</style>. Fire a rapid stream of bullets for <style=cIsDamage>90% damage</style>. <style=cDeath>Heat increases spread and ignite chance</style>.");
			OverdriveFormSecondary.Add("<style=cKeywordName>Overdriven Form</style><style=cIsDamage>Ignite</style>. Fire a short-range heat burst for <style=cIsDamage>8x180% damage</style>. Increase <style=cDeath>heat</style> by <style=cDeath>15%</style>.");
			OverdriveFormAltSecondary.Add("<style=cKeywordName>Overdriven Form</style><style=cIsDamage>Ignite</style>. Fire off a <style=cIsDamage>blazing ball</style> for <style=cIsDamage>600%</style> damage that <style=cIsDamage>engulfs</style> the ground on impact for <style=cIsDamage>250%</style> damage per second. Reduce $srheat$se by $su20%$se.");
			OverdriveFormUtility.Add("<style=cKeywordName>Overdriven Form</style><style=cIsUtility>Agile</style>. <style=cIsDamage>Stunning</style>. <style=cIsUtility>Sidestep</style> a very short distance and deal <style=cIsDamage>250% damage</style>. Hitting enemies generates <color=#36D7A9>3 Charge</style>.");
			OverdriveFormSpecial.Add("<style=cKeywordName>Overdriven Form</style><style=cIsUtility>Agile</style>. <style=cIsDamage>Ignite</style>. Release a <style=cIsDamage>fire nova</style> around you that deals <style=cIsDamage>300%</style> damage, increasing up to <style=cIsDamage>900%</style> in full heat. <style=cIsUtility>Consume all heat</style>, gaining an <style=cIsDamage>attack speed</style> boost, and <style=cDeath>exit overdrive</style>.");
		}
	}
	public static class MathHelpers
	{
		public static string FloatToPercentageString(float number, float numberBase = 100f)
		{
			return (number * numberBase).ToString("##0") + "%";
		}

		public static Vector3 ClosestPointOnSphereToPoint(Vector3 origin, float radius, Vector3 targetPosition)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//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_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = targetPosition - origin;
			val = Vector3.Normalize(val);
			val *= radius;
			return origin + val;
		}

		public static List<Vector3> DistributePointsEvenlyAroundSphere(int points, float radius, Vector3 origin)
		{
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//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_0077: 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_007d: Unknown result type (might be due to invalid IL or missing references)
			List<Vector3> list = new List<Vector3>();
			double num = Math.PI * (3.0 - Math.Sqrt(5.0));
			for (int i = 0; i < points; i++)
			{
				int num2 = 1 - i / (points - 1) * 2;
				double num3 = Math.Sqrt(1 - num2 * num2);
				double num4 = num * (double)i;
				float num5 = (float)(Math.Cos(num4) * num3);
				float num6 = (float)(Math.Sin(num4) * num3);
				Vector3 val = origin + new Vector3(num5, (float)num2, num6);
				list.Add(val * radius);
			}
			return list;
		}

		public static List<Vector3> DistributePointsEvenlyAroundCircle(int points, float radius, Vector3 origin, float angleOffset = 0f)
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: 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_0053: Unknown result type (might be due to invalid IL or missing references)
			List<Vector3> list = new List<Vector3>();
			Vector3 item = default(Vector3);
			for (int i = 0; i < points; i++)
			{
				double num = Math.PI * 2.0 / (double)points;
				double num2 = num * (double)i + (double)angleOffset;
				((Vector3)(ref item))..ctor((float)((double)radius * Math.Cos(num2) + (double)origin.x), origin.y, (float)((double)radius * Math.Sin(num2) + (double)origin.z));
				list.Add(item);
			}
			return list;
		}

		public static Vector3 GetPointOnUnitSphereCap(Quaternion targetDirection, float angle)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: 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_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: 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_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			float num = Random.Range(0f, angle) * (MathF.PI / 180f);
			Vector2 insideUnitCircle = Random.insideUnitCircle;
			Vector2 val = ((Vector2)(ref insideUnitCircle)).normalized * Mathf.Sin(num);
			Vector3 val2 = default(Vector3);
			((Vector3)(ref val2))..ctor(val.x, val.y, Mathf.Cos(num));
			return targetDirection * val2;
		}

		public static Vector3 GetPointOnUnitSphereCap(Vector3 targetDirection, float angle)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			return GetPointOnUnitSphereCap(Quaternion.LookRotation(targetDirection), angle);
		}

		public static Vector3 RandomPointOnCircle(Vector3 origin, float radius, Xoroshiro128Plus random)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			float num = random.RangeFloat(0f, MathF.PI * 2f);
			return origin + new Vector3(Mathf.Cos(num), 0f, Mathf.Sin(num)) * radius;
		}

		public static float InverseHyperbolicScaling(float baseValue, float additionalValue, float maxValue, int itemCount)
		{
			return baseValue + (maxValue - baseValue) * (1f - 1f / (1f + additionalValue * (float)(itemCount - 1)));
		}

		public static float CustomHyperbolic(float amplificationPercentage, float max = 100f)
		{
			return (1f - max / (max + amplificationPercentage)) * max;
		}
	}
	public static class MiscUtils
	{
		public static Vector3? RaycastToDirection(Vector3 position, float maxDistance, Vector3 direction, int layer)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			RaycastHit val = default(RaycastHit);
			if (Physics.Raycast(new Ray(position, direction), ref val, maxDistance, layer, (QueryTriggerInteraction)1))
			{
				return ((RaycastHit)(ref val)).point;
			}
			return null;
		}

		public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> toShuffle, Xoroshiro128Plus random)
		{
			List<T> list = new List<T>();
			foreach (T item in toShuffle)
			{
				list.Insert(random.RangeInt(0, list.Count + 1), item);
			}
			return list;
		}

		public static Vector3 FindClosestNodeToPosition(Vector3 position, HullClassification hullClassification, bool checkAirNodes = false)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: 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_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			NodeGraph val = (checkAirNodes ? SceneInfo.instance.airNodes : SceneInfo.instance.groundNodes);
			NodeIndex val2 = val.FindClosestNode(position, hullClassification, float.PositiveInfinity);
			if (val2 != NodeIndex.invalid)
			{
				Vector3 result = default(Vector3);
				val.GetNodePosition(val2, ref result);
				return result;
			}
			return Vector3.zero;
		}

		public static bool TeleportBody(CharacterBody characterBody, GameObject target, GameObject teleportEffect, HullClassification hullClassification, Xoroshiro128Plus rng, float minDistance = 20f, float maxDistance = 45f, bool teleportAir = false)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: 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_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: 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_007b: Expected O, but got Unknown
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Expected O, but got Unknown
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)characterBody))
			{
				return false;
			}
			SpawnCard val = ScriptableObject.CreateInstance<SpawnCard>();
			val.hullSize = hullClassification;
			val.nodeGraphType = (GraphType)(teleportAir ? 1 : 0);
			val.prefab = Resources.Load<GameObject>("SpawnCards/HelperPrefab");
			GameObject val2 = DirectorCore.instance.TrySpawnObject(new DirectorSpawnRequest(val, new DirectorPlacementRule
			{
				placementMode = (PlacementMode)1,
				position = target.transform.position,
				minDistance = minDistance,
				maxDistance = maxDistance
			}, rng));
			if (Object.op_Implicit((Object)(object)val2))
			{
				TeleportHelper.TeleportBody(characterBody, val2.transform.position);
				if (Object.op_Implicit((Object)(object)teleportEffect))
				{
					EffectManager.SimpleEffect(teleportEffect, val2.transform.position, Quaternion.identity, true);
				}
				Object.Destroy((Object)(object)val2);
				Object.Destroy((Object)(object)val);
				return true;
			}
			Object.Destroy((Object)(object)val);
			return false;
		}

		public static Vector3? AboveTargetVectorFromDamageInfo(DamageInfo damageInfo, float distanceAboveTarget)
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: 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_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: 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_0121: Unknown result type (might be due to invalid IL or missing references)
			//IL_0126: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0169: Unknown result type (might be due to invalid IL or missing references)
			//IL_016b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_0176: Unknown result type (might be due to invalid IL or missing references)
			//IL_015b: Unknown result type (might be due to invalid IL or missing references)
			if (damageInfo.rejected || !Object.op_Implicit((Object)(object)damageInfo.attacker))
			{
				return null;
			}
			CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>();
			if (Object.op_Implicit((Object)(object)component))
			{
				TeamMask enemyTeams = TeamMask.GetEnemyTeams(component.teamComponent.teamIndex);
				HurtBox val = new SphereSearch
				{
					radius = 1f,
					mask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask,
					origin = damageInfo.position
				}.RefreshCandidates().FilterCandidatesByHurtBoxTeam(enemyTeams).OrderCandidatesByDistance()
					.FilterCandidatesByDistinctHurtBoxEntities()
					.GetHurtBoxes()
					.FirstOrDefault();
				if (Object.op_Implicit((Object)(object)val) && Object.op_Implicit((Object)(object)val.healthComponent) && Object.op_Implicit((Object)(object)val.healthComponent.body))
				{
					CharacterBody body = val.healthComponent.body;
					Vector3 val2 = body.mainHurtBox.collider.ClosestPointOnBounds(body.transform.position + new Vector3(0f, 10000f, 0f));
					Vector3? val3 = RaycastToDirection(val2, distanceAboveTarget, Vector3.up, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.world)).mask));
					if (val3.HasValue)
					{
						return val3.Value;
					}
					return val2 + Vector3.up * distanceAboveTarget;
				}
			}
			return null;
		}

		public static Vector3? AboveTargetBody(CharacterBody body, float distanceAbove)
		{
			//IL_0030: 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_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: 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_0056: 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_008f: 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)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)body))
			{
				return null;
			}
			Vector3 val = body.mainHurtBox.collider.ClosestPointOnBounds(body.transform.position + new Vector3(0f, 10000f, 0f));
			Vector3? val2 = RaycastToDirection(val, distanceAbove, Vector3.up, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.world)).mask));
			if (val2.HasValue)
			{
				return val2.Value;
			}
			return val + Vector3.up * distanceAbove;
		}

		public static Dictionary<string, Vector3> GetAimSurfaceAlignmentInfo(Ray ray, int layerMask, float distance)
		{
			//IL_0007: 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_002a: 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)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: 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_0088: Unknown result type (might be due to invalid IL or missing references)
			Dictionary<string, Vector3> dictionary = new Dictionary<string, Vector3>();
			RaycastHit val = default(RaycastHit);
			if (!Physics.Raycast(ray, ref val, distance, layerMask, (QueryTriggerInteraction)1))
			{
				return null;
			}
			Vector3 point = ((RaycastHit)(ref val)).point;
			Vector3 val2 = Vector3.Cross(((Ray)(ref ray)).direction, Vector3.up);
			Vector3 val3 = Vector3.ProjectOnPlane(((RaycastHit)(ref val)).normal, val2);
			Vector3 value = Vector3.Cross(val2, val3);
			dictionary.Add("Position", point);
			dictionary.Add("Right", val2);
			dictionary.Add("Forward", value);
			dictionary.Add("Up", val3);
			return dictionary;
		}

		public static FireProjectileInfo GetProjectile(GameObject prefab, float coeff, CharacterBody owner, DamageTypeCombo? damageTypeCombo = null)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0079: Unknown result type (might be due to invalid IL or missing references)
			FireProjectileInfo val = default(FireProjectileInfo);
			val.damage = owner.damage * coeff;
			val.crit = owner.RollCrit();
			val.projectilePrefab = prefab;
			val.owner = ((Component)owner).gameObject;
			val.position = owner.corePosition;
			val.rotation = Util.QuaternionSafeLookRotation(owner.inputBank.aimDirection);
			FireProjectileInfo result = val;
			if (damageTypeCombo.HasValue)
			{
				result.damageTypeOverride = damageTypeCombo;
			}
			return result;
		}

		public static Vector3? GroundPoint(this Vector3 point)
		{
			//IL_0001: 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_0011: Unknown result type (might be due to invalid IL or missing references)
			return RaycastToDirection(point, float.PositiveInfinity, Vector3.down, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.world)).mask));
		}

		public static Tuple<Vector3?, Vector3?> GroundPointWithNormal(this Vector3 point)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: 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_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			RaycastHit val = default(RaycastHit);
			if (Physics.Raycast(point + Vector3.up * 20f, Vector3.down, ref val, 4000f, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.world)).mask)))
			{
				return new Tuple<Vector3?, Vector3?>(((RaycastHit)(ref val)).point, ((RaycastHit)(ref val)).normal);
			}
			return new Tuple<Vector3?, Vector3?>(null, null);
		}

		public static Vector3[] GetSafePositionsWithinDistance(Vector3 center, float distance)
		{
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)SceneInfo.instance) && Object.op_Implicit((Object)(object)SceneInfo.instance.groundNodes))
			{
				NodeGraph groundNodes = SceneInfo.instance.groundNodes;
				List<Vector3> list = new List<Vector3>();
				Node[] nodes = groundNodes.nodes;
				foreach (Node val in nodes)
				{
					if (Vector3.Distance(val.position, center) <= distance)
					{
						list.Add(val.position);
					}
				}
				return list.ToArray();
			}
			return (Vector3[])(object)new Vector3[1] { center };
		}
	}
	public class LazyAddressable<T> where T : Object
	{
		private Func<T> func;

		private T asset = default(T);

		public T Asset
		{
			get
			{
				if (!Object.op_Implicit((Object)(object)asset))
				{
					asset = func();
				}
				return asset;
			}
		}

		public LazyAddressable(Func<T> func)
		{
			this.func = func;
		}

		public static implicit operator T(LazyAddressable<T> addressable)
		{
			return addressable.Asset;
		}
	}
	public class LazyIndex
	{
		private string target;

		private BodyIndex _value = (BodyIndex)(-1);

		public BodyIndex Value => UpdateValue();

		public LazyIndex(string target)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			this.target = target;
		}

		public BodyIndex UpdateValue()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Invalid comparison between Unknown and I4
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Invalid comparison between Unknown and I4
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: 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_0036: Unknown result type (might be due to invalid IL or missing references)
			if ((int)_value == -1 || (int)_value == -1)
			{
				_value = BodyCatalog.FindBodyIndex(target);
			}
			return _value;
		}

		public static implicit operator BodyIndex(LazyIndex index)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			return index.Value;
		}
	}
	public static class NetworkingHelpers
	{
		public static T GetObjectFromNetIdValue<T>(uint netIdValue)
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			NetworkInstanceId key = default(NetworkInstanceId);
			((NetworkInstanceId)(ref key))..ctor(netIdValue);
			NetworkIdentity value = null;
			if (NetworkServer.active)
			{
				NetworkServer.objects.TryGetValue(key, out value);
			}
			else
			{
				ClientScene.objects.TryGetValue(key, out value);
			}
			if (Object.op_Implicit((Object)(object)value))
			{
				T component = ((Component)value).GetComponent<T>();
				if (component != null)
				{
					return component;
				}
			}
			return default(T);
		}
	}
	public static class Scenes
	{
		public static string AphelianSanctuary = "ancientloft";

		public static string VoidFields = "arena";

		public static string DistantRoost = "blackbeach";

		public static string DistantRoostAlt = "blackbeach2";

		public static string AbyssalDepths = "dampcavesimple";

		public static string WetlandAspect = "foggyswamp";

		public static string RallypointDelta = "frozenwall";

		public static string TitanicPlains = "golemplains";

		public static string TitanicPlainsAlt = "golemplains2";

		public static string AbandonedAqueduct = "goolake";

		public static string Commencement = "moon2";

		public static string SunderedGrove = "rootjungle";

		public static string SirensCall = "shipgraveyard";

		public static string SkyMeadow = "skymeadow";

		public static string SiphonedForest = "snowyforest";

		public static string SulfurPools = "sulfurpools";

		public static string VoidLocus = "voidstage";

		public static string Planetarium = "voidraid";

		public static string ScorchedAcres = "wispgraveyard";

		public static string BulwarksAmbry = "artifactword";

		public static string Bazaar = "bazaar";

		public static string GildedCoast = "goldshores";

		public static string MomentWhole = "limbo";

		public static string MomentFractured = "mysteryspace";

		public static string[] AllStandard = new string[18]
		{
			AphelianSanctuary, VoidFields, DistantRoost, DistantRoostAlt, AbyssalDepths, WetlandAspect, RallypointDelta, TitanicPlains, TitanicPlainsAlt, AbandonedAqueduct,
			Commencement, SunderedGrove, SkyMeadow, SirensCall, SiphonedForest, SulfurPools, ScorchedAcres, BulwarksAmbry
		};
	}
	public static class TotallyNotStolenUtils
	{
		public enum ItemIconBackgroundType
		{
			Tier1,
			Tier2,
			Tier3,
			Boss,
			Equipment,
			Lunar,
			Survivor
		}

		private static Dictionary<ItemTier, ItemIconBackgroundType> itemTierToIconBackgroundType = new Dictionary<ItemTier, ItemIconBackgroundType>
		{
			{
				(ItemTier)0,
				ItemIconBackgroundType.Tier1
			},
			{
				(ItemTier)1,
				ItemIconBackgroundType.Tier2
			},
			{
				(ItemTier)2,
				ItemIconBackgroundType.Tier3
			},
			{
				(ItemTier)4,
				ItemIconBackgroundType.Boss
			},
			{
				(ItemTier)3,
				ItemIconBackgroundType.Lunar
			}
		};

		public static ItemIconBackgroundType GetItemIconBackgroundTypeFromTier(ItemTier tier)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			if (itemTierToIconBackgroundType.ContainsKey(tier))
			{
				return itemTierToIconBackgroundType[tier];
			}
			return ItemIconBackgroundType.Tier1;
		}

		public static Sprite AddItemIconBackgroundToSprite(Sprite originalSprite, ItemIconBackgroundType bgType)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Expected O, but got Unknown
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_011e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_017f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Expected O, but got Unknown
			//IL_01de: Unknown result type (might be due to invalid IL or missing references)
			//IL_020e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0214: Unknown result type (might be due to invalid IL or missing references)
			//IL_021b: Expected O, but got Unknown
			//IL_021e: 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_0160: Unknown result type (might be due to invalid IL or missing references)
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_034e: Unknown result type (might be due to invalid IL or missing references)
			//IL_035d: Unknown result type (might be due to invalid IL or missing references)
			//IL_024e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0253: Unknown result type (might be due to invalid IL or missing references)
			//IL_025a: Unknown result type (might be due to invalid IL or missing references)
			//IL_025f: 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_0273: Unknown result type (might be due to invalid IL or missing references)
			//IL_027c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0283: Unknown result type (might be due to invalid IL or missing references)
			//IL_028c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0298: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ea: Unknown result type (might be due to invalid IL or missing references)
			Texture2D texture = originalSprite.texture;
			Texture2D val = new Texture2D(((Texture)texture).width, ((Texture)texture).height, (TextureFormat)5, false);
			Graphics.ConvertTexture((Texture)(object)texture, (Texture)(object)val);
			RenderTexture temporary = RenderTexture.GetTemporary(((Texture)val).width, ((Texture)val).height, 24, (RenderTextureFormat)0);
			temporary.Create();
			RenderTexture.active = temporary;
			Graphics.Blit((Texture)(object)val, temporary);
			val.ReadPixels(new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), 0, 0);
			val.Apply();
			RenderTexture.active = null;
			RenderTexture.ReleaseTemporary(temporary);
			Sprite val2 = null;
			val2 = (Sprite)(bgType switch
			{
				ItemIconBackgroundType.Tier1 => Addressables.LoadAssetAsync<Sprite>((object)"RoR2/Base/Common/texTier1BGIcon.png").WaitForCompletion(), 
				ItemIconBackgroundType.Tier2 => Addressables.LoadAssetAsync<Sprite>((object)"RoR2/Base/Common/texTier2BGIcon.png").WaitForCompletion(), 
				ItemIconBackgroundType.Tier3 => Addressables.LoadAssetAsync<Sprite>((object)"RoR2/Base/Common/texTier3BGIcon.png").WaitForCompletion(), 
				ItemIconBackgroundType.Boss => Addressables.LoadAssetAsync<Sprite>((object)"RoR2/Base/Common/texBossBGIcon.png").WaitForCompletion(), 
				ItemIconBackgroundType.Equipment => Addressables.LoadAssetAsync<Sprite>((object)"RoR2/Base/Common/texEquipmentBGIcon.png").WaitForCompletion(), 
				ItemIconBackgroundType.Lunar => Addressables.LoadAssetAsync<Sprite>((object)"RoR2/Base/Common/texLunarBGIcon.png").WaitForCompletion(), 
				ItemIconBackgroundType.Survivor => Addressables.LoadAssetAsync<Sprite>((object)"RoR2/Base/Common/texSurvivorBGIcon.png").WaitForCompletion(), 
				_ => Addressables.LoadAssetAsync<Sprite>((object)"RoR2/Base/Common/texTier1BGIcon.png").WaitForCompletion(), 
			});
			Texture2D val3 = new Texture2D(((Texture)val).width, ((Texture)val).height, (TextureFormat)5, false);
			Graphics.ConvertTexture((Texture)(object)val2.texture, (Texture)(object)val3);
			temporary = RenderTexture.GetTemporary(((Texture)val3).width, ((Texture)val3).height, 24, (RenderTextureFormat)0);
			temporary.Create();
			RenderTexture.active = temporary;
			Graphics.Blit((Texture)(object)val3, temporary);
			val3.ReadPixels(new Rect(0f, 0f, (float)((Texture)val3).width, (float)((Texture)val3).height), 0, 0);
			val3.Apply();
			RenderTexture.active = null;
			RenderTexture.ReleaseTemporary(temporary);
			Texture2D val4 = new Texture2D(((Texture)val).width, ((Texture)val).height, val.format, false);
			((Texture)val4).wrapMode = ((Texture)val).wrapMode;
			((Texture)val4).filterMode = ((Texture)val).filterMode;
			for (int i = 0; i < ((Texture)val4).width; i++)
			{
				for (int j = 0; j < ((Texture)val4).height; j++)
				{
					Color pixel = val3.GetPixel(i, j);
					Color pixel2 = val.GetPixel(i, j);
					val4.SetPixel(i, j, new Color(pixel.r * (1f - pixel2.a) + pixel2.r * pixel2.a, pixel.g * (1f - pixel2.a) + pixel2.g * pixel2.a, pixel.b * (1f - pixel2.a) + pixel2.b * pixel2.a, Mathf.Clamp01(pixel.a + pixel2.a)));
				}
			}
			val4.Apply();
			return Sprite.Create(val4, new Rect(0f, 0f, (float)((Texture)val4).width, (float)((Texture)val4).height), new Vector2(0.5f, 0.5f), 25f, 1u, (SpriteMeshType)1);
		}

		public static Sprite CreateItemIconWithBackgroundFromItem(ItemDef itemDef)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)itemDef) && Object.op_Implicit((Object)(object)itemDef.pickupIconSprite))
			{
				return AddItemIconBackgroundToSprite(itemDef.pickupIconSprite, GetItemIconBackgroundTypeFromTier(itemDef.tier));
			}
			return null;
		}

		public static Sprite CreateItemIconWithBackgroundFromEquipment(EquipmentDef equipmentDef)
		{
			if (Object.op_Implicit((Object)(object)equipmentDef) && Object.op_Implicit((Object)(object)equipmentDef.pickupIconSprite))
			{
				return AddItemIconBackgroundToSprite(equipmentDef.pickupIconSprite, ItemIconBackgroundType.Equipment);
			}
			return null;
		}
	}
	[RequireComponent(typeof(InputBankTest))]
	[RequireComponent(typeof(CharacterBody))]
	public abstract class Tracker : MonoBehaviour
	{
		public Transform target;

		public Indicator indicator;

		public GameObject targetingIndicatorPrefab;

		private float stopwatch = 0f;

		public float searchDelay = 0.1f;

		public float maxSearchAngle = 40f;

		public float maxSearchDistance = 60f;

		public bool isActive = true;

		public InputBankTest inputBank;

		public CharacterBody body;

		public Func<bool> isActiveCallback = DefaultIsActiveCallback;

		public float minDot => Mathf.Cos(Mathf.Clamp(maxSearchAngle, 0f, 180f) * (MathF.PI / 180f));

		private static bool DefaultIsActiveCallback()
		{
			return true;
		}

		public virtual void Start()
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Expected O, but got Unknown
			indicator = new Indicator(((Component)this).gameObject, targetingIndicatorPrefab);
			body = ((Component)this).GetComponent<CharacterBody>();
			inputBank = ((Component)this).GetComponent<InputBankTest>();
		}

		public virtual void FixedUpdate()
		{
			if (indicator != null && !DefaultIsActiveCallback())
			{
				indicator.active = false;
				return;
			}
			if (indicator != null && !Object.op_Implicit((Object)(object)target))
			{
				indicator.active = false;
			}
			if (indicator != null && Object.op_Implicit((Object)(object)target))
			{
				indicator.active = true;
			}
			stopwatch += Time.fixedDeltaTime;
			if (stopwatch >= searchDelay)
			{
				stopwatch = 0f;
				target = SearchForTarget();
				if (Object.op_Implicit((Object)(object)target))
				{
					indicator.targetTransform = target;
				}
			}
		}

		public abstract Transform SearchForTarget();
	}
	public class HurtboxTracker : Tracker
	{
		public enum TargetType
		{
			Enemy,
			Friendly,
			All
		}

		public TeamIndex userIndex;

		public TargetType targetType;

		public override void Start()
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			base.Start();
			userIndex = body.teamComponent.teamIndex;
		}

		public override Transform SearchForTarget()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//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_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: 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_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			BullseyeSearch val = new BullseyeSearch();
			Ray aimRay = inputBank.GetAimRay();
			val.searchDirection = ((Ray)(ref aimRay)).direction;
			val.searchOrigin = ((Component)this).transform.position;
			val.maxDistanceFilter = maxSearchDistance;
			val.maxAngleFilter = maxSearchAngle;
			TeamMask teamMaskFilter = TeamMask.all;
			switch (targetType)
			{
			case TargetType.Enemy:
				((TeamMask)(ref teamMaskFilter)).RemoveTeam(userIndex);
				break;
			case TargetType.Friendly:
				teamMaskFilter = TeamMask.none;
				((TeamMask)(ref teamMaskFilter)).AddTeam(userIndex);
				break;
			case TargetType.All:
				teamMaskFilter = TeamMask.all;
				break;
			}
			val.teamMaskFilter = teamMaskFilter;
			val.sortMode = (SortMode)2;
			val.RefreshCandidates();
			val.FilterOutGameObject(((Component)this).gameObject);
			IEnumerable<HurtBox> results = val.GetResults();
			HurtBox? obj = results.FirstOrDefault();
			return ((obj != null) ? ((Component)obj).transform : null) ?? null;
		}
	}
	public class ComponentTracker<T> : Tracker where T : Component
	{
		public Func<T, bool> validFilter = DefaultFilter;

		private static bool DefaultFilter(T t)
		{
			return true;
		}

		public override Transform SearchForTarget()
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknow