using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("PickupBlacklist")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("HP Inc.")]
[assembly: AssemblyProduct("PickupBlacklist")]
[assembly: AssemblyCopyright("Copyright © HP Inc. 2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("bff5b111-9326-4950-b719-cabbdd23eb23")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace PickupBlacklist;
[BepInPlugin("actuallytim.PickupBlacklist", "PickupBlacklist", "1.0.0")]
public class PickupBlacklist : BaseUnityPlugin
{
public static class Reflector
{
public static FieldInfo PlayerAutoPickupMask;
static Reflector()
{
Type typeFromHandle = typeof(Player);
PlayerAutoPickupMask = typeFromHandle.GetField("m_autoPickupMask", BindingFlags.Instance | BindingFlags.NonPublic);
}
}
[HarmonyPatch(typeof(Player), "AutoPickup")]
public static class PickupPatch
{
private static bool Prefix(Player __instance, float dt)
{
//IL_002b: 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)
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
//IL_01ad: Expected O, but got Unknown
//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
//IL_0236: Unknown result type (might be due to invalid IL or missing references)
//IL_023e: Unknown result type (might be due to invalid IL or missing references)
//IL_0243: Unknown result type (might be due to invalid IL or missing references)
//IL_0248: Unknown result type (might be due to invalid IL or missing references)
//IL_024d: Unknown result type (might be due to invalid IL or missing references)
//IL_0256: Unknown result type (might be due to invalid IL or missing references)
//IL_025a: 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_0265: Unknown result type (might be due to invalid IL or missing references)
//IL_026f: Unknown result type (might be due to invalid IL or missing references)
//IL_0274: Unknown result type (might be due to invalid IL or missing references)
//IL_0276: Unknown result type (might be due to invalid IL or missing references)
//IL_0297: Unknown result type (might be due to invalid IL or missing references)
//IL_029c: Unknown result type (might be due to invalid IL or missing references)
//IL_029e: Unknown result type (might be due to invalid IL or missing references)
if (((Character)__instance).IsTeleporting())
{
return false;
}
int num = (int)Reflector.PlayerAutoPickupMask.GetValue(__instance);
Vector3 val = ((Component)__instance).transform.position + Vector3.up;
Collider[] array = Physics.OverlapSphere(val, __instance.m_autoPickupRange, num);
Collider[] array2 = array;
foreach (Collider val2 in array2)
{
if ((Object)(object)val2.attachedRigidbody == (Object)null)
{
continue;
}
ItemDrop component = ((Component)val2.attachedRigidbody).GetComponent<ItemDrop>();
string item = ((Object)((Component)component).gameObject).name.Replace("(Clone)", "");
if (blacklist.Contains(item))
{
continue;
}
FloatingTerrainDummy val3 = null;
if ((Object)(object)component == (Object)null && (Object)(object)(val3 = ((Component)val2.attachedRigidbody).gameObject.GetComponent<FloatingTerrainDummy>()) != (Object)null)
{
component = ((Component)val3.m_parent).gameObject.GetComponent<ItemDrop>();
}
if ((Object)(object)component == (Object)null || !component.m_autoPickup || component.IsPiece() || ((Humanoid)__instance).HaveUniqueKey(component.m_itemData.m_shared.m_name) || !((Component)component).GetComponent<ZNetView>().IsValid())
{
continue;
}
if (!component.CanPickup(true))
{
component.RequestOwn();
}
else
{
if (component.InTar())
{
continue;
}
component.Load();
Inventory val4 = (Inventory)AccessTools.Field(typeof(Humanoid), "m_inventory").GetValue(__instance);
if (!val4.CanAddItem(component.m_itemData, -1) || component.m_itemData.GetWeight(-1) + val4.GetTotalWeight() > __instance.GetMaxCarryWeight())
{
continue;
}
float num2 = Vector3.Distance(((Component)component).transform.position, val);
if (num2 > __instance.m_autoPickupRange)
{
continue;
}
if (num2 < 0.3f)
{
((Humanoid)__instance).Pickup(((Component)component).gameObject, true, true);
continue;
}
Vector3 val5 = Vector3.Normalize(val - ((Component)component).transform.position);
float num3 = 15f;
Vector3 val6 = val5 * num3 * dt;
Transform transform = ((Component)component).transform;
transform.position += val6;
if (Object.op_Implicit((Object)(object)val3))
{
Transform transform2 = ((Component)val3).transform;
transform2.position += val6;
}
}
}
return false;
}
}
[HarmonyPatch(typeof(InventoryGui), "OnSelectedItem")]
public static class ItemClickPatch
{
private static bool Prefix(ItemData item)
{
if (((KeyboardShortcut)(ref bindKey)).IsPressed())
{
if (item == null)
{
return true;
}
string name = ((Object)item.m_dropPrefab).name;
if (!blacklist.Contains(name))
{
Blacklist(name);
}
else
{
Whitelist(name);
}
return false;
}
return true;
}
}
[Serializable]
[CompilerGenerated]
private sealed class <>c
{
public static readonly <>c <>9 = new <>c();
public static ConsoleEvent <>9__20_0;
internal void <InitCommandWhitelist>b__20_0(ConsoleEventArgs args)
{
if (args.Args.Length == 2)
{
Whitelist(args.Args[1]);
}
else
{
Print("Must provide an item name to remove from Blacklist");
}
}
}
private const string pluginGUID = "actuallytim.PickupBlacklist";
private const string pluginName = "PickupBlacklist";
private const string pluginVersion = "1.0.0";
private static ConfigEntry<string> blacklistConfig;
private static ConfigEntry<KeyboardShortcut> bindKeyConfig;
public static HashSet<string> blacklist = new HashSet<string>();
public static KeyboardShortcut bindKey;
private bool settingKeybind = false;
private bool setCommand = false;
public static void Print(string message, bool showMessage = true)
{
Logger.CreateLogSource("PickupBlacklist").LogInfo((object)message);
if (showMessage)
{
ShowMessage(message);
}
}
private void Awake()
{
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Expected O, but got Unknown
LoadConfig();
PopulateBlacklist();
InitCommandBlacklist();
InitCommandWhitelist();
InitCommandRemap();
Harmony val = new Harmony("actuallytim.PickupBlacklist");
val.PatchAll();
}
private void Update()
{
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: 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_0058: 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_0063: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: 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_008a: Unknown result type (might be due to invalid IL or missing references)
if (!settingKeybind)
{
return;
}
if (setCommand)
{
setCommand = false;
return;
}
foreach (KeyCode value in Enum.GetValues(typeof(KeyCode)))
{
if (Input.GetKeyDown(value))
{
bindKey = new KeyboardShortcut(value, Array.Empty<KeyCode>());
Print($"Blacklist Key set to: {(object)value}");
bindKeyConfig.Value = new KeyboardShortcut(value, Array.Empty<KeyCode>());
Print("Saved keybind configs", showMessage: false);
settingKeybind = false;
}
}
}
private void LoadConfig()
{
//IL_003f: 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)
blacklistConfig = ((BaseUnityPlugin)this).Config.Bind<string>("General", "Blacklist", "", "List of item prefab names to exclude from auto-pickup separated by commas.");
bindKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Controls", "BindKey", new KeyboardShortcut((KeyCode)308, Array.Empty<KeyCode>()), "Keybind to add/remove items from blacklist from clicking on the item in the inventory gui.");
bindKey = bindKeyConfig.Value;
}
private void PopulateBlacklist()
{
Print("Populating blacklist from config", showMessage: false);
Print(blacklistConfig.Value, showMessage: false);
blacklist = new HashSet<string>(blacklistConfig.Value.Split(new char[1] { ',' }));
if (blacklist.Contains(""))
{
blacklist.Remove("");
}
SaveBlacklist();
}
public static void SaveBlacklist()
{
Print("Saving current blacklist", showMessage: false);
blacklistConfig.Value = string.Join(",", blacklist);
}
private void ClearBlacklist()
{
blacklist = new HashSet<string>();
SaveBlacklist();
}
private void InitCommandRemap()
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: Expected O, but got Unknown
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
new ConsoleCommand("setblacklistkey", "Set the key to add items to the blacklist from inventory guis", (ConsoleEvent)delegate(ConsoleEventArgs args)
{
setCommand = true;
settingKeybind = true;
args.Context.AddString("Waiting for new keybind");
}, false, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false);
}
private void InitCommandBlacklist()
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: Expected O, but got Unknown
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
new ConsoleCommand("blacklist", "Add an item to or view the blacklist", (ConsoleEvent)delegate(ConsoleEventArgs args)
{
if (args.Args.Length > 1)
{
if (args.Args[1].ToLower() == "clear")
{
ClearBlacklist();
args.Context.AddString("Cleared blacklist.");
return;
}
Blacklist(args.Args[1]);
}
if (args.Args.Length == 1)
{
ShowBlacklist(args);
}
}, false, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false);
}
public static void Blacklist(string itemName, bool showMessage = true)
{
itemName = char.ToUpper(itemName[0]) + itemName.Substring(1);
Player localPlayer = Player.m_localPlayer;
if (!((Object)(object)localPlayer == (Object)null))
{
GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(itemName);
if ((Object)(object)itemPrefab == (Object)null)
{
Print("Item with name " + itemName + " not found, unable to add to Blacklist", showMessage);
}
else if (!blacklist.Contains(((Object)itemPrefab).name))
{
blacklist.Add(((Object)itemPrefab).name);
Print("Added " + itemName + " to Blacklist", showMessage);
SaveBlacklist();
}
}
}
private void ShowBlacklist(ConsoleEventArgs console)
{
console.Context.AddString("\nBlacklist:");
if (blacklist.Count == 0)
{
console.Context.AddString("-EMPTY-");
return;
}
foreach (string item in blacklist)
{
console.Context.AddString("- " + item);
}
}
private void InitCommandWhitelist()
{
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: Expected O, but got Unknown
object obj = <>c.<>9__20_0;
if (obj == null)
{
ConsoleEvent val = delegate(ConsoleEventArgs args)
{
if (args.Args.Length == 2)
{
Whitelist(args.Args[1]);
}
else
{
Print("Must provide an item name to remove from Blacklist");
}
};
<>c.<>9__20_0 = val;
obj = (object)val;
}
new ConsoleCommand("whitelist", "Remove an item from the blacklist", (ConsoleEvent)obj, false, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false);
}
public static void Whitelist(string itemName, bool showMessage = true)
{
itemName = char.ToUpper(itemName[0]) + itemName.Substring(1);
Player localPlayer = Player.m_localPlayer;
if (!((Object)(object)localPlayer == (Object)null) && blacklist.Contains(itemName))
{
blacklist.Remove(itemName);
Print("Removed " + itemName + " from Blacklist", showMessage);
}
}
public static void ShowMessage(string message)
{
Player localPlayer = Player.m_localPlayer;
if (!((Object)(object)localPlayer == (Object)null))
{
((Character)localPlayer).Message((MessageType)1, message, 0, (Sprite)null);
}
}
}