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());