feat(ui): port retail radar and compass
This commit is contained in:
parent
c4af181b92
commit
3cbe4b00a1
43 changed files with 2882 additions and 262 deletions
|
|
@ -172,6 +172,70 @@ public sealed class CreateObjectTests
|
|||
Assert.Equal((uint)ItemType.Creature, parsed!.Value.TargetType);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// Retail radar: PublicWeenieDesc carries two independently gated bytes.
|
||||
// Absence is distinct from an explicitly transmitted zero because zero is
|
||||
// the enum's undefined/default value, not proof the field was omitted.
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
[Fact]
|
||||
public void TryParse_NoRadarFlags_LeavesRadarFieldsNull()
|
||||
{
|
||||
byte[] body = BuildMinimalCreateObjectWithWeenieHeader(
|
||||
guid: 0x5000000Au,
|
||||
name: "Unspecified Radar Object",
|
||||
itemType: (uint)ItemType.Misc);
|
||||
|
||||
var parsed = CreateObject.TryParse(body);
|
||||
|
||||
Assert.NotNull(parsed);
|
||||
Assert.Null(parsed.Value.RadarBlipColor);
|
||||
Assert.Null(parsed.Value.RadarBehavior);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TryParse_RadarFlags_CapturesBothBytesAndContinuesTailWalk()
|
||||
{
|
||||
const uint radarBlipColorFlag = 0x00100000u;
|
||||
const uint radarBehaviorFlag = 0x00800000u;
|
||||
const uint workmanshipFlag = 0x01000000u;
|
||||
byte[] body = BuildMinimalCreateObjectWithWeenieHeader(
|
||||
guid: 0x5000000Bu,
|
||||
name: "Radar Portal",
|
||||
itemType: (uint)ItemType.Portal,
|
||||
weenieFlags: radarBlipColorFlag | radarBehaviorFlag | workmanshipFlag,
|
||||
radarBlipColor: 4,
|
||||
radarBehavior: 4,
|
||||
workmanship: 6.25f);
|
||||
|
||||
var parsed = CreateObject.TryParse(body);
|
||||
|
||||
Assert.NotNull(parsed);
|
||||
Assert.Equal((byte)4, parsed.Value.RadarBlipColor);
|
||||
Assert.Equal((byte)4, parsed.Value.RadarBehavior);
|
||||
Assert.Equal(6.25f, parsed.Value.Workmanship);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TryParse_RadarFlagsWithZero_PreservesExplicitDefaultValues()
|
||||
{
|
||||
byte[] body = BuildMinimalCreateObjectWithWeenieHeader(
|
||||
guid: 0x5000000Cu,
|
||||
name: "Explicit Radar Defaults",
|
||||
itemType: (uint)ItemType.Misc,
|
||||
weenieFlags: 0x00100000u | 0x00800000u,
|
||||
radarBlipColor: 0,
|
||||
radarBehavior: 0);
|
||||
|
||||
var parsed = CreateObject.TryParse(body);
|
||||
|
||||
Assert.NotNull(parsed);
|
||||
Assert.True(parsed.Value.RadarBlipColor.HasValue);
|
||||
Assert.Equal((byte)0, parsed.Value.RadarBlipColor.Value);
|
||||
Assert.True(parsed.Value.RadarBehavior.HasValue);
|
||||
Assert.Equal((byte)0, parsed.Value.RadarBehavior.Value);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// D.5.1 (2026-06-16): IconId was discarded at cs:516 — surface it so the
|
||||
// action bar / equipment UI can read icon dat ids from spawn messages.
|
||||
|
|
@ -500,6 +564,8 @@ public sealed class CreateObjectTests
|
|||
uint? currentWieldedLocation = null,
|
||||
uint? priority = null,
|
||||
float? workmanship = null,
|
||||
byte? radarBlipColor = null,
|
||||
byte? radarBehavior = null,
|
||||
ushort movementSeq = 0)
|
||||
{
|
||||
var bytes = new List<byte>();
|
||||
|
|
@ -562,8 +628,8 @@ public sealed class CreateObjectTests
|
|||
if ((weenieFlags & 0x00010000u) != 0) WriteU32(bytes, validLocations ?? 0); // ValidLocations u32
|
||||
if ((weenieFlags & 0x00020000u) != 0) WriteU32(bytes, currentWieldedLocation ?? 0); // CurrentlyWieldedLocation u32
|
||||
if ((weenieFlags & 0x00040000u) != 0) WriteU32(bytes, priority ?? 0); // Priority u32
|
||||
if ((weenieFlags & 0x00100000u) != 0) bytes.Add(0); // RadarBlipColor u8
|
||||
if ((weenieFlags & 0x00800000u) != 0) bytes.Add(0); // RadarBehavior u8
|
||||
if ((weenieFlags & 0x00100000u) != 0) bytes.Add(radarBlipColor ?? 0); // RadarBlipColor u8
|
||||
if ((weenieFlags & 0x00800000u) != 0) bytes.Add(radarBehavior ?? 0); // RadarBehavior u8
|
||||
if ((weenieFlags & 0x08000000u) != 0) WriteU16(bytes, 0); // PScript u16
|
||||
if ((weenieFlags & 0x01000000u) != 0) // Workmanship f32
|
||||
{
|
||||
|
|
|
|||
|
|
@ -59,6 +59,8 @@ public sealed class ObjectTableWiringTests
|
|||
Workmanship = 4.5f,
|
||||
Useability = 0x000A0008u,
|
||||
TargetType = (uint)ItemType.Creature,
|
||||
RadarBlipColor = 4,
|
||||
RadarBehavior = 3,
|
||||
};
|
||||
|
||||
var d = ObjectTableWiring.ToWeenieData(spawn);
|
||||
|
|
@ -100,6 +102,8 @@ public sealed class ObjectTableWiringTests
|
|||
Assert.Equal(4.5f, d.Workmanship);
|
||||
Assert.Equal(0x000A0008u, d.Useability);
|
||||
Assert.Equal((uint)ItemType.Creature, d.TargetType);
|
||||
Assert.Equal((byte)4, d.RadarBlipColor);
|
||||
Assert.Equal((byte)3, d.RadarBehavior);
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
|
|
|||
44
tests/AcDream.Core.Net.Tests/WorldSessionRadarTests.cs
Normal file
44
tests/AcDream.Core.Net.Tests/WorldSessionRadarTests.cs
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
using AcDream.Core.Net.Messages;
|
||||
|
||||
namespace AcDream.Core.Net.Tests;
|
||||
|
||||
public sealed class WorldSessionRadarTests
|
||||
{
|
||||
[Fact]
|
||||
public void ToEntitySpawn_PreservesRadarBytes()
|
||||
{
|
||||
var parsed = MinimalParsed() with
|
||||
{
|
||||
RadarBlipColor = 7,
|
||||
RadarBehavior = 3,
|
||||
};
|
||||
|
||||
var spawn = WorldSession.ToEntitySpawn(parsed);
|
||||
|
||||
Assert.Equal((byte)7, spawn.RadarBlipColor);
|
||||
Assert.Equal((byte)3, spawn.RadarBehavior);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ToEntitySpawn_PreservesMissingRadarFields()
|
||||
{
|
||||
var spawn = WorldSession.ToEntitySpawn(MinimalParsed());
|
||||
|
||||
Assert.Null(spawn.RadarBlipColor);
|
||||
Assert.Null(spawn.RadarBehavior);
|
||||
}
|
||||
|
||||
private static CreateObject.Parsed MinimalParsed() => new(
|
||||
Guid: 0x50000001u,
|
||||
Position: null,
|
||||
SetupTableId: null,
|
||||
AnimPartChanges: Array.Empty<CreateObject.AnimPartChange>(),
|
||||
TextureChanges: Array.Empty<CreateObject.TextureChange>(),
|
||||
SubPalettes: Array.Empty<CreateObject.SubPaletteSwap>(),
|
||||
BasePaletteId: null,
|
||||
ObjScale: null,
|
||||
Name: "Radar Test",
|
||||
ItemType: null,
|
||||
MotionState: null,
|
||||
MotionTableId: null);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue