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;
|
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;
|
return resultat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -756,6 +756,19 @@ uint32 Unit::DealDamage(Unit* victim, uint32 damage, CleanDamage const* cleanDam
|
|||||||
damage = 0;
|
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)
|
if (victim->IsAIEnabled)
|
||||||
victim->GetAI()->DamageTaken(this, damage);
|
victim->GetAI()->DamageTaken(this, damage);
|
||||||
|
|
||||||
|
|||||||
@@ -187,10 +187,26 @@ public:
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case NPC_DRUNKEN_HOZEN_BRAWLER:
|
case NPC_DRUNKEN_HOZEN_BRAWLER:
|
||||||
|
{
|
||||||
creature->setRegeneratingHealth(false);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnUnitDeath(Unit* unit) override
|
void OnUnitDeath(Unit* unit) override
|
||||||
|
|||||||
Reference in New Issue
Block a user