aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/5462_world_scripts.sql11
-rw-r--r--src/bindings/scripts/scripts/outland/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp20
-rw-r--r--src/bindings/scripts/scripts/outland/coilfang_resevoir/serpent_shrine/def_serpent_shrine.h10
-rw-r--r--src/bindings/scripts/scripts/outland/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp101
4 files changed, 114 insertions, 28 deletions
diff --git a/sql/updates/5462_world_scripts.sql b/sql/updates/5462_world_scripts.sql
new file mode 100644
index 00000000000..278244dd2c7
--- /dev/null
+++ b/sql/updates/5462_world_scripts.sql
@@ -0,0 +1,11 @@
+DELETE FROM `creature_ai_scripts` WHERE `creature_id` IN (21220,21301);
+INSERT INTO `creature_ai_scripts` () VALUES
+(2122001, 21220, 0, 0, 100, 3, 0, 0, 12500, 12500, 11, 38582, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Priestess - Casts Holy Smite'),
+(2122002, 21220, 2, 0, 100, 2, 50, 0, 0, 0, 11, 38580, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Priestess - Casts Greater Heal at 50% HP'),
+(2122003, 21220, 2, 0, 100, 2, 20, 0, 0, 0, 11, 38580, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Priestess - Casts Greater Heal at 20% HP'),
+(2122004, 21220, 0, 0, 100, 3, 3600, 3600, 10400, 14200, 11, 38585, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Priestess - Casts Holy Fire'),
+(2122005, 21220, 6, 0, 100, 3, 0, 0, 0, 0, 34, 25, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Priestess - Set Instance Data 1'),
+(2130101, 21301, 0, 0, 100, 3, 14100, 14100, 21000, 21500, 11, 38591, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Shatterer - Casts Shatter Armor'),
+(2130102, 21301, 6, 0, 100, 3, 0, 0, 0, 0, 34, 25, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Coilfang Shatterer - Set Instance Data 1');
+
+
diff --git a/src/bindings/scripts/scripts/outland/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp b/src/bindings/scripts/scripts/outland/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp
index 268d8c3973e..fcc9c70a0f7 100644
--- a/src/bindings/scripts/scripts/outland/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp
+++ b/src/bindings/scripts/scripts/outland/coilfang_resevoir/serpent_shrine/boss_lurker_below.cpp
@@ -35,7 +35,6 @@ EndScriptData */
#define SPELL_WATERBOLT 37138
#define SPELL_SUBMERGE 37550
#define SPELL_EMERGE 20568
-#define SPELL_SCALDINGWATER 37284
#define EMOTE_SPOUT "The Lurker Below takes a deep breath."
@@ -166,25 +165,6 @@ struct TRINITY_DLL_DECL boss_the_lurker_belowAI : public Scripted_NoMovementAI
void UpdateAI(const uint32 diff)
{
- //MAP 548
- //Check if players in water and if in water cast spell
- /*Map* pMap = m_creature->GetMap();
- if (pMap->IsDungeon() && pInstance && pInstance->GetData(DATA_THELURKERBELOWEVENT) == IN_PROGRESS)
- {
- Map::PlayerList const &PlayerList = pMap->GetPlayers();
-
- if (PlayerList.isEmpty())
- return;
-
- for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
- {
- if (i->getSource()->isAlive() && i->getSource()->IsInWater() && !i->getSource()->HasAura(SPELL_SCALDINGWATER))
- i->getSource()->CastSpell(i->getSource(), SPELL_SCALDINGWATER, true);
- else if (!i->getSource()->IsInWater())
- i->getSource()->RemoveAurasDueToSpell(SPELL_SCALDINGWATER);
- }
- }*/
-
if(!CanStartEvent)//boss is invisible, don't attack
{
if(CheckCanStart())
diff --git a/src/bindings/scripts/scripts/outland/coilfang_resevoir/serpent_shrine/def_serpent_shrine.h b/src/bindings/scripts/scripts/outland/coilfang_resevoir/serpent_shrine/def_serpent_shrine.h
index e3a908a4cd5..adfa39dc7e0 100644
--- a/src/bindings/scripts/scripts/outland/coilfang_resevoir/serpent_shrine/def_serpent_shrine.h
+++ b/src/bindings/scripts/scripts/outland/coilfang_resevoir/serpent_shrine/def_serpent_shrine.h
@@ -8,7 +8,13 @@ enum LurkerEventState
{
LURKER_NOT_STARTED = 0,
LURKER_FISHING = 1,
- LURKER_HOOKED = 2,
+ LURKER_HOOKED = 2
+};
+enum WaterEventState
+{
+ WATERSTATE_NONE = 0,
+ WATERSTATE_FRENZY = 1,
+ WATERSTATE_SCALDING = 2
};
#define DATA_CANSTARTPHASE3 1
#define DATA_CARIBDIS 2
@@ -33,5 +39,7 @@ enum LurkerEventState
#define DATA_LEOTHERAS_EVENT_STARTER 21
#define DATA_CONTROL_CONSOLE 22
#define DATA_STRANGE_POOL 23
+#define DATA_WATER 24
+#define DATA_TRASH 25
#endif
diff --git a/src/bindings/scripts/scripts/outland/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp b/src/bindings/scripts/scripts/outland/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp
index 0a4a8d2b911..d261b2970ad 100644
--- a/src/bindings/scripts/scripts/outland/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp
+++ b/src/bindings/scripts/scripts/outland/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp
@@ -25,6 +25,16 @@ EndScriptData */
#include "def_serpent_shrine.h"
#define MAX_ENCOUNTER 6
+#define SPELL_SCALDINGWATER 37284
+#define MOB_COILFANG_FRENZY 21508
+#define TRASHMOB_COILFANG_PRIESTESS 21220 //6*2
+#define TRASHMOB_COILFANG_SHATTERER 21301 //6*3
+
+#define MIN_KILLS 30
+
+//NOTE: there are 6 platforms
+//there should be 3 shatterers and 2 priestess on all platforms, total of 30 elites, else it won't work!
+//delete all other elites not on platforms! these mobs should only be on those platforms nowhere else.
/* Serpentshrine cavern encounters:
0 - Hydross The Unstable event
@@ -67,9 +77,14 @@ struct TRINITY_DLL_DECL instance_serpentshrine_cavern : public ScriptedInstance
uint32 StrangePool;
uint32 FishingTimer;
uint32 LurkerSubEvent;
+ uint32 WaterCheckTimer;
+ uint32 FrenzySpawnTimer;
+ uint32 Water;
+ uint32 TrashCount;
bool ShieldGeneratorDeactivated[4];
uint32 m_auiEncounter[MAX_ENCOUNTER];
+ bool DoSpawnFrenzy;
void Initialize()
{
@@ -90,6 +105,7 @@ struct TRINITY_DLL_DECL instance_serpentshrine_cavern : public ScriptedInstance
BridgePart[1] = 0;
BridgePart[2] = 0;
StrangePool = 0;
+ Water = WATERSTATE_FRENZY;
ShieldGeneratorDeactivated[0] = false;
ShieldGeneratorDeactivated[1] = false;
@@ -97,6 +113,11 @@ struct TRINITY_DLL_DECL instance_serpentshrine_cavern : public ScriptedInstance
ShieldGeneratorDeactivated[3] = false;
FishingTimer = 1000;
LurkerSubEvent = 0;
+ WaterCheckTimer = 500;
+ FrenzySpawnTimer = 2000;
+ DoSpawnFrenzy = false;
+ TrashCount = 0;
+
}
bool IsEncounterInProgress() const
@@ -114,10 +135,60 @@ struct TRINITY_DLL_DECL instance_serpentshrine_cavern : public ScriptedInstance
{
if(FishingTimer < diff)
{
- LurkerSubEvent == LURKER_HOOKED;
+ LurkerSubEvent = LURKER_HOOKED;
SetData(DATA_STRANGE_POOL, IN_PROGRESS);//just fished, signal Lurker script to emerge and start fight, we use IN_PROGRESS so it won't get saved and lurker will be alway invis at start if server restarted
}else FishingTimer -= diff;
}
+ //Water checks
+ if(WaterCheckTimer < diff)
+ {
+ if(TrashCount >= MIN_KILLS)
+ Water = WATERSTATE_SCALDING;
+ else
+ Water = WATERSTATE_FRENZY;
+
+ Map::PlayerList const &PlayerList = instance->GetPlayers();
+ if (PlayerList.isEmpty())
+ return;
+ for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
+ {
+ if (Player* pPlayer = i->getSource())
+ {
+ if (pPlayer->isAlive() && /*i->getSource()->GetPositionZ() <= -21.434931f*/pPlayer->IsInWater())
+ {
+ if(Water == WATERSTATE_SCALDING)
+ {
+
+ if(!pPlayer->HasAura(SPELL_SCALDINGWATER))
+ {
+ pPlayer->CastSpell(pPlayer, SPELL_SCALDINGWATER,true);
+ }
+ }else if(Water == WATERSTATE_FRENZY)
+ {
+ //spawn frenzy
+ if(DoSpawnFrenzy)
+ {
+ if(Creature* frenzy = pPlayer->SummonCreature(MOB_COILFANG_FRENZY,pPlayer->GetPositionX(),pPlayer->GetPositionY(),pPlayer->GetPositionZ(),pPlayer->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,2000))
+ {
+ frenzy->Attack(pPlayer,false);
+ frenzy->AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING + MOVEMENTFLAG_LEVITATING);
+ }
+ DoSpawnFrenzy = false;
+ }
+ }
+ }
+ if(!pPlayer->IsInWater())
+ pPlayer->RemoveAurasDueToSpell(SPELL_SCALDINGWATER);
+ }
+
+ }
+ WaterCheckTimer = 500;//remove stress from core
+ }else WaterCheckTimer -= diff;
+ if(FrenzySpawnTimer < diff)
+ {
+ DoSpawnFrenzy = true;
+ FrenzySpawnTimer = 2000;
+ }else FrenzySpawnTimer -= diff;
}
void OnGameObjectCreate(GameObject* pGo, bool add)
@@ -163,8 +234,14 @@ struct TRINITY_DLL_DECL instance_serpentshrine_cavern : public ScriptedInstance
case 21217: LurkerBelow = pCreature->GetGUID(); break;
case 21965: Tidalvess = pCreature->GetGUID(); break;
case 21964: Caribdis = pCreature->GetGUID(); break;
- case 21215: LeotherasTheBlind = pCreature->GetGUID(); break;}
- }
+ case 21215: LeotherasTheBlind = pCreature->GetGUID(); break;
+ /*case TRASHMOB_COILFANG_PRIESTESS:
+ case TRASHMOB_COILFANG_SHATTERER:
+ if(pCreature->isAlive())
+ TrashCount++;
+ break;*/
+ }
+ }
void SetData64(uint32 type, uint64 data)
{
@@ -201,6 +278,7 @@ struct TRINITY_DLL_DECL instance_serpentshrine_cavern : public ScriptedInstance
if(data == NOT_STARTED)
LurkerSubEvent = LURKER_NOT_STARTED;
}
+ break;
case DATA_CONTROL_CONSOLE:
if (data == DONE)
{
@@ -208,7 +286,15 @@ struct TRINITY_DLL_DECL instance_serpentshrine_cavern : public ScriptedInstance
HandleGameObject(BridgePart[0], true);
HandleGameObject(BridgePart[0], true);
}
- ControlConsole = data;
+ ControlConsole = data;break;
+ case DATA_TRASH :
+ {
+ if(data == 1 && TrashCount < MIN_KILLS)
+ TrashCount++;//+1 died
+ SaveToDB();
+ break;
+ }
+ case DATA_WATER : Water = data;break;
case DATA_HYDROSSTHEUNSTABLEEVENT: m_auiEncounter[0] = data; break;
case DATA_LEOTHERASTHEBLINDEVENT: m_auiEncounter[1] = data; break;
case DATA_THELURKERBELOWEVENT: m_auiEncounter[2] = data; break;
@@ -251,7 +337,8 @@ struct TRINITY_DLL_DECL instance_serpentshrine_cavern : public ScriptedInstance
case DATA_SHIELDGENERATOR4: return ShieldGeneratorDeactivated[3];
case DATA_CANSTARTPHASE3:
if (ShieldGeneratorDeactivated[0] && ShieldGeneratorDeactivated[1] && ShieldGeneratorDeactivated[2] && ShieldGeneratorDeactivated[3])return 1;break;
- case DATA_STRANGE_POOL: return StrangePool;
+ case DATA_STRANGE_POOL: return StrangePool;
+ case DATA_WATER: return Water;
}
return 0;
}
@@ -260,7 +347,7 @@ struct TRINITY_DLL_DECL instance_serpentshrine_cavern : public ScriptedInstance
OUT_SAVE_INST_DATA;
std::ostringstream stream;
stream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " "
- << m_auiEncounter[3] << " " << m_auiEncounter[4] << " " << m_auiEncounter[5];
+ << m_auiEncounter[3] << " " << m_auiEncounter[4] << " " << m_auiEncounter[5] << " " << TrashCount;
char* out = new char[stream.str().length() + 1];
strcpy(out, stream.str().c_str());
if (out)
@@ -281,7 +368,7 @@ struct TRINITY_DLL_DECL instance_serpentshrine_cavern : public ScriptedInstance
OUT_LOAD_INST_DATA(in);
std::istringstream stream(in);
stream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3]
- >> m_auiEncounter[4] >> m_auiEncounter[5];
+ >> m_auiEncounter[4] >> m_auiEncounter[5] >> TrashCount;
for(uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS) // Do not load an encounter as "In Progress" - reset it instead.
m_auiEncounter[i] = NOT_STARTED;