void DamageTaken(Unit* /*attacker*/, uint32 & damage)
        {
            if (isInMountedGauntlet())
            {
                npc_mounted_championAI::DamageTaken(NULL, damage);
                return;
            }

            if(defeated)
            {
                damage = 0;
                return;
            }

            // Prevent damage from finishing hit and mark creature as defeated
            if(damage >= me->GetHealth())
            {
                damage = 0;
                defeated = true;
                me->SetUnitMovementFlags(MOVEMENTFLAG_WALKING);
                me->GetMotionMaster()->MovePoint(1, me->GetHomePosition());
                me->SetTarget(0);
                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
                BindPlayersToInstance(me);
            }
        }
Exemplo n.º 2
0
        void SetData(uint32 type, uint32 data)
        {
            switch (type)
            {
                case DATA_MOVEMENT_DONE:
                    movementDone = data;
                    if (movementDone == 3)
                    {
                        if (Creature* announcer = instance->GetCreature(announcerGUID))
                            announcer->AI()->SetData(DATA_IN_POSITION, 0);
                    }
                    break;
                case BOSS_GRAND_CHAMPIONS:
                    m_auiEncounter[0] = data;
                    if (data == IN_PROGRESS)
                    {
                        for (std::list<uint64>::const_iterator itr = vehicleList.begin(); itr != vehicleList.end(); ++itr)
                            if (Creature* summon = instance->GetCreature(*itr))
                                summon->RemoveFromWorld();
                    }
                    else if (data == DONE)
                    {
                        ++grandChampionsDeaths;
                        if (grandChampionsDeaths >= 3)
                        {
                            for (uint8 i = 0; i < 3; ++i)
                                if (Creature* GrandChampion = instance->GetCreature(GetData64(DATA_GRAND_CHAMPION_1 + i)))
                                    GrandChampion->AI()->SetData(11, 0);

                            if (Creature* announcer = instance->GetCreature(announcerGUID))
                            {
                                m_auiEncounter[0] = data;
                                announcer->GetMotionMaster()->MovePoint(0, 748.309f, 619.487f, 411.171f);
                                announcer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
                                announcer->SummonGameObject(instance->IsHeroic() ? GO_CHAMPIONS_LOOT_H : GO_CHAMPIONS_LOOT, 746.59f, 618.49f, 411.09f, 1.42f, 0, 0, 0, 0, 90000000);
                                BindPlayersToInstance(announcer);
                            }
                        }
                    }
                    break;
                case DATA_ARGENT_SOLDIER_DEFEATED:
                    argentSoldierDeaths = data;
                    if (argentSoldierDeaths == 9)
                    {
                        if (Creature* boss = instance->GetCreature(argentChampionGUID))
                        {
                            boss->GetMotionMaster()->MovePoint(0, 746.88f, 618.74f, 411.06f);
                            boss->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_NON_ATTACKABLE);
                            boss->SetReactState(REACT_AGGRESSIVE);
                            boss->setFaction(16);
                        }
                    }
                    break;
                case BOSS_ARGENT_CHALLENGE_E:
                    m_auiEncounter[1] = data;
                    if (data == IN_PROGRESS)
                    {
                        for (std::list<uint64>::const_iterator itr = vehicleList.begin(); itr != vehicleList.end(); ++itr)
                            if (Creature* summon = instance->GetCreature(*itr))
                                summon->RemoveFromWorld();
                    }
                    else if (data == DONE)
                    {
                        if (Creature* announcer = instance->GetCreature(announcerGUID))
                        {
                            announcer->GetMotionMaster()->MovePoint(0, 748.309f, 619.487f, 411.171f);
                            announcer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
                            announcer->SummonGameObject(instance->IsHeroic() ? GO_EADRIC_LOOT_H : GO_EADRIC_LOOT, 746.59f, 618.49f, 411.09f, 1.42f, 0, 0, 0, 0, 90000000);
                            BindPlayersToInstance(announcer);
                        }
                    }
                    break;
                case BOSS_ARGENT_CHALLENGE_P:
                    m_auiEncounter[2] = data;
                    if (data == IN_PROGRESS)
                    {
                        for (std::list<uint64>::const_iterator itr = vehicleList.begin(); itr != vehicleList.end(); ++itr)
                            if (Creature* summon = instance->GetCreature(*itr))
                                summon->RemoveFromWorld();
                    }
                    else if (data == DONE)
                    {
                        if (Creature* announcer = instance->GetCreature(announcerGUID))
                        {
                            announcer->GetMotionMaster()->MovePoint(0, 748.309f, 619.487f, 411.171f);
                            announcer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
                            announcer->SummonGameObject(instance->IsHeroic() ? GO_PALETRESS_LOOT_H : GO_PALETRESS_LOOT, 746.59f, 618.49f, 411.09f, 1.42f, 0, 0, 0, 0, 90000000);
                            BindPlayersToInstance(announcer);
                        }
                    }
                    break;
                case BOSS_BLACK_KNIGHT:
                    m_auiEncounter[3] = data;
                    break;
            }

            if (data == DONE)
                SaveToDB();
        }