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:
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,26 @@
|
||||
-- =====================================================================
|
||||
-- Aubergiste du port de Hurlevent — phase manquante
|
||||
--
|
||||
-- Spawn cree en jeu par `.npc add 6727` (Innkeeper Brianna) a
|
||||
-- (-8296.06, 1388.89, 4.95), aire 4411 « Port de Hurlevent ».
|
||||
--
|
||||
-- La commande a enregistre la ligne SANS phase, alors que `phase_area`
|
||||
-- place tout joueur de cette aire en 6666 « Pre-Broken Shore Stormwind
|
||||
-- Harbor » (et 13306 pour la rampe). PhaseShift::CanSee exigeant une
|
||||
-- intersection, la creature etait invisible a tout joueur normal, et
|
||||
-- visible en mode MJ seulement -- SetAlwaysVisible court-circuitant le
|
||||
-- test de phase.
|
||||
--
|
||||
-- La cause est corrigee dans le core (cs_npc.cpp) : les prochains
|
||||
-- `.npc add` conserveront la phase. Cette ligne repare le spawn deja
|
||||
-- pose, pour ne pas avoir a le recreer.
|
||||
--
|
||||
-- 6666 et non 13306 : l'aubergiste est sur le quai, pas sur la rampe,
|
||||
-- et c'est la phase que portent les 371 autres creatures de cette aire.
|
||||
-- =====================================================================
|
||||
|
||||
UPDATE `creature`
|
||||
SET `PhaseId` = 6666
|
||||
WHERE `guid` = 290200759
|
||||
AND `id` = 6727
|
||||
AND `PhaseId` = 0;
|
||||
@@ -0,0 +1,42 @@
|
||||
-- =====================================================================
|
||||
-- Options de dialogue mortes qui doublonnent une option fonctionnelle
|
||||
--
|
||||
-- Une ligne de type 1 (bavardage) est affichee sans aucune verification
|
||||
-- par Player::PrepareGossipMenu (« no checks »), mais sa selection ne
|
||||
-- declenche aucune action. Lorsqu'une telle ligne porte le MEME texte
|
||||
-- qu'une option reellement fonctionnelle du meme menu -- aubergiste (8),
|
||||
-- marchand (3), transmogrification (16) -- le joueur voit la ligne en
|
||||
-- double et celle du haut ne fait rien.
|
||||
--
|
||||
-- PREMIERE VERSION ERRONEE, CORRIGEE ICI
|
||||
-- La version precedente supprimait aussi huit options portant des
|
||||
-- CONDITIONS : evenement 12 (Halloween) actif et absence de l'aura
|
||||
-- 24755 « Tricked or Treated ». C'etait l'option « Des bonbons ou un
|
||||
-- sort ! », que la base habille du meme texte que l'option d'auberge.
|
||||
-- Hors periode d'Halloween elle n'est jamais affichee : la supprimer
|
||||
-- ne corrigeait rien et retirait du contenu saisonnier.
|
||||
--
|
||||
-- D'ou la clause NOT EXISTS : toute option soumise a une condition est
|
||||
-- desormais preservee, sans avoir a juger de la condition elle-meme.
|
||||
--
|
||||
-- CE CORRECTIF NE RESOUT PAS le probleme de liaison de pierre de foyer
|
||||
-- signale en jeu : le menu 342 fait partie des huit cas conditionnes,
|
||||
-- son option morte n'etait donc pas affichee. La cause reste a trouver.
|
||||
-- Il est conserve parce qu'il corrige un vrai defaut d'affichage
|
||||
-- ailleurs, pas parce qu'il repond au symptome signale.
|
||||
--
|
||||
-- Retour arriere : chantiers/gossip_menu_option_retour_20260831.sql
|
||||
-- =====================================================================
|
||||
|
||||
DELETE g1
|
||||
FROM `gossip_menu_option` g1
|
||||
JOIN `gossip_menu_option` g2
|
||||
ON g2.`MenuId` = g1.`MenuId`
|
||||
AND g2.`OptionText` = g1.`OptionText`
|
||||
AND g2.`OptionType` IN (3, 8, 16)
|
||||
WHERE g1.`OptionType` = 1
|
||||
AND NOT EXISTS (SELECT 1
|
||||
FROM `conditions` c
|
||||
WHERE c.`SourceTypeOrReferenceId` = 15
|
||||
AND c.`SourceGroup` = g1.`MenuId`
|
||||
AND c.`SourceEntry` = g1.`OptionIndex`);
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user