Decompiled source of ExtraFireworks v1.5.3

ExtraFireworks.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using On.RoR2;
using On.RoR2.Projectile;
using R2API;
using RoR2;
using RoR2.ExpansionManagement;
using RoR2.Projectile;
using UnityEngine;
using UnityEngine.Networking;
using VoidItemAPI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("ExtraFireworks")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("ExtraFireworks")]
[assembly: AssemblyTitle("ExtraFireworks")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace ExtraFireworks;

public class ConfigurableHyperbolicScaling : ConfigurableScaling
{
	public ConfigurableHyperbolicScaling(ConfigFile config, string prefix, string configSection, float defaultStart, float defaultScale)
		: base(config, prefix, configSection, defaultStart, defaultScale)
	{
	}

	public override string GetBaseDescription()
	{
		return "Max-cap ceiling value";
	}

	public override string GetScalingDescription()
	{
		return "Hyperbolic scaling constant";
	}

	public override float RawValue(int stacks)
	{
		return base.Base * (1f - 1f / (1f + base.Scaling * (float)stacks));
	}
}
public class ConfigurableLinearScaling : ConfigurableScaling
{
	public ConfigurableLinearScaling(ConfigFile config, string prefix, string configSection, float defaultStart, float defaultScale)
		: base(config, prefix, configSection, defaultStart, defaultScale)
	{
	}

	public override string GetBaseDescription()
	{
		return "Base scaling value";
	}

	public override string GetScalingDescription()
	{
		return "Additional stacks scaling value";
	}

	public override float RawValue(int stacks)
	{
		return base.Base + base.Scaling * (float)(stacks - 1);
	}
}
public abstract class ConfigurableScaling
{
	private ConfigEntry<float> starting;

	private ConfigEntry<float> scale;

	public float Base => starting.Value;

	public float Scaling => scale.Value;

	public abstract string GetBaseDescription();

	public abstract string GetScalingDescription();

	public abstract float RawValue(int stacks);

	public ConfigurableScaling(ConfigFile config, string prefix, string configSection, float defaultStart, float defaultScale)
	{
		if (prefix == null)
		{
			prefix = "";
		}
		starting = config.Bind<float>(configSection, "BaseValue", defaultStart, GetBaseDescription());
		scale = config.Bind<float>(configSection, "ScaleAdditionalStacks", defaultScale, GetScalingDescription());
	}

	public float GetValue(int stacks)
	{
		if (stacks <= 0)
		{
			return 0f;
		}
		return RawValue(stacks);
	}

	public int GetValueInt(int stacks)
	{
		return Mathf.RoundToInt(GetValue(stacks));
	}
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("PhysicsFox.ExtraFireworks", "ExtraFireworks", "1.5.3")]
public class ExtraFireworks : BaseUnityPlugin
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static hook_RebuildModel <>9__7_0;

		internal void <Awake>b__7_0(orig_RebuildModel orig, PickupDisplay self, GameObject modelObjectOverride)
		{
			//IL_000b: 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_00a7: 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_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self, modelObjectOverride);
			_ = self.pickupIndex;
			if (((PickupIndex)(ref self.pickupIndex)).pickupDef == null || (Object.op_Implicit((Object)(object)self.modelObject) && ((Object)self.modelObject).name == "PickupMystery(Clone)") || (Object.op_Implicit((Object)(object)self.highlight) && ((Object)self.highlight).name == "CommandCube(Clone)"))
			{
				return;
			}
			foreach (FireworkItem item in items)
			{
				if (item.IsEnabled() && ((PickupIndex)(ref self.pickupIndex)).pickupDef.itemTier == item.Item.tier && ((PickupIndex)(ref self.pickupIndex)).pickupDef.itemIndex == item.Item.itemIndex)
				{
					Transform transform = self.modelObject.transform;
					transform.localScale *= item.GetModelScale();
					break;
				}
			}
		}
	}

	public const string PluginGUID = "PhysicsFox.ExtraFireworks";

	public const string PluginAuthor = "PhysicsFox";

	public const string PluginName = "ExtraFireworks";

	public const string PluginVersion = "1.5.3";

	public static GameObject fireworkLauncherPrefab;

	public static GameObject fireworkPrefab;

	private static List<FireworkItem> items;

	public void Awake()
	{
		//IL_016e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0173: Unknown result type (might be due to invalid IL or missing references)
		//IL_0179: Expected O, but got Unknown
		Log.Init(((BaseUnityPlugin)this).Logger);
		fireworkLauncherPrefab = LegacyResourcesAPI.Load<GameObject>("Prefabs/FireworkLauncher");
		fireworkPrefab = fireworkLauncherPrefab.GetComponent<FireworkLauncher>().projectilePrefab;
		items = new List<FireworkItem>
		{
			new ItemFireworkAbility(this, ((BaseUnityPlugin)this).Config),
			new ItemFireworkDaisy(this, ((BaseUnityPlugin)this).Config),
			new ItemFireworkDrones(this, ((BaseUnityPlugin)this).Config),
			new ItemFireworkMushroom(this, ((BaseUnityPlugin)this).Config),
			new ItemFireworkOnHit(this, ((BaseUnityPlugin)this).Config),
			new ItemFireworkOnKill(this, ((BaseUnityPlugin)this).Config),
			new ItemFireworkFinale(this, ((BaseUnityPlugin)this).Config)
		};
		ItemFireworkVoid itemFireworkVoid = new ItemFireworkVoid(this, ((BaseUnityPlugin)this).Config);
		ItemFireworkVoidConsumed item = (itemFireworkVoid.ConsumedItem = new ItemFireworkVoidConsumed(this, ((BaseUnityPlugin)this).Config, itemFireworkVoid));
		items.Add(itemFireworkVoid);
		items.Add(item);
		using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ExtraFireworks.extrafireworks"))
		{
			AssetBundle bundle = AssetBundle.LoadFromStream(stream);
			foreach (FireworkItem item2 in items)
			{
				item2.Init(bundle);
			}
		}
		object obj = <>c.<>9__7_0;
		if (obj == null)
		{
			hook_RebuildModel val = delegate(orig_RebuildModel orig, PickupDisplay self, GameObject modelObjectOverride)
			{
				//IL_000b: 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_00a7: 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_00c4: Unknown result type (might be due to invalid IL or missing references)
				//IL_00df: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
				orig.Invoke(self, modelObjectOverride);
				_ = self.pickupIndex;
				if (((PickupIndex)(ref self.pickupIndex)).pickupDef == null || (Object.op_Implicit((Object)(object)self.modelObject) && ((Object)self.modelObject).name == "PickupMystery(Clone)") || (Object.op_Implicit((Object)(object)self.highlight) && ((Object)self.highlight).name == "CommandCube(Clone)"))
				{
					return;
				}
				foreach (FireworkItem item3 in items)
				{
					if (item3.IsEnabled() && ((PickupIndex)(ref self.pickupIndex)).pickupDef.itemTier == item3.Item.tier && ((PickupIndex)(ref self.pickupIndex)).pickupDef.itemIndex == item3.Item.itemIndex)
					{
						Transform transform = self.modelObject.transform;
						transform.localScale *= item3.GetModelScale();
						break;
					}
				}
			};
			<>c.<>9__7_0 = val;
			obj = (object)val;
		}
		PickupDisplay.RebuildModel += (hook_RebuildModel)obj;
		Log.LogInfo("Awake done.");
	}

	public void OnEnable()
	{
		foreach (FireworkItem item in items)
		{
			if (item.IsEnabled())
			{
				item.OnEnable();
			}
		}
	}

	public void OnDisable()
	{
		foreach (FireworkItem item in items)
		{
			if (item.IsEnabled())
			{
				item.OnDisable();
			}
		}
	}

	private void FixedUpdate()
	{
		foreach (FireworkItem item in items)
		{
			if (item.IsEnabled())
			{
				item.FixedUpdate();
			}
		}
	}

	public static FireworkLauncher FireFireworks(CharacterBody owner, int count)
	{
		FireworkLauncher val = SpawnFireworks(owner.coreTransform, owner, count);
		((Component)val).gameObject.transform.parent = owner.coreTransform;
		return val;
	}

	public static FireworkLauncher SpawnFireworks(Transform target, CharacterBody owner, int count, bool attach = true)
	{
		//IL_0074: 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_0067: Unknown result type (might be due to invalid IL or missing references)
		//IL_006c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0079: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a5: 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_008e: 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_009e: 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)
		ModelLocator component = ((Component)target).GetComponent<ModelLocator>();
		Transform val = null;
		if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component.modelTransform))
		{
			ChildLocator component2 = ((Component)component.modelTransform).GetComponent<ChildLocator>();
			if (Object.op_Implicit((Object)(object)component2))
			{
				val = component2.FindChild("FireworkOrigin");
			}
		}
		Vector3 val2 = (Object.op_Implicit((Object)(object)val) ? val.position : (target.position + Vector3.up * 2f));
		CharacterBody component3 = ((Component)target).GetComponent<CharacterBody>();
		if (Object.op_Implicit((Object)(object)component3))
		{
			val2 += Vector3.up * component3.radius;
		}
		FireworkLauncher val3 = CreateLauncher(owner, val2, count);
		if (attach)
		{
			((Component)val3).gameObject.transform.parent = target;
		}
		return val3;
	}

	public unsafe static FireworkLauncher CreateLauncher(CharacterBody owner, Vector3 position, int count)
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0048: 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_004d->IL004d: Incompatible stack types: O vs I4
		//IL_0047->IL004d: Incompatible stack types: I4 vs O
		//IL_0047->IL004d: Incompatible stack types: O vs I4
		FireworkLauncher component = Object.Instantiate<GameObject>(fireworkLauncherPrefab, position, Quaternion.identity).GetComponent<FireworkLauncher>();
		component.owner = ((owner != null) ? ((Component)owner).gameObject : null);
		if (Object.op_Implicit((Object)(object)owner))
		{
			TeamComponent teamComponent = owner.teamComponent;
			object obj = component;
			int num;
			if (Object.op_Implicit((Object)(object)teamComponent))
			{
				obj = teamComponent.teamIndex;
				num = (int)obj;
			}
			else
			{
				num = -1;
				obj = num;
				num = (int)obj;
			}
			Unsafe.Write(&((FireworkLauncher)num).team, (TeamIndex)obj);
			component.crit = Util.CheckRoll(owner.crit, owner.master);
		}
		component.remaining = count;
		return component;
	}
}
public abstract class FireworkItem
{
	protected ExtraFireworks plugin;

