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 BalancedYeeting v1.0.0
BalancedYeet.dll
Decompiled 18 hours agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using Mono.Cecil; using Mono.Cecil.Cil; using MonoMod.Cil; using MonoMod.RuntimeDetour; using On.RoR2; using R2API; using RoR2; using ThinkInvisible.Jfork.Yeet; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: IgnoresAccessChecksTo("Yeet")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("BalancedYeet")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("BalancedYeet")] [assembly: AssemblyTitle("BalancedYeet")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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 BalancedYeet { [BepInPlugin("Bloonjitsu7.BalancedYeet", "BalancedYeet", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class BalancedYeetPlugin : BaseUnityPlugin { public struct YeetTrackerInfo { public ItemIndex itemIndex; public CostTypeIndex costType; public int count; public YeetTrackerInfo(ItemIndex itemIndex, CostTypeIndex costType, int count) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) this.itemIndex = itemIndex; this.costType = costType; this.count = count; } } public class YeetTracker : MonoBehaviour { public CharacterBody body; public List<YeetTrackerInfo> yeetTrackers = new List<YeetTrackerInfo>(); public string stageName = ""; } public const string PluginGUID = "Bloonjitsu7.BalancedYeet"; public const string PluginAuthor = "Bloonjitsu7"; public const string PluginName = "BalancedYeet"; public const string PluginVersion = "1.0.0"; public static bool dropCooldown = false; public ILHook yeetHook; public static CostTypeIndex[] bannedCosts; public void Awake() { //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Expected O, but got Unknown //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Expected O, but got Unknown //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Expected O, but got Unknown Log.Init(((BaseUnityPlugin)this).Logger); LanguageAPI.Add("PLAYER_YEET_FAILEDPURCHASEITEMCOMMON", "{0} cannot spend Common items, as they have yeeted a Common item this stage and not picked it back up.</color>"); LanguageAPI.Add("PLAYER_YEET_FAILEDPURCHASEITEMCOMMON_2P", "You cannot spend Common items, as you have yeeted a Common item this stage and not picked it back up.</color>"); LanguageAPI.Add("PLAYER_YEET_FAILEDPURCHASEITEMUNCOMMON", "{0} cannot spend <style=cIsHealing>Uncommon</style> items, as they have yeeted an <style=cIsHealing>Uncommon</style> item this stage and not picked it back up.</color>"); LanguageAPI.Add("PLAYER_YEET_FAILEDPURCHASEITEMUNCOMMON_2P", "You cannot spend <style=cIsHealing>Uncommon</style> items, as you have yeeted an <style=cIsHealing>Uncommon</style> item this stage and not picked it back up.</color>"); LanguageAPI.Add("PLAYER_YEET_FAILEDPURCHASEITEMLEGENDARY", "{0} cannot spend <style=cIsHealth>Legendary</style> items, as they have yeeted a <style=cIsHealth>Legendary</style> item this stage and not picked it back up.</color>"); LanguageAPI.Add("PLAYER_YEET_FAILEDPURCHASEITEMLEGENDARY_2P", "You cannot spend <style=cIsHealth>Legendary</style> items, as you have yeeted a <style=cIsHealth>Legendary</style> item this stage and not picked it back up.</color>"); LanguageAPI.Add("PLAYER_YEET_FAILEDPURCHASEITEMBOSS", "{0} cannot spend <style=cIsDamage>Boss</style> items, as they have yeeted a <style=cIsDamage>Boss</style> item this stage and not picked it back up.</color>"); LanguageAPI.Add("PLAYER_YEET_FAILEDPURCHASEITEMBOSS_2P", "You cannot spend <style=cIsDamage>Boss</style> items, as you have yeeted a <style=cIsDamage>Boss</style> item this stage and not picked it back up.</color>"); LanguageAPI.Add("PLAYER_YEET_FAILEDPURCHASEITEMLUNAR", "{0} cannot spend <style=cIsUtility>Lunar</style> items, as they have yeeted a <style=cIsUtility>Lunar</style> item this stage and not picked it back up.</color>"); LanguageAPI.Add("PLAYER_YEET_FAILEDPURCHASEITEMLUNAR_2P", "You cannot spend <style=cIsUtility>Lunar</style> items, as you have yeeted a <style=cIsUtility>Lunar</style> item this stage and not picked it back up.</color>"); PurchaseInteraction.OnInteractionBegin += new hook_OnInteractionBegin(OnPurchaseBegin); MethodInfo methodInfo = AccessTools.Method(typeof(YeetPlugin), "ConCmdYeet", (Type[])null, (Type[])null); yeetHook = new ILHook((MethodBase)methodInfo, new Manipulator(IL_YeetCheck)); } public void OnPurchaseBegin(orig_OnInteractionBegin orig, PurchaseInteraction self, Interactor interactor) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected I4, but got Unknown //IL_0252: Unknown result type (might be due to invalid IL or missing references) //IL_0257: Unknown result type (might be due to invalid IL or missing references) //IL_0259: Unknown result type (might be due to invalid IL or missing references) //IL_025b: Unknown result type (might be due to invalid IL or missing references) //IL_025d: 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_0282: Expected I4, but got Unknown //IL_0059: 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_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0069: 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_02b1: Unknown result type (might be due to invalid IL or missing references) //IL_02b6: Unknown result type (might be due to invalid IL or missing references) //IL_02c3: Unknown result type (might be due to invalid IL or missing references) //IL_02d0: Expected O, but got Unknown //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_01b1: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Unknown result type (might be due to invalid IL or missing references) bool flag = true; if ((Object)(object)((Component)interactor).gameObject != (Object)null) { YeetTracker component = ((Component)interactor).gameObject.GetComponent<YeetTracker>(); ItemTier val = (ItemTier)5; CostTypeIndex costType = self.costType; CostTypeIndex val2 = costType; switch (val2 - 4) { case 0: val = (ItemTier)0; break; case 1: val = (ItemTier)1; break; case 2: val = (ItemTier)2; break; case 6: val = (ItemTier)4; break; case 5: val = (ItemTier)3; break; } if ((Object)(object)component != (Object)null && (Object)(object)component.body != (Object)null && (Object)(object)component.body.inventory != (Object)null) { int num = 0; ItemDef[] itemDefs = ItemCatalog.itemDefs; foreach (ItemDef val3 in itemDefs) { if (val3.tier == val && (val3.ContainsTag((ItemTag)14) || val3.ContainsTag((ItemTag)10))) { num += component.body.inventory.GetItemCountEffective(val3); } } Log.Message(num); if (num < self.cost) { if (Object.op_Implicit((Object)(object)Stage.instance) && Object.op_Implicit((Object)(object)Stage.instance.sceneDef) && component.stageName != Stage.instance.sceneDef.nameToken) { component.yeetTrackers.Clear(); component.stageName = Stage.instance.sceneDef.nameToken; } foreach (YeetTrackerInfo yeetTracker in component.yeetTrackers) { if (self.costType == yeetTracker.costType) { if (component.body.inventory.GetItemCountPermanent(yeetTracker.itemIndex) < yeetTracker.count) { flag = false; } else { component.yeetTrackers.Remove(yeetTracker); } } } } } } if (flag) { orig.Invoke(self, interactor); return; } Util.PlaySound("Play_GG_StageEvent_AccessCodes_WrongActivation", ((Component)self).gameObject); string baseToken = ""; CostTypeIndex costType2 = self.costType; CostTypeIndex val4 = costType2; switch (val4 - 4) { case 0: baseToken = "PLAYER_YEET_FAILEDPURCHASEITEMCOMMON"; break; case 1: baseToken = "PLAYER_YEET_FAILEDPURCHASEITEMUNCOMMON"; break; case 2: baseToken = "PLAYER_YEET_FAILEDPURCHASEITEMLEGENDARY"; break; case 6: baseToken = "PLAYER_YEET_FAILEDPURCHASEITEMBOSS"; break; case 5: baseToken = "PLAYER_YEET_FAILEDPURCHASEITEMLUNAR"; break; } Chat.SendBroadcastChat((ChatMessageBase)new SubjectChatMessage { subjectAsCharacterBody = ((Component)interactor).GetComponent<CharacterBody>(), baseToken = baseToken }); } public void IL_YeetCheck(ILContext il) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Expected O, but got Unknown //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); MoveType val2 = (MoveType)0; MoveType val3 = (MoveType)2; int itemLoc = -1; Func<Instruction, bool>[] array = new Func<Instruction, bool>[1]; if (val.TryGotoNext(val3, new Func<Instruction, bool>[2] { (Instruction x) => ILPatternMatchingExt.MatchCall(x, typeof(ItemCatalog), "GetItemDef"), (Instruction x) => ILPatternMatchingExt.MatchStloc(x, ref itemLoc) })) { int num = default(int); CostTypeIndex val4 = default(CostTypeIndex); if (val.TryGotoNext(val2, new Func<Instruction, bool>[6] { (Instruction x) => ILPatternMatchingExt.MatchLdarga(x, 0), (Instruction x) => ILPatternMatchingExt.MatchCall(x, ref val4), (Instruction x) => ILPatternMatchingExt.MatchCallvirt(x, ref val4), (Instruction x) => ILPatternMatchingExt.MatchLdloc(x, ref num), (Instruction x) => ILPatternMatchingExt.MatchLdloc(x, ref num), (Instruction x) => ILPatternMatchingExt.MatchCallvirt(x, typeof(Inventory), "RemoveItemPermanent") })) { val.Emit(OpCodes.Ldarg, 0); val.Emit(OpCodes.Ldloc, itemLoc); val.EmitDelegate<Action<ConCommandArgs, ItemDef>>((Action<ConCommandArgs, ItemDef>)delegate(ConCommandArgs args, ItemDef itemDef) { //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_010f: 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_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Expected I4, but got Unknown //IL_0148: 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_0152: 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_0158: 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_0165: Invalid comparison between Unknown and I4 //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)((ConCommandArgs)(ref args)).senderBody != (Object)null && (Object)(object)((ConCommandArgs)(ref args)).senderBody.inventory != (Object)null && (Object)(object)itemDef != (Object)null && itemDef.DoesNotContainTag((ItemTag)14) && itemDef.DoesNotContainTag((ItemTag)10)) { YeetTracker yeetTracker = ((Component)((ConCommandArgs)(ref args)).senderBody).gameObject.GetComponent<YeetTracker>(); if ((Object)(object)yeetTracker == (Object)null) { yeetTracker = ((Component)((ConCommandArgs)(ref args)).senderBody).gameObject.AddComponent<YeetTracker>(); } if (Object.op_Implicit((Object)(object)Stage.instance) && Object.op_Implicit((Object)(object)Stage.instance.sceneDef) && yeetTracker.stageName != Stage.instance.sceneDef.nameToken) { yeetTracker.yeetTrackers.Clear(); yeetTracker.stageName = Stage.instance.sceneDef.nameToken; } yeetTracker.body = ((ConCommandArgs)(ref args)).senderBody; ItemIndex itemIndex = itemDef.itemIndex; int itemCountPermanent = ((ConCommandArgs)(ref args)).senderBody.inventory.GetItemCountPermanent(itemIndex); val4 = (CostTypeIndex)0; ItemTier tier = itemDef.tier; ItemTier val5 = tier; ItemTier val6 = val5; switch ((int)val6) { case 0: val4 = (CostTypeIndex)4; break; case 1: val4 = (CostTypeIndex)5; break; case 2: val4 = (CostTypeIndex)6; break; case 4: val4 = (CostTypeIndex)10; break; case 3: val4 = (CostTypeIndex)9; break; } if ((int)val4 > 0) { YeetTrackerInfo item = new YeetTrackerInfo(itemIndex, val4, itemCountPermanent); yeetTracker.yeetTrackers.Add(item); } } }); } else { Log.Error(((MemberReference)il.Method).Name + " Hook 2 failed!"); } } else { Log.Error(((MemberReference)il.Method).Name + " Hook 1 failed!"); } } static BalancedYeetPlugin() { CostTypeIndex[] array = new CostTypeIndex[5]; RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/); bannedCosts = (CostTypeIndex[])(object)array; } } internal static class Log { private static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void Debug(object data) { _logSource.LogDebug(data); } internal static void Error(object data) { _logSource.LogError(data); } internal static void Fatal(object data) { _logSource.LogFatal(data); } internal static void Info(object data) { _logSource.LogInfo(data); } internal static void Message(object data) { _logSource.LogMessage(data); } internal static void Warning(object data) { _logSource.LogWarning(data); } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }