From b03d31d161bdc3af0a16ec23e4e9d0c373e4adc2 Mon Sep 17 00:00:00 2001 From: SylvaniaCore deploy Date: Mon, 24 Aug 2026 23:23:13 +0200 Subject: [PATCH] =?UTF-8?q?Sagesse=20de=20Mari=20:=20l'eau=20br=C3=BBlait?= =?UTF-8?q?=20partout=20et=20rendait=20le=20combat=20infaisable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signalé en jeu par deux joueurs. Une sonde posée dans la boucle de dégâts a montré que le joueur n'occupe que deux altitudes dans la salle : 174,698 sur la coursive sèche (103 relevés sur 124) et 174,157 dans la cuvette centrale (12 relevés), à 3,1-4,5 m du centre — c'est-à-dire au corps à corps. Toute la cuvette infligeait 950 points toutes les 250 ms, soit 3 800 par seconde, dès l'entrée en combat et sans aucune condition. Or la Sagesse de Mari se tient dedans (174,24) : l'approcher revenait à se suicider. Solocraft n'y peut rien, ces dégâts ignorent les statistiques — vérifié, il s'applique correctement (+400 % de statistiques, 61 000 PV). La sonde a aussi écarté deux fausses pistes : les dégâts ne venaient pas de « Lessiver » (68 des 70 relevés portaient le sort 106778, lancé par le joueur sur lui-même à zéro mètre), et les bandes d'altitude ne sont pas mal calibrées — elles distinguent correctement la cuvette de la coursive. CE QUE FAIT LE JEU OFFICIEL L'infobulle du vrai sort (115167) dit : « les eaux corrompues DE LA FONTAINE infligent des dégâts de Givre ». L'eau n'est pas dangereuse en soi : elle le devient fontaine par fontaine, pendant que le boss les souille l'une après l'autre — une toutes les 29 s dans son propre script. D'où la consigne connue du combat : tourner le long des zones sèches jusqu'à ce que les quatre Ondes vivantes soient mortes, puis se placer sur l'anneau sec pour la phase du jet. CORRECTIF Un joueur dans l'eau ne prend des dégâts que s'il est à portée d'une fontaine DÉJÀ corrompue (aura 106518, posée par le script du boss) : - aucune fontaine souillée -> l'eau est inoffensive ; - chaque fontaine corrompue noie la moitié de cuvette la plus proche d'elle, les zones sèches se réduisent ; - les quatre corrompues -> toute la cuvette est mortelle, et c'est le moment où la phase 2 commence. La portée de 30 m est le rayon du sort officiel 115167 (SpellRadius ligne 10, build 7.3.5.26972), pas un chiffre choisi au jugé. Les fontaines étant à 24,7-29,2 m du centre et la cuvette faisant une dizaine de mètres de rayon, il découpe naturellement la cuvette en deux par fontaine. Reset() du boss purge les auras des fontaines : une mort de groupe remet bien le compteur à zéro. RESTE À FAIRE - La sonde TJSWATER est conservée le temps de la validation en jeu ; elle sera retirée ensuite. - Nous lançons toujours 106778 « Corrupted Waters NOT READY », le brouillon inachevé de Blizzard, au lieu de 115167. Dégâts comparables (5 000 contre 4 749 en normal) mais sans les paliers héroïque et mythique. Non basculé ici : 115167 utilise un ciblage par destination qui demande d'être traité à part. Co-Authored-By: Claude Opus 5 --- .../instance_temple_of_jade_serpent.cpp | 94 ++++++++++++++++++- 1 file changed, 92 insertions(+), 2 deletions(-) diff --git a/src/server/scripts/Pandaria/TempleJadeSerpent/instance_temple_of_jade_serpent.cpp b/src/server/scripts/Pandaria/TempleJadeSerpent/instance_temple_of_jade_serpent.cpp index 5977cf5..b809c7d 100644 --- a/src/server/scripts/Pandaria/TempleJadeSerpent/instance_temple_of_jade_serpent.cpp +++ b/src/server/scripts/Pandaria/TempleJadeSerpent/instance_temple_of_jade_serpent.cpp @@ -312,6 +312,73 @@ public: // Blizz handle that case with trigger and aura cast every 250 ms, anyway it's work Map::PlayerList const& PlayerList = instance->GetPlayers(); + // ========================================================== + // SylvaniaCore - l'eau ne brule QUE la ou une fontaine est + // corrompue. + // + // SIGNALE EN JEU : le combat etait infaisable. Une sonde + // posee ici a montre que le joueur alterne entre deux sols, + // 174,698 (coursive seche) et 174,157 (cuvette centrale) ; + // toute la cuvette infligeait 950 points toutes les 250 ms, + // soit 3800 par seconde, des l'entree en combat. Or la + // Sagesse de Mari se tient dedans (174,24) : approcher au + // corps a corps revenait a se suicider. Solocraft n'y peut + // rien, ces degats ignorent les statistiques. + // + // CE QUE FAIT LE JEU OFFICIEL + // L'infobulle du vrai sort (115167) dit : « les eaux + // corrompues DE LA FONTAINE infligent des degats de Givre ». + // L'eau n'est donc pas dangereuse en soi : elle le devient + // fontaine par fontaine, pendant que la Sagesse de Mari les + // souille l'une apres l'autre (une toutes les 29 s dans son + // script). D'ou la consigne connue du combat : tourner le + // long des zones seches jusqu'a ce que les quatre Ondes + // vivantes soient mortes, puis se placer sur l'anneau sec + // pour la phase du jet. + // + // ON REPRODUIT CA : un joueur dans l'eau ne prend des degats + // que s'il se trouve a portee d'une fontaine DEJA corrompue. + // Consequences, qui sont exactement le deroule officiel : + // - aucune fontaine souillee -> l'eau est inoffensive ; + // - chaque fontaine corrompue noie la moitie de la cuvette + // la plus proche d'elle, les zones seches se reduisent ; + // - les quatre corrompues -> toute la cuvette est mortelle, + // et c'est le moment ou la phase 2 commence. + // + // La portee n'est pas choisie au hasard : 30 m est le rayon + // du sort officiel (SpellRadius ligne 10, build 7.3.5.26972). + // Les fontaines etant a 24,7-29,2 m du centre et la cuvette + // faisant une dizaine de metres de rayon, ce chiffre decoupe + // naturellement la cuvette en deux par fontaine. + // + // Reset() du boss purge les auras des fontaines : une mort de + // groupe remet donc bien le compteur a zero. + // ========================================================== + uint32 const ENTREE_FONTAINE = 56586; // Fountain Stalker + uint32 const AURA_CORRUPTION = 106518; // Corrupted Fountain + float const PORTEE_FONTAINE = 30.0f; // rayon officiel de 115167 + + std::vector fontainesCorrompues; + if (Creature* mari = instance->GetCreature(wiseMariGUID)) + { + std::list fontaines; + mari->GetCreatureListWithEntryInGrid(fontaines, ENTREE_FONTAINE, 50.0f); + for (Creature* f : fontaines) + if (f && f->HasAura(AURA_CORRUPTION)) + fontainesCorrompues.push_back(f); + } + + // Aucune fontaine souillee -> la liste est vide et le test + // ci-dessous renvoie faux pour tout le monde : l'eau est + // claire, personne ne prend de degats. + auto dansEauCorrompue = [&fontainesCorrompues, PORTEE_FONTAINE](Player* p) -> bool + { + for (Creature* f : fontainesCorrompues) + if (p->GetExactDist2d(f) < PORTEE_FONTAINE) + return true; + return false; + }; + if (!PlayerList.isEmpty()) { for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) @@ -330,14 +397,37 @@ public: // position : center of the wise mari's room Position pos = plr->GetPosition(); + // SONDE TEMPORAIRE - on veut l'altitude REELLE du + // joueur pendant le combat, et savoir laquelle des + // deux bandes de degats l'attrape. Journalise une + // fois par seconde (la boucle tourne a 250 ms). + { + static uint32 sondeCompteur = 0; + if ((++sondeCompteur % 4) == 0) + { + float const zj = plr->GetPositionZ(); + TC_LOG_ERROR("misc", + "TJSWATER %s Z=%.3f dist=%.2f arc=%u bandeHaute=%u bandeBasse=%u fontaines=%u aPortee=%u", + plr->GetName().c_str(), zj, + plr->GetDistance(roomCenter), + uint32(roomCenter.HasInArc((float)M_PI, &pos) ? 1 : 0), + uint32((zj > 174.05f && zj < 174.23f) ? 1 : 0), + uint32((zj > 170.19f && zj < 170.215f) ? 1 : 0), + uint32(fontainesCorrompues.size()), + uint32(dansEauCorrompue(plr) ? 1 : 0)); + } + } + if ((plr->GetDistance(roomCenter) < 20.00f && roomCenter.HasInArc((float)M_PI, &pos)) || (!roomCenter.HasInArc((float)M_PI, &pos) && plr->GetDistance(roomCenter) < 14.00f)) { - if (plr->GetPositionZ() > 174.05f && plr->GetPositionZ() < 174.23f) + if (plr->GetPositionZ() > 174.05f && plr->GetPositionZ() < 174.23f + && dansEauCorrompue(plr)) plr->CastSpell(plr, SPELL_CORRUPTED_WATERS, true); } - if (plr->GetDistance(roomCenter) < 30.00f && plr->GetPositionZ() > 170.19f && plr->GetPositionZ() < 170.215f) + if (plr->GetDistance(roomCenter) < 30.00f && plr->GetPositionZ() > 170.19f && plr->GetPositionZ() < 170.215f + && dansEauCorrompue(plr)) plr->CastSpell(plr, SPELL_CORRUPTED_WATERS, true); } }