	protected ConfigFile config;

	protected ConfigEntry<bool> itemEnabled;

	public ItemDef Item { get; protected set; }

	public abstract string GetName();

	public abstract string GetPickupModelName();

	public abstract string GetPickupIconName();

	public abstract ItemTier GetTier();

	public abstract ItemTag[] GetTags();

	public abstract string GetItemName();

	public abstract string GetItemPickup();

	public abstract string GetItemDescription();

	public abstract string GetItemLore();

	public virtual void AddHooks()
	{
	}

	public virtual void OnEnable()
	{
	}

	public virtual void OnDisable()
	{
	}

	public virtual void FixedUpdate()
	{
	}

	public virtual ItemDisplayRuleDict GetDisplayRules()
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Expected O, but got Unknown
		return new ItemDisplayRuleDict((ItemDisplayRule[])null);
	}

	public string GetPickupModel()
	{
		return "Assets/ImportModels/" + GetPickupModelName();
	}

	public virtual float GetModelScale()
	{
		return 1f;
	}

	public string GetPickupIcon()
	{
		return "Assets/Import/" + GetPickupIconName();
	}

	public virtual string GetConfigSection()
	{
		return GetName();
	}

	public bool IsEnabled()
	{
		return itemEnabled == null || itemEnabled.Value;
	}

	protected FireworkItem(ExtraFireworks plugin, ConfigFile config)
	{
		this.plugin = plugin;
		this.config = config;
	}

	public virtual void Init(AssetBundle bundle)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Invalid comparison between Unknown and I4
		//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bf: Invalid comparison between Unknown and I4
		//IL_00ea: 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_0101: Unknown result type (might be due to invalid IL or missing references)
		//IL_0107: Unknown result type (might be due to invalid IL or missing references)
		//IL_010d: Invalid comparison between Unknown and I4
		//IL_0153: Unknown result type (might be due to invalid IL or missing references)
		//IL_0159: Invalid comparison between Unknown and I4
		//IL_0119: Unknown result type (might be due to invalid IL or missing references)
		//IL_0213: Unknown result type (might be due to invalid IL or missing references)
		//IL_0219: Invalid comparison between Unknown and I4
		//IL_0247: Unknown result type (might be due to invalid IL or missing references)
		//IL_0251: Expected O, but got Unknown
		if ((int)GetTier() != 5)
		{
			itemEnabled = config.Bind<bool>(GetConfigSection(), "Enabled", true, "Item enabled?");
		}
		Item = ScriptableObject.CreateInstance<ItemDef>();
		string text = GetName().ToUpper();
		((Object)Item).name = "ITEM_" + text + "_NAME";
		Item.nameToken = "ITEM_" + text + "_NAME";
		Item.pickupToken = "ITEM_" + text + "_PICKUP";
		Item.descriptionToken = "ITEM_" + text + "_DESC";
		if ((int)GetTier() != 5)
		{
			Item.loreToken = "ITEM_" + text + "_LORE";
		}
		Item.tier = GetTier();
		Item.deprecatedTier = GetTier();
		if ((int)GetTier() == 6)
		{
			Item.requiredExpansion = ((IEnumerable<ExpansionDef>)(object)ExpansionCatalog.expansionDefs).FirstOrDefault((Func<ExpansionDef, bool>)((ExpansionDef def) => def.nameToken == "DLC1_NAME"));
		}
		Item.canRemove = (int)GetTier() != 5;
		Item.hidden = false;
		Item.tags = GetTags();
		if ((Object)(object)bundle != (Object)null)
		{
			Item.pickupModelPrefab = bundle.LoadAsset<GameObject>(GetPickupModel());
			Item.pickupIconSprite = bundle.LoadAsset<Sprite>(GetPickupIcon());
		}
		if (IsEnabled())
		{
			LanguageAPI.Add(Item.nameToken, GetItemName());
			LanguageAPI.Add(Item.pickupToken, GetItemPickup());
			LanguageAPI.Add(Item.descriptionToken, GetItemDescription());
			if ((int)GetTier() != 5)
			{
				LanguageAPI.Add(Item.loreToken, GetItemLore());
			}
			ItemAPI.Add(new CustomItem(Item, GetDisplayRules()));
			AddHooks();
		}
	}
}
public class ItemFireworkAbility : FireworkItem
{
	private ConfigurableLinearScaling scaler;

