Repository navigation
Conversation
A remote player body built while its owner wears no torso armor drew none of its worn armor: hood, boots and gauntlets were in its worn list and the owner had them equipped, but nothing showed, so its feet and hands vanished with the boots and gauntlets. A torso piece hid the problem, and any armor change by the owner repaired it, since that redraws the body. After a remote player body gets its inventory, VR only, its worn armor is now taken off at 0.5 s and put back at least 0.25 s later on a later update, the same shape as the owner's own fix. Anything the owner changes in between is left as they set it: a piece they changed, or one whose slot they filled, is not put back. The hand item passes wait while the armor is off. A body that changes owner drops the redraw; one kept through a 3D rebuild while its armor is off saves that armor as worn. Weapons are not touched. Each step logs what it did, with the received worn armor and weapons and the hand slots, so a missing weapon can be traced. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014b5v4UAeR2a8gR537GMuvi
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
For humans
In VR, when another player wears no chest armor (only hood, boots, gloves...), their copy can appear after a door or spawn with none of that armor drawn: no hood, and feet and hands disappear with the boots and gloves.
Changing any armor piece fixed it by hand. Now (VR only) the copy's worn armor is taken off after 0.5 s and put back 0.25 s later, which redraws it.
Equipment changes by the owner are kept. Weapons are not touched. Independent of #11.
Tested: two people, two headsets, both directions: hood + boots through doors now shows them; chest armor still fine. Armor can blink once during the redraw.
For LLMs / agents (detailed)
Commit (base
5ab99be4=vr-support)260f9ed5 fix: vr remote player bodies draw their worn armor without a torso piece. 5 files, +487:Code/client/Services/GearRedraw.h(new, engine-free schedule),Code/client/Services/CharacterService.h,Code/client/Services/Generic/CharacterService.cpp,Code/client/Services/Generic/InventoryService.cpp(one hook),Code/tests/gear_redraw.cpp(new). The runtime integration is under#if TP_SKYRIMVRand runs only forIsRemotePlayer()copies; the pure scheduler header and its host tests are unguarded. Both changed client units compile for SE (TP_SKYRIMVR=0 / TP_SKYRIMSE=1); SE was not linked or run.The defect (reproduced on demand, both directions)
EnchClothesRobesMageHoodNovice10DD3A +ArmorImperialLightBoots13ED7), and the watching client creates or rebuilds the copy (door crossing, reconnect, first spawn).Applied 3D for actor ... now wearing 2 armor pieces), and the owner's own game shows the items equipped, but none of them is drawn. With a torso piece (robes, tunic, cuirass) everything draws.NotifyEquipmentChanges) redraws the whole copy, including pieces that did not change; a weapon change does not.SetActorInventory->TESObjectREFR::SetInventory->AddOrRemoveItemcopies the sender's worn flags onto the item's extra list beforeAddObjectToContainer, then callsEquipManager::Equip(actor, item, nullptr, ...).GetWornArmorreads those flags, not attached geometry, so the list looks right. A biped refresh triggered only by a torso-slot change is a hypothesis. The VR equip entry rejects an explicitly supplied already-worn list, but this path passesnullptr, so that does not establish the cause.The change
SetActorInventoryin theWaitingFor3Dblock, and after a retained body's equipment is restored inProcessNewEntity,QueueGearRedrawschedules one redraw per copy (bound to entity, form id and ownership epoch; a repeat for the same body restarts nothing).RunGearRedraws(afterApplyCachedWeaponDrawsinOnUpdate): at 0.5 s it takes every worn armor piece off (UnEquip(actor, armor, nullptr, 1, nullptr, false, true, false, false, nullptr)), and at least 0.25 s later, on a later update, puts them back (Equip(actor, armor, nullptr, 1, nullptr, false, true, false, false)): the same arguments asOnNotifyEquipmentChanges, in separate updates because an unequip and an equip in one drain cancel (seeReattachHandItems).InventoryService::OnNotifyEquipmentChangescallsOnRemoteEquipmentChange, which drops that item from the restore set; a stripped piece whose biped slots (TESObjectARMO::slotType) the owner has since filled is not put back.DetachHandItems/ReattachHandItems, 2.25/2.75 s) wait while the armor is off, without restarting their counter.PendingEquipmentComponent), the stripped pieces are saved as worn (minus any whose slot the owner filled). The redraw is dropped if the body is gone, changed owner, or has no 3D before the strip; the restore runs without 3D.Log lines (client
tp_client.log)Gear redraw queued for remote body X: received N worn armor and M worn weapons, worn now [ids], right hand R, left hand LGear redraw took N armor pieces off remote body X: [ids]. They go back next pass.Gear redraw put [ids] back on remote body X (left off, slot since filled by the owner: [ids]); worn now [ids], right hand R, left hand LGear redraw skipped ... no worn armor,Gear redraw dropped ...,Gear redraw cancelled for remote body X with its armor off; kept as worn N, left off ... MTesting done
[gear_redraw]: timing, one step per update, owner changes, stored identity, a replaced slot). The combined VR: tracking with weapons drawn (other players' VRIK body pose) #11 + gear build passed 94 test cases; VR client and server build; SE compile of the two changed client units.e40e6bf9(this commit cherry-picked onto VR: tracking with weapons drawn (other players' VRIK body pose) #11's80a04c67; client exe SHA-256f3af05c2...):Not fixed here (upstream, related)
DetachHandItemsskips drawn spawn requests and bodies with no equipped weapon or shield, without logging; whether that is the cause is unproven.Review provenance
Codex (gpt-6-astra, high): spec review REVISE (armor-only design adopted), diff review REVISE (2 High: stale restore after removal, armor replacement), recheck REVISE (1 High: replacement plus removal, 1 Low: log count), second recheck ACCEPT. Every finding verified against code and logs before fixing.
🤖 Generated with Claude Code
https://claude.ai/code/session_014b5v4UAeR2a8gR537GMuvi