Raids : coffre de butin detruit avec le boss, Alysrazor dans la lave, Oondasta intouchable

Trois signalements Discord du meme joueur.

Coffres : WorldObject::SummonGameObject rattachait TOUT objet invoque a son
invocateur. Les objets rattaches sont detruits avec lui (RemoveAllGameObjects
au retrait du monde), donc le coffre d un boss disparaissait cote serveur des
que le cadavre s effacait : le raid voyait encore le coffre mais ne pouvait
plus l ouvrir. Cas signale : le Coffre du seigneur du feu de Ragnaros, mais
tous les boss qui invoquent leur coffre etaient concernes. Les coffres ne sont
plus rattaches.

Alysrazor : elle meurt en vol et JustDied enchainait directement sur MoveFall.
Au-dessus du vide entre les plateformes, la depouille finissait dans la lave,
butin compris. Elle est ramenee au centre de l arene avant la chute.

Oondasta : l intro pose UNIT_FLAG_IMMUNE_TO_PC et seul l evenement de fin la
retire. Reset() reposait ce drapeau et effacait les evenements d intro a chaque
evade, sans garantie de rejouer l intro : le boss frappait les joueurs sans
qu ils puissent riposter. Le drapeau n est plus repose apres coup, il est leve
des l entree en combat, et _introEnd est enfin initialise (il ne l etait pas).
This commit is contained in:
BlaMacfly
2026-09-12 10:17:32 +02:00
parent 5f430f0510
commit e0e0ba1250
3 changed files with 21 additions and 4 deletions
+5 -1
View File
@@ -2777,7 +2777,11 @@ GameObject* WorldObject::SummonGameObject(uint32 entry, Position const& pos, Qua
go->SetVisibleBySummonerOnly(visibleBySummonerOnly);
go->SetRespawnTime(respawnTime);
if (GetTypeId() == TYPEID_PLAYER || GetTypeId() == TYPEID_UNIT) //not sure how to handle this
// Un coffre de butin ne doit pas etre rattache a son invocateur : les objets
// rattaches sont detruits avec lui (RemoveAllGameObjects), donc le coffre d'un
// boss disparaissait cote serveur des que son cadavre s'effacait -- le raid
// voyait encore le coffre mais ne pouvait plus l'ouvrir (Ragnaros, entre autres).
if ((GetTypeId() == TYPEID_PLAYER || GetTypeId() == TYPEID_UNIT) && goinfo->type != GAMEOBJECT_TYPE_CHEST)
ToUnit()->AddGameObject(go);
else
go->SetSpawnedByDefault(false);
@@ -539,6 +539,10 @@ class boss_alysrazor : public CreatureScript
RemoveEncounterAuras();
me->SetCanFly(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->GetMotionMaster()->MoveFall();
}
@@ -70,7 +70,7 @@ class boss_oondasta : public CreatureScript
struct boss_oondastaAI : public ScriptedAI
{
boss_oondastaAI(Creature* creature) : ScriptedAI(creature), summons(me) { }
boss_oondastaAI(Creature* creature) : ScriptedAI(creature), summons(me), _introEnd(false) { }
EventMap _events;
EventMap _introEvents;
@@ -85,8 +85,10 @@ class boss_oondasta : public CreatureScript
void Reset() override
{
_introEnd = false;
// _introEnd n'est volontairement plus remis a false ici : chaque evade
// reposait UNIT_FLAG_IMMUNE_TO_PC et effacait les evenements d'intro, si
// bien que le boss redevenait intouchable pour de bon -- il frappait les
// joueurs sans qu'ils puissent riposter.
me->RemoveAurasDueToSpell(SPELL_CRUSH);
me->RemoveAura(SPELL_GROWING_FURY);
@@ -119,6 +121,13 @@ class boss_oondasta : public CreatureScript
void EnterCombat(Unit* /*who*/) override
{
// Filet de securite : un boss qui frappe doit pouvoir etre frappe.
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC))
{
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
_introEnd = true;
}
_events.ScheduleEvent(EVENT_SPIRITFIRE_BEAM, 15s);
_events.ScheduleEvent(EVENT_PIERCING_ROAR, 20s);
_events.ScheduleEvent(EVENT_FRILL_BLAST, 40s);