	private ConfigEntry<bool> noSkillRestriction;

	public ItemFireworkAbility(ExtraFireworks plugin, ConfigFile config)
		: base(plugin, config)
	{
		scaler = new ConfigurableLinearScaling(config, "", GetConfigSection(), 1f, 1f);
		noSkillRestriction = config.Bind<bool>(GetConfigSection(), "PrimaryAbilityFireworks", false, "Whether abilities without a cooldown should spawn fireworks... be wary of brokenness, especially on Commando and Railgunner");
	}

	public override string GetName()
	{
		return "FireworkAbility";
	}

	public override string GetPickupModelName()
	{
		return "Firework-Stuffed Head.prefab";
	}

	public override float GetModelScale()
	{
		return 1.1f;
	}

	public override string GetPickupIconName()
	{
		return "FireworkStuffedHead.png";
	}

	public override ItemTier GetTier()
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		return (ItemTier)1;
	}

	public override ItemTag[] GetTags()
	{
		ItemTag[] array = new ItemTag[3];
		RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
		return (ItemTag[])(object)array;
	}

	public override string GetItemName()
	{
		return "Firework-Stuffed Head";
	}

	public override string GetItemPickup()
	{
		return "Using abilities now spawns fireworks";
	}

	public override string GetItemDescription()
	{
		return $"Using a <style=cIsUtility>non-primary skill</style> fires <style=cIsDamage>{scaler.Base}</style> " + $"<style=cStack>(+{scaler.Scaling} per stack)</style> <style=cIsDamage>firework</style> for " + "<style=cIsDamage>300%</style> base damage.";
	}

	public override string GetItemLore()
	{
		return "Holy shit it's a head with fireworks sticking out of it";
	}

	public override void AddHooks()
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Expected O, but got Unknown
		CharacterBody.OnSkillActivated += (hook_OnSkillActivated)delegate(orig_OnSkillActivated orig, CharacterBody self, GenericSkill skill)
		{
			if (Object.op_Implicit((Object)(object)self.inventory) && !((Object)(object)skill == (Object)null))
			{
				int itemCount = self.inventory.GetItemCount(base.Item);
				if (itemCount > 0 && (noSkillRestriction.Value || (skill.baseRechargeInterval >= 1f - Mathf.Epsilon && Object.op_Implicit((Object)(object)skill.skillDef) && skill.skillDef.stockToConsume > 0)))
				{
					ExtraFireworks.FireFireworks(self, scaler.GetValueInt(itemCount));
				}
			}
			orig.Invoke(self, skill);
		};
	}
}
public class ItemFireworkDaisy : FireworkItem
{
	private ConfigEntry<int> fireworksPerWave;

	private Dictionary<HoldoutZoneController, float> lastCharge;

	public ItemFireworkDaisy(ExtraFireworks plugin, ConfigFile config)
		: base(plugin, config)
	{
		fireworksPerWave = config.Bind<int>(GetConfigSection(), "FireworksPerWave", 40, "Number of fireworks per firework daisy wave");
		lastCharge = new Dictionary<HoldoutZoneController, float>();
	}

	public override string GetName()
	{
		return "FireworkDaisy";
	}

	public override string GetPickupModelName()
	{
		return "Firework Daisy.prefab";
	}

	public override float GetModelScale()
	{
		return 1.5f;
	}

	public override string GetPickupIconName()
	{
		return "FireworkDaisy.png";
	}

	public override ItemTier GetTier()
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		return (ItemTier)1;
	}

	public override ItemTag[] GetTags()
	{
		ItemTag[] array = new ItemTag[4];
		RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
		return (ItemTag[])(object)array;
	}

	public override string GetItemName()
	{
		return "Firework Daisy";
	}

	public override string GetItemPickup()
	{
		return "Periodically releases waves of fireworks during the teleporter event";
	}

	public override string GetItemDescription()
	{
		return "<style=cIsDamage>Releases a barrage of fireworks</style> during the <style=cIsUtility>Teleporter event</style>, dealing " + $"<style=cIsDamage>{fireworksPerWave.Value}x300%</style> base damage. " + "Occurs <style=cIsDamage>2</style> <style=cStack>(+1 per stack)</style> <style=cIsDamage>times</style>.";
	}

	public override string GetItemLore()
	{
		return "A lepton daisy with a firework jammed in it.";
	}

	public override void AddHooks()
	{
		//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
		HoldoutZoneController.OnDisable += (hook_OnDisable)delegate(orig_OnDisable orig, HoldoutZoneController self)
		{
			lastCharge.Remove(self);
			orig.Invoke(self);
		};
		HoldoutZoneController.Update += (hook_Update)delegate(orig_Update orig, HoldoutZoneController self)
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f1: Invalid comparison between Unknown and I4
			//IL_0042: 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_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: 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_00ee: Unknown result type (might be due to invalid IL or missing references)
			lastCharge[self] = self.charge;
			orig.Invoke(self);
			if (NetworkServer.active)
			{
				float num = lastCharge[self];
				TeamIndex val = (TeamIndex)0;
				while ((int)val < 5)
				{
					int itemCountForTeam = Util.GetItemCountForTeam(val, base.Item.itemIndex, false, true);
					if (itemCountForTeam > 0)
					{
						float nextFireworkCharge = GetNextFireworkCharge(num, itemCountForTeam);
						ReadOnlyCollection<TeamComponent> teamMembers = TeamComponent.GetTeamMembers(val);
						CharacterBody val2 = null;
						while ((Object)(object)val2 == (Object)null)
						{
							TeamComponent val3 = teamMembers[Random.Range(0, teamMembers.Count)];
							val2 = val3.body;
						}
						if (self.charge >= nextFireworkCharge && num < nextFireworkCharge)
						{
							ExtraFireworks.SpawnFireworks(self.healingNovaRoot ?? ((Component)self).transform, val2, fireworksPerWave.Value);
						}
					}
					val = (TeamIndex)(sbyte)(val + 1);
				}
			}
		};
	}

	private static float GetNextFireworkCharge(float charge, int stacks)
	{
		float num = 1f / (float)(1 + stacks);
		float num2 = charge / num;
		return Mathf.Ceil(num2) * num;
	}
}
public class ItemFireworkDrones : FireworkItem
{
	private ConfigEntry<float> fireworkInterval;

