Decompiled source of ZeebsZitems v1.1.4

ZeebsZitems.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HG.Reflection;
using On.RoR2;
using R2API;
using R2API.Utils;
using RoR2;
using RoR2.Projectile;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Rendering;
using ZeebsZitems.Base_Classes;
using ZeebsZitems.Custom_Classes.Equipment;
using ZeebsZitems.Custom_Classes.Items;
using ZeebsZitems.Utils;

[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("ZeebsZitems")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+9fd3bb54553576ee8382c54c400a3212f82cfa9c")]
[assembly: AssemblyProduct("ZeebsZitems")]
[assembly: AssemblyTitle("ZeebsZitems")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: UnverifiableCode]
namespace ZeebsZitems
{
	[BepInDependency("com.bepis.r2api", "5.1.1")]
	[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("com.Zeeboon.ZeebsZitems", "Zeeb's Zitems", "1.1.4")]
	public class Main : BaseUnityPlugin
	{
		public const string ModGUID = "com.Zeeboon.ZeebsZitems";

		public const string ModName = "Zeeb's Zitems";

		public const string ModVersion = "1.1.4";

		public static AssetBundle Assets;

		public static PluginInfo PInfo { get; private set; }

		public void Awake()
		{
			Log.Init(((BaseUnityPlugin)this).Logger);
			PInfo = ((BaseUnityPlugin)this).Info;
			string directoryName = Path.GetDirectoryName(((object)this).GetType().Assembly.Location);
			string text = Path.Combine(Path.GetDirectoryName(PInfo.Location), "mod_assets");
			Assets = AssetBundle.LoadFromFile(text);
			Configs();
			Instantiate();
			Hooks();
		}

		public void Configs()
		{
		}

		public void Hooks()
		{
		}

		public void Instantiate()
		{
			VerifyEquipment(new Equipment01());
			VerifyItems(new Item01());
			VerifyItems(new Item02());
			VerifyItems(new Item03());
			VerifyItems(new Item04());
		}

		public void VerifyItems(ItemBase item)
		{
			if (((BaseUnityPlugin)this).Config.Bind<bool>("Items", "enable " + item.ItemName, true, "Enable this item in game?").Value)
			{
				item.Init(((BaseUnityPlugin)this).Config);
			}
		}

		public void VerifyEquipment(EquipmentBase equip)
		{
			if (((BaseUnityPlugin)this).Config.Bind<bool>("Equipment", "enable " + equip.EquipmentName, true, "Enable this equipment in game?").Value)
			{
				equip.Init(((BaseUnityPlugin)this).Config);
			}
		}

		private void Update()
		{
		}
	}
}
namespace ZeebsZitems.Utils
{
	public static class ArrayHelper
	{
		public static T[] Append<T>(ref T[] array, List<T> list)
		{
			int num = array.Length;
			int count = list.Count;
			Array.Resize(ref array, num + count);
			list.CopyTo(array, num);
			return array;
		}

		public static Func<T[], T[]> AppendDel<T>(List<T> list)
		{
			return (T[] r) => Append(ref r, list);
		}
	}
	internal class ItemHelper
	{
		public static RendererInfo[] ItemDisplaySetup(GameObject obj)
		{
			//IL_001a: 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_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			MeshRenderer[] componentsInChildren = obj.GetComponentsInChildren<MeshRenderer>();
			RendererInfo[] array = (RendererInfo[])(object)new RendererInfo[componentsInChildren.Length];
			for (int i = 0; i < componentsInChildren.Length; i++)
			{
				array[i] = new RendererInfo
				{
					defaultMaterial = ((Renderer)componentsInChildren[i]).material,
					renderer = (Renderer)(object)componentsInChildren[i],
					defaultShadowCastingMode = (ShadowCastingMode)1,
					ignoreOverlays = false
				};
			}
			return array;
		}
	}
	internal static class Log
	{
		internal static ManualLogSource _logSource;

		internal static void Init(ManualLogSource logSource)
		{
			_logSource = logSource;
		}

		internal static void LogDebug(object data)
		{
			_logSource.LogDebug(data);
		}

		internal static void LogError(object data)
		{
			_logSource.LogError(data);
		}

		internal static void LogFatal(object data)
		{
			_logSource.LogFatal(data);
		}

		internal static void LogInfo(object data)
		{
			_logSource.LogInfo(data);
		}

		internal static void LogMessage(object data)
		{
			_logSource.LogMessage(data);
		}

		internal static void LogWarning(object data)
		{
			_logSource.LogWarning(data);
		}
	}
}
namespace ZeebsZitems.Custom_Classes.Items
{
	internal class Item01 : ItemBase
	{
		public static ItemDef StinkyBomb = ScriptableObject.CreateInstance<ItemDef>();

		public GameObject StinkProjectilePrefab;

		public GameObject StinkEffectPrefab;

		private EffectData StinkEffect;

		public static float ProcChance = 10f;

		public static float ProcStack = 10f;

		public static float StinkDamage = 1.8f;

		public static float StinkDamageStack = 1.1f;

		public static float StinkDuration = 4f;

		public static float StinkRadius = 10f;

		public override string ItemName => "Stinky Bomb";

		public override string ItemLangTokenName => "STINKYBOMB";

		public override string ItemPickupDesc => "Chance on hit to poison surrounding enemies.";

		public override string ItemFullDescription => $"<style=cIsDamage>{ProcChance}%</style> chance on hit to <style=cIsDamage>poison</style> " + $"all enemies in {StinkRadius} meters for <style=cIsDamage>{StinkDamage * 100f}%</style> <style=cStack>[+ {StinkDamageStack * 100f}% per stack]</style>" + " TOTAL damage over 4 seconds.";

		public override string ItemLore => "the peak of biological warfare";

		public override ItemTier Tier => (ItemTier)0;

		public override string ItemModelPath => "Assets/ItemTests/Models/Prefabs/Items/StinkyBomb.prefab";

		public override string ItemIconPath => "Assets/ItemTests/Textures/Icons/Items/StinkyBombIcon.png";

		public override ItemTag[] ItemTags { get; } = (ItemTag[])(object)new ItemTag[1] { (ItemTag)1 };


		public override bool CanRemove { get; } = true;


		public static BuffDef StinkBombBuff { get; private set; }

		public static DotIndex StinkDot { get; private set; }

		public static ConfigEntry<bool> alwaysShowFX { get; set; }

		public override void CreateConfig(ConfigFile config)
		{
		}

		public override ItemDisplayRuleDict CreateItemDisplayRules()
		{
			//IL_003b: 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_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: 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_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Expected O, but got Unknown
			ItemBase.ItemBodyModelPrefab = Main.Assets.LoadAsset<GameObject>(ItemModelPath);
			ItemDisplay val = ItemBase.ItemBodyModelPrefab.AddComponent<ItemDisplay>();
			val.rendererInfos = ItemHelper.ItemDisplaySetup(ItemBase.ItemBodyModelPrefab);
			return new ItemDisplayRuleDict((ItemDisplayRule[])(object)new ItemDisplayRule[1]
			{
				new ItemDisplayRule
				{
					ruleType = (ItemDisplayRuleType)0,
					followerPrefab = ItemBase.ItemBodyModelPrefab,
					childName = "Chest",
					localPos = new Vector3(0f, 0f, 0f),
					localAngles = new Vector3(0f, 0f, 0f),
					localScale = new Vector3(1f, 1f, 1f)
				}
			});
		}

		public override void Hooks()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			GlobalEventManager.ProcessHitEnemy += new hook_ProcessHitEnemy(GlobalEventManager_ProcessHitEnemy);
		}

		public static void SetupAttributes()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0099: Expected O, but got Unknown
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			StinkBombBuff = ScriptableObject.CreateInstance<BuffDef>();
			StinkBombBuff.buffColor = Color.yellow;
			StinkBombBuff.canStack = true;
			StinkBombBuff.isDebuff = true;
			((Object)StinkBombBuff).name = "StinkyBombBuff";
			StinkBombBuff.iconSprite = Main.Assets.LoadAsset<Sprite>("Assets/ItemTests/Textures/Icons/Buffs/StinkyIcon.png");
			ContentAddition.AddBuffDef(StinkBombBuff);
			DotDef val = new DotDef
			{
				interval = 1f,
				damageCoefficient = 1f / StinkDuration,
				damageColorIndex = (DamageColorIndex)4,
				associatedBuff = StinkBombBuff
			};
			StinkDot = DotAPI.RegisterDotDef(val, (CustomDotBehaviour)null, (CustomDotVisual)null);
		}

		public override void Init(ConfigFile config)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Expected O, but got Unknown
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			CreateConfig(config);
			StinkProjectilePrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/MiniMushroom/SporeGrenadeProjectileDotZone.prefab").WaitForCompletion();
			StinkProjectilePrefab.GetComponent<ProjectileController>().procCoefficient = 0f;
			StinkEffectPrefab = Main.Assets.LoadAsset<GameObject>("Assets/ItemTests/Models/Prefabs/VFX/stinkPoof.prefab");
			StinkEffectPrefab.AddComponent<EffectComponent>();
			StinkEffect = new EffectData
			{
				scale = StinkRadius * 0.6f
			};
			StinkEffectPrefab.GetComponent<EffectComponent>().applyScale = true;
			StinkEffectPrefab.AddComponent<VFXAttributes>();
			StinkEffectPrefab.GetComponent<VFXAttributes>().vfxPriority = (VFXPriority)1;
			StinkEffectPrefab.GetComponent<VFXAttributes>().vfxIntensity = (VFXIntensity)0;
			ContentAddition.AddEffect(StinkEffectPrefab);
			CreateLang();
			SetupAttributes();
			CreateItem(StinkyBomb);
			Hooks();
		}

		private void GlobalEventManager_ProcessHitEnemy(orig_ProcessHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
		{
			orig.Invoke(self, damageInfo, victim);
			CharacterBody val = default(CharacterBody);
			CharacterBody val2 = default(CharacterBody);
			HealthComponent val3 = default(HealthComponent);
			if (Object.op_Implicit((Object)(object)victim) && Object.op_Implicit((Object)(object)damageInfo.attacker) && damageInfo.procCoefficient > 0f && victim.TryGetComponent<CharacterBody>(ref val) && damageInfo.attacker.TryGetComponent<CharacterBody>(ref val2) && victim.TryGetComponent<HealthComponent>(ref val3) && Object.op_Implicit((Object)(object)damageInfo.attacker.GetComponent<CharacterBody>().inventory))
			{
				CharacterBody component = victim.GetComponent<CharacterBody>();
				CharacterBody component2 = damageInfo.attacker.GetComponent<CharacterBody>();
				int itemCount = component2.inventory.GetItemCount(StinkyBomb);
				if (itemCount > 0 && Util.CheckRoll(ProcChance * damageInfo.procCoefficient, 0f, (CharacterMaster)null))
				{
					SpawnStink(component, component2, damageInfo, StinkBombBuff, itemCount);
				}
			}
		}

		private void SpawnStink(CharacterBody victimBody, CharacterBody attackerBody, DamageInfo damageInfo, BuffDef stinkBombBuff, int itemCount)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_012e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: 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_00d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			float stinkRadius = StinkRadius;
			Vector3 position = damageInfo.position;
			SphereSearch val = new SphereSearch();
			List<HurtBox> list = new List<HurtBox>();
			val.origin = position;
			val.mask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask;
			val.radius = stinkRadius;
			val.RefreshCandidates();
			val.FilterCandidatesByHurtBoxTeam(TeamMask.GetUnprotectedTeams(attackerBody.teamComponent.teamIndex));
			val.FilterCandidatesByDistinctHurtBoxEntities();
			val.GetHurtBoxes(list);
			val.ClearCandidates();
			for (int i = 0; i < list.Count; i++)
			{
				HurtBox val2 = list[i];
				HealthComponent healthComponent = val2.healthComponent;
				if ((Object)(object)healthComponent != (Object)null && itemCount > 0)
				{
					InflictDotInfo val3 = default(InflictDotInfo);
					val3.victimObject = ((Component)val2.healthComponent).gameObject;
					val3.attackerObject = damageInfo.attacker;
					val3.dotIndex = StinkDot;
					val3.damageMultiplier = damageInfo.damage / attackerBody.damage * (1.7f + (float)(itemCount - 1));
					val3.duration = StinkDuration;
					InflictDotInfo val4 = val3;
					DotController.InflictDot(ref val4);
				}
			}
			StinkEffect.origin = position;
			EffectManager.SpawnEffect(StinkEffectPrefab, StinkEffect, true);
		}

		public static void Update()
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			if (Input.GetKeyDown((KeyCode)283))
			{
				Transform transform = PlayerCharacterMasterController.instances[0].master.GetBodyObject().transform;
				PickupDropletController.CreatePickupDroplet(PickupCatalog.FindPickupIndex(StinkyBomb.itemIndex), transform.position, transform.forward * 20f);
			}
		}
	}
	internal class Item02 : ItemBase
	{
		public static ItemDef iceDeathItem = ScriptableObject.CreateInstance<ItemDef>();

		public GameObject SlowParticlePrefab;

		private EffectData SlowEffect;

		public static float SlowDuration = 3f;

		public static float SlowRadius = 14f;

		public static float BlastRadius = 10f;

		public static float BlastDamageMult = 2.5f;

		public static float BlastDamageStack = 1f;

		public static float BlastChance = 10f;

		public static float BlastStackChance = 5f;

		public override string ItemName => "Liquid Nitrogen";

		public override string ItemLangTokenName => "LIQUID_NITROGEN";

		public override string ItemPickupDesc => "Killing an enemy slows surrounding enemies, with a chance to cause a freezing blast instead.";

		public override string ItemFullDescription => $"<style=cIsDamage>Killing an enemy</style> causes surrounding enemies to be <style=cIsUtility>slowed</style> by 50% for {SlowDuration} <style=cStack>[+ {SlowDuration / 2f} per stack]</style> seconds" + $"\nIn addition, enemies have a {BlastChance}% chance of <style=cIsDamage>exploding in ice</style>, dealing <style=cIsDamage>{BlastDamageMult * 100f}% </style> <style=cStack>[+ {BlastDamageStack * 100f} / stack]</style> TOTAL damage and <style=cIsUtility>freezing</style> surrounding enemies.";

		public override string ItemLore => "i scream, you scream, we all scream, help we're dying";

		public override ItemTier Tier => (ItemTier)1;

		public override ItemTag[] ItemTags { get; }

		public override bool CanRemove { get; }

		public override string ItemModelPath => "Assets/ItemTests/Models/Prefabs/Items/Nitrogen.prefab";

		public override string ItemIconPath => "Assets/ItemTests/Textures/Icons/Items/NitrogenIcon.png";

		public override void CreateConfig(ConfigFile config)
		{
		}

		public override ItemDisplayRuleDict CreateItemDisplayRules()
		{
			//IL_003b: 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_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: 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_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Expected O, but got Unknown
			ItemBase.ItemBodyModelPrefab = Main.Assets.LoadAsset<GameObject>(ItemModelPath);
			ItemDisplay val = ItemBase.ItemBodyModelPrefab.AddComponent<ItemDisplay>();
			val.rendererInfos = ItemHelper.ItemDisplaySetup(ItemBase.ItemBodyModelPrefab);
			return new ItemDisplayRuleDict((ItemDisplayRule[])(object)new ItemDisplayRule[1]
			{
				new ItemDisplayRule
				{
					ruleType = (ItemDisplayRuleType)0,
					followerPrefab = ItemBase.ItemBodyModelPrefab,
					childName = "Chest",
					localPos = new Vector3(0f, 0f, 0f),
					localAngles = new Vector3(0f, 0f, 0f),
					localScale = new Vector3(1f, 1f, 1f)
				}
			});
		}

		public override void Hooks()
		{
			GlobalEventManager.onCharacterDeathGlobal += GlobalEventManager_onCharacterDeathGlobal;
		}

		public override void Init(ConfigFile config)
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Expected O, but got Unknown
			//IL_0076: 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)
			CreateConfig(config);
			CreateLang();
			SlowParticlePrefab = Main.Assets.LoadAsset<GameObject>("Assets/ItemTests/Models/Prefabs/VFX/nitrogenPoof.prefab");
			SlowParticlePrefab.AddComponent<EffectComponent>();
			SlowEffect = new EffectData
			{
				scale = SlowRadius * 0.75f
			};
			SlowParticlePrefab.GetComponent<EffectComponent>().applyScale = true;
			SlowParticlePrefab.AddComponent<VFXAttributes>();
			SlowParticlePrefab.GetComponent<VFXAttributes>().vfxPriority = (VFXPriority)0;
			SlowParticlePrefab.GetComponent<VFXAttributes>().vfxIntensity = (VFXIntensity)0;
			ContentAddition.AddEffect(SlowParticlePrefab);
			CreateItem(iceDeathItem);
			Hooks();
		}

		private void GlobalEventManager_onCharacterDeathGlobal(DamageReport report)
		{
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Invalid comparison between Unknown and I4
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)report.attacker) && Object.op_Implicit((Object)(object)report.attackerBody) && (Object.op_Implicit((Object)(object)report.attackerBody.inventory) || (int)DamageTypeCombo.op_Implicit(report.damageInfo.damageType) == 256))
			{
				CharacterBody victimBody = report.victimBody;
				CharacterBody attackerBody = report.attackerBody;
				float damageDealt = report.damageDealt;
				int itemCount = attackerBody.inventory.GetItemCount(iceDeathItem.itemIndex);
				if (itemCount > 0 && Util.CheckRoll(BlastChance, attackerBody.master))
				{
					IceBlast(victimBody, attackerBody, itemCount, damageDealt);
				}
				else if (itemCount > 0)
				{
					SlowOnDeath(victimBody, attackerBody, itemCount, report);
				}
			}
		}

		private void SlowOnDeath(CharacterBody victimBody, CharacterBody attackerBody, int itemCount, DamageReport report)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_0022: 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_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			float radius = victimBody.radius + SlowRadius;
			Vector3 corePosition = victimBody.corePosition;
			SphereSearch val = new SphereSearch();
			List<HurtBox> list = new List<HurtBox>();
			val.origin = corePosition;
			val.mask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask;
			val.radius = radius;
			val.RefreshCandidates();
			val.FilterCandidatesByHurtBoxTeam(TeamMask.GetUnprotectedTeams(attackerBody.teamComponent.teamIndex));
			val.FilterCandidatesByDistinctHurtBoxEntities();
			val.OrderCandidatesByDistance();
			val.GetHurtBoxes(list);
			val.ClearCandidates();
			for (int i = 0; i < list.Count; i++)
			{
				HurtBox val2 = list[i];
				if (Object.op_Implicit((Object)(object)val2.healthComponent))
				{
					val2.healthComponent.body.AddTimedBuff(Buffs.Slow50, SlowDuration / 2f + SlowDuration / 2f * (float)itemCount);
				}
			}
			SlowEffect.origin = corePosition;
			EffectManager.SpawnEffect(SlowParticlePrefab, SlowEffect, true);
		}

		private void IceBlast(CharacterBody victimBody, CharacterBody attackerBody, int itemCount, float damage)
		{
			//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_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: 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_00ca: 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_00ec: 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)
			Vector3 corePosition = Util.GetCorePosition(((Component)victimBody).gameObject);
			GameObject val = Object.Instantiate<GameObject>(Resources.Load<GameObject>("Prefabs/NetworkedObjects/GenericDelayBlast"), corePosition, Quaternion.identity);
			float num = BlastRadius + victimBody.radius;
			val.transform.localScale = new Vector3(num, num, num);
			float num2 = 2.5f * (float)itemCount;
			float baseDamage = Util.OnHitProcDamage(damage, attackerBody.damage, num2);
			DelayBlast component = val.GetComponent<DelayBlast>();
			component.position = corePosition;
			component.baseDamage = baseDamage;
			component.baseForce = 2300f;
			component.attacker = ((Component)attackerBody).gameObject;
			component.radius = num;
			component.crit = Util.CheckRoll(victimBody.crit, victimBody.master);
			component.procCoefficient = 0.75f;
			component.maxTimer = 0.2f;
			component.falloffModel = (FalloffModel)0;
			component.explosionEffect = Resources.Load<GameObject>("Prefabs/Effects/ImpactEffects/AffixWhiteExplosion");
			component.damageType = DamageTypeCombo.op_Implicit((DamageType)256);
			val.GetComponent<TeamFilter>().teamIndex = attackerBody.teamComponent.teamIndex;
		}

		public static void Update()
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			if (Input.GetKeyDown((KeyCode)284))
			{
				Transform transform = PlayerCharacterMasterController.instances[0].master.GetBodyObject().transform;
				PickupDropletController.CreatePickupDroplet(PickupCatalog.FindPickupIndex(iceDeathItem.itemIndex), transform.position, transform.forward * 20f);
			}
		}

		public Item02()
		{
			ItemTag[] array = new ItemTag[3];
			RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
			ItemTags = (ItemTag[])(object)array;
			CanRemove = true;
			base..ctor();
		}
	}
	internal class Item03 : ItemBase
	{
		public static ItemDef KillHeal = ScriptableObject.CreateInstance<ItemDef>();

		private readonly float HealPercentage = 10f;

		private readonly float HealStackPercentage = 10f;

		public override string ItemName => "Champion Fungus";

		public override string ItemLangTokenName => "CHUNGUS";

		public override string ItemPickupDesc => "Killing an enemy heals you for a percentage of the damage done.";

		public override string ItemFullDescription => $"<style=cIsDamage>Killing an enemy</style> heals you for <style=cIsHealing>{HealPercentage}%</style>" + $" <style=cStack>[+{HealStackPercentage}% per stack]</style> of the health they had left.";

		public override string ItemLore => "a big cartoon mushroom";

		public override ItemTier Tier => (ItemTier)1;

		public override ItemTag[] ItemTags { get; } = (ItemTag[])(object)new ItemTag[1] { (ItemTag)2 };


		public override bool CanRemove { get; } = true;


		public override string ItemModelPath => "Assets/ItemTests/Models/Prefabs/Items/Chungus.prefab";

		public override string ItemIconPath => "Assets/ItemTests/Textures/Icons/Items/ChungusIcon.png";

		public override void CreateConfig(ConfigFile config)
		{
		}

		public override ItemDisplayRuleDict CreateItemDisplayRules()
		{
			//IL_003b: 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_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: 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_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Expected O, but got Unknown
			ItemBase.ItemBodyModelPrefab = Main.Assets.LoadAsset<GameObject>(ItemModelPath);
			ItemDisplay val = ItemBase.ItemBodyModelPrefab.AddComponent<ItemDisplay>();
			val.rendererInfos = ItemHelper.ItemDisplaySetup(ItemBase.ItemBodyModelPrefab);
			return new ItemDisplayRuleDict((ItemDisplayRule[])(object)new ItemDisplayRule[1]
			{
				new ItemDisplayRule
				{
					ruleType = (ItemDisplayRuleType)0,
					followerPrefab = ItemBase.ItemBodyModelPrefab,
					childName = "Chest",
					localPos = new Vector3(0f, 0f, 0f),
					localAngles = new Vector3(0f, 0f, 0f),
					localScale = new Vector3(1f, 1f, 1f)
				}
			});
		}

		public override void Hooks()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			HealthComponent.TakeDamageProcess += new hook_TakeDamageProcess(HealthComponent_takeDamageProcess);
		}

		public override void Init(ConfigFile config)
		{
			CreateConfig(config);
			CreateLang();
			CreateItem(KillHeal);
			Hooks();
		}

		private void HealthComponent_takeDamageProcess(orig_TakeDamageProcess orig, HealthComponent self, DamageInfo damageInfo)
		{
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			int num = 0;
			float num2 = 0f;
			bool flag = false;
			if (damageInfo != null && (Object)(object)self != (Object)null && (Object)(object)damageInfo.attacker != (Object)null && (Object)(object)damageInfo.attacker.GetComponent<CharacterBody>() != (Object)null && (Object)(object)damageInfo.attacker.GetComponent<CharacterBody>().inventory != (Object)null)
			{
				num = damageInfo.attacker.GetComponent<CharacterBody>().inventory.GetItemCount(KillHeal);
				if (num > 0)
				{
					CharacterBody val = (Object.op_Implicit((Object)(object)self) ? ((Component)self).GetComponent<CharacterBody>() : null);
					num2 = val.healthComponent.combinedHealth;
					flag = true;
				}
			}
			orig.Invoke(self, damageInfo);
			if (((Component)self).GetComponent<CharacterBody>().healthComponent.combinedHealth <= 0f && flag && damageInfo.attacker.GetComponent<CharacterBody>().inventory.GetItemCount(KillHeal) > 0)
			{
				ProcChainMask procChainMask = damageInfo.procChainMask;
				float num3 = num2 / 100f * (HealPercentage + HealStackPercentage * (float)num);
				damageInfo.attacker.GetComponent<CharacterBody>().healthComponent.Heal(num3, procChainMask, true);
				flag = false;
			}
		}

		public static void Update()
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			if (Input.GetKeyDown((KeyCode)285))
			{
				Transform transform = PlayerCharacterMasterController.instances[0].master.GetBodyObject().transform;
				PickupDropletController.CreatePickupDroplet(PickupCatalog.FindPickupIndex(KillHeal.itemIndex), transform.position, transform.forward * 20f);
			}
		}
	}
	internal class Item04 : ItemBase
	{
		public static ItemDef DeathItem = ScriptableObject.CreateInstance<ItemDef>();

		public float CritChance = 50f;

		public float CritStack = 10f;

		public float MoveSpeed = 0.5f;

		public float AttackSpeed = 0.5f;

		public float HealthPercentage = 50f;

		public float BuffDuration = 6f;

		public float DurationStack = 3f;

		public override string ItemName => "Deaths Doorhandle";

		public override string ItemLangTokenName => "DOORHANDLE";

		public override string ItemPickupDesc => "Falling below half health increases movement speed, attack speed and chance to crit.";

		public override string ItemFullDescription => $"<style=cDeath>Falling below (or taking damage while under) {HealthPercentage}% health</style> will <style=cIsUtility>increase your movement speed and " + $"attack speed by {MoveSpeed * 100f}%</style> and <style=cIsDamage> chance to crit by {CritChance}%</style> " + $"<style=cStack>[+{CritStack}% per stack]</style> for {BuffDuration} seconds <style=cStack>[+{DurationStack} per stack.]</style>";

		public override string ItemLore => "you are the one who knocks";

		public override ItemTier Tier => (ItemTier)1;

		public override ItemTag[] ItemTags { get; } = (ItemTag[])(object)new ItemTag[2]
		{
			(ItemTag)1,
			(ItemTag)3
		};


		public override bool CanRemove { get; } = true;


		public override string ItemModelPath => "Assets/ItemTests/Models/Prefabs/Items/Doorhandle.prefab";

		public override string ItemIconPath => "Assets/ItemTests/Textures/Icons/Items/DoorhandleIcon.png";

		public static BuffDef DeathItemBuff { get; private set; }

		public override void CreateConfig(ConfigFile config)
		{
		}

		public override ItemDisplayRuleDict CreateItemDisplayRules()
		{
			//IL_003b: 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_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: 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_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Expected O, but got Unknown
			ItemBase.ItemBodyModelPrefab = Main.Assets.LoadAsset<GameObject>(ItemModelPath);
			ItemDisplay val = ItemBase.ItemBodyModelPrefab.AddComponent<ItemDisplay>();
			val.rendererInfos = ItemHelper.ItemDisplaySetup(ItemBase.ItemBodyModelPrefab);
			return new ItemDisplayRuleDict((ItemDisplayRule[])(object)new ItemDisplayRule[1]
			{
				new ItemDisplayRule
				{
					ruleType = (ItemDisplayRuleType)0,
					followerPrefab = ItemBase.ItemBodyModelPrefab,
					childName = "Chest",
					localPos = new Vector3(0f, 0f, 0f),
					localAngles = new Vector3(0f, 0f, 0f),
					localScale = new Vector3(1f, 1f, 1f)
				}
			});
		}

		public override void Hooks()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			HealthComponent.TakeDamageProcess += new hook_TakeDamageProcess(HealthComponent_TakeDamageProcess);
			RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalcStats_GetStatCoefficients);
		}

		public static void SetupAttributes()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			DeathItemBuff = ScriptableObject.CreateInstance<BuffDef>();
			DeathItemBuff.buffColor = Color.red;
			DeathItemBuff.canStack = false;
			DeathItemBuff.isDebuff = false;
			((Object)DeathItemBuff).name = "DeathItemBuff";
			DeathItemBuff.iconSprite = Resources.Load<Sprite>("Textures/MiscIcons/texMysteryIcon");
			ContentAddition.AddBuffDef(DeathItemBuff);
		}

		public override void Init(ConfigFile config)
		{
			CreateConfig(config);
			CreateLang();
			SetupAttributes();
			CreateItem(DeathItem);
			Hooks();
		}

		private void RecalcStats_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args)
		{
			if (Object.op_Implicit((Object)(object)sender.inventory))
			{
				int itemCount = sender.inventory.GetItemCount(DeathItem);
				if (sender.HasBuff(DeathItemBuff) && itemCount > 0)
				{
					args.critAdd += CritChance + CritStack * (float)(itemCount - 1);
					args.moveSpeedMultAdd += MoveSpeed;
					args.attackSpeedMultAdd += AttackSpeed;
				}
			}
		}

		private void HealthComponent_TakeDamageProcess(orig_TakeDamageProcess orig, HealthComponent self, DamageInfo damageInfo)
		{
			orig.Invoke(self, damageInfo);
			if (Object.op_Implicit((Object)(object)((Component)self).GetComponent<CharacterBody>().inventory))
			{
				CharacterBody component = ((Component)self).GetComponent<CharacterBody>();
				float num = ((Component)component).GetComponent<CharacterBody>().inventory.GetItemCount(DeathItem);
				if (component.inventory.GetItemCount(DeathItem) > 0 && component.healthComponent.health <= component.healthComponent.fullHealth / 100f * HealthPercentage)
				{
					component.AddTimedBuff(DeathItemBuff, BuffDuration + DurationStack * (num - 1f));
				}
			}
		}

		public static void Update()
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			if (Input.GetKeyDown((KeyCode)286))
			{
				Transform transform = PlayerCharacterMasterController.instances[0].master.GetBodyObject().transform;
				PickupDropletController.CreatePickupDroplet(PickupCatalog.FindPickupIndex(DeathItem.itemIndex), transform.position, transform.forward * 20f);
			}
		}
	}
}
namespace ZeebsZitems.Custom_Classes.Equipment
{
	internal class Equipment01 : EquipmentBase
	{
		public static EquipmentDef EquipItemDef = ScriptableObject.CreateInstance<EquipmentDef>();

