Artefacts : choix universel pour les 13 classes (PlayerChoice)

- class_hall_artifact_choices.cpp : handler generique responseId -> quete Chosen 40xxx
  pour guerrier/paladin/chasseur/pretre/DK/DH/chaman/demoniste (druide, mage, voleur,
  moine gardent leurs handlers dedies)
- Ritssyn Flamescowl (104795) declenche le choix demoniste via SendPlayerChoice(245)
  (aucun declencheur n existait pour cette classe)
- Data : ~/dc-patches/artifact_choices.sql (textes FR des choix, UI d etapes pour
  6 scenarios d artefact deja scriptes : Ursoc/Dark Riders/Windrunners/Truthguard/
  Nexus Vault/Mother Tree)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
SylvaniaCore deploy
2026-07-12 17:49:57 +00:00
parent 70d0763042
commit 4bf9a5f43f
2 changed files with 116 additions and 0 deletions
@@ -0,0 +1,114 @@
/*
* Choix d'artefact universel — 8 classes sans handler PlayerChoice
* (guerrier, paladin, chasseur, pretre, DK, DH, chaman, demoniste).
*
* Les forges de chaque hall ouvrent deja l'interface de choix (SmartAI action 85) ;
* ce script traite la REPONSE : il accorde, complete et recompense la quete
* « <Spec> Chosen » d'origine, qui donne directement l'arme prodigieuse
* (InitArtifactPowers est automatique a la reception de l'arme).
*
* Druide, mage, voleur et moine ont deja leurs handlers dedies : leurs
* responseIds ne figurent pas dans la table ci-dessous.
* Les responseIds sont uniques toutes classes confondues (verifie en DB).
*/
#include "ScriptMgr.h"
#include "Player.h"
#include "ObjectMgr.h"
#include "ScriptedCreature.h"
#include "ScriptedGossip.h"
namespace
{
struct ArtifactChoiceReward
{
uint8 classId;
uint32 questId;
};
// responseId -> (classe, quete « Chosen » qui recompense l'artefact)
std::unordered_map<uint32, ArtifactChoiceReward> const ArtifactChoices =
{
// Chevalier de la mort (choix 253)
{ 400, { CLASS_DEATH_KNIGHT, 40722 } }, // Sang - Gueule des damnes
{ 401, { CLASS_DEATH_KNIGHT, 40723 } }, // Givre - Lames du Prince dechu
{ 402, { CLASS_DEATH_KNIGHT, 40724 } }, // Impie - Apocalypse
// Demoniste (choix 245)
{ 420, { CLASS_WARLOCK, 40689 } }, // Affliction - Ulthalesh
{ 421, { CLASS_WARLOCK, 40691 } }, // Demonologie - Crane du man'ari
{ 422, { CLASS_WARLOCK, 40690 } }, // Destruction - Sceptre de Sargeras
// Chasseur (choix 240)
{ 450, { CLASS_HUNTER, 40619 } }, // Survie - Serredague
{ 451, { CLASS_HUNTER, 40620 } }, // Precision - Thas'dorah
{ 452, { CLASS_HUNTER, 40621 } }, // Maitrise des betes - Frappe-titan
// Paladin (choix 235)
{ 460, { CLASS_PALADIN, 40410 } }, // Sacre - Main d'argent
{ 461, { CLASS_PALADIN, 40409 } }, // Vindicte - Porte-cendres
{ 462, { CLASS_PALADIN, 40411 } }, // Protection - Garde-verite
// Guerrier (choix 236)
{ 470, { CLASS_WARRIOR, 40580 } }, // Protection - Ecaille du Gardien de terre
{ 471, { CLASS_WARRIOR, 40582 } }, // Armes - Strom'kar
{ 472, { CLASS_WARRIOR, 40581 } }, // Fureur - Epees de guerre des Valarjar
// Chasseur de demons (choix 231 et 255)
{ 478, { CLASS_DEMON_HUNTER, 40817 } }, // Devastation - Lames jumelles
{ 479, { CLASS_DEMON_HUNTER, 40818 } }, // Vengeance - Lames de guerre aldrachi
{ 640, { CLASS_DEMON_HUNTER, 40818 } }, // Vengeance (variante)
{ 641, { CLASS_DEMON_HUNTER, 40817 } }, // Devastation (variante)
// Pretre (choix 248)
{ 480, { CLASS_PRIEST, 40708 } }, // Sacre - T'uure
{ 481, { CLASS_PRIEST, 40709 } }, // Discipline - Courroux de la Lumiere
{ 482, { CLASS_PRIEST, 40707 } }, // Ombre - Xal'atath
// Chaman (choix 266)
{ 587, { CLASS_SHAMAN, 41328 } }, // Amelioration - Marteau-du-Destin
{ 588, { CLASS_SHAMAN, 41329 } }, // Elementaire - Poing de Ra-den
{ 589, { CLASS_SHAMAN, 41330 } }, // Restauration - Sharas'dal
};
}
class artifact_choice_universal : public PlayerScript
{
public:
artifact_choice_universal() : PlayerScript("artifact_choice_universal") { }
void OnPlayerChoiceResponse(Player* player, uint32 /*choiceId*/, uint32 responseId) override
{
auto itr = ArtifactChoices.find(responseId);
if (itr == ArtifactChoices.end())
return;
if (player->getClass() != itr->second.classId || player->getLevel() < 98)
return;
uint32 questId = itr->second.questId;
if (player->GetQuestStatus(questId) != QUEST_STATUS_NONE)
return;
if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
{
player->AddQuest(quest, nullptr);
player->CompleteQuest(questId);
player->RewardQuest(quest, 0, player, true);
}
}
};
// Ritssyn Flamescowl (104795, Dreadscar Rift) - la forge demoniste n'avait
// aucun declencheur : son gossip ouvre le choix d'artefact (PlayerChoice 245).
struct npc_ritssyn_flamescowl : public ScriptedAI
{
npc_ritssyn_flamescowl(Creature* creature) : ScriptedAI(creature) { }
void sGossipHello(Player* player) override
{
if (player->getClass() != CLASS_WARLOCK || player->getLevel() < 98)
return;
CloseGossipMenuFor(player);
player->SendPlayerChoice(me->GetGUID(), 245);
}
};
void AddSC_class_hall_artifact_choices()
{
new artifact_choice_universal();
RegisterCreatureAI(npc_ritssyn_flamescowl);
}
@@ -40,6 +40,7 @@ void AddSC_class_hall_druid();
void AddSC_class_hall_hunter();
void AddSC_class_hall_mage();
void AddSC_class_hall_monk();
void AddSC_class_hall_artifact_choices();
void AddSC_class_hall_paladin();
void AddSC_class_hall_priest();
void AddSC_class_hall_rogue();
@@ -246,6 +247,7 @@ void AddBrokenIslesScripts()
AddSC_class_hall_hunter();
AddSC_class_hall_mage();
AddSC_class_hall_monk();
AddSC_class_hall_artifact_choices();
AddSC_class_hall_paladin();
AddSC_class_hall_priest();
AddSC_class_hall_rogue();