	private ConfigurableLinearScaling scaler;

	private Dictionary<CharacterBody, float> timers;

	public ItemFireworkDrones(ExtraFireworks plugin, ConfigFile config)
		: base(plugin, config)
	{
		fireworkInterval = config.Bind<float>(GetConfigSection(), "FireworksInterval", 4f, "Number of seconds between bursts of fireworks");
		scaler = new ConfigurableLinearScaling(config, "", GetConfigSection(), 4f, 2f);
		timers = new Dictionary<CharacterBody, float>();
	}

	public override string GetName()
	{
		return "FireworkDrones";
	}

	public override string GetPickupModelName()
	{
		return "Spare Fireworks.prefab";
	}

	public override float GetModelScale()
	{
		return 1f;
	}

	public override string GetPickupIconName()
	{
		return "SpareFireworks.png";
	}

	public override ItemTier GetTier()
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		return (ItemTier)2;
	}

	public override ItemTag[] GetTags()
	{
		ItemTag[] array = new ItemTag[3];
		RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
		return (ItemTag[])(object)array;
	}

	public override string GetItemName()
	{
		return "Spare Fireworks";
	}

	public override string GetItemPickup()
	{
		return "All drones now shoot fireworks";
	}

	public override string GetItemDescription()
	{
		return "<style=cIsUtility>Non-player allies</style> gain an <style=cIsDamage>automatic firework launcher</style> that propels " + $"<style=cIsDamage>{scaler.Base}</style> <style=cStack>(+{scaler.Scaling} per stack)</style> " + $"<style=cIsDamage>fireworks every {fireworkInterval.Value} seconds</style> " + "for <style=cIsDamage>300%</style> base damage each.";
	}

	public override string GetItemLore()
	{
		return "Ayo what we do with all these fireworks?! *END TRANSMISSION*";
	}

	public override void FixedUpdate()
	{
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e3: Invalid comparison between Unknown and I4
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		//IL_01dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_01de: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0091: Unknown result type (might be due to invalid IL or missing references)
		if (!NetworkServer.active)
		{
			return;
		}
		TeamIndex val = (TeamIndex)0;
		while ((int)val < 5)
		{
			int itemCountForTeam = Util.GetItemCountForTeam(val, base.Item.itemIndex, true, true);
			if (itemCountForTeam > 0)
			{
				ReadOnlyCollection<TeamComponent> teamMembers = TeamComponent.GetTeamMembers(val);
				foreach (TeamComponent item in teamMembers)
				{
					CharacterBody body = item.body;
					if (!Object.op_Implicit((Object)(object)body) || !Object.op_Implicit((Object)(object)body.master))
					{
						continue;
					}
					MinionGroup val2 = MinionGroup.FindGroup(((NetworkBehaviour)body.master).netId);
					if (val2 == null)
					{
						continue;
					}
					MinionOwnership[] members = val2.members;
					foreach (MinionOwnership val3 in members)
					{
						if (!Object.op_Implicit((Object)(object)val3))
						{
							continue;
						}
						CharacterMaster component = ((Component)val3).GetComponent<CharacterMaster>();
						if (!Object.op_Implicit((Object)(object)component) || !Object.op_Implicit((Object)(object)component.inventory))
						{
							continue;
						}
						CharacterBody body2 = component.GetBody();
						if (Object.op_Implicit((Object)(object)body2))
						{
							if (!timers.ContainsKey(body2))
							{
								timers[body2] = RandomStartDelta();
							}
							float num = timers[body2];
							num -= Time.fixedDeltaTime;
							if (num <= 0f)
							{
								ExtraFireworks.SpawnFireworks(body2.coreTransform, body, 2 + 2 * itemCountForTeam);
								num = fireworkInterval.Value;
							}
							timers[body2] = num;
						}
					}
				}
			}
			val = (TeamIndex)(sbyte)(val + 1);
		}
	}

	private float RandomStartDelta()
	{
		return Random.value * fireworkInterval.Value;
	}
}
public class ItemFireworkFinale : FireworkItem
{
	private ConfigEntry<float> fireworkDamage;

	private ConfigEntry<float> fireworkExplosionSize;

	private ConfigEntry<int> fireworkEnemyKillcount;

	private BuffDef buff;

	private GameObject projectilePrefab;

	private GameObject grandFinaleModel;

	private Dictionary<CharacterBody, int> killCountdowns;

	public ItemFireworkFinale(ExtraFireworks plugin, ConfigFile config)
		: base(plugin, config)
	{
		fireworkDamage = config.Bind<float>(GetConfigSection(), "DamageCoefficient", 50f, "Damage of Grand Finale firework as coefficient of base damage");
		fireworkExplosionSize = config.Bind<float>(GetConfigSection(), "ExplosionRadius", 10f, "Explosion radius of Grand Finale firework");
		fireworkEnemyKillcount = config.Bind<int>(GetConfigSection(), "KillThreshold", 10, "Number of enemies required to proc the Grand Finale firework");
		killCountdowns = new Dictionary<CharacterBody, int>();
	}

	public override string GetName()
	{
		return "FireworkGrandFinale";
	}

	public override string GetPickupModelName()
	{
		return "GrandFinale.prefab";
	}

	public override float GetModelScale()
	{
		return 3f;
	}

	public override string GetPickupIconName()
	{
		return "GrandFinale.png";
	}