		private string FistModelPath = "prefabs/projectiles/TitanPreFistProjectile";

		public GameObject FistProjectilePrefab;

		public float FistForce = 6000f;

		public float FistDamageMult = 20f;

		public float FistDelay = 0.5f;

		public override string EquipmentName => "Stone Gauntlet";

		public override string EquipmentLangTokenName => "STONEGAUNTLET";

		public override string EquipmentPickupDesc => "Unleash titanic wrath";

		public override string EquipmentFullDescription => $"Summon 8 titan fists in a circle around you, each dealing <style=cIsDamage>{FistDamageMult * 100f}%</style> damage";

		public override string EquipmentLore => "catch these hands";

		public override string EquipmentModelPath => "Assets/ItemTests/Models/Prefabs/Equipment/StoneGauntlet.prefab";

		public override string EquipmentIconPath => "Assets/ItemTests/Textures/Icons/Equipment/StoneGauntletIcon.png";

		public override float Cooldown => 60f;

		public override ItemDisplayRuleDict CreateItemDisplayRules()
		{
			//IL_003b: 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_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: 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_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Expected O, but got Unknown
			EquipmentBase.EquipmentBodyModelPrefab = Main.Assets.LoadAsset<GameObject>(EquipmentModelPath);
			ItemDisplay val = EquipmentBase.EquipmentBodyModelPrefab.AddComponent<ItemDisplay>();
			val.rendererInfos = ItemHelper.ItemDisplaySetup(EquipmentBase.EquipmentBodyModelPrefab);
			return new ItemDisplayRuleDict((ItemDisplayRule[])(object)new ItemDisplayRule[1]
			{
				new ItemDisplayRule
				{
					ruleType = (ItemDisplayRuleType)0,
					followerPrefab = EquipmentBase.EquipmentBodyModelPrefab,
					childName = "Chest",
					localPos = new Vector3(0f, 0f, 0f),
					localAngles = new Vector3(0f, 0f, 0f),
					localScale = new Vector3(1f, 1f, 1f)
				}
			});
		}

