feat(net): #13 heuristic inventory locator after gameplay_options blob
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
d9a5e40203
commit
91693ea44c
2 changed files with 90 additions and 1 deletions
|
|
@ -663,4 +663,46 @@ public sealed class PlayerDescriptionParserTests
|
|||
Assert.Equal(0x00000200u, parsed.Value.Equipped[0].EquipLocation);
|
||||
Assert.Equal(1u, parsed.Value.Equipped[0].Priority);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TryParse_TrailerGameplayOptions_HeuristicLocatesInventoryStart()
|
||||
{
|
||||
var sb = new MemoryStream();
|
||||
using var writer = new BinaryWriter(sb);
|
||||
writer.Write(0u); // propertyFlags
|
||||
writer.Write(0x52u); // weenieType
|
||||
writer.Write(0x201u); // ATTRIBUTE | ENCHANTMENT
|
||||
writer.Write(1u); // has_health
|
||||
writer.Write(0u); // empty attribute_flags
|
||||
writer.Write(0u); // empty enchantment mask
|
||||
|
||||
// option_flags = GAMEPLAY_OPTIONS (0x200)
|
||||
writer.Write(0x200u);
|
||||
writer.Write(0u); // options1
|
||||
writer.Write(0u); // legacy hotbar count=0
|
||||
writer.Write(0u); // spellbook_filters
|
||||
|
||||
// 16 bytes of opaque gameplay_options blob — values that *almost* look
|
||||
// like an inventory header but fail validation (wtype > 2 or count too
|
||||
// big), forcing the heuristic to walk past them.
|
||||
writer.Write(0xDEADBEEFu); // looks like inv_count = 0xDEADBEEF (> 10_000) — rejected
|
||||
writer.Write(0xCAFEBABEu);
|
||||
writer.Write(0x12345678u);
|
||||
writer.Write(0x87654321u);
|
||||
|
||||
// Real inventory: 1 entry, then equipped: 1 entry — must consume to EOF.
|
||||
writer.Write(1u);
|
||||
writer.Write(0x50000200u); writer.Write(0u);
|
||||
writer.Write(1u);
|
||||
writer.Write(0x50000300u); writer.Write(0x00000200u); writer.Write(1u);
|
||||
|
||||
var parsed = PlayerDescriptionParser.TryParse(sb.ToArray());
|
||||
|
||||
Assert.NotNull(parsed);
|
||||
Assert.Single(parsed!.Value.Inventory);
|
||||
Assert.Equal(0x50000200u, parsed.Value.Inventory[0].Guid);
|
||||
Assert.Single(parsed.Value.Equipped);
|
||||
Assert.Equal(0x50000300u, parsed.Value.Equipped[0].Guid);
|
||||
Assert.Equal(16, parsed.Value.GameplayOptions.Length);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue