Commandes : .npc add perdait la phase du maitre de jeu

Les PNJ crees en jeu n'etaient visibles qu'en mode MJ. InheritPhaseShift
donnait bien la phase du joueur a la creature, mais SaveToDB n'ecrit que
GetDBPhase() -- la phase DECLAREE EN BASE, nulle pour une creature creee
a la volee. La commande detruit ensuite l'objet et le recree depuis la
ligne enregistree, donc sans phase. Dans une aire phasee, PhaseShift::
CanSee exigeant une intersection, la creature etait invisible a tout
joueur normal ; le mode MJ masquait le defaut, SetAlwaysVisible
court-circuitant le test de phase.

TrinityCore 3.3.5 transmettait la phase explicitement a Create et a
SaveToDB, via un GetPhaseMaskForSpawn qui ignorait volontairement l'etat
« MJ voit tout ». La reecriture du systeme de phases a perdu ce principe :
master a le meme defaut. On le restaure, en annoncant la phase retenue
puisqu'un joueur moderne peut en porter plusieurs alors qu'une ligne de
la table creature n'a qu'un champ.

SQL joint : phase 6666 posee sur l'aubergiste deja pose au port de
Hurlevent, et suppression de 18 options de dialogue de type 1 qui
doublonnaient une option fonctionnelle et se placaient au-dessus d'elle.
Les options porteuses de conditions sont preservees -- une premiere
version avait supprime a tort les options d'Halloween.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
BlaMacfly
2026-08-31 22:21:11 +02:00
parent e1ccf30afc
commit a4d245ecbe
4 changed files with 7893 additions and 0 deletions
+58
View File
@@ -316,6 +316,64 @@ public:
return false;
PhasingHandler::InheritPhaseShift(creature, chr);
// =============================================================
// SylvaniaCore : conserver la phase du maitre de jeu.
//
// SIGNALE EN JEU : « j'ai tente de me creer un point de pierre
// de foyer en invoquant un aubergiste .npc add mais celui-ci
// n'est visible qu'en mode gm, j'ai teste avec plein d'autres
// c'est pareil ».
//
// CE QUI SE PASSAIT
// InheritPhaseShift donne bien la phase du joueur a la creature,
// mais SaveToDB ne l'ecrit pas : Creature.cpp ne retient que
// GetDBPhase(), la phase DECLAREE EN BASE, nulle pour une
// creature creee a la volee. La commande detruit ensuite l'objet
// et le recree depuis la ligne enregistree -- donc sans phase.
// La creature finale est orpheline de phase des la seconde meme.
//
// Le joueur, lui, herite des phases de son aire : dans le port
// de Hurlevent, phase_area declare 6666 et 13306. PhaseShift::
// CanSee exige une intersection, un objet sans phase est donc
// invisible a qui en porte une. Le mode MJ masquait le defaut :
// SetAlwaysVisible court-circuite tout test de phase.
//
// POURQUOI CE CORRECTIF EST LEGITIME
// TrinityCore 3.3.5 fait exactement cela, explicitement :
// creature->Create(..., chr->GetPhaseMaskForSpawn(), ...);
// creature->SaveToDB(map->GetId(), ..., chr->GetPhaseMaskForSpawn());
// et GetPhaseMaskForSpawn ignore volontairement l'etat « MJ voit
// tout » pour retenir la phase ou se trouverait un joueur normal.
// La reecriture du systeme de phases a perdu ce principe en
// chemin : master herite du meme defaut que nous. On le restaure.
//
// Un decalage subsiste avec 3.3.5 : une phase moderne est un
// ENSEMBLE, alors qu'une ligne de `creature` n'a qu'un champ.
// On retient la premiere et on ANNONCE le choix ainsi que les
// autres phases presentes, plutot que de trancher en silence.
// =============================================================
if (creature->GetDBPhase() == 0)
{
auto const& phasesJoueur = chr->GetPhaseShift().GetPhases();
if (!phasesJoueur.empty())
{
uint32 phaseRetenue = phasesJoueur.begin()->Id;
creature->SetDBPhase(int32(phaseRetenue));
std::string listePhases;
for (auto const& phase : phasesJoueur)
{
if (!listePhases.empty())
listePhases += ", ";
listePhases += std::to_string(uint32(phase.Id));
}
handler->PSendSysMessage("Phase %u enregistree sur ce spawn (vous etes dans les phases : %s). Sans elle la creature serait invisible a tout joueur de cette aire.",
phaseRetenue, listePhases.c_str());
}
}
creature->SaveToDB(map->GetId(), { map->GetDifficultyID() });
ObjectGuid::LowType db_guid = creature->GetSpawnId();