		public override void Init(ConfigFile config)
		{
			CreateConfig(config);
			CreateLang();
			FistProjectilePrefab = Resources.Load<GameObject>(FistModelPath);
			CreateEquipment(EquipItemDef);
			Hooks();
		}

		protected override bool ActivateEquipment(EquipmentSlot slot)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			CharacterBody characterBody = slot.characterBody;
			Transform transform = characterBody.transform;
			FistPunch(transform.position, FistDelay, characterBody);
			return true;
		}

		private void FistPunch(Vector3 position, float delay, CharacterBody owner)
		{
			//IL_0016: 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_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: 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_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: 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_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: 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_00f0: 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_00fc: 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_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0170: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_017b: Unknown result type (might be due to invalid IL or missing references)
			float num = owner.radius / 2f + 8f;
			FireProjectileInfo val = default(FireProjectileInfo);
			val.projectilePrefab = FistProjectilePrefab;
			val.rotation = Quaternion.identity;
			val.owner = ((Component)owner).gameObject;
			val.damage = owner.damage * FistDamageMult;
			val.force = FistForce;
			val.crit = owner.RollCrit();
			((FireProjectileInfo)(ref val)).fuseOverride = delay;
			val.procChainMask = default(ProcChainMask);
			float num2 = 11f;
			int num3 = 8;
			float num4 = 360f;
			Vector3 val2 = owner.inputBank.aimDirection;
			Quaternion val3 = Quaternion.AngleAxis(num4 / (float)num3, Vector3.up);
			Ray val5 = default(Ray);
			RaycastHit val6 = default(RaycastHit);
			for (int i = 0; i < num3; i++)
			{
				val2 = val3 * val2;
				Vector3 val4 = position + val2 * num;
				val4.y += num2 / 2f;
				bool flag = false;
				((Ray)(ref val5))..ctor(val4, Vector3.down);
				if (Physics.Raycast(val5, ref val6, num2 + 3f, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.world)).mask)))
				{
					flag = true;
				}
				if (!flag && Physics.Raycast(val5, ref val6, num2 + 3f, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.debris)).mask)))
				{
					flag = true;
				}
				if (flag)
				{
					Vector3 point = ((RaycastHit)(ref val6)).point;
					val.position = point;
					ProjectileManager.instance.FireProjectile(val);
				}
			}
		}

		public static void Update()
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			if (Input.GetKeyDown((KeyCode)287))
			{
				Transform transform = PlayerCharacterMasterController.instances[0].master.GetBodyObject().transform;
				PickupDropletController.CreatePickupDroplet(PickupCatalog.FindPickupIndex(EquipItemDef.equipmentIndex), transform.position, transform.forward * 20f);
			}
		}
	}
}
namespace ZeebsZitems.Base_Classes
{
	public abstract class EquipmentBase
	{
		public static GameObject EquipmentBodyModelPrefab;