	public override ItemTier GetTier()
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		return (ItemTier)2;
	}

	public override ItemTag[] GetTags()
	{
		ItemTag[] array = new ItemTag[4];
		RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
		return (ItemTag[])(object)array;
	}

	public override string GetItemName()
	{
		return "Grand Finale";
	}

	public override string GetItemPickup()
	{
		return $"Launch a grand finale firework after killing {fireworkEnemyKillcount.Value} enemies.";
	}

	public override string GetItemDescription()
	{
		return $"<style=cIsDamage>Killing {fireworkEnemyKillcount.Value}</style> " + "<style=cStack>(-50% per stack)</style> <style=cIsDamage>enemies</style> fires out a <style=cIsDamage>massive firework</style> that deals <style=cIsDamage>5000%</style> base damage.";
	}

	public override string GetItemLore()
	{
		return "Ayo what we do this one big ass firework?! *END TRANSMISSION*";
	}

	public override void Init(AssetBundle bundle)
	{
		//IL_0060: 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_0118: Unknown result type (might be due to invalid IL or missing references)
		//IL_0184: Unknown result type (might be due to invalid IL or missing references)
		//IL_018e: Unknown result type (might be due to invalid IL or missing references)
		base.Init(bundle);
		grandFinaleModel = bundle.LoadAsset<GameObject>("Assets/ImportModels/GrandFinaleProjectile.prefab");
		buff = ScriptableObject.CreateInstance<BuffDef>();
		((Object)buff).name = "GrandFinaleCountdown";
		buff.canStack = true;
		buff.isCooldown = false;
		buff.isDebuff = false;
		buff.buffColor = Color.red;
		buff.iconSprite = bundle.LoadAsset<Sprite>("Assets/Import/GrandFinaleBuff.png");
		ContentAddition.AddBuffDef(buff);
		projectilePrefab = PrefabAPI.InstantiateClone(ExtraFireworks.fireworkPrefab, "GrandFinaleProjectile");
		projectilePrefab.layer = LayerMask.NameToLayer("Projectile");
		ProjectileImpactExplosion component = projectilePrefab.GetComponent<ProjectileImpactExplosion>();
		component.lifetime = 99f;
		component.explodeOnLifeTimeExpiration = true;
		((ProjectileExplosion)component).blastDamageCoefficient = 1f;
		((ProjectileExplosion)component).blastProcCoefficient = 1f;
		float blastRadius = ((ProjectileExplosion)component).blastRadius;
		((ProjectileExplosion)component).blastRadius = fireworkExplosionSize.Value;
		((ProjectileExplosion)component).dotDamageMultiplier = 1f;
		((ProjectileExplosion)component).canRejectForce = true;
		((ProjectileExplosion)component).falloffModel = (FalloffModel)0;
		MissileController component2 = projectilePrefab.GetComponent<MissileController>();
		component2.maxVelocity = 7.5f;
		component2.maxSeekDistance = 150f;
		component2.acceleration = 2f;
		component2.rollVelocity = 3f;
		component2.giveupTimer = 99f;
		component2.deathTimer = 99f;
		component2.turbulence = 0.5f;
		BoxCollider component3 = projectilePrefab.GetComponent<BoxCollider>();
		component3.size *= 5f;
	}

	private void RefreshBuffCount(CharacterBody body)
	{
		//IL_0026: Unknown result type (might be due to invalid IL or missing references)
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		int itemCount = body.inventory.GetItemCount(base.Item);
		if (itemCount <= 0)
		{
			body.SetBuffCount(buff.buffIndex, 0);
		}
		else if (killCountdowns.ContainsKey(body))
		{
			body.SetBuffCount(buff.buffIndex, killCountdowns[body]);
		}
	}

	public void FixCounts()
	{
		ReadOnlyCollection<PlayerCharacterMasterController> instances = PlayerCharacterMasterController.instances;
		if (instances == null)
		{
			return;
		}
		foreach (PlayerCharacterMasterController item in instances)
		{
			CharacterBody body = item.master.GetBody();
			if (!((Object)(object)body == (Object)null))
			{
				RefreshBuffCount(body);
			}
		}
	}

	public override void FixedUpdate()
	{
		FixCounts();
	}

	protected void ResetKillcount(CharacterBody body, int itemCount)
	{
		killCountdowns[body] = Mathf.CeilToInt((float)fireworkEnemyKillcount.Value * 1f / Mathf.Pow(2f, (float)(itemCount - 1)));
	}

	private void RefreshModel(ProjectileGhostController self)
	{
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0074: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
		//IL_0143: 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)
		if (Object.op_Implicit((Object)(object)self.authorityTransform) && ((Object)((Component)self.authorityTransform).gameObject).name.StartsWith("GrandFinaleProjectile"))
		{
			self.transform.GetChild(1).localPosition = new Vector3(0f, 0f, -1.75f);
			self.transform.GetChild(2).localPosition = new Vector3(0f, 0f, -1.75f);
			Transform child = self.transform.GetChild(0);
			if (child.childCount == 0)
			{
				GameObject val = PrefabAPI.InstantiateClone(grandFinaleModel, "GrandFinaleModel");
				val.transform.parent = ((Component)child).transform;
				val.transform.localPosition = Vector3.zero;
			}
			else
			{
				((Renderer)((Component)child.GetChild(0)).GetComponentInChildren<MeshRenderer>()).enabled = true;
			}
			((Renderer)((Component)child).GetComponent<MeshRenderer>()).enabled = false;
		}
		if (Object.op_Implicit((Object)(object)self.authorityTransform) && ((Object)((Component)self.authorityTransform).gameObject).name.StartsWith("FireworkProjectile"))
		{
			self.transform.GetChild(1).localPosition = new Vector3(0f, 0f, -0.729f);
			self.transform.GetChild(2).localPosition = new Vector3(0f, 0f, -0.764f);
			Transform child2 = self.transform.GetChild(0);
			if (child2.childCount > 0)
			{
				((Renderer)((Component)child2.GetChild(0)).GetComponentInChildren<MeshRenderer>()).enabled = false;
				((Renderer)((Component)child2).GetComponent<MeshRenderer>()).enabled = true;
			}
		}
	}

	public override void AddHooks()
	{
		//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
		//IL_003e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0048: Expected O, but got Unknown
		GlobalEventManager.onCharacterDeathGlobal += delegate(DamageReport report)
		{
			//IL_00b9: 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_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)report.attacker) && Object.op_Implicit((Object)(object)report.attackerBody))
			{
				CharacterBody attackerBody = report.attackerBody;
				if (Object.op_Implicit((Object)(object)attackerBody.inventory))
				{
					int itemCount3 = attackerBody.inventory.GetItemCount(base.Item);
					if (itemCount3 > 0)
					{
						if (!killCountdowns.ContainsKey(attackerBody))
						{
							ResetKillcount(attackerBody, itemCount3);
						}
						int num = killCountdowns[attackerBody] - 1;
						if (num > 0)
						{
							killCountdowns[attackerBody] = num;
						}
						else
						{
							ProjectileManager.instance.FireProjectile(projectilePrefab, attackerBody.corePosition + Vector3.up * attackerBody.radius, Quaternion.LookRotation(Vector3.up), ((Component)attackerBody).gameObject, fireworkDamage.Value * attackerBody.baseDamage, 50f, attackerBody.RollCrit(), (DamageColorIndex)0, (GameObject)null, -1f);
							ResetKillcount(attackerBody, itemCount3);
						}
					}
				}
			}
		};
		ProjectileGhostController.FixedUpdate += (hook_FixedUpdate)delegate(orig_FixedUpdate orig, ProjectileGhostController self)
		{
			orig.Invoke(self);
			RefreshModel(self);
		};
		CharacterMaster.OnServerStageBegin += (hook_OnServerStageBegin)delegate(orig_OnServerStageBegin orig, CharacterMaster self, Stage stage)
		{
			orig.Invoke(self, stage);
			if (Object.op_Implicit((Object)(object)self.playerCharacterMasterController))
			{
				CharacterBody body = self.playerCharacterMasterController.body;
				if (Object.op_Implicit((Object)(object)body) && Object.op_Implicit((Object)(object)self.inventory))
				{
					int itemCount2 = self.inventory.GetItemCount(base.Item);
					if (killCountdowns.ContainsKey(body))
					{
						if (killCountdowns.ContainsKey(body) && itemCount2 <= 0)
						{
							killCountdowns.Remove(body);
						}
						else
						{
							ResetKillcount(body, itemCount2);
						}
					}
				}
			}
		};
		CharacterBody.OnInventoryChanged += (hook_OnInventoryChanged)delegate(orig_OnInventoryChanged orig, CharacterBody self)
		{
			orig.Invoke(self);
			if (Object.op_Implicit((Object)(object)self.inventory))
			{
				int itemCount = self.inventory.GetItemCount(base.Item);
				if (itemCount <= 0 && killCountdowns.ContainsKey(self))
				{
					killCountdowns.Remove(self);
				}
				else if (itemCount > 0 && !killCountdowns.ContainsKey(self))
				{
					ResetKillcount(self, itemCount);
				}
			}
		};
	}
}
public class ItemFireworkMushroom : FireworkItem
{
	private ConfigurableHyperbolicScaling scaler;

