Decompiled source of CromulentItems v0.3.0

CromulentItems.dll

Decompiled 5 months ago
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using CromulentItems;
using HG.Reflection;
using On.RoR2;
using R2API;
using R2API.Utils;
using RoR2;
using UnityEngine;
using UnityEngine.AddressableAssets;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: OptIn]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
public static class Assets
{
	public static AssetBundle icons;

	public static AssetBundle prefabs;

	public const string iconsName = "iconsCrom";

	public const string prefabsName = "prefabsCrom";

	public static string IconAssetBundlePath => Path.Combine(Path.GetDirectoryName(CromItems.PInfo.Location), "iconsCrom");

	public static string PrefabAssetBundlePath => Path.Combine(Path.GetDirectoryName(CromItems.PInfo.Location), "prefabsCrom");

	public static void Init()
	{
		icons = AssetBundle.LoadFromFile(IconAssetBundlePath);
		prefabs = AssetBundle.LoadFromFile(PrefabAssetBundlePath);
	}
}
namespace CromulentItems;

[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("Spartan.CromulentItems", "CromulentItems", "0.3.0")]
[R2APISubmoduleDependency(new string[] { "ItemAPI", "LanguageAPI" })]
public class CromItems : BaseUnityPlugin
{
	public const string PluginGUID = "Spartan.CromulentItems";

	public const string PluginAuthor = "Spartan";

	public const string PluginName = "CromulentItems";

	public const string PluginVersion = "0.3.0";

	public static ManualLogSource Log;

	public GameObject multiShopPrefab;

	public ItemTier[] itemTiers;

	public static PluginInfo PInfo { get; private set; }

	public void Awake()
	{
		Log = ((BaseUnityPlugin)this).Logger;
		PInfo = ((BaseUnityPlugin)this).Info;
		Assets.Init();
		JacobBlast.Init();
		Grug.Init();
		Respect.Init();
		WoatReaction.Init();
		Log.LogInfo((object)"CromulentItems successfully loaded.");
	}

