Decompiled source of RecoveredAndReformedStripped v1.0.0

RecoveredAndReformed.dll

Decompiled 2 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using EntityStates;
using EntityStates.Assassin2;
using EntityStates.EngiTurret.EngiTurretWeapon;
using EntityStates.MajorConstruct;
using EntityStates.MajorConstruct.Stance;
using EntityStates.MajorConstruct.Weapon;
using HarmonyLib;
using IL.EntityStates;
using IL.EntityStates.Assassin2;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using On.EntityStates;
using On.EntityStates.Assassin2;
using On.EntityStates.MajorConstruct.Stance;
using On.EntityStates.MajorConstruct.Weapon;
using R2API;
using RoR2;
using RoR2.CharacterAI;
using RoR2.ExpansionManagement;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Networking;

[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 = "")]
[assembly: AssemblyCompany("RecoveredAndReformed")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("RecoveredAndReformed")]
[assembly: AssemblyTitle("RecoveredAndReformed")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace RecoveredAndReformed;

[BepInPlugin("Phreel.RecoveredAndReformedStripped", "RecoveredAndReformedStripped", "1.0.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class Main : BaseUnityPlugin
{
	public const string PluginGUID = "Phreel.RecoveredAndReformedStripped";

	public const string PluginAuthor = "Phreel";

	public const string PluginName = "RecoveredAndReformedStripped";

	public const string PluginVersion = "1.0.0";

	public static ManualLogSource Log;

	public static PluginInfo pluginInfo;

	public static Harmony Harmony;

	public static ConfigFile Config;

	public static ConfigEntry<string> MajorConstructSpawn;

	public static ConfigEntry<string> Assassin2Spawn;

	public static ConfigEntry<int> MajorConstructMinStage;

	public static ConfigEntry<int> Assassin2MinStage;

	public static ConfigEntry<float> MajorConstructHealth;

	public static ConfigEntry<float> MajorConstructHealthStack;

	public static ConfigEntry<float> MajorConstructDamage;

	public static ConfigEntry<float> MajorConstructDamageStack;

	public static ConfigEntry<float> MajorConstructAttackSpeed;

	public static ConfigEntry<float> MajorConstructArmor;

	public static ConfigEntry<int> MajorConstructCost;

	public static ConfigEntry<float> Assassin2Health;

	public static ConfigEntry<float> Assassin2HealthStack;

	public static ConfigEntry<float> Assassin2Damage;

	public static ConfigEntry<float> Assassin2DamageStack;

	public static ConfigEntry<float> Assassin2AttackSpeed;

	public static ConfigEntry<float> Assassin2Speed;

	public static ConfigEntry<float> Assassin2Armor;

	public static ConfigEntry<int> Assassin2Cost;

	public static ConfigEntry<float> MajorConstructDeathTimer;

	public static ConfigEntry<int> MajorConstructSpawnAmount;

	public static ConfigEntry<bool> MajorConstructSpawnSigmaInstead;

	public static ConfigEntry<float> MajorConstructBeamDistance;

	public static ConfigEntry<float> MajorConstructAimSpeed;

	public static ConfigEntry<float> Assassin2InvisDuration;

	public static ConfigEntry<float> Assassin2InvisEndlag;

	public static ConfigEntry<float> Assassin2DashDuration;

	public static ConfigEntry<float> Assassin2DashSpeed;

	public static ConfigEntry<float> Assassin2SlashDuration;

	public static ConfigEntry<float> Assassin2SlashDamage;

	public static ConfigEntry<float> Assassin2SlashKnockback;

	public static ConfigEntry<float> Assassin2SlashReach;

	public static ConfigEntry<bool> Assassin2Slash1;

	public static ConfigEntry<bool> Assassin2Slash2;

	public static ConfigEntry<float> Assassin2SlashExpose;

	public static ConfigEntry<float> Assassin2SlashSize;

	public static ConfigEntry<bool> Assassin2SlashMultihit;

	public static ConfigEntry<float> Assassin2ShurikenSize;

	public static ConfigEntry<bool> Assassin2Accurate;

	public static ConfigEntry<bool> Assassin2AccurateLoop;

	public static ExpansionDef DLC1;

	public void Awake()
	{
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_002c: Expected O, but got Unknown
		//IL_003c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0046: Expected O, but got Unknown
		//IL_0612: Unknown result type (might be due to invalid IL or missing references)
		//IL_0617: Unknown result type (might be due to invalid IL or missing references)
		//IL_061e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0625: Unknown result type (might be due to invalid IL or missing references)
		//IL_0627: Unknown result type (might be due to invalid IL or missing references)
		//IL_062c: Unknown result type (might be due to invalid IL or missing references)
		//IL_063e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0646: Expected O, but got Unknown
		//IL_0646: Unknown result type (might be due to invalid IL or missing references)
		//IL_064b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0652: Unknown result type (might be due to invalid IL or missing references)
		//IL_0659: Unknown result type (might be due to invalid IL or missing references)
		//IL_065b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0660: Unknown result type (might be due to invalid IL or missing references)
		//IL_0672: Unknown result type (might be due to invalid IL or missing references)
		//IL_067b: Expected O, but got Unknown
		//IL_067c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0681: Unknown result type (might be due to invalid IL or missing references)
		//IL_0688: Unknown result type (might be due to invalid IL or missing references)
		//IL_068a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0694: Expected O, but got Unknown
		//IL_0695: Unknown result type (might be due to invalid IL or missing references)
		//IL_069a: Unknown result type (might be due to invalid IL or missing references)
		//IL_06a2: Unknown result type (might be due to invalid IL or missing references)
		//IL_06a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_06ae: Expected O, but got Unknown
		pluginInfo = ((BaseUnityPlugin)this).Info;
		Log = ((BaseUnityPlugin)this).Logger;
		Harmony = new Harmony("Phreel.RecoveredAndReformedStripped");
		Config = new ConfigFile(Path.Combine(Paths.ConfigPath, "Phreel.RecoveredAndReformedStripped.cfg"), true);
		MajorConstructSpawn = Config.Bind<string>("Spawns", "Iota Construct Spawn Scenes", "skymeadow, itskymeadow, sulfurpools, itgolemplains, golemplains, golemplains2, forgottenhaven, FBLScene", "List of scene names, separated by comma. By default, where Xi Construct spawns.");
		Assassin2Spawn = Config.Bind<string>("Spawns", "Assassin Spawn Scenes", "blackbeach, blackbeach2, rootjungle, arena, shipgraveyard, wispgraveyard, itancientloft, ancientloft", "List of scene names, separated by comma.");
		MajorConstructMinStage = Config.Bind<int>("Spawns", "Iota Construct Minimum Stage", 4, "Starting stage.");
		Assassin2MinStage = Config.Bind<int>("Spawns", "Assassin Minimum Stage", 3, "Starting stage.");
		MajorConstructHealth = Config.Bind<float>("Basic Stats", "Iota Construct Base Health", 2100f, "");
		MajorConstructHealthStack = Config.Bind<float>("Basic Stats", "Iota Construct Health Increase Per Level", 630f, "");
		MajorConstructDamage = Config.Bind<float>("Basic Stats", "Iota Construct Base Damage", 25f, "");
		MajorConstructDamageStack = Config.Bind<float>("Basic Stats", "Iota Construct Damage Increase Per Level", 5f, "");
		MajorConstructAttackSpeed = Config.Bind<float>("Basic Stats", "Iota Construct Attack Speed", 1f, "");
		MajorConstructArmor = Config.Bind<float>("Basic Stats", "Iota Construct Armor", 15f, "");
		MajorConstructCost = Config.Bind<int>("Basic Stats", "Iota Construct Director Cost", 800, "");
		Assassin2Health = Config.Bind<float>("Basic Stats", "Assassin Base Health", 120f, "");
		Assassin2HealthStack = Config.Bind<float>("Basic Stats", "Assassin Health Increase Per Level", 36f, "");
		Assassin2Damage = Config.Bind<float>("Basic Stats", "Assassin Base Damage", 10f, "");
		Assassin2DamageStack = Config.Bind<float>("Basic Stats", "Assassin Damage Increase Per Level", 2f, "");
		Assassin2AttackSpeed = Config.Bind<float>("Basic Stats", "Assassin Attack Speed", 1.2f, "");
		Assassin2Speed = Config.Bind<float>("Basic Stats", "Assassin Speed", 12f, "");
		Assassin2Armor = Config.Bind<float>("Basic Stats", "Assassin Armor", 0f, "");
		Assassin2Cost = Config.Bind<int>("Basic Stats", "Assassin Director Cost", 28, "Default: 10.");
		MajorConstructDeathTimer = Config.Bind<float>("Iota Construct", "Death Timer", 5f, "Amount of seconds to show death animation for");
		MajorConstructSpawnAmount = Config.Bind<int>("Iota Construct", "Spawn Amount", 3, "Amount of enemies to spawn in pillar raise phase");
		MajorConstructSpawnSigmaInstead = Config.Bind<bool>("Iota Construct", "Spawn Sigma Constructs", true, "Spikestrip Compat");
		MajorConstructBeamDistance = Config.Bind<float>("Iota Construct", "Beam Distance", 150f, "Used to be 999");
		MajorConstructAimSpeed = Config.Bind<float>("Iota Construct", "Aim Speed", 10f, "Strafe around!");
		Assassin2InvisDuration = Config.Bind<float>("Assassin", "Invisible Duration", 2f, "Default: 5");
		Assassin2InvisEndlag = Config.Bind<float>("Assassin", "Invisible End Lag", 3f, "Default: 10");
		Assassin2DashDuration = Config.Bind<float>("Assassin", "Dash Duration", 2.5f, "Default: 2.5");
		Assassin2DashSpeed = Config.Bind<float>("Assassin", "Dash Speed", 3f, "Default: 4");
		Assassin2SlashDuration = Config.Bind<float>("Assassin", "Slash Duration", 1.5f, "Default: 1.667");
		Assassin2SlashDamage = Config.Bind<float>("Assassin", "Slash Damage", 1f, "Default: 4");
		Assassin2SlashKnockback = Config.Bind<float>("Assassin", "Slash Knockback", 16f, "Default: 16");
		Assassin2SlashReach = Config.Bind<float>("Assassin", "Slash Reach", 25f, "Default: 20");
		Assassin2Slash1 = Config.Bind<bool>("Assassin", "Enable Slash 1", true, "Enable the first slash hit.");
		Assassin2Slash2 = Config.Bind<bool>("Assassin", "Enable Slash 2", true, "Enable the second slash hit.");
		Assassin2SlashExpose = Config.Bind<float>("Assassin", "Enable Slash Expose", 4f, "In seconds. Enable the slash hit to `expose` you.");
		Assassin2SlashSize = Config.Bind<float>("Assassin", "Slash Hitbox Size Multiplier", 2f, "stop whiffing wtf");
		Assassin2SlashMultihit = Config.Bind<bool>("Assassin", "Slash Multihit", false, "This is the shuriken 5 hit");
		Assassin2ShurikenSize = Config.Bind<float>("Assassin", "Shuriken Hitbox Size Multiplier", 2f, "stop whiffing wtf");
		Assassin2Accurate = Config.Bind<bool>("Assassin", "Shuriken Accurate Enemies Compat", true, "oh they mess you up good");
		Assassin2AccurateLoop = Config.Bind<bool>("Assassin", "Shuriken Accurate Enemies Compat (loop only)", false, "oh they mess you up good");
		Reworks.IotaConstruct();
		Reworks.Assassin2();
		DLC1 = vanilla<ExpansionDef>("DLC1/Common/DLC1");
		((ResourceAvailability)(ref BodyCatalog.availability)).CallWhenAvailable((Action)delegate
		{
			CharacterBody component = BodyCatalog.FindBodyPrefab("MajorConstructBody").GetComponent<CharacterBody>();
			CharacterBody component2 = BodyCatalog.FindBodyPrefab("Assassin2Body").GetComponent<CharacterBody>();
			component.baseMaxHealth = MajorConstructHealth.Value;
			component.levelMaxHealth = MajorConstructHealthStack.Value;
			component.baseDamage = MajorConstructDamage.Value;
			component.levelDamage = MajorConstructDamageStack.Value;
			component.baseAttackSpeed = MajorConstructAttackSpeed.Value;
			component.baseArmor = MajorConstructArmor.Value;
			component.isChampion = true;
			if (!string.IsNullOrWhiteSpace(MajorConstructSpawn.Value))
			{
				((Component)component).GetComponent<DeathRewards>().bossDropTable = (PickupDropTable)(object)vanilla<ExplicitPickupDropTable>("DLC1/MajorAndMinorConstruct/dtBossMegaConstruct");
				((Component)component).GetComponent<DeathRewards>().logUnlockableDef = LegacyResourcesAPI.Load<UnlockableDef>("UnlockableDefs/Logs.MajorConstructBody");
			}
			component2.baseMaxHealth = Assassin2Health.Value;
			component2.levelMaxHealth = Assassin2HealthStack.Value;
			component2.baseDamage = Assassin2Damage.Value;
			component2.levelDamage = Assassin2DamageStack.Value;
			component2.baseAttackSpeed = Assassin2AttackSpeed.Value;
			component2.baseMoveSpeed = Assassin2Speed.Value;
			component2.baseArmor = Assassin2Armor.Value;
			if (!string.IsNullOrWhiteSpace(Assassin2Spawn.Value))
			{
				((Component)component2).gameObject.AddComponent<DeathRewards>().logUnlockableDef = vanilla<UnlockableDef>("DLC1/Assassin2/Logs.Assassin2Body");
			}
		});
		CharacterSpawnCard val = vanilla<CharacterSpawnCard>("DLC1/MajorAndMinorConstruct/cscMajorConstruct");
		CharacterSpawnCard val2 = vanilla<CharacterSpawnCard>("DLC1/Assassin2/cscAssassin2");
		((SpawnCard)val).directorCreditCost = MajorConstructCost.Value;
		((SpawnCard)val2).directorCreditCost = Assassin2Cost.Value;
		DirectorCard card = new DirectorCard
		{
			spawnCard = (SpawnCard)(object)val,
			selectionWeight = 1,
			spawnDistance = (MonsterSpawnDistance)0,
			minimumStageCompletions = MajorConstructMinStage.Value - 1,
			preventOverhead = true
		};
		DirectorCard card2 = new DirectorCard
		{
			spawnCard = (SpawnCard)(object)val2,
			selectionWeight = 1,
			spawnDistance = (MonsterSpawnDistance)0,
			minimumStageCompletions = Assassin2MinStage.Value - 1,
			preventOverhead = true
		};
		DirectorCardHolder majorConstructDCH = new DirectorCardHolder
		{
			Card = card,
			MonsterCategory = (MonsterCategory)4
		};
		DirectorCardHolder assassin2DCH = new DirectorCardHolder
		{
			Card = card2,
			MonsterCategory = (MonsterCategory)2
		};
		string[] iotalist = listify(MajorConstructSpawn.Value).ToArray();
		string[] assassinlist = listify(Assassin2Spawn.Value).ToArray();
		Dictionary<string, List<DirectorCardHolder>> dictionary = new Dictionary<string, List<DirectorCardHolder>>();
		if (!string.IsNullOrWhiteSpace(MajorConstructSpawn.Value))
		{
			Helpers.AddNewMonsterToStagesWhere(majorConstructDCH, false, (Predicate<StageInfo>)((StageInfo info) => iotalist.Contains(info.CustomStageName) || iotalist.Contains(((StageInfo)(ref info)).ToInternalStageName())));
			RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, (Action)delegate
			{
				DirectorAPI.AddCard(RoR2Content.mixEnemyMonsterCards, majorConstructDCH);
			});
		}
		if (!string.IsNullOrWhiteSpace(Assassin2Spawn.Value))
		{
			Helpers.AddNewMonsterToStagesWhere(assassin2DCH, false, (Predicate<StageInfo>)((StageInfo info) => assassinlist.Contains(info.CustomStageName) || assassinlist.Contains(((StageInfo)(ref info)).ToInternalStageName())));
			RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, (Action)delegate
			{
				DirectorAPI.AddCard(RoR2Content.mixEnemyMonsterCards, assassin2DCH);
			});
		}
	}

	public static DirectorCard GetDirectorCard(CharacterSpawnCard csc)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		//IL_0005: 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_0013: 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_0021: 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_0029: Expected O, but got Unknown
		return new DirectorCard
		{
			spawnCard = (SpawnCard)(object)csc,
			selectionWeight = 1,
			preventOverhead = false,
			minimumStageCompletions = 0,
			spawnDistance = (MonsterSpawnDistance)0
		};
	}

	public static bool Mods(params string[] arr)
	{
		for (int i = 0; i < arr.Length; i++)
		{
			if (!Chainloader.PluginInfos.ContainsKey(arr[i]))
			{
				return false;
			}
		}
		return true;
	}

	public static List<string> listify(string list)
	{
		return list.Split(',').ToList().ConvertAll((string x) => x.Trim());
	}

	public static Dictionary<string, string> pairify(string list)
	{
		Dictionary<string, string> dictionary = new Dictionary<string, string>();
		foreach (string item in list.Split(',').ToList())
		{
			List<string> list2 = item.Split('-').ToList().ConvertAll((string x) => x.Trim());
			dictionary.Add(list2[0], list2[1]);
		}
		return dictionary;
	}

	public static T vanilla<T>(string path)
	{
		//IL_0010: Unknown result type (might be due to invalid IL or missing references)
		//IL_0015: Unknown result type (might be due to invalid IL or missing references)
		return Addressables.LoadAssetAsync<T>((object)("RoR2/" + path + ".asset")).WaitForCompletion();
	}
}
public class Reworks
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static hook_FixedUpdate <>9__1_0;

		public static hook_OnEnter <>9__1_1;

		public static Action<DamageReport> <>9__1_3;

		public static Action <>9__2_0;

		public static Action<DamageReport> <>9__2_1;

		public static hook_HandleSlash <>9__2_2;

		public static Func<Instruction, bool> <>9__2_6;

		public static Func<Instruction, bool> <>9__2_7;

		public static Action<OverlapAttack> <>9__2_8;

		public static Func<Instruction, bool> <>9__2_9;

		public static Manipulator <>9__2_3;

		public static hook_OnEnter <>9__2_4;

		public static Func<Instruction, bool> <>9__2_10;

		public static Func<Ray, GenericProjectileBaseState, Ray> <>9__2_11;

		public static Manipulator <>9__2_5;

		internal void <IotaConstruct>b__1_0(orig_FixedUpdate orig, GenericCharacterDeath self)
		{
			orig.Invoke(self);
			if (Main.MajorConstructDeathTimer.Value >= 0f && self is Death && !(((EntityState)self).fixedAge <= Main.MajorConstructDeathTimer.Value) && NetworkServer.active)
			{
				self.DestroyBodyAsapServer();
			}
		}

		internal void <IotaConstruct>b__1_1(orig_OnEnter orig, FireLaser self)
		{
			orig.Invoke(self);
			if (((Object)((EntityState)self).characterBody).name.Contains("MajorConstruct"))
			{
				((FireBeam)self).maxDistance = Main.MajorConstructBeamDistance.Value;
				self.aimMaxSpeed = Main.MajorConstructAimSpeed.Value;
			}
		}

		internal void <IotaConstruct>b__1_3(DamageReport report)
		{
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			if (spawnedConstructs.ContainsKey(report.victimBody))
			{
				foreach (GameObject item in spawnedConstructs[report.victimBody])
				{
					if (item == null)
					{
						continue;
					}
					CharacterMaster component = item.GetComponent<CharacterMaster>();
					if (component == null)
					{
						continue;
					}
					GameObject bodyInstanceObject = component.bodyInstanceObject;
					if (bodyInstanceObject != null)
					{
						HealthComponent component2 = bodyInstanceObject.GetComponent<HealthComponent>();
						if (component2 != null)
						{
							component2.Suicide(((Component)report.attackerBody).gameObject, (GameObject)null, default(DamageTypeCombo));
						}
					}
				}
			}
			spawnedConstructs.Remove(report.victimBody);
		}

		internal void <Assassin2>b__2_0()
		{
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			ChargeDash.baseDuration = Main.Assassin2DashDuration.Value - 1f;
			DashStrike.slashDuration = Main.Assassin2SlashDuration.Value;
			DashStrike.damageCoefficient = Main.Assassin2SlashDamage.Value;
			DashStrike.forceMagnitude = Main.Assassin2SlashKnockback.Value;
			DashStrike.maxSlashDistance = Main.Assassin2SlashReach.Value;
			Hide.hiddenDuration = Main.Assassin2InvisDuration.Value;
			Hide.fullDuration = Main.Assassin2InvisDuration.Value + Main.Assassin2InvisEndlag.Value;
			AISkillDriver[] components = MasterCatalog.FindMasterPrefab("Assassin2Master").GetComponents<AISkillDriver>();
			components[1].maxDistance = 30f;
			components[1].activationRequiresTargetLoS = true;
			components[1].activationRequiresAimTargetLoS = true;
			components[1].selectionRequiresAimTarget = true;
			components[1].activationRequiresAimConfirmation = true;
			components[2].aimType = (AimType)2;
			components[2].movementType = (MovementType)2;
			components[3].shouldSprint = true;
		}

		internal void <Assassin2>b__2_1(DamageReport report)
		{
			if (!(Main.Assassin2SlashExpose.Value > 0f))
			{
				return;
			}
			bool? obj;
			if (report == null)
			{
				obj = null;
			}
			else
			{
				CharacterBody attackerBody = report.attackerBody;
				obj = ((attackerBody == null) ? null : ((Object)attackerBody).name?.Contains("Assassin2"));
			}
			bool? flag = obj;
			if (flag.GetValueOrDefault() && report != null)
			{
				CharacterBody victimBody = report.victimBody;
				if (victimBody != null)
				{
					victimBody.AddTimedBuff(Buffs.DeathMark, Main.Assassin2SlashExpose.Value);
				}
			}
		}

		internal void <Assassin2>b__2_2(orig_HandleSlash orig, DashStrike self, int hash, string a, string b)
		{
			if ((self.slashCount == 0 && Main.Assassin2Slash1.Value) || (self.slashCount == 1 && Main.Assassin2Slash2.Value))
			{
				orig.Invoke(self, hash, a, b);
			}
			else
			{
				self.slashCount++;
			}
		}

		internal void <Assassin2>b__2_3(ILContext il)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			val.GotoNext(new Func<Instruction, bool>[2]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdnull(x),
				(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<OverlapAttack>(x, "Fire")
			});
			val.Emit(OpCodes.Dup);
			val.EmitDelegate<Action<OverlapAttack>>((Action<OverlapAttack>)delegate(OverlapAttack oa)
			{
				//IL_0018: 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)
				for (int i = 0; i < oa.hitBoxGroup.hitBoxes.Length; i++)
				{
					Transform transform = ((Component)oa.hitBoxGroup.hitBoxes[i]).transform;
					transform.localScale *= Main.Assassin2SlashSize.Value;
				}
			});
			if (!Main.Assassin2SlashMultihit.Value)
			{
				val.GotoNext(new Func<Instruction, bool>[1]
				{
					(Instruction x) => ILPatternMatchingExt.MatchRet(x)
				});
				val.Remove();
			}
		}

		internal bool <Assassin2>b__2_6(Instruction x)
		{
			return ILPatternMatchingExt.MatchLdnull(x);
		}

		internal bool <Assassin2>b__2_7(Instruction x)
		{
			return ILPatternMatchingExt.MatchCallOrCallvirt<OverlapAttack>(x, "Fire");
		}

		internal void <Assassin2>b__2_8(OverlapAttack oa)
		{
			//IL_0018: 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)
			for (int i = 0; i < oa.hitBoxGroup.hitBoxes.Length; i++)
			{
				Transform transform = ((Component)oa.hitBoxGroup.hitBoxes[i]).transform;
				transform.localScale *= Main.Assassin2SlashSize.Value;
			}
		}

		internal bool <Assassin2>b__2_9(Instruction x)
		{
			return ILPatternMatchingExt.MatchRet(x);
		}

		internal void <Assassin2>b__2_4(orig_OnEnter orig, ThrowShuriken self)
		{
			orig.Invoke(self);
			((GenericProjectileBaseState)self).projectilePrefab.GetComponent<SphereCollider>().radius = 0.2f * Main.Assassin2ShurikenSize.Value;
		}

		internal void <Assassin2>b__2_5(ILContext il)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			val.GotoNext(new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchStloc(x, 0)
			});
			val.Emit(OpCodes.Ldarg_0);
			val.EmitDelegate<Func<Ray, GenericProjectileBaseState, Ray>>((Func<Ray, GenericProjectileBaseState, Ray>)delegate(Ray orig, GenericProjectileBaseState self)
			{
				//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_0028: Unknown result type (might be due to invalid IL or missing references)
				if (!(self is ThrowShuriken) || Main.Mods("com.Moffein.AccurateEnemies"))
				{
				}
				return orig;
			});
		}

		internal bool <Assassin2>b__2_10(Instruction x)
		{
			return ILPatternMatchingExt.MatchStloc(x, 0);
		}

		internal Ray <Assassin2>b__2_11(Ray orig, GenericProjectileBaseState self)
		{
			//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_0028: Unknown result type (might be due to invalid IL or missing references)
			if (!(self is ThrowShuriken) || Main.Mods("com.Moffein.AccurateEnemies"))
			{
			}
			return orig;
		}
	}

	public static Dictionary<CharacterBody, List<GameObject>> spawnedConstructs = new Dictionary<CharacterBody, List<GameObject>>();

	public static void IotaConstruct()
	{
		//IL_001b: 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_0026: Expected O, but got Unknown
		//IL_0086: Unknown result type (might be due to invalid IL or missing references)
		//IL_0090: Expected O, but got Unknown
		//IL_006e: 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_0079: Expected O, but got Unknown
		object obj = <>c.<>9__1_0;
		if (obj == null)
		{
			hook_FixedUpdate val = delegate(orig_FixedUpdate orig, GenericCharacterDeath self)
			{
				orig.Invoke(self);
				if (Main.MajorConstructDeathTimer.Value >= 0f && self is Death && !(((EntityState)self).fixedAge <= Main.MajorConstructDeathTimer.Value) && NetworkServer.active)
				{
					self.DestroyBodyAsapServer();
				}
			};
			<>c.<>9__1_0 = val;
			obj = (object)val;
		}
		GenericCharacterDeath.FixedUpdate += (hook_FixedUpdate)obj;
		string constructToSpawn = (Main.MajorConstructSpawnSigmaInstead.Value ? "SigmaConstructBody" : "MinorConstructBody");
		CharacterSpawnCard card = LegacyResourcesAPI.Load<CharacterSpawnCard>("SpawnCards/CharacterSpawnCards/cscMinorConstruct");
		object obj2 = <>c.<>9__1_1;
		if (obj2 == null)
		{
			hook_OnEnter val2 = delegate(orig_OnEnter orig, FireLaser self)
			{
				orig.Invoke(self);
				if (((Object)((EntityState)self).characterBody).name.Contains("MajorConstruct"))
				{
					((FireBeam)self).maxDistance = Main.MajorConstructBeamDistance.Value;
					self.aimMaxSpeed = Main.MajorConstructAimSpeed.Value;
				}
			};
			<>c.<>9__1_1 = val2;
			obj2 = (object)val2;
		}
		FireLaser.OnEnter += (hook_OnEnter)obj2;
		LoweredToRaised.OnEnter += (hook_OnEnter)delegate(orig_OnEnter orig, LoweredToRaised self)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: 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_0041: 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_0051: 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_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0131: 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_0141: 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)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: 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_0174: Expected O, but got Unknown
			//IL_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0174: Unknown result type (might be due to invalid IL or missing references)
			//IL_0180: Unknown result type (might be due to invalid IL or missing references)
			//IL_0194: Expected O, but got Unknown
			//IL_018f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self);
			if (Main.MajorConstructSpawnAmount.Value > 0 && NetworkServer.active)
			{
				HurtBox[] hurtBoxes = new SphereSearch
				{
					origin = ((EntityState)self).gameObject.transform.position,
					radius = 37.5f,
					mask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask
				}.RefreshCandidates().FilterCandidatesByDistinctHurtBoxEntities().GetHurtBoxes();
				foreach (HurtBox val3 in hurtBoxes)
				{
					CharacterBody body = val3.healthComponent.body;
					if (Object.op_Implicit((Object)(object)body) && ((Object)body).name == constructToSpawn)
					{
						return;
					}
				}
				Quaternion val4 = Quaternion.AngleAxis(120f, Vector3.up);
				Vector3 val5 = ((EntityState)self).transform.forward * 16f;
				if (!spawnedConstructs.ContainsKey(((EntityState)self).characterBody))
				{
					spawnedConstructs.Add(((EntityState)self).characterBody, new List<GameObject>());
				}
				for (int j = 0; j < Main.MajorConstructSpawnAmount.Value; j++)
				{
					Vector3 val6 = val5 + ((EntityState)self).transform.position;
					GameObject spawnedInstance = ((SpawnCard)card).DoSpawn(val6, Quaternion.Euler(((EntityState)self).transform.forward), new DirectorSpawnRequest((SpawnCard)(object)card, new DirectorPlacementRule
					{
						position = val6,
						placementMode = (PlacementMode)0
					}, Run.instance.spawnRng)
					{
						teamIndexOverride = ((EntityState)self).characterBody.teamComponent.teamIndex
					}).spawnedInstance;
					NetworkServer.Spawn(spawnedInstance);
					spawnedConstructs[((EntityState)self).characterBody].Add(spawnedInstance);
					val5 = val4 * val5;
				}
			}
		};
		GlobalEventManager.onCharacterDeathGlobal += delegate(DamageReport report)
		{
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			if (spawnedConstructs.ContainsKey(report.victimBody))
			{
				foreach (GameObject item in spawnedConstructs[report.victimBody])
				{
					if (item != null)
					{
						CharacterMaster component = item.GetComponent<CharacterMaster>();
						if (component != null)
						{
							GameObject bodyInstanceObject = component.bodyInstanceObject;
							if (bodyInstanceObject != null)
							{
								HealthComponent component2 = bodyInstanceObject.GetComponent<HealthComponent>();
								if (component2 != null)
								{
									component2.Suicide(((Component)report.attackerBody).gameObject, (GameObject)null, default(DamageTypeCombo));
								}
							}
						}
					}
				}
			}
			spawnedConstructs.Remove(report.victimBody);
		};
		LanguageAPI.Add("MAJORCONSTRUCT_BODY_NAME", "Iota Construct");
		LanguageAPI.Add("MAJORCONSTRUCT_BODY_SUBTITLE", "Released From The Void");
		LanguageAPI.Add("MAJORCONSTRUCT_BODY_LORE", "<style=cMono>Welcome to DataScrapper (v3.2rc1-DEV BUILD)\r\n$ Scraping memory... done. [List#23376190, Length: 3752]\r\n$ Resolving... done.\r\n$ Combining for relevant data... done.\r\nComplete!\r\nOutputting [test.c]...</style>\r\n\r\n/*for(int i = 0; i < N; i++)\r\n{\r\n    printf(\"\n\");\r\n    for(int j = 0; j < N; j++)\r\n    {\r\n        printf(\"%d \", arr[i][j]); //range setting and random number generation (rand from stdlib.h)\r\n    }\r\n}*/ //toggle parts of code using comments\r\n\r\nreturn 0; //return 0\r\n");
	}

	public static void Assassin2()
	{
		//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_0078: Expected O, but got Unknown
		//IL_0092: 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_009d: Expected O, but got Unknown
		//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c2: Expected O, but got Unknown
		//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e7: Expected O, but got Unknown
		RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, (Action)delegate
		{
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			ChargeDash.baseDuration = Main.Assassin2DashDuration.Value - 1f;
			DashStrike.slashDuration = Main.Assassin2SlashDuration.Value;
			DashStrike.damageCoefficient = Main.Assassin2SlashDamage.Value;
			DashStrike.forceMagnitude = Main.Assassin2SlashKnockback.Value;
			DashStrike.maxSlashDistance = Main.Assassin2SlashReach.Value;
			Hide.hiddenDuration = Main.Assassin2InvisDuration.Value;
			Hide.fullDuration = Main.Assassin2InvisDuration.Value + Main.Assassin2InvisEndlag.Value;
			AISkillDriver[] components = MasterCatalog.FindMasterPrefab("Assassin2Master").GetComponents<AISkillDriver>();
			components[1].maxDistance = 30f;
			components[1].activationRequiresTargetLoS = true;
			components[1].activationRequiresAimTargetLoS = true;
			components[1].selectionRequiresAimTarget = true;
			components[1].activationRequiresAimConfirmation = true;
			components[2].aimType = (AimType)2;
			components[2].movementType = (MovementType)2;
			components[3].shouldSprint = true;
		});
		GlobalEventManager.onServerDamageDealt += delegate(DamageReport report)
		{
			if (Main.Assassin2SlashExpose.Value > 0f)
			{
				bool? obj5;
				if (report == null)
				{
					obj5 = null;
				}
				else
				{
					CharacterBody attackerBody = report.attackerBody;
					obj5 = ((attackerBody == null) ? null : ((Object)attackerBody).name?.Contains("Assassin2"));
				}
				bool? flag = obj5;
				if (flag.GetValueOrDefault() && report != null)
				{
					CharacterBody victimBody = report.victimBody;
					if (victimBody != null)
					{
						victimBody.AddTimedBuff(Buffs.DeathMark, Main.Assassin2SlashExpose.Value);
					}
				}
			}
		};
		object obj = <>c.<>9__2_2;
		if (obj == null)
		{
			hook_HandleSlash val = delegate(orig_HandleSlash orig, DashStrike self, int hash, string a, string b)
			{
				if ((self.slashCount == 0 && Main.Assassin2Slash1.Value) || (self.slashCount == 1 && Main.Assassin2Slash2.Value))
				{
					orig.Invoke(self, hash, a, b);
				}
				else
				{
					self.slashCount++;
				}
			};
			<>c.<>9__2_2 = val;
			obj = (object)val;
		}
		DashStrike.HandleSlash += (hook_HandleSlash)obj;
		object obj2 = <>c.<>9__2_3;
		if (obj2 == null)
		{
			Manipulator val2 = delegate(ILContext il)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Expected O, but got Unknown
				//IL_005a: Unknown result type (might be due to invalid IL or missing references)
				ILCursor val6 = new ILCursor(il);
				val6.GotoNext(new Func<Instruction, bool>[2]
				{
					(Instruction x) => ILPatternMatchingExt.MatchLdnull(x),
					(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<OverlapAttack>(x, "Fire")
				});
				val6.Emit(OpCodes.Dup);
				val6.EmitDelegate<Action<OverlapAttack>>((Action<OverlapAttack>)delegate(OverlapAttack oa)
				{
					//IL_0018: 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)
					for (int i = 0; i < oa.hitBoxGroup.hitBoxes.Length; i++)
					{
						Transform transform = ((Component)oa.hitBoxGroup.hitBoxes[i]).transform;
						transform.localScale *= Main.Assassin2SlashSize.Value;
					}
				});
				if (!Main.Assassin2SlashMultihit.Value)
				{
					val6.GotoNext(new Func<Instruction, bool>[1]
					{
						(Instruction x) => ILPatternMatchingExt.MatchRet(x)
					});
					val6.Remove();
				}
			};
			<>c.<>9__2_3 = val2;
			obj2 = (object)val2;
		}
		DashStrike.HandleSlash += (Manipulator)obj2;
		object obj3 = <>c.<>9__2_4;
		if (obj3 == null)
		{
			hook_OnEnter val3 = delegate(orig_OnEnter orig, ThrowShuriken self)
			{
				orig.Invoke(self);
				((GenericProjectileBaseState)self).projectilePrefab.GetComponent<SphereCollider>().radius = 0.2f * Main.Assassin2ShurikenSize.Value;
			};
			<>c.<>9__2_4 = val3;
			obj3 = (object)val3;
		}
		ThrowShuriken.OnEnter += (hook_OnEnter)obj3;
		object obj4 = <>c.<>9__2_5;
		if (obj4 == null)
		{
			Manipulator val4 = delegate(ILContext il)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Expected O, but got Unknown
				//IL_0038: Unknown result type (might be due to invalid IL or missing references)
				ILCursor val5 = new ILCursor(il);
				val5.GotoNext(new Func<Instruction, bool>[1]
				{
					(Instruction x) => ILPatternMatchingExt.MatchStloc(x, 0)
				});
				val5.Emit(OpCodes.Ldarg_0);
				val5.EmitDelegate<Func<Ray, GenericProjectileBaseState, Ray>>((Func<Ray, GenericProjectileBaseState, Ray>)delegate(Ray orig, GenericProjectileBaseState self)
				{
					//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_0028: Unknown result type (might be due to invalid IL or missing references)
					if (!(self is ThrowShuriken) || Main.Mods("com.Moffein.AccurateEnemies"))
					{
					}
					return orig;
				});
			};
			<>c.<>9__2_5 = val4;
			obj4 = (object)val4;
		}
		GenericProjectileBaseState.FireProjectile += (Manipulator)obj4;
	}
}