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 GooderRecycling v1.0.1
GooderRecycling\GooderRecycling.dll
Decompiled 4 hours agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Jotunn; using Jotunn.Entities; using Jotunn.Managers; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("GooderRecycling")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Main Street Gaming")] [assembly: AssemblyProduct("GooderRecycling")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("e3243d22-4307-4008-ba36-9f326008cde5")] [assembly: AssemblyFileVersion("1.0.1.0")] [assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.1.0")] namespace GooderRecycling; [BepInPlugin("MainStreetGaming.GooderRecycling", "GooderRecycling", "1.0.1")] [BepInDependency(/*Could not decode attribute arguments.*/)] internal class GooderRecycling : BaseUnityPlugin { public const string PluginGUID = "MainStreetGaming.GooderRecycling"; public const string PluginName = "GooderRecycling"; public const string PluginVersion = "1.0.1"; public static ConfigEntry<bool> _enableDebug; public static ConfigEntry<KeyCode> recycleHotKey; public static ConfigEntry<bool> returnUnknownRes; public static CustomLocalization Localization = LocalizationManager.Instance.GetLocalization(); private void Awake() { string[] array = new string[10] { "In the game of life, you either adapt or you install {0}. Choose wisely.", "Hold your breath, gamers! {0} is here to either fix everything or create chaos – we're not sure which yet.", "Just when you thought things couldn't get crazier, along comes {0} to prove you wrong.", "We're not saying {0} is the answer to all your problems, but it's definitely the answer to some of them.", "They say curiosity killed the cat, but in our case, it just installed {0}.", "Someone fetch the confetti cannon! {0} has arrived, and we're throwing a virtual party!", "We're not saying {0} is the key to happiness, but it's a pretty good start!", "Welcome to the age of enlightenment, where {0} has replaced logic and reason.", "Breaking news: {0} just took a wrong turn and ended up here. Let the chaos begin!", "Buckle up, buttercups! {0} just strolled in, and it's ready to rewrite the rules." }; int num = new Random().Next(array.Length); Logger.LogInfo((object)string.Format(array[num], "GooderRecycling")); CreateConfigValues(); Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), (string)null); } private void CreateConfigValues() { //IL_0000: 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) //IL_000d: Expected O, but got Unknown //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Expected O, but got Unknown //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown ConfigurationManagerAttributes val = new ConfigurationManagerAttributes { IsAdminOnly = true }; _enableDebug = ((BaseUnityPlugin)this).Config.Bind<bool>("Client config", "Enable Debug", false, new ConfigDescription("Enable Debug Mode?", (AcceptableValueBase)null, Array.Empty<object>())); recycleHotKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Client config", "Recycle Hotkey", (KeyCode)127, new ConfigDescription("Hotkey to recylce items.", (AcceptableValueBase)null, Array.Empty<object>())); returnUnknownRes = ((BaseUnityPlugin)this).Config.Bind<bool>("Server config", "Return Unknown Resources", true, new ConfigDescription("Return resources for unknown recipe?", (AcceptableValueBase)null, new object[1] { val })); } public static void DebugLog(string data) { if (_enableDebug.Value) { Logger.LogInfo((object)("GooderRecycling: " + data)); } } } [HarmonyPatch(typeof(InventoryGui), "UpdateItemDrag")] public static class UpdateItemDrag_Patch { private static void Postfix(InventoryGui __instance, ItemData ___m_dragItem, Inventory ___m_dragInventory, int ___m_dragAmount, ref GameObject ___m_dragGo) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_028f: Unknown result type (might be due to invalid IL or missing references) //IL_0294: Unknown result type (might be due to invalid IL or missing references) //IL_02b9: Unknown result type (might be due to invalid IL or missing references) //IL_02c0: Unknown result type (might be due to invalid IL or missing references) //IL_037e: Unknown result type (might be due to invalid IL or missing references) //IL_0385: Unknown result type (might be due to invalid IL or missing references) //IL_038a: Unknown result type (might be due to invalid IL or missing references) //IL_0391: Unknown result type (might be due to invalid IL or missing references) //IL_0396: Unknown result type (might be due to invalid IL or missing references) //IL_039d: Unknown result type (might be due to invalid IL or missing references) if (!Input.GetKeyDown(GooderRecycling.recycleHotKey.Value) || ___m_dragItem == null || !___m_dragInventory.ContainsItem(___m_dragItem)) { return; } GooderRecycling.DebugLog($"Initiating Recycling Process for {___m_dragAmount}/{___m_dragItem.m_stack} {((Object)___m_dragItem.m_dropPrefab).name}"); Recipe recipe = ObjectDB.instance.GetRecipe(___m_dragItem); if ((Object)(object)recipe != (Object)null && (GooderRecycling.returnUnknownRes.Value || Player.m_localPlayer.IsRecipeKnown(___m_dragItem.m_shared.m_name))) { List<Requirement> list = recipe.m_resources.ToList(); if (0 == 0 && ___m_dragAmount / recipe.m_amount > 0) { for (int i = 0; i < ___m_dragAmount / recipe.m_amount; i++) { foreach (Requirement requirement in list) { Func<GameObject, bool> predicate = delegate(GameObject item) { if ((Object)(object)item == (Object)null) { return false; } ItemDrop component3 = item.GetComponent<ItemDrop>(); return !((Object)(object)component3 == (Object)null) && component3.m_itemData != null && component3.m_itemData.m_shared != null && component3.m_itemData.m_shared.m_name == requirement.m_resItem.m_itemData.m_shared.m_name; }; for (int num = ___m_dragItem.m_quality; num > 0; num--) { GameObject val = ObjectDB.instance.m_items.FirstOrDefault(predicate); if ((Object)(object)val == (Object)null) { GooderRecycling.DebugLog("Could not find matching item for recycled resource: " + requirement.m_resItem.m_itemData.m_shared.m_name); } else { ItemDrop component = val.GetComponent<ItemDrop>(); if ((Object)(object)component == (Object)null || component.m_itemData == null) { GooderRecycling.DebugLog("Matching item has invalid ItemData: " + requirement.m_resItem.m_itemData.m_shared.m_name); } else { ItemData val2 = component.m_itemData.Clone(); val2.m_quality = requirement.m_resItem.m_itemData.m_quality; val2.m_variant = requirement.m_resItem.m_itemData.m_variant; int num2 = ((num > 1 || !requirement.m_upgraderResource) ? requirement.GetAmount(num) : 0); while (num2 > 0) { int num3 = Mathf.Min(requirement.m_resItem.m_itemData.m_shared.m_maxStackSize, num2); num2 -= num3; ItemData recycledItemData = val2.Clone(); recycledItemData.m_stack = num3; Inventory inventory = ((Humanoid)Player.m_localPlayer).GetInventory(); while (recycledItemData.m_stack > 0) { bool flag = false; ItemData val3 = ((IEnumerable<ItemData>)inventory.GetAllItems()).FirstOrDefault((Func<ItemData, bool>)((ItemData item) => item.IsSameType(recycledItemData) && item.m_stack < item.m_shared.m_maxStackSize)); if (val3 != null) { Vector2i gridPos = val3.m_gridPos; int stack = recycledItemData.m_stack; inventory.AddItem(recycledItemData, recycledItemData.m_stack, gridPos.x, gridPos.y, false); flag = recycledItemData.m_stack < stack; } if (!flag) { for (int num4 = 0; num4 < inventory.GetHeight(); num4++) { if (flag) { break; } for (int num5 = 0; num5 < inventory.GetWidth(); num5++) { if (inventory.GetItemAt(num5, num4) == null) { int stack2 = recycledItemData.m_stack; inventory.AddItem(recycledItemData, recycledItemData.m_stack, num5, num4, false); flag = recycledItemData.m_stack < stack2; if (flag) { break; } } } } } if (!flag) { Transform transform; ItemDrop component2 = Object.Instantiate<GameObject>(val, (transform = ((Component)Player.m_localPlayer).transform).position + transform.forward + transform.up, transform.rotation).GetComponent<ItemDrop>(); component2.m_itemData = recycledItemData; component2.m_itemData.m_dropPrefab = val; component2.m_itemData.m_stack = recycledItemData.m_stack; component2.Save(); recycledItemData.m_stack = 0; } } } } } } } } if (IsEquippedWeapon(___m_dragItem)) { GooderRecycling.DebugLog("Item is equipped. Unequipping..."); UnequipWeapon(___m_dragItem); } ___m_dragInventory.RemoveItem(___m_dragItem, ___m_dragAmount); } } Object.Destroy((Object)(object)___m_dragGo); ___m_dragGo = null; __instance.UpdateCraftingPanel(false); } private static bool IsEquippedWeapon(ItemData itemData) { string itemName = itemData.m_shared.m_name; return ((Humanoid)Player.m_localPlayer).GetInventory().GetEquippedItems().Any((ItemData equippedItem) => equippedItem.m_shared.m_name == itemName); } private static void UnequipWeapon(ItemData itemData) { ((Humanoid)Player.m_localPlayer).RemoveEquipAction(itemData); ((Humanoid)Player.m_localPlayer).UnequipItem(itemData, false); } }