	private void Update()
	{
	}
}
internal class Grug
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static hook_OnCharacterDeath <>9__6_0;

		public static hook_OnHitEnemy <>9__6_1;

		internal void <hooks>b__6_0(orig_OnCharacterDeath orig, GlobalEventManager globalEventManager, DamageReport damageReport)
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(globalEventManager, damageReport);
			CharacterMaster attackerMaster = damageReport.attackerMaster;
			if ((Object)(object)((attackerMaster != null) ? attackerMaster.inventory : null) != (Object)null)
			{
				int itemCount = damageReport.attackerMaster.inventory.GetItemCount(myItemDef.itemIndex);
				if (!(damageReport.attacker.GetComponent<CharacterBody>().healthComponent.barrier > 0f) && itemCount > 0)
				{
					damageReport.attacker.GetComponent<CharacterBody>().healthComponent.AddBarrier(15f);
				}
			}
		}

		internal void <hooks>b__6_1(orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
		{
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: 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_00c5: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self, damageInfo, victim);
			if (!Object.op_Implicit((Object)(object)damageInfo.attacker))
			{
				return;
			}
			CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>();
			CharacterBody component2 = victim.GetComponent<CharacterBody>();
			if (Object.op_Implicit((Object)(object)((component != null) ? component.inventory : null)))
			{
				int itemCount = component.inventory.GetItemCount(myItemDef.itemIndex);
				_ = component2.transform.position;
				if (itemCount > 0 && component.healthComponent.barrier > 0f && Util.CheckRoll(20f * damageInfo.procCoefficient, 0f, (CharacterMaster)null))
				{
					component.AddBuff(myCounterBuffDef);
					float num = 3f * (float)itemCount;
					float num2 = Util.OnHitProcDamage(damageInfo.damage, component.damage, num);
					MissileUtils.FireMissile(component.corePosition, component, damageInfo.procChainMask, victim, num2, false, CommonAssets.missilePrefab, (DamageColorIndex)3, false);
				}
			}
		}
	}

	public static ItemDef myItemDef;

	public static GameObject RockProjectile;

	public static GameObject RockGhost;

	public static BuffDef myCounterBuffDef;

	internal static void Init()
	{
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Expected O, but got Unknown
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Expected O, but got Unknown
		CreateItem();
		AddTokens();
		ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null);
		ItemAPI.Add(new CustomItem(myItemDef, val));
		hooks();
	}

	private static void CreateItem()
	{
		//IL_0077: 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)
		myItemDef = ScriptableObject.CreateInstance<ItemDef>();
		((Object)myItemDef).name = "Grug";
		myItemDef.nameToken = "Grug";
		myItemDef.pickupToken = "GrugItem";
		myItemDef.descriptionToken = "GrugDesc";
		myItemDef.loreToken = "GrugDesc";
		myItemDef.tags = (ItemTag[])(object)new ItemTag[2]
		{
			(ItemTag)2,
			(ItemTag)1
		};
		myItemDef._itemTierDef = Addressables.LoadAssetAsync<ItemTierDef>((object)"RoR2/Base/Common/Tier2Def.asset").WaitForCompletion();
		Sprite pickupIconSprite = Assets.icons.LoadAsset<Sprite>("Grug");
		myItemDef.pickupIconSprite = pickupIconSprite;
		GameObject pickupModelPrefab = Assets.prefabs.LoadAsset<GameObject>("GrugCube");
		myItemDef.pickupModelPrefab = pickupModelPrefab;
		RockProjectile = Assets.prefabs.LoadAsset<GameObject>("rock");
		myItemDef.canRemove = true;
		myItemDef.hidden = false;
	}

	private static void hooks()
	{
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Expected O, but got Unknown
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0043: Expected O, but got Unknown
		object obj = <>c.<>9__6_0;
		if (obj == null)
		{
			hook_OnCharacterDeath val = delegate(orig_OnCharacterDeath orig, GlobalEventManager globalEventManager, DamageReport damageReport)
			{
				//IL_0032: Unknown result type (might be due to invalid IL or missing references)
				orig.Invoke(globalEventManager, damageReport);
				CharacterMaster attackerMaster = damageReport.attackerMaster;
				if ((Object)(object)((attackerMaster != null) ? attackerMaster.inventory : null) != (Object)null)
				{
					int itemCount2 = damageReport.attackerMaster.inventory.GetItemCount(myItemDef.itemIndex);
					if (!(damageReport.attacker.GetComponent<CharacterBody>().healthComponent.barrier > 0f) && itemCount2 > 0)
					{
						damageReport.attacker.GetComponent<CharacterBody>().healthComponent.AddBarrier(15f);
					}
				}
			};
			<>c.<>9__6_0 = val;
			obj = (object)val;
		}
		GlobalEventManager.OnCharacterDeath += (hook_OnCharacterDeath)obj;
		object obj2 = <>c.<>9__6_1;
		if (obj2 == null)
		{
			hook_OnHitEnemy val2 = delegate(orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
			{
				//IL_004f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0060: 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_00c5: Unknown result type (might be due to invalid IL or missing references)
				orig.Invoke(self, damageInfo, victim);
				if (Object.op_Implicit((Object)(object)damageInfo.attacker))
				{
					CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>();
					CharacterBody component2 = victim.GetComponent<CharacterBody>();
					if (Object.op_Implicit((Object)(object)((component != null) ? component.inventory : null)))
					{
						int itemCount = component.inventory.GetItemCount(myItemDef.itemIndex);
						_ = component2.transform.position;
						if (itemCount > 0 && component.healthComponent.barrier > 0f && Util.CheckRoll(20f * damageInfo.procCoefficient, 0f, (CharacterMaster)null))
						{
							component.AddBuff(myCounterBuffDef);
							float num = 3f * (float)itemCount;
							float num2 = Util.OnHitProcDamage(damageInfo.damage, component.damage, num);
							MissileUtils.FireMissile(component.corePosition, component, damageInfo.procChainMask, victim, num2, false, CommonAssets.missilePrefab, (DamageColorIndex)3, false);
						}
					}
				}
			};
			<>c.<>9__6_1 = val2;
			obj2 = (object)val2;
		}
		GlobalEventManager.OnHitEnemy += (hook_OnHitEnemy)obj2;
	}

	private static void AddTokens()
	{
		LanguageAPI.Add("Grug", "grug...");
		LanguageAPI.Add("GrugItem", "Gain barrier. \nOn hit, rock(et)");
		LanguageAPI.Add("GrugDesc", "On kill, gain a barrier if you dont have one.\nOn hit if you have a barrier, <style=cIsUtility>20%<style=cIsUtility> chance to launch a rock(et) that does <style=cIsUtility>+" + 300 + "%<style=cIsUtility><style=cStack>(+" + 300 + "%)</style> damage.");
		LanguageAPI.Add("GrugLore", "He's grug you know");
	}
}
internal class JacobBlast
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static hook_OnInventoryChanged <>9__6_0;

		public static hook_OnHitEnemy <>9__6_1;

		internal void <hooks>b__6_0(orig_OnInventoryChanged orig, CharacterBody self)
		{
			orig.Invoke(self);
		}

		internal void <hooks>b__6_1(orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
		{
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self, damageInfo, victim);
			if (!Object.op_Implicit((Object)(object)damageInfo.attacker) || !(damageInfo.procCoefficient > 0f))
			{
				return;
			}
			CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>();
			victim.GetComponent<CharacterBody>();
			if (Object.op_Implicit((Object)(object)((component != null) ? component.inventory : null)))
			{
				int itemCount = component.inventory.GetItemCount(myItemDef.itemIndex);
				if (itemCount > 0 && Util.CheckRoll((float)(itemCount / 2), component.master))
				{
					component.AddTimedBuff(Buffs.TonicBuff, 2f);
				}
			}
		}
	}

	public static ItemDef myItemDef;

	public static float luckAmount = 10f;

	public static float numItems = 0f;

	public static float cooldownAmount = 0.70000005f;

	internal static void Init()
	{
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Expected O, but got Unknown
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Expected O, but got Unknown
		CreateItem();
		AddTokens();
		ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null);
		ItemAPI.Add(new CustomItem(myItemDef, val));
		hooks();
	}

	private static void CreateItem()
	{
		//IL_0073: 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)
		myItemDef = ScriptableObject.CreateInstance<ItemDef>();
		((Object)myItemDef).name = "JacobBlast";
		myItemDef.nameToken = "JacobBlast";
		myItemDef.pickupToken = "JacobBlastItem";
		myItemDef.descriptionToken = "JacobBlastDesc";
		myItemDef.loreToken = "JacobBlastDesc";
		myItemDef.tags = (ItemTag[])(object)new ItemTag[1] { (ItemTag)3 };
		myItemDef._itemTierDef = Addressables.LoadAssetAsync<ItemTierDef>((object)"RoR2/Base/Common/Tier3Def.asset").WaitForCompletion();
		Sprite pickupIconSprite = Assets.icons.LoadAsset<Sprite>("JacobBluePNG");
		myItemDef.pickupIconSprite = pickupIconSprite;
		GameObject pickupModelPrefab = Assets.prefabs.LoadAsset<GameObject>("JacobCube");
		myItemDef.pickupModelPrefab = pickupModelPrefab;
		myItemDef.canRemove = true;
		myItemDef.hidden = false;
	}

	private static void hooks()
	{
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Expected O, but got Unknown
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0043: Expected O, but got Unknown
		object obj = <>c.<>9__6_0;
		if (obj == null)
		{
			hook_OnInventoryChanged val = delegate(orig_OnInventoryChanged orig, CharacterBody self)
			{
				orig.Invoke(self);
			};
			<>c.<>9__6_0 = val;
			obj = (object)val;
		}
		CharacterBody.OnInventoryChanged += (hook_OnInventoryChanged)obj;
		object obj2 = <>c.<>9__6_1;
		if (obj2 == null)
		{
			hook_OnHitEnemy val2 = delegate(orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
			{
				//IL_0056: Unknown result type (might be due to invalid IL or missing references)
				orig.Invoke(self, damageInfo, victim);
				if (Object.op_Implicit((Object)(object)damageInfo.attacker) && damageInfo.procCoefficient > 0f)
				{
					CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>();
					victim.GetComponent<CharacterBody>();
					if (Object.op_Implicit((Object)(object)((component != null) ? component.inventory : null)))
					{
						int itemCount = component.inventory.GetItemCount(myItemDef.itemIndex);
						if (itemCount > 0 && Util.CheckRoll((float)(itemCount / 2), component.master))
						{
							component.AddTimedBuff(Buffs.TonicBuff, 2f);
						}
					}
				}
			};
			<>c.<>9__6_1 = val2;
			obj2 = (object)val2;
		}
		GlobalEventManager.OnHitEnemy += (hook_OnHitEnemy)obj2;
	}

	private static void AddTokens()
	{
		LanguageAPI.Add("JacobBlast", "Jacob Blast");
		LanguageAPI.Add("JacobBlastItem", "Chance to activate 'Tonic'");
		LanguageAPI.Add("JacobBlastDesc", " <style=cIsUtility>" + numItems / 2f + "</style> chance to Activate a Tonic Effect.");
		LanguageAPI.Add("JacobBlastLore", "Blue Liquid Amalgomation");
	}
}
internal class Respect
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static hook_OnHitEnemy <>9__3_0;

		internal void <hooks>b__3_0(orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
		{
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)damageInfo.attacker))
			{
				CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>();
				victim.GetComponent<CharacterBody>();
				if (Object.op_Implicit((Object)(object)((component != null) ? component.inventory : null)))
				{
					int itemCount = component.inventory.GetItemCount(myItemDef.itemIndex);
					if (itemCount > 0 && damageInfo.procCoefficient > 0f)
					{
						float num = 0.03f * (float)itemCount;
						damageInfo.procCoefficient += num;
					}
				}
			}
			orig.Invoke(self, damageInfo, victim);
		}
	}

	public static ItemDef myItemDef;

	internal static void Init()
	{
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Expected O, but got Unknown
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Expected O, but got Unknown
		CreateItem();
		AddTokens();
		ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null);
		ItemAPI.Add(new CustomItem(myItemDef, val));
		hooks();
	}

	private static void CreateItem()
	{
		//IL_0073: 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)
		myItemDef = ScriptableObject.CreateInstance<ItemDef>();
		((Object)myItemDef).name = "Respect";
		myItemDef.nameToken = "Respect";
		myItemDef.pickupToken = "RespectItem";
		myItemDef.descriptionToken = "RespectDesc";
		myItemDef.loreToken = "RespectDesc";
		myItemDef.tags = (ItemTag[])(object)new ItemTag[1] { (ItemTag)3 };
		myItemDef._itemTierDef = Addressables.LoadAssetAsync<ItemTierDef>((object)"RoR2/Base/Common/Tier1Def.asset").WaitForCompletion();
		Sprite pickupIconSprite = Assets.icons.LoadAsset<Sprite>("respectPNG");
		myItemDef.pickupIconSprite = pickupIconSprite;
		GameObject pickupModelPrefab = Assets.prefabs.LoadAsset<GameObject>("RespectOBJ");
		myItemDef.pickupModelPrefab = pickupModelPrefab;
		myItemDef.canRemove = true;
		myItemDef.hidden = false;
	}

	private static void hooks()
	{
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Expected O, but got Unknown
		object obj = <>c.<>9__3_0;
		if (obj == null)
		{
			hook_OnHitEnemy val = delegate(orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
			{
				//IL_003f: Unknown result type (might be due to invalid IL or missing references)
				if (Object.op_Implicit((Object)(object)damageInfo.attacker))
				{
					CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>();
					victim.GetComponent<CharacterBody>();
					if (Object.op_Implicit((Object)(object)((component != null) ? component.inventory : null)))
					{
						int itemCount = component.inventory.GetItemCount(myItemDef.itemIndex);
						if (itemCount > 0 && damageInfo.procCoefficient > 0f)
						{
							float num = 0.03f * (float)itemCount;
							damageInfo.procCoefficient += num;
						}
					}
				}
				orig.Invoke(self, damageInfo, victim);
			};
			<>c.<>9__3_0 = val;
			obj = (object)val;
		}
		GlobalEventManager.OnHitEnemy += (hook_OnHitEnemy)obj;
	}

	private static void AddTokens()
	{
		LanguageAPI.Add("Respect", "Respect");
		LanguageAPI.Add("RespectItem", "Slightly increase proc coefficient");
		LanguageAPI.Add("RespectDesc", "Gain <style=cIsUtility>+" + 3 + "%</style><style=cStack>(+" + 3 + "%)</style> proc coefficient");
		LanguageAPI.Add("RespectLore", "#1 Star of Thats Respect Compilations");
	}
}
internal class WoatReaction
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static hook_OnLevelUp <>9__3_0;

		internal void <hooks>b__3_0(orig_OnLevelUp orig, CharacterBody self)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)((self != null) ? self.inventory : null)) && self.inventory.GetItemCount(myItemDef.itemIndex) > 0)
			{
				int itemCount = self.inventory.GetItemCount(myItemDef.itemIndex);
				if (itemCount > 0)
				{
					self.baseDamage += (float)(4 * itemCount);
				}
			}
		}
	}

	public static ItemDef myItemDef;

	internal static void Init()
	{
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Expected O, but got Unknown
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Expected O, but got Unknown
		CreateItem();
		AddTokens();
		ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null);
		ItemAPI.Add(new CustomItem(myItemDef, val));
		hooks();
	}

	private static void CreateItem()
	{
		//IL_0073: 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)
		myItemDef = ScriptableObject.CreateInstance<ItemDef>();
		((Object)myItemDef).name = "WoatReaction";
		myItemDef.nameToken = "WoatReaction";
		myItemDef.pickupToken = "WoatReactionItem";
		myItemDef.descriptionToken = "WoatReactionDesc";
		myItemDef.loreToken = "WoatReactionDesc";
		myItemDef.tags = (ItemTag[])(object)new ItemTag[1] { (ItemTag)1 };
		myItemDef._itemTierDef = Addressables.LoadAssetAsync<ItemTierDef>((object)"RoR2/Base/Common/Tier2Def.asset").WaitForCompletion();
		Sprite pickupIconSprite = Assets.icons.LoadAsset<Sprite>("woatreaction");
		myItemDef.pickupIconSprite = pickupIconSprite;
		GameObject pickupModelPrefab = Assets.prefabs.LoadAsset<GameObject>("woatOBJ");
		myItemDef.pickupModelPrefab = pickupModelPrefab;
		myItemDef.canRemove = true;
		myItemDef.hidden = false;
	}

	private static void hooks()
	{
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Expected O, but got Unknown
		object obj = <>c.<>9__3_0;
		if (obj == null)
		{
			hook_OnLevelUp val = delegate(orig_OnLevelUp orig, CharacterBody self)
			{
				//IL_001e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0036: Unknown result type (might be due to invalid IL or missing references)
				if (Object.op_Implicit((Object)(object)((self != null) ? self.inventory : null)) && self.inventory.GetItemCount(myItemDef.itemIndex) > 0)
				{
					int itemCount = self.inventory.GetItemCount(myItemDef.itemIndex);
					if (itemCount > 0)
					{
						self.baseDamage += (float)(4 * itemCount);
					}
				}
			};
			<>c.<>9__3_0 = val;
			obj = (object)val;
		}
		CharacterBody.OnLevelUp += (hook_OnLevelUp)obj;
	}

	private static void AddTokens()
	{
		LanguageAPI.Add("WoatReaction", "The Woat");
		LanguageAPI.Add("WoatReactionItem", "Increase Base Damage on Level Up");
		LanguageAPI.Add("WoatReactionDesc", "Gain <style=cIsUtility>+" + 4 + "%</style><style=cStack>(+" + 4 + "%)</style> base damage on level up");
		LanguageAPI.Add("WoatReactionLore", "#1 Star of Thats Respect Compilations");
	}
}