Decompiled source of Projectiles Configurator v1.1.0

ProjectilesConfigurator.dll

Decompiled a week ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using HG.Coroutines;
using HG.Reflection;
using Microsoft.CodeAnalysis;
using RiskOfOptions;
using RiskOfOptions.Options;
using RoR2;
using RoR2.Projectile;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: OptIn]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("ProjectilesConfigurator")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+6c869157678ad0a79eafefb69035bde051fe5e48")]
[assembly: AssemblyProduct("ProjectilesConfigurator")]
[assembly: AssemblyTitle("ProjectilesConfigurator")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[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 ProjectilesConfigurator
{
	public static class ModCompatabilities
	{
		public static class RiskOfOptionsCompatability
		{
			public const string GUID = "com.rune580.riskofoptions";

			public static void AddConfig<T1, T2>(T1 config, T2 value) where T1 : ConfigEntryBase
			{
				//IL_001f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0029: Expected O, but got Unknown
				//IL_0049: Unknown result type (might be due to invalid IL or missing references)
				//IL_0053: Expected O, but got Unknown
				//IL_0073: Unknown result type (might be due to invalid IL or missing references)
				//IL_007d: Expected O, but got Unknown
				//IL_009d: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a7: Expected O, but got Unknown
				//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d3: Expected O, but got Unknown
				if (config is ConfigEntry<float>)
				{
					ModSettingsManager.AddOption((BaseOption)new FloatFieldOption(config as ConfigEntry<float>));
				}
				if (config is ConfigEntry<bool>)
				{
					ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(config as ConfigEntry<bool>));
				}
				if (config is ConfigEntry<int>)
				{
					ModSettingsManager.AddOption((BaseOption)new IntFieldOption(config as ConfigEntry<int>));
				}
				if (config is ConfigEntry<string>)
				{
					ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(config as ConfigEntry<string>));
				}
				if (value is Enum)
				{
					ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)(config as ConfigEntry<T2>)));
				}
			}
		}
	}
	[Serializable]
	[BepInPlugin("com.brynzananas.projectilesconfigurator", "Projectiles Configurator", "1.1.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class ProjectilesConfiguratorPlugin : BaseUnityPlugin
	{
		public delegate void ConfigureProjectile(GameObject projectile, string sectionName);

		public delegate void ConfigureProjectileAsync(ParallelCoroutine parallelCoroutine, GameObject projectile, string sectionName);

		[CompilerGenerated]
		private sealed class <<ConfigureProjectilesStart>g__runLoadCoroutine|23_0>d : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <<ConfigureProjectilesStart>g__runLoadCoroutine|23_0>d(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = parallelCoroutine;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					Log.LogMessage((object)("Finished configuring projectiles. Time took: " + stopwatch.ElapsedMilliseconds + "ms"));
					stopwatch.Stop();
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[CompilerGenerated]
		private sealed class <>c__DisplayClass24_0
		{
			public ProjectileSimple projectileSimple;

			public ConfigEntry<float> desiredForwardSpeed;

			public ProjectileImpactExplosion projectileImpactExplosion;

			public ConfigEntry<float> lifetime;

			public ProjectileExplosion projectileExplosion;

			public ConfigEntry<float> blastRadius;

			public ConfigEntry<float> blastDamageCoefficient;

			public ConfigEntry<float> blastProcCoefficient;

			public bool hasChildren;

			public ConfigEntry<int> childrenCount;

			public ConfigEntry<float> childrenDamageCoefficient;

			public ConfigEntry<bool> childrenInheritDamageType;

			public bool canApplyDot;

			public ConfigEntry<bool> applyDot;

			public ConfigEntry<float> dotDuration;

			public ConfigEntry<float> dotDamageMultiplier;

			public ConfigEntry<bool> calculateTotalDamage;

			public ConfigEntry<float> totalDamageMultiplier;

			public ProjectileOverlapAttack projectileOverlapAttack;

			public ConfigEntry<float> overlapDamageCoefficient;

			public ConfigEntry<float> overlapProcCoefficient;

			public ConfigEntry<float> overlapPushAwayForce;

			public ConfigEntry<int> overlapMaximumOverlapTargets;

			public ConfigEntry<float> overlapFireFrequency;

			public ConfigEntry<float> overlapResetInterval;

			public ConfigEntry<bool> overlapIsSphereOverlap;

			public ConfigEntry<bool> overlapScaleWithVelocity;

			public ConfigEntry<bool> overlapIsOverrideTeam;

			public ConfigEntry<TeamIndex> overlapOverrideTeam;

			public ConfigEntry<bool> overlapCanHitOwner;

			public ProjectileSteerTowardTarget projectileSteerTowardTarget;

			public ConfigEntry<bool> steerYAxisOnly;

			public ConfigEntry<float> steerRotationSpeed;

			public ConfigEntry<bool> steerIncreaseSpeedOvertime;

			public ConfigEntry<float> steerMaxRotationSpeed;

			public ConfigEntry<float> steerRotationAddPerSecond;

			public BoomerangProjectile boomerangProjectile;

			public ConfigEntry<float> boomerangTravelSpeed;

			public ConfigEntry<float> boomerangCharge;

			public ConfigEntry<float> boomerangTransitionDuration;

			public ConfigEntry<bool> boomerangCanHitCharacters;

			public ConfigEntry<bool> boomerangCanHitWorld;

			public MissileController missileController;

			public ConfigEntry<float> missileMaxVelocity;

			public ConfigEntry<float> missileRollVelocity;

			public ConfigEntry<float> missileAcceleration;

			public ConfigEntry<float> missileDelayTimer;

			public ConfigEntry<float> missileGiveupTimer;

			public ConfigEntry<float> missileDeathTimer;

			public ConfigEntry<float> missileTurbulence;

			public ConfigEntry<float> missileMaxSeekDistance;
		}

		[CompilerGenerated]
		private sealed class <ConfigureProjectileThread>d__24 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public GameObject projectile;

			public string sectionName;

			private <>c__DisplayClass24_0 <>8__1;

			private List<ConfigEntryBase> <configEntryBases>5__2;

			private ConfigEntry<FalloffModel> <falloffModel>5__3;

			private ProjectileCharacterController <projectileCharacterController>5__4;

			private List<ConfigEntryBase>.Enumerator <>s__5;

			private ConfigEntryBase <configEntryBase>5__6;

			private ConfigEntry<float> <configEntry>5__7;

			private ConfigEntry<int> <configEntry2>5__8;

			private ConfigEntry<bool> <configEntry1>5__9;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <ConfigureProjectileThread>d__24(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>8__1 = null;
				<configEntryBases>5__2 = null;
				<falloffModel>5__3 = null;
				<projectileCharacterController>5__4 = null;
				<>s__5 = default(List<ConfigEntryBase>.Enumerator);
				<configEntryBase>5__6 = null;
				<configEntry>5__7 = null;
				<configEntry2>5__8 = null;
				<configEntry1>5__9 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0e37: Unknown result type (might be due to invalid IL or missing references)
				//IL_0750: Unknown result type (might be due to invalid IL or missing references)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
				{
					<>1__state = -1;
					<>8__1 = new <>c__DisplayClass24_0();
					<configEntryBases>5__2 = new List<ConfigEntryBase>();
					<>8__1.projectileSimple = projectile.GetComponent<ProjectileSimple>();
					<>8__1.desiredForwardSpeed = null;
					<>8__1.lifetime = null;
					<>8__1.projectileExplosion = projectile.GetComponent<ProjectileExplosion>();
					<falloffModel>5__3 = null;
					<>8__1.blastRadius = null;
					<>8__1.blastDamageCoefficient = null;
					<>8__1.blastProcCoefficient = null;
					<>8__1.hasChildren = false;
					<>8__1.childrenCount = null;
					<>8__1.childrenDamageCoefficient = null;
					<>8__1.childrenInheritDamageType = null;
					<>8__1.canApplyDot = false;
					<>8__1.applyDot = null;
					<>8__1.dotDuration = null;
					<>8__1.dotDamageMultiplier = null;
					<>8__1.calculateTotalDamage = null;
					<>8__1.totalDamageMultiplier = null;
					<projectileCharacterController>5__4 = projectile.GetComponent<ProjectileCharacterController>();
					ref ProjectileImpactExplosion projectileImpactExplosion = ref <>8__1.projectileImpactExplosion;
					ProjectileExplosion projectileExplosion = <>8__1.projectileExplosion;
					projectileImpactExplosion = (ProjectileImpactExplosion)(object)((projectileExplosion is ProjectileImpactExplosion) ? projectileExplosion : null);
					<>8__1.projectileOverlapAttack = projectile.GetComponent<ProjectileOverlapAttack>();
					<>8__1.overlapDamageCoefficient = null;
					<>8__1.overlapProcCoefficient = null;
					<>8__1.overlapPushAwayForce = null;
					<>8__1.overlapMaximumOverlapTargets = null;
					<>8__1.overlapFireFrequency = null;
					<>8__1.overlapResetInterval = null;
					<>8__1.overlapIsSphereOverlap = null;
					<>8__1.overlapScaleWithVelocity = null;
					<>8__1.overlapIsOverrideTeam = null;
					<>8__1.overlapOverrideTeam = null;
					<>8__1.overlapCanHitOwner = null;
					<>8__1.projectileSteerTowardTarget = projectile.GetComponent<ProjectileSteerTowardTarget>();
					<>8__1.steerYAxisOnly = null;
					<>8__1.steerRotationSpeed = null;
					<>8__1.steerIncreaseSpeedOvertime = null;
					<>8__1.steerMaxRotationSpeed = null;
					<>8__1.steerRotationAddPerSecond = null;
					<>8__1.boomerangProjectile = projectile.GetComponent<BoomerangProjectile>();
					<>8__1.boomerangTravelSpeed = null;
					<>8__1.boomerangCharge = null;
					<>8__1.boomerangTransitionDuration = null;
					<>8__1.boomerangCanHitCharacters = null;
					<>8__1.boomerangCanHitWorld = null;
					<>8__1.missileController = projectile.GetComponent<MissileController>();
					<>8__1.missileMaxVelocity = null;
					<>8__1.missileRollVelocity = null;
					<>8__1.missileAcceleration = null;
					<>8__1.missileDelayTimer = null;
					<>8__1.missileGiveupTimer = null;
					<>8__1.missileDeathTimer = null;
					<>8__1.missileTurbulence = null;
					<>8__1.missileMaxSeekDistance = null;
					<>2__current = null;
					<>1__state = 1;
					return true;
				}
				case 1:
					<>1__state = -1;
					if (Object.op_Implicit((Object)(object)<>8__1.projectileSimple))
					{
						<>8__1.desiredForwardSpeed = CreateConfig(sectionName, "Desired Forward Speed", <>8__1.projectileSimple.desiredForwardSpeed, "", <configEntryBases>5__2);
						<>2__current = null;
						<>1__state = 2;
						return true;
					}
					if (Object.op_Implicit((Object)(object)<projectileCharacterController>5__4))
					{
						<>8__1.desiredForwardSpeed = CreateConfig(sectionName, "Desired Forward Speed", <projectileCharacterController>5__4.velocity, "", <configEntryBases>5__2);
						<>2__current = null;
						<>1__state = 5;
						return true;
					}
					goto IL_071f;
				case 2:
					<>1__state = -1;
					if (Object.op_Implicit((Object)(object)<>8__1.projectileImpactExplosion) && <>8__1.projectileImpactExplosion.explodeOnLifeTimeExpiration)
					{
						<>8__1.lifetime = CreateConfig(sectionName, "Lifetime", <>8__1.projectileImpactExplosion.lifetime, "", <configEntryBases>5__2);
						<>2__current = null;
						<>1__state = 3;
						return true;
					}
					<>8__1.lifetime = CreateConfig(sectionName, "Lifetime", <>8__1.projectileSimple.lifetime, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 4;
					return true;
				case 3:
					<>1__state = -1;
					goto IL_071f;
				case 4:
					<>1__state = -1;
					goto IL_071f;
				case 5:
					<>1__state = -1;
					if (Object.op_Implicit((Object)(object)<>8__1.projectileImpactExplosion) && <>8__1.projectileImpactExplosion.explodeOnLifeTimeExpiration)
					{
						<>8__1.lifetime = CreateConfig(sectionName, "Lifetime", <>8__1.projectileImpactExplosion.lifetime, "", <configEntryBases>5__2);
						<>2__current = null;
						<>1__state = 6;
						return true;
					}
					<>8__1.lifetime = CreateConfig(sectionName, "Lifetime", <projectileCharacterController>5__4.lifetime, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 7;
					return true;
				case 6:
					<>1__state = -1;
					goto IL_071f;
				case 7:
					<>1__state = -1;
					goto IL_071f;
				case 8:
					<>1__state = -1;
					<>8__1.blastRadius = CreateConfig(sectionName, "Explosion Blast Radius", <>8__1.projectileExplosion.blastRadius, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 9;
					return true;
				case 9:
					<>1__state = -1;
					<>8__1.blastDamageCoefficient = CreateConfig(sectionName, "Explosion Blast Damage Coefficient", <>8__1.projectileExplosion.blastDamageCoefficient, "The percentage of the damage, proc coefficient, and force of the initial projectile. Ranges from 0-1", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 10;
					return true;
				case 10:
					<>1__state = -1;
					<>8__1.blastProcCoefficient = CreateConfig(sectionName, "Explosion Blast Proc Coefficient", <>8__1.projectileExplosion.blastProcCoefficient, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 11;
					return true;
				case 11:
					<>1__state = -1;
					<>8__1.hasChildren = Object.op_Implicit((Object)(object)<>8__1.projectileExplosion.childrenProjectilePrefab);
					if (<>8__1.hasChildren)
					{
						<>8__1.childrenCount = CreateConfig(sectionName, "Explosion Children Count", <>8__1.projectileExplosion.childrenCount, "", <configEntryBases>5__2);
						<>2__current = null;
						<>1__state = 12;
						return true;
					}
					goto IL_098b;
				case 12:
					<>1__state = -1;
					<>8__1.childrenDamageCoefficient = CreateConfig(sectionName, "Explosion Children Damage Coefficient", <>8__1.projectileExplosion.childrenDamageCoefficient, "What percentage of our damage does the children get?", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 13;
					return true;
				case 13:
					<>1__state = -1;
					<>8__1.childrenInheritDamageType = CreateConfig(sectionName, "Explosion Children Inherit Damage Type", <>8__1.projectileExplosion.childrenInheritDamageType, "Should children inherit the damage type of this projectile?", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 14;
					return true;
				case 14:
					<>1__state = -1;
					goto IL_098b;
				case 15:
					<>1__state = -1;
					<>8__1.dotDuration = CreateConfig(sectionName, "Explosion DoT Duration", <>8__1.projectileExplosion.dotDuration, "Duration in seconds of the DoT. Unused if calculateTotalDamage is true.", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 16;
					return true;
				case 16:
					<>1__state = -1;
					<>8__1.dotDamageMultiplier = CreateConfig(sectionName, "Explosion DoT Damage Multiplier", <>8__1.projectileExplosion.dotDamageMultiplier, "Multiplier on the per-tick damage", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 17;
					return true;
				case 17:
					<>1__state = -1;
					<>8__1.calculateTotalDamage = CreateConfig(sectionName, "Explosion Calculate Total Damage", <>8__1.projectileExplosion.calculateTotalDamage, "If true, we disregard the duration and instead specify the total damage.", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 18;
					return true;
				case 18:
					<>1__state = -1;
					<>8__1.totalDamageMultiplier = CreateConfig(sectionName, "Explosion Total Damage Multiplier", <>8__1.projectileExplosion.totalDamageMultiplier, "totalDamage = totalDamageMultiplier * attacker's damage", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 19;
					return true;
				case 19:
					<>1__state = -1;
					goto IL_0b43;
				case 20:
					<>1__state = -1;
					<>8__1.overlapProcCoefficient = CreateConfig(sectionName, "Overlap Attack Proc Coefficient", <>8__1.projectileOverlapAttack.overlapProcCoefficient, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 21;
					return true;
				case 21:
					<>1__state = -1;
					<>8__1.overlapPushAwayForce = CreateConfig(sectionName, "Overlap Attack Push Away Force", <>8__1.projectileOverlapAttack.pushAwayForce, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 22;
					return true;
				case 22:
					<>1__state = -1;
					<>8__1.overlapMaximumOverlapTargets = CreateConfig(sectionName, "Overlap Attack Maximum Overlap Targets", <>8__1.projectileOverlapAttack.maximumOverlapTargets, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 23;
					return true;
				case 23:
					<>1__state = -1;
					<>8__1.overlapFireFrequency = CreateConfig(sectionName, "Overlap Attack Fire Frequency", <>8__1.projectileOverlapAttack.fireFrequency, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 24;
					return true;
				case 24:
					<>1__state = -1;
					<>8__1.overlapResetInterval = CreateConfig(sectionName, "Overlap Attack Reset Interval", <>8__1.projectileOverlapAttack.resetInterval, "If non-negative, the attack clears its hit memory at the specified interval.", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 25;
					return true;
				case 25:
					<>1__state = -1;
					<>8__1.overlapIsSphereOverlap = CreateConfig(sectionName, "Overlap Attack Is Sphere Overlap", <>8__1.projectileOverlapAttack.isSphereOverlap, "Treat the hurtbox's scale as a radius to define a sphere. Assumes a uniformly scaled hurtbox", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 26;
					return true;
				case 26:
					<>1__state = -1;
					<>8__1.overlapScaleWithVelocity = CreateConfig(sectionName, "Overlap Attack Scale With Velocity", <>8__1.projectileOverlapAttack.ScaleWithVelocity, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 27;
					return true;
				case 27:
					<>1__state = -1;
					<>8__1.overlapIsOverrideTeam = CreateConfig(sectionName, "Overlap Attack Is Override Team", <>8__1.projectileOverlapAttack.isOverrideTeam, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 28;
					return true;
				case 28:
					<>1__state = -1;
					<>8__1.overlapOverrideTeam = CreateConfig<TeamIndex>(sectionName, "Overlap Attack Override Team Index", <>8__1.projectileOverlapAttack.OverrideTeamIndex, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 29;
					return true;
				case 29:
					<>1__state = -1;
					<>8__1.overlapCanHitOwner = CreateConfig(sectionName, "Overlap Attack Can Hit Owner", <>8__1.projectileOverlapAttack.canHitOwner, "If artifact of chaos is active, then this overlap attack can hurt the owner", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 30;
					return true;
				case 30:
					<>1__state = -1;
					goto IL_0eb8;
				case 31:
					<>1__state = -1;
					<>8__1.steerRotationSpeed = CreateConfig(sectionName, "Steer Toward Target Rotation Speed", <>8__1.projectileSteerTowardTarget.rotationSpeed, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 32;
					return true;
				case 32:
					<>1__state = -1;
					<>8__1.steerIncreaseSpeedOvertime = CreateConfig(sectionName, "Steer Toward Target Increase Speed Overtime", <>8__1.projectileSteerTowardTarget.increaseSpeedOverTime, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 33;
					return true;
				case 33:
					<>1__state = -1;
					<>8__1.steerMaxRotationSpeed = CreateConfig(sectionName, "Steer Toward Target Max Rotation Speed", <>8__1.projectileSteerTowardTarget.maxRotationSpeed, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 34;
					return true;
				case 34:
					<>1__state = -1;
					<>8__1.steerRotationAddPerSecond = CreateConfig(sectionName, "Steer Toward Target Rotation Add Per Second", <>8__1.projectileSteerTowardTarget.rotationAddPerSecond, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 35;
					return true;
				case 35:
					<>1__state = -1;
					goto IL_1059;
				case 36:
					<>1__state = -1;
					<>8__1.boomerangCharge = CreateConfig(sectionName, "Boomerang Charge", <>8__1.boomerangProjectile.charge, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 37;
					return true;
				case 37:
					<>1__state = -1;
					<>8__1.boomerangTransitionDuration = CreateConfig(sectionName, "Boomerang Transition Duration", <>8__1.boomerangProjectile.transitionDuration, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 38;
					return true;
				case 38:
					<>1__state = -1;
					<>8__1.boomerangCanHitCharacters = CreateConfig(sectionName, "Boomerang Travel Can Hit Characters", <>8__1.boomerangProjectile.canHitCharacters, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 39;
					return true;
				case 39:
					<>1__state = -1;
					<>8__1.boomerangCanHitWorld = CreateConfig(sectionName, "Boomerang Travel Can Hit World", <>8__1.boomerangProjectile.canHitWorld, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 40;
					return true;
				case 40:
					<>1__state = -1;
					goto IL_11fa;
				case 41:
					<>1__state = -1;
					<>8__1.missileRollVelocity = CreateConfig(sectionName, "Missile Roll Velocity", <>8__1.missileController.rollVelocity, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 42;
					return true;
				case 42:
					<>1__state = -1;
					<>8__1.missileAcceleration = CreateConfig(sectionName, "Missile Acceleration", <>8__1.missileController.acceleration, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 43;
					return true;
				case 43:
					<>1__state = -1;
					<>8__1.missileDelayTimer = CreateConfig(sectionName, "Missile Delay Timer", <>8__1.missileController.delayTimer, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 44;
					return true;
				case 44:
					<>1__state = -1;
					<>8__1.missileGiveupTimer = CreateConfig(sectionName, "Missile Giveup Timer", <>8__1.missileController.giveupTimer, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 45;
					return true;
				case 45:
					<>1__state = -1;
					<>8__1.missileDeathTimer = CreateConfig(sectionName, "Missile Death Timer", <>8__1.missileController.deathTimer, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 46;
					return true;
				case 46:
					<>1__state = -1;
					<>8__1.missileTurbulence = CreateConfig(sectionName, "Missile Turbulence", <>8__1.missileController.turbulence, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 47;
					return true;
				case 47:
					<>1__state = -1;
					<>8__1.missileMaxSeekDistance = CreateConfig(sectionName, "Missile Max Seek Distance", <>8__1.missileController.maxSeekDistance, "", <configEntryBases>5__2);
					<>2__current = null;
					<>1__state = 48;
					return true;
				case 48:
					{
						<>1__state = -1;
						break;
					}
					IL_098b:
					<>8__1.canApplyDot = <>8__1.projectileExplosion.applyDot;
					if (<>8__1.canApplyDot)
					{
						<>8__1.applyDot = CreateConfig(sectionName, "Explosion Apply DoT", <>8__1.projectileExplosion.applyDot, "", <configEntryBases>5__2);
						<>2__current = null;
						<>1__state = 15;
						return true;
					}
					goto IL_0b43;
					IL_0eb8:
					if (Object.op_Implicit((Object)(object)<>8__1.projectileSteerTowardTarget))
					{
						<>8__1.steerYAxisOnly = CreateConfig(sectionName, "Steer Toward Target Y Axis Only", <>8__1.projectileSteerTowardTarget.yAxisOnly, "", <configEntryBases>5__2);
						<>2__current = null;
						<>1__state = 31;
						return true;
					}
					goto IL_1059;
					IL_1059:
					if (Object.op_Implicit((Object)(object)<>8__1.boomerangProjectile))
					{
						<>8__1.boomerangTravelSpeed = CreateConfig(sectionName, "Boomerang Travel Speed", <>8__1.boomerangProjectile.travelSpeed, "", <configEntryBases>5__2);
						<>2__current = null;
						<>1__state = 36;
						return true;
					}
					goto IL_11fa;
					IL_071f:
					if (Object.op_Implicit((Object)(object)<>8__1.projectileExplosion))
					{
						<falloffModel>5__3 = CreateConfig<FalloffModel>(sectionName, "Explosion Falloff Model", <>8__1.projectileExplosion.falloffModel, "", <configEntryBases>5__2);
						<>2__current = null;
						<>1__state = 8;
						return true;
					}
					goto IL_0b43;
					IL_0b43:
					if (Object.op_Implicit((Object)(object)<>8__1.projectileOverlapAttack))
					{
						<>8__1.overlapDamageCoefficient = CreateConfig(sectionName, "Overlap Attack Damage Coefficient", <>8__1.projectileOverlapAttack.damageCoefficient, "", <configEntryBases>5__2);
						<>2__current = null;
						<>1__state = 20;
						return true;
					}
					goto IL_0eb8;
					IL_11fa:
					if (Object.op_Implicit((Object)(object)<>8__1.missileController))
					{
						<>8__1.missileMaxVelocity = CreateConfig(sectionName, "Missile Max Velocity", <>8__1.missileController.maxVelocity, "", <configEntryBases>5__2);
						<>2__current = null;
						<>1__state = 41;
						return true;
					}
					break;
				}
				<>s__5 = <configEntryBases>5__2.GetEnumerator();
				try
				{
					while (<>s__5.MoveNext())
					{
						<configEntryBase>5__6 = <>s__5.Current;
						<configEntry>5__7 = <configEntryBase>5__6 as ConfigEntry<float>;
						if (<configEntry>5__7 == null)
						{
							<configEntry2>5__8 = <configEntryBase>5__6 as ConfigEntry<int>;
							if (<configEntry2>5__8 == null)
							{
								<configEntry1>5__9 = <configEntryBase>5__6 as ConfigEntry<bool>;
								if (<configEntry1>5__9 == null)
								{
									continue;
								}
								<configEntry1>5__9.SettingChanged += ConfigEntry_SettingChanged;
								<configEntry1>5__9 = null;
							}
							else
							{
								<configEntry2>5__8.SettingChanged += ConfigEntry_SettingChanged;
							}
							<configEntry2>5__8 = null;
						}
						else
						{
							<configEntry>5__7.SettingChanged += ConfigEntry_SettingChanged;
						}
						<configEntry>5__7 = null;
						<configEntryBase>5__6 = null;
					}
				}
				finally
				{
					((IDisposable)<>s__5).Dispose();
				}
				<>s__5 = default(List<ConfigEntryBase>.Enumerator);
				UpdateProjectile();
				GetProjectileCustomConfigs?.Invoke(projectile, sectionName);
				return false;
				void ConfigEntry_SettingChanged(object sender, EventArgs e)
				{
					UpdateProjectile();
				}
				void UpdateProjectile()
				{
					//IL_0290: Unknown result type (might be due to invalid IL or missing references)
					//IL_0295: Unknown result type (might be due to invalid IL or missing references)
					if (Object.op_Implicit((Object)(object)((<>c__DisplayClass24_0)this).projectileSimple))
					{
						((<>c__DisplayClass24_0)this).projectileSimple.desiredForwardSpeed = ((<>c__DisplayClass24_0)this).desiredForwardSpeed.Value;
						if (Object.op_Implicit((Object)(object)((<>c__DisplayClass24_0)this).projectileImpactExplosion) && ((<>c__DisplayClass24_0)this).projectileImpactExplosion.explodeOnLifeTimeExpiration)
						{
							((<>c__DisplayClass24_0)this).projectileImpactExplosion.lifetime = ((<>c__DisplayClass24_0)this).lifetime.Value;
							((<>c__DisplayClass24_0)this).projectileSimple.lifetime = float.PositiveInfinity;
						}
						else
						{
							((<>c__DisplayClass24_0)this).projectileSimple.lifetime = ((<>c__DisplayClass24_0)this).lifetime.Value;
						}
					}
					if (Object.op_Implicit((Object)(object)((<>c__DisplayClass24_0)this).projectileExplosion))
					{
						((<>c__DisplayClass24_0)this).projectileExplosion.blastRadius = ((<>c__DisplayClass24_0)this).blastRadius.Value;
						((<>c__DisplayClass24_0)this).projectileExplosion.blastDamageCoefficient = ((<>c__DisplayClass24_0)this).blastDamageCoefficient.Value;
						((<>c__DisplayClass24_0)this).projectileExplosion.blastProcCoefficient = ((<>c__DisplayClass24_0)this).blastProcCoefficient.Value;
						if (((<>c__DisplayClass24_0)this).hasChildren)
						{
							((<>c__DisplayClass24_0)this).projectileExplosion.childrenCount = ((<>c__DisplayClass24_0)this).childrenCount.Value;
							((<>c__DisplayClass24_0)this).projectileExplosion.childrenDamageCoefficient = ((<>c__DisplayClass24_0)this).childrenDamageCoefficient.Value;
							((<>c__DisplayClass24_0)this).projectileExplosion.childrenInheritDamageType = ((<>c__DisplayClass24_0)this).childrenInheritDamageType.Value;
						}
						if (((<>c__DisplayClass24_0)this).canApplyDot)
						{
							((<>c__DisplayClass24_0)this).projectileExplosion.applyDot = ((<>c__DisplayClass24_0)this).applyDot.Value;
							((<>c__DisplayClass24_0)this).projectileExplosion.dotDuration = ((<>c__DisplayClass24_0)this).dotDuration.Value;
							((<>c__DisplayClass24_0)this).projectileExplosion.dotDamageMultiplier = ((<>c__DisplayClass24_0)this).dotDamageMultiplier.Value;
							((<>c__DisplayClass24_0)this).projectileExplosion.calculateTotalDamage = ((<>c__DisplayClass24_0)this).calculateTotalDamage.Value;
							((<>c__DisplayClass24_0)this).projectileExplosion.totalDamageMultiplier = ((<>c__DisplayClass24_0)this).totalDamageMultiplier.Value;
						}
					}
					if (Object.op_Implicit((Object)(object)((<>c__DisplayClass24_0)this).projectileOverlapAttack))
					{
						((<>c__DisplayClass24_0)this).projectileOverlapAttack.damageCoefficient = ((<>c__DisplayClass24_0)this).overlapDamageCoefficient.Value;
						((<>c__DisplayClass24_0)this).projectileOverlapAttack.overlapProcCoefficient = ((<>c__DisplayClass24_0)this).overlapProcCoefficient.Value;
						((<>c__DisplayClass24_0)this).projectileOverlapAttack.pushAwayForce = ((<>c__DisplayClass24_0)this).overlapPushAwayForce.Value;
						((<>c__DisplayClass24_0)this).projectileOverlapAttack.maximumOverlapTargets = ((<>c__DisplayClass24_0)this).overlapMaximumOverlapTargets.Value;
						((<>c__DisplayClass24_0)this).projectileOverlapAttack.fireFrequency = ((<>c__DisplayClass24_0)this).overlapFireFrequency.Value;
						((<>c__DisplayClass24_0)this).projectileOverlapAttack.resetInterval = ((<>c__DisplayClass24_0)this).overlapResetInterval.Value;
						((<>c__DisplayClass24_0)this).projectileOverlapAttack.isSphereOverlap = ((<>c__DisplayClass24_0)this).overlapIsSphereOverlap.Value;
						((<>c__DisplayClass24_0)this).projectileOverlapAttack.ScaleWithVelocity = ((<>c__DisplayClass24_0)this).overlapScaleWithVelocity.Value;
						((<>c__DisplayClass24_0)this).projectileOverlapAttack.isOverrideTeam = ((<>c__DisplayClass24_0)this).overlapIsOverrideTeam.Value;
						((<>c__DisplayClass24_0)this).projectileOverlapAttack.OverrideTeamIndex = ((<>c__DisplayClass24_0)this).overlapOverrideTeam.Value;
						((<>c__DisplayClass24_0)this).projectileOverlapAttack.canHitOwner = ((<>c__DisplayClass24_0)this).overlapCanHitOwner.Value;
					}
					if (Object.op_Implicit((Object)(object)((<>c__DisplayClass24_0)this).projectileSteerTowardTarget))
					{
						((<>c__DisplayClass24_0)this).projectileSteerTowardTarget.yAxisOnly = ((<>c__DisplayClass24_0)this).steerYAxisOnly.Value;
						((<>c__DisplayClass24_0)this).projectileSteerTowardTarget.rotationSpeed = ((<>c__DisplayClass24_0)this).steerRotationSpeed.Value;
						((<>c__DisplayClass24_0)this).projectileSteerTowardTarget.increaseSpeedOverTime = ((<>c__DisplayClass24_0)this).steerIncreaseSpeedOvertime.Value;
						((<>c__DisplayClass24_0)this).projectileSteerTowardTarget.maxRotationSpeed = ((<>c__DisplayClass24_0)this).steerMaxRotationSpeed.Value;
						((<>c__DisplayClass24_0)this).projectileSteerTowardTarget.rotationAddPerSecond = ((<>c__DisplayClass24_0)this).steerRotationAddPerSecond.Value;
					}
					if (Object.op_Implicit((Object)(object)((<>c__DisplayClass24_0)this).boomerangProjectile))
					{
						((<>c__DisplayClass24_0)this).boomerangProjectile.travelSpeed = ((<>c__DisplayClass24_0)this).boomerangTravelSpeed.Value;
						((<>c__DisplayClass24_0)this).boomerangProjectile.charge = ((<>c__DisplayClass24_0)this).boomerangCharge.Value;
						((<>c__DisplayClass24_0)this).boomerangProjectile.transitionDuration = ((<>c__DisplayClass24_0)this).boomerangTransitionDuration.Value;
						((<>c__DisplayClass24_0)this).boomerangProjectile.canHitCharacters = ((<>c__DisplayClass24_0)this).boomerangCanHitCharacters.Value;
						((<>c__DisplayClass24_0)this).boomerangProjectile.canHitWorld = ((<>c__DisplayClass24_0)this).boomerangCanHitWorld.Value;
					}
					if (Object.op_Implicit((Object)(object)((<>c__DisplayClass24_0)this).missileController))
					{
						((<>c__DisplayClass24_0)this).missileController.maxVelocity = ((<>c__DisplayClass24_0)this).missileMaxVelocity.Value;
						((<>c__DisplayClass24_0)this).missileController.rollVelocity = ((<>c__DisplayClass24_0)this).missileRollVelocity.Value;
						((<>c__DisplayClass24_0)this).missileController.acceleration = ((<>c__DisplayClass24_0)this).missileAcceleration.Value;
						((<>c__DisplayClass24_0)this).missileController.delayTimer = ((<>c__DisplayClass24_0)this).missileDelayTimer.Value;
						((<>c__DisplayClass24_0)this).missileController.giveupTimer = ((<>c__DisplayClass24_0)this).missileGiveupTimer.Value;
						((<>c__DisplayClass24_0)this).missileController.deathTimer = ((<>c__DisplayClass24_0)this).missileDeathTimer.Value;
						((<>c__DisplayClass24_0)this).missileController.turbulence = ((<>c__DisplayClass24_0)this).missileTurbulence.Value;
						((<>c__DisplayClass24_0)this).missileController.maxSeekDistance = ((<>c__DisplayClass24_0)this).missileMaxSeekDistance.Value;
					}
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		public const string ModGuid = "com.brynzananas.projectilesconfigurator";

		public const string ModName = "Projectiles Configurator";

		public const string ModVer = "1.1.0";

		public static Dictionary<string, int> names = new Dictionary<string, int>();

		public static ConfigureProjectile GetProjectileCustomConfigs;

		public static ConfigureProjectileAsync GetProjectileCustomConfigsAsync;

		private static ParallelCoroutine parallelCoroutine;

		private static Stopwatch stopwatch;

		public static bool riskOfOptionsEnabled { get; private set; }

		public static ConfigFile configFile { get; private set; }

		public static ManualLogSource Log { get; private set; }

		public void Awake()
		{
			configFile = ((BaseUnityPlugin)this).Config;
			Log = ((BaseUnityPlugin)this).Logger;
			riskOfOptionsEnabled = Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions");
		}

		[SystemInitializer(new Type[] { typeof(ProjectileCatalog) })]
		private static void ConfigureProjectilesStart()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			Log.LogMessage((object)"Begin configuring projectiles");
			parallelCoroutine = new ParallelCoroutine();
			stopwatch = Stopwatch.StartNew();
			stopwatch.Start();
			int num = 0;
			GameObject[] projectilePrefabs = ProjectileCatalog.projectilePrefabs;
			foreach (GameObject val in projectilePrefabs)
			{
				num++;
				string text = ((Object)val).name;
				char[] array = new char[6] { '\n', '\t', '"', '\'', '[', ']' };
				char[] array2 = array;
				foreach (char c in array2)
				{
					while (text.Contains(c))
					{
						text = text.Replace(c, ' ');
					}
				}
				text.Trim();
				if (!Utility.IsNullOrWhiteSpace(text))
				{
					int k;
					for (k = 0; names.ContainsKey(text + ((k == 0) ? "" : ((object)k))); k++)
					{
					}
					text += ((k == 0) ? "" : ((object)k));
					names.Add(text, k);
					ConfigEntry<bool> val2 = CreateConfig(text, "Enable Config", defaultValue: false, "Enable configuration for this projectile?", null, enableRiskOfOptions: false);
					if (val2.Value)
					{
						parallelCoroutine.Add(ConfigureProjectileThread(val, text));
						GetProjectileCustomConfigsAsync?.Invoke(parallelCoroutine, val, text);
					}
				}
			}
			((MonoBehaviour)RoR2Application.instance).StartCoroutine(runLoadCoroutine());
			[IteratorStateMachine(typeof(<<ConfigureProjectilesStart>g__runLoadCoroutine|23_0>d))]
			static IEnumerator runLoadCoroutine()
			{
				//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
				return new <<ConfigureProjectilesStart>g__runLoadCoroutine|23_0>d(0);
			}
		}

		[IteratorStateMachine(typeof(<ConfigureProjectileThread>d__24))]
		private static IEnumerator ConfigureProjectileThread(GameObject projectile, string sectionName)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <ConfigureProjectileThread>d__24(0)
			{
				projectile = projectile,
				sectionName = sectionName
			};
		}

		private static ConfigEntry<T> CreateConfig<T>(string section, string key, T defaultValue, string description, List<ConfigEntryBase> configEntryBases)
		{
			return CreateConfig(section, key, defaultValue, description, configEntryBases, enableRiskOfOptions: true);
		}

		private static ConfigEntry<T> CreateConfig<T>(string section, string key, T defaultValue, string description, List<ConfigEntryBase> configEntryBases, bool enableRiskOfOptions)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Expected O, but got Unknown
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Expected O, but got Unknown
			ConfigDefinition val = new ConfigDefinition(section, key);
			ConfigDescription val2 = new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty<object>());
			ConfigEntry<T> val3 = configFile.Bind<T>(val, defaultValue, val2);
			configEntryBases?.Add((ConfigEntryBase)(object)val3);
			if (enableRiskOfOptions && riskOfOptionsEnabled)
			{
				ModCompatabilities.RiskOfOptionsCompatability.AddConfig<ConfigEntry<T>, T>(val3, defaultValue);
			}
			return val3;
		}

		public static ConfigEntry<T> CreateConfig<T>(string section, string key, T defaultValue, string description, bool autoHandleRiskOfOptions)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Expected O, but got Unknown
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Expected O, but got Unknown
			ConfigDefinition val = new ConfigDefinition(section, key);
			ConfigDescription val2 = new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty<object>());
			ConfigEntry<T> val3 = configFile.Bind<T>(val, defaultValue, val2);
			if (autoHandleRiskOfOptions && riskOfOptionsEnabled)
			{
				ModCompatabilities.RiskOfOptionsCompatability.AddConfig<ConfigEntry<T>, T>(val3, defaultValue);
			}
			return val3;
		}

		public static ConfigEntry<T> CreateConfig<T>(string section, string key, T defaultValue, string description)
		{
			return CreateConfig(section, key, defaultValue, description, autoHandleRiskOfOptions: true);
		}
	}
}