		public static EquipmentDef EquipmentDef;

		public abstract string EquipmentName { get; }

		public abstract string EquipmentLangTokenName { get; }

		public abstract string EquipmentPickupDesc { get; }

		public abstract string EquipmentFullDescription { get; }

		public abstract string EquipmentLore { get; }

		public abstract string EquipmentModelPath { get; }

		public abstract string EquipmentIconPath { get; }

		public virtual bool AppearsInSinglePlayer { get; } = true;


		public virtual bool AppearsInMultiPlayer { get; } = true;


		public virtual bool CanDrop { get; } = true;


		public virtual float Cooldown { get; } = 60f;


		public virtual bool EnigmaCompatible { get; } = true;


		public virtual bool IsBoss { get; } = false;


		public virtual bool IsLunar { get; } = false;


		public abstract ItemDisplayRuleDict CreateItemDisplayRules();

		public abstract void Init(ConfigFile config);

		protected virtual void CreateConfig(ConfigFile config)
		{
		}

		protected virtual void CreateLang()
		{
			LanguageAPI.Add("EQUIPMENT_" + EquipmentLangTokenName + "_NAME", EquipmentName);
			LanguageAPI.Add("EQUIPMENT_" + EquipmentLangTokenName + "_PICKUP", EquipmentPickupDesc);
			LanguageAPI.Add("EQUIPMENT_" + EquipmentLangTokenName + "_DESCRIPTION", EquipmentFullDescription);
			LanguageAPI.Add("EQUIPMENT_" + EquipmentLangTokenName + "_LORE", EquipmentLore);
		}

