azerothcore / azerothcore-wotlk

Complete Open Source and Modular solution for MMO
http://www.azerothcore.org
GNU Affero General Public License v3.0
6.45k stars 2.59k forks source link

Black Temple - Illidan Stormrage leaves combat #9038

Closed Ravenguard13 closed 3 weeks ago

Ravenguard13 commented 2 years ago

Current Behaviour

1 - during the fight, Illidan never changed into his demon form 2 - at final phase of fight, when Illidan Stormrage casts Shadow Prison ( https://wotlkdb.com/?spell=40647 ), he leaves the combat, restores all health. Can't be beaten.

Expected Blizzlike Behaviour

After Illidan casts the cage, he should still be there, then Maev Shadowsong shows up and the fight continues

As shown in video below:

Source

https://youtu.be/0Gbd_9w-Drw 2:17

Steps to reproduce the problem

1 - kill all the bosses, get to Illidan floor 2 - talk to Akama to start a fight 3 - hit him till phase 4

Extra Notes

Problem with shadow prison needs to be doubleckecked more. I had this problem in a raid group, but when I went there solo, everything was fine.

AC rev. hash/commit

https://github.com/azerothcore/azerothcore-wotlk/commit/d35c6b602234dfc313066a2de9db74eb97798c75

Operating system

Debian 10 x64

Custom changes or Modules

No response

kissingers commented 2 years ago

I test it today and it still doesn't look like it's fixed, can this bug be fixed?

frizar commented 2 years ago

still broken and unplayable

heyitsbench commented 2 years ago

@frizar, a better way to say what you said would be "Still not working as of commit [commit you're using]". Going to three separate issues and saying "Not fixed yet" doesn't do almost anything.

Fireevil commented 2 years ago

this error still continues in the new revision I already tested it and it is still a bug

heyitsbench commented 2 years ago

this error still continues in the new revision I already tested it and it is still a bug

Please give the actual commit you've compiled with. Saying "new revision" doesn't mean anything.

kissingers commented 2 years ago

Disengagement because this code: me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); As soon as move to the last line of this judgment (originally in the third line), it almost never get out of the battle, I fix this myself,but not the final solution: case EVENT_PHASE_5_START: if (me->HealthBelowPct(20)) { me->CastSpell(me, SPELL_SHADOW_PRISON, true); me->SendMeleeAttackStop(me->GetVictim()); Talk(SAY_ILLIDAN_MAIEV1); events.Reset(); events.ScheduleEvent(EVENT_PHASE_5_SCENE1, 9000); events.ScheduleEvent(EVENT_PHASE_5_SCENE2, 18000); events.ScheduleEvent(EVENT_PHASE_5_SCENE3, 24000); events.ScheduleEvent(EVENT_PHASE_5_SCENE4, 27000); events.ScheduleEvent(EVENT_PHASE_5_SCENE5, 30000); _me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NONATTACKABLE); break;

Dr-Arayashiki commented 1 year ago

Disengagement because this code: me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); As soon as move to the last line of this judgment (originally in the third line), it almost never get out of the battle, I fix this myself,but not the final solution: case EVENT_PHASE_5_START: if (me->HealthBelowPct(20)) { me->CastSpell(me, SPELL_SHADOW_PRISON, true); me->SendMeleeAttackStop(me->GetVictim()); Talk(SAY_ILLIDAN_MAIEV1); events.Reset(); events.ScheduleEvent(EVENT_PHASE_5_SCENE1, 9000); events.ScheduleEvent(EVENT_PHASE_5_SCENE2, 18000); events.ScheduleEvent(EVENT_PHASE_5_SCENE3, 24000); events.ScheduleEvent(EVENT_PHASE_5_SCENE4, 27000); events.ScheduleEvent(EVENT_PHASE_5_SCENE5, 30000); _me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NONATTACKABLE); break;

the interesting thing is that if you remove the me->CastSpell(me, SPELL_SHADOW_PRISON, true); the boss does not reset and Maieve is summoned normally.... however it would be wrong as he must cast the Shadow Prison spell

kissingers commented 1 year ago

Disengagement because this code: me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); As soon as move to the last line of this judgment (originally in the third line), it almost never get out of the battle, I fix this myself,but not the final solution: case EVENT_PHASE_5_START: if (me->HealthBelowPct(20)) { me->CastSpell(me, SPELL_SHADOW_PRISON, true); me->SendMeleeAttackStop(me->GetVictim()); Talk(SAY_ILLIDAN_MAIEV1); events.Reset(); events.ScheduleEvent(EVENT_PHASE_5_SCENE1, 9000); events.ScheduleEvent(EVENT_PHASE_5_SCENE2, 18000); events.ScheduleEvent(EVENT_PHASE_5_SCENE3, 24000); events.ScheduleEvent(EVENT_PHASE_5_SCENE4, 27000); events.ScheduleEvent(EVENT_PHASE_5_SCENE5, 30000); _me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NONATTACKABLE); break;

the interesting thing is that if you remove the me->CastSpell(me, SPELL_SHADOW_PRISON, true); the boss does not reset and Maieve is summoned normally.... however it would be wrong as he must cast the Shadow Prison spell

Yes, 2 mouth before, I move me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); to laster line, it's almost ok, but 2 mouth ago, it also can not work, only delete me->CastSpell(me, SPELL_SHADOW_PRISON, true) can. so I have to delete total phase 5 now. So 2 mouth ago something changed the me->CastSpell(me, SPELL_SHADOW_PRISON, true)

kissingers commented 1 year ago

So I think if it can be fixed such as Archimonde, It is work for Archimonde out of combat. https://github.com/azerothcore/azerothcore-wotlk/pull/15128/commits/3f9c8a889ffb3866bcadb3236dc85662385511f8

reset add REACT_AGGRESSIVE. also need add RemoveUnitFlag , if not add , if recombit, the boss can not select.

    void Reset() override
    {
        BossAI::Reset();
        events2.Reset();
        me->SetReactState(REACT_AGGRESSIVE);
        me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
        me->SetDisableGravity(false);
        me->CastSpell(me, SPELL_DUAL_WIELD, true);
        me->LoadEquipment(0, true);
        me->SetImmuneToAll(true);
        beamPosId = urand(0, 3);
    }

add REACT_PASSIVE. Here need SetReactState(REACT_PASSIVE) add after SPELL_SHADOW_PRISON, if add before, sometimes at raid group the server will crash, but one player test will not crash. so I think me->CastSpell(me, SPELL_SHADOW_PRISON, true) AI have some problem.

            case EVENT_PHASE_5_START:
                if (me->HealthBelowPct(30))
                {
                    me->CastSpell(me, SPELL_SHADOW_PRISON, true);
                    me->SetReactState(REACT_PASSIVE);
                    me->SendMeleeAttackStop(me->GetVictim());
                    me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
                    Talk(SAY_ILLIDAN_MAIEV1);
                    events.Reset();
                    events.ScheduleEvent(EVENT_PHASE_5_SCENE1, 9000);
                    events.ScheduleEvent(EVENT_PHASE_5_SCENE2, 18000);
                    events.ScheduleEvent(EVENT_PHASE_5_SCENE3, 24000);
                    events.ScheduleEvent(EVENT_PHASE_5_SCENE4, 27000);
                    events.ScheduleEvent(EVENT_PHASE_5_SCENE5, 30000);
                    break;
                }

finish phash 5, if not add REACT_AGGRESSIVE, all player died ,the MAIEV will fight never out of combit(test use gm on after phase 5)

            case EVENT_PHASE_5_SCENE5:
                me->SetTarget(me->GetVictim()->GetGUID());
                me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
                me->SetReactState(REACT_AGGRESSIVE);

after kill the boss, all player will not out of combit, if kill akama self, will ok,so add akama->KillSelf();

                if (Creature* akama = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_AKAMA)))
                {
                    akama->AI()->DoAction(ACTION_ILLIDAN_DEAD);
                    akama->SetTarget(me->GetGUID());
                    akama->GetMotionMaster()->MovePoint(0, 695.63f, 306.63f, 354.26f);
                    akama->KillSelf();
                }

It ok!!!

image

kissingers commented 1 year ago

I dont know how to push a fix request, so who can do it?

Dr-Arayashiki commented 1 year ago

