Brasserie : ligne de vue refusee a bout portant dans l arene d Ook-Ook
Signale en jeu : « Paume du tigre » et les autres attaques de melee refusees sur Ook-Ook avec « cible hors du champ de vision ». Meme defaut qu au Temple du Serpent de jade juste au-dessus. MESURE PAR SONDE. Sur 17 echecs releves, 13 sont LEGITIMES : Ook-Ook depuis son perchoir (Z ~161,8, sol a 162,63) vers un joueur dans l arene (Z ~147), a 23-26 m -- il y a un plancher entre les deux. Les 2 autres ne le sont pas : Ook-Ook (-756,26 1353,21 146,97) -> joueur a 4,38 m joueur (-757,19 1356,00 147,06) -> Ook-Ook a 2,93 m Les deux extremites reposent sur le sol de l arene, a la meme altitude que le plancher sous leurs pieds, et l echec se produit DANS LES DEUX SENS. A trois metres sur un sol plat, une ligne de vue ne peut pas echouer legitimement. BORNES MESUREES. Tranche d altitude etroite (145-149) : le rez-de- chaussee est un plan unique (Z 146,6 a 147,5 sur 189 spawns), ce qui exclut le perchoir et preserve les 13 echecs legitimes. Rayon de 15 m autour du centre d arene : la repartition des spawns donne 6 creatures a moins de 10 m, AUCUNE entre 10 et 20 m, puis 46 au-dela -- ce vide est le mur de l arene. On s arrete avant les salles voisines pour ne pas laisser les monstres se voir a travers les cloisons. RESERVE ASSUMEE : deux echecs mesures seulement, la ou le correctif du Temple s appuyait sur trente-neuf. Bornes volontairement serrees. Egalement dans ce lot : - PV du hozen ivre bornes a 1 minimum. La sonde a montre que le calcul etait sain (pvMax=285568 -> 28556) : mon hypothese du zero etait FAUSSE. Le garde reste, mais le cadavre qui frappe n est pas explique. - Sonde CADAVREDBG conservee : elle journalise toute creature infligeant des degats alors qu elle est morte ou a zero PV. Elle attrapera le cas tout seule s il se represente. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1870,6 +1870,61 @@ bool WorldObject::IsWithinLOS(float ox, float oy, float oz, VMAP::ModelIgnoreFla
|
||||
return true;
|
||||
}
|
||||
|
||||
// SylvaniaCore : l'arene d'Ook-Ook, a la Brasserie brune d'Orage
|
||||
// (carte 961), a des donnees de collision fautives -- meme defaut
|
||||
// qu'au Temple du Serpent de jade juste au-dessus.
|
||||
//
|
||||
// SIGNALE EN JEU : « Paume du tigre » et les autres attaques de
|
||||
// melee refusees sur Ook-Ook avec « cible hors du champ de
|
||||
// vision ».
|
||||
//
|
||||
// MESURE FAITE PAR UNE SONDE POSEE ICI MEME. Sur 17 echecs
|
||||
// releves, 13 sont LEGITIMES : Ook-Ook depuis son perchoir
|
||||
// (Z ~161,8, sol a 162,63) vers un joueur dans l'arene (Z ~147),
|
||||
// a 23-26 m -- il y a un plancher entre les deux.
|
||||
//
|
||||
// Les 2 autres ne le sont pas :
|
||||
// Ook-Ook (-756,26 1353,21 146,97) -> joueur a 4,38 m
|
||||
// joueur (-757,19 1356,00 147,06) -> Ook-Ook a 2,93 m
|
||||
// Les deux extremites reposent sur le sol de l'arene, a la meme
|
||||
// altitude que le plancher sous leurs pieds, et l'echec se produit
|
||||
// DANS LES DEUX SENS. A trois metres sur un sol plat, une ligne de
|
||||
// vue ne peut pas echouer legitimement.
|
||||
//
|
||||
// BORNES. Le rez-de-chaussee de la Brasserie est un plan unique
|
||||
// (Z 146,6 a 147,5 sur 189 spawns autour de l'arene), on garde donc
|
||||
// une tranche d'altitude etroite : cela exclut le perchoir et
|
||||
// preserve les 13 echecs legitimes. Horizontalement, la repartition
|
||||
// des spawns donne une frontiere mesuree : 6 creatures a moins de
|
||||
// 10 m du centre, AUCUNE entre 10 et 20 m, puis 46 au-dela. Ce vide
|
||||
// est le mur de l'arene ; on s'arrete a 15 m, avant les salles
|
||||
// voisines, pour ne pas laisser les monstres se voir a travers les
|
||||
// cloisons.
|
||||
//
|
||||
// RESERVE ASSUMEE : deux echecs mesures seulement, la ou le
|
||||
// correctif du Temple s'appuyait sur trente-neuf. Les bornes sont
|
||||
// donc volontairement serrees. Si des attaques restent refusees
|
||||
// ailleurs dans le donjon, il faudra reposer une sonde plutot
|
||||
// qu'elargir a l'aveugle.
|
||||
//
|
||||
// A retirer si les cartes de collision de la carte 961 sont un jour
|
||||
// re-extraites correctement.
|
||||
if (!resultat && GetMapId() == 961)
|
||||
{
|
||||
auto dansLArene = [](float px, float py, float pz)
|
||||
{
|
||||
if (pz < 145.0f || pz > 149.0f)
|
||||
return false;
|
||||
|
||||
float const dx = px - (-755.68f);
|
||||
float const dy = py - 1351.83f;
|
||||
return (dx * dx + dy * dy) <= (15.0f * 15.0f);
|
||||
};
|
||||
|
||||
if (dansLArene(x, y, z) && dansLArene(ox, oy, oz))
|
||||
return true;
|
||||
}
|
||||
|
||||
return resultat;
|
||||
}
|
||||
|
||||
|
||||
@@ -756,6 +756,19 @@ uint32 Unit::DealDamage(Unit* victim, uint32 damage, CleanDamage const* cleanDam
|
||||
damage = 0;
|
||||
}
|
||||
|
||||
// SONDE TEMPORAIRE - signale en jeu : « un cadavre bagarreur hozen
|
||||
// ivre m'attaque ». On journalise toute creature qui inflige des
|
||||
// degats alors qu'elle est morte ou a zero point de vie. Cas rare par
|
||||
// construction : le journal ne peut pas etre noye.
|
||||
if (damage && GetTypeId() == TYPEID_UNIT && (!IsAlive() || GetHealth() == 0))
|
||||
{
|
||||
TC_LOG_ERROR("misc",
|
||||
"CADAVREDBG %s (entree %u, carte %u) frappe pour %u | vivant=%u pv=%u/%u | victime=%s",
|
||||
GetName().c_str(), GetEntry(), GetMapId(), damage,
|
||||
uint32(IsAlive() ? 1 : 0), uint32(GetHealth()), uint32(GetMaxHealth()),
|
||||
victim ? victim->GetName().c_str() : "?");
|
||||
}
|
||||
|
||||
if (victim->IsAIEnabled)
|
||||
victim->GetAI()->DamageTaken(this, damage);
|
||||
|
||||
|
||||
@@ -187,10 +187,26 @@ public:
|
||||
break;
|
||||
}
|
||||
case NPC_DRUNKEN_HOZEN_BRAWLER:
|
||||
{
|
||||
creature->setRegeneratingHealth(false);
|
||||
creature->SetHealth((uint32)creature->GetMaxHealth() * 0.1f);
|
||||
|
||||
// SylvaniaCore : le calcul pouvait deposer la creature a
|
||||
// ZERO point de vie si le maximum n'etait pas encore
|
||||
// renseigne a cet instant. Une creature vivante a 0 PV
|
||||
// s'affiche comme un cadavre chez le client tout en
|
||||
// continuant de frapper. On garantit au minimum 1.
|
||||
uint32 const pvMax = creature->GetMaxHealth();
|
||||
uint32 const pvPose = std::max<uint32>(1, uint32(pvMax * 0.1f));
|
||||
|
||||
// SONDE TEMPORAIRE
|
||||
TC_LOG_ERROR("misc",
|
||||
"CADAVREDBG creation hozen ivre : pvMax=%u -> pvPose=%u",
|
||||
pvMax, pvPose);
|
||||
|
||||
creature->SetHealth(pvPose);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void OnUnitDeath(Unit* unit) override
|
||||
|
||||
Reference in New Issue
Block a user