Brasserie : Ook-Ook ne descendait jamais, tonneaux encastres, barre decalee

Trois defauts distincts, tous confirmes par la sonde OOKDBG et par les
donnees de spawn.

1. OOK-OOK NE VENAIT PAS DANS L ARENE
La sonde montre que le chemin scripte fonctionne : « SEUIL ATTEINT »,
« Ook-Ook trouve, appel DoAction(0) », puis StartIntro. Le defaut etait
en aval, et double.
 a) L appel passait CINQ arguments -- MoveJump(x, y, z, 25.0f, 25.0f) --
    a une surcharge (x, y, z, o, speedXY, speedZ). Le premier 25.0f
    atterrissait sur l ORIENTATION. On passe par la surcharge prenant
    une Position.
 b) Il passait en reaction AGRESSIVE juste avant de sauter. Les joueurs
    sont 16 m plus bas, donc a portee : il acquerait une cible et le
    mouvement de poursuite ecrasait le saut. N ayant aucun chemin pour
    descendre, il restait plante sur son perchoir -- ce qui explique
    aussi qu il ait ete attaquable trop tot. Il reste passif pendant le
    saut et devient agressif a l atterrissage (MovementInform, en
    EFFECT_MOTION_TYPE, que le filtre existant ecartait).
Le domicile est fixe avant le saut, sinon l evade le ramene en haut.

2. TONNEAUX ENCASTRES DANS LE DECOR (capture a l appui)
DoCastBarrel figeait l altitude a 146.79, soit le sol de l arene
(ookJumpPos = 146.92). Or les Hurleurs se tiennent entre 155,6 et 161,5 :
le tonneau etait depose 9 a 15 m SOUS son lanceur, a la verticale du
balcon mais a l altitude du plancher. On interroge desormais le sol reel
sous le point vise, et le tonneau suit le sol pendant qu il roule.

