aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
author_manuel_ <none@none>2010-01-14 03:48:48 -0300
committer_manuel_ <none@none>2010-01-14 03:48:48 -0300
commita8b4a7bc378d651a2dde25f64a6b5a3927ee1815 (patch)
treec904e62ffa172e23b4d6e97112507f42a8f7321d /src
parent0077466598eb1b569a8ce041cb2f588a1fa92812 (diff)
Gnomeregan: Implemented Blastmaster Emi Shortfuse Event.
--HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/bindings/scripts/CMakeLists.txt3
-rw-r--r--src/bindings/scripts/VC90/90ScriptDev2.vcproj16
-rw-r--r--src/bindings/scripts/scripts/eastern_kingdoms/gnomeregan/gnomeregan.cpp593
-rw-r--r--src/bindings/scripts/scripts/eastern_kingdoms/gnomeregan/gnomeregan.h48
-rw-r--r--src/bindings/scripts/scripts/eastern_kingdoms/gnomeregan/instance_gnomeregan.cpp119
-rw-r--r--src/bindings/scripts/scripts/northrend/sholazar_basin.cpp5
-rw-r--r--src/bindings/scripts/system/ScriptLoader.cpp4
7 files changed, 788 insertions, 0 deletions
diff --git a/src/bindings/scripts/CMakeLists.txt b/src/bindings/scripts/CMakeLists.txt
index 14c2c9593b1..3ebbd87b0eb 100644
--- a/src/bindings/scripts/CMakeLists.txt
+++ b/src/bindings/scripts/CMakeLists.txt
@@ -58,6 +58,9 @@ SET(trinityscript_LIB_SRCS
scripts/eastern_kingdoms/deadmines/deadmines.h
scripts/eastern_kingdoms/deadmines/deadmines.cpp
scripts/eastern_kingdoms/deadmines/instance_deadmines.cpp
+ scripts/eastern_kingdoms/gnomeregan/gnomeregan.h
+ scripts/eastern_kingdoms/gnomeregan/gnomeregan.cpp
+ scripts/eastern_kingdoms/gnomeregan/instance_gnomeregan.cpp
scripts/eastern_kingdoms/karazhan/boss_curator.cpp
scripts/eastern_kingdoms/karazhan/boss_maiden_of_virtue.cpp
scripts/eastern_kingdoms/karazhan/boss_midnight.cpp
diff --git a/src/bindings/scripts/VC90/90ScriptDev2.vcproj b/src/bindings/scripts/VC90/90ScriptDev2.vcproj
index f989fdb73d4..b6922755313 100644
--- a/src/bindings/scripts/VC90/90ScriptDev2.vcproj
+++ b/src/bindings/scripts/VC90/90ScriptDev2.vcproj
@@ -675,6 +675,22 @@
>
</File>
</Filter>
+<Filter
+ Name="Gnomeregan"
+ >
+ <File
+ RelativePath="..\scripts\eastern_kingdoms\gnomeregan\gnomeregan.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\scripts\eastern_kingdoms\gnomeregan\gnomeregan.h"
+ >
+ </File>
+ <File
+ RelativePath="..\scripts\eastern_kingdoms\gnomeregan\instance_gnomeregan.cpp"
+ >
+ </File>
+ </Filter>
<Filter
Name="Karazhan"
>
diff --git a/src/bindings/scripts/scripts/eastern_kingdoms/gnomeregan/gnomeregan.cpp b/src/bindings/scripts/scripts/eastern_kingdoms/gnomeregan/gnomeregan.cpp
new file mode 100644
index 00000000000..5b6e4e2cfd1
--- /dev/null
+++ b/src/bindings/scripts/scripts/eastern_kingdoms/gnomeregan/gnomeregan.cpp
@@ -0,0 +1,593 @@
+/*
+ * Copyright (C) 2010 Trinity <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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
+ * 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
+ */
+
+/* Script Data Start
+SDName: Gnomeregan
+SDAuthor: Manuel
+SD%Complete: 90%
+SDComment: Some visual effects are not implemented.
+Script Data End */
+
+#include "precompiled.h"
+#include "gnomeregan.h"
+#include "escort_ai.h"
+
+#define GOSSIP_START_EVENT "I am ready to being"
+
+enum eBlastmasterEmiShortfuse
+{
+ GOSSIP_TEXT_EMI = 1693,
+
+ SAY_BLASTMASTER_0 = -1090000,
+ SAY_BLASTMASTER_1 = -1090001,
+ SAY_BLASTMASTER_2 = -1090002,
+ SAY_BLASTMASTER_3 = -1090003,
+ SAY_BLASTMASTER_4 = -1090004,
+ SAY_BLASTMASTER_5 = -1090005,
+ SAY_BLASTMASTER_6 = -1090006,
+ SAY_BLASTMASTER_7 = -1090007,
+ SAY_BLASTMASTER_8 = -1090008,
+ SAY_BLASTMASTER_9 = -1090009,
+ SAY_BLASTMASTER_10 = -1090010,
+ SAY_BLASTMASTER_11 = -1090011,
+ SAY_BLASTMASTER_12 = -1090012,
+ SAY_BLASTMASTER_13 = -1090013,
+ SAY_BLASTMASTER_14 = -1090014,
+ SAY_BLASTMASTER_15 = -1090015,
+ SAY_BLASTMASTER_16 = -1090016,
+ SAY_BLASTMASTER_17 = -1090017,
+ SAY_BLASTMASTER_18 = -1090018,
+ SAY_BLASTMASTER_19 = -1090019,
+ SAY_BLASTMASTER_20 = -1090020,
+ SAY_BLASTMASTER_21 = -1090021,
+ SAY_BLASTMASTER_22 = -1090022,
+ SAY_BLASTMASTER_23 = -1090023,
+ SAY_BLASTMASTER_24 = -1090024,
+ SAY_BLASTMASTER_25 = -1090025,
+ SAY_BLASTMASTER_26 = -1090026,
+ SAY_BLASTMASTER_27 = -1090027,
+
+ SAY_GRUBBIS = -1090028
+};
+
+const Position SpawnPosition[] =
+{
+ {-557.630,-114.514,-152.209,0.641},
+ {-555.263,-113.802,-152.737,0.311},
+ {-552.154,-112.476,-153.349,0.621},
+ {-548.692,-111.089,-154.090,0.621},
+ {-546.905,-108.340,-154.877,0.729},
+ {-547.736,-105.154,-155.176,0.372},
+ {-547.274,-114.109,-153.952,0.735},
+ {-552.534,-110.012,-153.577,0.747},
+ {-550.708,-116.436,-153.103,0.679},
+ {-554.030,-115.983,-152.635,0.695},
+ {-494.595,-87.516,149.116,3.344},
+ {-493.349,-90.845,-148.882,3.717},
+ {-491.995,-87.619,-148.197,3.230},
+ {-490.732,-90.739,-148.091,3.230},
+ {-490.554,-89.114,-148.055,3.230},
+ {-495.240,-90.808,-149.493,3.238},
+ {-494.195,-89.553,-149.131,3.254}
+};
+
+struct TRINITY_DLL_DECL npc_blastmaster_emi_shortfuseAI : public npc_escortAI
+{
+ npc_blastmaster_emi_shortfuseAI(Creature* pCreature) : npc_escortAI(pCreature)
+ {
+ pInstance = pCreature->GetInstanceData();
+ pCreature->RestoreFaction();
+ Reset();
+ }
+
+ ScriptedInstance* pInstance;
+
+ uint8 uiPhase;
+ uint32 uiTimer;
+
+ std::list<uint64> SummonList;
+ std::list<uint64> GoSummonList;
+
+ void Reset()
+ {
+ if (!HasEscortState(STATE_ESCORT_ESCORTING))
+ {
+ uiTimer = 0;
+ uiPhase = 0;
+
+ RestoreAll();
+
+ SummonList.clear();
+ GoSummonList.clear();
+ }
+ }
+
+ void NextStep(uint32 uiTimerStep,bool bNextStep = true,uint8 uiPhaseStep = 0)
+ {
+ uiTimer = uiTimerStep;
+ if (bNextStep)
+ ++uiPhase;
+ else
+ uiPhase = uiPhaseStep;
+ }
+
+ void CaveDestruction(bool bBool)
+ {
+ if (GoSummonList.empty())
+ return;
+
+ for(std::list<uint64>::iterator itr = GoSummonList.begin(); itr != GoSummonList.end(); ++itr)
+ {
+ if (GameObject* pGo = GameObject::GetGameObject(*m_creature, *itr))
+ {
+ if (pGo)
+ {
+ if (Creature *trigger = pGo->SummonTrigger(pGo->GetPositionX(), pGo->GetPositionY(),pGo->GetPositionZ(), 0, 1))
+ {
+ //visual effects are not working! ¬¬
+ trigger->CastSpell(trigger,11542,true);
+ trigger->CastSpell(trigger,35470,true);
+ }
+ pGo->RemoveFromWorld();
+ //pGo->CastSpell(m_creature,12158); makes all die?!
+ }
+ }
+ }
+
+ if (bBool)
+ {
+ if (pInstance)
+ if (GameObject* pGo = GameObject::GetGameObject((*m_creature),pInstance->GetData64(DATA_GO_CAVE_IN_RIGHT)))
+ pInstance->HandleGameObject(NULL,false,pGo);
+ }else
+ if (pInstance)
+ if (GameObject* pGo = GameObject::GetGameObject((*m_creature),pInstance->GetData64(DATA_GO_CAVE_IN_LEFT)))
+ pInstance->HandleGameObject(NULL,false,pGo);
+ }
+
+ void SetInFace(bool bBool)
+ {
+ if (!pInstance)
+ return;
+
+ if (bBool)
+ {
+ if (GameObject* pGo = GameObject::GetGameObject((*m_creature),pInstance->GetData64(DATA_GO_CAVE_IN_RIGHT)))
+ m_creature->SetFacingToObject(pGo);
+ }else
+ if (GameObject* pGo = GameObject::GetGameObject((*m_creature),pInstance->GetData64(DATA_GO_CAVE_IN_LEFT)))
+ m_creature->SetFacingToObject(pGo);
+ }
+
+ void RestoreAll()
+ {
+ if (!pInstance)
+ return;
+
+ if (GameObject* pGo = GameObject::GetGameObject((*m_creature),pInstance->GetData64(DATA_GO_CAVE_IN_RIGHT)))
+ pInstance->HandleGameObject(NULL,false,pGo);
+
+ if (GameObject* pGo = GameObject::GetGameObject((*m_creature),pInstance->GetData64(DATA_GO_CAVE_IN_LEFT)))
+ pInstance->HandleGameObject(NULL,false,pGo);
+
+ if (!GoSummonList.empty())
+ for(std::list<uint64>::iterator itr = GoSummonList.begin(); itr != GoSummonList.end(); ++itr)
+ {
+ if (GameObject* pGo = GameObject::GetGameObject(*m_creature, *itr))
+ pGo->RemoveFromWorld();
+ }
+
+ if (!SummonList.empty())
+ for(std::list<uint64>::iterator itr = SummonList.begin(); itr != SummonList.end(); ++itr)
+ {
+ if (Creature* pSummon = Unit::GetCreature(*m_creature, *itr))
+ {
+ if (pSummon->isAlive())
+ pSummon->DisappearAndDie();
+ else
+ pSummon->RemoveCorpse();
+ }
+ }
+ }
+
+ void AggroAllPlayers(Creature* pTemp)
+ {
+ Map::PlayerList const &PlList = m_creature->GetMap()->GetPlayers();
+
+ if(PlList.isEmpty())
+ return;
+
+ for (Map::PlayerList::const_iterator i = PlList.begin(); i != PlList.end(); ++i)
+ {
+ if(Player* pPlayer = i->getSource())
+ {
+ if(pPlayer->isGameMaster())
+ continue;
+
+ if(pPlayer->isAlive())
+ {
+ pTemp->SetInCombatWith(pPlayer);
+ pPlayer->SetInCombatWith(pTemp);
+ pTemp->AddThreat(pPlayer, 0.0f);
+ }
+ }
+ }
+ }
+
+ void WaypointReached(uint32 uiPoint)
+ {
+ //just in case
+ if (GetPlayerForEscort())
+ if (m_creature->getFaction() != GetPlayerForEscort()->getFaction())
+ m_creature->setFaction(GetPlayerForEscort()->getFaction());
+
+ switch(uiPoint)
+ {
+ case 3:
+ SetEscortPaused(true);
+ NextStep(2000,false,3);
+ break;
+ case 7:
+ SetEscortPaused(true);
+ NextStep(2000,false,4);
+ break;
+ case 9:
+ NextStep(1000,false,8);
+ break;
+ case 10:
+ NextStep(25000,false,10);
+ break;
+ case 11:
+ SetEscortPaused(true);
+ SetInFace(true);
+ NextStep(1000,false,11);
+ break;
+ case 12:
+ NextStep(25000,false,18);
+ break;
+ case 13:
+ Summon(7);
+ NextStep(25000,false,19);
+ break;
+ case 14:
+ SetInFace(false);
+ DoScriptText(SAY_BLASTMASTER_26,m_creature);
+ SetEscortPaused(true);
+ NextStep(5000,false,20);
+ break;
+ }
+ }
+
+ void SetData(uint32 uiI,uint32 uiValue)
+ {
+ switch(uiI)
+ {
+ case 1:
+ SetEscortPaused(true);
+ DoScriptText(SAY_BLASTMASTER_0,m_creature);
+ NextStep(1500,true);
+ break;
+ case 2:
+ if (!pInstance)
+ return;
+
+ switch(uiValue)
+ {
+ case 1:
+ pInstance->SetData(TYPE_EVENT, IN_PROGRESS);
+ break;
+ case 2:
+ pInstance->SetData(TYPE_EVENT, DONE);
+ NextStep(5000,false,22);
+ break;
+ }
+ break;
+ }
+ }
+
+ void Summon(uint8 uiCase)
+ {
+ switch(uiCase)
+ {
+ case 1:
+ m_creature->SummonCreature(NPC_CAVERNDEEP_AMBUSHER, SpawnPosition[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ m_creature->SummonCreature(NPC_CAVERNDEEP_AMBUSHER, SpawnPosition[1], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ m_creature->SummonCreature(NPC_CAVERNDEEP_AMBUSHER, SpawnPosition[2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ m_creature->SummonCreature(NPC_CAVERNDEEP_AMBUSHER, SpawnPosition[3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ m_creature->SummonCreature(NPC_CAVERNDEEP_AMBUSHER, SpawnPosition[4], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ m_creature->SummonCreature(NPC_CAVERNDEEP_AMBUSHER, SpawnPosition[5], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ m_creature->SummonCreature(NPC_CAVERNDEEP_AMBUSHER, SpawnPosition[6], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ m_creature->SummonCreature(NPC_CAVERNDEEP_AMBUSHER, SpawnPosition[7], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ m_creature->SummonCreature(NPC_CAVERNDEEP_AMBUSHER, SpawnPosition[8], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ m_creature->SummonCreature(NPC_CAVERNDEEP_AMBUSHER, SpawnPosition[9], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ break;
+ case 2:
+ if (GameObject* pGo = m_creature->SummonGameObject(183410, -533.140,-105.322,-156.016, 0, 0, 0, 0, 0, 1000))
+ {
+ GoSummonList.push_back(pGo->GetGUID());
+ pGo->SetFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1); //We can't use it!
+ }
+ Summon(3);
+ break;
+ case 3:
+ m_creature->SummonCreature(NPC_CAVERNDEEP_AMBUSHER, SpawnPosition[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ m_creature->SummonCreature(NPC_CAVERNDEEP_AMBUSHER, SpawnPosition[1], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ m_creature->SummonCreature(NPC_CAVERNDEEP_AMBUSHER, SpawnPosition[2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ m_creature->SummonCreature(NPC_CAVERNDEEP_AMBUSHER, SpawnPosition[3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ DoScriptText(SAY_BLASTMASTER_19,m_creature);
+ break;
+ case 4:
+ if (GameObject* pGo = m_creature->SummonGameObject(183410, -542.199,-96.854,-155.790, 0, 0, 0, 0, 0, 1000))
+ {
+ GoSummonList.push_back(pGo->GetGUID());
+ pGo->SetFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1);
+ }
+ break;
+ case 5:
+ m_creature->SummonCreature(NPC_CAVERNDEEP_AMBUSHER, SpawnPosition[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ m_creature->SummonCreature(NPC_CAVERNDEEP_AMBUSHER, SpawnPosition[1], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ m_creature->SummonCreature(NPC_CAVERNDEEP_AMBUSHER, SpawnPosition[2], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ DoScriptText(SAY_BLASTMASTER_15,m_creature);
+ break;
+ case 6:
+ m_creature->SummonCreature(NPC_CAVERNDEEP_AMBUSHER, SpawnPosition[10], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ m_creature->SummonCreature(NPC_CAVERNDEEP_AMBUSHER, SpawnPosition[11], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ m_creature->SummonCreature(NPC_CAVERNDEEP_AMBUSHER, SpawnPosition[12], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ m_creature->SummonCreature(NPC_CAVERNDEEP_AMBUSHER, SpawnPosition[13], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ m_creature->SummonCreature(NPC_CAVERNDEEP_AMBUSHER, SpawnPosition[14], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ break;
+ case 7:
+ if (GameObject* pGo = m_creature->SummonGameObject(183410, -507.820,-103.333,-151.353, 0, 0, 0, 0, 0, 1000))
+ {
+ GoSummonList.push_back(pGo->GetGUID());
+ pGo->SetFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1); //We can't use it!
+ Summon(6);
+ }
+ break;
+ case 8:
+ if (GameObject* pGo = m_creature->SummonGameObject(183410, -511.829,-86.249,-151.431, 0, 0, 0, 0, 0, 1000))
+ {
+ GoSummonList.push_back(pGo->GetGUID());
+ pGo->SetFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1); //We can't use it!
+ }
+ break;
+ case 9:
+ if (Creature* pGrubbis = m_creature->SummonCreature(NPC_GRUBBIS, SpawnPosition[15], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000))
+ DoScriptText(SAY_GRUBBIS,pGrubbis);
+ m_creature->SummonCreature(NPC_CHOMPER, SpawnPosition[16], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 1800000);
+ break;
+ }
+ }
+
+ void UpdateEscortAI(const uint32 uiDiff)
+ {
+ if (uiPhase)
+ {
+ if (uiTimer <= uiDiff)
+ {
+ switch(uiPhase)
+ {
+ case 1:
+ DoScriptText(SAY_BLASTMASTER_1,m_creature);
+ NextStep(1500,true);
+ break;
+ case 2:
+ SetEscortPaused(false);
+ NextStep(0,false,0);
+ break;
+ case 3:
+ DoScriptText(SAY_BLASTMASTER_2,m_creature);
+ SetEscortPaused(false);
+ NextStep(0,false,0);
+ break;
+ case 4:
+ DoScriptText(SAY_BLASTMASTER_3,m_creature);
+ NextStep(3000,true);
+ break;
+ case 5:
+ DoScriptText(SAY_BLASTMASTER_4,m_creature);
+ NextStep(3000,true);
+ break;
+ case 6:
+ SetInFace(true);
+ DoScriptText(SAY_BLASTMASTER_5,m_creature);
+ Summon(1);
+ if (pInstance)
+ if (GameObject* pGo = GameObject::GetGameObject((*m_creature),pInstance->GetData64(DATA_GO_CAVE_IN_RIGHT)))
+ pInstance->HandleGameObject(NULL,true,pGo);
+ NextStep(3000,true);
+ break;
+ case 7:
+ DoScriptText(SAY_BLASTMASTER_6,m_creature);
+ SetEscortPaused(false);
+ NextStep(0,false,0);
+ break;
+ case 8:
+ m_creature->HandleEmoteCommand(EMOTE_STATE_WORK);
+ NextStep(25000,true);
+ break;
+ case 9:
+ Summon(2);
+ NextStep(0,false);
+ break;
+ case 10:
+ Summon(4);
+ NextStep(0,false);
+ break;
+ case 11:
+ DoScriptText(SAY_BLASTMASTER_17,m_creature);
+ NextStep(5000,true);
+ break;
+ case 12:
+ DoScriptText(SAY_BLASTMASTER_18,m_creature);
+ NextStep(5000,true);
+ break;
+ case 13:
+ DoScriptText(SAY_BLASTMASTER_20,m_creature);
+ CaveDestruction(true);
+ NextStep(8000,true);
+ break;
+ case 14:
+ DoScriptText(SAY_BLASTMASTER_21,m_creature);
+ NextStep(8500,true);
+ break;
+ case 15:
+ DoScriptText(SAY_BLASTMASTER_22,m_creature);
+ NextStep(2000,true);
+ break;
+ case 16:
+ DoScriptText(SAY_BLASTMASTER_23,m_creature);
+ SetInFace(false);
+ if (pInstance)
+ if (GameObject* pGo = GameObject::GetGameObject((*m_creature),pInstance->GetData64(DATA_GO_CAVE_IN_LEFT)))
+ pInstance->HandleGameObject(NULL,true,pGo);
+ NextStep(2000,true);
+ break;
+ case 17:
+ SetEscortPaused(false);
+ DoScriptText(SAY_BLASTMASTER_24,m_creature);
+ Summon(6);
+ NextStep(0,false);
+ break;
+ case 18:
+ Summon(7);
+ NextStep(0,false);
+ break;
+ case 19:
+ SetInFace(false);
+ Summon(8);
+ DoScriptText(SAY_BLASTMASTER_25,m_creature);
+ NextStep(0,false);
+ break;
+ case 20:
+ DoScriptText(SAY_BLASTMASTER_27,m_creature);
+ NextStep(2000,true);
+ break;
+ case 21:
+ Summon(9);
+ NextStep(0,false);
+ break;
+ case 22:
+ CaveDestruction(false);
+ DoScriptText(SAY_BLASTMASTER_20,m_creature);
+ NextStep(0,false);
+ break;
+ }
+ } else uiTimer -= uiDiff;
+ }
+
+ if (!UpdateVictim())
+ return;
+
+ DoMeleeAttackIfReady();
+ }
+
+ void JustSummoned(Creature* pSummon)
+ {
+ SummonList.push_back(pSummon->GetGUID());
+ AggroAllPlayers(pSummon);
+ }
+};
+
+CreatureAI* GetAI_npc_blastmaster_emi_shortfuse(Creature* pCreature)
+{
+ return new npc_blastmaster_emi_shortfuseAI(pCreature);
+}
+
+bool GossipHello_npc_blastmaster_emi_shortfuse(Player* pPlayer, Creature* pCreature)
+{
+ ScriptedInstance* pInstance = pCreature->GetInstanceData();
+
+ if (pInstance && pInstance->GetData(TYPE_EVENT) == NOT_STARTED)
+ pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_START_EVENT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
+
+ pPlayer->SEND_GOSSIP_MENU(GOSSIP_TEXT_EMI, pCreature->GetGUID());
+
+ return true;
+}
+
+bool GossipSelect_npc_blastmaster_emi_shortfuse(Player* pPlayer, Creature* pCreature, uint32 uiSender, uint32 uiAction)
+{
+ if (uiAction == GOSSIP_ACTION_INFO_DEF+1)
+ {
+ if (npc_escortAI* pEscortAI = CAST_AI(npc_blastmaster_emi_shortfuseAI, pCreature->AI()))
+ pEscortAI->Start(true, false,pPlayer->GetGUID());
+
+ pCreature->setFaction(pPlayer->getFaction());
+ pCreature->AI()->SetData(1,0);
+
+ pPlayer->CLOSE_GOSSIP_MENU();
+ }
+ return true;
+}
+
+struct TRINITY_DLL_DECL boss_grubbisAI : public ScriptedAI
+{
+ boss_grubbisAI(Creature* pCreature) : ScriptedAI(pCreature)
+ {
+ SetDataSummoner();
+ }
+
+ void SetDataSummoner()
+ {
+ if (!m_creature->isSummon())
+ return;
+
+ if (Unit* pSummon = CAST_SUM(m_creature)->GetSummoner())
+ CAST_CRE(pSummon)->AI()->SetData(2,1);
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ DoMeleeAttackIfReady();
+ }
+
+ void JustDied(Unit* pKiller)
+ {
+ if (!m_creature->isSummon())
+ return;
+
+ if (Unit* pSummon = CAST_SUM(m_creature)->GetSummoner())
+ CAST_CRE(pSummon)->AI()->SetData(2,2);
+ }
+};
+
+CreatureAI* GetAI_boss_grubbis(Creature* pCreature)
+{
+ return new boss_grubbisAI(pCreature);
+}
+
+void AddSC_gnomeregan()
+{
+ Script* newscript;
+
+ newscript = new Script;
+ newscript->Name = "npc_blastmaster_emi_shortfuse";
+ newscript->pGossipHello = &GossipHello_npc_blastmaster_emi_shortfuse;
+ newscript->pGossipSelect = &GossipSelect_npc_blastmaster_emi_shortfuse;
+ newscript->GetAI = &GetAI_npc_blastmaster_emi_shortfuse;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "boss_grubbis";
+ newscript->GetAI = &GetAI_boss_grubbis;
+ newscript->RegisterSelf();
+}
diff --git a/src/bindings/scripts/scripts/eastern_kingdoms/gnomeregan/gnomeregan.h b/src/bindings/scripts/scripts/eastern_kingdoms/gnomeregan/gnomeregan.h
new file mode 100644
index 00000000000..e46c811e9b1
--- /dev/null
+++ b/src/bindings/scripts/scripts/eastern_kingdoms/gnomeregan/gnomeregan.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2010 Trinity <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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
+ * 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
+ */
+
+#ifndef DEF_GNOMEREGAN_H
+#define DEF_GNOMEREGAN_H
+
+enum eGameObjects
+{
+ GO_CAVE_IN_LEFT = 146085,
+ GO_CAVE_IN_RIGHT = 146086
+};
+
+enum eCreatures
+{
+ NPC_BLASTMASTER_EMI_SHORTFUSE = 7998,
+ NPC_CAVERNDEEP_AMBUSHER = 6207,
+ NPC_GRUBBIS = 7361,
+ NPC_CHOMPER = 6215
+};
+
+enum eData
+{
+ TYPE_EVENT = 1
+};
+
+enum eData64
+{
+ DATA_GO_CAVE_IN_LEFT,
+ DATA_GO_CAVE_IN_RIGHT,
+ DATA_NPC_BASTMASTER_EMI_SHORTFUSE
+};
+
+#endif
diff --git a/src/bindings/scripts/scripts/eastern_kingdoms/gnomeregan/instance_gnomeregan.cpp b/src/bindings/scripts/scripts/eastern_kingdoms/gnomeregan/instance_gnomeregan.cpp
new file mode 100644
index 00000000000..473a01a106d
--- /dev/null
+++ b/src/bindings/scripts/scripts/eastern_kingdoms/gnomeregan/instance_gnomeregan.cpp
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2010 Trinity <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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
+ * 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
+ */
+
+#include "precompiled.h"
+#include "gnomeregan.h"
+
+#define MAX_ENCOUNTER 1
+
+struct TRINITY_DLL_DECL instance_gnomeregan : public ScriptedInstance
+{
+ instance_gnomeregan(Map* pMap) : ScriptedInstance(pMap)
+ {
+ Initialize();
+ };
+
+ uint32 m_auiEncounter[MAX_ENCOUNTER];
+
+ uint64 uiCaveInLeftGUID;
+ uint64 uiCaveInRightGUID;
+
+ uint64 uiBastmasterEmiShortfuseGUID;
+
+ void Initialize()
+ {
+ memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
+
+ uiCaveInLeftGUID = 0;
+ uiCaveInRightGUID = 0;
+
+ uiBastmasterEmiShortfuseGUID = 0;
+ }
+
+ void Load(const char* in)
+ {
+ if (!in)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
+
+ OUT_LOAD_INST_DATA(in);
+
+ std::istringstream loadStream(in);
+ loadStream >> m_auiEncounter[0];
+
+ for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
+ {
+ if (m_auiEncounter[i] == IN_PROGRESS)
+ m_auiEncounter[i] = NOT_STARTED;
+ }
+
+ OUT_LOAD_INST_DATA_COMPLETE;
+ }
+
+ void OnCreatureCreate(Creature* pCreature, bool bAdd)
+ {
+ switch(pCreature->GetEntry())
+ {
+ case NPC_BLASTMASTER_EMI_SHORTFUSE: uiBastmasterEmiShortfuseGUID = pCreature->GetGUID(); break;
+ }
+ }
+
+ void OnGameObjectCreate(GameObject* pGo, bool bAdd)
+ {
+ switch(pGo->GetEntry())
+ {
+ case GO_CAVE_IN_LEFT:
+ uiCaveInLeftGUID = pGo->GetGUID();
+ HandleGameObject(NULL,false,pGo);
+ break;
+ case GO_CAVE_IN_RIGHT:
+ uiCaveInRightGUID = pGo->GetGUID();
+ HandleGameObject(NULL,false,pGo);
+ break;
+ }
+ }
+
+ uint64 GetData64(uint32 uiType)
+ {
+ switch(uiType)
+ {
+ case DATA_GO_CAVE_IN_LEFT: return uiCaveInLeftGUID;
+ case DATA_GO_CAVE_IN_RIGHT: return uiCaveInRightGUID;
+ case DATA_NPC_BASTMASTER_EMI_SHORTFUSE: return uiBastmasterEmiShortfuseGUID;
+ }
+
+ return 0;
+ }
+};
+
+InstanceData* GetInstanceData_instance_gnomeregan(Map* pMap)
+{
+ return new instance_gnomeregan(pMap);
+}
+
+void AddSC_instance_gnomeregan()
+{
+ Script* newscript;
+
+ newscript = new Script;
+ newscript->Name = "instance_gnomeregan";
+ newscript->GetInstanceData = &GetInstanceData_instance_gnomeregan;
+ newscript->RegisterSelf();
+}
diff --git a/src/bindings/scripts/scripts/northrend/sholazar_basin.cpp b/src/bindings/scripts/scripts/northrend/sholazar_basin.cpp
index adc6ff94e3e..85fb0f06fb0 100644
--- a/src/bindings/scripts/scripts/northrend/sholazar_basin.cpp
+++ b/src/bindings/scripts/scripts/northrend/sholazar_basin.cpp
@@ -320,4 +320,9 @@ void AddSC_sholazar_basin()
newscript->pGossipHello = &GossipHello_npc_avatar_of_freya;
newscript->pGossipSelect = &GossipSelect_npc_avatar_of_freya;
newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name = "npc_bushwhacker";
+ newscript->GetAI = &GetAI_npc_bushwhacker;
+ newscript->RegisterSelf();
}
diff --git a/src/bindings/scripts/system/ScriptLoader.cpp b/src/bindings/scripts/system/ScriptLoader.cpp
index 2fc5dd5e757..8bbea6822dc 100644
--- a/src/bindings/scripts/system/ScriptLoader.cpp
+++ b/src/bindings/scripts/system/ScriptLoader.cpp
@@ -63,6 +63,8 @@ extern void AddSC_boss_victor_nefarius();
extern void AddSC_boss_mr_smite();
extern void AddSC_deadmines(); //Deadmines
extern void AddSC_instance_deadmines();
+extern void AddSC_gnomeregan(); //Gnomeregan
+extern void AddSC_instance_gnomeregan();
extern void AddSC_boss_attumen(); //Karazhan
extern void AddSC_boss_curator();
extern void AddSC_boss_maiden_of_virtue();
@@ -522,6 +524,8 @@ void AddScripts()
AddSC_boss_mr_smite();
AddSC_deadmines(); //Deadmines
AddSC_instance_deadmines();
+ AddSC_gnomeregan(); //Gnomeregan
+ AddSC_instance_gnomeregan();
AddSC_boss_attumen(); //Karazhan
AddSC_boss_curator();
AddSC_boss_maiden_of_virtue();