	private Dictionary<CharacterBody, GameObject> mushroomFireworkGameObject;

	private Dictionary<CharacterBody, float> fungusTimers;

	private GameObject mushroomFireworkPrefab;

	public ItemFireworkMushroom(ExtraFireworks plugin, ConfigFile config)
		: base(plugin, config)
	{
		scaler = new ConfigurableHyperbolicScaling(config, "", GetConfigSection(), 1f, 0.1f);
		mushroomFireworkGameObject = new Dictionary<CharacterBody, GameObject>();
		fungusTimers = new Dictionary<CharacterBody, float>();
		mushroomFireworkPrefab = LegacyResourcesAPI.Load<GameObject>("Prefabs/NetworkedObjects/MushroomWard");
	}

	public override string GetName()
	{
		return "FireworkMushroom";
	}

	public override string GetPickupModelName()
	{
		return "Fungus.prefab";
	}

	public override float GetModelScale()
	{
		return 0.75f;
	}

	public override string GetPickupIconName()
	{
		return "Fungus.png";
	}

	public override ItemTier GetTier()
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		return (ItemTier)0;
	}

	public override ItemTag[] GetTags()
	{
		ItemTag[] array = new ItemTag[3];
		RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
		return (ItemTag[])(object)array;
	}

	public override string GetItemName()
	{
		return "Fungus";
	}

	public override string GetItemPickup()
	{
		return "Become a firework launcher when you stand still.";
	}

	public override string GetItemDescription()
	{
		return "After <style=cIsUtility>standing still</style> for <style=cIsUtility>1 second</style>, shoot fireworks " + $"at <style=cIsDamage>{scaler.GetValue(1) * 100f:0}%</style> " + $"<style=cStack>(+{(scaler.GetValue(2) - scaler.GetValue(1)) * 100f:0} per stack)</style> speed " + "<style=cStack>(hyperbolic up to 100%)</style> that deal <style=cIsDamage>300%</style> base damage.";
	}

	public override string GetItemLore()
	{
		return "A fun arts and crafts project.";
	}

	public override void AddHooks()
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Expected O, but got Unknown
		CharacterBody.OnSkillActivated += (hook_OnSkillActivated)delegate(orig_OnSkillActivated orig, CharacterBody self, GenericSkill skill)
		{
			if (Object.op_Implicit((Object)(object)self.inventory) && !((Object)(object)skill == (Object)null))
			{
				int itemCount = self.inventory.GetItemCount(base.Item);
				if (itemCount > 0 && (Object)(object)skill != (Object)(object)self.skillLocator?.primary)
				{
					ExtraFireworks.FireFireworks(self, scaler.GetValueInt(itemCount));
				}
			}
			orig.Invoke(self, skill);
		};
	}

	public override void FixedUpdate()
	{
		//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)
		if (!NetworkServer.active)
		{
			return;
		}
		ReadOnlyCollection<TeamComponent> teamMembers = TeamComponent.GetTeamMembers((TeamIndex)1);
		foreach (TeamComponent item in teamMembers)
		{
			if (!Object.op_Implicit((Object)(object)item.body))
			{
				continue;
			}
			CharacterBody body = item.body;
			if (!Object.op_Implicit((Object)(object)body.inventory))
			{
				continue;
			}
			int itemCount = body.inventory.GetItemCount(base.Item);
			bool flag = itemCount > 0 && body.GetNotMoving();
			if (mushroomFireworkGameObject.ContainsKey(body) != flag)
			{
				if (flag)
				{
					GameObject val = Object.Instantiate<GameObject>(mushroomFireworkPrefab, body.footPosition, Quaternion.identity);
					HealingWard component = val.GetComponent<HealingWard>();
					NetworkServer.Spawn(val);
					if (Object.op_Implicit((Object)(object)component))
					{
						component.healFraction = 0f;
						component.healPoints = 0f;
						component.Networkradius = (body.radius + 3f) / 3f;
					}
					Transform transform = val.transform;
					GameObject gameObject = ((Component)body).gameObject;
					transform.parent = ((gameObject != null) ? gameObject.transform : null);
					mushroomFireworkGameObject[body] = val;
				}
				else
				{
					GameObject val2 = mushroomFireworkGameObject[body];
					Object.Destroy((Object)(object)val2);
					mushroomFireworkGameObject.Remove(body);
				}
			}
			if (fungusTimers.ContainsKey(body))
			{
				fungusTimers[body] -= Time.fixedDeltaTime;
			}
			if (flag && (!fungusTimers.ContainsKey(body) || fungusTimers[body] <= 0f))
			{
				FireworkLauncher val3 = ExtraFireworks.FireFireworks(body, 1);
				val3.launchInterval /= 1f - 1f / (1f + 0.05f * (float)itemCount);
				fungusTimers[body] = val3.launchInterval;
			}
		}
	}
}
public class ItemFireworkOnHit : FireworkItem
{
	private ConfigurableLinearScaling scaler;

	private ConfigEntry<int> numFireworks;

	private static readonly float MAX_FIREWORK_HEIGHT = 50f;

	public ItemFireworkOnHit(ExtraFireworks plugin, ConfigFile config)
		: base(plugin, config)
	{
		numFireworks = config.Bind<int>(GetConfigSection(), "FireworksPerHit", 1, "Number of fireworks per hit");
		scaler = new ConfigurableLinearScaling(config, "", GetConfigSection(), 10f, 10f);
	}

	public override string GetName()
	{
		return "FireworkOnHit";
	}

