Symptom
A player who puts on a kit sees the kit's mob skin on every other player, but on their own avatar they keep the skin they logged in with (a premium player's real account skin, or the default for an offline/empty profile). Reported from a real client as "I see my own skin, not the custom kit skin."
Not on the wire
Captured against a running smash server with the new smash-skin-e2e gate (PR #1055). For any other player the wire is correct: the tab-list profile carries the committed textures value with its Mojang signature, and the entity metadata carries a 0x7F skin-overlay mask (hat included). No Respawn is sent. The wearer's own tab-list entry even carries the custom skin.
So this is not a server encoding bug; it is the 26.2 client caching LocalPlayer's skin. AbstractClientPlayer builds its skin once from the profile it had at spawn and does not rebuild it from a tab-list remove+add for the local player. The kit is chosen in the hub after join, so LocalPlayer was already built with the login skin, and only a rebuild (Respawn) would refresh it.
Already understood in-tree
crates/hyperion/src/egress/player_join/roster.rs documents this exact tradeoff and deliberately leaves the wearer's own view unfixed, because the only rebuild path found is a Respawn, which discards the wearer's world ("Loading terrain..." forever).
Options (needs a decision)
- A targeted Respawn for the wearer, restreaming chunks + re-offering entity subscriptions (expensive; the reason roster.rs avoided it).
- Assign the kit skin before the wearer enters the world so
LocalPlayer is built with it - only works for a fixed/default kit, not a mid-session change.
- Confirm whether 26.2 has any
LocalPlayer skin-refresh path lighter than a full Respawn (requires the client decompile).
Regression coverage
The wire half (other players get the signed skin + hat bits) is now guarded by tools/skin-check.py / smash-skin-e2e (PR #1055). This issue is only about the wearer's own-avatar view, which a scripted client cannot render or assert.
Filed by an automated agent from a first-hand packet capture; the fix is deliberately not attempted here pending a decision on the options above.
Symptom
A player who puts on a kit sees the kit's mob skin on every other player, but on their own avatar they keep the skin they logged in with (a premium player's real account skin, or the default for an offline/empty profile). Reported from a real client as "I see my own skin, not the custom kit skin."
Not on the wire
Captured against a running smash server with the new
smash-skin-e2egate (PR #1055). For any other player the wire is correct: the tab-list profile carries the committedtexturesvalue with its Mojang signature, and the entity metadata carries a0x7Fskin-overlay mask (hat included). No Respawn is sent. The wearer's own tab-list entry even carries the custom skin.So this is not a server encoding bug; it is the 26.2 client caching
LocalPlayer's skin.AbstractClientPlayerbuilds its skin once from the profile it had at spawn and does not rebuild it from a tab-list remove+add for the local player. The kit is chosen in the hub after join, soLocalPlayerwas already built with the login skin, and only a rebuild (Respawn) would refresh it.Already understood in-tree
crates/hyperion/src/egress/player_join/roster.rsdocuments this exact tradeoff and deliberately leaves the wearer's own view unfixed, because the only rebuild path found is aRespawn, which discards the wearer's world ("Loading terrain..." forever).Options (needs a decision)
LocalPlayeris built with it - only works for a fixed/default kit, not a mid-session change.LocalPlayerskin-refresh path lighter than a full Respawn (requires the client decompile).Regression coverage
The wire half (other players get the signed skin + hat bits) is now guarded by
tools/skin-check.py/smash-skin-e2e(PR #1055). This issue is only about the wearer's own-avatar view, which a scripted client cannot render or assert.Filed by an automated agent from a first-hand packet capture; the fix is deliberately not attempted here pending a decision on the options above.