		protected void CreateEquipment(EquipmentDef equipDef)
		{
			//IL_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_015f: Expected O, but got Unknown
			//IL_0167: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Expected O, but got Unknown
			//IL_0179: Unknown result type (might be due to invalid IL or missing references)
			//IL_0183: Expected O, but got Unknown
			((Object)equipDef).name = "EQUIPMENT_" + EquipmentLangTokenName;
			equipDef.nameToken = "EQUIPMENT_" + EquipmentLangTokenName + "_NAME";
			equipDef.pickupToken = "EQUIPMENT_" + EquipmentLangTokenName + "_PICKUP";
			equipDef.descriptionToken = "EQUIPMENT_" + EquipmentLangTokenName + "_DESCRIPTION";
			equipDef.loreToken = "EQUIPMENT_" + EquipmentLangTokenName + "_LORE";
			if (EquipmentModelPath == "")
			{
				equipDef.pickupModelPrefab = Resources.Load<GameObject>("Prefabs/PickupModels/PickupMystery");
			}
			else
			{
				equipDef.pickupModelPrefab = Main.Assets.LoadAsset<GameObject>(EquipmentModelPath);
			}
			if (EquipmentIconPath == "")
			{
				equipDef.pickupIconSprite = Resources.Load<Sprite>("Textures/MiscIcons/texMysteryIcon");
			}
			else
			{
				equipDef.pickupIconSprite = Main.Assets.LoadAsset<Sprite>(EquipmentIconPath);
			}
			equipDef.appearsInSinglePlayer = AppearsInSinglePlayer;
			equipDef.appearsInMultiPlayer = AppearsInMultiPlayer;
			equipDef.canDrop = CanDrop;
			equipDef.cooldown = Cooldown;
			equipDef.enigmaCompatible = EnigmaCompatible;
			equipDef.isBoss = IsBoss;
			equipDef.isLunar = IsLunar;
			ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null);
			EquipmentDef = equipDef;
			ItemAPI.Add(new CustomEquipment(equipDef, val));
			EquipmentSlot.PerformEquipmentAction += new hook_PerformEquipmentAction(PerformEquipmentAction);
		}

