Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of Gimme v1.0.3
plugins/Gimme/Gimme.dll
Decompiled a month 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); } } }