3. BARRE DE BANANES BLOQUEE A 39
Le test portait sur la valeur APRES incrementation (« + 1 < 40 ») : la
barre n atteignait jamais 40/40. Signale comme « Ook-Ook apparait avant
40/40 » -- il apparaissait au bon moment, c est l affichage qui etait en
retard d une unite. Le compteur d instance, lui, etait monte a 94.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
SylvaniaCore deploy
2026-08-25 22:28:23 +02:00
parent b182593051
commit e657f4fb96
2 changed files with 99 additions and 6 deletions
@@ -112,6 +112,9 @@ public:
bool introDone, initializedBarrels;
ObjectGuid targetGuid;
// Identifiant du saut d'entree en arene.
static uint32 const POINT_ATTERRISSAGE = 3300;
void InitializeAI() override
{
me->setActive(true);
@@ -164,14 +167,47 @@ public:
events.CancelEvent(EVENT_INTROCHECK);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetReactState(REACT_AGGRESSIVE);
// ==========================================================
// SylvaniaCore - Ook-Ook ne descendait jamais dans l'arene.
//
// SIGNALE EN JEU : « une fois les 40/40 Ook-Ook ne vient pas »,
// et par ailleurs il etait attaquable trop tot sur son
// perchoir. Une sonde a confirme que le chemin scripte
// fonctionne : « SEUIL ATTEINT », puis « Ook-Ook trouve,
// appel DoAction(0) », puis StartIntro. Le probleme est donc
// ici, entre l'intro et l'arrivee au sol.
//
// DEUX DEFAUTS SE CUMULAIENT.
//
// 1. L'appel a MoveJump passait CINQ arguments :
// MoveJump(x, y, z, 25.0f, 25.0f)
// alors que la surcharge correspondante est
// MoveJump(x, y, z, o, speedXY, speedZ, ...)
// Le premier 25.0f atterrissait donc sur l'ORIENTATION et
// le second sur la vitesse horizontale. On passe par la
// surcharge qui prend une Position : plus d'ambiguite, et
// l'orientation d'arrivee vient de ookJumpPos elle-meme.
//
// 2. Il passait en reaction AGRESSIVE juste avant de sauter.
// Les joueurs sont seize metres plus bas, donc a portee
// d'agression : il acquerait une cible aussitot, et le
// mouvement de poursuite ecrasait le saut. N'ayant aucun
// chemin pour descendre de son perchoir, il restait plante.
// Il reste desormais PASSIF pendant le saut et ne devient
// agressif qu'a l'atterrissage (voir MovementInform).
//
// Le domicile est fixe AVANT le saut : sinon un retour a la
// position d'origine le ramenerait sur son perchoir.
// ==========================================================
me->SetReactState(REACT_PASSIVE);
DoAction(1);
Talk(TALK_INTRO);
me->GetMotionMaster()->MoveJump(ookJumpPos.GetPositionX(), ookJumpPos.GetPositionY(), ookJumpPos.GetPositionZ(), 25.0f, 25.0f);
me->SetReactState(REACT_AGGRESSIVE);
me->SetHomePosition(ookJumpPos);
me->GetMotionMaster()->MoveJump(ookJumpPos, 25.0f, 25.0f, POINT_ATTERRISSAGE);
}
void EnterCombat(Unit* who) override
@@ -236,6 +272,15 @@ public:
void MovementInform(uint32 type, uint32 pointId) override
{
// Un saut est rapporte en EFFECT_MOTION_TYPE, pas en
// POINT_MOTION_TYPE : il doit donc etre traite avant le
// filtre ci-dessous, qui l'ecartait.
if (type == EFFECT_MOTION_TYPE && pointId == POINT_ATTERRISSAGE)
{
me->SetReactState(REACT_AGGRESSIVE);
return;
}
if (type != POINT_MOTION_TYPE)
return;
@@ -391,7 +436,13 @@ public:
// sortirait de la salle, ce qui serait pire que le defaut
// corrige. Sur un sol degage, le chemin calcule est de toute
// facon quasi rectiligne.
me->GetMotionMaster()->MovePoint(POINT_ROULEMENT, x, y, me->GetPositionZ());
// On suit le sol plutot que de conserver l'altitude de depart :
// un tonneau qui roule doit epouser le plancher.
float z = me->GetMap()->GetHeight(me->GetPhaseShift(), x, y, me->GetPositionZ(), true);
if (z <= -100000.0f)
z = me->GetPositionZ();
me->GetMotionMaster()->MovePoint(POINT_ROULEMENT, x, y, z);
}
void MovementInform(uint32 type, uint32 id) override
@@ -470,7 +521,22 @@ public:
float x, y, z;
GetPositionWithDistInOrientation(me, frand(5.0f, 10.0f), me->GetOrientation(), x, y);
z = 146.79f;
// SylvaniaCore : l'altitude etait figee a 146.79, c'est-a-dire
// le sol de l'arene (ookJumpPos vaut 146.92). Or les Hurleurs
// se tiennent sur la coursive, entre 155,6 et 161,5 : le
// tonneau etait donc depose neuf a quinze metres SOUS son
// lanceur, a la verticale du balcon mais a l'altitude du
// plancher -- donc encastre dans la structure. Signale en jeu
// avec capture a l'appui : les tonneaux apparaissaient fiches
// dans les poutres.
//
// On interroge desormais le sol reel sous le point vise. La ou
// le Hurleur fait face a l'arene, cela redonne naturellement
// les 146,9 attendus ; ailleurs, le tonneau se pose sur la
// coursive au lieu de disparaitre dans le decor.
float const zSol = me->GetMap()->GetHeight(me->GetPhaseShift(), x, y, me->GetPositionZ(), true);
z = (zSol > -100000.0f) ? zSol : 146.79f;
me->CastSpell(x, y, z, SPELL_BARREL_TOSS, false);
}
@@ -195,6 +195,11 @@ public:
void OnUnitDeath(Unit* unit) override
{
// SONDE TEMPORAIRE - toute mort de creature, comptee ou non.
if (unit && unit->ToCreature())
TC_LOG_ERROR("misc", "SSBDBG mort entree=%u nom=%s | compteur avant=%u",
unit->GetEntry(), unit->GetName().c_str(), hozenSlain);
if (unit->ToCreature())
{
switch (unit->GetEntry())
@@ -208,11 +213,20 @@ public:
case NPC_HOZEN_PARTY_ANIMAL3:
hozenSlain++;
SetData(DATA_HOZEN_SLAIN, hozenSlain);
// SONDE TEMPORAIRE
TC_LOG_ERROR("misc", "SSBDBG COMPTE -> hozenSlain=%u / 40", hozenSlain);
payersInList.clear();
GetPlayerListInGrid(payersInList, unit, 200.0f);
for (auto&& itr : payersInList)
if (itr->HasAura(SPELL_BANANA_BAR) && itr->GetPower(POWER_ALTERNATE_POWER) + 1 < 40)
// SylvaniaCore : le test portait sur la valeur APRES
// incrementation (« + 1 < 40 »), si bien que la barre
// s'arretait a 39 et n'affichait jamais 40/40. Signale
// en jeu : « Ook-Ook apparait avant que le compteur
// arrive a 40/40 » -- il apparaissait en fait au bon
// moment, c'est l'affichage qui etait en retard d'une
// unite.
if (itr->HasAura(SPELL_BANANA_BAR) && itr->GetPower(POWER_ALTERNATE_POWER) < 40)
itr->SetPower(POWER_ALTERNATE_POWER, itr->GetPower(POWER_ALTERNATE_POWER) + 1);
break;
}
@@ -255,12 +269,25 @@ public:
{
events.ScheduleEvent(1, 7000);
// SONDE TEMPORAIRE - etat du test a chaque passage.
TC_LOG_ERROR("misc", "SSBDBG tick evenement 1 : hozenSlain=%u etatBoss=%u guidOokOok=%s",
hozenSlain, uint32(GetBossState(DATA_OOK_OOK)),
GetGuidData(DATA_OOK_OOK).ToString().c_str());
if (hozenSlain >= 40 && GetBossState(DATA_OOK_OOK) != DONE)
{
events.CancelEvent(1);
// SONDE TEMPORAIRE
TC_LOG_ERROR("misc", "SSBDBG SEUIL ATTEINT, recherche de la creature Ook-Ook");
if (!instance->GetCreature(GetGuidData(DATA_OOK_OOK)))
TC_LOG_ERROR("misc", "SSBDBG ECHEC : Ook-Ook INTROUVABLE sur la carte");
if (Creature* ookOok = instance->GetCreature(GetGuidData(DATA_OOK_OOK)))
{
// SONDE TEMPORAIRE
TC_LOG_ERROR("misc", "SSBDBG Ook-Ook trouve, vivant=%u, appel DoAction(0)",
uint32(ookOok->IsAlive()));
SetBossState(DATA_OOK_OOK, SPECIAL);
ookOok->AI()->DoAction(0);