		private bool PerformEquipmentAction(orig_PerformEquipmentAction orig, EquipmentSlot self, EquipmentDef equipmentDef)
		{
			if ((Object)(object)equipmentDef == (Object)(object)EquipmentDef)
			{
				return ActivateEquipment(self);
			}
			return orig.Invoke(self, equipmentDef);
		}

		protected abstract bool ActivateEquipment(EquipmentSlot slot);

		public virtual void Hooks()
		{
		}
	}
	public abstract class ItemBase
	{
		public static GameObject ItemBodyModelPrefab;

		public static ItemDef itemDef;

		public abstract string ItemName { get; }

		public abstract string ItemLangTokenName { get; }

		public abstract string ItemPickupDesc { get; }

		public abstract string ItemFullDescription { get; }

		public abstract string ItemLore { get; }

		public abstract ItemTier Tier { get; }

		public virtual ItemTag[] ItemTags { get; } = (ItemTag[])(object)new ItemTag[0];


		public abstract string ItemModelPath { get; }

		public abstract string ItemIconPath { get; }

		public virtual bool CanRemove { get; }

		public virtual bool Hidden { get; }

		public virtual bool HasUnlockable { get; }

		public virtual UnlockableDef ItemPreReq { get; }

		public abstract void Init(ConfigFile config);

		public abstract void CreateConfig(ConfigFile config);

		protected void CreateLang()
		{
			LanguageAPI.Add("ITEM_" + ItemLangTokenName + "_NAME", ItemName);
			LanguageAPI.Add("ITEM_" + ItemLangTokenName + "_PICKUP", ItemPickupDesc);
			LanguageAPI.Add("ITEM_" + ItemLangTokenName + "_DESCRIPTION", ItemFullDescription);
			LanguageAPI.Add("ITEM_" + ItemLangTokenName + "_LORE", ItemLore);
		}

		public abstract ItemDisplayRuleDict CreateItemDisplayRules();

		protected void CreateItem(ItemDef itemDef)
		{
			//IL_012a: Unknown result type (might be due to invalid IL or missing references)
			//IL_012f: 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_0147: Expected O, but got Unknown
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_0153: Expected O, but got Unknown
			((Object)itemDef).name = "ITEM_" + ItemLangTokenName;
			itemDef.nameToken = "ITEM_" + ItemLangTokenName + "_NAME";
			itemDef.pickupToken = "ITEM_" + ItemLangTokenName + "_PICKUP";
			itemDef.descriptionToken = "ITEM_" + ItemLangTokenName + "_DESCRIPTION";
			itemDef.loreToken = "ITEM_" + ItemLangTokenName + "_LORE";
			if (ItemModelPath == "")
			{
				itemDef.pickupModelPrefab = Resources.Load<GameObject>("Prefabs/PickupModels/PickupMystery");
			}
			else
			{
				itemDef.pickupModelPrefab = Main.Assets.LoadAsset<GameObject>(ItemModelPath);
			}
			if (ItemIconPath == "")
			{
				itemDef.pickupIconSprite = Resources.Load<Sprite>("Textures/MiscIcons/texMysteryIcon");
			}
			else
			{
				itemDef.pickupIconSprite = Main.Assets.LoadAsset<Sprite>(ItemIconPath);
			}
			itemDef.hidden = Hidden;
			itemDef.tags = ItemTags;
			itemDef.canRemove = CanRemove;
			itemDef.deprecatedTier = Tier;
			itemDef.unlockableDef = ItemPreReq;
			ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null);
			ItemAPI.Add(new CustomItem(itemDef, val));
		}

		public abstract void Hooks();

		public int GetCount(CharacterBody body)
		{
			if (!Object.op_Implicit((Object)(object)body) || !Object.op_Implicit((Object)(object)body.inventory))
			{
				return 0;
			}
			return body.inventory.GetItemCount(itemDef);
		}

		public int GetCount(CharacterMaster master)
		{
			if (!Object.op_Implicit((Object)(object)master) || !Object.op_Implicit((Object)(object)master.inventory))
			{
				return 0;
			}
			return master.inventory.GetItemCount(itemDef);
		}
	}
}