diff options
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; |
