Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of Projectiles Configurator v1.1.0
ProjectilesConfigurator.dll
Decompiled a week agousing 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); } } }