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 NoProcChainsArtifact v1.2.1
plugins/NoProcChainsArtifact.dll
Decompiled a year agousing System; using System.Collections.Generic; 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.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using ExamplePlugin; using Microsoft.CodeAnalysis; using On.RoR2; using R2API; using RiskOfOptions; using RiskOfOptions.Options; using RoR2; using SS2; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("NoProcChainsArtifact")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+768c7a279f3307af6c0ae3556b18bed28f10ec8b")] [assembly: AssemblyProduct("NoProcChainsArtifact")] [assembly: AssemblyTitle("NoProcChainsArtifact")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace NoProcChainsArtifact { public static class Assets { public static AssetBundle AssetBundle; public const string BundleName = "unchainedartifacticons"; public static string AssetBundlePath => Path.Combine(Path.GetDirectoryName(NoProcChainsArtifact.PluginInfo.Location), "unchainedartifacticons"); public static void Init() { AssetBundle = AssetBundle.LoadFromFile(AssetBundlePath); } } internal static class Log { private static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void Debug(object data) { _logSource.LogDebug(data); } internal static void Error(object data) { _logSource.LogError(data); } internal static void Fatal(object data) { _logSource.LogFatal(data); } internal static void Info(object data) { _logSource.LogInfo(data); } internal static void Message(object data) { _logSource.LogMessage(data); } internal static void Warning(object data) { _logSource.LogWarning(data); } } internal static class ModSupport { public static class RiskOfOptions { private static bool? _modexists; public static bool ModIsRunning { get { if (!_modexists.HasValue) { _modexists = Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions"); } return _modexists.Value; } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void AddOptions() { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Expected O, but got Unknown //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Expected O, but got Unknown //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Expected O, but got Unknown //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Expected O, but got Unknown //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Expected O, but got Unknown //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Expected O, but got Unknown //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Expected O, but got Unknown //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Expected O, but got Unknown ModSettingsManager.SetModIcon(Assets.AssetBundle.LoadAsset<Sprite>("RoOIcon.png")); ModSettingsManager.SetModDescription("Adds an artifact that prevents your items from proccing your on-hit items for you."); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(ArtifactOfTheUnchained.AllowEquipmentProcs)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(ArtifactOfTheUnchained.AllowSawmerangProcs)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(ArtifactOfTheUnchained.AllowElectricBoomerangProcs)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(ArtifactOfTheUnchained.AllowGenericMissileProcs)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(ArtifactOfTheUnchained.AllowFireworkProcs)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(ArtifactOfTheUnchained.AllowShurikenProcs)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(ArtifactOfTheUnchained.AllowEgoProcs)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(ArtifactOfTheUnchained.AllowGloopProcs)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(ArtifactOfTheUnchained.AllowAspectProcs)); ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(ArtifactOfTheUnchained.AllowProcCrits)); } } internal static class Starstorm2 { private static bool? _modexists; public static bool ModIsRunning { get { if (!_modexists.HasValue) { _modexists = Chainloader.PluginInfos.ContainsKey("com.TeamMoonstorm"); } return _modexists.Value; } } internal static ItemDef ChirrFlowerItemDef { get { if (ModIsRunning) { return Items.FlowerTurret; } return null; } } } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("LordVGames.NoProcChainsArtifact", "NoProcChainsArtifact", "1.2.1")] public class NoProcChainsArtifact : BaseUnityPlugin { public const string PluginGUID = "LordVGames.NoProcChainsArtifact"; public const string PluginAuthor = "LordVGames"; public const string PluginName = "NoProcChainsArtifact"; public const string PluginVersion = "1.2.1"; public List<ArtifactBase> Artifacts = new List<ArtifactBase>(); public static PluginInfo PluginInfo { get; private set; } public void Awake() { PluginInfo = ((BaseUnityPlugin)this).Info; Log.Init(((BaseUnityPlugin)this).Logger); Assets.Init(); foreach (Type item in from type in Assembly.GetExecutingAssembly().GetTypes() where !type.IsAbstract && type.IsSubclassOf(typeof(ArtifactBase)) select type) { ((ArtifactBase)Activator.CreateInstance(item)).Init(((BaseUnityPlugin)this).Config); } } } public class ArtifactOfTheUnchained : ArtifactBase { public static ConfigEntry<bool> AllowEquipmentProcs; public static ConfigEntry<bool> AllowSawmerangProcs; public static ConfigEntry<bool> AllowElectricBoomerangProcs; public static ConfigEntry<bool> AllowGenericMissileProcs; public static ConfigEntry<bool> AllowFireworkProcs; public static ConfigEntry<bool> AllowShurikenProcs; public static ConfigEntry<bool> AllowEgoProcs; public static ConfigEntry<bool> AllowGloopProcs; public static ConfigEntry<bool> AllowAspectProcs; public static ConfigEntry<bool> AllowProcCrits; public override string ArtifactLangTokenName => "NO_PROC_CHAINS"; public override string ArtifactName => "Artifact of the Unchained"; public override string ArtifactDescription => "All item effects cannot proc your on-hit item effects for you."; public override Sprite ArtifactEnabledIcon => Assets.AssetBundle.LoadAsset<Sprite>("NoProcChainsArtifactIcon_Enabled.png"); public override Sprite ArtifactDisabledIcon => Assets.AssetBundle.LoadAsset<Sprite>("NoProcChainsArtifactIcon_Disabled.png"); public override void Init(ConfigFile config) { CreateLang(); CreateConfig(config); CreateArtifact(); Hooks(); if (ModSupport.RiskOfOptions.ModIsRunning) { ModSupport.RiskOfOptions.AddOptions(); } } private void CreateConfig(ConfigFile config) { AllowEquipmentProcs = config.Bind<bool>(ArtifactName, "Allow equipments to proc items", true, "Should damage from equipments be allowed to proc your on-hit items? This works for all vanilla equipment except for Forgive Me Please and a few that have their own config option."); AllowSawmerangProcs = config.Bind<bool>(ArtifactName, "Allow Sawmerang to proc", true, "Should damage from Sawmerang be allowed to proc your on-hit items? WARNING: This will also disable the equipment's built-in bleed on hit!\nThis setting is completely separate from the general equipment procs setting, meaning you can let sawmerang proc while preventing all other equipments from proccing."); AllowElectricBoomerangProcs = config.Bind<bool>(ArtifactName, "Allow Electric Boomerang to proc", true, "Should damage from Electric Boomerang be allowed to proc your on-hit items? WARNING: This will also disable the item's built-in stun on hit!"); AllowGenericMissileProcs = config.Bind<bool>(ArtifactName, "Allow Missiles to proc", false, "Should damage from any item that isn't ATG that fires missiles be allowed to proc your on-hit items? WARNING: This counts for Starstorm 2's Armed Backpack alongside Disposable Missile Launcher!"); AllowFireworkProcs = config.Bind<bool>(ArtifactName, "Allow Fireworks to proc items", false, "Should damage from Fireworks be allowed to proc your on-hit items?"); AllowShurikenProcs = config.Bind<bool>(ArtifactName, "Allow Shurikens to proc items", false, "Should damage from Shurikens be allowed to proc your on-hit items?"); AllowEgoProcs = config.Bind<bool>(ArtifactName, "Allow Egocentrism to proc items", false, "Should damage from Egocentrism be allowed to proc your on-hit items?"); AllowGloopProcs = config.Bind<bool>(ArtifactName, "Allow Genesis Loop to proc items", true, "Should damage from Genesis Loop be allowed to proc your on-hit items?"); AllowAspectProcs = config.Bind<bool>(ArtifactName, "Allow attacks from elite aspects to proc items", true, "Should damage from malachite, perfected, gilded, and twisted elites' aspect attacks be allowed to proc your on-hit items? WARNING: Disabling this will also disable those attacks applying an aspect's guranteed debuff such as perfected's cripple!"); AllowProcCrits = config.Bind<bool>(ArtifactName, "Allow item procs to crit", true, "Should damage from item procs be allowed to crit?"); } public override void Hooks() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown CharacterMaster.OnBodyDamaged += new hook_OnBodyDamaged(CharacterMaster_OnBodyDamaged); } private void LogDamageInfo(DamageInfo damageInfo) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_013c: 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_0170: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Unknown result type (might be due to invalid IL or missing references) Log.Debug(""); Log.Debug(""); Log.Debug(""); Log.Debug($"damageInfo.damageType.damageSource is {damageInfo.damageType.damageSource}"); Log.Debug($"damageInfo.damageType.IsDamageSourceSkillBased is {((DamageTypeCombo)(ref damageInfo.damageType)).IsDamageSourceSkillBased}"); Log.Debug($"attacker is {damageInfo.attacker}"); Log.Debug($"canRejectForce is {damageInfo.canRejectForce}"); Log.Debug($"crit is {damageInfo.crit}"); Log.Debug($"damage is {damageInfo.damage}"); Log.Debug($"damageColorIndex is {damageInfo.damageColorIndex}"); Log.Debug($"damageType is {damageInfo.damageType}"); Log.Debug($"damageType.damageType is {damageInfo.damageType.damageType}"); Log.Debug($"damageType.damageTypeCombined is {damageInfo.damageType.damageTypeCombined}"); Log.Debug($"damageType.damageTypeExtended is {damageInfo.damageType.damageTypeExtended}"); Log.Debug($"dotIndex is {damageInfo.dotIndex}"); Log.Debug($"force is {damageInfo.force}"); Log.Debug($"inflictor is {damageInfo.inflictor}"); Log.Debug($"position is {damageInfo.position}"); Log.Debug($"procChainMask is {damageInfo.procChainMask}"); Log.Debug($"procChainMask.mask is {damageInfo.procChainMask.mask}"); Log.Debug($"procCoefficient is {damageInfo.procCoefficient}"); Log.Debug($"rejected is {damageInfo.rejected}"); } private bool ShouldChangeConfigurableItemCoefficient(DamageInfo damageInfo) { bool result = false; switch (((Object)damageInfo.inflictor).name) { case "StunAndPierceBoomerang(Clone)": if (!AllowElectricBoomerangProcs.Value) { result = true; } break; case "FireworkProjectile(Clone)": if (!AllowFireworkProcs.Value) { result = true; } break; case "ShurikenProjectile(Clone)": if (!AllowShurikenProcs.Value) { result = true; } break; case "LunarSunProjectile(Clone)": if (!AllowEgoProcs.Value) { result = true; } break; case "VagrantNovaItemBodyAttachment(Clone)": if (!AllowGloopProcs.Value) { result = true; } break; case "GoldGatController(Clone)": case "BeamSphere(Clone)": case "MeteorStorm(Clone)": case "VendingMachineProjectile(Clone)": case "FireballVehicle(Clone)": if (!AllowEquipmentProcs.Value) { result = true; } break; case "Sawmerang(Clone)": if (!AllowSawmerangProcs.Value) { result = true; } break; case "MissileProjectile(Clone)": if (damageInfo.procChainMask.mask != 0 || !AllowGenericMissileProcs.Value) { result = true; } break; case "LunarMissileProjectile(Clone)": case "PoisonOrbProjectile(Clone)": case "PoisonStakeProjectile(Clone)": case "AffixAurelionitePreStrikeProjectile(Clone)": case "AffixAurelioniteCenterProjectile(Clone)": case "BeadProjectileTrackingBomb(Clone)": if (!AllowAspectProcs.Value) { result = true; } break; } return result; } private bool ShouldChangeMonsterItemProcCoefficient(DamageInfo damageInfo) { bool result = false; switch (((Object)damageInfo.inflictor).name) { case "DaggerProjectile(Clone)": case "LampBulletPlayer(Clone)": case "IcicleAura(Clone)": case "RunicMeteorStrikeImpact(Clone)": case "BossMissileProjectile(Clone)": case "IfritPylonPlayerBody(Clone)": case "MushroomWard(Clone)": case "ThunderAuraStrike(Clone)": case "LunarShockwave(Clone)": result = true; break; } return result; } private bool IsDamageBrokenWithoutInflictor(DamageInfo damageInfo) { if (damageInfo.damageType.damageTypeCombined == 131328) { return true; } string name = ((Object)damageInfo.attacker).name; if (name == "SulfurPodBody(Clone)" || name == "ShrineBlood(Clone)") { return true; } return false; } private void CharacterMaster_OnBodyDamaged(orig_OnBodyDamaged orig, CharacterMaster self, DamageReport damageReport) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_0175: 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) if (!base.ArtifactEnabled) { orig.Invoke(self, damageReport); return; } if (!Object.op_Implicit((Object)(object)damageReport.attacker)) { orig.Invoke(self, damageReport); return; } if (((Enum)damageReport.damageInfo.damageType.damageType).HasFlag((Enum)(object)(DamageType)67108864)) { orig.Invoke(self, damageReport); return; } if (IsDamageBrokenWithoutInflictor(damageReport.damageInfo)) { orig.Invoke(self, damageReport); return; } if (Object.op_Implicit((Object)(object)damageReport.damageInfo.inflictor) && ShouldChangeConfigurableItemCoefficient(damageReport.damageInfo)) { if (!AllowProcCrits.Value) { damageReport.damageInfo.crit = false; } damageReport.damageInfo.procCoefficient = 0f; orig.Invoke(self, damageReport); return; } if (Object.op_Implicit((Object)(object)damageReport.attackerMaster.playerCharacterMasterController)) { if (!((DamageTypeCombo)(ref damageReport.damageInfo.damageType)).IsDamageSourceSkillBased) { damageReport.damageInfo.procCoefficient = 0f; } } else if (damageReport.damageInfo.procChainMask.mask != 0) { damageReport.damageInfo.procCoefficient = 0f; } else if (!Object.op_Implicit((Object)(object)damageReport.damageInfo.inflictor)) { if (Object.op_Implicit((Object)(object)ModSupport.Starstorm2.ChirrFlowerItemDef) && damageReport.attackerBody.inventory.GetItemCount(ModSupport.Starstorm2.ChirrFlowerItemDef) > 0) { DamageTypeCombo val = DamageTypeCombo.op_Implicit((DamageType)0); val.damageTypeExtended = (DamageTypeExtended)0; val.damageSource = (DamageSource)0; if (DamageTypeCombo.op_Implicit(damageReport.damageInfo.damageType) != DamageTypeCombo.op_Implicit(val)) { damageReport.damageInfo.procCoefficient = 0f; } } else { damageReport.damageInfo.procCoefficient = 0f; } } else if (ShouldChangeMonsterItemProcCoefficient(damageReport.damageInfo)) { damageReport.damageInfo.procCoefficient = 0f; } orig.Invoke(self, damageReport); } } } namespace ExamplePlugin { public abstract class ArtifactBase { public ArtifactDef ArtifactDef; public abstract string ArtifactName { get; } public abstract string ArtifactLangTokenName { get; } public abstract string ArtifactDescription { get; } public abstract Sprite ArtifactEnabledIcon { get; } public abstract Sprite ArtifactDisabledIcon { get; } public bool ArtifactEnabled => RunArtifactManager.instance.IsArtifactEnabled(ArtifactDef); public abstract void Init(ConfigFile config); protected void CreateLang() { LanguageAPI.Add("ARTIFACT_" + ArtifactLangTokenName + "_NAME", ArtifactName); LanguageAPI.Add("ARTIFACT_" + ArtifactLangTokenName + "_DESCRIPTION", ArtifactDescription); } protected void CreateArtifact() { ArtifactDef = ScriptableObject.CreateInstance<ArtifactDef>(); ArtifactDef.cachedName = "ARTIFACT_" + ArtifactLangTokenName; ArtifactDef.nameToken = "ARTIFACT_" + ArtifactLangTokenName + "_NAME"; ArtifactDef.descriptionToken = "ARTIFACT_" + ArtifactLangTokenName + "_DESCRIPTION"; ArtifactDef.smallIconSelectedSprite = ArtifactEnabledIcon; ArtifactDef.smallIconDeselectedSprite = ArtifactDisabledIcon; ContentAddition.AddArtifactDef(ArtifactDef); } public abstract void Hooks(); } }