	public override string GetPickupModelName()
	{
		return "Firework Dagger.prefab";
	}

	public override float GetModelScale()
	{
		return 0.15f;
	}

	public override string GetPickupIconName()
	{
		return "FireworkDagger.png";
	}

	public override ItemTier GetTier()
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		return (ItemTier)0;
	}

	public override ItemTag[] GetTags()
	{
		ItemTag[] array = new ItemTag[3];
		RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
		return (ItemTag[])(object)array;
	}

	public override string GetItemName()
	{
		return "Firework Dagger";
	}

	public override string GetItemPickup()
	{
		return "Chance to fire fireworks on hit";
	}

	public override string GetItemDescription()
	{
		string text = $"Gain a <style=cIsDamage>{scaler.Base:0}%</style> chance " + $"<style=cStack>(+{scaler.Scaling:0}% per stack)</style> <style=cIsDamage>on hit</style> to ";
		if (numFireworks.Value == 1)
		{
			return text + "<style=cIsDamage>fire a firework</style> for <style=cIsDamage>300%</style> base damage.";
		}
		return text + $"<style=cIsDamage>fire {numFireworks.Value} fireworks</style> for <style=cIsDamage>300%</style> " + "base damage each.";
	}

	public override string GetItemLore()
	{
		return "You got stabbed by a firework and is kill.";
	}

	public override void AddHooks()
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Expected O, but got Unknown
		GlobalEventManager.OnHitEnemy += (hook_OnHitEnemy)delegate(orig_OnHitEnemy orig, GlobalEventManager self, DamageInfo damageInfo, GameObject victim)
		{
			//IL_00c9: 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_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_011d: 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_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			//IL_0146: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_017f: Unknown result type (might be due to invalid IL or missing references)
			//IL_025e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0260: Unknown result type (might be due to invalid IL or missing references)
			//IL_026a: Unknown result type (might be due to invalid IL or missing references)
			//IL_026f: Unknown result type (might be due to invalid IL or missing references)
			//IL_020d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0214: Unknown result type (might be due to invalid IL or missing references)
			//IL_0219: Unknown result type (might be due to invalid IL or missing references)
			//IL_021e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0223: Unknown result type (might be due to invalid IL or missing references)
			//IL_0228: Unknown result type (might be due to invalid IL or missing references)
			//IL_022a: Unknown result type (might be due to invalid IL or missing references)
			//IL_023c: Unknown result type (might be due to invalid IL or missing references)
			//IL_023e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0240: Unknown result type (might be due to invalid IL or missing references)
			if (damageInfo.procCoefficient != 0f && !damageInfo.rejected && NetworkServer.active && !((ProcChainMask)(ref damageInfo.procChainMask)).HasProc((ProcType)20) && (!Object.op_Implicit((Object)(object)damageInfo.inflictor) || !Object.op_Implicit((Object)(object)damageInfo.inflictor.GetComponent<MissileController>())) && Object.op_Implicit((Object)(object)damageInfo.attacker))
			{
				CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>();
				if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component.inventory))
				{
					int itemCount = component.inventory.GetItemCount(base.Item.itemIndex);
					if (itemCount > 0 && Util.CheckRoll(scaler.GetValue(itemCount) * damageInfo.procCoefficient, component.master))
					{
						CharacterBody component2 = victim.GetComponent<CharacterBody>();
						Vector3 val = damageInfo.position;
						if (Object.op_Implicit((Object)(object)component2) && Vector3.Distance(val, Vector3.zero) < Mathf.Epsilon)
						{
							val = component2.mainHurtBox.randomVolumePoint;
						}
						Vector3 val2 = val;
						float y = val.y;
						RaycastHit[] array = Physics.RaycastAll(val, Vector3.up, MAX_FIREWORK_HEIGHT);
						RaycastHit[] array2 = array;
						for (int i = 0; i < array2.Length; i++)
						{
							RaycastHit val3 = array2[i];
							CharacterModel componentInParent = ((Component)((RaycastHit)(ref val3)).transform).GetComponentInParent<CharacterModel>();
							if (Object.op_Implicit((Object)(object)componentInParent))
							{
								CharacterBody body = componentInParent.body;
								if (Object.op_Implicit((Object)(object)body) && !((Object)(object)body != (Object)(object)component2))
								{
									HurtBox componentInChildren = ((Component)((RaycastHit)(ref val3)).transform).GetComponentInChildren<HurtBox>();
									if (Object.op_Implicit((Object)(object)componentInChildren))
									{
										Collider collider = componentInChildren.collider;
										if (Object.op_Implicit((Object)(object)collider))
										{
											Vector3 val4 = collider.ClosestPoint(val + MAX_FIREWORK_HEIGHT * Vector3.up);
											if (val4.y > y)
											{
												val2 = val4;
												y = val4.y;
											}
										}
									}
								}
							}
						}
						ExtraFireworks.CreateLauncher(component, val2 + Vector3.up * 2f, numFireworks.Value);
						((ProcChainMask)(ref damageInfo.procChainMask)).AddProc((ProcType)20);
					}
				}
			}
			orig.Invoke(self, damageInfo, victim);
		};
	}
}
public class ItemFireworkOnKill : FireworkItem
{
	private ConfigurableLinearScaling scaler;

	public ItemFireworkOnKill(ExtraFireworks plugin, ConfigFile config)
		: base(plugin, config)
	{
		scaler = new ConfigurableLinearScaling(config, "", GetConfigSection(), 2f, 1f);
	}

	public override string GetName()
	{
		return "FireworkOnKill";
	}

	public override string GetPickupModelName()
	{
		return "Will-o-the-Firework.prefab";
	}

	public override float GetModelScale()
	{
		return 1.1f;
	}

	public override string GetPickupIconName()
	{
		return "BottledFireworks.png";
	}

	public override ItemTier GetTier()
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		return (ItemTier)1;
	}

	public override ItemTag[] GetTags()
	{
		ItemTag[] array = new ItemTag[4];
		RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
		return (ItemTag[])(object)array;
	}

	public override string GetItemName()
	{
		return "Will-o'-the-Firework";
	}

	public override string GetItemPickup()
	{
		return "Spawn fireworks on kill";
	}

	public override string GetItemDescription()
	{
		return "On <style=cIsDamage>killing an enemy</style>, release a " + $"<style=cIsDamage>barrage of {scaler.Base}</style> " + $"<style=cStack>(+{scaler.Scaling} per stack)</style> <style=cIsDamage>fireworks</style> for " + "<style=cIsDamage>300%</style> base damage each.";
	}

	public override string GetItemLore()
	{
		return "Revolutionary design.";
	}

	public override void AddHooks()
	{
		GlobalEventManager.onCharacterDeathGlobal += delegate(DamageReport report)
		{
			if (Object.op_Implicit((Object)(object)report.attacker) && Object.op_Implicit((Object)(object)report.attackerBody))
			{
				CharacterBody attackerBody = report.attackerBody;
				if (Object.op_Implicit((Object)(object)attackerBody.inventory))
				{
					int itemCount = attackerBody.inventory.GetItemCount(base.Item);
					if (itemCount > 0 && Object.op_Implicit((Object)(object)report.victim))
					{
						CharacterBody body = report.victim.body;
						if (Object.op_Implicit((Object)(object)body))
						{
							Transform target = (Object.op_Implicit((Object)(object)body.coreTransform) ? body.coreTransform : body.transform);
							ExtraFireworks.SpawnFireworks(target, attackerBody, scaler.GetValueInt(itemCount), attach: false);
						}
					}
				}
			}
		};
	}
}
public class ItemFireworkVoid : FireworkItem
{
	public ConfigEntry<int> fireworksPerStack;

