Sagesse de Mari : l'eau brûlait partout et rendait le combat infaisable
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 <noreply@anthropic.com>
This commit is contained in:
@@ -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<Creature*> fontainesCorrompues;
|
||||
if (Creature* mari = instance->GetCreature(wiseMariGUID))
|
||||
{
|
||||
std::list<Creature*> 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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user