diff --git a/src/AcDream.App/Rendering/GameWindow.cs b/src/AcDream.App/Rendering/GameWindow.cs
index 9767fa8a..615d31e3 100644
--- a/src/AcDream.App/Rendering/GameWindow.cs
+++ b/src/AcDream.App/Rendering/GameWindow.cs
@@ -2495,6 +2495,10 @@ public sealed class GameWindow : IDisposable
///
private void OnLiveEntitySpawned(AcDream.Core.Net.WorldSession.EntitySpawn spawn)
{
+ // D.5.1: enrich a known inventory/equipped item (stubbed from PlayerDescription)
+ // with the icon/name/type its CreateObject carries, so the toolbar can render it.
+ Items.EnrichItem(spawn.Guid, spawn.IconId, spawn.Name ?? string.Empty, (AcDream.Core.Items.ItemType)(spawn.ItemType ?? 0));
+
// Phase A.1 hotfix: live CreateObject handler reads dats extensively
// (Setup, GfxObj, Surface, SurfaceTexture) to hydrate the spawned
// entity. All of it must run under the dat lock so it doesn't race
diff --git a/src/AcDream.Core.Net/WorldSession.cs b/src/AcDream.Core.Net/WorldSession.cs
index 8b4e0f74..2f07ede3 100644
--- a/src/AcDream.Core.Net/WorldSession.cs
+++ b/src/AcDream.Core.Net/WorldSession.cs
@@ -80,7 +80,9 @@ public sealed class WorldSession : IDisposable
// sizing hint for tall-scenery selection indicators when the
// server publishes it for non-useable display entities.
uint? Useability = null,
- float? UseRadius = null);
+ float? UseRadius = null,
+ // D.5.1: icon datId from CreateObject WeenieHeader, for toolbar rendering.
+ uint IconId = 0);
/// Fires when the session finishes parsing a CreateObject.
public event Action? EntitySpawned;
@@ -716,7 +718,8 @@ public sealed class WorldSession : IDisposable
parsed.Value.Friction,
parsed.Value.Elasticity,
parsed.Value.Useability,
- parsed.Value.UseRadius));
+ parsed.Value.UseRadius,
+ parsed.Value.IconId));
}
}
else if (op == DeleteObject.Opcode)