diff options
7 files changed, 516 insertions, 158 deletions
diff --git a/sql/updates/145_world_scripts.sql b/sql/updates/145_world_scripts.sql new file mode 100644 index 00000000000..17704a3daa9 --- /dev/null +++ b/sql/updates/145_world_scripts.sql @@ -0,0 +1,27 @@ +DELETE FROM gameobject_template WHERE `entry` IN (187578, 188173);
+INSERT INTO gameobject_template () VALUES (187578, 10, 4891, 'Scrying Orb', '', 0, 0, 2.16851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'go_movie_orb');
+INSERT INTO gameobject_template () VALUES (188173, 10, 7161, 'Escape to the Isle of Quel\'Danas', '', 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'go_kael_orb');
+
+DELETE FROM spell_script_target WHERE `entry` IN (44320, 44321);
+INSERT INTO spell_script_target () VALUES (44320, 1, 24723);
+INSERT INTO spell_script_target () VALUES (44321, 1, 24723);
+
+UPDATE creature_template SET modelid_A = '17612' WHERE entry = '24745';
+UPDATE creature_template SET modelid_H = '17612' WHERE entry = '24745';
+
+UPDATE `creature_template` SET `minhealth` = '6900' WHERE `entry` = 24675;
+UPDATE `creature_template` SET `maxhealth` = '6900' WHERE `entry` = 24675;
+
+UPDATE `creature_template` SET `minlevel` = '70' WHERE `entry` = 24708;
+UPDATE `creature_template` SET `maxlevel` = '70' WHERE `entry` = 24708;
+
+UPDATE `creature_template` SET `minlevel` = '70' WHERE `entry` = 24666;
+UPDATE `creature_template` SET `maxlevel` = '70' WHERE `entry` = 24666;
+
+UPDATE `creature_template` SET `scale` = '0.5' WHERE `entry` = 24708;
+
+UPDATE `gameobject_template` SET `ScriptName` = 'go_kael_orb' WHERE `entry` = 188173;
+UPDATE `gameobject_template` SET `ScriptName` = 'go_movie_orb' WHERE `entry` = 187578;
+
+update creature_template SET spell1=6474 WHERE entry=22487;
+update creature_template SET spell1=3600 WHERE entry=22486;
\ No newline at end of file diff --git a/src/bindings/scripts/scripts/zone/magisters_terrace/boss_felblood_kaelthas.cpp b/src/bindings/scripts/scripts/zone/magisters_terrace/boss_felblood_kaelthas.cpp index e4efafe4c18..7a44e04dd6d 100644 --- a/src/bindings/scripts/scripts/zone/magisters_terrace/boss_felblood_kaelthas.cpp +++ b/src/bindings/scripts/scripts/zone/magisters_terrace/boss_felblood_kaelthas.cpp @@ -24,6 +24,7 @@ EndScriptData */ #include "precompiled.h" #include "def_magisters_terrace.h" #include "WorldPacket.h" +#include "ObjectMgr.h" /*** Spells ***/ @@ -34,6 +35,7 @@ EndScriptData */ #define SPELL_PHOENIX 44194 // Summons a phoenix (Doesn't work?) #define SPELL_PHOENIX_BURN 44198 // A spell Phoenix uses to damage everything around +#define SPELL_PHOENIX_FIREBALL 44202 // Phoenix casts this in phase 2 and stops moving #define SPELL_FLAMESTRIKE1_NORMAL 44190 // Damage part #define SPELL_FLAMESTRIKE1_HEROIC 46163 // Heroic damage part @@ -81,11 +83,14 @@ EndScriptData */ #define SOUND_DEATH 12421 /** Locations **/ -float KaelLocations[3][2]= +float KaelLocations[6][2]= { - {148.744659, 181.377426}, - {140.823883, 195.403046}, - {156.574188, 195.650482}, + {148.744659, 181.377426},//center + {140.823883, 195.403046},//phoenixpos1 + {156.574188, 195.650482},//phoenixpos2 + {149.813, 160.917},//spherepos1 + {167.223, 173.594},//spherepos2 + {130.68, 173.007},//spherepos3 }; #define LOCATION_Z -16.727455 @@ -142,13 +147,34 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI Phase = 0; if(pInstance) - pInstance->SetData(DATA_KAELTHAS_EVENT, 0); + { + if(m_creature->isDead()) + pInstance->SetData(DATA_KAELTHAS_EVENT, DONE); + else + pInstance->SetData(DATA_KAELTHAS_EVENT, NOT_STARTED); + } } - + + void KilledUnit(Unit* victim) + { + if(victim && (victim->GetTypeId() == TYPEID_PLAYER)) + { + victim->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_FLY); + victim->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_DOT); + WorldPacket data(12); + data.SetOpcode(SMSG_MOVE_UNSET_CAN_FLY); + data.append(victim->GetPackGUID()); + data << uint32(0); + victim->SendMessageToSet(&data, true); + } + } void JustDied(Unit *killer) { + RemoveGravityLapse(); DoYell(SAY_DEATH,LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature,SOUND_DEATH); + if(pInstance) + pInstance->SetData(DATA_KAELTHAS_EVENT, DONE); } void DamageTaken(Unit* done_by, uint32 &damage) @@ -161,6 +187,8 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI { DoYell(SAY_AGGRO,LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature,SOUND_AGGRO); + if(pInstance) + pInstance->SetData(DATA_KAELTHAS_EVENT, IN_PROGRESS); } void SetThreatList(Creature* SummonedUnit) @@ -175,74 +203,100 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI if(pUnit && pUnit->isAlive()) { float threat = m_creature->getThreatManager().getThreat(pUnit); - SummonedUnit->AddThreat(pUnit, threat); + SummonedUnit->AddThreat(pUnit, 0.1f); } } } + void EnterEvadeMode() + { + RemoveGravityLapse(); + m_creature->InterruptNonMeleeSpells(true); + m_creature->RemoveAllAuras(); + m_creature->DeleteThreatList(); + m_creature->CombatStop(); + m_creature->LoadCreaturesAddon(); + + if( m_creature->isAlive() ) + m_creature->GetMotionMaster()->MoveTargetedHome(); + + m_creature->SetLootRecipient(NULL); + + InCombat = false; + Reset(); + } + void TeleportPlayersToSelf() { - float x = KaelLocations[0][0]; - float y = KaelLocations[0][1]; - m_creature->Relocate(x, y, LOCATION_Z, 0); - //m_creature->SendMonsterMove(x, y, LOCATION_Z, 0, 0, 0); // causes some issues... - std::list<HostilReference*>::iterator i = m_creature->getThreatManager().getThreatList().begin(); - for (i = m_creature->getThreatManager().getThreatList().begin(); i!= m_creature->getThreatManager().getThreatList().end();++i) - { - Unit* pUnit = Unit::GetUnit((*m_creature), (*i)->getUnitGuid()); - if(pUnit && (pUnit->GetTypeId() == TYPEID_PLAYER)) - pUnit->CastSpell(pUnit, SPELL_TELEPORT_CENTER, true); + float x,y,z; + m_creature->Relocate(KaelLocations[0][0], KaelLocations[0][1], LOCATION_Z, 0); + Map *map = m_creature->GetMap(); + InstanceMap::PlayerList const &PlayerList = ((InstanceMap*)map)->GetPlayers(); + InstanceMap::PlayerList::const_iterator i; + for (i = PlayerList.begin(); i != PlayerList.end(); ++i) + { + //if(!(*i)->isGameMaster()) + if((*i) && (*i)->isAlive()) + { + (*i)->CastSpell((*i), SPELL_TELEPORT_CENTER, true); + m_creature->GetNearPoint(m_creature,x,y,z,5,5,0); + (*i)->TeleportTo(m_creature->GetMapId(),x,y,LOCATION_Z,(*i)->GetOrientation()); + } } DoCast(m_creature, SPELL_TELEPORT_CENTER, true); } void CastGravityLapseKnockUp() { - std::list<HostilReference*>::iterator i = m_creature->getThreatManager().getThreatList().begin(); - for (i = m_creature->getThreatManager().getThreatList().begin(); i!= m_creature->getThreatManager().getThreatList().end();++i) - { - Unit* pUnit = Unit::GetUnit((*m_creature), (*i)->getUnitGuid()); - if(pUnit && (pUnit->GetTypeId() == TYPEID_PLAYER)) + Map *map = m_creature->GetMap(); + InstanceMap::PlayerList const &PlayerList = ((InstanceMap*)map)->GetPlayers(); + InstanceMap::PlayerList::const_iterator i; + for (i = PlayerList.begin(); i != PlayerList.end(); ++i) + { + if((*i) && (*i)->isAlive()) // Knockback into the air - pUnit->CastSpell(pUnit, SPELL_GRAVITY_LAPSE_DOT, true, 0, 0, m_creature->GetGUID()); + (*i)->CastSpell((*i), SPELL_GRAVITY_LAPSE_DOT, true, 0, 0, m_creature->GetGUID()); } } void CastGravityLapseFly() // Use Fly Packet hack for now as players can't cast "fly" spells unless in map 530. Has to be done a while after they get knocked into the air... { - std::list<HostilReference*>::iterator i = m_creature->getThreatManager().getThreatList().begin(); - for (i = m_creature->getThreatManager().getThreatList().begin(); i!= m_creature->getThreatManager().getThreatList().end();++i) - { - Unit* pUnit = Unit::GetUnit((*m_creature), (*i)->getUnitGuid()); - if(pUnit && (pUnit->GetTypeId() == TYPEID_PLAYER)) + Map *map = m_creature->GetMap(); + InstanceMap::PlayerList const &PlayerList = ((InstanceMap*)map)->GetPlayers(); + InstanceMap::PlayerList::const_iterator i; + for (i = PlayerList.begin(); i != PlayerList.end(); ++i) + { + if((*i) && (*i)->isAlive()) { // Also needs an exception in spell system. - pUnit->CastSpell(pUnit, SPELL_GRAVITY_LAPSE_FLY, true, 0, 0, m_creature->GetGUID()); + (*i)->CastSpell((*i), SPELL_GRAVITY_LAPSE_FLY, true, 0, 0, m_creature->GetGUID()); // Use packet hack WorldPacket data(12); data.SetOpcode(SMSG_MOVE_SET_CAN_FLY); - data.append(pUnit->GetPackGUID()); + data.append((*i)->GetPackGUID()); data << uint32(0); - pUnit->SendMessageToSet(&data, true); + (*i)->SendMessageToSet(&data, true); + (*i)->SetSpeed(MOVE_FLY, 2.0f); } } } void RemoveGravityLapse() { - std::list<HostilReference*>::iterator i = m_creature->getThreatManager().getThreatList().begin(); - for (i = m_creature->getThreatManager().getThreatList().begin(); i!= m_creature->getThreatManager().getThreatList().end();++i) - { - Unit* pUnit = Unit::GetUnit((*m_creature), (*i)->getUnitGuid()); - if(pUnit && (pUnit->GetTypeId() == TYPEID_PLAYER)) + Map *map = m_creature->GetMap(); + InstanceMap::PlayerList const &PlayerList = ((InstanceMap*)map)->GetPlayers(); + InstanceMap::PlayerList::const_iterator i; + for (i = PlayerList.begin(); i != PlayerList.end(); ++i) + { + if((*i)) { - pUnit->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_FLY); - pUnit->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_DOT); + (*i)->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_FLY); + (*i)->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_DOT); WorldPacket data(12); data.SetOpcode(SMSG_MOVE_UNSET_CAN_FLY); - data.append(pUnit->GetPackGUID()); + data.append((*i)->GetPackGUID()); data << uint32(0); - pUnit->SendMessageToSet(&data, true); + (*i)->SendMessageToSet(&data, true); } } } @@ -278,11 +332,24 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI uint32 random = rand()%2 + 1; float x = KaelLocations[random][0]; float y = KaelLocations[random][1]; - Creature* Phoenix = m_creature->SummonCreature(CREATURE_PHOENIX, x, y, LOCATION_Z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000); + Creature* Phoenix = m_creature->SummonCreature(CREATURE_PHOENIX, x, y, LOCATION_Z, 0, TEMPSUMMON_CORPSE_DESPAWN, 60000); if(Phoenix) { Phoenix->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE); SetThreatList(Phoenix); + Unit *target = SelectUnit(SELECT_TARGET_RANDOM,1); + if(target) + { + Phoenix->AddThreat(target,1000); + Phoenix->Attack(target,true); + Phoenix->GetMotionMaster()->MoveChase(target); + } + else + { + Phoenix->AddThreat(m_creature->getVictim(),1000); + Phoenix->Attack(m_creature->getVictim(),true); + Phoenix->GetMotionMaster()->MoveChase(m_creature->getVictim()); + } } DoYell(SAY_PHOENIX, LANG_UNIVERSAL, NULL); @@ -296,6 +363,7 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0); if(target) { + m_creature->InterruptNonMeleeSpells(false); DoCast(target, SPELL_FLAMESTRIKE3, true); FlameStrikeTimer = 20000 + rand()%5000; @@ -321,6 +389,7 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI case 1: { + m_creature->StopMoving(); if(GravityLapseTimer < diff) { switch(GravityLapsePhase) @@ -343,6 +412,7 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI DoYell(SAY_RECAST_GRAVITY,LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature,SOUND_RECAST_GRAVITY); } + m_creature->StopMoving(); DoCast(m_creature, SPELL_GRAVITY_LAPSE_INITIAL); GravityLapseTimer = 2000 + diff;// Don't interrupt the visual spell GravityLapsePhase = 1; @@ -365,9 +435,29 @@ struct TRINITY_DLL_DECL boss_felblood_kaelthasAI : public ScriptedAI GravityLapseTimer = 30000; GravityLapsePhase = 4; for(uint8 i = 0; i < 3; ++i) - { - Creature* Orb = DoSpawnCreature(CREATURE_ARCANE_SPHERE, 5, 5, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); - if(Orb) SetThreatList(Orb); + { + Creature* Orb = m_creature->SummonCreature(CREATURE_ARCANE_SPHERE,KaelLocations[3+i][0],KaelLocations[3+i][1],LOCATION_Z,0,TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN,30000); + if(Orb) + { + SetThreatList(Orb); + Unit *target = SelectUnit(SELECT_TARGET_BOTTOMAGGRO,i); + if(target) + { + Orb->AddThreat(target,1000); + Orb->Attack(target,true); + Orb->GetMotionMaster()->MoveChase(target); + } + else + { + Unit *ntarget = SelectUnit(SELECT_TARGET_RANDOM,0); + if(ntarget) + { + Orb->AddThreat(ntarget,1000); + Orb->Attack(ntarget,true); + Orb->GetMotionMaster()->MoveChase(ntarget); + } + } + } } DoCast(m_creature, SPELL_GRAVITY_LAPSE_CHANNEL); break; @@ -426,96 +516,149 @@ struct TRINITY_DLL_DECL mob_felkael_flamestrikeAI : public ScriptedAI struct TRINITY_DLL_DECL mob_felkael_phoenixAI : public ScriptedAI { - mob_felkael_phoenixAI(Creature *c) : ScriptedAI(c) {Reset();} - + mob_felkael_phoenixAI(Creature *c) : ScriptedAI(c) + { + pInstance = ((ScriptedInstance*)c->GetInstanceData()); + Reset(); + } uint32 BurnTimer; + uint32 CheckTimer; + uint8 phase; + ScriptedInstance* pInstance; + bool end; void Reset() { + m_creature->SetSpeed(MOVE_RUN, 0.5f); + m_creature->SetSpeed(MOVE_WALK, 0.5f); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE); BurnTimer = 2000; + CheckTimer = 1000; + phase = 0; + end = false; } void Aggro(Unit* who) {} void JustDied(Unit* slayer) { - DoSpawnCreature(CREATURE_PHOENIX_EGG, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 45000); + if (end) + return; + DoSpawnCreature(CREATURE_PHOENIX_EGG, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 45000); } void UpdateAI(const uint32 diff) { + if(CheckTimer < diff) + { + if (pInstance) + { + Creature *boss = ((Creature*)Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_KAEL))); + if (boss) + { + phase = ((boss_felblood_kaelthasAI*)boss->AI())->Phase; + if(boss->isDead() || !boss->isInCombat()) + { + end = true; + m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_FIRE, NULL, false);//temphack, hellfire is not damaging self + } + } + } + CheckTimer = 1000; + }else CheckTimer -= diff; + if (!m_creature->SelectHostilTarget() || !m_creature->getVictim()) return; - if (BurnTimer < diff) - { - DoCast(m_creature->getVictim(), SPELL_PHOENIX_BURN); - BurnTimer = 2000; - }else BurnTimer -= diff; - - DoMeleeAttackIfReady(); + if (BurnTimer < diff) + { + if(!phase) + { + DoCast(m_creature, SPELL_PHOENIX_BURN); + m_creature->DealDamage(m_creature, 1500, NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_FIRE, NULL, false);//temphack, hellfire is not damaging self + } + else + { + m_creature->StopMoving(); + DoCast(m_creature->getVictim(), SPELL_PHOENIX_FIREBALL); + } + BurnTimer = 2000; + }else BurnTimer -= diff; + + //DoMeleeAttackIfReady(); } }; -struct TRINITY_DLL_DECL mob_felkael_phoenix_eggAI : public ScriptedAI +struct TRINITY_DLL_DECL mob_felkael_phoenix_eggAI : public Scripted_NoMovementAI { - mob_felkael_phoenix_eggAI(Creature *c) : ScriptedAI(c) {Reset();} + mob_felkael_phoenix_eggAI(Creature *c) : Scripted_NoMovementAI(c) + { + pInstance = ((ScriptedInstance*)c->GetInstanceData()); + Reset(); + } uint32 HatchTimer; - + ScriptedInstance* pInstance; void Reset() { HatchTimer = 15000; } void Aggro(Unit* who) {} void MoveInLineOfSight(Unit* who) {} - void UpdateAI(const uint32 diff) { + if(HatchTimer < diff) { - DoSpawnCreature(CREATURE_PHOENIX, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); - m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - }else HatchTimer -= diff; + Creature *bird = DoSpawnCreature(CREATURE_PHOENIX, 0, 0, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 60000); + if (bird) + { + Unit *boss = Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_KAEL)); + if (boss && boss->getVictim()) + { + bird->AddThreat(boss->getVictim(),100); + bird->Attack(boss->getVictim(),true); + bird->GetMotionMaster()->MoveChase(boss->getVictim()); + } + } + m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + }else HatchTimer -= diff; } }; struct TRINITY_DLL_DECL mob_arcane_sphereAI : public ScriptedAI { - mob_arcane_sphereAI(Creature *c) : ScriptedAI(c) {Reset();} - + mob_arcane_sphereAI(Creature *c) : ScriptedAI(c) + { + pInstance = ((ScriptedInstance*)c->GetInstanceData()); + Reset(); + } uint32 DespawnTimer; uint32 ChangeTargetTimer; + uint32 CheckTimer; - bool TargetLocked; + ScriptedInstance* pInstance; void Reset() { + m_creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING); DespawnTimer = 30000; ChangeTargetTimer = 5000; - TargetLocked = false; - + CheckTimer = 1000; + m_creature->SetSpeed(MOVE_RUN, 0.5f); + m_creature->SetSpeed(MOVE_WALK, 0.5f); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->setFaction(14); DoCast(m_creature, SPELL_ARCANE_SPHERE_PASSIVE, true); } - void MoveInLineOfSight(Unit* who) - { - if(TargetLocked) - return; - if(who && who->IsHostileTo(m_creature) && (m_creature->IsWithinDistInMap(who, 25))) - StalkTarget(who); - } - void Aggro(Unit* who) {} void StalkTarget(Unit* target) { if(!target) return; - - m_creature->GetMotionMaster()->MoveChase(target); - TargetLocked = true; + m_creature->AddThreat(target,100000); + m_creature->GetMotionMaster()->MoveChase(target); + m_creature->Attack(target,true); } void UpdateAI(const uint32 diff) @@ -525,16 +668,63 @@ struct TRINITY_DLL_DECL mob_arcane_sphereAI : public ScriptedAI else DespawnTimer -= diff; if(!m_creature->getVictim() || !m_creature->SelectHostilTarget()) - return; + ChangeTargetTimer = 0; if(ChangeTargetTimer < diff) { - TargetLocked = false; + DoResetThreat(); + Unit *ntarget = SelectUnit(SELECT_TARGET_RANDOM,0); + if (ntarget) + StalkTarget(ntarget); ChangeTargetTimer = 10000; }else ChangeTargetTimer -= diff; + + if(CheckTimer < diff) + { + if (pInstance) + { + Creature *boss = (Creature*)Unit::GetUnit((*m_creature),pInstance->GetData64(DATA_KAEL)); + if(boss) + { + if(!((boss_felblood_kaelthasAI*)boss->AI())->Phase || boss->isDead()) + DespawnTimer = 0; + }else DespawnTimer = 0; + } + CheckTimer = 1000; + }else CheckTimer -= diff; } }; +bool GOHello_go_kael_orb(Player *player, GameObject* _GO) +{ + ScriptedInstance* pInst = (ScriptedInstance*)_GO->GetInstanceData(); + if (pInst && player) + { + Unit *kael = Unit::GetUnit((*_GO),pInst->GetData64(DATA_KAEL)); + if (kael && kael->isDead()) + player->TeleportTo(530, 12888, -6876, 9, 0.3); + } + return true; +} + +bool GOHello_go_movie_orb(Player *player, GameObject* _GO) +{ + if (player) + { + WorldPacket data(SMSG_TRIGGER_CINEMATIC, 4); + data << (uint32)164; + player->GetSession()->SendPacket(&data); + + if (player->GetQuestStatus(11490) == QUEST_STATUS_INCOMPLETE) + { + Unit *qUnit = player->SummonCreature(25042,player->GetPositionX(),player->GetPositionY(),player->GetPositionZ()-10,0,TEMPSUMMON_CORPSE_DESPAWN,0); + if(qUnit) + player->DealDamage(qUnit, qUnit->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + } + } + return true; +} + CreatureAI* GetAI_boss_felblood_kaelthas(Creature* c) { return new boss_felblood_kaelthasAI(c); @@ -588,4 +778,14 @@ void AddSC_boss_felblood_kaelthas() newscript->Name="mob_felkael_flamestrike"; newscript->GetAI = GetAI_mob_felkael_flamestrike; m_scripts[nrscripts++] = newscript; + + newscript = new Script; + newscript->Name="go_kael_orb"; + newscript->pGOHello = &GOHello_go_kael_orb; + m_scripts[nrscripts++] = newscript; + + newscript = new Script; + newscript->Name="go_movie_orb"; + newscript->pGOHello = &GOHello_go_movie_orb; + m_scripts[nrscripts++] = newscript; } diff --git a/src/bindings/scripts/scripts/zone/magisters_terrace/boss_priestess_delrissa.cpp b/src/bindings/scripts/scripts/zone/magisters_terrace/boss_priestess_delrissa.cpp index 494ff9e0da8..bd4a336eff4 100644 --- a/src/bindings/scripts/scripts/zone/magisters_terrace/boss_priestess_delrissa.cpp +++ b/src/bindings/scripts/scripts/zone/magisters_terrace/boss_priestess_delrissa.cpp @@ -6,12 +6,12 @@ * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* ScriptData @@ -102,8 +102,8 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI { pInstance = ((ScriptedInstance*)c->GetInstanceData()); Adds.clear(); - Reset(); - SummonAdds(); + //SummonAdds(); + Reset(); Heroic = c->GetMap()->IsHeroic(); } @@ -126,6 +126,7 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI void Reset() { + m_creature->SetCorpseDelay(60*60*1000); LackeysKilled = 0; PlayersKilled = 0; @@ -139,11 +140,13 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI CheckAdds(); - if(pInstance) - { - pInstance->SetData(DATA_DELRISSA_EVENT, NOT_STARTED); - pInstance->SetData(DATA_DELRISSA_DEATH_COUNT, 0); - } + if(pInstance) + { + pInstance->SetData(DATA_DELRISSA_DEATH_COUNT, 0); + if (m_creature->isDead()) + pInstance->SetData(DATA_DELRISSA_EVENT, DONE); + else pInstance->SetData(DATA_DELRISSA_EVENT, NOT_STARTED); + } else error_log(ERROR_INST_DATA); } @@ -159,6 +162,8 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI void SummonAdds() { + /*if (m_creature->isDead()) + return;*/ std::vector<uint32> AddList; for(uint8 i = 0; i < 8; ++i) AddList.push_back(AddEntry[i]); @@ -179,31 +184,35 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI void CheckAdds() { + //if (m_creature->isDead()) + // return; if(Adds.empty()) + { + SummonAdds(); return; - + } for(uint8 i = 0; i < Adds.size(); ++i) { - bool resummon = true; Creature* pAdd = ((Creature*)Unit::GetUnit(*m_creature, Adds[i]->guid)); if(pAdd && pAdd->isAlive()) { - pAdd->AI()->EnterEvadeMode(); // Force them out of combat and reset if they are in combat. - resummon = false; - } - if(resummon) + pAdd->AI()->EnterEvadeMode(); + pAdd->GetMotionMaster()->MovePoint(0,LackeyLocations[i][0], LackeyLocations[i][1], POS_Z); + } + if(!pAdd || (pAdd && pAdd->isDead())) { - pAdd = m_creature->SummonCreature(Adds[i]->entry, LackeyLocations[i][0], LackeyLocations[i][1], POS_Z, ORIENT, TEMPSUMMON_DEAD_DESPAWN, 0); - Add* nAdd = new Add(Adds[i]->entry, pAdd->GetGUID()); - Adds.erase(Adds.begin() + i); - Adds.push_back(nAdd); - } + if(pAdd) + pAdd->RemoveCorpse();//looks stupid if mob is alive but has a dead corpse in front of him :) + Creature* pAdd = m_creature->SummonCreature(Adds[i]->entry, LackeyLocations[i][0], LackeyLocations[i][1], POS_Z, ORIENT, TEMPSUMMON_DEAD_DESPAWN, 0); + if(pAdd) + Adds[i]->guid = pAdd->GetGUID(); + } } } void KilledUnit(Unit* victim) { - if(victim->GetTypeId() != TYPEID_PLAYER) + if(victim->GetTypeId() != TYPEID_PLAYER || m_creature->isDead()) return; DoYell(PlayerDeath[PlayersKilled].text, LANG_UNIVERSAL, NULL); @@ -214,10 +223,14 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI void KilledLackey() { + if(m_creature->isDead())//no sense to talk if dead.. + return; DoYell(LackeyDeath[LackeysKilled].text, LANG_UNIVERSAL, NULL); DoPlaySoundToSet(m_creature, LackeyDeath[LackeysKilled].sound); if( LackeysKilled < 3 ) ++LackeysKilled; + + CheckLootable(); } void JustDied(Unit* killer) @@ -241,7 +254,7 @@ struct TRINITY_DLL_DECL boss_priestess_delrissaAI : public ScriptedAI void CheckLootable() { - if(LackeysKilled > 4) + if(pInstance && pInstance->GetData(DATA_DELRISSA_DEATH_COUNT) >= 4) m_creature->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); else m_creature->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); @@ -366,7 +379,12 @@ struct TRINITY_DLL_DECL boss_priestess_guestAI : public ScriptedAI void Reset() { UsedPotion = false; - + if(pInstance) + { + Creature *boss = ((Creature*)Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_DELRISSA))); + if (boss && boss->isDead()) + boss->Respawn(); + } ResetThreatTimer = 5000 + rand()%15000; // These guys like to switch targets often, and are not meant to be tanked. } @@ -637,7 +655,9 @@ struct TRINITY_DLL_DECL boss_ellris_duskhallowAI : public boss_priestess_guestAI Fear_Timer = 10000; }else Fear_Timer -= diff; - DoMeleeAttackIfReady(); + if (m_creature->GetDistance(m_creature->getVictim()) <= 10) + m_creature->StopMoving(); + //DoMeleeAttackIfReady();//should not melee, she's a warlock } }; @@ -740,7 +760,7 @@ struct TRINITY_DLL_DECL boss_yazzaiAI : public boss_priestess_guestAI if(!m_creature->SelectHostilTarget() || !m_creature->getVictim() ) return; - boss_priestess_guestAI::UpdateAI(diff); + boss_priestess_guestAI::UpdateAI(diff); if(Polymorph_Timer < diff) { @@ -792,19 +812,29 @@ struct TRINITY_DLL_DECL boss_yazzaiAI : public boss_priestess_guestAI if(Unit* target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid())) //if in melee range if (target->IsWithinDistInMap(m_creature, 5)) - { - InMeleeRange = true; - break; - } + { + InMeleeRange = true; + break; + } } //if anybody is in melee range than escape by blink if(InMeleeRange) - DoCast(m_creature, SPELL_BLINK); - + { + //DoCast(m_creature, SPELL_BLINK); //blink does not work on npcs + float x,y,z; + m_creature->GetPosition(x,y,z); + x = rand()%2 ? x+10+rand()%10 : x-10-rand()%10; + y = rand()%2 ? y+10+rand()%10 : y-10-rand()%10; + m_creature->Relocate(x,y,z); + m_creature->SendMonsterMove(x, y, m_creature->GetPositionZ(), 0,0,0); + } Blink_Timer = 8000; }else Blink_Timer -= diff; - DoMeleeAttackIfReady(); + if (m_creature->GetDistance(m_creature->getVictim()) <= 10) + m_creature->StopMoving(); + + //DoMeleeAttackIfReady(); //mage type, no melee needed } }; @@ -948,6 +978,8 @@ struct TRINITY_DLL_DECL boss_garaxxasAI : public boss_priestess_guestAI uint32 Multi_Shot_Timer; uint32 Wing_Clip_Timer; uint32 Freezing_Trap_Timer; + uint32 StopMoving; + bool Stopped; void Reset() { @@ -960,6 +992,8 @@ struct TRINITY_DLL_DECL boss_garaxxasAI : public boss_priestess_guestAI Multi_Shot_Timer = 10000; Wing_Clip_Timer = 4000; Freezing_Trap_Timer = 15000; + StopMoving = 2000; + Stopped = false; boss_priestess_guestAI::Reset(); } @@ -1030,6 +1064,16 @@ struct TRINITY_DLL_DECL boss_garaxxasAI : public boss_priestess_guestAI Shoot_Timer = 2500; }else Shoot_Timer -= diff; } + if(StopMoving < diff) + { + if(Stopped) + Stopped = false; + else + Stopped = true; + StopMoving = 2000+rand()%5000; + }else StopMoving -= diff; + if (Stopped) + m_creature->StopMoving(); } }; @@ -1178,9 +1222,12 @@ struct TRINITY_DLL_DECL boss_zelfanAI : public boss_priestess_guestAI boss_priestess_guestAI::UpdateAI(diff); if(Goblin_Dragon_Gun_Timer < diff) - { - DoCast(m_creature->getVictim(), SPELL_GOBLIN_DRAGON_GUN); - Goblin_Dragon_Gun_Timer = 10000; + { + if (m_creature->GetDistance(m_creature->getVictim()) <= 5) + { + Goblin_Dragon_Gun_Timer = 10000; + DoCast(m_creature->getVictim(), SPELL_GOBLIN_DRAGON_GUN); + }else Goblin_Dragon_Gun_Timer = 2000; }else Goblin_Dragon_Gun_Timer -= diff; if(Rocket_Launch_Timer < diff) diff --git a/src/bindings/scripts/scripts/zone/magisters_terrace/boss_selin_fireheart.cpp b/src/bindings/scripts/scripts/zone/magisters_terrace/boss_selin_fireheart.cpp index c1d0743637f..24526dac185 100644 --- a/src/bindings/scripts/scripts/zone/magisters_terrace/boss_selin_fireheart.cpp +++ b/src/bindings/scripts/scripts/zone/magisters_terrace/boss_selin_fireheart.cpp @@ -89,7 +89,7 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI uint32 DrainManaTimer; uint32 FelExplosionTimer; uint32 DrainCrystalTimer; - uint32 EmpowerTimer; + uint32 CheckTimer; bool IsDraining; bool DrainingCrystal; @@ -108,27 +108,28 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI if(pUnit) { if(!pUnit->isAlive()) - ((Creature*)pUnit)->Respawn(); // Let TrinIty handle setting death state, etc. + ((Creature*)pUnit)->Respawn(); // Let MaNGOS handle setting death state, etc. // Only need to set unselectable flag. You can't attack unselectable units so non_attackable flag is not necessary here. pUnit->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } } - GameObject* Door = GameObject::GetGameObject(*m_creature, pInstance->GetData64(DATA_SELIN_ENCOUNTER_DOOR)); if( Door ) Door->SetGoState(0); // Open the big encounter door. Close it in Aggro and open it only in JustDied(and here) // Small door opened after event are expected to be closed by default // Set Inst data for encounter - pInstance->SetData(DATA_SELIN_EVENT, NOT_STARTED); + if (m_creature->isDead()) + pInstance->SetData(DATA_SELIN_EVENT, DONE); + else pInstance->SetData(DATA_SELIN_EVENT, NOT_STARTED); }else error_log(ERROR_INST_DATA); - + DrainLifeTimer = 3000 + rand()%4000; DrainManaTimer = DrainLifeTimer + 5000; FelExplosionTimer = 2100; DrainCrystalTimer = 10000 + rand()%5000; DrainCrystalTimer = 20000 + rand()%5000; - EmpowerTimer = 10000; + CheckTimer = 1000; IsDraining = false; DrainingCrystal = false; @@ -193,6 +194,7 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI void Aggro(Unit* who) { + m_creature->SetPower(POWER_MANA, 0); DoYell(SAY_AGGRO, LANG_UNIVERSAL, NULL); DoPlaySoundToSet(m_creature, SOUND_AGGRO); @@ -262,7 +264,6 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI if( ContinueDoor ) ContinueDoor->SetGoState(0); // Open the door leading further in - ShatterRemainingCrystals(); } void UpdateAI(const uint32 diff) @@ -286,12 +287,8 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI { if( DrainManaTimer < diff ) { - Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0); - if( target->getPowerType() == POWER_MANA) - { - DoCast(target, SPELL_DRAIN_MANA); - DrainManaTimer = 10000; - } + DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_DRAIN_MANA); + DrainManaTimer = 10000; }else DrainManaTimer -= diff; } } @@ -321,27 +318,35 @@ struct TRINITY_DLL_DECL boss_selin_fireheartAI : public ScriptedAI { if( IsDraining ) { - if( EmpowerTimer < diff ) - { - IsDraining = false; - DrainingCrystal = false; - - DoYell(SAY_EMPOWERED, LANG_UNIVERSAL, NULL); - DoPlaySoundToSet(m_creature, SOUND_EMPOWERED); - - Unit* CrystalChosen = Unit::GetUnit(*m_creature, CrystalGUID); - if( CrystalChosen && CrystalChosen->isAlive() ) - // Use Deal Damage to kill it, not setDeathState. - CrystalChosen->DealDamage(CrystalChosen, CrystalChosen->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - - CrystalGUID = 0; - - m_creature->GetMotionMaster()->Clear(); - m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); - }else EmpowerTimer -= diff; - } + if (CheckTimer < diff) + { + Unit* CrystalChosen = Unit::GetUnit(*m_creature, CrystalGUID); + if(CrystalChosen) + { + if(CrystalChosen->GetUInt32Value(UNIT_CHANNEL_SPELL) == SPELL_MANA_RAGE) + { + m_creature->StopMoving(); + }else{ + IsDraining = false; + DrainingCrystal = false; + + DoYell(SAY_EMPOWERED, LANG_UNIVERSAL, NULL); + DoPlaySoundToSet(m_creature, SOUND_EMPOWERED); + + Unit* CrystalChosen = Unit::GetUnit(*m_creature, CrystalGUID); + if( CrystalChosen && CrystalChosen->isAlive() ) + // Use Deal Damage to kill it, not setDeathState. + CrystalChosen->DealDamage(CrystalChosen, CrystalChosen->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + CrystalGUID = 0; + + m_creature->GetMotionMaster()->Clear(); + m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); + } + } + CheckTimer = 1000; + }else CheckTimer -= diff; + } } - DoMeleeAttackIfReady(); // No need to check if we are draining crystal here, as the spell has a stun. } }; @@ -363,6 +368,7 @@ struct TRINITY_DLL_DECL mob_fel_crystalAI : public ScriptedAI void JustDied(Unit* killer) { + m_creature->RemoveAurasDueToSpell(SPELL_MANA_RAGE); if(ScriptedInstance* pInstance = ((ScriptedInstance*)m_creature->GetInstanceData())) { Creature* Selin = ((Creature*)Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_SELIN))); @@ -370,10 +376,10 @@ struct TRINITY_DLL_DECL mob_fel_crystalAI : public ScriptedAI { if(((boss_selin_fireheartAI*)Selin->AI())->CrystalGUID == m_creature->GetGUID()) { - Selin->RemoveAurasDueToSpell(SPELL_MANA_RAGE); + // Set this to false if we are the creature that Selin is draining so his AI flows properly ((boss_selin_fireheartAI*)Selin->AI())->DrainingCrystal = false; ((boss_selin_fireheartAI*)Selin->AI())->IsDraining = false; - ((boss_selin_fireheartAI*)Selin->AI())->EmpowerTimer = 10000; + Selin->RemoveAurasDueToSpell(SPELL_MANA_RAGE); if(Selin->getVictim()) { Selin->AI()->AttackStart(Selin->getVictim()); diff --git a/src/bindings/scripts/scripts/zone/magisters_terrace/boss_vexallus.cpp b/src/bindings/scripts/scripts/zone/magisters_terrace/boss_vexallus.cpp index 7f6521d1c60..ff11b425bd2 100644 --- a/src/bindings/scripts/scripts/zone/magisters_terrace/boss_vexallus.cpp +++ b/src/bindings/scripts/scripts/zone/magisters_terrace/boss_vexallus.cpp @@ -47,6 +47,7 @@ EndScriptData */ #define SPELL_SUMMON_PURE_ENERGY 44322 //not-working, this script summon this creatures without this spell #define SPELL_OVERLOAD 44353 #define SPELL_ARCANE_SHOCK 44319 +#define ASTRAL_FLARE_VISUAL 30237 //Creatures #define CREATURE_PURE_ENERGY 24745 @@ -81,7 +82,11 @@ struct TRINITY_DLL_DECL boss_vexallusAI : public ScriptedAI Enraged = false; if(pInstance) - pInstance->SetData(DATA_VEXALLUS_EVENT, NOT_STARTED); + { + if (m_creature->isDead()) + pInstance->SetData(DATA_VEXALLUS_EVENT, DONE); + else pInstance->SetData(DATA_VEXALLUS_EVENT, NOT_STARTED); + } } void KilledUnit(Unit *victim) @@ -130,7 +135,7 @@ struct TRINITY_DLL_DECL boss_vexallusAI : public ScriptedAI DoYell(SAY_ENERGY, LANG_UNIVERSAL, NULL); DoPlaySoundToSet(m_creature, SOUND_ENERGY); Creature* PureEnergyCreature = NULL; - PureEnergyCreature = DoSpawnCreature(CREATURE_PURE_ENERGY, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); + PureEnergyCreature = DoSpawnCreature(CREATURE_PURE_ENERGY, 10, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); Unit* target = NULL; target = SelectUnit(SELECT_TARGET_RANDOM, 0); if (PureEnergyCreature && target) @@ -138,7 +143,7 @@ struct TRINITY_DLL_DECL boss_vexallusAI : public ScriptedAI if(Heroic) // *Heroic mode only - he summons two instead of one. { - PureEnergyCreature = DoSpawnCreature(CREATURE_PURE_ENERGY, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); + PureEnergyCreature = DoSpawnCreature(CREATURE_PURE_ENERGY, -10, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); target = SelectUnit(SELECT_TARGET_RANDOM, 0); if (PureEnergyCreature && target) PureEnergyCreature->AI()->AttackStart(target); @@ -186,10 +191,14 @@ struct TRINITY_DLL_DECL mob_pure_energyAI : public ScriptedAI mob_pure_energyAI(Creature *c) : ScriptedAI(c) {Reset();} uint32 EnergyBoltTimer; + uint32 VisualTimer; void Reset() { EnergyBoltTimer = 1700; + VisualTimer = 1000; + m_creature->SetSpeed(MOVE_RUN, 0.5f); + m_creature->SetSpeed(MOVE_WALK, 0.5f); } void JustDied(Unit* slayer) @@ -209,6 +218,11 @@ struct TRINITY_DLL_DECL mob_pure_energyAI : public ScriptedAI DoCast(m_creature->getVictim(), SPELL_ENERGY_BOLT); EnergyBoltTimer = 1700; }else EnergyBoltTimer -= diff; + if(VisualTimer < diff) + { + DoCast(m_creature->getVictim(), ASTRAL_FLARE_VISUAL, true); + VisualTimer = 1000; + }else VisualTimer -= diff; } }; diff --git a/src/bindings/scripts/scripts/zone/magisters_terrace/def_magisters_terrace.h b/src/bindings/scripts/scripts/zone/magisters_terrace/def_magisters_terrace.h index d064a50cc13..1e31421247f 100644 --- a/src/bindings/scripts/scripts/zone/magisters_terrace/def_magisters_terrace.h +++ b/src/bindings/scripts/scripts/zone/magisters_terrace/def_magisters_terrace.h @@ -25,5 +25,7 @@ #define DATA_DELRISSA_DEATH_COUNT 15 +#define DATA_KAEL 16 + #define ERROR_INST_DATA "SD2 Error: Instance Data not set properly for Magister's Terrace instance (map 585). Encounters will be buggy." #endif diff --git a/src/bindings/scripts/scripts/zone/magisters_terrace/instance_magisters_terrace.cpp b/src/bindings/scripts/scripts/zone/magisters_terrace/instance_magisters_terrace.cpp index fd7ae851dfd..8afecdc32e9 100644 --- a/src/bindings/scripts/scripts/zone/magisters_terrace/instance_magisters_terrace.cpp +++ b/src/bindings/scripts/scripts/zone/magisters_terrace/instance_magisters_terrace.cpp @@ -40,12 +40,14 @@ struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance Initialize(); } + uint32 DoorState[3];//0seline, 1vexallus, 2derlissa uint32 Encounters[NUMBER_OF_ENCOUNTERS]; uint32 DelrissaDeathCount; std::list<uint64> FelCrystals; std::list<uint64>::iterator CrystalItr; + uint64 KaelGUID; uint64 SelinGUID; uint64 DelrissaGUID; uint64 VexallusDoorGUID; @@ -58,6 +60,9 @@ struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance void Initialize() { + for(uint8 i = 0; i < 3; i++) + DoorState[i] = 1;//1 closed, 0 opened + for(uint8 i = 0; i < NUMBER_OF_ENCOUNTERS; i++) Encounters[i] = NOT_STARTED; @@ -65,6 +70,7 @@ struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance DelrissaDeathCount = 0; + KaelGUID = 0; SelinGUID = 0; DelrissaGUID = 0; VexallusDoorGUID = 0; @@ -103,9 +109,30 @@ struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance { switch(identifier) { - case DATA_SELIN_EVENT: Encounters[0] = data; break; - case DATA_VEXALLUS_EVENT: Encounters[1] = data; break; - case DATA_DELRISSA_EVENT: Encounters[2] = data; break; + case DATA_SELIN_EVENT: + Encounters[0] = data; + if(data==DONE) + { + DoorState[0] = 0; + SaveToDB(); + } + break; + case DATA_VEXALLUS_EVENT: + Encounters[1] = data; + if(data==DONE) + { + DoorState[1] = 0; + SaveToDB(); + } + break; + case DATA_DELRISSA_EVENT: + Encounters[2] = data; + if(data==DONE) + { + DoorState[2] = 0; + SaveToDB(); + } + break; case DATA_KAELTHAS_EVENT: Encounters[3] = data; break; case DATA_DELRISSA_DEATH_COUNT: @@ -114,6 +141,30 @@ struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance } } + const char* Save() + { + std::ostringstream ss; + ss << "S " << DoorState[0] << " " << DoorState[1] << " " << DoorState[2]; + char* data = new char[ss.str().length()+1]; + strcpy(data, ss.str().c_str()); + return data; + } + + void Load(const char* load) + { + if(!load) return; + std::istringstream ss(load); + char dataHead; // S + uint32 data1, data2, data3; + ss >> dataHead >> data1 >> data2 >> data3; + if(dataHead == 'S') + { + DoorState[0] = data1; + DoorState[1] = data2; + DoorState[2] = data3; + }else error_log("SD2: Magister's Terrace: corrupted save data."); + } + void OnCreatureCreate(Creature *creature, uint32 entry) { switch(entry) @@ -121,6 +172,7 @@ struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance case 24723: SelinGUID = creature->GetGUID(); break; case 24560: DelrissaGUID = creature->GetGUID(); break; case 24722: FelCrystals.push_back(creature->GetGUID()); break; + case 24664: KaelGUID = creature->GetGUID(); break; } } @@ -128,12 +180,21 @@ struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance { switch(go->GetEntry()) { - case 187896: VexallusDoorGUID = go->GetGUID(); break; + case 187896: + VexallusDoorGUID = go->GetGUID(); + go->SetGoState(DoorState[1]); + break; //SunwellRaid Gate 02 - case 187979: SelinDoorGUID = go->GetGUID(); break; + case 187979: + SelinDoorGUID = go->GetGUID(); + go->SetGoState(DoorState[0]); + break; //Assembly Chamber Door case 188065: SelinEncounterDoorGUID = go->GetGUID(); break; - case 187770: DelrissaDoorGUID = go->GetGUID(); break; + case 187770: + DelrissaDoorGUID = go->GetGUID(); + go->SetGoState(DoorState[2]); + break; case 188165: KaelStatue[0] = go->GetGUID(); break; case 188166: KaelStatue[1] = go->GetGUID(); break; } @@ -144,6 +205,7 @@ struct TRINITY_DLL_DECL instance_magisters_terrace : public ScriptedInstance switch(identifier) { case DATA_SELIN: return SelinGUID; + case DATA_KAEL: return KaelGUID; case DATA_DELRISSA: return DelrissaGUID; case DATA_VEXALLUS_DOOR: return VexallusDoorGUID; case DATA_SELIN_DOOR: return SelinDoorGUID; |