Skip to content

Transmog: full slot-echo, retail slot model, stamped weapon options, and split builders#36

Open
VoxCore84 wants to merge 3 commits intomasterfrom
codex/fix-server-side-transmog-row-model
Open

Transmog: full slot-echo, retail slot model, stamped weapon options, and split builders#36
VoxCore84 wants to merge 3 commits intomasterfrom
codex/fix-server-side-transmog-row-model

Conversation

@VoxCore84
Copy link
Owner

Motivation

  • Bring server-side transmog row model and slot-update semantics in line with retail: emit full 30-row slot echoes, use retail slot IDs/weapon option enums, and avoid synthetic option-0 weapon rows.\n- Correct parsing/routing gaps so the server consumes the slot option byte and maps DT=14 to offhand.\n- Ensure stored TransmogOutfits and live ViewedOutfit use distinct behavioral semantics and stamp real weapon option enums into metadata.\n

Description

  • Emit full slot-echo in SMSG_TRANSMOG_OUTFIT_SLOTS_UPDATED by adding a Slots vector to the server packet model and serializing SetID, SlotCount, and 16-byte slot rows (see TransmogrificationPackets.h/cpp: TransmogOutfitSlotsUpdated::Write).\n- Parse and use the option byte in incoming outfit packets and update slot-option selection in both TransmogOutfitNew::Read() and TransmogOutfitUpdateSlots::Read() (consume byte[1] and set MainHandOption/OffHandOption).\n- Add DT=14EQUIPMENT_SLOT_OFFHAND routing in DisplayTypeToEquipSlot.\n- Extend EquipmentSetData with MainHandOption and OffHandOption fields to persist selected weapon option enums.\n- Replace one shared fillOutfitData builder with a small writer + two thin wrappers: fillStoredOutfitData (stored semantics) and fillViewedOutfitData (live semantics), implemented in Player::_SyncTransmogOutfitsToActivePlayerData.\n- Implement retail-aligned row generation in the writer: 12 armor rows (option=0), 9 MH option rows, 9 OH option rows in the verified retail order; armor rows use SlotOption=0 and paired weapon placeholders (options 8–11) emit AppearanceDisplayType=IllusionDisplayType=4; no fake weapon option-0 rows for the weapons.\n- Stamp TransmogOutfitMetadata::StampedOptionMainHand/OffHand with the selected option enum values (not booleans), and populate the SMSG slot echo from the finalized pending outfit in FinalizeTransmogBridgePendingOutfit() (handler writes 30-row response built from pending outfit).\n- Files changed (key locations):\n - src/server/game/Server/Packets/TransmogrificationPackets.h / .cpp — packet model, DisplayTypeToEquipSlot, TransmogOutfitNew::Read, TransmogOutfitUpdateSlots::Read, TransmogOutfitSlotsUpdated::Write.\n - src/server/game/Entities/Player/EquipmentSet.h — added MainHandOption, OffHandOption.\n - src/server/game/Entities/Player/Player.cpp_SyncTransmogOutfitsToActivePlayerData split writer + retail row layout and stamped-option handling.\n - src/server/game/Handlers/TransmogrificationHandler.cpp — persist options from incoming CMSG to saved set and build SMSG rows from finalized pending outfit.\n

Testing

  • Ran git diff --check (no whitespace/patch issues) — succeeded.\n- Attempted local configure: cmake -S . -B build -GNinja — configure failed in this environment due to missing external dependency (Boost), so a full compile was not completed here (environment lacks required system packages).\n- Build command from project docs (cd out/build/x64-Debug && ninja -j$(nproc)) could not be executed in this container because the build output dir is not present.\n
    Notes: changes were committed (branch/commit present in working tree); automated compile in this container was blocked by missing system dependencies, but the patch is intentionally localized and small; recommend running a full build in your normal CI/development environment to validate compile and runtime behavior, then exercising the transmog UI flow to verify the 30-row SMSG echo and the stamped option behaviors described in the verification checklist.

Codex Task

Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a7a42ad072

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +18178 to +18179
appendWeaponRows(12, {8, 9, 10, 11}, equipmentSet->MainHandOption, mhAppearance, mhEnchant);
appendWeaponRows(13, {8, 9, 10, 11}, equipmentSet->OffHandOption, ohAppearance, ohEnchant);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Persist weapon option enums with transmog outfits

MainHandOption/OffHandOption now gate whether any weapon appearance row is emitted (appendWeaponRows only sets imaID when selectedOption == option), but these new fields are not loaded or written in the transmog outfit DB paths (_LoadTransmogOutfits and CHAR_{SEL,UPD,INS}_TRANSMOG_OUTFIT still only handle appearances/enchants/secondary shoulder). After relog or restart, both options reset to 0, so previously saved weapon transmogs stop appearing in ViewedOutfit/slot echoes until the outfit is edited again.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant