Route the selected stack quantity through retail GetObjectSplitSize semantics, send exact split-to-container and split-to-ground actions, and keep the original object in place until the server publishes the newly guided stack. Cover selection scoping, wire bytes, container placement, and world drops with conformance tests. Co-Authored-By: Codex <codex@openai.com>
48 lines
1.5 KiB
C#
48 lines
1.5 KiB
C#
using System.Net;
|
|
using AcDream.Core.Net.Messages;
|
|
|
|
namespace AcDream.Core.Net.Tests;
|
|
|
|
public sealed class WorldSessionInventoryActionTests
|
|
{
|
|
[Fact]
|
|
public void SendStackableMerge_UsesNextSequenceAndExactBuilderBytes()
|
|
{
|
|
using var session = new WorldSession(
|
|
new IPEndPoint(IPAddress.Loopback, 65000));
|
|
byte[]? captured = null;
|
|
session.GameActionCapture = body => captured = body;
|
|
|
|
session.SendStackableMerge(0xAAu, 0xBBu, 5u);
|
|
|
|
Assert.Equal(InventoryActions.BuildStackableMerge(1, 0xAAu, 0xBBu, 5u), captured);
|
|
}
|
|
|
|
[Fact]
|
|
public void SendStackableSplitToContainer_UsesNextSequenceAndExactBuilderBytes()
|
|
{
|
|
using var session = new WorldSession(
|
|
new IPEndPoint(IPAddress.Loopback, 65000));
|
|
byte[]? captured = null;
|
|
session.GameActionCapture = body => captured = body;
|
|
|
|
session.SendStackableSplitToContainer(0xAAu, 0xBBu, 4u, 2u);
|
|
|
|
Assert.Equal(
|
|
InventoryActions.BuildStackableSplitToContainer(1, 0xAAu, 0xBBu, 4u, 2u),
|
|
captured);
|
|
}
|
|
|
|
[Fact]
|
|
public void SendStackableSplitTo3D_UsesNextSequenceAndExactBuilderBytes()
|
|
{
|
|
using var session = new WorldSession(
|
|
new IPEndPoint(IPAddress.Loopback, 65000));
|
|
byte[]? captured = null;
|
|
session.GameActionCapture = body => captured = body;
|
|
|
|
session.SendStackableSplitTo3D(0xAAu, 2u);
|
|
|
|
Assert.Equal(InventoryActions.BuildStackableSplitTo3D(1, 0xAAu, 2u), captured);
|
|
}
|
|
}
|