Decompiled source of FlowareItemPack v1.2.5

FlowareItemPack.dll

Decompiled 3 weeks 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.Logging;
using FlowareItemPack.Core;
using FlowareItemPack.Items;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using On.RoR2;
using On.RoR2.Items;
using R2API;
using RoR2;
using RoR2.ExpansionManagement;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Networking;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("FlowareItemPack")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+7eca0c795921cd54507f416cd400a09b80595979")]
[assembly: AssemblyProduct("FlowareItemPack")]
[assembly: AssemblyTitle("FlowareItemPack")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
public abstract class BaseItem
{
	public abstract ItemDef ItemDef { get; }

	public abstract void Initialize();

	public virtual void Hook()
	{
	}

	public virtual void Unhook()
	{
	}
}
namespace FlowareItemPack
{
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("Floware.FlowareItemPack", "FlowareItemPack", "1.2.5")]
	public class FlowareItemPack : BaseUnityPlugin
	{
		public const string PluginGUID = "Floware.FlowareItemPack";

		public const string PluginAuthor = "Floware";

		public const string PluginName = "FlowareItemPack";

		public const string PluginVersion = "1.2.5";

		private readonly List<BaseItem> _items = new List<BaseItem>();

		public void Awake()
		{
			Log.Init(((BaseUnityPlugin)this).Logger);
			_items.Add(new BoxOMatches());
			_items.Add(new DisperseObsidian());
			foreach (BaseItem item in _items)
			{
				item.Initialize();
				Debug.Log((object)("Initializing " + ((Object)item.ItemDef).name));
			}
		}

		private void OnDestroy()
		{
			foreach (BaseItem item in _items)
			{
				item.Unhook();
			}
		}
	}
	internal static class Log
	{
		private static ManualLogSource _logSource;

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

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

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

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

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

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

		internal static void Warning(object data)
		{
			_logSource.LogWarning(data);
		}
	}
}
namespace FlowareItemPack.Items
{
	public class PlaceHolderVoid : BaseItem
	{
		public override ItemDef ItemDef { get; } = ScriptableObject.CreateInstance<ItemDef>();


		public override void Initialize()
		{
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: 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_0125: Expected O, but got Unknown
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0136: Expected O, but got Unknown
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			//IL_0169: Unknown result type (might be due to invalid IL or missing references)
			Assets assets = new Assets();
			assets.PopulateAssets("matches", "matches");
			((Object)ItemDef).name = "void_matches";
			ItemDef.nameToken = "FLOWARE_VOIDMATCHES_NAME";
			ItemDef.pickupToken = "FLOWARE_VOIDMATCHES_PICKUP";
			ItemDef.descriptionToken = "FLOWARE_VOIDMATCHES_DESC";
			ItemDef.loreToken = "FLOWARE_VOIDMATCHES_LORE";
			LanguageAPI.Add("FLOWARE_VOIDMATCHES_NAME", "");
			LanguageAPI.Add("FLOWARE_VOIDMATCHES_PICKUP", "");
			LanguageAPI.Add("FLOWARE_VOIDMATCHES_DESC", "");
			LanguageAPI.Add("FLOWARE_VOIDMATCHES_LORE", "");
			ItemDef.tier = (ItemTier)6;
			ItemDef._itemTierDef = Addressables.LoadAssetAsync<ItemTierDef>((object)"RoR2/DLC1/Common/VoidTier1Def.asset").WaitForCompletion();
			ItemDef.pickupIconSprite = assets.icon;
			ItemDef.pickupModelPrefab = assets.prefab;
			ItemDef.tags = (ItemTag[])(object)new ItemTag[0];
			ItemDef.canRemove = true;
			ItemDef.hidden = false;
			ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null);
			ItemAPI.Add(new CustomItem(ItemDef, val));
			if (((ResourceAvailability)(ref ItemTierCatalog.availability)).available)
			{
				ItemTierDef itemTierDef = ItemTierCatalog.GetItemTierDef((ItemTier)6);
				if ((Object)(object)itemTierDef != (Object)null)
				{
					itemTierDef.dropletDisplayPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC1/Common/VoidItemPickup.prefab").WaitForCompletion();
				}
			}
			Hook();
		}

		public override void Hook()
		{
		}

		public override void Unhook()
		{
		}

		private void OnServerDamageDealt(DamageReport report)
		{
		}
	}
	public class BoxOMatches : BaseItem
	{
		public override ItemDef ItemDef { get; } = ScriptableObject.CreateInstance<ItemDef>();


		public override void Initialize()
		{
			//IL_00b4: 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_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: Expected O, but got Unknown
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Expected O, but got Unknown
			Assets assets = new Assets();
			assets.PopulateAssets("matches", "matches");
			((Object)ItemDef).name = "Matches";
			ItemDef.nameToken = "FLOWARE_MATCHES_NAME";
			ItemDef.pickupToken = "FLOWARE_MATCHES_PICKUP";
			ItemDef.descriptionToken = "FLOWARE_MATCHES_DESC";
			ItemDef.loreToken = "FLOWARE_MATCHES_LORE";
			LanguageAPI.Add("FLOWARE_MATCHES_NAME", "Box O' Matches");
			LanguageAPI.Add("FLOWARE_MATCHES_PICKUP", "Light em' up, break em' down.");
			LanguageAPI.Add("FLOWARE_MATCHES_DESC", "5% chance (+5% per stack) to set enemies on fire for 2 seconds (+0.5s per stack), dealing 10% base damage.");
			LanguageAPI.Add("FLOWARE_MATCHES_LORE", "An old, half-empty box of matches. Each one a spark waiting to ignite chaos.");
			ItemDef._itemTierDef = Addressables.LoadAssetAsync<ItemTierDef>((object)"RoR2/Base/Common/Tier1Def.asset").WaitForCompletion();
			ItemDef.pickupIconSprite = assets.icon;
			ItemDef.pickupModelPrefab = assets.prefab;
			ItemDef.tags = (ItemTag[])(object)new ItemTag[2]
			{
				(ItemTag)1,
				(ItemTag)21
			};
			ItemDef.canRemove = true;
			ItemDef.hidden = false;
			ItemDisplayRuleDict val = new ItemDisplayRuleDict((ItemDisplayRule[])null);
			ItemAPI.Add(new CustomItem(ItemDef, val));
			Hook();
		}

		public override void Hook()
		{
			GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
		}

		public override void Unhook()
		{
			GlobalEventManager.onServerDamageDealt -= GlobalEventManager_onServerDamageDealt;
		}

		private void GlobalEventManager_onServerDamageDealt(DamageReport report)
		{
			//IL_0031: 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_0040: 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_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: 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_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Invalid comparison between Unknown and I4
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)report.attackerBody) || !Object.op_Implicit((Object)(object)report.victimBody) || DamageTypeCombo.op_Implicit(report.damageInfo.damageType & DamageTypeCombo.op_Implicit((DamageType)67108864)) != 0)
			{
				return;
			}
			CharacterBody attackerBody = report.attackerBody;
			Inventory inventory = attackerBody.inventory;
			if (!Object.op_Implicit((Object)(object)inventory))
			{
				return;
			}
			int itemCount = inventory.GetItemCount(ItemDef.itemIndex);
			CharacterBody victimBody = report.victimBody;
			ItemDef itemDef = ItemCatalog.GetItemDef(ItemCatalog.FindItemIndex("StrengthenBurn"));
			if (itemCount > 0 && Util.CheckRoll(5f * (float)itemCount, attackerBody.master))
			{
				float num = 2f * (float)itemCount;
				float num2 = report.attackerBody.baseDamage * 0.1f;
				int itemCount2 = inventory.GetItemCount(itemDef.itemIndex);
				DotIndex val = (DotIndex)((itemCount2 <= 0) ? 1 : 7);
				DotController val2 = DotController.FindDotController(((Component)victimBody).gameObject);
				if ((int)val == 7)
				{
					num2 *= (float)(4 * itemCount2);
				}
				DotController.InflictDot(((Component)report.victimBody).gameObject, ((Component)report.attackerBody).gameObject, val, num, num2, (uint?)null);
			}
		}
	}
	internal class DisperseObsidian : BaseItem
	{
		private GameObject effect;

		private GameObject effect2;

		public override ItemDef ItemDef { get; } = ScriptableObject.CreateInstance<ItemDef>();


		public override void Initialize()
		{
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			//IL_0133: Expected O, but got Unknown
			//IL_012e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: Expected O, but got Unknown
			Assets assets = new Assets();
			assets.PopulateAssets("disperseobsidian", "disperseobsidian");
			((Object)ItemDef).name = "disperse_obsidian";
			ItemDef.nameToken = "FLOWARE_DISPERSEOBSIDIAN_NAME";
			ItemDef.pickupToken = "FLOWARE_DISPERSEOBSIDIAN_PICKUP";
			ItemDef.descriptionToken = "FLOWARE_DISPERSEOBSIDIAN_DESC";
			ItemDef.loreToken = "FLOWARE_DISPERSEOBSIDIAN_LORE";
			LanguageAPI.Add("FLOWARE_DISPERSEOBSIDIAN_NAME", "Disperse Obsidian");
			LanguageAPI.Add("FLOWARE_DISPERSEOBSIDIAN_PICKUP", "Deal bonus damage to enemies at long distance. <color=#ed7fcd>Corrupts all Focus Crystals </color>");
			LanguageAPI.Add("FLOWARE_DISPERSEOBSIDIAN_DESC", "Grants a damage boost against enemies further away. Displays a pulsating effect around the player. <color=#ed7fcd>Corrupts all Focus Crystals </color>");
			LanguageAPI.Add("FLOWARE_DISPERSEOBSIDIAN_LORE", "A shard that resonates with the distant echoes of battle.");
			ItemDef.tier = (ItemTier)6;
			ItemDef._itemTierDef = Addressables.LoadAssetAsync<ItemTierDef>((object)"RoR2/DLC1/Common/VoidTier1Def.asset").WaitForCompletion();
			ItemDef.tags = (ItemTag[])(object)new ItemTag[1] { (ItemTag)1 };
			ItemDef.pickupIconSprite = assets.icon;
			ItemDef.pickupModelPrefab = assets.prefab;
			ItemDef.canRemove = true;
			ItemDef.hidden = false;
			ItemAPI.Add(new CustomItem(ItemDef, new ItemDisplayRuleDict((ItemDisplayRule[])null)));
			Hook();
		}

		public override void Hook()
		{
			//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
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			CharacterMaster.OnInventoryChanged += new hook_OnInventoryChanged(OnInventoryChanged);
			HealthComponent.TakeDamage += new hook_TakeDamage(OnDamageDealt);
			ContagiousItemManager.Init += new hook_Init(SetTransformation);
		}

		public override void Unhook()
		{
			//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
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			CharacterMaster.OnInventoryChanged -= new hook_OnInventoryChanged(OnInventoryChanged);
			HealthComponent.TakeDamage -= new hook_TakeDamage(OnDamageDealt);
			ContagiousItemManager.Init -= new hook_Init(SetTransformation);
		}

		private unsafe void SetTransformation(orig_Init orig)
		{
			//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_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			ExpansionDef requiredExpansion = (ExpansionDef)Unsafe.Read<object>((void*)ExpansionCatalog.expansionDefs[0]);
			ItemDef.requiredExpansion = requiredExpansion;
			Pair val = default(Pair);
			val.itemDef1 = Items.NearbyDamageBonus;
			val.itemDef2 = ItemDef;
			Pair val2 = val;
			ItemCatalog.itemRelationships[ItemRelationshipTypes.ContagiousItem] = CollectionExtensions.AddToArray<Pair>(ItemCatalog.itemRelationships[ItemRelationshipTypes.ContagiousItem], val2);
			orig.Invoke();
		}

		private void OnInventoryChanged(orig_OnInventoryChanged orig, CharacterMaster self)
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self);
			if (!Object.op_Implicit((Object)(object)self) || !Object.op_Implicit((Object)(object)self.inventory))
			{
				return;
			}
			CharacterBody body = self.GetBody();
			if (Object.op_Implicit((Object)(object)body) && body.isPlayerControlled)
			{
				int itemCount = self.inventory.GetItemCount(ItemDef.itemIndex);
				if (itemCount > 0)
				{
					Debug.Log((object)"DEBUG: Item added, creating effect.");
					InstantiateEffect(body);
				}
				else
				{
					Debug.Log((object)"DEBUG: Item removed, destroying effect.");
					DestroyEffect();
				}
			}
		}

		private void InstantiateEffect(CharacterBody self)
		{
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: 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_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			Debug.Log((object)"Attempting to load NearbyDamageBonusIndicator from LegacyResourcesAPI.");
			GameObject val = LegacyResourcesAPI.Load<GameObject>("Prefabs/NetworkedObjects/NearbyDamageBonusIndicator");
			if ((Object)(object)val == (Object)null)
			{
				Debug.LogError((object)"Failed to load NearbyDamageBonusIndicator.");
				return;
			}
			Debug.Log((object)"Prefab loaded successfully. Instantiating...");
			GameObject val2 = Object.Instantiate<GameObject>(val, self.corePosition, Quaternion.identity);
			if ((Object)(object)val2 == (Object)null)
			{
				Debug.LogError((object)"Failed to instantiate NearbyDamageBonusIndicator.");
				return;
			}
			NetworkIdentity val3 = default(NetworkIdentity);
			if (!val2.TryGetComponent<NetworkIdentity>(ref val3))
			{
				val3 = val2.AddComponent<NetworkIdentity>();
				Debug.LogWarning((object)"Added NetworkIdentity to spawnedObject.");
			}
			Debug.Log((object)"Attaching NetworkedBodyAttachment.");
			float num = 2.3f;
			Transform transform = val2.transform;
			transform.localScale *= num;
			MeshRenderer componentInChildren = val2.GetComponentInChildren<MeshRenderer>();
			if ((Object)(object)componentInChildren != (Object)null)
			{
				((Renderer)componentInChildren).material.color = Color.green;
				Debug.Log((object)"Ring color changed to purple.");
			}
			else
			{
				Debug.LogError((object)"No MeshRenderer found in NearbyDamageBonusIndicator.");
			}
			NetworkedBodyAttachment component = val2.GetComponent<NetworkedBodyAttachment>();
			if ((Object)(object)component == (Object)null)
			{
				Debug.LogError((object)"NearbyDamageBonusIndicator is missing NetworkedBodyAttachment.");
				return;
			}
			Debug.LogError((object)"No Renderer found on NearbyDamageBonusIndicator.");
			val2.transform.SetParent(self.transform, true);
			component.AttachToGameObjectAndSpawn(((Component)self).gameObject, (string)null);
			effect = val2;
		}

		private void DestroyEffect()
		{
			if ((Object)(object)effect != (Object)null)
			{
				Object.Destroy((Object)(object)effect);
				effect = null;
				Object.Destroy((Object)(object)effect2);
			}
		}

		private void OnDamageDealt(orig_TakeDamage orig, HealthComponent self, DamageInfo damageInfo)
		{
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: 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)
			if (!NetworkServer.active)
			{
				orig.Invoke(self, damageInfo);
				return;
			}
			if ((Object)(object)damageInfo.attacker == (Object)null)
			{
				orig.Invoke(self, damageInfo);
				return;
			}
			CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>();
			if ((Object)(object)component == (Object)null)
			{
				orig.Invoke(self, damageInfo);
				return;
			}
			Inventory inventory = component.inventory;
			if ((Object)(object)inventory == (Object)null)
			{
				orig.Invoke(self, damageInfo);
				return;
			}
			int itemCount = inventory.GetItemCount(ItemDef.itemIndex);
			if (itemCount <= 0)
			{
				orig.Invoke(self, damageInfo);
				return;
			}
			float num = Vector3.Distance(component.transform.position, ((Component)self).transform.position);
			if (num > 29.9f)
			{
				damageInfo.damage *= 1f + 0.2f * (float)itemCount;
				damageInfo.damageColorIndex = (DamageColorIndex)9;
			}
			orig.Invoke(self, damageInfo);
		}
	}
}
namespace FlowareItemPack.Core
{
	public class Assets
	{
		public Sprite icon;

		public GameObject prefab;

		public static AssetBundle _assetBundle;

		public void PopulateAssets(string iconName, string prefabName)
		{
			if ((Object)(object)_assetBundle == (Object)null)
			{
				using Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("FlowareItemPack.import");
				_assetBundle = AssetBundle.LoadFromStream(stream);
			}
			icon = _assetBundle.LoadAsset<Sprite>("assets/import/icons/" + iconName + ".png");
			prefab = _assetBundle.LoadAsset<GameObject>("assets/import/prefabs/" + prefabName + ".prefab");
		}
	}
}