Terres de feu et Zul Aman : trois blocages signales en jeu
Nalorakk restait plante au-dessus de son escalier apres la deuxieme vague. Le trajet entre deux paliers grimpe une structure VMAP (le terrain, lui, reste a z=12,5 sur toute la rampe) ; quand le calcul de chemin cale, le boss s arrete en route et, comme il attend d etre arrive pour enchainer, l evenement ne repart plus. Chaque deplacement est desormais borne a vingt secondes, au-dela le boss est pose d office sur l etape. Alysrazor finissait toujours dans la lave : la ramener dans JustDied arrivait trop tard, la chute etait engagee, et MoveFall vise le terrain (z=48) en traversant la plateforme, qui n est qu une structure VMAP a 55,5. Elle est maintenant posee au centre de l arene AVANT le coup fatal, via DamageTaken, et plus aucune chute n est declenchee. Rhyolith restait bloque en premiere forme a un point de vie. Son UpdateAI sortait sur UpdateVictim avant d avoir teste la bascule en phase 2 -- or les joueurs frappent les pieds et non le colosse, qui se retrouve sans cible. Le passage de phase est teste en premier.
This commit is contained in:
@@ -115,7 +115,7 @@ class boss_nalorakk : public CreatureScript
|
|||||||
{
|
{
|
||||||
boss_nalorakkAI(Creature* creature) : BossAI(creature, DATA_NALORAKK),
|
boss_nalorakkAI(Creature* creature) : BossAI(creature, DATA_NALORAKK),
|
||||||
_bearForm(false), _waveEvent(true), _waveInProgress(false), _inMove(false),
|
_bearForm(false), _waveEvent(true), _waveInProgress(false), _inMove(false),
|
||||||
_wave(0), _currentPoint(0), _targetPoint(0), _checkTimer(0) { }
|
_wave(0), _currentPoint(0), _targetPoint(0), _checkTimer(0), _moveTimeout(0) { }
|
||||||
|
|
||||||
void Reset() override
|
void Reset() override
|
||||||
{
|
{
|
||||||
@@ -134,6 +134,7 @@ class boss_nalorakk : public CreatureScript
|
|||||||
_currentPoint = 0;
|
_currentPoint = 0;
|
||||||
_targetPoint = 0;
|
_targetPoint = 0;
|
||||||
_checkTimer = 0;
|
_checkTimer = 0;
|
||||||
|
_moveTimeout = 0;
|
||||||
_waveGuids.clear();
|
_waveGuids.clear();
|
||||||
|
|
||||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
|
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
|
||||||
@@ -284,13 +285,15 @@ class boss_nalorakk : public CreatureScript
|
|||||||
: (_targetPoint == 8 ? 8 : _targetPoint);
|
: (_targetPoint == 8 ? 8 : _targetPoint);
|
||||||
|
|
||||||
_currentPoint = next;
|
_currentPoint = next;
|
||||||
|
_moveTimeout = 20000;
|
||||||
me->GetMotionMaster()->MovePoint(_currentPoint, NalorakkWay[_currentPoint][0], NalorakkWay[_currentPoint][1], NalorakkWay[_currentPoint][2]);
|
me->GetMotionMaster()->MovePoint(_currentPoint, NalorakkWay[_currentPoint][0], NalorakkWay[_currentPoint][1], NalorakkWay[_currentPoint][2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MovementInform(uint32 type, uint32 id) override
|
// Arrivee a une etape -- soit annoncee par le moteur de deplacement, soit
|
||||||
|
// forcee par le chrono ci-dessous quand la montee se bloque.
|
||||||
|
void OnReachedPoint()
|
||||||
{
|
{
|
||||||
if (!_waveEvent || type != POINT_MOTION_TYPE || !_inMove || _currentPoint != id)
|
_moveTimeout = 0;
|
||||||
return;
|
|
||||||
|
|
||||||
if (_currentPoint == _targetPoint)
|
if (_currentPoint == _targetPoint)
|
||||||
{
|
{
|
||||||
@@ -302,6 +305,14 @@ class boss_nalorakk : public CreatureScript
|
|||||||
AdvanceOnePoint();
|
AdvanceOnePoint();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MovementInform(uint32 type, uint32 id) override
|
||||||
|
{
|
||||||
|
if (!_waveEvent || type != POINT_MOTION_TYPE || !_inMove || _currentPoint != id)
|
||||||
|
return;
|
||||||
|
|
||||||
|
OnReachedPoint();
|
||||||
|
}
|
||||||
|
|
||||||
void EnterCombat(Unit* /*who*/) override
|
void EnterCombat(Unit* /*who*/) override
|
||||||
{
|
{
|
||||||
Talk(SAY_AGGRO);
|
Talk(SAY_AGGRO);
|
||||||
@@ -350,6 +361,21 @@ class boss_nalorakk : public CreatureScript
|
|||||||
|
|
||||||
void UpdateAI(uint32 diff) override
|
void UpdateAI(uint32 diff) override
|
||||||
{
|
{
|
||||||
|
// Le trajet entre deux paliers passe par un escalier bati en VMAP : si le
|
||||||
|
// calcul de chemin cale, le boss reste plante en route et l'evenement ne
|
||||||
|
// repart jamais. Au-dela de vingt secondes on le pose d'office sur l'etape.
|
||||||
|
if (_inMove && _moveTimeout)
|
||||||
|
{
|
||||||
|
if (_moveTimeout <= diff)
|
||||||
|
{
|
||||||
|
me->GetMotionMaster()->Clear(false);
|
||||||
|
me->NearTeleportTo(NalorakkWay[_currentPoint][0], NalorakkWay[_currentPoint][1], NalorakkWay[_currentPoint][2], me->GetOrientation());
|
||||||
|
OnReachedPoint();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
_moveTimeout -= diff;
|
||||||
|
}
|
||||||
|
|
||||||
// Deroulement des vagues : il ne recule qu'une fois la vague abattue.
|
// Deroulement des vagues : il ne recule qu'une fois la vague abattue.
|
||||||
if (_waveInProgress)
|
if (_waveInProgress)
|
||||||
{
|
{
|
||||||
@@ -447,6 +473,7 @@ class boss_nalorakk : public CreatureScript
|
|||||||
uint32 _currentPoint;
|
uint32 _currentPoint;
|
||||||
uint32 _targetPoint;
|
uint32 _targetPoint;
|
||||||
uint32 _checkTimer;
|
uint32 _checkTimer;
|
||||||
|
uint32 _moveTimeout;
|
||||||
std::vector<ObjectGuid> _waveGuids;
|
std::vector<ObjectGuid> _waveGuids;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -532,6 +532,20 @@ class boss_alysrazor : public CreatureScript
|
|||||||
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me);
|
instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Elle meurt en vol. La ramener dans JustDied ne suffisait pas : la chute est
|
||||||
|
// deja engagee et MoveFall vise le terrain (la lave, vers z=48) en traversant
|
||||||
|
// la plateforme, qui n'est qu'une structure VMAP a 55,5. On la pose donc au
|
||||||
|
// centre de l'arene AVANT le coup fatal, et sans declencher de chute.
|
||||||
|
void DamageTaken(Unit* /*attacker*/, uint32& damage) override
|
||||||
|
{
|
||||||
|
if (damage >= me->GetHealth())
|
||||||
|
{
|
||||||
|
me->SetCanFly(false);
|
||||||
|
me->SetDisableGravity(false);
|
||||||
|
me->NearTeleportTo(centerPos.GetPositionX(), centerPos.GetPositionY(), centerPos.GetPositionZ(), centerPos.GetOrientation());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void JustDied(Unit* /*killer*/) override
|
void JustDied(Unit* /*killer*/) override
|
||||||
{
|
{
|
||||||
_JustDied();
|
_JustDied();
|
||||||
@@ -539,11 +553,7 @@ class boss_alysrazor : public CreatureScript
|
|||||||
RemoveEncounterAuras();
|
RemoveEncounterAuras();
|
||||||
me->SetCanFly(false);
|
me->SetCanFly(false);
|
||||||
me->SetDisableGravity(false);
|
me->SetDisableGravity(false);
|
||||||
// Elle meurt en vol : laissee a elle-meme, la depouille traverse le vide
|
|
||||||
// entre les plateformes et finit dans la lave, butin compris. On la ramene
|
|
||||||
// au centre de l'arene avant la chute, comme en jeu officiel.
|
|
||||||
me->NearTeleportTo(centerPos.GetPositionX(), centerPos.GetPositionY(), centerPos.GetPositionZ(), centerPos.GetOrientation());
|
me->NearTeleportTo(centerPos.GetPositionX(), centerPos.GetPositionY(), centerPos.GetPositionZ(), centerPos.GetOrientation());
|
||||||
me->GetMotionMaster()->MoveFall();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void KilledUnit(Unit* who) override
|
void KilledUnit(Unit* who) override
|
||||||
|
|||||||
@@ -300,9 +300,11 @@ class boss_lord_rhyolith : public CreatureScript
|
|||||||
|
|
||||||
void UpdateAI(uint32 diff) override
|
void UpdateAI(uint32 diff) override
|
||||||
{
|
{
|
||||||
if (!UpdateVictim())
|
// Les joueurs frappent les pieds, jamais le colosse lui-meme : il lui
|
||||||
return;
|
// arrive de n'avoir aucune cible, et on sortait alors d'UpdateAI avant
|
||||||
|
// meme d'avoir teste la bascule en phase 2. Le boss restait plante en
|
||||||
|
// premiere forme a un point de vie. Le passage de phase passe donc en
|
||||||
|
// premier, avant toute verification de cible.
|
||||||
if ((instance->GetData(DATA_RHYOLITH_HEALTH_SHARED) != 0))
|
if ((instance->GetData(DATA_RHYOLITH_HEALTH_SHARED) != 0))
|
||||||
me->SetHealth(instance->GetData(DATA_RHYOLITH_HEALTH_SHARED) * 2);
|
me->SetHealth(instance->GetData(DATA_RHYOLITH_HEALTH_SHARED) * 2);
|
||||||
|
|
||||||
@@ -350,6 +352,9 @@ class boss_lord_rhyolith : public CreatureScript
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!UpdateVictim())
|
||||||
|
return;
|
||||||
|
|
||||||
events.Update(diff);
|
events.Update(diff);
|
||||||
|
|
||||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||||
|
|||||||
Reference in New Issue
Block a user