	public ConfigEntry<float> hpThreshold;

	public ItemFireworkVoidConsumed ConsumedItem;

	private bool voidInitialized = false;

	public ItemFireworkVoid(ExtraFireworks plugin, ConfigFile config)
		: base(plugin, config)
	{
		fireworksPerStack = config.Bind<int>(GetConfigSection(), "FireworksPerUse", 20, "Number of fireworks per consumption");
		hpThreshold = config.Bind<float>(GetConfigSection(), "HpThreshold", 0.25f, "HP threshold before Power Works is consumed");
	}

	public override string GetName()
	{
		return "PowerWorks";
	}

	public override string GetPickupModelName()
	{
		return "Power Works.prefab";
	}

	public override float GetModelScale()
	{
		return 0.4f;
	}

	public override string GetPickupIconName()
	{
		return "PowerWorks.png";
	}

	public override ItemTier GetTier()
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		return (ItemTier)6;
	}

	public override ItemTag[] GetTags()
	{
		ItemTag[] array = new ItemTag[3];
		RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
		return (ItemTag[])(object)array;
	}

	public override string GetItemName()
	{
		return "Power 'Works";
	}

	public override string GetItemPickup()
	{
		return "Release a barrage of fireworks at low health. Refreshes every stage. Corrupts all Power Elixirs.";
	}

	public override string GetItemDescription()
	{
		return $"Taking damage to below <style=cIsHealth>{hpThreshold.Value * 100f:0}% health</style> " + "<style=cIsUtility>consumes</style> this item, releasing a <style=cIsDamage>barrage of fireworks</style> dealing " + $"<style=cIsDamage>{fireworksPerStack.Value}x300%</style> " + $"<style=cStack>(+{fireworksPerStack.Value} per stack)</style> base damage. " + "<style=cIsUtility>(Refreshes next stage)</style>. <style=cIsVoid>Corrupts all Power Elixirs</style>.";
	}

	public override string GetItemLore()
	{
		return "MMMM YUM.";
	}

	public override void AddHooks()
	{
		//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
		HealthComponent.TakeDamage += (hook_TakeDamage)delegate(orig_TakeDamage orig, HealthComponent self, DamageInfo info)
		{
			//IL_0076: 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_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_0100: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self, info);
			CharacterBody body = self.body;
			if (Object.op_Implicit((Object)(object)body) && Object.op_Implicit((Object)(object)body.inventory) && Object.op_Implicit((Object)(object)body.master) && NetworkServer.active && self.health / self.fullHealth <= hpThreshold.Value)
			{
				int itemCount2 = body.inventory.GetItemCount(base.Item.itemIndex);
				if (itemCount2 > 0)
				{
					body.inventory.RemoveItem(base.Item, itemCount2);
					body.inventory.GiveItem(ConsumedItem.Item, itemCount2);
					CharacterMasterNotificationQueue.SendTransformNotification(body.master, base.Item.itemIndex, ConsumedItem.Item.itemIndex, (TransformationType)0);
					ExtraFireworks.FireFireworks(body, fireworksPerStack.Value * itemCount2);
					body.SetBuffCount(Buffs.BearVoidCooldown.buffIndex, 0);
					body.SetBuffCount(Buffs.BearVoidReady.buffIndex, 1);
				}
			}
		};
		ItemCatalog.SetItemDefs += (hook_SetItemDefs)delegate(orig_SetItemDefs orig, ItemDef[] newItemDefs)
		{
			orig.Invoke(newItemDefs);
			if (!voidInitialized)
			{
				VoidTransformation.CreateTransformation(base.Item, Items.HealingPotion);
				voidInitialized = true;
			}
		};
		CharacterMaster.OnServerStageBegin += (hook_OnServerStageBegin)delegate(orig_OnServerStageBegin orig, CharacterMaster self, Stage stage)
		{
			//IL_0075: 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)
			orig.Invoke(self, stage);
			int itemCount = self.inventory.GetItemCount(ConsumedItem.Item);
			if (Object.op_Implicit((Object)(object)self.inventory) && itemCount > 0)
			{
				self.inventory.RemoveItem(ConsumedItem.Item, itemCount);
				self.inventory.GiveItem(base.Item, itemCount);
				CharacterMasterNotificationQueue.SendTransformNotification(self, ConsumedItem.Item.itemIndex, base.Item.itemIndex, (TransformationType)0);
			}
		};
	}
}
public class ItemFireworkVoidConsumed : FireworkItem
{
	private ItemFireworkVoid parent;

	private bool voidInitialized = false;

	public ItemFireworkVoidConsumed(ExtraFireworks plugin, ConfigFile config, ItemFireworkVoid parent)
		: base(plugin, config)
	{
		this.parent = parent;
	}

	public override string GetName()
	{
		return "PowerWorksConsumed";
	}

	public override string GetPickupModelName()
	{
		return "Power Works.prefab";
	}

	public override float GetModelScale()
	{
		return 0.4f;
	}

	public override string GetPickupIconName()
	{
		return "PowerWorksConsumed.png";
	}

	public override ItemTier GetTier()
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		return (ItemTier)5;
	}

	public override ItemTag[] GetTags()
	{
		ItemTag[] array = new ItemTag[6];
		RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/);
		return (ItemTag[])(object)array;
	}

	public override string GetItemName()
	{
		return "Power 'Works (Consumed)";
	}

	public override string GetItemPickup()
	{
		return parent.GetItemPickup();
	}

	public override string GetItemDescription()
	{
		return parent.GetItemDescription();
	}

	public override string GetItemLore()
	{
		return parent.GetItemLore();
	}

	public override void AddHooks()
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Expected O, but got Unknown
		ItemCatalog.SetItemDefs += (hook_SetItemDefs)delegate(orig_SetItemDefs orig, ItemDef[] newItemDefs)
		{
			orig.Invoke(newItemDefs);
			if (!voidInitialized)
			{
				VoidTransformation.CreateTransformation(base.Item, Items.HealingPotionConsumed);
				voidInitialized = true;
			}
		};
	}
}
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);
	}
}