I dont know how to push a fix request, so who can do it?

If you want, you can send me the cpp file that you fixed, I'll see how it's working and post the correction (if it's working correctly). I give the credits to you. But first of all, test this fix in every possible way to make sure everything is working fine. By the way, there are more things wrong with this boss... I even suggest fixing something else that has a problem at once ๐Ÿ˜„

kissingers commented 1 year ago

boss_illidan.zip

kissingers commented 1 year ago

IF there is any boss cast spell between me->SetReactState(REACT_PASSIVE); and me->SetReactState(REACT_AGGRESSIVE); the server might crash. but not always. one player test will never crash. 25 player sometime will crash. are there any bug with the states? So I change the 2 line location, and only pervert boss out of combit.

kissingers commented 1 year ago

illidan crash.zip

AnchyDev commented 1 year ago

illidan crash.zip

Please use gist if you are going to share logs or source files.

kissingers commented 1 year ago

Here can't use gist , replace with pastebin https://pastebin.com/bkkNBgZ8

crash condition: me->SetReactState(REACT_PASSIVE); add before SPELL_SHADOW_PRISON and me->SetReactState(REACT_AGGRESSIVE); add after finish SPELL_SHADOW_PRISON.

        case EVENT_PHASE_5_START:
            if (me->HealthBelowPct(30))
            {
                me->SetReactState(REACT_PASSIVE);
                me->CastSpell(me, SPELL_SHADOW_PRISON, true);
                me->SendMeleeAttackStop(me->GetVictim());
                me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
                Talk(SAY_ILLIDAN_MAIEV1);
                events.Reset();
                events.ScheduleEvent(EVENT_PHASE_5_SCENE1, 9000);
                events.ScheduleEvent(EVENT_PHASE_5_SCENE2, 18000);
                events.ScheduleEvent(EVENT_PHASE_5_SCENE3, 24000);
                events.ScheduleEvent(EVENT_PHASE_5_SCENE4, 27000);
                events.ScheduleEvent(EVENT_PHASE_5_SCENE5, 30000);
                break;
            }

        case EVENT_PHASE_5_SCENE5:
            me->SetTarget(me->GetVictim()->GetGUID());
            me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
            me->SetReactState(REACT_AGGRESSIVE);

if add after me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); and before me->CastSpell(me, SPELL_SUMMON_MAIEV, true); no crash till now.

image

kissingers commented 1 year ago

after this self fix never out of combat \ reset boss can not attack \ can not dialogue akama \ after kill boss, can not out ouf combat \server crash

boss_illidan.zip

Dr-Arayashiki commented 1 year ago

Here can't use gist , replace with pastebin https://pastebin.com/bkkNBgZ8

crash condition: me->SetReactState(REACT_PASSIVE); add before SPELL_SHADOW_PRISON and me->SetReactState(REACT_AGGRESSIVE); add after finish SPELL_SHADOW_PRISON.

        case EVENT_PHASE_5_START:
            if (me->HealthBelowPct(30))
            {
                me->SetReactState(REACT_PASSIVE);
                me->CastSpell(me, SPELL_SHADOW_PRISON, true);
                me->SendMeleeAttackStop(me->GetVictim());
                me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
                Talk(SAY_ILLIDAN_MAIEV1);
                events.Reset();
                events.ScheduleEvent(EVENT_PHASE_5_SCENE1, 9000);
                events.ScheduleEvent(EVENT_PHASE_5_SCENE2, 18000);
                events.ScheduleEvent(EVENT_PHASE_5_SCENE3, 24000);
                events.ScheduleEvent(EVENT_PHASE_5_SCENE4, 27000);
                events.ScheduleEvent(EVENT_PHASE_5_SCENE5, 30000);
                break;
            }

        case EVENT_PHASE_5_SCENE5:
            me->SetTarget(me->GetVictim()->GetGUID());
            me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
            me->SetReactState(REACT_AGGRESSIVE);

if add after me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); and before me->CastSpell(me, SPELL_SUMMON_MAIEV, true); no crash till now.

image

I see, what you posted gave me direction and it worked, the boss is no longer resetting. I'm going to take advantage and solve the problem that the boss has to fly and doesn't fly. After finishing everything, part of the credit goes to you :)

