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:
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user