Couche 3 du harnais debug quetes : commande console .qtest

.qtest <nomJoueur> <questId> [complete] (allowConsole=true => SOAP sans selection)
Dump objectif-par-objectif l'etat live d'une quete pour un joueur en ligne
(statut, ObjectID, cur/req, OK/--). Option complete = AddQuest+ForceCompleteQuest.
Valide en jeu : qtest Testy 14109 -> 3 objectifs items listes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
SylvaniaCore
2026-06-24 07:02:01 +00:00
parent 48dff69fc1
commit 870dad61f5
2 changed files with 116 additions and 2 deletions
+108
View File
@@ -0,0 +1,108 @@
/*
* Sylvania custom : commande de sonde runtime de quete (Couche 3 du harnais de debug).
* .qtest <nomJoueur> <questId> [complete]
* - dump objectif-par-objectif l'etat live de la quete pour un joueur EN LIGNE
* - allowConsole=true => utilisable via SOAP/console sans selectionner le joueur
* - option "complete" : AddQuest si besoin puis ForceCompleteQuest (test du flux/rendu)
*/
#include "ScriptMgr.h"
#include "Chat.h"
#include "ObjectMgr.h"
#include "ObjectAccessor.h"
#include "Player.h"
#include "QuestDef.h"
#include "RBAC.h"
#include <sstream>
class qtest_commandscript : public CommandScript
{
public:
qtest_commandscript() : CommandScript("qtest_commandscript") { }
std::vector<ChatCommand> GetCommands() const override
{
static std::vector<ChatCommand> qtestCommandTable =
{
{ "qtest", rbac::RBAC_PERM_COMMAND_QUEST, true, &HandleQTest, "" },
};
return qtestCommandTable;
}
static bool HandleQTest(ChatHandler* handler, char const* args)
{
if (!args || !*args)
{
handler->SendSysMessage("Usage: .qtest <nomJoueur> <questId> [complete]");
handler->SetSentErrorMessage(true);
return false;
}
std::istringstream ss(args);
std::string name;
uint32 questId = 0;
std::string act;
ss >> name >> questId >> act;
if (name.empty() || questId == 0)
{
handler->SendSysMessage("Usage: .qtest <nomJoueur> <questId> [complete]");
handler->SetSentErrorMessage(true);
return false;
}
Player* player = ObjectAccessor::FindConnectedPlayerByName(name);
if (!player)
{
handler->PSendSysMessage("qtest: joueur '%s' introuvable (doit etre en ligne).", name.c_str());
handler->SetSentErrorMessage(true);
return false;
}
Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
if (!quest)
{
handler->PSendSysMessage("qtest: quete %u introuvable.", questId);
handler->SetSentErrorMessage(true);
return false;
}
QuestStatus st = player->GetQuestStatus(questId);
char const* stName;
switch (st)
{
case QUEST_STATUS_NONE: stName = "NONE"; break;
case QUEST_STATUS_COMPLETE: stName = "COMPLETE"; break;
case QUEST_STATUS_INCOMPLETE: stName = "INCOMPLETE"; break;
case QUEST_STATUS_REWARDED: stName = "REWARDED"; break;
case QUEST_STATUS_FAILED: stName = "FAILED"; break;
default: stName = "?"; break;
}
handler->PSendSysMessage("=== qtest joueur=%s quete=%u statut=%s ===", name.c_str(), questId, stName);
QuestObjectives const& objs = quest->GetObjectives();
handler->PSendSysMessage("Objectifs: %u", uint32(objs.size()));
for (QuestObjective const& obj : objs)
{
int32 cur = player->GetQuestObjectiveData(quest, obj.StorageIndex);
bool done = player->IsQuestObjectiveComplete(obj);
handler->PSendSysMessage(" [idx %d] Type=%u ObjectID=%d %d/%d %s",
int32(obj.StorageIndex), uint32(obj.Type), obj.ObjectID, cur, obj.Amount, done ? "OK" : "--");
}
if (act == "complete")
{
if (st == QUEST_STATUS_NONE && player->CanAddQuest(quest, false))
player->AddQuestAndCheckCompletion(quest, nullptr);
player->ForceCompleteQuest(questId);
handler->PSendSysMessage("qtest: ForceCompleteQuest applique -> statut=%d", int32(player->GetQuestStatus(questId)));
}
return true;
}
};
void AddSC_custom_qtest()
{
new qtest_commandscript();
}
@@ -18,14 +18,20 @@
// This is where scripts' loading functions should be declared:
void AddSC_custom_npcs();
void AddSC_custom_worgen_racials();
void AddSC_quest_conversation();
void AddSC_solocraft();
void AddLfgSoloScripts();
void AddSC_custom_loot_packs();
void AddSC_custom_qtest();
void AddCustomScripts()
{
AddSC_custom_npcs();
AddSC_custom_npcs();
AddSC_custom_worgen_racials();
AddSC_quest_conversation();
AddSC_solocraft();
AddLfgSoloScripts();
AddLfgSoloScripts();
AddSC_custom_loot_packs();
AddSC_custom_qtest();
}