NOTE: As far as I've seen, you don't need me->SetReactState(REACT_PASSIVE); . Just leave the me->SetReactState(REACT_AGGRESSIVE); in case EVENT_PHASE_5_SCENE1:

Dr-Arayashiki commented 1 year ago

@kissingers this boss's problems are already being solved, and there are a few more besides those mentioned here. I'll check them all at once so I don't have to open pulls all the time. You are to be congratulated, thanks to your code I managed to discover a few more bugs besides the current one ๐Ÿ˜„

kissingers commented 1 year ago

Thanks for your fix work, but I try test sometimes, it seems not same as you test.

If only add me->SetReactState(REACT_AGGRESSIVE) in case EVENT_PHASE_5_SCENE1: will out of combit. and if only add me->SetReactState(REACT_AGGRESSIVE); after me->CastSpell(me, SPELL_SHADOW_PRISON, true); sometimes out of combit.

only me->SetReactState(REACT_PASSIVE) add after me->CastSpell(me, SPELL_SHADOW_PRISON, true); and add me->SetReactState(REACT_AGGRESSIVE) in case EVENT_PHASE_5_SCENE1 will all times ok.

Dr-Arayashiki commented 1 year ago

Thanks for your fix work, but I try test sometimes, it seems not same as you test.

If only add me->SetReactState(REACT_AGGRESSIVE) in case EVENT_PHASE_5_SCENE1: will out of combit. and if only add me->SetReactState(REACT_AGGRESSIVE); after me->CastSpell(me, SPELL_SHADOW_PRISON, true); sometimes out of combit.

only me->SetReactState(REACT_PASSIVE) add after me->CastSpell(me, SPELL_SHADOW_PRISON, true); and add me->SetReactState(REACT_AGGRESSIVE) in case EVENT_PHASE_5_SCENE1 will all times ok.

correct, rest assured because we also discovered that there is the question of the probability of the boss resetting and not resetting. We are already investigating here ๐Ÿ˜„

Dr-Arayashiki commented 1 year ago

@kissingers image for now, put it like this and test

kissingers commented 1 year ago

@kissingers ๅ›พๅƒ ็Žฐๅœจ๏ผŒๅƒ่ฟ™ๆ ทๆ”พ็ฝฎๅนถๆต‹่ฏ•

test false. after finish SPELL_SHADOW_PRISON , then use .gm on simulation all player died, the boss will still fight with maiev never finished.

So must SetReactState(REACT_AGGRESSIVE) before all player died. set at EVENT_PHASE_5_SCENE1 is good point.

ghost commented 1 year ago

image @kissingers @Dr-Arayashiki this works well. Another 2 problems:

  1. Parasitic Shadowfiend(ID:23498) start attack immediately, players have no time to kill them
  2. In phase 2, when Illidan flied, player cast spell "Divine Shield"(ID: 642), boss will reset directly...
kissingers commented 1 year ago

image @kissingers @Dr-Arayashiki this works well. Another 2 problems:

  1. Parasitic Shadowfiend(ID:23498) start attack immediately, players have no time to kill them
  2. In phase 2, when Illidan flied, player cast spell "Divine Shield"(ID: 642), boss will reset directly...

1 only less then 4 player will happen, more than 4 will never happen, and the player can not move else will more Shadowfiend to himself. 2 also lonly 1 player can test

kissingers commented 1 year ago

there are still some problem, so I have to change link this: immediate me->CastSpell(me, SPELL_SUMMON_MAIEV, true); after me->CastSpell(me, SPELL_SHADOW_PRISON, true); then me->SetReactState(REACT_PASSIVE); otherwise the boss have a very low times out of combit after 9 second before SUMMON_MAIEV

