…ly changed slots
Each pickup (once per player per tick since #75) ran both lore writers over
all 41 inventory slots and set every slot back. For an ordinary item that
meant about eight copies of its meta, its lore read twice and run through
regexes (ArtifactLore.readAura), all to change nothing, and then a slot
packet per slot. On Main at 15+ players that was ~3 s of main thread per hour.
VesselLore now reads an item's meta once to tell whether a writer can touch
it: aura or charge-tier data, a charge item match, or lore with a "/" (an aura
line that readAura could read back). Other items come back unchanged, as both
writers left them before. The inventory refresh sets a slot again only when
its item changed; unchanged slots were only resent to the client.
Lore output is the same: artifacts and charges still go through the same
writers.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Summary
Each pickup (once per player per tick since #75) ran both lore writers over all 41 inventory slots and set every slot back. For an ordinary item that meant about eight copies of its meta, its lore read twice and run through regexes (
ArtifactLore.readAura), all to change nothing, and then a slot packet per slot. On Main at 15+ players that was ~3 s of main thread per hour (spark 11-04).VesselLorenow reads an item's meta once to tell whether a writer can touch it: meta at all, aura or charge-tier data, a charge item match, or lore with a "/" (an aura linereadAuracould read back). Other items come back unchanged, as both writers left them before.Lore output is the same: artifacts and charges still go through the same writers.
Tests
VesselLoreTest: what can carry vessel lore, skipped items reach neither writer, only changed slots (charge, artifact) are set.Dev test
Dev (TFMCDev01, 11-05, Blood Magic Dev build + this change): pickups leave artifacts, ordinary items, a lored stick, Cooking food and STEEL_INGOT unchanged; a blank charge gets "Uncharged", a stamped charge "Charge / Mitlan II"; an artifact with its aura PDC stripped is rebuilt; no other slot changes.
🤖 Generated with Claude Code