feat: implement barber shop UI with hair/facial customization

Adds a functional barber shop window triggered by SMSG_ENABLE_BARBER_SHOP.
Players can adjust hair style, hair color, and facial features using
sliders bounded by race/gender max values. Sends CMSG_ALTER_APPEARANCE
on confirm; server result closes the window on success. Escape key
also closes the barber shop.
This commit is contained in:
Kelsi 2026-03-18 11:58:01 -07:00
parent 8dfd916fe4
commit 64fd7eddf8
6 changed files with 160 additions and 1 deletions

View file

@ -1219,6 +1219,12 @@ public:
uint32_t getPetUnlearnCost() const { return petUnlearnCost_; }
void confirmPetUnlearn();
void cancelPetUnlearn() { petUnlearnPending_ = false; }
// Barber shop
bool isBarberShopOpen() const { return barberShopOpen_; }
void closeBarberShop() { barberShopOpen_ = false; }
void sendAlterAppearance(uint32_t hairStyle, uint32_t hairColor, uint32_t facialHair);
/** True when ghost is within 40 yards of corpse position (same map). */
bool canReclaimCorpse() const;
/** Seconds remaining on the PvP corpse-reclaim delay, or 0 if the reclaim is available now. */
@ -2983,6 +2989,9 @@ private:
uint64_t activeCharacterGuid_ = 0;
Race playerRace_ = Race::HUMAN;
// Barber shop
bool barberShopOpen_ = false;
// ---- Phase 5: Loot ----
bool lootWindowOpen = false;
bool autoLoot_ = false;

View file

@ -2796,5 +2796,12 @@ public:
static network::Packet build(int32_t titleBit);
};
/** CMSG_ALTER_APPEARANCE barber shop: change hair style, color, facial hair.
* Payload: uint32 hairStyle, uint32 hairColor, uint32 facialHair. */
class AlterAppearancePacket {
public:
static network::Packet build(uint32_t hairStyle, uint32_t hairColor, uint32_t facialHair);
};
} // namespace game
} // namespace wowee

View file

@ -366,6 +366,7 @@ private:
void renderQuestOfferRewardWindow(game::GameHandler& gameHandler);
void renderVendorWindow(game::GameHandler& gameHandler);
void renderTrainerWindow(game::GameHandler& gameHandler);
void renderBarberShopWindow(game::GameHandler& gameHandler);
void renderStableWindow(game::GameHandler& gameHandler);
void renderTaxiWindow(game::GameHandler& gameHandler);
void renderLogoutCountdown(game::GameHandler& gameHandler);
@ -543,6 +544,15 @@ private:
uint32_t vendorConfirmPrice_ = 0;
std::string vendorConfirmItemName_;
// Barber shop UI state
int barberHairStyle_ = 0;
int barberHairColor_ = 0;
int barberFacialHair_ = 0;
int barberOrigHairStyle_ = 0;
int barberOrigHairColor_ = 0;
int barberOrigFacialHair_ = 0;
bool barberInitialized_ = false;
// Trainer search filter
char trainerSearchFilter_[128] = "";