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 Gimme v1.0.3
plugins/Gimme/Gimme.dll
Decompiled 6 months 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 System.Text; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Logging; using Microsoft.CodeAnalysis; using On.RoR2; using On.RoR2.Achievements; using RoR2; using RoR2.Achievements; using UnityEngine; using UnityEngine.Networking; [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("Gimme")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+8344fe9933605c3c439197aecda52d719d8087eb")] [assembly: AssemblyProduct("Gimme")] [assembly: AssemblyTitle("Gimme")] [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 Gimme { [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInProcess("Risk of Rain 2.exe")] [BepInPlugin("com.nulldev.ror2.gimme", "Gimme", "1.0.3")] public class Gimme : BaseUnityPlugin { [CompilerGenerated] private static class <>O { public static hook_RunCmd <0>__Console_RunCmd; public static hook_Grant <1>__AchievementBlocker; } private const string GUID = "com.nulldev.ror2.gimme"; private const string NAME = "Gimme"; private const string VERSION = "1.0.3"; internal static ManualLogSource log { get; set; } public void Awake() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Expected O, but got Unknown log = ((BaseUnityPlugin)this).Logger; object obj = <>O.<0>__Console_RunCmd; if (obj == null) { hook_RunCmd val = Console_RunCmd; <>O.<0>__Console_RunCmd = val; obj = (object)val; } Console.RunCmd += (hook_RunCmd)obj; object obj2 = <>O.<1>__AchievementBlocker; if (obj2 == null) { hook_Grant val2 = AchievementBlocker; <>O.<1>__AchievementBlocker = val2; obj2 = (object)val2; } BaseAchievement.Grant += (hook_Grant)obj2; log.LogInfo((object)"Gimme loaded successfully."); } private static void AchievementBlocker(orig_Grant orig, BaseAchievement self) { log.LogDebug((object)("[Gimme::AchievementBlocker] Preventing the following achievement: " + (object)self)); } private static void Console_RunCmd(orig_RunCmd orig, Console self, CmdSender sender, string concommandName, List<string> userArgs) { //IL_0024: 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_00a0: 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_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Expected O, but got Unknown //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Expected O, but got Unknown //IL_015d: 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_0163: 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_017f: Expected O, but got Unknown //IL_017f: 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_01a7: Unknown result type (might be due to invalid IL or missing references) //IL_01ac: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Expected O, but got Unknown //IL_0191: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: Expected O, but got Unknown //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Expected O, but got Unknown //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Expected O, but got Unknown //IL_01e9: Unknown result type (might be due to invalid IL or missing references) //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Expected O, but got Unknown if (!NetworkServer.active || (Object)(object)Run.instance == (Object)null || !concommandName.Equals("say", StringComparison.InvariantCultureIgnoreCase)) { orig.Invoke(self, sender, concommandName, userArgs); return; } string text = userArgs.FirstOrDefault(); if (string.IsNullOrWhiteSpace(text) || !text.StartsWith("/")) { orig.Invoke(self, sender, concommandName, userArgs); return; } string[] source = text.Split(' '); string text2 = source.FirstOrDefault().Substring(1); string[] array = source.Skip(1).ToArray(); if (text2.ToUpperInvariant() == "GIMME" || text2.ToUpperInvariant() == "GI") { Chat.SendBroadcastChat((ChatMessageBase)new UserChatMessage { sender = ((Component)sender.networkUser).gameObject, text = text }); if (array.Length < 1 || array[0] == "" || array[0].ToUpperInvariant() == "HELP") { Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage { baseToken = "<color=#AAE6F0>/gi itemname playername [amount]\n/gimme itemname playername [amount]\n/gr [itemname] [amount]\n/gimmerandom [itemname] [amount]\nWill give items into playername's inventory" }); return; } string text3 = GimmeLogic.GiveItem(sender.networkUser, array); if (text3 == null) { Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage { baseToken = "<color=#ff4646>ERROR: null output</color>" }); } else { Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage { baseToken = text3 }); } } else if (text2.ToUpperInvariant() == "GR" || text2.ToUpperInvariant() == "GIMMERANDOM") { Chat.SendBroadcastChat((ChatMessageBase)new UserChatMessage { sender = ((Component)sender.networkUser).gameObject, text = text }); string text4 = GimmeLogic.GiveRandomItem(sender.networkUser, array); if (text4 == null) { Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage { baseToken = "<color=#ff4646>ERROR: null output</color>" }); } else { Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage { baseToken = text4 }); } } else if (text2.ToUpperInvariant() == "GIMME_DUMP_ITEMS") { GimmeLogic.DumpItems(); Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage { baseToken = "Gimme wrote a gimme_items.txt into your game's directory." }); } else { orig.Invoke(self, sender, concommandName, userArgs); } } } internal class GimmeLogic { public const string RANDOM_ITEM = "#gimme-random"; public const string green = "<color=#96EBAA>"; public const string player = "<color=#AAE6F0>"; public const string error = "<color=#FF8282>"; public const string bold = "<color=#ff4646>"; private static readonly Dictionary<ItemDef, int> RESTRICTED_ITEMS; static GimmeLogic() { RESTRICTED_ITEMS = new Dictionary<ItemDef, int>(); RESTRICTED_ITEMS.Add(Items.LunarDagger, 64); RESTRICTED_ITEMS.Add(Items.RandomEquipmentTrigger, 128); RESTRICTED_ITEMS.Add(Items.SprintBonus, 100); RESTRICTED_ITEMS.Add(Items.Hoof, 100); RESTRICTED_ITEMS.Add(Items.AttackSpeedAndMoveSpeed, 100); RESTRICTED_ITEMS.Add(Items.AttackSpeedPerNearbyAllyOrEnemy, 100); RESTRICTED_ITEMS.Add(Items.CookedSteak, 100); RESTRICTED_ITEMS.Add(Items.JumpBoost, 10); RESTRICTED_ITEMS.Add(Items.FallBoots, 10); RESTRICTED_ITEMS.Add(Items.AutoCastEquipment, 32); RESTRICTED_ITEMS.Add(Items.HalfAttackSpeedHalfCooldowns, 8); RESTRICTED_ITEMS.Add(Items.Talisman, 69); RESTRICTED_ITEMS.Add(Items.HalfSpeedDoubleHealth, 16); RESTRICTED_ITEMS.Add(Items.TransferDebuffOnHit, 16); RESTRICTED_ITEMS.Add(Items.EquipmentMagazine, 254); RESTRICTED_ITEMS.Add(Items.ShinyPearl, 100); RESTRICTED_ITEMS.Add(Items.LunarSun, 100); RESTRICTED_ITEMS.Add(Items.LowerPricedChests, 100); RESTRICTED_ITEMS.Add(Items.Duplicator, 100); } public static string GiveRandomItem(NetworkUser user, string[] args) { Inventory val = (((Object)(object)user != (Object)null) ? user.master.inventory : null); NetworkUser randomUser = StringParsers.GetRandomUser(); Inventory val2 = (((Object)(object)randomUser != (Object)null) ? randomUser.master.inventory : null); if (!Object.op_Implicit((Object)(object)val) || !Object.op_Implicit((Object)(object)val2)) { return "<color=#ff4646>ERROR: Unable to get player inventory!</color>"; } if (!ParsePlayerArguments(user, args, out var _, out var _, out var quantity)) { return "<color=#ff4646>ERROR: ParsePlayerArguments() returned FALSE!</color>"; } return ProvideItem(user, val, val2, randomUser, quantity, "#gimme-random"); } public static string GiveItem(NetworkUser user, string[] args) { Inventory val = (((Object)(object)user != (Object)null) ? user.master.inventory : null); if (!ParsePlayerArguments(user, args, out var item, out var netUserFromString, out var quantity)) { if (args.Length != 2) { return "<color=#FF8282>No player name specified!</color>"; } return "<color=#FF8282>Could not find specified </color>player<color=#FF8282> '<color=#ff4646>" + args[1] + "</color>'</color>"; } Inventory val2 = (((Object)(object)netUserFromString != (Object)null) ? netUserFromString.master.inventory : null); if (!Object.op_Implicit((Object)(object)val) || !Object.op_Implicit((Object)(object)val2)) { return "<color=#ff4646>Player not found or invalid player name.</color>"; } return ProvideItem(user, val, val2, netUserFromString, quantity, item); } internal static string ProvideItem(NetworkUser sender, Inventory inventory1, Inventory inventory2, NetworkUser netUserFromString, int num, string item) { //IL_0037: 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_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Invalid comparison between Unknown and I4 //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0092: 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_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_0121: 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_012d: Unknown result type (might be due to invalid IL or missing references) string text = "<color=#AAE6F0>" + netUserFromString.masterController.GetDisplayName() + "</color>"; string text2 = "<color=#AAE6F0>" + sender.masterController.GetDisplayName() + "</color>"; ItemIndex val = (ItemIndex)(-1); if (item.Equals("#gimme-random")) { do { val = StringParsers.RandomItem(); } while (IsNotSpawnable(val)); } else { val = StringParsers.FindItem(item); } if ((int)val == -1) { return "<color=#FF8282>Could not find specified </color>item<color=#FF8282> '<color=#ff4646>" + item + "</color>'</color>"; } ItemDef itemDef = ItemCatalog.GetItemDef(val); PickupIndex val2 = PickupCatalog.FindPickupIndex(val); string @string = Language.GetString(itemDef.nameToken); string text3 = Util.GenerateColoredString(@string, Color32.op_Implicit(PickupCatalog.GetPickupDef(val2).baseColor)); if (IsNotSpawnable(val)) { return "<color=#FF8282>Item cannot be spawned in.</color>"; } if (RESTRICTED_ITEMS.ContainsKey(itemDef)) { int itemCountPermanent = inventory2.GetItemCountPermanent(itemDef); int num2 = RESTRICTED_ITEMS[itemDef]; if (num >= num2) { return "<color=#FF8282>Too much of an item requested, the limit is '" + num2 + "'.</color>"; } if (itemCountPermanent + num > num2) { return "<color=#FF8282>Player already has too much of item.</color>"; } } if (num > 1 && !@string.EndsWith("s")) { text3 += Util.GenerateColoredString("s", Color32.op_Implicit(PickupCatalog.GetPickupDef(val2).baseColor)); } if (num > 1024) { num = 1024; } inventory2.GiveItemPermanent(val, num); if (text.Equals(text2)) { return string.Format("{0}{1} gave themselves {2} {3}</color>", "<color=#96EBAA>", text2, num, text3); } return string.Format("{0}{1} gave {2} {3} to </color>{4}", "<color=#96EBAA>", text2, num, text3, text); } internal static bool IsNotSpawnable(ItemIndex index) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) string @string = Language.GetString(ItemCatalog.GetItemDef(index).nameToken); if (@string.StartsWith("ITEM_")) { return @string.EndsWith("_NAME"); } return false; } internal static bool ParsePlayerArguments(NetworkUser sender, string[] args, out string item, out NetworkUser netUserFromString, out int quantity) { item = null; netUserFromString = null; quantity = -1; if (args == null || args.Length == 0) { return false; } foreach (string text in args) { int result; bool flag = int.TryParse(text, out result); if (item == null) { item = text; } else if ((Object)(object)netUserFromString == (Object)null && !flag) { netUserFromString = StringParsers.GetNetUserFromString(text); } else if (quantity == -1 && flag) { int.TryParse(text, out quantity); } } if (NetworkUser.readOnlyInstancesList.Count == 1) { netUserFromString = sender; } if (quantity == -1) { quantity = 1; } return true; } internal static NetworkUser GetPlayer(NetworkUser sender, string arg) { if (NetworkUser.readOnlyInstancesList.Count == 1) { return sender; } return StringParsers.GetNetUserFromString(arg); } internal static void DumpItems() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0028: 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_002e: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Expected I4, but got Unknown using StreamWriter streamWriter = new StreamWriter("gimme_items.txt"); streamWriter.WriteLine("// Gimme FORMAT_ONE"); AllItemsEnumerator enumerator = ItemCatalog.allItems.GetEnumerator(); try { while (((AllItemsEnumerator)(ref enumerator)).MoveNext()) { ItemIndex current = ((AllItemsEnumerator)(ref enumerator)).Current; ItemDef itemDef = ItemCatalog.GetItemDef(current); string @string = Language.GetString(itemDef.nameToken); string text = ""; text += "{index:"; text += ((object)(ItemIndex)(ref current)).ToString(); text += ",tier:"; text += (int)itemDef.tier; text += ",nameToken:\""; text += ((Object)itemDef).name; text += "\",localizedName:\""; text += @string; text += "\"}"; streamWriter.WriteLine(text); } } finally { ((IDisposable)(AllItemsEnumerator)(ref enumerator)).Dispose(); } } } internal sealed class StringParsers { private static readonly Random rng = new Random(); internal static ItemIndex FindItemInInventory(string input, Inventory inventory) { //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0084: 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_003e: Unknown result type (might be due to invalid IL or missing references) List<ItemIndex> itemAcquisitionOrder = inventory.itemAcquisitionOrder; if (!itemAcquisitionOrder.Any()) { return (ItemIndex)(-1); } input = ReformatString(input); if (int.TryParse(input, out var result)) { if (result > itemAcquisitionOrder.Count || result < 0) { return (ItemIndex)(-1); } if (result == 0) { return itemAcquisitionOrder[itemAcquisitionOrder.Count - 1]; } return itemAcquisitionOrder[itemAcquisitionOrder.Count - result]; } for (int num = itemAcquisitionOrder.Count - 1; num >= 0; num--) { ItemDef itemDef = ItemCatalog.GetItemDef(itemAcquisitionOrder[num]); if (ReformatString(Language.GetString(itemDef.nameToken)).Contains(input)) { return itemDef.itemIndex; } } return (ItemIndex)(-1); } public static EquipmentIndex GetEquipFromPartial(string name) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) name = ReformatString(name); EquipmentDef[] equipmentDefs = EquipmentCatalog.equipmentDefs; foreach (EquipmentDef val in equipmentDefs) { if (ReformatString(Language.GetString(val.nameToken)).Contains(name)) { return val.equipmentIndex; } } return (EquipmentIndex)(-1); } internal static NetworkUser GetRandomUser() { return NetworkUser.readOnlyInstancesList[rng.Next(NetworkUser.readOnlyInstancesList.Count)]; } internal static NetworkUser GetNetUserFromString(string name) { if (int.TryParse(name, out var result)) { if (result < NetworkUser.readOnlyInstancesList.Count && result >= 0) { return NetworkUser.readOnlyInstancesList[result]; } return null; } name = ReformatString(name); foreach (NetworkUser readOnlyInstances in NetworkUser.readOnlyInstancesList) { if (ReformatString(readOnlyInstances.userName).StartsWith(name)) { return readOnlyInstances; } } foreach (NetworkUser readOnlyInstances2 in NetworkUser.readOnlyInstancesList) { if (ReformatString(readOnlyInstances2.userName).Contains(name)) { return readOnlyInstances2; } } foreach (NetworkUser readOnlyInstances3 in NetworkUser.readOnlyInstancesList) { if (NormalizeString(readOnlyInstances3.userName).Contains(name)) { return readOnlyInstances3; } } return null; } internal static string ReformatString(string input) { return Regex.Replace(input, "[ '_.,-]", string.Empty).ToLower(); } internal static string NormalizeString(string input) { return input.Normalize(NormalizationForm.FormKD); } internal static ItemIndex RandomItem() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) int index = rng.Next(((IEnumerable<ItemIndex>)(object)ItemCatalog.allItems).Count()); return ((IEnumerable<ItemIndex>)(object)ItemCatalog.allItems).AsParallel().DefaultIfEmpty((ItemIndex)(-1)).ElementAtOrDefault(index); } internal static ItemIndex FindItem(string item) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) return (from candidate in ((IEnumerable<ItemIndex>)(object)ItemCatalog.allItems).AsParallel() where Language.GetString(ItemCatalog.GetItemDef(candidate).nameToken).IndexOf(item, StringComparison.OrdinalIgnoreCase) >= 0 select candidate).DefaultIfEmpty((ItemIndex)(-1)).First(); } } 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); } } }