diff --git a/NHSE.Core/Editing/ItemRequest/IConfigItem.cs b/NHSE.Core/Editing/ItemRequest/IConfigItem.cs
index f7520a1..82958b1 100644
--- a/NHSE.Core/Editing/ItemRequest/IConfigItem.cs
+++ b/NHSE.Core/Editing/ItemRequest/IConfigItem.cs
@@ -14,5 +14,10 @@ public interface IConfigItem
/// Wrapping paper type applied if is set.
///
ItemWrappingPaper WrappingPaper { get; }
+
+ ///
+ /// Checks if the Drop Compatibility check should be skipped.
+ ///
+ bool SkipDropCheck { get; }
}
}
diff --git a/NHSE.Core/Editing/ItemRequest/ItemParser.cs b/NHSE.Core/Editing/ItemRequest/ItemParser.cs
index 2bc7ec2..612fde1 100644
--- a/NHSE.Core/Editing/ItemRequest/ItemParser.cs
+++ b/NHSE.Core/Editing/ItemRequest/ItemParser.cs
@@ -227,7 +227,7 @@ private static Item FinalizeItem(int requestIndex, IConfigItem config, ItemDesti
{
if (type == ItemDestination.PlayerDropped)
{
- if (!ItemInfo.IsSaneItemForDrop(item))
+ if (!ItemInfo.IsSaneItemForDrop(item) && !config.SkipDropCheck)
throw new Exception($"Unsupported item: (index {requestIndex}).");
if (config.WrapAllItems && item.ShouldWrapItem())
item.SetWrapping(ItemWrapping.WrappingPaper, config.WrappingPaper, true);
diff --git a/NHSE.Injection/Injector/AutoInjector.cs b/NHSE.Injection/Injector/AutoInjector.cs
index 93573e8..8cef5e0 100644
--- a/NHSE.Injection/Injector/AutoInjector.cs
+++ b/NHSE.Injection/Injector/AutoInjector.cs
@@ -5,7 +5,7 @@ namespace NHSE.Injection
{
public class AutoInjector
{
- private readonly IDataInjector Injector;
+ public readonly IDataInjector Injector;
private readonly Action AfterRead;
private readonly Action AfterWrite;
diff --git a/NHSE.Injection/PocketInjector.cs b/NHSE.Injection/PocketInjector.cs
index 9f534d7..83d9b51 100644
--- a/NHSE.Injection/PocketInjector.cs
+++ b/NHSE.Injection/PocketInjector.cs
@@ -12,6 +12,8 @@ public class PocketInjector : IDataInjector
public uint WriteOffset { private get; set; }
public bool ValidateEnabled { get; set; } = true;
+ public bool SpoofInventoryWrite { get; set; } = false;
+ private static readonly Item DroppableOnlyItem = new(0x9C9); // Gold nugget
public PocketInjector(IReadOnlyList- items, IRAMReadWriter bot)
{
@@ -50,7 +52,9 @@ public InjectionResult Write()
var orig = (byte[])data.Clone();
- PlayerItemSet.WritePlayerInventory(data, Items);
+ var items = !SpoofInventoryWrite ? Items : Enumerable.Repeat(DroppableOnlyItem, Items.Count).ToArray();
+
+ PlayerItemSet.WritePlayerInventory(data, items);
if (data.SequenceEqual(orig))
return InjectionResult.Same;
diff --git a/NHSE.Tests/ItemParsingTests.cs b/NHSE.Tests/ItemParsingTests.cs
index 6fd1ed2..b518304 100644
--- a/NHSE.Tests/ItemParsingTests.cs
+++ b/NHSE.Tests/ItemParsingTests.cs
@@ -37,6 +37,7 @@ private class ConfigWrapFake : IConfigItem
{
public bool WrapAllItems { get; } = true;
public ItemWrappingPaper WrappingPaper { get; } = ItemWrappingPaper.Black;
+ public bool SkipDropCheck { get; } = false;
}
}
}
diff --git a/NHSE.WinForms/Subforms/SysBot/SysBotUI.cs b/NHSE.WinForms/Subforms/SysBot/SysBotUI.cs
index 0d9d128..1ff7fef 100644
--- a/NHSE.WinForms/Subforms/SysBot/SysBotUI.cs
+++ b/NHSE.WinForms/Subforms/SysBot/SysBotUI.cs
@@ -72,7 +72,17 @@ private void B_WriteCurrent_Click(object sender, EventArgs e)
try
{
- var result = Injector.Write(true);
+ InjectionResult result;
+ if (Injector.Injector is PocketInjector p)
+ {
+ p.SpoofInventoryWrite = ModifierKeys == Keys.Control;
+ result = Injector.Write(true);
+ p.SpoofInventoryWrite = false;
+ }
+ else
+ {
+ result = Injector.Write(true);
+ }
if (result == InjectionResult.Success)
return;
WinFormsUtil.Alert(result.ToString());