phase5 31 second, then me->SetReactState(REACT_AGGRESSIVE) add after phase5, and also replace me->SetTarget(me->GetVictim()->GetGUID(); to DoMeleeAttackIfReady(); because when SHADOW_PRISON the tank died in fire, me->SetTarget(me->GetVictim()->GetGUID() will case the server crash

           case EVENT_PHASE_5_START:
                if (me->HealthBelowPct(30))
                {
                    me->SendMeleeAttackStop(me->GetVictim());
                    me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
                    me->CastSpell(me, SPELL_SHADOW_PRISON, true);

me->CastSpell(me, SPELL_SUMMON_MAIEV, true); me->SetReactState(REACT_PASSIVE);

                    Talk(SAY_ILLIDAN_MAIEV1);
                    events.Reset();
                    events.ScheduleEvent(EVENT_PHASE_5_SCENE1, 9000);
                    events.ScheduleEvent(EVENT_PHASE_5_SCENE2, 18000);
                    events.ScheduleEvent(EVENT_PHASE_5_SCENE3, 24000);
                    events.ScheduleEvent(EVENT_PHASE_5_SCENE4, 27000);
                    events.ScheduleEvent(EVENT_PHASE_5_SCENE5, 31000);
                    break;
                }
                events.ScheduleEvent(EVENT_PHASE_5_START, 1000);
                break;
            case EVENT_PHASE_5_SCENE1:
                break;
            case EVENT_PHASE_5_SCENE2:
                Talk(SAY_ILLIDAN_MAIEV2);
                break;
            case EVENT_PHASE_5_SCENE3:
                if (Creature* maiev = summons.GetCreatureWithEntry(NPC_MAIEV_SHADOWSONG))
                    maiev->AI()->Talk(SAY_MAIEV_SHADOWSONG_ILLIDAN2);
                break;
            case EVENT_PHASE_5_SCENE4:
                if (Creature* maiev = summons.GetCreatureWithEntry(NPC_MAIEV_SHADOWSONG))
                    maiev->HandleEmoteCommand(EMOTE_ONESHOT_ROAR);
                break;
            case EVENT_PHASE_5_SCENE5:

me->SetReactState(REACT_AGGRESSIVE); //me->SetTarget(me->GetVictim()->GetGUID()); DoMeleeAttackIfReady();

                me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
                if (Creature* maiev = summons.GetCreatureWithEntry(NPC_MAIEV_SHADOWSONG))
                {
                    maiev->SetReactState(REACT_AGGRESSIVE);
                    maiev->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE);
                    maiev->AI()->AttackStart(me);
                }
                ScheduleNormalEvents(5);
                break;
Dr-Arayashiki commented 1 year ago

This boss has some problems, although we have given some solutions, but at least now you can kill him, before you couldn't even kill him because he was restarting. It's that thing.... you have to go through the squeegee with Ymir anyway hahaha

image @kissingers @Dr-Arayashiki this works well. Another 2 problems:

  1. Parasitic Shadowfiend(ID:23498) start attack immediately, players have no time to kill them
  2. In phase 2, when Illidan flied, player cast spell "Divine Shield"(ID: 642), boss will reset directly...

This boss has some problems, although we have given some solutions, but at least now you can kill him, before you couldn't even kill him because he was restarting. It's that thing.... you have to go through the squeegee with Ymir anyway hahaha ๐Ÿ˜ƒ

But speaking specifically about these issues.... it's a boss that you have to test with at least 5 people to clarify some things. When testing alone, any ability that makes him immune will likely reset the boss as he won't have another player to attack, so I don't know if the Divine Shield issue would be a real issue. ๐Ÿ˜ธ

The important thing is that we are fixing it little by little lol ๐Ÿ˜„

NostraDavid commented 6 months ago

For those running via docker-compose: I am using 7.0.0-dev.1 (Last pushed 2 months ago) and the bug is still there.

This comment is purely meant for users trying to figure out if it's been fixed for a certain version or not :)

PS: I am running a multibox with 5 accounts, if that matters. PPS: If you don't kill him fast enough, the Shadowfiends (?) he spawns duplicate until freezing the server and clients. PPPS: After a direct restart of the fight he's not selectable anymore, the Shadowfiends will spawn and lock things up.

kissingers commented 6 months ago

It seems in fixing https://github.com/azerothcore/azerothcore-wotlk/pull/18601

I do my fix here, just can run and kill the boss https://github.com/azerothcore/azerothcore-wotlk/commit/58aecdceac361a12e59c147120937598112c1d20

Nyeriah commented 3 weeks ago

https://github.com/azerothcore/azerothcore-wotlk/pull/19574