From 7582be8b0ad2654d71a0f66be1b0bb879d5b2e90 Mon Sep 17 00:00:00 2001 From: SylvaniaCore deploy Date: Wed, 8 Jul 2026 22:07:09 +0000 Subject: [PATCH] fix(player): ne pas desequiper le stuff sous le niveau de specialisation (10) Bug (signalement #8, perso draenei): sous le niveau 10, chaque montee de niveau vidait tout l'equipement vers les sacs, obligeant a tout rehabiller. Cause racine: InitTalentForLevel() appelle ResetTalentSpecialization() a chaque montee de niveau tant que level < MIN_SPECIALIZATION_LEVEL (10), ce qui declenche RemoveEquipedSpecializationItems(). Cette derniere desequipe tout objet dont les bits de specialisation ne matchent pas la spe (ou qui echoue CanUseItem). Or sous 10 un perso n'a pas de vraie spe -> desequipement indu, non-blizzlike. Fix durable a la racine: early-return dans RemoveEquipedSpecializationItems() si getLevel() < MIN_SPECIALIZATION_LEVEL. Couvre les 2 appelants sans regression: la voie level-up sous 10 (ResetTalentSpecialization) est neutralisee; la voie ActivateTalentGroup (changement de spe) est de toute facon impossible sous 10. MIN_SPECIALIZATION_LEVEL deja en scope (Player.cpp). Diagnostic produit en autonomie par le pipeline de triage de bugs, verifie puis deploye manuellement. Co-Authored-By: Claude Fable 5 --- src/server/game/Entities/Player/Player.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 47f4892..0e9a5be 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -30771,6 +30771,13 @@ void Player::RemoveSpecializationSpells() void Player::RemoveEquipedSpecializationItems() { + // Sous le niveau de specialisation (MIN_SPECIALIZATION_LEVEL=10), un perso n'a pas + // de vraie spe : ne pas desequiper. InitTalentForLevel() rappelle + // ResetTalentSpecialization() a CHAQUE montee de niveau sous 10, ce qui deshabillait + // tout le stuff vers les sacs (non-blizzlike ; cf. signalement #8 "draeneï"). + if (getLevel() < MIN_SPECIALIZATION_LEVEL) + return; + for (uint8 i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; i++) if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i)) if (!item->GetTemplate()->IsUsableBySpecialization(GetSpecializationId(), getLevel(), false) || CanUseItem(item) != EQUIP_ERR_OK)