Decompiled source of ArtificerPrimaryRework v1.0.4

plugins/Moffein-ArtificerPrimaryRework/ArtificerPrimaryRework.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 ArtificerPrimaryRework.Components;
using BepInEx;
using BepInEx.Configuration;
using EntityStates.Mage.Weapon;
using HG;
using IL.RoR2;
using Microsoft.CodeAnalysis;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using On.EntityStates.Mage.Weapon;
using On.RoR2;
using R2API;
using R2API.Utils;
using RoR2;
using RoR2.Orbs;
using RoR2.Projectile;
using RoR2.Skills;
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 = ".NET Standard 2.1")]
[assembly: AssemblyCompany("ArtificerPrimaryRework")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+8b99c36f2c2b84a8d3bb1ad6ea097f7dd6bf3b5e")]
[assembly: AssemblyProduct("ArtificerPrimaryRework")]
[assembly: AssemblyTitle("ArtificerPrimaryRework")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace ArtificerPrimaryRework
{
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("com.Moffein.ArtificerPrimaryRework", "ArtificerPrimaryRework", "1.0.4")]
	public class ArtificerPrimaryReworkPlugin : BaseUnityPlugin
	{
		public static AssetBundle assetBundle;

		public static GameObject fireboltRepeatObject;

		public static PluginInfo pluginInfo;

		public static ModdedDamageType ApplyFireboltRepeat;

		public static ModdedDamageType QuadrupleHitstunPower;

		public static float procCoefficientFire;

		public static float procCoefficientLightning;

		private void Awake()
		{
			//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_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Expected O, but got Unknown
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Expected O, but got Unknown
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Expected O, but got Unknown
			pluginInfo = ((BaseUnityPlugin)this).Info;
			using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ArtificerPrimaryRework.artificerprimaryreworkbundle"))
			{
				assetBundle = AssetBundle.LoadFromStream(stream);
			}
			Tokens.Init();
			QuadrupleHitstunPower = DamageAPI.ReserveDamageType();
			SetStateOnHurt.OnTakeDamageServer += new Manipulator(SetStateOnHurt_OnTakeDamageServer);
			SetupLightningBolt();
			SetupFirebolt();
			procCoefficientFire = ((BaseUnityPlugin)this).Config.Bind<float>(new ConfigDefinition("Fire Bolt", "Proc Coefficient"), 1f, (ConfigDescription)null).Value;
			procCoefficientLightning = ((BaseUnityPlugin)this).Config.Bind<float>(new ConfigDefinition("Plasma Bolt", "Proc Coefficient"), 1f, (ConfigDescription)null).Value;
		}

		private void SetStateOnHurt_OnTakeDamageServer(ILContext il)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			if (val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdfld<DamageReport>(x, "damageDealt")
			}))
			{
				val.Emit(OpCodes.Ldarg_1);
				val.EmitDelegate<Func<float, DamageReport, float>>((Func<float, DamageReport, float>)((float damageDealt, DamageReport damageReport) => (damageReport.damageInfo != null && DamageAPI.HasModdedDamageType(damageReport.damageInfo, QuadrupleHitstunPower)) ? (damageDealt * 4f) : damageDealt));
			}
		}

		private void SetupFirebolt()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Expected O, but got Unknown
			ApplyFireboltRepeat = DamageAPI.ReserveDamageType();
			GameObject val = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Mage/MageFireboltBasic.prefab").WaitForCompletion(), "MoffeinArtificerPrimaryRework_Firebolt");
			val.GetComponent<ProjectileSimple>().lifetime = 10f;
			val.AddComponent<FireBoltForceAddModdedDamageType>();
			ContentAddition.AddProjectile(val);
			SetAddressableEntityStateField("RoR2/Base/Mage/EntityStates.Mage.Weapon.FireFireBolt.asset", "damageCoefficient", "0.7");
			SetAddressableEntityStateField("RoR2/Base/Mage/EntityStates.Mage.Weapon.FireFireBolt.asset", "projectilePrefab", (Object)(object)val);
			FireBoltRepeatComponent.damageEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Common/VFX/OmniExplosionVFXQuick.prefab").WaitForCompletion();
			SkillDef val2 = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Mage/MageBodyFireFirebolt.asset").WaitForCompletion();
			val2.attackSpeedBuffsRestockSpeed = false;
			val2.skillDescriptionToken = "MAGE_PRIMARY_FIRE_DESCRIPTION_MOFFEINARTIFICERPRIMARYREWORK";
			HealthComponent.TakeDamage += new hook_TakeDamage(HealthComponent_TakeDamage);
		}

		private void HealthComponent_TakeDamage(orig_TakeDamage orig, HealthComponent self, DamageInfo damageInfo)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self, damageInfo);
			if (NetworkServer.active && !damageInfo.rejected && DamageAPI.HasModdedDamageType(damageInfo, ApplyFireboltRepeat) && !(damageInfo.procCoefficient <= 0f))
			{
				FireBoltRepeatComponent fireBoltRepeatComponent = ((Component)self).gameObject.AddComponent<FireBoltRepeatComponent>();
				fireBoltRepeatComponent.attacker = damageInfo.attacker;
				fireBoltRepeatComponent.victim = ((Component)self).gameObject;
				fireBoltRepeatComponent.victimHealthComponent = self;
				fireBoltRepeatComponent.damage = damageInfo.damage;
				fireBoltRepeatComponent.damageType = damageInfo.damageType;
				DamageAPI.RemoveModdedDamageType(ref fireBoltRepeatComponent.damageType, ApplyFireboltRepeat);
				fireBoltRepeatComponent.isCrit = damageInfo.crit;
				fireBoltRepeatComponent.procCoefficient = damageInfo.procCoefficient;
				fireBoltRepeatComponent.force = ((Vector3)(ref damageInfo.force)).magnitude;
			}
		}

		private void SetupLightningBolt()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//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_0188: Unknown result type (might be due to invalid IL or missing references)
			//IL_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d3: Expected O, but got Unknown
			GameObject val = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Mage/MageLightningboltBasic.prefab").WaitForCompletion(), "MoffeinArtificerPrimaryRework_Lightningbolt");
			val.GetComponent<ProjectileSimple>().lifetime = 10f;
			val.AddComponent<LightningBoltTriggerComponent>();
			ContentAddition.AddProjectile(val);
			SetAddressableEntityStateField("RoR2/Base/Mage/EntityStates.Mage.Weapon.FireLightningBolt.asset", "damageCoefficient", "0.85");
			SetAddressableEntityStateField("RoR2/Base/Mage/EntityStates.Mage.Weapon.FireLightningBolt.asset", "projectilePrefab", (Object)(object)val);
			SkillDef val2 = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Mage/MageBodyFireLightningBolt.asset").WaitForCompletion();
			val2.attackSpeedBuffsRestockSpeed = false;
			val2.skillDescriptionToken = "MAGE_PRIMARY_LIGHTNING_DESCRIPTION_MOFFEINARTIFICERPRIMARYREWORK";
			ProjectileImpactExplosion component = val.GetComponent<ProjectileImpactExplosion>();
			LightningBoltTriggerComponent.lightningboltRepeatObject = assetBundle.LoadAsset<GameObject>("LightningboltRepeatPrefab");
			LightningBoltRepeatComponent lightningBoltRepeatComponent = LightningBoltTriggerComponent.lightningboltRepeatObject.AddComponent<LightningBoltRepeatComponent>();
			lightningBoltRepeatComponent.range = 7.5f;
			((ProjectileExplosion)component).blastRadius = 0f;
			((ProjectileExplosion)component).blastProcCoefficient = 0f;
			lightningBoltRepeatComponent.activationEffectPrefab = component.impactEffect;
			component.impactEffect = null;
			((ProjectileExplosion)component).blastDamageCoefficient = 0f;
			NetworkIdentity val3 = LightningBoltTriggerComponent.lightningboltRepeatObject.AddComponent<NetworkIdentity>();
			PrefabAPI.RegisterNetworkPrefab(LightningBoltTriggerComponent.lightningboltRepeatObject);
			ContentAddition.AddNetworkedObject(LightningBoltTriggerComponent.lightningboltRepeatObject);
			RadialForceMassLimited radialForceMassLimited = LightningBoltTriggerComponent.lightningboltRepeatObject.AddComponent<RadialForceMassLimited>();
			radialForceMassLimited.radius = lightningBoltRepeatComponent.range;
			radialForceMassLimited.damping = 0.5f;
			radialForceMassLimited.forceMagnitude = -250f;
			radialForceMassLimited.forceCoefficientAtEdge = 0.5f;
			radialForceMassLimited.maxMass = 250f;
			radialForceMassLimited.flyingOnly = false;
			radialForceMassLimited.ignorePlayerControlled = true;
			lightningBoltRepeatComponent.whiffEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Common/VFX/OmniImpactVFXLightning.prefab").WaitForCompletion();
			lightningBoltRepeatComponent.activationEffectPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/EliteLightning/LightningStakeNova.prefab").WaitForCompletion();
			lightningBoltRepeatComponent.attackSound = ScriptableObject.CreateInstance<NetworkSoundEventDef>();
			lightningBoltRepeatComponent.attackSound.eventName = "Play_item_proc_chain_lightning";
			ContentAddition.AddNetworkSoundEventDef(lightningBoltRepeatComponent.attackSound);
			FireLightningBolt.ModifyProjectileInfo += new hook_ModifyProjectileInfo(FireLightningBolt_ModifyProjectileInfo);
		}

		private void FireLightningBolt_ModifyProjectileInfo(orig_ModifyProjectileInfo orig, FireLightningBolt self, ref FireProjectileInfo fireProjectileInfo)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self, ref fireProjectileInfo);
			ref DamageTypeCombo? damageTypeOverride = ref fireProjectileInfo.damageTypeOverride;
			DamageTypeCombo? val = damageTypeOverride;
			DamageTypeCombo val2 = DamageTypeCombo.op_Implicit((DamageType)8);
			damageTypeOverride = (val.HasValue ? new DamageTypeCombo?(val.GetValueOrDefault() | val2) : null);
		}

		internal static bool SetAddressableEntityStateField(string fullEntityStatePath, string fieldName, string value)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			EntityStateConfiguration val = Addressables.LoadAssetAsync<EntityStateConfiguration>((object)fullEntityStatePath).WaitForCompletion();
			for (int i = 0; i < val.serializedFieldsCollection.serializedFields.Length; i++)
			{
				if (val.serializedFieldsCollection.serializedFields[i].fieldName == fieldName)
				{
					val.serializedFieldsCollection.serializedFields[i].fieldValue.stringValue = value;
					return true;
				}
			}
			Debug.LogError((object)("ArtificerPrimaryRework: " + fullEntityStatePath + " does not have field " + fieldName));
			return false;
		}

		internal static bool SetAddressableEntityStateField(string fullEntityStatePath, string fieldName, Object newObject)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			EntityStateConfiguration val = Addressables.LoadAssetAsync<EntityStateConfiguration>((object)fullEntityStatePath).WaitForCompletion();
			for (int i = 0; i < val.serializedFieldsCollection.serializedFields.Length; i++)
			{
				if (val.serializedFieldsCollection.serializedFields[i].fieldName == fieldName)
				{
					val.serializedFieldsCollection.serializedFields[i].fieldValue.objectValue = newObject;
					return true;
				}
			}
			Debug.LogError((object)("ArtificerPrimaryRework: " + fullEntityStatePath + " does not have field " + fieldName));
			return false;
		}

		public static List<HealthComponent> FindEnemiesInSphere(float radius, Vector3 position, TeamIndex team)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			List<HealthComponent> list = new List<HealthComponent>();
			Collider[] array = Physics.OverlapSphere(position, radius, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.entityPrecise)).mask));
			for (int i = 0; i < array.Length; i++)
			{
				HurtBox component = ((Component)array[i]).GetComponent<HurtBox>();
				if (Object.op_Implicit((Object)(object)component))
				{
					HealthComponent healthComponent = component.healthComponent;
					if (Object.op_Implicit((Object)(object)healthComponent) && !list.Contains(healthComponent) && Object.op_Implicit((Object)(object)healthComponent.body) && Object.op_Implicit((Object)(object)healthComponent.body.teamComponent) && healthComponent.body.teamComponent.teamIndex != team)
					{
						list.Add(healthComponent);
					}
				}
			}
			return list;
		}
	}
	internal class Tokens
	{
		private static bool initialized;

		internal static string languageRoot => Path.Combine(assemblyDir, "language");

		internal static string assemblyDir => Path.GetDirectoryName(ArtificerPrimaryReworkPlugin.pluginInfo.Location);

		public static void Init()
		{
			if (!initialized)
			{
				initialized = true;
				LoadLanguage();
			}
		}

		private static void LoadLanguage()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			Language.SetFolders += new hook_SetFolders(fixme);
		}

		private static void fixme(orig_SetFolders orig, Language self, IEnumerable<string> newFolders)
		{
			if (Directory.Exists(languageRoot))
			{
				IEnumerable<string> second = Directory.EnumerateDirectories(Path.Combine(languageRoot), self.name);
				orig.Invoke(self, newFolders.Union(second));
			}
			else
			{
				orig.Invoke(self, newFolders);
			}
		}
	}
}
namespace ArtificerPrimaryRework.Components
{
	public class FireBoltForceAddModdedDamageType : MonoBehaviour
	{
		private void Start()
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			ProjectileDamage component = ((Component)this).GetComponent<ProjectileDamage>();
			if (Object.op_Implicit((Object)(object)component))
			{
				DamageAPI.AddModdedDamageType(ref component.damageType, ArtificerPrimaryReworkPlugin.ApplyFireboltRepeat);
				DamageAPI.AddModdedDamageType(ref component.damageType, ArtificerPrimaryReworkPlugin.QuadrupleHitstunPower);
			}
			ProjectileImpactExplosion component2 = ((Component)this).GetComponent<ProjectileImpactExplosion>();
			if (Object.op_Implicit((Object)(object)component2))
			{
				((ProjectileExplosion)component2).blastProcCoefficient = ArtificerPrimaryReworkPlugin.procCoefficientFire;
			}
			Object.Destroy((Object)(object)this);
		}
	}
	public class FireBoltRepeatComponent : MonoBehaviour
	{
		public static GameObject damageEffectPrefab;

		public float damage;

		public bool isCrit;

		public GameObject attacker;

		public GameObject victim;

		public HealthComponent victimHealthComponent;

		public DamageTypeCombo damageType;

		public float procCoefficient;

		public TeamIndex teamIndex;

		public float force;

		public float delayBetweenHits = 0.2f;

		public int totalHits = 4;

		private float delayTimer = 0f;

		public void Start()
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			teamIndex = (TeamIndex)(-1);
			if (Object.op_Implicit((Object)(object)attacker))
			{
				CharacterBody component = attacker.GetComponent<CharacterBody>();
				if (Object.op_Implicit((Object)(object)component))
				{
					delayBetweenHits = 0.2f / component.attackSpeed;
					totalHits = Mathf.Max(totalHits, Mathf.FloorToInt((float)totalHits * component.attackSpeed));
					if (Object.op_Implicit((Object)(object)component.teamComponent))
					{
						teamIndex = component.teamComponent.teamIndex;
					}
				}
			}
			totalHits--;
			delayTimer = delayBetweenHits;
		}

		private void FixedUpdate()
		{
			if (!NetworkServer.active)
			{
				return;
			}
			if (totalHits <= 0)
			{
				Object.Destroy((Object)(object)this);
				return;
			}
			if (delayTimer <= 0f)
			{
				delayTimer += delayBetweenHits;
				TriggerAttackServer();
			}
			delayTimer -= Time.fixedDeltaTime;
		}

		private void TriggerAttackServer()
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_010f: Expected O, but got Unknown
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: 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_0121: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Expected O, but got Unknown
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			if (NetworkServer.active)
			{
				totalHits--;
				Vector3 position = ((Component)this).transform.position;
				if (Object.op_Implicit((Object)(object)victimHealthComponent) && Object.op_Implicit((Object)(object)victimHealthComponent.body) && Object.op_Implicit((Object)(object)victimHealthComponent.body.mainHurtBox))
				{
					position = ((Component)victimHealthComponent.body.mainHurtBox).transform.position;
				}
				BlastAttack val = new BlastAttack
				{
					baseDamage = damage,
					radius = 2.5f,
					position = position,
					crit = isCrit,
					procChainMask = default(ProcChainMask),
					procCoefficient = procCoefficient,
					attacker = attacker,
					inflictor = attacker,
					baseForce = force,
					damageType = damageType,
					falloffModel = (FalloffModel)0,
					teamIndex = teamIndex
				};
				val.Fire();
				EffectManager.SpawnEffect(damageEffectPrefab, new EffectData
				{
					origin = position,
					scale = 2.5f
				}, true);
			}
		}
	}
	internal class LightningBoltRepeatComponent : MonoBehaviour
	{
		public NetworkSoundEventDef attackSound;

		public GameObject activationEffectPrefab;

		public GameObject whiffEffectPrefab;

		public float range;

		public float delayBetweenHits = 0.2f;

		public int totalHits = 4;

		private float delayTimer = 0f;

		public float damage;

		public bool isCrit;

		public GameObject attacker;

		public TeamIndex teamIndex;

		public DamageTypeCombo damageType;

		private void Start()
		{
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Expected O, but got Unknown
			if (Object.op_Implicit((Object)(object)attacker))
			{
				CharacterBody component = attacker.GetComponent<CharacterBody>();
				if (Object.op_Implicit((Object)(object)component))
				{
					delayBetweenHits = 0.2f / component.attackSpeed;
					totalHits = Mathf.Max(totalHits, Mathf.FloorToInt((float)totalHits * component.attackSpeed));
				}
			}
			if (NetworkServer.active)
			{
				EffectManager.SpawnEffect(activationEffectPrefab, new EffectData
				{
					origin = ((Component)this).transform.position,
					scale = range
				}, true);
			}
		}

		private void FixedUpdate()
		{
			if (!NetworkServer.active)
			{
				return;
			}
			if (totalHits <= 0)
			{
				Object.Destroy((Object)(object)((Component)this).gameObject);
				return;
			}
			if (delayTimer <= 0f)
			{
				delayTimer += delayBetweenHits;
				TriggerAttackServer();
			}
			delayTimer -= Time.fixedDeltaTime;
		}

		private void TriggerAttackServer()
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: Unknown result type (might be due to invalid IL or missing references)
			//IL_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_011f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0126: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: 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_013e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0143: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_016e: Expected O, but got Unknown
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			if (!NetworkServer.active)
			{
				return;
			}
			totalHits--;
			List<HealthComponent> list = ArtificerPrimaryReworkPlugin.FindEnemiesInSphere(range, ((Component)this).transform.position, teamIndex);
			EffectManager.SimpleSoundEffect(attackSound.index, ((Component)this).transform.position, true);
			bool flag = false;
			foreach (HealthComponent item in list)
			{
				if (Object.op_Implicit((Object)(object)item.body) && Object.op_Implicit((Object)(object)item.body.mainHurtBox) && ((Behaviour)item.body.mainHurtBox).isActiveAndEnabled)
				{
					LightningOrb val = new LightningOrb
					{
						attacker = attacker,
						inflictor = ((Component)this).gameObject,
						damageValue = damage,
						procCoefficient = ArtificerPrimaryReworkPlugin.procCoefficientLightning,
						teamIndex = teamIndex,
						isCrit = isCrit,
						procChainMask = default(ProcChainMask),
						lightningType = (LightningType)0,
						damageColorIndex = (DamageColorIndex)0,
						bouncesRemaining = 0,
						targetsToFindPerBounce = 1,
						range = range,
						origin = ((Component)this).transform.position,
						damageType = damageType,
						speed = 120f,
						target = item.body.mainHurtBox
					};
					DamageAPI.AddModdedDamageType(ref val.damageType, ArtificerPrimaryReworkPlugin.QuadrupleHitstunPower);
					OrbManager.instance.AddOrb((Orb)(object)val);
					flag = true;
				}
			}
			if (!flag)
			{
				EffectManager.SimpleEffect(whiffEffectPrefab, ((Component)this).transform.position, ((Component)this).transform.rotation, true);
			}
		}
	}
	public class LightningBoltTriggerComponent : MonoBehaviour
	{
		public static GameObject lightningboltRepeatObject;

		public float damage;

		public bool isCrit;

		public GameObject attacker;

		public TeamIndex teamIndex;

		public DamageTypeCombo damageType;

		private void Start()
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			ProjectileDamage component = ((Component)this).GetComponent<ProjectileDamage>();
			if (Object.op_Implicit((Object)(object)component))
			{
				damage = component.damage;
				isCrit = component.crit;
				damageType = component.damageType;
			}
			else
			{
				damage = 0f;
			}
			ProjectileController component2 = ((Component)this).GetComponent<ProjectileController>();
			attacker = component2.owner;
			TeamFilter component3 = ((Component)this).GetComponent<TeamFilter>();
			if (Object.op_Implicit((Object)(object)component3))
			{
				teamIndex = component3.teamIndex;
			}
			else
			{
				teamIndex = (TeamIndex)(-1);
			}
			ProjectileImpactExplosion component4 = ((Component)this).GetComponent<ProjectileImpactExplosion>();
			((ProjectileExplosion)component4).OnProjectileExplosion = (Action<BlastAttack, Result>)Delegate.Combine(((ProjectileExplosion)component4).OnProjectileExplosion, new Action<BlastAttack, Result>(SpawnLightningObject));
		}

		private void SpawnLightningObject(BlastAttack attack, Result result)
		{
			//IL_0007: 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_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = Object.Instantiate<GameObject>(lightningboltRepeatObject, attack.position, Quaternion.identity);
			LightningBoltRepeatComponent component = val.GetComponent<LightningBoltRepeatComponent>();
			component.attacker = attacker;
			component.isCrit = isCrit;
			component.damage = damage;
			component.teamIndex = teamIndex;
			component.damageType = damageType;
			NetworkServer.Spawn(val);
		}
	}
	public class RadialForceMassLimited : MonoBehaviour
	{
		public TeamIndex teamIndex = (TeamIndex)(-1);

		public float maxMass;

		public float radius;

		public float damping = 0.2f;

		public float forceMagnitude;

		public float forceCoefficientAtEdge = 0.5f;

		public TetherVfxOrigin tetherVfxOrigin;

		public bool flyingOnly = false;

		public bool ignorePlayerControlled = false;

		private SphereSearch sphereSearch;

		public void Awake()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			sphereSearch = new SphereSearch();
		}

		public void Start()
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Invalid comparison between Unknown and I4
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			LightningBoltRepeatComponent component = ((Component)this).GetComponent<LightningBoltRepeatComponent>();
			if (Object.op_Implicit((Object)(object)component))
			{
				teamIndex = component.teamIndex;
			}
			if ((int)teamIndex == -1)
			{
				Object.Destroy((Object)(object)this);
			}
		}

		public void FixedUpdate()
		{
			List<HurtBox> list = CollectionPool<HurtBox, List<HurtBox>>.RentCollection();
			SearchForTargets(list);
			int i = 0;
			for (int count = list.Count; i < count; i++)
			{
				ApplyPullToHurtBox(list[i]);
			}
			if (Object.op_Implicit((Object)(object)tetherVfxOrigin))
			{
				List<Transform> list2 = CollectionPool<Transform, List<Transform>>.RentCollection();
				int j = 0;
				for (int count2 = list.Count; j < count2; j++)
				{
					HurtBox val = list[j];
					if (!Object.op_Implicit((Object)(object)val))
					{
						continue;
					}
					Transform item = ((Component)val).transform;
					HealthComponent healthComponent = val.healthComponent;
					if (Object.op_Implicit((Object)(object)healthComponent))
					{
						Transform coreTransform = healthComponent.body.coreTransform;
						if (Object.op_Implicit((Object)(object)coreTransform))
						{
							item = coreTransform;
						}
					}
					list2.Add(item);
				}
				tetherVfxOrigin.SetTetheredTransforms(list2);
				CollectionPool<Transform, List<Transform>>.ReturnCollection(list2);
			}
			CollectionPool<HurtBox, List<HurtBox>>.ReturnCollection(list);
		}

		public void SearchForTargets(List<HurtBox> dest)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			sphereSearch.mask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask;
			sphereSearch.origin = ((Component)this).transform.position;
			sphereSearch.radius = radius;
			sphereSearch.queryTriggerInteraction = (QueryTriggerInteraction)0;
			sphereSearch.RefreshCandidates();
			sphereSearch.FilterCandidatesByHurtBoxTeam(TeamMask.GetEnemyTeams(teamIndex));
			sphereSearch.OrderCandidatesByDistance();
			sphereSearch.FilterCandidatesByDistinctHurtBoxEntities();
			sphereSearch.GetHurtBoxes(dest);
			sphereSearch.ClearCandidates();
		}

		public void ApplyPullToHurtBox(HurtBox hurtBox)
		{
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			//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_0179: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0201: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0216: Unknown result type (might be due to invalid IL or missing references)
			//IL_022a: Unknown result type (might be due to invalid IL or missing references)
			//IL_022c: Unknown result type (might be due to invalid IL or missing references)
			//IL_023a: Unknown result type (might be due to invalid IL or missing references)
			//IL_023f: Unknown result type (might be due to invalid IL or missing references)
			bool flag = Object.op_Implicit((Object)(object)hurtBox) && Object.op_Implicit((Object)(object)hurtBox.healthComponent) && Object.op_Implicit((Object)(object)hurtBox.healthComponent.body);
			bool flag2 = false;
			bool flag3 = false;
			bool flag4 = false;
			if (flag)
			{
				flag2 = Object.op_Implicit((Object)(object)hurtBox.healthComponent.body.rigidbody);
				if (flag2)
				{
					flag3 = hurtBox.healthComponent.body.rigidbody.mass <= maxMass;
				}
				if (hurtBox.healthComponent.body.isFlying || (Object.op_Implicit((Object)(object)hurtBox.healthComponent.body.characterMotor) && !hurtBox.healthComponent.body.characterMotor.isGrounded))
				{
					flag4 = true;
				}
			}
			if (!flag || !flag2 || !flag3 || (flyingOnly && !flag4))
			{
				return;
			}
			HealthComponent healthComponent = hurtBox.healthComponent;
			if (!Object.op_Implicit((Object)(object)healthComponent) || !NetworkServer.active)
			{
				return;
			}
			bool flag5 = Object.op_Implicit((Object)(object)healthComponent.body) && healthComponent.body.isPlayerControlled;
			if (!ignorePlayerControlled || !flag5)
			{
				CharacterMotor characterMotor = healthComponent.body.characterMotor;
				Vector3 val = ((Component)hurtBox).transform.position - ((Component)this).transform.position;
				float num = 1f - Mathf.Clamp(((Vector3)(ref val)).magnitude / radius, 0f, 1f - forceCoefficientAtEdge);
				val = ((Vector3)(ref val)).normalized * forceMagnitude * (1f - num);
				Vector3 velocity;
				float mass;
				if (Object.op_Implicit((Object)(object)characterMotor))
				{
					velocity = characterMotor.velocity;
					mass = characterMotor.mass;
				}
				else
				{
					Rigidbody rigidbody = healthComponent.body.rigidbody;
					velocity = rigidbody.velocity;
					mass = rigidbody.mass;
				}
				velocity.y += Physics.gravity.y * Time.fixedDeltaTime;
				healthComponent.TakeDamageForce(val - velocity * (damping * mass * num), true, false);
			}
		}
	}
}