Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of ExtraFireworks v1.5.3
ExtraFireworks.dll
Decompiled 2 years agousing 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); } }