aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOvahlord <dreadkiller@gmx.de>2024-02-16 15:40:47 +0100
committerOvahlord <dreadkiller@gmx.de>2024-02-16 15:40:47 +0100
commit8e01b350e3492126948291cc859c9d990e28f130 (patch)
treead9e458694bd1aa4c197c1462a95227098b44d25 /src
parent6331b44e0f7155a4004086543dc0c1769e8670d9 (diff)
Scripts/Misc: removed more post WotLK scripts
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Battlefield/BattlefieldTB.cpp781
-rw-r--r--src/server/scripts/Battlefield/BattlefieldTB.h643
-rw-r--r--src/server/scripts/Battlefield/battlefield_script_loader.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h59
-rw-r--r--src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp266
-rw-r--r--src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp365
-rw-r--r--src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp190
-rw-r--r--src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp127
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp870
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h54
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_ascendant_lord_obsidius.cpp110
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_beauty.cpp117
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_corla.cpp127
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_karsh_steelbender.cpp112
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_romogg_bonecrusher.cpp137
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/instance_blackrock_caverns.cpp82
-rw-r--r--src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp23
-rw-r--r--src/server/scripts/EasternKingdoms/zone_tol_barad.cpp114
-rw-r--r--src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp691
-rw-r--r--src/server/scripts/Kalimdor/Firelands/boss_baleroc.cpp839
-rw-r--r--src/server/scripts/Kalimdor/Firelands/firelands.cpp337
-rw-r--r--src/server/scripts/Kalimdor/Firelands/firelands.h135
-rw-r--r--src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp123
-rw-r--r--src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp570
-rw-r--r--src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp327
-rw-r--r--src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp380
-rw-r--r--src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h125
-rw-r--r--src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp243
-rw-r--r--src/server/scripts/Kalimdor/LostCityOfTheTolvir/boss_general_husam.cpp547
-rw-r--r--src/server/scripts/Kalimdor/LostCityOfTheTolvir/boss_lockmaw.cpp561
-rw-r--r--src/server/scripts/Kalimdor/LostCityOfTheTolvir/instance_lost_city_of_the_tolvir.cpp204
-rw-r--r--src/server/scripts/Kalimdor/LostCityOfTheTolvir/lost_city_of_the_tolvir.h78
-rw-r--r--src/server/scripts/Kalimdor/kalimdor_script_loader.cpp26
33 files changed, 0 insertions, 9365 deletions
diff --git a/src/server/scripts/Battlefield/BattlefieldTB.cpp b/src/server/scripts/Battlefield/BattlefieldTB.cpp
deleted file mode 100644
index 05222f50052..00000000000
--- a/src/server/scripts/Battlefield/BattlefieldTB.cpp
+++ /dev/null
@@ -1,781 +0,0 @@
-/*
-* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
-*
-* 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, see <http://www.gnu.org/licenses/>.
-*/
-
-// TO-DO:
-// - Implement proper support for vehicles (Player::VehicleSpellInitialize())
-// - Siege Engine Turret (45564) crashing server (Auras: Unknown Shapeshift Type: 24)
-// - Graveyard spirit phasing, ressurection, Spiritual Immunity aura for players nearby
-// - Warn and teleport players out of the Baradin Hold instance (need sniffs; spell 94964?)
-// - Not sure, but players should probably be able to ressurect from guide spirits when there's no battle
-// - Check and script achievements
-
-#include "BattlefieldTB.h"
-#include "AchievementMgr.h"
-#include "Battleground.h"
-#include "CreatureTextMgr.h"
-#include "GameObject.h"
-#include "GameTime.h"
-#include "ObjectAccessor.h"
-#include "Player.h"
-#include "Random.h"
-#include "ScriptMgr.h"
-#include "TemporarySummon.h"
-#include "World.h"
-#include "WorldStateMgr.h"
-
-BattlefieldTB::~BattlefieldTB() { }
-
-bool BattlefieldTB::SetupBattlefield()
-{
- m_TypeId = BATTLEFIELD_TB; // See enum BattlefieldTypes
- m_BattleId = BATTLEFIELD_BATTLEID_TB;
- m_ZoneId = BATTLEFIELD_TB_ZONEID;
-
- InitStalker(NPC_DEBUG_ANNOUNCER, TolBaradDebugAnnouncerPos);
-
- m_MaxPlayer = sWorld->getIntConfig(CONFIG_TOLBARAD_PLR_MAX);
- m_IsEnabled = sWorld->getBoolConfig(CONFIG_TOLBARAD_ENABLE);
- m_MinPlayer = sWorld->getIntConfig(CONFIG_TOLBARAD_PLR_MIN);
- m_MinLevel = sWorld->getIntConfig(CONFIG_TOLBARAD_PLR_MIN_LVL);
- m_BattleTime = sWorld->getIntConfig(CONFIG_TOLBARAD_BATTLETIME) * MINUTE * IN_MILLISECONDS;
- m_BonusTime = sWorld->getIntConfig(CONFIG_TOLBARAD_BONUSTIME) * MINUTE * IN_MILLISECONDS;
- m_NoWarBattleTime = sWorld->getIntConfig(CONFIG_TOLBARAD_NOBATTLETIME) * MINUTE * IN_MILLISECONDS;
- m_RestartAfterCrash = sWorld->getIntConfig(CONFIG_TOLBARAD_RESTART_AFTER_CRASH) * MINUTE * IN_MILLISECONDS;
-
- m_TimeForAcceptInvite = 20;
- m_StartGroupingTimer = 15 * MINUTE * IN_MILLISECONDS;
- m_StartGrouping = false;
- m_isActive = false;
-
- KickPosition.Relocate(-605.5f, 1181.31f, 95.96f, 6.177155f);
- KickPosition.m_mapId = m_MapId;
-
- RegisterZone(m_ZoneId);
-
- m_Data32.resize(BATTLEFIELD_TB_DATA_MAX);
-
- updatedNPCAndObjects = true;
- m_updateObjectsTimer = 0;
-
- // Was there a battle going on or time isn't set yet? Then use m_RestartAfterCrash
- if (sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_STATE_BATTLE, m_Map) == 1 || sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, m_Map) < GameTime::GetGameTime())
- {
- sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_STATE_BATTLE, 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, GameTime::GetGameTime() + m_RestartAfterCrash / IN_MILLISECONDS, false, m_Map);
- }
-
- // Set timer
- m_Timer = sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, m_Map) - GameTime::GetGameTime();
-
- // Defending team isn't set yet? Choose randomly.
- if (sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_FACTION_CONTROLLING, m_Map) == 0)
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_FACTION_CONTROLLING, uint32(urand(1, 2)), false, m_Map);
-
- // Set defender team
- SetDefenderTeam(TeamId(sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_FACTION_CONTROLLING, m_Map) - 1));
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE_SHOW, 1, false, m_Map);
- sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, GameTime::GetGameTime() + m_Timer / IN_MILLISECONDS, false, m_Map);
-
- sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_FACTION_CONTROLLING, GetDefenderTeam() + 1, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_ALLIANCE_CONTROLS_SHOW, GetDefenderTeam() == TEAM_ALLIANCE ? 1 : 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_HORDE_CONTROLS_SHOW, GetDefenderTeam() == TEAM_HORDE ? 1 : 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_KEEP_ALLIANCE, GetDefenderTeam() == TEAM_ALLIANCE ? 1 : 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_KEEP_HORDE, GetDefenderTeam() == TEAM_HORDE ? 1 : 0, false, m_Map);
-
- // Create capture points
- for (uint8 i = 0; i < TB_BASE_COUNT; i++)
- {
- //Spawn flag pole
- if (GameObject* go = SpawnGameObject(TBCapturePoints[i].entryFlagPole[GetDefenderTeam()], TBCapturePoints[i].pos, QuaternionData::fromEulerAnglesZYX(TBCapturePoints[i].pos.GetOrientation(), 0.0f, 0.0f)))
- {
- std::unique_ptr<TolBaradCapturePoint> controlZone = std::make_unique<TolBaradCapturePoint>(this, TBCapturePoints[i]);
- if (GetDefenderTeam() == TEAM_ALLIANCE)
- {
- sWorldStateMgr->SetValue(controlZone->GetWorldStateAllianceControlled(), 1, false, GetMap());
- go->HandleCustomTypeCommand(GameObjectType::SetControlZoneValue(100));
- go->SetGoArtKit(TB_GO_ARTKIT_FLAG_ALLIANCE);
- }
- else if (GetDefenderTeam() == TEAM_HORDE)
- {
- sWorldStateMgr->SetValue(controlZone->GetWorldStateHordeControlled(), 1, false, GetMap());
- go->HandleCustomTypeCommand(GameObjectType::SetControlZoneValue(0));
- go->SetGoArtKit(TB_GO_ARTKIT_FLAG_HORDE);
- }
-
- ControlZoneHandlers[go->GetEntry()] = std::move(controlZone);
- }
- }
-
- // Spawn towers
- for (uint8 i = 0; i < TB_TOWERS_COUNT; i++)
- if (GameObject* go = SpawnGameObject(TBTowers[i].entry, TBTowers[i].pos, QuaternionData::fromEulerAnglesZYX(TBTowers[i].pos.GetOrientation(), 0.0f, 0.0f)))
- Towers.insert(go->GetGUID());
-
- // Init Graveyards
- SetGraveyardNumber(BATTLEFIELD_TB_GRAVEYARD_MAX);
-
- // Graveyards
- for (uint8 i = 0; i < BATTLEFIELD_TB_GRAVEYARD_MAX; i++)
- {
- BfGraveyard* graveyard = new BfGraveyard(this);
-
- // When between games, the graveyard is controlled by the defending team
- graveyard->Initialize(GetDefenderTeam(), TBGraveyards[i].gyid);
-
- // Spawn spirits
- for (uint8 team = 0; team < 2; team++)
- if (Creature* creature = SpawnCreature(TBGraveyards[i].spiritEntry[team], TBGraveyards[i].pos))
- graveyard->SetSpirit(creature, TeamId(team));
-
- m_GraveyardList[i] = graveyard;
- }
-
- // Time warning vars
- warnedFiveMinutes = false;
- warnedTwoMinutes = false;
- warnedOneMinute = false;
-
- UpdateNPCsAndGameObjects();
-
- return true;
-}
-
-bool BattlefieldTB::Update(uint32 diff)
-{
- bool m_return = Battlefield::Update(diff);
-
- // Minutes till battle preparation warnings
- if (GetState() == BATTLEFIELD_INACTIVE)
- {
- if (m_Timer <= 5 * MINUTE * IN_MILLISECONDS + m_StartGroupingTimer && !warnedFiveMinutes)
- {
- warnedFiveMinutes = true;
- SendWarning(TB_TEXT_PREPARATIONS_IN_5_MIN);
- }
-
- if (m_Timer <= 2 * MINUTE * IN_MILLISECONDS + m_StartGroupingTimer && !warnedTwoMinutes)
- {
- warnedTwoMinutes = true;
- SendWarning(TB_TEXT_PREPARATIONS_IN_2_MIN);
- }
-
- if (m_Timer <= 1 * MINUTE * IN_MILLISECONDS + m_StartGroupingTimer && !warnedOneMinute)
- {
- warnedOneMinute = true;
- SendWarning(TB_TEXT_PREPARATIONS_IN_1_MIN);
- }
- }
-
- if (!updatedNPCAndObjects)
- {
- if (m_updateObjectsTimer <= diff)
- {
- UpdateNPCsAndGameObjects();
- updatedNPCAndObjects = true;
- }
- else
- m_updateObjectsTimer -= diff;
- }
-
- return m_return;
-}
-
-void BattlefieldTB::OnPlayerEnterZone(Player* player)
-{
- if (!m_isActive)
- RemoveAurasFromPlayer(player);
-}
-
-void BattlefieldTB::OnPlayerLeaveZone(Player* player)
-{
- if (!m_isActive)
- RemoveAurasFromPlayer(player);
-}
-
-void BattlefieldTB::OnPlayerJoinWar(Player* player)
-{
- RemoveAurasFromPlayer(player);
-
- player->SetPvP(true);
-
- // Bonus damage buff for attackers
- if (player->GetTeamId() == GetAttackerTeam())
- {
- int32 towersDestroyed = sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_TOWERS_DESTROYED, m_Map);
- if (towersDestroyed > 0)
- player->CastSpell(player, SPELL_TOWER_ATTACK_BONUS, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_AURA_STACK, towersDestroyed));
- }
-}
-
-void BattlefieldTB::OnPlayerLeaveWar(Player* player)
-{
- RemoveAurasFromPlayer(player);
-}
-
-void BattlefieldTB::RemoveAurasFromPlayer(Player* player)
-{
- player->RemoveAurasDueToSpell(SPELL_TB_SLOW_FALL);
- player->RemoveAurasDueToSpell(SPELL_TB_VETERAN);
- player->RemoveAurasDueToSpell(SPELL_TOWER_ATTACK_BONUS);
- player->RemoveAurasDueToSpell(SPELL_TB_SPIRITUAL_IMMUNITY);
-}
-
-void BattlefieldTB::OnStartGrouping()
-{
- UpdateNPCsAndGameObjects();
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_STATE_PREPARATIONS, 1, false, m_Map);
-
- // Teleport players out of questing area
- for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
- for (ObjectGuid const& guid : m_players[team])
- if (Player* player = ObjectAccessor::FindPlayer(guid))
- if (player->GetAreaId() == TBQuestAreas[m_iCellblockRandom].entry)
- player->CastSpell(player, TBQuestAreas[m_iCellblockRandom].teleportSpell, true);
-
- // Should we also teleport players out of Baradin Hold underground area?
-}
-
-void BattlefieldTB::OnBattleStart()
-{
- SetData(BATTLEFIELD_TB_DATA_TOWERS_INTACT, uint32(3));
-
- UpdateNPCsAndGameObjects();
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_BATTLE_END_SHOW, 1, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_BATTLE_END, GameTime::GetGameTime() + m_Timer / IN_MILLISECONDS, false, m_Map);
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE_SHOW, 0, false, m_Map);
- sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, 0, false, m_Map);
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_ALLIANCE_ATTACKING_SHOW, GetAttackerTeam() == TEAM_ALLIANCE ? 1 : 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_HORDE_ATTACKING_SHOW, GetAttackerTeam() == TEAM_HORDE ? 1 : 0, false, m_Map);
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_ALLIANCE_CONTROLS_SHOW, 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_HORDE_CONTROLS_SHOW, 0, false, m_Map);
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_BUILDINGS_CAPTURED_SHOW, 1, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_BUILDINGS_CAPTURED, 0, false, m_Map);
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TOWERS_DESTROYED_SHOW, 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TOWERS_DESTROYED, 0, false, m_Map);
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_STATE_PREPARATIONS, 0, false, m_Map);
- sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_STATE_BATTLE, 1, false, m_Map);
-
- // Towers/spires
- for (uint8 i = 0; i < TB_TOWERS_COUNT; i++)
- {
- sWorldStateMgr->SetValue(TBTowers[i].wsIntact[GetDefenderTeam()], 1, false, m_Map);
- sWorldStateMgr->SetValue(TBTowers[i].wsDamaged[GetDefenderTeam()], 0, false, m_Map);
- sWorldStateMgr->SetValue(TBTowers[i].wsDestroyed, 0, false, m_Map);
- sWorldStateMgr->SetValue(TBTowers[i].wsDamaged[GetAttackerTeam()], 0, false, m_Map);
- sWorldStateMgr->SetValue(TBTowers[i].wsIntact[GetAttackerTeam()], 0, false, m_Map);
- }
-}
-
-void BattlefieldTB::OnBattleEnd(bool endByTimer)
-{
- if (!endByTimer) // Attackers win (but now they are defenders already)
- SendWarning(GetDefenderTeam() == TEAM_ALLIANCE ? TB_TEXT_FORTRESS_CAPTURE_ALLIANCE : TB_TEXT_FORTRESS_CAPTURE_HORDE);
- else // Defenders win
- SendWarning(GetDefenderTeam() == TEAM_ALLIANCE ? TB_TEXT_FORTRESS_DEFEND_ALLIANCE : TB_TEXT_FORTRESS_DEFEND_HORDE);
-
- // UpdateNPCsAndGameObjects() must be called 1 minute after battle ends
- m_updateObjectsTimer = 1 * MINUTE * IN_MILLISECONDS;
- updatedNPCAndObjects = false;
-
- // Complete quest
- TeamCastSpell(GetDefenderTeam(), GetDefenderTeam() == TEAM_ALLIANCE ? SPELL_VICTORY_ALLIANCE : SPELL_VICTORY_HORDE);
-
- // Rewards
- TeamCastSpell(GetDefenderTeam(), GetDefenderTeam() == TEAM_ALLIANCE ? SPELL_REWARD_VICTORY_ALLIANCE : SPELL_REWARD_VICTORY_HORDE);
- for (uint32 i = 0; i < GetData(BATTLEFIELD_TB_DATA_TOWERS_INTACT); i++) // Unsure, for each intact tower or only once for having any tower intact?
- TeamCastSpell(GetDefenderTeam(), SPELL_REWARD_TOWER_INTACT);
- TeamCastSpell(GetAttackerTeam(), SPELL_REWARD_DEFEAT);
-
- for (uint8 team = 0; team < 2; ++team)
- {
- for (ObjectGuid const& guid : m_PlayersInWar[team])
- if (Player* player = ObjectAccessor::FindPlayer(guid))
- RemoveAurasFromPlayer(player);
-
- m_PlayersInWar[team].clear();
- }
-
- // Reset time warning vars
- warnedFiveMinutes = false;
- warnedTwoMinutes = false;
- warnedOneMinute = false;
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_BATTLE_END_SHOW, 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_BATTLE_END, 0, false, m_Map);
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE_SHOW, 1, false, m_Map);
- sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, GameTime::GetGameTime() + m_NoWarBattleTime / IN_MILLISECONDS, false, m_Map);
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_ALLIANCE_ATTACKING_SHOW, 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_HORDE_ATTACKING_SHOW, 0, false, m_Map);
-
- sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_FACTION_CONTROLLING, GetDefenderTeam() + 1, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_ALLIANCE_CONTROLS_SHOW, GetDefenderTeam() == TEAM_ALLIANCE ? 1 : 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_HORDE_CONTROLS_SHOW, GetDefenderTeam() == TEAM_HORDE ? 1 : 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_KEEP_ALLIANCE, GetDefenderTeam() == TEAM_ALLIANCE ? 1 : 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_KEEP_HORDE, GetDefenderTeam() == TEAM_HORDE ? 1 : 0, false, m_Map);
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_BUILDINGS_CAPTURED_SHOW, 0, false, m_Map);
-
- sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_STATE_BATTLE, 0, false, m_Map);
-}
-
-void BattlefieldTB::UpdateNPCsAndGameObjects()
-{
- for (ObjectGuid guid : BattleInactiveNPCs)
- if (Creature* creature = GetCreature(guid))
- HideNpc(creature);
-
- for (ObjectGuid guid : BattleInactiveGOs)
- if (GameObject* gameobject = GetGameObject(guid))
- gameobject->SetRespawnTime(RESPAWN_ONE_DAY);
-
- for (ObjectGuid guid : TemporaryNPCs)
- if (Creature* creature = GetCreature(guid))
- creature->RemoveFromWorld();
- TemporaryNPCs.clear();
-
- for (ObjectGuid guid : TemporaryGOs)
- if (GameObject* gameobject = GetGameObject(guid))
- gameobject->Delete();
- TemporaryGOs.clear();
-
- // Tol Barad gates - closed during warmup
- if (GameObject* gates = GetGameObject(TBGatesGUID))
- gates->SetGoState(GetState() == BATTLEFIELD_WARMUP ? GO_STATE_READY : GO_STATE_ACTIVE);
-
- // Baradin Hold door - open when inactive
- if (GameObject* door = GetGameObject(TBDoorGUID))
- door->SetGoState(GetState() == BATTLEFIELD_INACTIVE ? GO_STATE_ACTIVE : GO_STATE_READY);
-
- // Decide which cellblock and questgiver will be active.
- m_iCellblockRandom = GetState() == BATTLEFIELD_INACTIVE ? urand(CELLBLOCK_THE_HOLE, CELLBLOCK_CURSED_DEPTHS) : uint8(CELLBLOCK_NONE);
-
- // To The Hole gate
- if (GameObject* door = GetGameObject(m_gateToTheHoleGUID))
- door->SetGoState(m_iCellblockRandom == CELLBLOCK_THE_HOLE ? GO_STATE_ACTIVE : GO_STATE_READY);
-
- // D-Block gate
- if (GameObject* door = GetGameObject(m_gateDBlockGUID))
- door->SetGoState(m_iCellblockRandom == CELLBLOCK_D_BLOCK ? GO_STATE_ACTIVE : GO_STATE_READY);
-
- // Cursed Depths gate
- if (GameObject* door = GetGameObject(m_gateCursedDepthsGUID))
- door->SetGoState(m_iCellblockRandom == CELLBLOCK_CURSED_DEPTHS ? GO_STATE_ACTIVE : GO_STATE_READY);
-
- if (GetState() == BATTLEFIELD_INACTIVE)
- {
- // Delete capture points
- ControlZoneHandlers.clear();
-
- // Create capture points
- for (uint8 i = 0; i < TB_BASE_COUNT; i++)
- {
- if (GameObject* go = SpawnGameObject(TBCapturePoints[i].entryFlagPole[GetDefenderTeam()], TBCapturePoints[i].pos, QuaternionData::fromEulerAnglesZYX(TBCapturePoints[i].pos.GetOrientation(), 0.0f, 0.0f)))
- {
- std::unique_ptr<TolBaradCapturePoint> controlZone = std::make_unique<TolBaradCapturePoint>(this, TBCapturePoints[i]);
- if (GetDefenderTeam() == TEAM_ALLIANCE)
- {
- sWorldStateMgr->SetValue(controlZone->GetWorldStateAllianceControlled(), 1, false, GetMap());
- go->HandleCustomTypeCommand(GameObjectType::SetControlZoneValue(100));
- go->SetGoArtKit(TB_GO_ARTKIT_FLAG_ALLIANCE);
- }
- else if (GetDefenderTeam() == TEAM_HORDE)
- {
- sWorldStateMgr->SetValue(controlZone->GetWorldStateHordeControlled(), 1, false, GetMap());
- go->HandleCustomTypeCommand(GameObjectType::SetControlZoneValue(0));
- go->SetGoArtKit(TB_GO_ARTKIT_FLAG_HORDE);
- }
-
- ControlZoneHandlers[go->GetEntry()] = std::move(controlZone);
- }
- }
-
- for (ObjectGuid guid : BattleInactiveNPCs)
- if (Creature* creature = GetCreature(guid))
- ShowNpc(creature, true);
-
- for (ObjectGuid guid : BattleInactiveGOs)
- if (GameObject* gameobject = GetGameObject(guid))
- gameobject->SetRespawnTime(RESPAWN_IMMEDIATELY);
-
- for (uint8 i = 0; i < TB_QUEST_INFANTRY_MAX; i++)
- {
- uint32 entry = TB_QUEST_INFANTRY[GetDefenderTeam()][urand(0,3)];
- if (Creature* creature = SpawnCreature(entry, TBQuestInfantrySpawnData[i]))
- TemporaryNPCs.insert(creature->GetGUID());
- }
-
- for (uint8 i = 0; i < TB_GUARDS_MAX; i++)
- if (Creature* creature = SpawnCreature(GetDefenderTeam() == TEAM_ALLIANCE ? NPC_BARADIN_GUARD : NPC_HELLSCREAMS_SENTRY, GuardNPCSpawns[i]))
- TemporaryNPCs.insert(creature->GetGUID());
-
- for (uint8 i = 0; i < TB_FACTION_NPC_MAX; i++)
- if (Creature* creature = SpawnCreature(GetDefenderTeam() == TEAM_ALLIANCE ? FactionNPCSpawns[i].entryAlliance : FactionNPCSpawns[i].entryHorde, FactionNPCSpawns[i].pos))
- TemporaryNPCs.insert(creature->GetGUID());
-
- if (Creature* creature = SpawnCreature(RandomQuestgivers[GetDefenderTeam()][m_iCellblockRandom], RandomQuestgiverPos))
- TemporaryNPCs.insert(creature->GetGUID());
-
- // Spawn portals
- for (uint8 i = 0; i < TB_PORTAL_MAX; i++)
- if (GameObject* go = SpawnGameObject(TBPortalEntry[GetDefenderTeam()], TBPortals[i], QuaternionData::fromEulerAnglesZYX(TBPortals[i].GetOrientation(), 0.0f, 0.0f)))
- TemporaryGOs.insert(go->GetGUID());
-
- // Update towers
- for (ObjectGuid guid : Towers)
- if (GameObject* go = GetGameObject(guid))
- go->SetDestructibleState(GO_DESTRUCTIBLE_REBUILDING);
- }
- else if (GetState() == BATTLEFIELD_IN_PROGRESS)
- {
- for (uint8 i = 0; i < TB_ABANDONED_SIEGE_ENGINE_COUNT; i++)
- if (Creature* creature = SpawnCreature(NPC_ABANDONED_SIEGE_ENGINE, TBAbandonedSiegeEngineSpawnData[i]))
- TemporaryNPCs.insert(creature->GetGUID());
-
- for (ObjectGuid guid : Towers)
- {
- if (GameObject* go = GetGameObject(guid))
- {
- go->SetDestructibleState(GO_DESTRUCTIBLE_INTACT);
- go->ModifyHealth(go->GetGOValue()->Building.MaxHealth);
- }
- }
- }
-
- // Spawn banners
- for (uint8 i = 0; i < TB_BANNER_MAX; i++)
- if (GameObject* go = SpawnGameObject(TBBannerEntry[GetDefenderTeam()], TBBanners[i], QuaternionData::fromEulerAnglesZYX(TBBanners[i].GetOrientation(), 0.0f, 0.0f)))
- TemporaryGOs.insert(go->GetGUID());
-
- // Set graveyard controls
- for (uint8 i = 0; i < BATTLEFIELD_TB_GRAVEYARD_MAX; i++)
- if (BfGraveyard* graveyard = GetGraveyardById(i))
- graveyard->GiveControlTo(!IsWarTime() || TBGraveyards[i].defenderControls ? GetDefenderTeam() : GetAttackerTeam());
-}
-
-void BattlefieldTB::OnCreatureCreate(Creature* creature)
-{
- switch (creature->GetEntry())
- {
- // Store NPCs that need visibility toggling
- case NPC_TOLBARAD_CAPTIVE_SPIRIT:
- case NPC_TOLBARAD_CELLBLOCK_OOZE:
- case NPC_TOLBARAD_ARCHMAGE_GALUS:
- case NPC_TOLBARAD_GHASTLY_CONVICT:
- case NPC_TOLBARAD_SHIVARRA_DESTROYER:
- case NPC_TOLBARAD_CELL_WATCHER:
- case NPC_TOLBARAD_SVARNOS:
- case NPC_TOLBARAD_JAILED_WRATHGUARD:
- case NPC_TOLBARAD_IMPRISONED_IMP:
- case NPC_TOLBARAD_WARDEN_SILVA:
- case NPC_TOLBARAD_WARDEN_GUARD:
- case NPC_TOLBARAD_IMPRISONED_WORKER:
- case NPC_TOLBARAD_EXILED_MAGE:
- case NPC_CROCOLISK:
- case NPC_PROBLIM:
- BattleInactiveNPCs.insert(creature->GetGUID());
- if (GetState() == BATTLEFIELD_WARMUP) // If battle is about to start, we must hide these.
- HideNpc(creature);
- break;
- case NPC_ABANDONED_SIEGE_ENGINE:
- creature->SetFaction(TBFactions[GetDefenderTeam()]);
- creature->CastSpell(creature, SPELL_THICK_LAYER_OF_RUST, true);
- break;
- case NPC_SIEGE_ENGINE_TURRET:
- if (Unit* vehiclebase = creature->GetCharmerOrOwner()->GetVehicleBase())
- creature->EnterVehicle(vehiclebase);
- break;
- case NPC_TOWER_RANGE_FINDER:
- creature->CastSpell(creature, SPELL_TOWER_RANGE_FINDER_PERIODIC, true);
- break;
- case NPC_TB_GY_SPIRIT_BARADIN_HOLD_A:
- case NPC_TB_GY_SPIRIT_BARADIN_HOLD_H:
- case NPC_TB_GY_SPIRIT_IRONCLAD_GARRISON_A:
- case NPC_TB_GY_SPIRIT_WARDENS_VIGIL_A:
- case NPC_TB_GY_SPIRIT_EAST_SPIRE_A:
- case NPC_TB_GY_SPIRIT_SOUTH_SPIRE_A:
- case NPC_TB_GY_SPIRIT_WEST_SPIRE_A:
- case NPC_TB_GY_SPIRIT_SLAGWORKS_A:
- case NPC_TB_GY_SPIRIT_IRONCLAD_GARRISON_H:
- case NPC_TB_GY_SPIRIT_WARDENS_VIGIL_H:
- case NPC_TB_GY_SPIRIT_SLAGWORKS_H:
- case NPC_TB_GY_SPIRIT_WEST_SPIRE_H:
- case NPC_TB_GY_SPIRIT_EAST_SPIRE_H:
- case NPC_TB_GY_SPIRIT_SOUTH_SPIRE_H:
- creature->CastSpell(creature, SPELL_TB_SPIRITUAL_IMMUNITY, true);
- break;
- default:
- break;
- }
-}
-
-void BattlefieldTB::OnGameObjectCreate(GameObject* go)
-{
- switch (go->GetEntry())
- {
- case GO_TOLBARAD_GATES:
- TBGatesGUID = go->GetGUID();
- go->SetGoState(GetState() == BATTLEFIELD_WARMUP ? GO_STATE_READY : GO_STATE_ACTIVE);
- break;
- case GO_TOLBARAD_DOOR:
- TBDoorGUID = go->GetGUID();
- go->SetGoState(GetState() == BATTLEFIELD_INACTIVE ? GO_STATE_ACTIVE : GO_STATE_READY);
- break;
- case GO_GATE_TO_THE_HOLE:
- m_gateToTheHoleGUID = go->GetGUID();
- go->SetGoState(m_iCellblockRandom == CELLBLOCK_THE_HOLE ? GO_STATE_ACTIVE : GO_STATE_READY);
- break;
- case GO_GATE_D_BLOCK:
- m_gateDBlockGUID = go->GetGUID();
- go->SetGoState(m_iCellblockRandom == CELLBLOCK_D_BLOCK ? GO_STATE_ACTIVE : GO_STATE_READY);
- break;
- case GO_CURSED_DEPTHS_GATE:
- m_gateCursedDepthsGUID = go->GetGUID();
- go->SetGoState(m_iCellblockRandom == CELLBLOCK_CURSED_DEPTHS ? GO_STATE_ACTIVE : GO_STATE_READY);
- break;
- case GO_CRATE_OF_CELLBLOCK_RATIONS:
- case GO_CURSED_SHACKLES:
- case GO_DUSTY_PRISON_JOURNAL:
- case GO_TB_MEETING_STONE:
- case GO_TB_INSTANCE_VISUAL_1:
- case GO_TB_INSTANCE_VISUAL_2:
- case GO_TB_INSTANCE_VISUAL_3:
- case GO_TB_INSTANCE_VISUAL_4:
- BattleInactiveGOs.insert(go->GetGUID());
- if (GetState() == BATTLEFIELD_WARMUP) // If battle is about to start, we must hide these.
- go->SetRespawnTime(RESPAWN_ONE_DAY);
- break;
- default:
- break;
- }
-}
-
-void BattlefieldTB::ProcessEvent(WorldObject* obj, uint32 eventId, WorldObject* invoker)
-{
- Battlefield::ProcessEvent(obj, eventId, invoker);
- if (!IsWarTime())
- return;
-
- if (eventId == EVENT_COUNT_CAPTURED_BASE)
- {
- UpdateCapturedBaseCount();
- return;
- }
-
- if (!obj)
- return;
-
- GameObject* go = obj->ToGameObject();
- if (!go)
- return;
-
- TBTowerId towerId;
- switch (go->GetEntry())
- {
- case GO_WEST_SPIRE:
- towerId = TB_TOWER_WEST_SPIRE;
- break;
- case GO_EAST_SPIRE:
- towerId = TB_TOWER_EAST_SPIRE;
- break;
- case GO_SOUTH_SPIRE:
- towerId = TB_TOWER_SOUTH_SPIRE;
- break;
- default:
- return;
- }
-
- if (go->GetDestructibleState() == GO_DESTRUCTIBLE_DAMAGED)
- TowerDamaged(towerId);
- else if (go->GetDestructibleState() == GO_DESTRUCTIBLE_DESTROYED)
- TowerDestroyed(towerId);
-}
-
-void BattlefieldTB::TowerDamaged(TBTowerId tbTowerId)
-{
- if (!IsWarTime())
- return;
-
- SendWarning(TBTowers[tbTowerId].textDamaged);
-
- SetData(BATTLEFIELD_TB_DATA_TOWERS_INTACT, GetData(BATTLEFIELD_TB_DATA_TOWERS_INTACT) - 1);
-
- sWorldStateMgr->SetValue(TBTowers[tbTowerId].wsIntact[GetDefenderTeam()], 0, false, m_Map);
- sWorldStateMgr->SetValue(TBTowers[tbTowerId].wsDamaged[GetDefenderTeam()], 1, false, m_Map);
-
- TeamCastSpell(GetAttackerTeam(), SPELL_REWARD_TOWER_DAMAGED);
-}
-
-void BattlefieldTB::TowerDestroyed(TBTowerId tbTowerId)
-{
- if (!IsWarTime())
- return;
-
- // Add 5 minute bonus time
- m_Timer += m_BonusTime;
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_BATTLE_END, GameTime::GetGameTime() + m_Timer / IN_MILLISECONDS, false, m_Map);
-
- SendWarning(TBTowers[tbTowerId].textDestroyed);
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TOWERS_DESTROYED_SHOW, 1, false, m_Map);
- int32 towersDestroyed = sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_TOWERS_DESTROYED, m_Map) + 1;
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TOWERS_DESTROYED, towersDestroyed, false, m_Map);
-
- sWorldStateMgr->SetValue(TBTowers[tbTowerId].wsDamaged[GetDefenderTeam()], 0, false, m_Map);
- sWorldStateMgr->SetValue(TBTowers[tbTowerId].wsDestroyed, 1, false, m_Map);
-
- // Attack bonus buff
- for (ObjectGuid const& guid : m_PlayersInWar[GetAttackerTeam()])
- if (Player* player = ObjectAccessor::FindPlayer(guid))
- player->CastSpell(player, SPELL_TOWER_ATTACK_BONUS, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_AURA_STACK, towersDestroyed));
-
- // Honor reward
- TeamCastSpell(GetAttackerTeam(), SPELL_REWARD_TOWER_DESTROYED);
-}
-
-void BattlefieldTB::UpdateCapturedBaseCount()
-{
- uint32 numCapturedBases = 0; // How many bases attacker has captured
-
- // these world states are either 0 or 1
- if (GetAttackerTeam() == TEAM_ALLIANCE)
- {
- numCapturedBases += sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_GARRISON_ALLIANCE_CONTROLLED, GetMap());
- numCapturedBases += sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_VIGIL_ALLIANCE_CONTROLLED, GetMap());
- numCapturedBases += sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_SLAGWORKS_ALLIANCE_CONTROLLED, GetMap());
- }
- else if (GetAttackerTeam() == TEAM_HORDE)
- {
- numCapturedBases += sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_GARRISON_HORDE_CONTROLLED, GetMap());
- numCapturedBases += sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_VIGIL_HORDE_CONTROLLED, GetMap());
- numCapturedBases += sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_SLAGWORKS_HORDE_CONTROLLED, GetMap());
- }
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_BUILDINGS_CAPTURED, numCapturedBases, false, m_Map);
-
- // Check if attackers won
- if (numCapturedBases == TB_BASE_COUNT)
- EndBattle(false);
-}
-
-// Called when player kill a unit in wg zone
-void BattlefieldTB::HandleKill(Player* killer, Unit* victim)
-{
- if (killer == victim || victim->GetTypeId() != TYPEID_PLAYER)
- return;
-
- TeamId killerTeam = killer->GetTeamId();
- for (ObjectGuid const& guid : m_PlayersInWar[killerTeam])
- if (Player* player = ObjectAccessor::FindPlayer(guid))
- if (player->GetDistance2d(killer) < 40.0f)
- PromotePlayer(player);
-}
-
-void BattlefieldTB::PromotePlayer(Player* killer)
-{
- if (!m_isActive || killer->HasAura(SPELL_TB_VETERAN))
- return;
-
- killer->CastSpell(killer, SPELL_TB_VETERAN, true);
-}
-
-TolBaradCapturePoint::TolBaradCapturePoint(BattlefieldTB* battlefield, TBCapturePointSpawnData const& data) : BattlefieldControlZoneHandler(battlefield),
- _textIdHordeCaptured(data.textGained[TEAM_HORDE]), _textIdAllianceCaptured(data.textGained[TEAM_ALLIANCE]),
- _textIdHordeLost(data.textLost[TEAM_HORDE]), _textIdAllianceLost(data.textLost[TEAM_ALLIANCE]),
- _worldstateHordeControlled(data.wsControlled[TEAM_HORDE]), _worldstateAllianceControlled(data.wsControlled[TEAM_ALLIANCE]),
- _worldstateHordeCapturing(data.wsCapturing[TEAM_HORDE]), _worldstateAllianceCapturing(data.wsCapturing[TEAM_ALLIANCE]),
- _worldstateNeutral(data.wsNeutral)
-{
-}
-
-void TolBaradCapturePoint::HandleContestedEventHorde(GameObject* controlZone)
-{
- BattlefieldControlZoneHandler::HandleContestedEventHorde(controlZone);
-}
-
-void TolBaradCapturePoint::HandleContestedEventAlliance(GameObject* controlZone)
-{
- BattlefieldControlZoneHandler::HandleContestedEventAlliance(controlZone);
-}
-
-void TolBaradCapturePoint::HandleProgressEventHorde(GameObject* controlZone)
-{
- BattlefieldControlZoneHandler::HandleProgressEventHorde(controlZone);
- GetBattlefield()->SendWarning(_textIdHordeCaptured);
- controlZone->SetGoArtKit(TB_GO_ARTKIT_FLAG_HORDE);
- sWorldStateMgr->SetValue(_worldstateHordeControlled, 1, false, controlZone->GetMap());
- sWorldStateMgr->SetValue(_worldstateHordeCapturing, 0, false, controlZone->GetMap());
- GetBattlefield()->ProcessEvent(nullptr, EVENT_COUNT_CAPTURED_BASE, nullptr);
-}
-
-void TolBaradCapturePoint::HandleProgressEventAlliance(GameObject* controlZone)
-{
- BattlefieldControlZoneHandler::HandleProgressEventAlliance(controlZone);
- GetBattlefield()->SendWarning(_textIdAllianceCaptured);
- controlZone->SetGoArtKit(TB_GO_ARTKIT_FLAG_ALLIANCE);
- sWorldStateMgr->SetValue(_worldstateAllianceControlled, 1, false, controlZone->GetMap());
- sWorldStateMgr->SetValue(_worldstateAllianceCapturing, 0, false, controlZone->GetMap());
- GetBattlefield()->ProcessEvent(nullptr, EVENT_COUNT_CAPTURED_BASE, nullptr);
-}
-
-void TolBaradCapturePoint::HandleNeutralEventHorde(GameObject* controlZone)
-{
- GetBattlefield()->SendWarning(_textIdHordeLost);
- sWorldStateMgr->SetValue(_worldstateHordeControlled, 0, false, controlZone->GetMap());
- sWorldStateMgr->SetValue(_worldstateAllianceCapturing, 1, false, controlZone->GetMap());
- BattlefieldControlZoneHandler::HandleNeutralEventHorde(controlZone);
-}
-
-void TolBaradCapturePoint::HandleNeutralEventAlliance(GameObject* controlZone)
-{
- GetBattlefield()->SendWarning(_textIdAllianceLost);
- sWorldStateMgr->SetValue(_worldstateAllianceControlled, 0, false, controlZone->GetMap());
- sWorldStateMgr->SetValue(_worldstateHordeCapturing, 1, false, controlZone->GetMap());
- BattlefieldControlZoneHandler::HandleNeutralEventAlliance(controlZone);
-}
-
-void TolBaradCapturePoint::HandleNeutralEvent(GameObject* controlZone)
-{
- BattlefieldControlZoneHandler::HandleNeutralEvent(controlZone);
- controlZone->SetGoArtKit(TB_GO_ARTKIT_FLAG_NONE);
-}
-
-class Battlefield_tol_barad : public BattlefieldScript
-{
-public:
- Battlefield_tol_barad() : BattlefieldScript("battlefield_tb") { }
-
- Battlefield* GetBattlefield(Map* map) const override
- {
- return new BattlefieldTB(map);
- }
-};
-
-void AddSC_BF_tol_barad()
-{
- new Battlefield_tol_barad();
-}
diff --git a/src/server/scripts/Battlefield/BattlefieldTB.h b/src/server/scripts/Battlefield/BattlefieldTB.h
deleted file mode 100644
index 5abc463fed0..00000000000
--- a/src/server/scripts/Battlefield/BattlefieldTB.h
+++ /dev/null
@@ -1,643 +0,0 @@
-/*
-* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
-*
-* 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef BATTLEFIELD_TB_
-#define BATTLEFIELD_TB_
-
-#include "Battlefield.h"
-
-class BattlefieldTB;
-class TolBaradCapturePoint;
-
-enum TolBaradInfo
-{
- BATTLEFIELD_TB_MAPID = 732, // Tol Barad
- BATTLEFIELD_TB_ZONEID = 5095, // Tol Barad
-};
-
-enum TolBaradData
-{
- BATTLEFIELD_TB_DATA_TOWERS_INTACT,
- BATTLEFIELD_TB_DATA_MAX,
-};
-
-enum TolBaradSpells
-{
- // Quest completion
- SPELL_VICTORY_ALLIANCE = 94665,
- SPELL_VICTORY_HORDE = 94763,
-
- // Rewards
- SPELL_REWARD_VICTORY_ALLIANCE = 89789,
- SPELL_REWARD_VICTORY_HORDE = 89791,
- SPELL_REWARD_DEFEAT = 89793,
-
- SPELL_REWARD_TOWER_INTACT = 89794,
- SPELL_REWARD_TOWER_DAMAGED = 89795,
- SPELL_REWARD_TOWER_DESTROYED = 89796,
-
- // Player buffs
- SPELL_TB_SLOW_FALL = 88473,
- SPELL_TB_VETERAN = 84655,
- SPELL_TOWER_ATTACK_BONUS = 82629,
- SPELL_TB_SPIRITUAL_IMMUNITY = 95332,
-
- // Vehicle
- SPELL_THICK_LAYER_OF_RUST = 95330,
- SPELL_RIDE_TOL_BARAD_VEHICLE = 84754,
- SPELL_DEPLOY_SIEGE_MODE = 84974,
- SPELL_SIEGE_CANNON_AURA = 85167, // aura, periodically triggers spell 85122
-// SPELL_SIEGE_CANNON_EFFECT = 85122, // targets random
-// SPELL_SIEGE_CANNON_DAMAGE = 85125,
- SPELL_LEAVE_SIEGE_MODE = 85078,
-
- SPELL_TOWER_RANGE_FINDER_PERIODIC = 85671,
- SPELL_TOWER_RANGE_FINDER = 84979,
-
- // Teleportation spells
- SPELL_TB_THE_HOLE_TELEPORT = 89035,
- SPELL_TB_D_BLOCK_TELEPORT = 89037,
- SPELL_TB_CURSED_DEPTHS_TELEPORT = 89038,
-};
-
-enum TolBaradNpcs
-{
- // Cursed Depths area
- NPC_TOLBARAD_CAPTIVE_SPIRIT = 47531,
- NPC_TOLBARAD_CELLBLOCK_OOZE = 47534,
- NPC_TOLBARAD_ARCHMAGE_GALUS = 47537,
- NPC_TOLBARAD_GHASTLY_CONVICT = 47590,
-
- // D-Block area
- NPC_TOLBARAD_SHIVARRA_DESTROYER = 47540,
- NPC_TOLBARAD_CELL_WATCHER = 47542,
- NPC_TOLBARAD_SVARNOS = 47544,
- NPC_TOLBARAD_JAILED_WRATHGUARD = 47548,
- NPC_TOLBARAD_IMPRISONED_IMP = 47549,
-
- // The Hole area
- NPC_TOLBARAD_WARDEN_SILVA = 48036,
- NPC_TOLBARAD_WARDEN_GUARD = 47561,
- NPC_TOLBARAD_IMPRISONED_WORKER = 47550,
- NPC_TOLBARAD_EXILED_MAGE = 47552,
-
- // Other
- NPC_CROCOLISK = 47591,
- NPC_PROBLIM = 47593,
-
- // Graveyard spirits
- NPC_TB_GY_SPIRIT_BARADIN_HOLD_A = 45066,
- NPC_TB_GY_SPIRIT_BARADIN_HOLD_H = 45067,
- NPC_TB_GY_SPIRIT_IRONCLAD_GARRISON_A = 45068,
- NPC_TB_GY_SPIRIT_WARDENS_VIGIL_A = 45069,
- NPC_TB_GY_SPIRIT_EAST_SPIRE_A = 45070,
- NPC_TB_GY_SPIRIT_SOUTH_SPIRE_A = 45071,
- NPC_TB_GY_SPIRIT_WEST_SPIRE_A = 45072,
- NPC_TB_GY_SPIRIT_SLAGWORKS_A = 45073,
- NPC_TB_GY_SPIRIT_IRONCLAD_GARRISON_H = 45074,
- NPC_TB_GY_SPIRIT_WARDENS_VIGIL_H = 45075,
- NPC_TB_GY_SPIRIT_SLAGWORKS_H = 45076,
- NPC_TB_GY_SPIRIT_WEST_SPIRE_H = 45077,
- NPC_TB_GY_SPIRIT_EAST_SPIRE_H = 45078,
- NPC_TB_GY_SPIRIT_SOUTH_SPIRE_H = 45079,
-
- // Stalker, dummies
- NPC_DEBUG_ANNOUNCER = 43679,
- NPC_TOWER_RANGE_FINDER = 45492,
- NPC_TOWER_CANNON_TARGET = 45561,
- NPC_SIEGE_ENGINE_TURRET = 45564,
-};
-
-enum TolBaradGOs
-{
- // Towers
- GO_WEST_SPIRE = 204588,
- GO_EAST_SPIRE = 204589,
- GO_SOUTH_SPIRE = 204590,
-
- GO_CAPTURE_POINT_NORTH_A_DEFENDING = 205068,
- GO_CAPTURE_POINT_NORTH_H_DEFENDING = 205096,
- GO_CAPTURE_POINT_EAST_A_DEFENDING = 205138,
- GO_CAPTURE_POINT_EAST_H_DEFENDING = 205139,
- GO_CAPTURE_POINT_WEST_A_DEFENDING = 205101,
- GO_CAPTURE_POINT_WEST_H_DEFENDING = 205103,
-
- // Entrance gates and instance door
- GO_TOLBARAD_GATES = 206598,
- GO_TOLBARAD_DOOR = 206576,
-
- // Other
- GO_TB_MEETING_STONE = 206668,
-
- GO_TB_INSTANCE_VISUAL_1 = 207746,
- GO_TB_INSTANCE_VISUAL_2 = 207747,
- GO_TB_INSTANCE_VISUAL_3 = 210114,
- GO_TB_INSTANCE_VISUAL_4 = 210115,
-};
-
-enum TolBaradGOArtKit
-{
- TB_GO_ARTKIT_FLAG_NONE = 0,
- TB_GO_ARTKIT_FLAG_HORDE = 1,
- TB_GO_ARTKIT_FLAG_ALLIANCE = 2,
-};
-
-enum TolBaradText
-{
- // DEBUG Announcer
- TB_TEXT_EAST_SPIRE_DAMAGED = 1,
- TB_TEXT_EAST_SPIRE_DESTROYED = 2,
- TB_TEXT_WEST_SPIRE_DAMAGED = 3,
- TB_TEXT_WEST_SPIRE_DESTROYED = 4,
- TB_TEXT_SOUTH_SPIRE_DAMAGED = 5,
- TB_TEXT_SOUTH_SPIRE_DESTROYED = 6,
- TB_TEXT_GARRISON_ALLIANCE_GAINED = 7,
- TB_TEXT_GARRISON_ALLIANCE_LOST = 8,
- TB_TEXT_GARRISON_HORDE_GAINED = 9,
- TB_TEXT_GARRISON_HORDE_LOST = 10,
- TB_TEXT_VIGIL_ALLIANCE_GAINED = 11,
- TB_TEXT_VIGIL_ALLIANCE_LOST = 12,
- TB_TEXT_VIGIL_HORDE_GAINED = 13,
- TB_TEXT_VIGIL_HORDE_LOST = 14,
- TB_TEXT_SLAGWORKS_ALLIANCE_GAINED = 15,
- TB_TEXT_SLAGWORKS_ALLIANCE_LOST = 16,
- TB_TEXT_SLAGWORKS_HORDE_GAINED = 17,
- TB_TEXT_SLAGWORKS_HORDE_LOST = 18,
- TB_TEXT_FORTRESS_DEFEND_ALLIANCE = 19,
- TB_TEXT_FORTRESS_DEFEND_HORDE = 20,
- TB_TEXT_FORTRESS_CAPTURE_ALLIANCE = 21,
- TB_TEXT_FORTRESS_CAPTURE_HORDE = 22,
- TB_TEXT_VEHICLE_OUTSIDE_WARNING = 23,
- TB_TEXT_PREPARATIONS_IN_5_MIN = 24,
- TB_TEXT_PREPARATIONS_IN_2_MIN = 25,
- TB_TEXT_PREPARATIONS_IN_1_MIN = 26,
-};
-
-enum TolBaradEvent
-{
- EVENT_COUNT_CAPTURED_BASE = 1,
-};
-
-const uint32 TBFactions[PVP_TEAMS_COUNT] = { 1610, 1732 };
-
-// Stalker
-Position const TolBaradDebugAnnouncerPos = { -1234.25f, 961.903f, 159.4913f, 0.0f };
-
-// Quest Infantry NPCs
-enum TBQuestInfantryEntry
-{
- NPC_ALLIANCE_WARRIOR_INFANTRY = 47599,
- NPC_ALLIANCE_PALADIN_INFANTRY = 47600,
- NPC_ALLIANCE_HUNTER_INFANTRY = 47595,
- NPC_ALLIANCE_MAGE_INFANTRY = 47598,
-
- NPC_HORDE_DRUID_INFANTRY = 47607,
- NPC_HORDE_MAGE_INFANTRY = 47608,
- NPC_HORDE_ROGUE_INFANTRY = 47609,
- NPC_HORDE_SHAMAN_INFANTRY = 47610,
-};
-
-uint32 const TB_QUEST_INFANTRY[PVP_TEAMS_COUNT][4] =
-{
- { NPC_HORDE_DRUID_INFANTRY, NPC_HORDE_MAGE_INFANTRY, NPC_HORDE_ROGUE_INFANTRY, NPC_HORDE_SHAMAN_INFANTRY },
- { NPC_ALLIANCE_WARRIOR_INFANTRY, NPC_ALLIANCE_PALADIN_INFANTRY, NPC_ALLIANCE_HUNTER_INFANTRY, NPC_ALLIANCE_MAGE_INFANTRY },
-};
-
-uint8 const TB_QUEST_INFANTRY_MAX = 37;
-Position const TBQuestInfantrySpawnData[TB_QUEST_INFANTRY_MAX] =
-{
- { -930.4685f, 1020.178f, 121.5658f, 0.1537642f },
- { -831.5157f, 975.816f, 121.5255f, 5.022717f },
- { -837.0773f, 943.9008f, 121.5055f, 5.461119f },
- { -839.1646f, 1024.046f, 121.5505f, 4.782219f },
- { -881.283f, 1033.25f, 121.5243f, 0.0f },
- { -883.038f, 924.955f, 121.5243f, 0.0f },
- { -883.913f, 978.059f, 121.5243f, 3.388291f },
- { -883.6224f, 950.8459f, 121.5122f, 0.8307042f },
- { -895.181f, 1015.2f, 121.5505f, 2.652318f },
- { -943.4023f, 961.7462f, 121.5658f, 5.258394f },
- { -958.649f, 926.877f, 121.5243f, 0.0f },
- { -959.743f, 1029.09f, 121.5243f, 0.0f },
- { -964.6652f, 978.5373f, 121.5257f, 0.02025719f },
- { -1407.14f, 721.42f, 123.5033f, 0.0f },
- { -1414.46f, 671.66f, 123.5043f, 0.0f },
- { -1431.7f, 623.073f, 123.5043f, 0.0f },
- { -1434.162f, 655.8566f, 123.5051f, 4.84886f },
- { -1445.19f, 739.729f, 123.5457f, 5.767949f },
- { -1460.954f, 718.418f, 123.6453f, 5.178094f },
- { -1462.48f, 694.378f, 123.5463f, 0.3441857f },
- { -1372.23f, 683.707f, 123.5043f, 0.0f },
- { -1479.46f, 635.799f, 123.5043f, 0.0f },
- { -1491.259f, 734.5692f, 123.4525f, 1.529741f },
- { -1509.024f, 688.8625f, 123.5463f, 6.243045f },
- { -1419.311f, 1310.25f, 133.8389f, 0.0f },
- { -1444.24f, 1266.439f, 133.8229f, 0.0f },
- { -1450.569f, 1337.351f, 133.914f, 0.0f },
- { -1479.819f, 1331.34f, 153.2f, 0.0f },
- { -1497.62f, 1276.429f, 133.6676f, 3.147845f },
- { -1498.37f, 1379.689f, 133.827f, 0.0f },
- { -1499.97f, 1232.87f, 133.8239f, 0.0f },
- { -1505.7f, 1261.99f, 133.7089f, 0.6167698f },
- { -1531.84f, 1316.569f, 153.2f, 0.0f },
- { -1533.141f, 1267.66f, 133.836f, 0.0f },
- { -1547.59f, 1300.21f, 133.7094f, 1.908187f },
- { -1563.3f, 1325.79f, 133.6673f, 0.0f },
-};
-
-// Guard NPCs
-enum TBGuardEntry
-{
- NPC_BARADIN_GUARD = 51165,
- NPC_HELLSCREAMS_SENTRY = 51166,
-};
-
-uint8 const TB_GUARDS_MAX = 8;
-Position const GuardNPCSpawns[TB_GUARDS_MAX] =
-{
-// { -837.3768f, 1196.082f, 114.2994f, 3.036873f },
-// { -762.118f, 1195.259f, 107.2007f, 3.036873f },
-// { -837.809f, 1179.842f, 114.1356f, 3.159046f },
-// { -762.5504f, 1179.019f, 107.2137f, 3.159046f },
- { -1272.951f, 964.8854f, 119.5782f, 3.193953f },
- { -1274.394f, 997.6511f, 119.5743f, 3.193953f },
- { -1248.226f, 1018.476f, 119.8113f, 1.605703f },
- { -1218.948f, 943.5695f, 119.5994f, 4.625123f },
- { -1195.417f, 965.5364f, 119.8113f, 0.0f },
- { -1220.832f, 1018.497f, 119.8113f, 1.605703f },
- { -1196.151f, 999.5121f, 119.5966f, 0.0f },
- { -1249.304f, 942.9063f, 119.5782f, 4.625123f },
-};
-
-enum TBFactionNPCEntry
-{
- // Guards
- NPC_BARADIN_GUARD_1 = 47324,
- NPC_BARADIN_GUARD_2 = 47325,
- NPC_BARADIN_GRUNT_1 = 47335,
- NPC_BARADIN_GRUNT_2 = 47336,
-
- // Questgivers
- NPC_SERGEANT_PARKER = 48066, // Everytime
- NPC_COMMANDER_STEVENS = 48039, // One of these three
- NPC_2ND_LIEUTENANT_WANSWORTH = 48061,
- NPC_MARSHAL_FALLOWS = 48074,
-
- NPC_COMMANDER_ZANOTH = 48069, // Everytime!
- NPC_STAFF_SERGEANT_LAZGAR = 48062, // One of these three
- NPC_DRILLMASTER_RAZGOTH = 48070,
- NPC_PRIVATE_GARNOTH = 48071,
-
- // Portal summoners
- NPC_MAVEN_ZARA = 50173,
- NPC_RHAGHA = 50167,
-};
-
-struct TBFactionNPCInfo
-{
- Position pos;
- uint32 entryAlliance;
- uint32 entryHorde;
-};
-
-uint8 const TB_FACTION_NPC_MAX = 4;
-TBFactionNPCInfo const FactionNPCSpawns[TB_FACTION_NPC_MAX] =
-{
- { { -1259.356f, 1057.108f, 107.0786f, 4.956735f }, NPC_BARADIN_GUARD_1, NPC_BARADIN_GRUNT_1 },
- { { -1254.174f, 1061.094f, 107.0772f, 5.445427f }, NPC_BARADIN_GUARD_2, NPC_BARADIN_GRUNT_2 },
- { { -1256.365f, 1058.47f, 107.0776f, 2.216568f }, NPC_MAVEN_ZARA, NPC_RHAGHA },
- { { -1231.38f, 985.681f, 121.2403f, 0.6108652f }, NPC_SERGEANT_PARKER, NPC_COMMANDER_ZANOTH },
-};
-
-// Questing
-enum TBQuesting
-{
- CELLBLOCK_THE_HOLE = 0, // The Hole area
- CELLBLOCK_D_BLOCK = 1, // D-Block area
- CELLBLOCK_CURSED_DEPTHS = 2, // Cursed Depths area
- CELLBLOCK_MAX = 3,
- CELLBLOCK_NONE,
-
- AREA_THE_HOLE = 5659,
- AREA_D_BLOCK = 5657,
- AREA_CURSED_DEPTHS = 5658,
-
- GO_GATE_TO_THE_HOLE = 206845,
- GO_GATE_D_BLOCK = 206844,
- GO_CURSED_DEPTHS_GATE = 206843,
-
- GO_CRATE_OF_CELLBLOCK_RATIONS = 206996,
- GO_CURSED_SHACKLES = 206905,
- GO_DUSTY_PRISON_JOURNAL = 206890,
-};
-
-Position const RandomQuestgiverPos = { -1228.93f, 975.038f, 121.7153f, 5.969026f };
-
-struct TBQuestAreaInfo
-{
- uint32 entry;
- uint32 teleportSpell;
-};
-TBQuestAreaInfo const TBQuestAreas[CELLBLOCK_MAX] =
-{
- { AREA_THE_HOLE, SPELL_TB_THE_HOLE_TELEPORT },
- { AREA_D_BLOCK, SPELL_TB_D_BLOCK_TELEPORT },
- { AREA_CURSED_DEPTHS, SPELL_TB_CURSED_DEPTHS_TELEPORT },
-};
-uint32 const RandomQuestgivers[PVP_TEAMS_COUNT][CELLBLOCK_MAX] =
-{
- { NPC_MARSHAL_FALLOWS, NPC_2ND_LIEUTENANT_WANSWORTH, NPC_COMMANDER_STEVENS },
- { NPC_DRILLMASTER_RAZGOTH, NPC_STAFF_SERGEANT_LAZGAR, NPC_PRIVATE_GARNOTH },
-};
-
-// Capture Points
-enum TBCapturePointId
-{
- TB_BASE_IRONCLAD_GARRISON = 0,
- TB_BASE_WARDENS_VIGIL = 1,
- TB_BASE_SLAGWORKS = 2,
- TB_BASE_COUNT = 3,
-};
-
-struct TBCapturePointSpawnData
-{
- Position pos;
- TBCapturePointId id;
- uint32 entryFlagPole[2];
- uint32 wsControlled[2];
- uint32 wsCapturing[2];
- uint32 wsNeutral;
- uint32 textGained[2];
- uint32 textLost[2];
-};
-
-TBCapturePointSpawnData const TBCapturePoints[TB_BASE_COUNT] =
-{
- { { -896.96f, 979.497f, 121.441f, 3.124123f }, TB_BASE_IRONCLAD_GARRISON, { GO_CAPTURE_POINT_NORTH_A_DEFENDING, GO_CAPTURE_POINT_NORTH_H_DEFENDING }, { WS_BATTLEFIELD_TB_GARRISON_ALLIANCE_CONTROLLED, WS_BATTLEFIELD_TB_GARRISON_HORDE_CONTROLLED }, { WS_BATTLEFIELD_TB_GARRISON_ALLIANCE_CAPTURING, WS_BATTLEFIELD_TB_GARRISON_HORDE_CAPTURING }, WS_BATTLEFIELD_TB_GARRISON_NEUTRAL, { TB_TEXT_GARRISON_ALLIANCE_GAINED, TB_TEXT_GARRISON_HORDE_GAINED }, { TB_TEXT_GARRISON_ALLIANCE_LOST, TB_TEXT_GARRISON_HORDE_LOST } },
- { { -1492.34f, 1309.87f, 152.961f, 5.462882f }, TB_BASE_WARDENS_VIGIL, { GO_CAPTURE_POINT_WEST_A_DEFENDING, GO_CAPTURE_POINT_WEST_H_DEFENDING }, { WS_BATTLEFIELD_TB_VIGIL_ALLIANCE_CONTROLLED, WS_BATTLEFIELD_TB_VIGIL_HORDE_CONTROLLED }, { WS_BATTLEFIELD_TB_VIGIL_ALLIANCE_CAPTURING, WS_BATTLEFIELD_TB_VIGIL_HORDE_CAPTURING }, WS_BATTLEFIELD_TB_VIGIL_NEUTRAL, { TB_TEXT_VIGIL_ALLIANCE_GAINED, TB_TEXT_VIGIL_HORDE_GAINED }, { TB_TEXT_VIGIL_ALLIANCE_LOST, TB_TEXT_VIGIL_HORDE_LOST } },
- { { -1437.f, 685.556f, 123.421f, 0.802851f }, TB_BASE_SLAGWORKS, { GO_CAPTURE_POINT_EAST_A_DEFENDING, GO_CAPTURE_POINT_EAST_H_DEFENDING }, { WS_BATTLEFIELD_TB_SLAGWORKS_ALLIANCE_CONTROLLED, WS_BATTLEFIELD_TB_SLAGWORKS_HORDE_CONTROLLED }, { WS_BATTLEFIELD_TB_SLAGWORKS_ALLIANCE_CAPTURING, WS_BATTLEFIELD_TB_SLAGWORKS_HORDE_CAPTURING }, WS_BATTLEFIELD_TB_SLAGWORKS_NEUTRAL, { TB_TEXT_SLAGWORKS_ALLIANCE_GAINED, TB_TEXT_SLAGWORKS_HORDE_GAINED }, { TB_TEXT_SLAGWORKS_ALLIANCE_LOST, TB_TEXT_SLAGWORKS_HORDE_LOST } },
-};
-
-// Towers
-enum TBTowerId
-{
- TB_TOWER_EAST_SPIRE = 0,
- TB_TOWER_SOUTH_SPIRE = 1,
- TB_TOWER_WEST_SPIRE = 2,
- TB_TOWERS_COUNT = 3,
-};
-
-struct TBTowerInfo
-{
- Position pos;
- uint32 entry;
- uint32 textDamaged;
- uint32 textDestroyed;
- uint32 wsIntact[PVP_TEAMS_COUNT];
- uint32 wsDamaged[PVP_TEAMS_COUNT];
- uint32 wsDestroyed;
-};
-
-TBTowerInfo const TBTowers[TB_TOWERS_COUNT] =
-{
- { { -1013.279f, 529.5382f, 146.427f, 1.97222f }, GO_EAST_SPIRE, TB_TEXT_EAST_SPIRE_DAMAGED, TB_TEXT_EAST_SPIRE_DESTROYED, { WS_BATTLEFIELD_TB_EAST_INTACT_ALLIANCE, WS_BATTLEFIELD_TB_EAST_INTACT_HORDE }, { WS_BATTLEFIELD_TB_EAST_DAMAGED_ALLIANCE, WS_BATTLEFIELD_TB_EAST_DAMAGED_HORDE }, WS_BATTLEFIELD_TB_EAST_DESTROYED_NEUTRAL },
- { { -1618.91f, 954.5417f, 168.601f, 0.06981169f }, GO_SOUTH_SPIRE, TB_TEXT_SOUTH_SPIRE_DAMAGED, TB_TEXT_SOUTH_SPIRE_DESTROYED, { WS_BATTLEFIELD_TB_SOUTH_INTACT_ALLIANCE, WS_BATTLEFIELD_TB_SOUTH_INTACT_HORDE }, { WS_BATTLEFIELD_TB_SOUTH_DAMAGED_ALLIANCE, WS_BATTLEFIELD_TB_SOUTH_DAMAGED_HORDE }, WS_BATTLEFIELD_TB_SOUTH_DESTROYED_NEUTRAL },
- { { -950.4097f, 1469.101f, 176.596f, 4.180066f }, GO_WEST_SPIRE, TB_TEXT_WEST_SPIRE_DAMAGED, TB_TEXT_WEST_SPIRE_DESTROYED, { WS_BATTLEFIELD_TB_WEST_INTACT_ALLIANCE, WS_BATTLEFIELD_TB_WEST_INTACT_HORDE }, { WS_BATTLEFIELD_TB_WEST_DAMAGED_ALLIANCE, WS_BATTLEFIELD_TB_WEST_DAMAGED_HORDE }, WS_BATTLEFIELD_TB_WEST_DESTROYED_NEUTRAL },
-};
-
-// Vehicles
-enum TBVehicles
-{
- NPC_ABANDONED_SIEGE_ENGINE = 45344,
-};
-
-int8 const TB_ABANDONED_SIEGE_ENGINE_COUNT = 6;
-Position const TBAbandonedSiegeEngineSpawnData[TB_ABANDONED_SIEGE_ENGINE_COUNT] =
-{
- { -1106.57f, 1196.34f, 121.8023f, 0.4014257f },
- { -1108.52f, 1111.33f, 121.2783f, 1.37881f },
- { -1213.01f, 782.236f, 121.4473f, 1.675516f },
- { -1258.26f, 780.497f, 122.4413f, 1.48353f },
- { -1438.3f, 1095.24f, 121.1363f, 5.288348f },
- { -1442.3f, 1141.07f, 123.6323f, 4.24115f },
-};
-
-// Banners
-enum TBFactionBannerEntry
-{
- GO_BARADINS_WARDEN_BANNER = 207391, // Alliance banner
- GO_HELLSCREAM_REACH_BANNER = 207400, // Horde banner
-};
-
-uint32 const TBBannerEntry[PVP_TEAMS_COUNT] = { GO_BARADINS_WARDEN_BANNER, GO_HELLSCREAM_REACH_BANNER };
-
-uint8 const TB_BANNER_MAX = 23;
-Position const TBBanners[TB_BANNER_MAX] =
-{
- { -987.6129f, 963.9861f, 121.4506f, 2.617989f },
- { -988.118f, 993.0087f, 121.6746f, 3.612838f },
- { -1195.941f, 964.342f, 119.728f, 0.8901166f },
- { -1196.892f, 1000.957f, 119.8211f, 5.445428f },
- { -1198.236f, 1081.898f, 120.2007f, 1.06465f },
- { -1089.337f, 1157.161f, 120.2749f, 3.036838f },
- { -1090.033f, 1143.476f, 120.2656f, 3.036838f },
- { -1217.495f, 944.0261f, 119.4949f, 1.989672f },
- { -1219.226f, 1018.168f, 119.728f, 2.251473f },
- { -1210.319f, 1081.885f, 120.2396f, 2.007128f },
- { -1226.903f, 786.7656f, 119.4592f, 1.553341f },
- { -1228.464f, 979.7379f, 119.3814f, 0.03490625f },
- { -1239.668f, 786.7899f, 119.4271f, 1.553341f },
- { -1250.262f, 1017.887f, 119.728f, 0.8377575f },
- { -1250.693f, 943.4496f, 119.4949f, 5.305802f },
- { -1272.29f, 963.5208f, 119.4949f, 2.617989f },
- { -1273.997f, 998.7934f, 119.4884f, 3.665196f },
- { -1378.363f, 725.0087f, 124.2978f, 1.326448f },
- { -1401.97f, 747.0972f, 123.2302f, 0.2443456f },
- { -1421.953f, 1263.559f, 133.6141f, 5.009095f },
- { -1446.497f, 1238.964f, 133.7601f, 5.969027f },
- { -1488.908f, 1118.747f, 124.9255f, 6.248279f },
- { -1488.533f, 1131.608f, 124.6363f, 6.248279f },
-};
-
-// Portals
-enum TBPortalEntry
-{
- TB_PORTAL_ALLIANCE = 208227, // Portal to Stormwind
- TB_PORTAL_HORDE = 208226, // Portal to Orgrimmar
-};
-
-uint32 const TBPortalEntry[PVP_TEAMS_COUNT] = { TB_PORTAL_ALLIANCE, TB_PORTAL_HORDE };
-
-uint8 const TB_PORTAL_MAX = 2;
-Position const TBPortals[TB_PORTAL_MAX] =
-{
- { -598.7656f, 1377.974f, 21.91898f, 0.0f },
- { -1257.729f, 1060.365f, 106.9938f, 5.462882f },
-};
-
-/* ################### *
- * Tol Barad graveyard *
- * ################### */
-
-enum TBGraveyardAreaId
-{
- // Tol Barad
- TB_GY_BARADIN_HOLD = 1789,
- TB_GY_IRONCLAD_GARRISON = 1783,
- TB_GY_WARDENS_VIGIL = 1785,
- TB_GY_SLAGWORKS = 1787,
- TB_GY_WEST_SPIRE = 1784,
- TB_GY_SOUTH_SPIRE = 1786,
- TB_GY_EAST_SPIRE = 1788,
- BATTLEFIELD_TB_GRAVEYARD_MAX = 7,
-
- // Tol Barad Peninsula
- TBP_GY_ALLIANCE_DAILY = 1808,
- TBP_GY_HORDE_DAILY = 1807,
-};
-
-struct TBGraveyardInfo
-{
- Position pos;
- uint32 phaseId;
- uint32 gyid;
- uint32 spiritEntry[PVP_TEAMS_COUNT];
- bool defenderControls;
-};
-
-TBGraveyardInfo const TBGraveyards[BATTLEFIELD_TB_GRAVEYARD_MAX] =
-{
- { { -1247.42f, 981.25f, 155.35f, 6.28f }, 128, TB_GY_BARADIN_HOLD, { NPC_TB_GY_SPIRIT_BARADIN_HOLD_A, NPC_TB_GY_SPIRIT_BARADIN_HOLD_H }, true },
- { { -974.28f, 1089.47f, 132.99f, 5.90f }, 64, TB_GY_IRONCLAD_GARRISON, { NPC_TB_GY_SPIRIT_IRONCLAD_GARRISON_A, NPC_TB_GY_SPIRIT_IRONCLAD_GARRISON_H }, false },
- { { -1570.44f, 1167.57f, 159.50f, 2.20f }, 64, TB_GY_WARDENS_VIGIL, { NPC_TB_GY_SPIRIT_WARDENS_VIGIL_A, NPC_TB_GY_SPIRIT_WARDENS_VIGIL_H }, false },
- { { -1343.32f, 565.24f, 139.04f, 1.66f }, 64, TB_GY_SLAGWORKS, { NPC_TB_GY_SPIRIT_SLAGWORKS_A, NPC_TB_GY_SPIRIT_SLAGWORKS_H }, false },
- { { -1052.02f, 1494.05f, 191.41f, 4.13f }, 64, TB_GY_WEST_SPIRE, { NPC_TB_GY_SPIRIT_WEST_SPIRE_A, NPC_TB_GY_SPIRIT_WEST_SPIRE_H }, false },
- { { -1603.34f, 874.29f, 193.69f, 5.27f }, 64, TB_GY_SOUTH_SPIRE, { NPC_TB_GY_SPIRIT_SOUTH_SPIRE_A, NPC_TB_GY_SPIRIT_SOUTH_SPIRE_H }, false },
- { { -943.66f, 572.36f, 157.54f, 1.74f }, 64, TB_GY_EAST_SPIRE, { NPC_TB_GY_SPIRIT_EAST_SPIRE_A, NPC_TB_GY_SPIRIT_EAST_SPIRE_H }, false },
-};
-
-/* ####################### *
- * Tol Barad capture point *
- * ####################### */
-
-class TolBaradCapturePoint : public BattlefieldControlZoneHandler
-{
- public:
- TolBaradCapturePoint(BattlefieldTB* battlefield, TBCapturePointSpawnData const& data);
-
- void HandleContestedEventHorde([[maybe_unused]] GameObject* controlZone) override;
- void HandleContestedEventAlliance([[maybe_unused]] GameObject* controlZone) override;
- void HandleProgressEventHorde([[maybe_unused]] GameObject* controlZone) override;
- void HandleProgressEventAlliance([[maybe_unused]] GameObject* controlZone) override;
- void HandleNeutralEventHorde([[maybe_unused]] GameObject* controlZone) override;
- void HandleNeutralEventAlliance([[maybe_unused]] GameObject* controlZone) override;
- void HandleNeutralEvent([[maybe_unused]] GameObject* controlZone) override;
-
- uint32 GetWorldStateHordeControlled() const { return _worldstateHordeControlled; }
- uint32 GetWorldStateAllianceControlled() const { return _worldstateAllianceControlled; }
-
- private:
- uint32 _textIdHordeCaptured;
- uint32 _textIdAllianceCaptured;
- uint32 _textIdHordeLost;
- uint32 _textIdAllianceLost;
- uint32 _worldstateHordeControlled;
- uint32 _worldstateAllianceControlled;
- uint32 _worldstateHordeCapturing;
- uint32 _worldstateAllianceCapturing;
- uint32 _worldstateNeutral;
-};
-
-/* ##################### *
- * Tol Barad battlefield *
- * ##################### */
-
-class BattlefieldTB : public Battlefield
-{
- public:
- using Battlefield::Battlefield;
- ~BattlefieldTB();
-
- void OnStartGrouping() override;
- void OnBattleStart() override;
- void OnBattleEnd(bool endByTimer) override;
-
- void OnPlayerEnterZone(Player* player) override;
- void OnPlayerLeaveZone(Player* player) override;
-
- void OnPlayerJoinWar(Player* player) override;
- void OnPlayerLeaveWar(Player* player) override;
-
- bool Update(uint32 diff) override;
-
- void OnCreatureCreate(Creature* creature) override;
- //void OnCreatureRemove(Creature* creature) override;
-
- void OnGameObjectCreate(GameObject* go) override;
-
- void UpdateCapturedBaseCount();
- //void UpdatedDestroyedTowerCount(TeamId team);
-
- //void DoCompleteOrIncrementAchievement(uint32 achievement, Player* player, uint8 incrementNumber = 1) override;
-
- bool SetupBattlefield() override;
-
- void HandleKill(Player* killer, Unit* victim) override;
- //void OnUnitDeath(Unit* unit) override;
- void PromotePlayer(Player* killer);
- void RemoveAurasFromPlayer(Player* player);
-
- void ProcessEvent(WorldObject* obj, uint32 eventId, WorldObject* invoker) override;
-
- void TowerDamaged(TBTowerId tbTowerId);
- void TowerDestroyed(TBTowerId tbTowerId);
-
- // returns the graveyardId in the specified area.
- //uint8 GetSpiritGraveyardId(uint32 areaId) const;
-
- void UpdateNPCsAndGameObjects();
- void CreateCapturePoints();
-
- protected:
- // Minutes till battle preparation warnings
- bool warnedFiveMinutes;
- bool warnedTwoMinutes;
- bool warnedOneMinute;
-
- bool updatedNPCAndObjects;
- uint32 m_updateObjectsTimer;
-
- uint32 m_BonusTime;
-
- GuidSet BattleInactiveNPCs;
- GuidSet BattleInactiveGOs;
-
- GuidSet TemporaryNPCs;
- GuidSet TemporaryGOs;
-
- GuidSet Towers;
-
- uint8 m_iCellblockRandom;
-
- ObjectGuid TBGatesGUID;
- ObjectGuid TBDoorGUID;
-
- ObjectGuid m_gateToTheHoleGUID;
- ObjectGuid m_gateDBlockGUID;
- ObjectGuid m_gateCursedDepthsGUID;
-};
-
-#endif
diff --git a/src/server/scripts/Battlefield/battlefield_script_loader.cpp b/src/server/scripts/Battlefield/battlefield_script_loader.cpp
index fcfa06e9449..a16d3eeb0d7 100644
--- a/src/server/scripts/Battlefield/battlefield_script_loader.cpp
+++ b/src/server/scripts/Battlefield/battlefield_script_loader.cpp
@@ -16,10 +16,8 @@
*/
void AddSC_BF_wintergrasp();
-void AddSC_BF_tol_barad();
void AddBattlefieldScripts()
{
AddSC_BF_wintergrasp();
- AddSC_BF_tol_barad();
}
diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h b/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h
deleted file mode 100644
index d0164dd56cd..00000000000
--- a/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
-* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
-*
-* 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 3 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef DEF_BARADIN_HOLD_H_
-#define DEF_BARADIN_HOLD_H_
-
-#include "CreatureAIImpl.h"
-
-#define DataHeader "BH"
-#define BHScriptName "instance_baradin_hold"
-
-uint32 const EncounterCount = 3;
-
-enum BHDataTypes
-{
- DATA_ARGALOTH = 0,
- DATA_OCCUTHAR = 1,
- DATA_ALIZABAL = 2
-};
-
-enum BHCreatureIds
-{
- BOSS_ARGALOTH = 47120,
- BOSS_OCCUTHAR = 52363,
- BOSS_ALIZABAL = 55869,
-
- NPC_EYE_OF_OCCUTHAR = 52389,
- NPC_FOCUS_FIRE_DUMMY = 52369,
- NPC_OCCUTHAR_EYE = 52368
-};
-
-enum BHGameObjectIds
-{
- GO_ARGALOTH_DOOR = 207619,
- GO_OCCUTHAR_DOOR = 208953,
- GO_ALIZABAL_DOOR = 209849
-};
-
-template<typename AI>
-CreatureAI* GetBaradinHoldAI(Creature* creature)
-{
- return GetInstanceAI<AI>(creature, BHScriptName);
-}
-
-#endif
diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp
deleted file mode 100644
index 1db8fdf370a..00000000000
--- a/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ScriptMgr.h"
-#include "baradin_hold.h"
-#include "InstanceScript.h"
-#include "MotionMaster.h"
-#include "ObjectAccessor.h"
-#include "Player.h"
-#include "ScriptedCreature.h"
-
-enum Texts
-{
- SAY_INTRO = 1,
- SAY_AGGRO = 2,
- SAY_HATE = 3,
- SAY_SKEWER = 4,
- SAY_SKEWER_ANNOUNCE = 5,
- SAY_BLADE_STORM = 6,
- SAY_SLAY = 10,
- SAY_DEATH = 12
-};
-
-enum Spells
-{
- SPELL_BLADE_DANCE = 105784,
- SPELL_BLADE_DANCE_DUMMY = 105828,
- SPELL_SEETHING_HATE = 105067,
- SPELL_SKEWER = 104936,
- SPELL_BERSERK = 47008
-};
-
-enum Actions
-{
- ACTION_INTRO = 1
-};
-
-enum Points
-{
- POINT_STORM = 1
-};
-
-enum Events
-{
- EVENT_RANDOM_CAST = 1,
- EVENT_STOP_STORM = 2,
- EVENT_MOVE_STORM = 3,
- EVENT_CAST_STORM = 4
-};
-
-class at_alizabal_intro : public AreaTriggerScript
-{
- public:
- at_alizabal_intro() : AreaTriggerScript("at_alizabal_intro") { }
-
- bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
- {
- if (InstanceScript* instance = player->GetInstanceScript())
- if (Creature* alizabal = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_ALIZABAL)))
- alizabal->AI()->DoAction(ACTION_INTRO);
- return true;
- }
-};
-
-class boss_alizabal : public CreatureScript
-{
- public:
- boss_alizabal() : CreatureScript("boss_alizabal") { }
-
- struct boss_alizabalAI : public BossAI
- {
- boss_alizabalAI(Creature* creature) : BossAI(creature, DATA_ALIZABAL) { }
-
- void Reset() override
- {
- _Reset();
- _hate = false;
- _skewer = false;
- }
-
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- Talk(SAY_AGGRO);
- instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me);
- events.ScheduleEvent(EVENT_RANDOM_CAST, 10s);
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- Talk(SAY_DEATH);
- instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
- }
-
- void KilledUnit(Unit* who) override
- {
- if (who->GetTypeId() == TYPEID_PLAYER)
- Talk(SAY_SLAY);
- }
-
- void EnterEvadeMode(EvadeReason /*why*/) override
- {
- instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
- me->GetMotionMaster()->MoveTargetedHome();
- _DespawnAtEvade();
- }
-
- void DoAction(int32 action) override
- {
- switch (action)
- {
- case ACTION_INTRO:
- if (!_intro)
- {
- Talk(SAY_INTRO);
- _intro = true;
- }
- break;
- }
- }
-
- void MovementInform(uint32 /*type*/, uint32 pointId) override
- {
- switch (pointId)
- {
- case POINT_STORM:
- events.ScheduleEvent(EVENT_CAST_STORM, 1ms);
- break;
- }
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_RANDOM_CAST:
- switch (urand(0, 1))
- {
- case 0:
- if (!_skewer)
- {
- if (Unit* target = SelectTarget(SelectTargetMethod::MaxThreat, 0))
- {
- DoCast(target, SPELL_SKEWER, true);
- Talk(SAY_SKEWER);
- Talk(SAY_SKEWER_ANNOUNCE, target);
- }
- _skewer = true;
- events.ScheduleEvent(EVENT_RANDOM_CAST, 7s, 10s);
- }
- else if (!_hate)
- {
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, NonTankTargetSelector(me)))
- {
- DoCast(target, SPELL_SEETHING_HATE, true);
- Talk(SAY_HATE);
- }
- _hate = true;
- events.ScheduleEvent(EVENT_RANDOM_CAST, 7s, 10s);
- }
- else if (_hate && _skewer)
- {
- Talk(SAY_BLADE_STORM);
- DoCastAOE(SPELL_BLADE_DANCE_DUMMY);
- DoCastAOE(SPELL_BLADE_DANCE);
- events.ScheduleEvent(EVENT_RANDOM_CAST, 21s);
- events.ScheduleEvent(EVENT_MOVE_STORM, 4050ms);
- events.ScheduleEvent(EVENT_STOP_STORM, 13s);
- }
- break;
- case 1:
- if (!_hate)
- {
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, NonTankTargetSelector(me)))
- {
- DoCast(target, SPELL_SEETHING_HATE, true);
- Talk(SAY_HATE);
- }
- _hate = true;
- events.ScheduleEvent(EVENT_RANDOM_CAST, 7s, 10s);
- }
- else if (!_skewer)
- {
- if (Unit* target = SelectTarget(SelectTargetMethod::MaxThreat, 0))
- {
- DoCast(target, SPELL_SKEWER, true);
- Talk(SAY_SKEWER);
- Talk(SAY_SKEWER_ANNOUNCE, target);
- }
- _skewer = true;
- events.ScheduleEvent(EVENT_RANDOM_CAST, 7s, 10s);
- }
- else if (_hate && _skewer)
- {
- Talk(SAY_BLADE_STORM);
- DoCastAOE(SPELL_BLADE_DANCE_DUMMY);
- DoCastAOE(SPELL_BLADE_DANCE);
- events.ScheduleEvent(EVENT_RANDOM_CAST, 21s);
- events.ScheduleEvent(EVENT_MOVE_STORM, 4050ms);
- events.ScheduleEvent(EVENT_STOP_STORM, 13s);
- }
- break;
- }
- break;
- case EVENT_MOVE_STORM:
- me->SetSpeedRate(MOVE_RUN, 4.0f);
- me->SetSpeedRate(MOVE_WALK, 4.0f);
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, NonTankTargetSelector(me)))
- me->GetMotionMaster()->MovePoint(POINT_STORM, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ());
- events.ScheduleEvent(EVENT_MOVE_STORM, 4050ms);
- break;
- case EVENT_STOP_STORM:
- me->RemoveAura(SPELL_BLADE_DANCE);
- me->RemoveAura(SPELL_BLADE_DANCE_DUMMY);
- me->SetSpeedRate(MOVE_WALK, 1.0f);
- me->SetSpeedRate(MOVE_RUN, 1.14f);
- me->GetMotionMaster()->MoveChase(me->GetVictim());
- _hate = false;
- _skewer = false;
- break;
- case EVENT_CAST_STORM:
- DoCastAOE(SPELL_BLADE_DANCE);
- break;
- }
- }
- }
-
- private:
- bool _intro = false;
- bool _hate = false;
- bool _skewer = false;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetBaradinHoldAI<boss_alizabalAI>(creature);
- }
-};
-
-void AddSC_boss_alizabal()
-{
- new boss_alizabal();
- new at_alizabal_intro();
-}
diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp
deleted file mode 100644
index 1123128e158..00000000000
--- a/src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp
+++ /dev/null
@@ -1,365 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ScriptMgr.h"
-#include "baradin_hold.h"
-#include "Containers.h"
-#include "InstanceScript.h"
-#include "ObjectAccessor.h"
-#include "ScriptedCreature.h"
-#include "SpellAuraEffects.h"
-#include "SpellScript.h"
-#include "TemporarySummon.h"
-#include "Vehicle.h"
-
-enum Spells
-{
- SPELL_SEARING_SHADOWS = 96913,
- SPELL_FOCUSED_FIRE_FIRST_DAMAGE = 97212,
- SPELL_FOCUSED_FIRE_TRIGGER = 96872,
- SPELL_FOCUSED_FIRE_VISUAL = 96886,
- SPELL_FOCUSED_FIRE = 96884,
- SPELL_EYES_OF_OCCUTHAR = 96920,
- SPELL_GAZE_OF_OCCUTHAR = 96942,
- SPELL_OCCUTHARS_DESTUCTION = 96968,
- SPELL_BERSERK = 47008
-};
-
-enum Events
-{
- EVENT_SEARING_SHADOWS = 1,
- EVENT_FOCUSED_FIRE = 2,
- EVENT_EYES_OF_OCCUTHAR = 3,
- EVENT_BERSERK = 4,
-
- EVENT_FOCUSED_FIRE_FIRST_DAMAGE = 1
-};
-
-enum Misc
-{
- MAX_OCCUTHAR_VEHICLE_SEATS = 7
-};
-
-class boss_occuthar : public CreatureScript
-{
- public:
- boss_occuthar() : CreatureScript("boss_occuthar") { }
-
- struct boss_occutharAI : public BossAI
- {
- boss_occutharAI(Creature* creature) : BossAI(creature, DATA_OCCUTHAR),
- _vehicle(me->GetVehicleKit())
- {
- ASSERT(_vehicle);
- }
-
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me);
- events.ScheduleEvent(EVENT_SEARING_SHADOWS, 8s);
- events.ScheduleEvent(EVENT_FOCUSED_FIRE, 15s);
- events.ScheduleEvent(EVENT_EYES_OF_OCCUTHAR, 30s);
- events.ScheduleEvent(EVENT_BERSERK, 5min);
- }
-
- void EnterEvadeMode(EvadeReason why) override
- {
- BossAI::EnterEvadeMode(why);
- instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
- _DespawnAtEvade();
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
- }
-
- void JustSummoned(Creature* summon) override
- {
- summons.Summon(summon);
-
- if (summon->GetEntry() == NPC_FOCUS_FIRE_DUMMY)
- {
- DoCast(summon, SPELL_FOCUSED_FIRE);
-
- for (uint8 i = 0; i < MAX_OCCUTHAR_VEHICLE_SEATS; ++i)
- {
- if (Unit* vehicle = _vehicle->GetPassenger(i))
- vehicle->CastSpell(summon, SPELL_FOCUSED_FIRE_VISUAL);
- }
- }
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_SEARING_SHADOWS:
- DoCastAOE(SPELL_SEARING_SHADOWS);
- events.ScheduleEvent(EVENT_SEARING_SHADOWS, 25s);
- break;
- case EVENT_FOCUSED_FIRE:
- DoCastAOE(SPELL_FOCUSED_FIRE_TRIGGER, true);
- events.ScheduleEvent(EVENT_FOCUSED_FIRE, 15s);
- break;
- case EVENT_EYES_OF_OCCUTHAR:
- DoCastAOE(SPELL_EYES_OF_OCCUTHAR);
- events.RescheduleEvent(EVENT_FOCUSED_FIRE, 15s);
- events.ScheduleEvent(EVENT_EYES_OF_OCCUTHAR, 60s);
- break;
- case EVENT_BERSERK:
- DoCast(me, SPELL_BERSERK, true);
- break;
- default:
- break;
- }
- }
- }
-
- private:
- Vehicle* _vehicle;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetBaradinHoldAI<boss_occutharAI>(creature);
- }
-};
-
-class npc_eyestalk : public CreatureScript
-{
- public:
- npc_eyestalk() : CreatureScript("npc_eyestalk") { }
-
- struct npc_eyestalkAI : public ScriptedAI
- {
- npc_eyestalkAI(Creature* creature) : ScriptedAI(creature),
- _instance(creature->GetInstanceScript())
- {
- _damageCount = 0;
- }
-
- void IsSummonedBy(WorldObject* /*summoner*/) override
- {
- // player is the spellcaster so register summon manually
- if (Creature* occuthar = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_OCCUTHAR)))
- occuthar->AI()->JustSummoned(me);
- }
-
- void Reset() override
- {
- _events.Reset();
- _events.ScheduleEvent(EVENT_FOCUSED_FIRE_FIRST_DAMAGE, 0s);
- }
-
- void UpdateAI(uint32 diff) override
- {
- _events.Update(diff);
-
- if (_events.ExecuteEvent() == EVENT_FOCUSED_FIRE_FIRST_DAMAGE)
- {
- DoCastAOE(SPELL_FOCUSED_FIRE_FIRST_DAMAGE);
- if (++_damageCount < 2)
- _events.ScheduleEvent(EVENT_FOCUSED_FIRE_FIRST_DAMAGE, 1s);
- }
- }
-
- void EnterEvadeMode(EvadeReason /*why*/) override { } // Never evade
-
- private:
- InstanceScript* _instance;
- EventMap _events;
- uint8 _damageCount;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetBaradinHoldAI<npc_eyestalkAI>(creature);
- }
-};
-
-// 96872 - Focused Fire
-class spell_occuthar_focused_fire : public SpellScriptLoader
-{
- public:
- spell_occuthar_focused_fire() : SpellScriptLoader("spell_occuthar_focused_fire") { }
-
- class spell_occuthar_focused_fire_SpellScript : public SpellScript
- {
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- if (targets.size() < 2)
- return;
-
- targets.remove_if([&](WorldObject const* target)
- {
- return GetCaster()->GetVictim() == target;
- });
-
- if (targets.size() >= 2)
- Trinity::Containers::RandomResize(targets, 1);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_occuthar_focused_fire_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_occuthar_focused_fire_SpellScript();
- }
-};
-
-// ID - 96931 Eyes of Occu'thar
-class spell_occuthar_eyes_of_occuthar : public SpellScriptLoader
-{
- public:
- spell_occuthar_eyes_of_occuthar() : SpellScriptLoader("spell_occuthar_eyes_of_occuthar") { }
-
- class spell_occuthar_eyes_of_occuthar_SpellScript : public SpellScript
- {
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellEffect({ { spellInfo->Id, EFFECT_0 } }) && ValidateSpellInfo({ uint32(spellInfo->GetEffect(EFFECT_0).CalcValue()) });
- }
-
- bool Load() override
- {
- return GetCaster()->GetTypeId() == TYPEID_PLAYER;
- }
-
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- if (targets.empty())
- return;
-
- Trinity::Containers::RandomResize(targets, 1);
- }
-
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- GetHitUnit()->CastSpell(GetCaster(), GetEffectValue(), true);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_occuthar_eyes_of_occuthar_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
- OnEffectHitTarget += SpellEffectFn(spell_occuthar_eyes_of_occuthar_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_occuthar_eyes_of_occuthar_SpellScript();
- }
-};
-
-// ID - 96932 Eyes of Occu'thar
-class spell_occuthar_eyes_of_occuthar_vehicle : public SpellScriptLoader
-{
- public:
- spell_occuthar_eyes_of_occuthar_vehicle() : SpellScriptLoader("spell_occuthar_eyes_of_occuthar_vehicle") { }
-
- class spell_occuthar_eyes_of_occuthar_vehicle_SpellScript : public SpellScript
- {
- bool Load() override
- {
- return InstanceHasScript(GetCaster(), BHScriptName);
- }
-
- void HandleScript()
- {
- Position pos = GetHitUnit()->GetPosition();
-
- if (Creature* occuthar = ObjectAccessor::GetCreature(*GetCaster(), GetCaster()->GetInstanceScript()->GetGuidData(DATA_OCCUTHAR)))
- {
- if (Creature* creature = occuthar->SummonCreature(NPC_EYE_OF_OCCUTHAR, pos))
- creature->CastSpell(GetHitUnit(), SPELL_GAZE_OF_OCCUTHAR, false);
- }
- }
-
- void Register() override
- {
- AfterHit += SpellHitFn(spell_occuthar_eyes_of_occuthar_vehicle_SpellScript::HandleScript);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_occuthar_eyes_of_occuthar_vehicle_SpellScript();
- }
-};
-
-// 96942 / 101009 - Gaze of Occu'thar
-class spell_occuthar_occuthars_destruction : public SpellScriptLoader
-{
- public:
- spell_occuthar_occuthars_destruction() : SpellScriptLoader("spell_occuthar_occuthars_destruction") { }
-
- class spell_occuthar_occuthars_destruction_AuraScript : public AuraScript
- {
- bool Load() override
- {
- return GetCaster() && GetCaster()->GetTypeId() == TYPEID_UNIT;
- }
-
- void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
- {
- if (Unit* caster = GetCaster())
- {
- if (IsExpired())
- caster->CastSpell(nullptr, SPELL_OCCUTHARS_DESTUCTION, aurEff);
-
- caster->ToCreature()->DespawnOrUnsummon(500ms);
- }
- }
-
- void Register() override
- {
- OnEffectRemove += AuraEffectRemoveFn(spell_occuthar_occuthars_destruction_AuraScript::OnRemove, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
- }
- };
-
- AuraScript* GetAuraScript() const override
- {
- return new spell_occuthar_occuthars_destruction_AuraScript();
- }
-};
-
-void AddSC_boss_occuthar()
-{
- new boss_occuthar();
- new npc_eyestalk();
- new spell_occuthar_focused_fire();
- new spell_occuthar_eyes_of_occuthar();
- new spell_occuthar_eyes_of_occuthar_vehicle();
- new spell_occuthar_occuthars_destruction();
-}
diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp
deleted file mode 100644
index 83fda21f9d9..00000000000
--- a/src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ScriptMgr.h"
-#include "baradin_hold.h"
-#include "Containers.h"
-#include "InstanceScript.h"
-#include "Map.h"
-#include "ScriptedCreature.h"
-#include "SpellScript.h"
-
-/* TODO:
-- Fel Firestorm need completion
-- Need Correct timer
-*/
-
-enum Spells
-{
- SPELL_METEOR_SLASH = 88942,
- SPELL_CONSUMING_DARKNESS = 88954,
- SPELL_FEL_FIRESTORM = 88972,
- SPELL_BERSERK = 47008
-};
-
-enum Events
-{
- EVENT_METEOR_SLASH = 1,
- EVENT_CONSUMING_DARKNESS = 2,
- EVENT_BERSERK = 3
-};
-
-class boss_pit_lord_argaloth : public CreatureScript
-{
- public:
- boss_pit_lord_argaloth() : CreatureScript("boss_pit_lord_argaloth") { }
-
- struct boss_pit_lord_argalothAI : public BossAI
- {
- boss_pit_lord_argalothAI(Creature* creature) : BossAI(creature, DATA_ARGALOTH) { }
-
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me);
- events.ScheduleEvent(EVENT_METEOR_SLASH, 10s, 20s);
- events.ScheduleEvent(EVENT_CONSUMING_DARKNESS, 20s, 25s);
- events.ScheduleEvent(EVENT_BERSERK, 5min);
- }
-
- void EnterEvadeMode(EvadeReason /*why*/) override
- {
- instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
- _DespawnAtEvade();
- }
-
- void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
- {
- if (me->HealthBelowPctDamaged(33, damage) ||
- me->HealthBelowPctDamaged(66, damage))
- {
- DoCastAOE(SPELL_FEL_FIRESTORM);
- }
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_METEOR_SLASH:
- DoCastAOE(SPELL_METEOR_SLASH);
- events.ScheduleEvent(EVENT_METEOR_SLASH, 15s, 20s);
- break;
- case EVENT_CONSUMING_DARKNESS:
- DoCastAOE(SPELL_CONSUMING_DARKNESS, true);
- events.ScheduleEvent(EVENT_CONSUMING_DARKNESS, 20s, 25s);
- break;
- case EVENT_BERSERK:
- DoCast(me, SPELL_BERSERK, true);
- break;
- default:
- break;
- }
- }
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetBaradinHoldAI<boss_pit_lord_argalothAI>(creature);
- }
-};
-
-// 88954 / 95173 - Consuming Darkness
-class spell_argaloth_consuming_darkness : public SpellScriptLoader
-{
- public:
- spell_argaloth_consuming_darkness() : SpellScriptLoader("spell_argaloth_consuming_darkness") { }
-
- class spell_argaloth_consuming_darkness_SpellScript : public SpellScript
- {
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- Trinity::Containers::RandomResize(targets, GetCaster()->GetMap()->Is25ManRaid() ? 8 : 3);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_argaloth_consuming_darkness_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_argaloth_consuming_darkness_SpellScript();
- }
-};
-
-// 88942 / 95172 - Meteor Slash
-class spell_argaloth_meteor_slash : public SpellScriptLoader
-{
- public:
- spell_argaloth_meteor_slash() : SpellScriptLoader("spell_argaloth_meteor_slash") { }
-
- class spell_argaloth_meteor_slash_SpellScript : public SpellScript
- {
- void CountTargets(std::list<WorldObject*>& targets)
- {
- _targetCount = targets.size();
- }
-
- void SplitDamage()
- {
- if (!_targetCount)
- return;
-
- SetHitDamage(GetHitDamage() / _targetCount);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_argaloth_meteor_slash_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_CONE_CASTER_TO_DEST_ENEMY);
- OnHit += SpellHitFn(spell_argaloth_meteor_slash_SpellScript::SplitDamage);
- }
-
- private:
- uint32 _targetCount = 0;
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_argaloth_meteor_slash_SpellScript();
- }
-};
-
-void AddSC_boss_pit_lord_argaloth()
-{
- new boss_pit_lord_argaloth();
- new spell_argaloth_consuming_darkness();
- new spell_argaloth_meteor_slash();
-}
diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp
deleted file mode 100644
index 376dd3a3de7..00000000000
--- a/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ScriptMgr.h"
-#include "baradin_hold.h"
-#include "Creature.h"
-#include "GameObject.h"
-#include "InstanceScript.h"
-#include "Map.h"
-
-DoorData const doorData[] =
-{
- { GO_ARGALOTH_DOOR, DATA_ARGALOTH, EncounterDoorBehavior::OpenWhenNotInProgress },
- { GO_OCCUTHAR_DOOR, DATA_OCCUTHAR, EncounterDoorBehavior::OpenWhenNotInProgress },
- { GO_ALIZABAL_DOOR, DATA_ALIZABAL, EncounterDoorBehavior::OpenWhenNotInProgress },
- { 0, 0, EncounterDoorBehavior::OpenWhenNotInProgress } // END
-};
-
-DungeonEncounterData const encounters[] =
-{
- { DATA_ARGALOTH, {{ 1033 }} },
- { DATA_OCCUTHAR, {{ 1250 }} },
- { DATA_ALIZABAL, {{ 1332 }} }
-};
-
-class instance_baradin_hold: public InstanceMapScript
-{
- public:
- instance_baradin_hold() : InstanceMapScript(BHScriptName, 757) { }
-
- struct instance_baradin_hold_InstanceMapScript: public InstanceScript
- {
- instance_baradin_hold_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
- {
- SetHeaders(DataHeader);
- SetBossNumber(EncounterCount);
- LoadDoorData(doorData);
- LoadDungeonEncounterData(encounters);
- }
-
- void OnCreatureCreate(Creature* creature) override
- {
- switch(creature->GetEntry())
- {
- case BOSS_ARGALOTH:
- ArgalothGUID = creature->GetGUID();
- break;
- case BOSS_OCCUTHAR:
- OccutharGUID = creature->GetGUID();
- break;
- case BOSS_ALIZABAL:
- AlizabalGUID = creature->GetGUID();
- break;
- }
- }
-
- void OnGameObjectCreate(GameObject* go) override
- {
- switch(go->GetEntry())
- {
- case GO_ARGALOTH_DOOR:
- case GO_OCCUTHAR_DOOR:
- case GO_ALIZABAL_DOOR:
- AddDoor(go, true);
- break;
- }
- }
-
- ObjectGuid GetGuidData(uint32 data) const override
- {
- switch (data)
- {
- case DATA_ARGALOTH:
- return ArgalothGUID;
- case DATA_OCCUTHAR:
- return OccutharGUID;
- case DATA_ALIZABAL:
- return AlizabalGUID;
- default:
- break;
- }
-
- return ObjectGuid::Empty;
- }
-
- void OnGameObjectRemove(GameObject* go) override
- {
- switch(go->GetEntry())
- {
- case GO_ARGALOTH_DOOR:
- case GO_OCCUTHAR_DOOR:
- case GO_ALIZABAL_DOOR:
- AddDoor(go, false);
- break;
- }
- }
-
- protected:
- ObjectGuid ArgalothGUID;
- ObjectGuid OccutharGUID;
- ObjectGuid AlizabalGUID;
- };
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const override
- {
- return new instance_baradin_hold_InstanceMapScript(map);
- }
-};
-
-void AddSC_instance_baradin_hold()
-{
- new instance_baradin_hold();
-}
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp
deleted file mode 100644
index f5373e7b413..00000000000
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp
+++ /dev/null
@@ -1,870 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ScriptMgr.h"
-#include "blackrock_caverns.h"
-#include "ScriptedCreature.h"
-#include "SpellAuras.h"
-#include "SpellScript.h"
-#include "TemporarySummon.h"
-
-/*#####
-# npc_fire_cyclone
-#####*/
-
-enum FireCyclone
-{
- SPELL_FIRE_CYCLONE_AURA = 74851,
- EVENT_FIRE_CYCLONE_AURA = 1
-};
-
-class npc_fire_cyclone : public CreatureScript
-{
- public: npc_fire_cyclone() : CreatureScript("npc_fire_cyclone") { }
-
- struct npc_fire_cycloneAI : public ScriptedAI
- {
- npc_fire_cycloneAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
-
- void Reset() override
- {
- _events.Reset();
- _events.ScheduleEvent(EVENT_FIRE_CYCLONE_AURA, 100ms);
- }
-
- void UpdateAI(uint32 diff) override
- {
- _events.Update(diff);
-
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_FIRE_CYCLONE_AURA:
- DoCast(me, SPELL_FIRE_CYCLONE_AURA, true);
- _events.ScheduleEvent(EVENT_FIRE_CYCLONE_AURA, 4s);
- break;
- default:
- break;
- }
- }
- }
-
- private:
- EventMap _events;
- InstanceScript* _instance;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetBlackrockCavernsAI<npc_fire_cycloneAI>(creature);
- }
-};
-
-/*#####
-# npc_twilight_flame_caller
-#####*/
-
-enum TwilightFlameCaller
-{
- SPELL_FIRE_CHANNELING_1 = 74911,
- SPELL_FIRE_CHANNELING_2 = 74912,
- SPELL_BLAST_WAVE = 76473,
- SPELL_CALL_FLAMES = 76325,
- NPC_FIRE_CYCLONE = 40164,
- EVENT_CHANNEL = 2,
- EVENT_BLAST_WAVE = 3,
- EVENT_CALL_FLAMES = 4
-};
-
-Position const SummonPos[6] =
-{
- { 162.5990f, 1085.321f, 201.1190f, 0.0f },
- { 170.5469f, 1063.403f, 201.1409f, 0.0f },
- { 191.2326f, 1100.160f, 201.1071f, 0.0f },
- { 228.0816f, 1106.000f, 201.1292f, 0.0f },
- { 252.8351f, 1095.127f, 201.1436f, 0.0f },
- { 253.6476f, 1070.226f, 201.1344f, 0.0f }
-};
-
-class npc_twilight_flame_caller : public CreatureScript
-{
-public: npc_twilight_flame_caller() : CreatureScript("npc_twilight_flame_caller") { }
-
- struct npc_twilight_flame_callerAI : public ScriptedAI
- {
- npc_twilight_flame_callerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _summons(me)
- {
- Initialize();
- }
-
- void Initialize()
- {
- _combatPhase = false;
- }
-
- void Reset() override
- {
- Initialize();
- _flamecaller1GUID.Clear();
- _flamecaller2GUID.Clear();
-
- if (me->GetPositionX() > 172 && me->GetPositionX() < 173 && me->GetPositionY() > 1086 && me->GetPositionY() < 1087)
- {
- _flamecaller1GUID = me->GetGUID();
- me->SummonCreature(NPC_FIRE_CYCLONE, SummonPos[0], TEMPSUMMON_CORPSE_DESPAWN, 0s);
- me->SummonCreature(NPC_FIRE_CYCLONE, SummonPos[1], TEMPSUMMON_CORPSE_DESPAWN, 0s);
- me->SummonCreature(NPC_FIRE_CYCLONE, SummonPos[2], TEMPSUMMON_CORPSE_DESPAWN, 0s);
- }
- if (me->GetPositionX() > 247 && me->GetPositionX() < 248 && me->GetPositionY() > 1081 && me->GetPositionY() < 1082)
- {
- _flamecaller2GUID = me->GetGUID();
- me->SummonCreature(NPC_FIRE_CYCLONE, SummonPos[3], TEMPSUMMON_CORPSE_DESPAWN, 0s);
- me->SummonCreature(NPC_FIRE_CYCLONE, SummonPos[4], TEMPSUMMON_CORPSE_DESPAWN, 0s);
- me->SummonCreature(NPC_FIRE_CYCLONE, SummonPos[5], TEMPSUMMON_CORPSE_DESPAWN, 0s);
- }
-
- _events.ScheduleEvent(EVENT_CHANNEL, 100ms);
- }
-
- void JustSummoned(Creature* summoned) override
- {
- _summons.Summon(summoned);
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- _summons.DespawnAll();
- }
-
- void JustEngagedWith(Unit* /*who*/) override
- {
- _events.Reset();
- _combatPhase = true;
- _events.ScheduleEvent(EVENT_BLAST_WAVE, 8s, 10s);
- _events.ScheduleEvent(EVENT_CALL_FLAMES, 10s, 14s);
- }
-
- void UpdateAI(uint32 diff) override
- {
- _events.Update(diff);
-
- if (!_combatPhase)
- {
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_CHANNEL:
- if (me->GetGUID() == _flamecaller1GUID)
- DoCast(me, SPELL_FIRE_CHANNELING_1);
- if (me->GetGUID() == _flamecaller2GUID)
- DoCast(me, SPELL_FIRE_CHANNELING_2);
- _events.ScheduleEvent(EVENT_CHANNEL, 12s);
- break;
- default:
- break;
- }
- }
- return;
- }
-
- if (!UpdateVictim())
- return;
-
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_BLAST_WAVE:
- DoCast(me, SPELL_BLAST_WAVE);
- _events.ScheduleEvent(EVENT_BLAST_WAVE, 16s, 20s);
- break;
- case EVENT_CALL_FLAMES:
- DoCast(me, SPELL_CALL_FLAMES);
- _events.ScheduleEvent(EVENT_CALL_FLAMES, 12s, 15s);
- break;
- default:
- break;
- }
- }
- }
-
- private:
- EventMap _events;
- InstanceScript* _instance;
- ObjectGuid _flamecaller1GUID;
- ObjectGuid _flamecaller2GUID;
- SummonList _summons;
- bool _combatPhase;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetBlackrockCavernsAI<npc_twilight_flame_callerAI>(creature);
- }
-};
-
-/*#####
-# npc_twilight_torturer
-#####*/
-
-enum TwilightTorturer
-{
- SPELL_INFLICT_PAIN = 75590,
- SPELL_RED_HOT_POKER = 76478,
- SPELL_SHACKLES = 76484,
- SPELL_WILD_BEATDOWN = 76487,
- EVENT_INFLICT_PAIN_TT = 5,
- EVENT_RED_HOT_POKER = 6,
- EVENT_SHACKLES = 7,
- EVENT_WILD_BEATDOWN = 8
-};
-
-class npc_twilight_torturer : public CreatureScript
-{
- public: npc_twilight_torturer() : CreatureScript("npc_twilight_torturer") { }
-
- struct npc_twilight_torturerAI : public ScriptedAI
- {
- npc_twilight_torturerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
- {
- Initialize();
- }
-
- void Initialize()
- {
- _combatPhase = false;
- }
-
- void Reset() override
- {
- Initialize();
- if (!me->GetWaypointPathId())
- _events.ScheduleEvent(EVENT_INFLICT_PAIN_TT, 6s, 18s);
- }
-
- void JustEngagedWith(Unit* /*who*/) override
- {
- _events.Reset();
- _combatPhase = true;
- _events.ScheduleEvent(EVENT_RED_HOT_POKER, 9s);
- _events.ScheduleEvent(EVENT_SHACKLES, 13s);
- _events.ScheduleEvent(EVENT_WILD_BEATDOWN, 17s);
- }
-
- void UpdateAI(uint32 diff) override
- {
- _events.Update(diff);
-
- if (!_combatPhase)
- {
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_INFLICT_PAIN_TT:
- DoCast(me, SPELL_INFLICT_PAIN);
- _events.ScheduleEvent(EVENT_INFLICT_PAIN_TT, 25s, 32s);
- break;
- default:
- break;
- }
- }
- return;
- }
-
- if (!UpdateVictim())
- return;
-
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_RED_HOT_POKER:
- DoCast(me, SPELL_RED_HOT_POKER);
- _events.ScheduleEvent(EVENT_RED_HOT_POKER, 16s, 20s);
- break;
- case EVENT_SHACKLES:
- DoCast(me, SPELL_SHACKLES);
- _events.ScheduleEvent(EVENT_SHACKLES, 12s, 15s);
- break;
- case EVENT_WILD_BEATDOWN:
- DoCast(me, SPELL_WILD_BEATDOWN);
- _events.ScheduleEvent(EVENT_WILD_BEATDOWN, 12s, 15s);
- break;
- default:
- break;
- }
- }
- }
-
- private:
- EventMap _events;
- InstanceScript* _instance;
- bool _combatPhase;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetBlackrockCavernsAI<npc_twilight_torturerAI>(creature);
- }
-};
-
-/*#####
-# npc_twilight_sadist
-#####*/
-
-enum TwilightSadist
-{
- SPELL_INFLICT_PAIN_1 = 76497,
- SPELL_HEAT_SEEKER_BLADE = 76502,
- SPELL_SHORT_THROW = 76572,
- SPELL_SINISTER_STRIKE = 76500,
- EVENT_INFLICT_PAIN_TS = 9,
- EVENT_HEAT_SEEKER_BLADE = 10,
- EVENT_SHORT_THROW = 11,
- EVENT_SINISTER_STRIKE = 12
-};
-
-class npc_twilight_sadist : public CreatureScript
-{
- public: npc_twilight_sadist() : CreatureScript("npc_twilight_sadist") { }
-
- struct npc_twilight_sadistAI : public ScriptedAI
- {
- npc_twilight_sadistAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
-
- void Reset() override
- {
- _combatPhase = false;
- if (!me->GetWaypointPathId())
- _events.ScheduleEvent(EVENT_INFLICT_PAIN_TS, 6s, 18s);
- }
-
- void JustEngagedWith(Unit* /*who*/) override
- {
- _events.Reset();
- _combatPhase = true;
- _events.ScheduleEvent(EVENT_INFLICT_PAIN_TS, 9s);
- _events.ScheduleEvent(EVENT_HEAT_SEEKER_BLADE, 13s);
- _events.ScheduleEvent(EVENT_SHORT_THROW, 17s);
- _events.ScheduleEvent(EVENT_SINISTER_STRIKE, 17s);
- }
-
- void UpdateAI(uint32 diff) override
- {
- _events.Update(diff);
-
- if (!_combatPhase)
- {
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_INFLICT_PAIN_TS:
- DoCast(me, SPELL_INFLICT_PAIN);
- _events.ScheduleEvent(EVENT_INFLICT_PAIN_TS, 25s, 32s);
- break;
- default:
- break;
- }
- }
- return;
- }
-
- if (!UpdateVictim())
- return;
-
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_RED_HOT_POKER:
- DoCast(me, SPELL_RED_HOT_POKER);
- _events.ScheduleEvent(EVENT_RED_HOT_POKER, 16s, 20s);
- break;
- case EVENT_SHACKLES:
- DoCast(me, SPELL_SHACKLES);
- _events.ScheduleEvent(EVENT_SHACKLES, 12s, 15s);
- break;
- case EVENT_WILD_BEATDOWN:
- DoCast(me, SPELL_WILD_BEATDOWN);
- _events.ScheduleEvent(EVENT_WILD_BEATDOWN, 12s, 15s);
- break;
- default:
- break;
- }
- }
- }
-
- private:
- EventMap _events;
- InstanceScript* _instance;
- bool _combatPhase = false;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetBlackrockCavernsAI<npc_twilight_sadistAI>(creature);
- }
-};
-
-/*#####
-# npc_mad_prisoner
-#####*/
-
-enum MadPrisoner
-{
- SPELL_HEAD_CRACK = 77568,
- SPELL_INFECTED_WOUND = 76512,
- SPELL_ENRAGE = 8599,
- EVENT_HEAD_CRACK = 13,
- EVENT_INFECTED_WOUND = 14,
- EVENT_ENRAGE = 15
-};
-
-class npc_mad_prisoner : public CreatureScript
-{
- public: npc_mad_prisoner() : CreatureScript("npc_mad_prisoner") { }
-
- struct npc_mad_prisonerAI : public ScriptedAI
- {
- npc_mad_prisonerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
-
- void Reset() override { }
-
- void JustEngagedWith(Unit* /*who*/) override
- {
- _events.Reset();
- _events.ScheduleEvent(EVENT_HEAD_CRACK, 9s);
- _events.ScheduleEvent(EVENT_INFECTED_WOUND, 13s);
- _events.ScheduleEvent(EVENT_ENRAGE, 17s);
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- _events.Update(diff);
-
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_HEAD_CRACK:
- DoCast(me, SPELL_HEAD_CRACK);
- _events.ScheduleEvent(EVENT_HEAD_CRACK, 16s, 20s);
- break;
- case EVENT_INFECTED_WOUND:
- DoCast(me, SPELL_INFECTED_WOUND);
- _events.ScheduleEvent(EVENT_INFECTED_WOUND, 12s, 15s);
- break;
- case EVENT_ENRAGE:
- DoCast(me, SPELL_ENRAGE);
- _events.ScheduleEvent(EVENT_ENRAGE, 12s, 15s);
- break;
- default:
- break;
- }
- }
- }
-
- private:
- EventMap _events;
- InstanceScript* _instance;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetBlackrockCavernsAI<npc_mad_prisonerAI>(creature);
- }
-};
-
-/*#####
-# npc_crazed_mage
-#####*/
-
-enum CrazedMage
-{
- EVENT_HEAD_CRACK2 = 16,
- EVENT_INFECTED_WOUND2 = 17,
- EVENT_ENRAGE2 = 18
-};
-
-class npc_crazed_mage : public CreatureScript
-{
- public: npc_crazed_mage() : CreatureScript("npc_crazed_mage") { }
-
- struct npc_crazed_mageAI : public ScriptedAI
- {
- npc_crazed_mageAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
-
- void Reset() override { }
-
- void JustEngagedWith(Unit* /*who*/) override
- {
- _events.Reset();
- _events.ScheduleEvent(EVENT_HEAD_CRACK2, 9s);
- _events.ScheduleEvent(EVENT_INFECTED_WOUND2, 13s);
- _events.ScheduleEvent(EVENT_ENRAGE2, 17s);
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- _events.Update(diff);
-
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_HEAD_CRACK2:
- DoCast(me, SPELL_HEAD_CRACK);
- _events.ScheduleEvent(EVENT_HEAD_CRACK2, 16s, 20s);
- break;
- case EVENT_INFECTED_WOUND2:
- DoCast(me, SPELL_INFECTED_WOUND);
- _events.ScheduleEvent(EVENT_INFECTED_WOUND2, 12s, 15s);
- break;
- case EVENT_ENRAGE2:
- DoCast(me, SPELL_ENRAGE);
- _events.ScheduleEvent(EVENT_ENRAGE2, 12s, 15s);
- break;
- default:
- break;
- }
- }
- }
-
- private:
- EventMap _events;
- InstanceScript* _instance;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetBlackrockCavernsAI<npc_crazed_mageAI>(creature);
- }
-};
-
-/*#####
-# npc_raz_the_crazed
-#####*/
-
-enum RazTheCrazed
-{
- SAY_SMASH = 0,
- SPELL_AGGRO_NEARBY_TARGETS = 80196,
- SPELL_SHADOW_PRISON = 79725,
- SPELL_LEAP_FROM_CAGE = 79720,
- SPELL_FURIOUS_SWIPE = 80206,
- SPELL_LEAP_FROM_BRIDGE = 80273,
- TYPE_RAZ = 1,
- DATA_ROMOGG_DEAD = 1,
- EVENT_AGGO_NEARBY_TARGETS = 19,
- EVENT_START_FIRST_PATH = 20,
- EVENT_FURIOUS_SWIPE = 21
-};
-
-class npc_raz_the_crazed : public CreatureScript
-{
- public: npc_raz_the_crazed() : CreatureScript("npc_raz_the_crazed") { }
-
- struct npc_raz_the_crazedAI : public ScriptedAI
- {
- npc_raz_the_crazedAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
-
- void Reset() override { }
-
- void JustEngagedWith(Unit* /*who*/) override
- {
- _events.Reset();
- _events.ScheduleEvent(SPELL_FURIOUS_SWIPE, 500ms);
- }
-
- void IsSummonedBy(WorldObject* summoner) override
- {
- if (summoner->GetEntry() == NPC_ROMOGG_BONECRUSHER)
- {
- me->SetDisableGravity(true);
- DoCast(me, SPELL_SHADOW_PRISON);
- _events.ScheduleEvent(EVENT_AGGO_NEARBY_TARGETS, 1s);
- }
- }
-
- void SetData(uint32 id, uint32 data) override
- {
- if (id == TYPE_RAZ && data == DATA_ROMOGG_DEAD)
- {
- me->RemoveAura(SPELL_SHADOW_PRISON);
- me->SetDisableGravity(false);
- DoCast(me, SPELL_LEAP_FROM_CAGE);
- _events.ScheduleEvent(EVENT_START_FIRST_PATH, 3s);
- }
- }
-
- void UpdateAI(uint32 diff) override
- {
- _events.Update(diff);
-
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_AGGO_NEARBY_TARGETS:
- DoCast(me, SPELL_AGGRO_NEARBY_TARGETS);
- _events.ScheduleEvent(EVENT_AGGO_NEARBY_TARGETS, 1500ms);
- break;
- case EVENT_START_FIRST_PATH:
- Talk(SAY_SMASH);
- break;
- case EVENT_FURIOUS_SWIPE:
- DoCastVictim(SPELL_FURIOUS_SWIPE, true);
- _events.ScheduleEvent(SPELL_FURIOUS_SWIPE, 500ms);
- break;
- default:
- break;
- }
- }
- }
-
- private:
- EventMap _events;
- InstanceScript* _instance;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetBlackrockCavernsAI<npc_raz_the_crazedAI>(creature);
- }
-};
-
-/*#####
-# npc_chains_of_woe
-#####*/
-
-enum ChainsOfWoe
-{
- SPELL_CHAINS_OF_WOE_1 = 75437,
- SPELL_CHAINS_OF_WOE_2 = 75441,
- SPELL_CHAINS_OF_WOE_3 = 75464,
- SPELL_CHAINS_OF_WOE_4 = 82189,
- SPELL_CHAINS_OF_WOE_5 = 82192,
- MODEL_INVISIBLE = 38330
-};
-
-class npc_chains_of_woe : public CreatureScript
-{
- public: npc_chains_of_woe() : CreatureScript("npc_chains_of_woe") { }
-
- struct npc_chains_of_woeAI : public ScriptedAI
- {
- npc_chains_of_woeAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
-
- void IsSummonedBy(WorldObject* /*summoner*/) override
- {
- me->SetDisplayId(MODEL_INVISIBLE);
- DoCast(me, SPELL_CHAINS_OF_WOE_1, true);
- DoCast(me, SPELL_CHAINS_OF_WOE_2, true);
- }
-
- private:
- InstanceScript* _instance;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetBlackrockCavernsAI<npc_chains_of_woeAI>(creature);
- }
-};
-
-/*#####
-# spell_chains_of_woe_1
-#####*/
-
-class spell_chains_of_woe_1 : public SpellScriptLoader
-{
- public: spell_chains_of_woe_1() : SpellScriptLoader("spell_chains_of_woe_1") { }
-
- class spell_chains_of_woe_1_SpellScript : public SpellScript
- {
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_CHAINS_OF_WOE_1 });
- }
-
- void HandleScriptEffect(SpellEffIndex /*effIndex*/)
- {
- if (GetHitUnit()->GetTypeId() == TYPEID_PLAYER)
- GetHitUnit()->CastSpell(GetCaster(), SPELL_CHAINS_OF_WOE_3, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_chains_of_woe_1_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_chains_of_woe_1_SpellScript();
- }
-};
-
-/*#####
-# spell_chains_of_woe_4
-#####*/
-
-class spell_chains_of_woe_4 : public SpellScriptLoader
-{
- public: spell_chains_of_woe_4() : SpellScriptLoader("spell_chains_of_woe_4") { }
-
- class spell_chains_of_woe_4_SpellScript : public SpellScript
- {
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_CHAINS_OF_WOE_4 });
- }
-
- void HandleScriptEffect(SpellEffIndex /*effIndex*/)
- {
- if (GetHitUnit()->GetTypeId() == TYPEID_PLAYER)
- GetHitUnit()->CastSpell(GetHitUnit(), SPELL_CHAINS_OF_WOE_5, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_chains_of_woe_4_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_chains_of_woe_4_SpellScript();
- }
-};
-
-/*#####
-# spell_nether_dragon_essence_1
-#####*/
-
-enum NetherDragonEssence
-{
- SPELL_NETHER_DRAGON_ESSENCE_1 = 75649,
- SPELL_NETHER_DRAGON_ESSENCE_2 = 75650,
- SPELL_NETHER_DRAGON_ESSENCE_3 = 75653,
- SPELL_NETHER_DRAGON_ESSENCE_4 = 75654
-};
-
-class spell_nether_dragon_essence_1 : public SpellScriptLoader
-{
- public: spell_nether_dragon_essence_1() : SpellScriptLoader("spell_nether_dragon_essence_1") { }
-
- class spell_nether_dragon_essence_1_AuraScript : public AuraScript
- {
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(
- {
- SPELL_NETHER_DRAGON_ESSENCE_2,
- SPELL_NETHER_DRAGON_ESSENCE_3,
- SPELL_NETHER_DRAGON_ESSENCE_4
- });
- }
-
- void HandleTriggerSpell(AuraEffect const* /*aurEff*/)
- {
- if (Unit* caster = GetCaster())
- caster->CastSpell(caster, RAND(SPELL_NETHER_DRAGON_ESSENCE_2, SPELL_NETHER_DRAGON_ESSENCE_3, SPELL_NETHER_DRAGON_ESSENCE_4));
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_nether_dragon_essence_1_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
- }
- };
-
- AuraScript* GetAuraScript() const override
- {
- return new spell_nether_dragon_essence_1_AuraScript();
- }
-};
-
-/*#####
-# spell_nether_dragon_essence_2
-#####*/
-
-class spell_nether_dragon_essence_2 : public SpellScriptLoader
-{
- public:
- spell_nether_dragon_essence_2() : SpellScriptLoader("spell_nether_dragon_essence_2") { }
-
- class spell_nether_dragon_essence_2_SpellScript : public SpellScript
- {
- void ModDestHeight(SpellDestination& dest)
- {
- Position offset = { frand(-35.0f, 35.0f), frand(-25.0f, 25.0f), 0.0f, 0.0f };
-
- switch (GetSpellInfo()->Id)
- {
- case SPELL_NETHER_DRAGON_ESSENCE_2:
- offset.m_positionZ = 25.0f;
- break;
- case SPELL_NETHER_DRAGON_ESSENCE_3:
- offset.m_positionZ = 17.0f;
- break;
- case SPELL_NETHER_DRAGON_ESSENCE_4:
- offset.m_positionZ = 33.0f;
- break;
- }
-
- dest.RelocateOffset(offset);
- }
-
- void Register() override
- {
- OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_nether_dragon_essence_2_SpellScript::ModDestHeight, EFFECT_0, TARGET_DEST_CASTER_RANDOM);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_nether_dragon_essence_2_SpellScript();
- }
-};
-
-void AddSC_blackrock_caverns()
-{
- // Creature Scripts
- new npc_fire_cyclone();
- new npc_twilight_flame_caller();
- new npc_twilight_torturer();
- new npc_twilight_sadist();
- new npc_mad_prisoner();
- new npc_crazed_mage();
- new npc_raz_the_crazed();
- new npc_chains_of_woe();
- // Spell Scripts
- new spell_chains_of_woe_1();
- new spell_chains_of_woe_4();
- new spell_nether_dragon_essence_1();
- new spell_nether_dragon_essence_2();
-}
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h
deleted file mode 100644
index 2778ab7c609..00000000000
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef BLACKROCKCAVERNS_H_
-#define BLACKROCKCAVERNS_H_
-
-#include "CreatureAIImpl.h"
-
-#define BCScriptName "instance_blackrock_caverns"
-#define DataHeader "BRC"
-
-uint32 const EncounterCount = 5;
-
-enum BRCDataTypes
-{
- // Encounter States // Boss GUIDs
- DATA_ROMOGG_BONECRUSHER = 0,
- DATA_CORLA = 1,
- DATA_KARSH_STEELBENDER = 2,
- DATA_BEAUTY = 3,
- DATA_ASCENDANT_LORD_OBSIDIUS = 4,
-
- // Additional Objects
- DATA_RAZ_THE_CRAZED = 5
-};
-
-enum BRCCreatureIds
-{
- NPC_TWILIGHT_FLAME_CALLER = 39708,
- NPC_RAZ_THE_CRAZED = 39670,
- NPC_ROMOGG_BONECRUSHER = 39665
-};
-
-template<typename AI>
-inline AI* GetBlackrockCavernsAI(Creature* creature)
-{
- return GetInstanceAI<AI>(creature, BCScriptName);
-}
-
-#endif // BLACKROCKCAVERNS_H_
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_ascendant_lord_obsidius.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_ascendant_lord_obsidius.cpp
deleted file mode 100644
index 38a4eb6f515..00000000000
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_ascendant_lord_obsidius.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "blackrock_caverns.h"
-
-enum Text
-{
- YELL_AGGRO = 0,
- YELL_KILL = 1,
- YELL_SWITCHING_SHADOWS = 2,
- YELL_DEATH = 3,
- EMOTE_SWITCHING_SHADOWS = 4
-};
-
-enum Spells
-{
- SPELL_MANA_TAP = 36021,
- SPELL_ARCANE_TORRENT = 36022,
- SPELL_DOMINATION = 35280,
-};
-
-enum Events
-{
- EVENT_MANA_TAP = 1,
- EVENT_ARCANE_TORRENT = 2,
- EVENT_DOMINATION = 3
-};
-
-class boss_ascendant_lord_obsidius : public CreatureScript
-{
- public:
- boss_ascendant_lord_obsidius(): CreatureScript("boss_ascendant_lord_obsidius") { }
-
- struct boss_ascendant_lord_obsidiusAI : public BossAI
- {
- boss_ascendant_lord_obsidiusAI(Creature* creature) : BossAI(creature, DATA_ASCENDANT_LORD_OBSIDIUS) { }
-
- void Reset() override
- {
- _Reset();
- }
-
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- events.ScheduleEvent(EVENT_MANA_TAP, 30s);
- Talk(YELL_AGGRO);
- }
-
- void KilledUnit(Unit* who) override
- {
- if (who->GetTypeId() == TYPEID_PLAYER)
- Talk(YELL_KILL);
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- Talk(YELL_DEATH);
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_MANA_TAP:
- DoCastVictim(SPELL_MANA_TAP, true);
- events.ScheduleEvent(EVENT_MANA_TAP, 14s, 22s);
- break;
- }
- }
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetBlackrockCavernsAI<boss_ascendant_lord_obsidiusAI>(creature);
- }
-};
-
-void AddSC_boss_ascendant_lord_obsidius()
-{
- new boss_ascendant_lord_obsidius();
-}
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_beauty.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_beauty.cpp
deleted file mode 100644
index 40364df63f2..00000000000
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_beauty.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "blackrock_caverns.h"
-
-enum Sounds
-{
- SOUND_AGGRO = 18559,
- SOUND_DEATH = 18563
-};
-
-enum Spells
-{
- SPELL_TERRIFYING_ROAR = 76028, // Not yet Implemented
- SPELL_BERSERKER_CHARGE = 76030,
- SPELL_MAGMA_SPIT = 76031,
- SPELL_FLAMEBREAK = 76032,
- SPELL_BERSERK = 82395 // Not yet Implemented
-};
-
-enum Events
-{
- EVENT_TERRIFYING_ROAR = 1,
- EVENT_BERSERKER_CHARGE = 2,
- EVENT_MAGMA_SPIT = 3,
- EVENT_FLAMEBREAK = 4,
- EVENT_BERSERK = 5
-};
-
-class boss_beauty : public CreatureScript
-{
- public:
- boss_beauty(): CreatureScript("boss_beauty") { }
-
- struct boss_beautyAI : public BossAI
- {
- boss_beautyAI(Creature* creature) : BossAI(creature, DATA_BEAUTY) { }
-
- void Reset() override
- {
- _Reset();
- }
-
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- events.ScheduleEvent(SPELL_MAGMA_SPIT, 7s, 10s);
- events.ScheduleEvent(EVENT_BERSERKER_CHARGE, 16s, 19s);
- events.ScheduleEvent(EVENT_FLAMEBREAK, 18s, 22s);
- DoPlaySoundToSet(me, SOUND_AGGRO);
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- DoPlaySoundToSet(me, SOUND_DEATH);
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case SPELL_MAGMA_SPIT:
- DoCast(SelectTarget(SelectTargetMethod::Random, 0, 100, true), SPELL_MAGMA_SPIT, true);
- events.ScheduleEvent(SPELL_MAGMA_SPIT, 7s, 10s);
- break;
- case EVENT_BERSERKER_CHARGE:
- DoCast(SelectTarget(SelectTargetMethod::Random, 0, 100, true), SPELL_BERSERKER_CHARGE, true);
- events.ScheduleEvent(EVENT_BERSERKER_CHARGE, 16s, 19s);
- break;
- case EVENT_FLAMEBREAK:
- DoCast(me, SPELL_FLAMEBREAK);
- events.ScheduleEvent(EVENT_FLAMEBREAK, 18s, 22s);
- break;
- default:
- break;
- }
- }
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetBlackrockCavernsAI<boss_beautyAI>(creature);
- }
-};
-
-void AddSC_boss_beauty()
-{
- new boss_beauty();
-}
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_corla.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_corla.cpp
deleted file mode 100644
index 88ce3101be9..00000000000
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_corla.cpp
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "blackrock_caverns.h"
-
-enum Text
-{
- YELL_AGGRO = 0,
- YELL_KILL = 1,
- YELL_EVOLVED_ZEALOT = 2,
- YELL_DEATH = 3,
- EMOTE_EVOLVED_ZEALOT = 4
-};
-
-enum Spells
-{
- SPELL_EVOLUTION = 75610,
- SPELL_DRAIN_ESSENSE = 75645,
- SPELL_SHADOW_POWER = 35322,
- H_SPELL_SHADOW_POWER = 39193
-};
-
-enum Events
-{
- // Out of combat events
- EVENT_DRAIN_ESSENSE = 1,
- EVENT_STOP_DRAIN_ESSENSE = 2,
- EVENT_EVOLUTION = 3
- // Combat events
-};
-
-class boss_corla : public CreatureScript
-{
- public:
- boss_corla(): CreatureScript("boss_corla") { }
-
- struct boss_corlaAI : public BossAI
- {
- boss_corlaAI(Creature* creature) : BossAI(creature, DATA_CORLA) { }
-
- void Reset() override
- {
- _Reset();
- combatPhase = false;
- events.ScheduleEvent(EVENT_DRAIN_ESSENSE, 2s);
- }
-
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- Talk(YELL_AGGRO);
- events.Reset();
- combatPhase = true;
- }
-
- void KilledUnit(Unit* who) override
- {
- if (who->GetTypeId() == TYPEID_PLAYER)
- Talk(YELL_KILL);
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- Talk(YELL_DEATH);
- }
-
- void UpdateAI(uint32 diff) override
- {
- events.Update(diff);
-
- if (!combatPhase)
- {
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_DRAIN_ESSENSE:
- DoCast(me, SPELL_DRAIN_ESSENSE);
- events.ScheduleEvent(EVENT_STOP_DRAIN_ESSENSE, 15s);
- break;
- case EVENT_STOP_DRAIN_ESSENSE:
- me->InterruptSpell(CURRENT_CHANNELED_SPELL);
- events.ScheduleEvent(EVENT_EVOLUTION, 2s);
- break;
- case EVENT_EVOLUTION:
- DoCast(me, SPELL_EVOLUTION);
- events.ScheduleEvent(EVENT_DRAIN_ESSENSE, 2s);
- break;
- default:
- break;
- }
- }
- return;
- }
- }
-
- private:
- bool combatPhase = false;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetBlackrockCavernsAI<boss_corlaAI>(creature);
- }
-};
-
-void AddSC_boss_corla()
-{
- new boss_corla();
-}
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_karsh_steelbender.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_karsh_steelbender.cpp
deleted file mode 100644
index 22a7caef73f..00000000000
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_karsh_steelbender.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "blackrock_caverns.h"
-
-enum Text
-{
- YELL_AGGRO = 0,
- YELL_KILL = 1,
- YELL_QUICKSILVER_ARMOR = 2,
- YELL_DEATH = 3,
- EMOTE_QUICKSILVER_ARMOR = 4
-};
-
-enum Spells
-{
- SPELL_CLEAVE = 15284,
- SPELL_QUICKSILVER_ARMOR = 75842,
- SPELL_SUPERHEATED_QUICKSILVER_ARMOR = 75846
-};
-
-enum Events
-{
- EVENT_CLEAVE = 1,
- EVENT_QUICKSILVER_ARMOR = 2,
- EVENT_SUPERHEATED_QUICKSILVER_ARMOR = 3
-};
-
-class boss_karsh_steelbender : public CreatureScript
-{
- public:
- boss_karsh_steelbender() : CreatureScript("boss_karsh_steelbender") { }
-
- struct boss_karsh_steelbenderAI : public BossAI
- {
- boss_karsh_steelbenderAI(Creature* creature) : BossAI(creature, DATA_KARSH_STEELBENDER) { }
-
- void Reset() override
- {
- _Reset();
- }
-
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- Talk(YELL_AGGRO);
- events.ScheduleEvent(EVENT_CLEAVE, 10s);
- }
-
- void KilledUnit(Unit* who) override
- {
- if (who->GetTypeId() == TYPEID_PLAYER)
- Talk(YELL_KILL);
- }
-
- void JustDied(Unit* /*victim*/) override
- {
- _JustDied();
- Talk(YELL_DEATH);
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_CLEAVE:
- DoCastVictim(SPELL_CLEAVE);
- events.ScheduleEvent(EVENT_CLEAVE, 10s);
- break;
- default:
- break;
- }
- }
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetBlackrockCavernsAI<boss_karsh_steelbenderAI>(creature);
- }
-};
-
-void AddSC_boss_karsh_steelbender()
-{
- new boss_karsh_steelbender();
-}
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_romogg_bonecrusher.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_romogg_bonecrusher.cpp
deleted file mode 100644
index 2915f04a156..00000000000
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_romogg_bonecrusher.cpp
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ScriptMgr.h"
-#include "blackrock_caverns.h"
-#include "InstanceScript.h"
-#include "ScriptedCreature.h"
-
-enum Romogg
-{
- YELL_AGGRO = 0,
- YELL_KILL = 1,
- YELL_SKULLCRACKER = 2,
- YELL_DEATH = 3,
- EMOTE_CALL_FOR_HELP = 4,
- EMOTE_SKULLCRACKER = 5,
- SPELL_CALL_FOR_HELP = 82137, // Needs Scripting
- SPELL_CHAINS_OF_WOE = 75539,
- SPELL_QUAKE = 75272,
- SPELL_SKULLCRACKER = 75543,
- SPELL_WOUNDING_STRIKE = 75571,
- EVENT_CHAINS_OF_WOE = 1,
- EVENT_QUAKE = 2, // Not yet sure of timing
- EVENT_SKULLCRACKER = 3,
- EVENT_WOUNDING_STRIKE = 4,
- TYPE_RAZ = 1,
- DATA_ROMOGG_DEAD = 1
-};
-
-Position const SummonPos = { 249.2639f, 949.1614f, 191.7866f, 3.141593f };
-
-class boss_romogg_bonecrusher : public CreatureScript
-{
- public:
- boss_romogg_bonecrusher() : CreatureScript("boss_romogg_bonecrusher") { }
-
- struct boss_romogg_bonecrusherAI : public BossAI
- {
- boss_romogg_bonecrusherAI(Creature* creature) : BossAI(creature, DATA_ROMOGG_BONECRUSHER)
- {
- me->SummonCreature(NPC_RAZ_THE_CRAZED, SummonPos, TEMPSUMMON_MANUAL_DESPAWN, 200s);
- }
-
- void Reset() override
- {
- _Reset();
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- Talk(YELL_DEATH);
-
- if (Creature* raz = instance->GetCreature(DATA_RAZ_THE_CRAZED))
- raz->AI()->SetData(TYPE_RAZ, DATA_ROMOGG_DEAD);
- }
-
- void KilledUnit(Unit* who) override
- {
- if (who->GetTypeId() == TYPEID_PLAYER)
- Talk(YELL_KILL);
- }
-
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- events.ScheduleEvent(EVENT_CHAINS_OF_WOE, 22s, 32s);
- events.ScheduleEvent(EVENT_WOUNDING_STRIKE, 26s, 32s);
- events.ScheduleEvent(EVENT_QUAKE, 45s);
- Talk(YELL_AGGRO);
- Talk(EMOTE_CALL_FOR_HELP);
- DoCast(me, SPELL_CALL_FOR_HELP);
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_CHAINS_OF_WOE:
- Talk(YELL_SKULLCRACKER);
- DoCast(me, SPELL_CHAINS_OF_WOE);
- events.ScheduleEvent(EVENT_CHAINS_OF_WOE, 22s, 32s);
- events.ScheduleEvent(EVENT_SKULLCRACKER, 3s);
- break;
- case EVENT_SKULLCRACKER:
- Talk(EMOTE_SKULLCRACKER);
- DoCast(me, SPELL_SKULLCRACKER);
- break;
- case EVENT_QUAKE:
- DoCast(me, SPELL_QUAKE);
- events.ScheduleEvent(EVENT_QUAKE, 32s, 40s);
- break;
- case EVENT_WOUNDING_STRIKE:
- DoCastVictim(SPELL_WOUNDING_STRIKE, true);
- events.ScheduleEvent(EVENT_WOUNDING_STRIKE, 26s, 32s);
- break;
- default:
- break;
- }
- }
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetBlackrockCavernsAI<boss_romogg_bonecrusherAI>(creature);
- }
-};
-
-void AddSC_boss_romogg_bonecrusher()
-{
- new boss_romogg_bonecrusher();
-}
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/instance_blackrock_caverns.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/instance_blackrock_caverns.cpp
deleted file mode 100644
index 86d89b216d6..00000000000
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/instance_blackrock_caverns.cpp
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ScriptMgr.h"
-#include "blackrock_caverns.h"
-#include "InstanceScript.h"
-
-ObjectData const creatureData[] =
-{
- { NPC_RAZ_THE_CRAZED, DATA_RAZ_THE_CRAZED },
- { 0, 0 }
-};
-
-DungeonEncounterData const encounters[] =
-{
- { DATA_ROMOGG_BONECRUSHER, {{ 1040 }} },
- { DATA_CORLA, {{ 1038 }} },
- { DATA_KARSH_STEELBENDER, {{ 1039 }} },
- { DATA_BEAUTY, {{ 1037 }} },
- { DATA_ASCENDANT_LORD_OBSIDIUS, {{ 1036 }} }
-};
-
-class instance_blackrock_caverns : public InstanceMapScript
-{
- public:
- instance_blackrock_caverns(): InstanceMapScript(BCScriptName, 645) { }
-
- struct instance_blackrock_caverns_InstanceMapScript : public InstanceScript
- {
- instance_blackrock_caverns_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
- {
- SetHeaders(DataHeader);
- SetBossNumber(EncounterCount);
- LoadObjectData(creatureData, nullptr);
- LoadDungeonEncounterData(encounters);
- }
-
- bool SetBossState(uint32 type, EncounterState state) override
- {
- if (!InstanceScript::SetBossState(type, state))
- return false;
-
- switch (type)
- {
- case DATA_ROMOGG_BONECRUSHER:
- case DATA_CORLA:
- case DATA_KARSH_STEELBENDER:
- case DATA_BEAUTY:
- case DATA_ASCENDANT_LORD_OBSIDIUS:
- break;
- default:
- break;
- }
-
- return true;
- }
- };
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const override
- {
- return new instance_blackrock_caverns_InstanceMapScript(map);
- }
-};
-
-void AddSC_instance_blackrock_caverns()
-{
- new instance_blackrock_caverns();
-}
diff --git a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp
index 128880dd0f8..cfa0ac4a239 100644
--- a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp
+++ b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp
@@ -22,17 +22,6 @@ void AddSC_boss_drekthar();
void AddSC_boss_galvangar();
void AddSC_boss_vanndar();
void AddSC_arathi_basin(); //Arathi Basin
-void AddSC_boss_alizabal(); //Baradin Hold
-void AddSC_boss_occuthar();
-void AddSC_boss_pit_lord_argaloth();
-void AddSC_instance_baradin_hold();
-void AddSC_boss_romogg_bonecrusher(); //Blackrock Caverns
-void AddSC_boss_corla();
-void AddSC_boss_karsh_steelbender();
-void AddSC_boss_beauty();
-void AddSC_boss_ascendant_lord_obsidius();
-void AddSC_blackrock_caverns();
-void AddSC_instance_blackrock_caverns();
void AddSC_blackrock_depths(); //Blackrock Depths
void AddSC_boss_ambassador_flamelash();
void AddSC_boss_draganthaurissan();
@@ -215,17 +204,6 @@ void AddEasternKingdomsScripts()
AddSC_boss_galvangar();
AddSC_boss_vanndar();
AddSC_arathi_basin(); //Arathi Basin
- AddSC_boss_alizabal(); //Baradin Hold
- AddSC_boss_occuthar();
- AddSC_boss_pit_lord_argaloth();
- AddSC_instance_baradin_hold();
- AddSC_boss_romogg_bonecrusher(); //Blackrock Caverns
- AddSC_boss_corla();
- AddSC_boss_karsh_steelbender();
- AddSC_boss_beauty();
- AddSC_boss_ascendant_lord_obsidius();
- AddSC_blackrock_caverns();
- AddSC_instance_blackrock_caverns();
AddSC_blackrock_depths(); //Blackrock Depths
AddSC_boss_ambassador_flamelash();
AddSC_boss_draganthaurissan();
@@ -395,7 +373,6 @@ void AddEasternKingdomsScripts()
AddSC_stormwind_city();
//AddSC_swamp_of_sorrows();
AddSC_tirisfal_glades();
- AddSC_tol_barad();
AddSC_undercity();
//AddSC_western_plaguelands();
}
diff --git a/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp b/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp
deleted file mode 100644
index c6e52086289..00000000000
--- a/src/server/scripts/EasternKingdoms/zone_tol_barad.cpp
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ScriptMgr.h"
-#include "Battlefield.h"
-#include "Containers.h"
-#include "Battlefield/BattlefieldTB.h"
-#include "DB2Stores.h"
-#include "ObjectMgr.h"
-#include "Player.h"
-#include "ScriptedCreature.h"
-#include "ScriptedGossip.h"
-#include "ScriptSystem.h"
-#include "SpellScript.h"
-
-enum TBSpiritGuide
-{
- GOSSIP_OPTION_ID_SLAGWORKS = 0,
- GOSSIP_OPTION_ID_IRONCLAD_GARRISON = 1,
- GOSSIP_OPTION_ID_WARDENS_VIGIL = 2,
- GOSSIP_OPTION_ID_EAST_SPIRE = 3,
- GOSSIP_OPTION_ID_WEST_SPIRE = 4,
- GOSSIP_OPTION_ID_SOUTH_SPIRE = 5,
-};
-
-struct npc_tb_spirit_guide : public ScriptedAI
-{
- npc_tb_spirit_guide(Creature* creature) : ScriptedAI(creature) { }
-
- bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
- {
- player->PlayerTalkClass->SendCloseGossip();
-
- uint32 areaId = 0;
- switch (gossipListId)
- {
- case GOSSIP_OPTION_ID_SLAGWORKS:
- areaId = TB_GY_SLAGWORKS;
- break;
- case GOSSIP_OPTION_ID_IRONCLAD_GARRISON:
- areaId = TB_GY_IRONCLAD_GARRISON;
- break;
- case GOSSIP_OPTION_ID_WARDENS_VIGIL:
- areaId = TB_GY_WARDENS_VIGIL;
- break;
- case GOSSIP_OPTION_ID_EAST_SPIRE:
- areaId = TB_GY_EAST_SPIRE;
- break;
- case GOSSIP_OPTION_ID_WEST_SPIRE:
- areaId = TB_GY_WEST_SPIRE;
- break;
- case GOSSIP_OPTION_ID_SOUTH_SPIRE:
- areaId = TB_GY_SOUTH_SPIRE;
- break;
- default:
- return true;
- }
-
- if (WorldSafeLocsEntry const* safeLoc = sObjectMgr->GetWorldSafeLoc(areaId))
- player->TeleportTo(safeLoc->Loc);
-
- return false;
- }
-};
-
-// 85123 - Siege Cannon - selects random target
-class spell_siege_cannon : public SpellScriptLoader
-{
-public:
- spell_siege_cannon() : SpellScriptLoader("spell_siege_cannon") { }
-
- class spell_siege_cannon_SpellScript : public SpellScript
- {
- void SelectRandomTarget(std::list<WorldObject*>& targets)
- {
- if (targets.empty())
- return;
-
- WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
- targets.clear();
- targets.push_back(target);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_siege_cannon_SpellScript::SelectRandomTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_siege_cannon_SpellScript();
- }
-};
-
-void AddSC_tol_barad()
-{
- RegisterCreatureAI(npc_tb_spirit_guide);
- new spell_siege_cannon();
-}
diff --git a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp
deleted file mode 100644
index 1603e3e7e49..00000000000
--- a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp
+++ /dev/null
@@ -1,691 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ScriptMgr.h"
-#include "CellImpl.h"
-#include "Containers.h"
-#include "DB2Stores.h"
-#include "firelands.h"
-#include "GridNotifiersImpl.h"
-#include "MotionMaster.h"
-#include "MoveSplineInit.h"
-#include "ObjectAccessor.h"
-#include "PassiveAI.h"
-#include "ScriptedCreature.h"
-#include "SpellInfo.h"
-#include "SpellScript.h"
-#include "TemporarySummon.h"
-
-enum Texts
-{
- // Egg Pile
- EMOTE_CRACKING_EGGS = 0, // The Molten Eggs begin to crack and splinter!
-};
-
-enum Spells
-{
- // Harbinger of Flame
- SPELL_FIRE_IT_UP = 100093,
- SPELL_FIEROBLAST_TRASH = 100094,
- SPELL_FIEROCLAST_BARRAGE = 100095,
- SPELL_FIRE_CHANNELING = 100109,
-
- // Blazing Monstrosity
- SPELL_RIDE_MONSTROSITY = 93970,
- SPELL_SHARE_HEALTH_LEFT = 101502,
- SPELL_SHARE_HEALTH_RIGHT = 101503,
- SPELL_SLEEP_ULTRA_HIGH_PRIORITY = 99480,
- SPELL_GENERIC_DUMMY_CAST = 100088,
- SPELL_LEFT_SIDE_SMACK_L = 100076,
- SPELL_RIGHT_SIDE_SMACK_L = 100078,
- SPELL_HEAD_BONK_L = 100080,
- SPELL_TICKLE_L = 100082,
- SPELL_KNOCKBACK_RIGHT = 100084,
- SPELL_KNOCKBACK_LEFT = 100085,
- SPELL_KNOCKBACK_FORWARD = 100086,
- SPELL_KNOCKBACK_BACK = 100087,
- SPELL_HEAD_BONK_R = 100089,
- SPELL_LEFT_SIDE_SMACK_R = 100090,
- SPELL_RIGHT_SIDE_SMACK_R = 100091,
- SPELL_TICKLE_R = 100092,
- SPELL_MOLTEN_BARRAGE_EFFECT_L = 100071,
- SPELL_MOLTEN_BARRAGE_LEFT = 100072,
- SPELL_MOLTEN_BARRAGE_RIGHT = 100073,
- SPELL_MOLTEN_BARRAGE_EFFECT_R = 100074,
- SPELL_MOLTEN_BARRAGE_VISUAL = 100075,
- SPELL_AGGRO_CLOSEST = 100462,
- SPELL_INVISIBILITY_AND_STEALTH_DETECTION = 18950,
-
- // Egg Pile
- SPELL_SUMMON_SMOULDERING_HATCHLING = 100096,
- SPELL_MOLTEN_EGG_TRASH_CALL_L = 100097,
- SPELL_MOLTEN_EGG_TRASH_CALL_R = 100098,
- SPELL_ALYSRAZOR_COSMETIC_EGG_XPLOSION = 100099,
-};
-
-#define SPELL_SHARE_HEALTH (me->GetEntry() == NPC_BLAZING_MONSTROSITY_LEFT ? SPELL_SHARE_HEALTH_LEFT : SPELL_SHARE_HEALTH_RIGHT)
-#define SPELL_MOLTEN_BARRAGE (me->GetEntry() == NPC_BLAZING_MONSTROSITY_LEFT ? SPELL_MOLTEN_BARRAGE_LEFT : SPELL_MOLTEN_BARRAGE_RIGHT)
-#define SPELL_MOLTEN_BARRAGE_EFFECT (me->GetEntry() == NPC_BLAZING_MONSTROSITY_LEFT ? SPELL_MOLTEN_BARRAGE_EFFECT_L : SPELL_MOLTEN_BARRAGE_EFFECT_R)
-
-enum Events
-{
- // Blazing Monstrosity
- EVENT_START_SPITTING = 1,
- EVENT_CONTINUE_SPITTING = 2,
-
- // Harbinger of Flame
- EVENT_FIEROBLAST = 1,
- EVENT_FIEROCLAST_BARRAGE = 2,
-
- // Egg Pile
- EVENT_SUMMON_SMOULDERING_HATCHLING = 1,
-};
-
-enum MiscData
-{
- MODEL_INVISIBLE_STALKER = 11686,
- ANIM_KIT_BIRD_WAKE = 1469,
- ANIM_KIT_BIRD_TURN = 1473,
-};
-
-class RespawnEggEvent : public BasicEvent
-{
- public:
- explicit RespawnEggEvent(Creature* egg) : _egg(egg) { }
-
- bool Execute(uint64 /*time*/, uint32 /*diff*/) override
- {
- _egg->RestoreDisplayId();
- return true;
- }
-
- private:
- Creature* _egg;
-};
-
-class MoltenEggCheck
-{
- public:
- explicit MoltenEggCheck(Creature* pile) : _eggPile(pile) { }
-
- bool operator()(Unit* object) const
- {
- if (object->GetEntry() != NPC_MOLTEN_EGG_TRASH)
- return false;
-
- if (object->GetDisplayId() != object->GetNativeDisplayId())
- return false;
-
- if (_eggPile->GetDistance2d(object) > 20.0f)
- return false;
-
- return true;
- }
-
- private:
- Creature* _eggPile;
-};
-
-class TrashRespawnWorker
-{
- public:
- void operator()(Creature* creature) const
- {
- switch (creature->GetEntry())
- {
- case NPC_BLAZING_MONSTROSITY_LEFT:
- case NPC_BLAZING_MONSTROSITY_RIGHT:
- case NPC_EGG_PILE:
- case NPC_HARBINGER_OF_FLAME:
- case NPC_MOLTEN_EGG_TRASH:
- if (!creature->IsAlive())
- creature->Respawn(true);
- break;
- case NPC_SMOULDERING_HATCHLING:
- creature->DespawnOrUnsummon();
- break;
- }
- }
-};
-
-static void AlysrazorTrashEvaded(Creature* creature)
-{
- TrashRespawnWorker check;
- Trinity::CreatureWorker<TrashRespawnWorker> worker(creature, check);
- Cell::VisitGridObjects(creature, worker, SIZE_OF_GRIDS);
-}
-
-class npc_harbinger_of_flame : public CreatureScript
-{
- public:
- npc_harbinger_of_flame() : CreatureScript("npc_harbinger_of_flame") { }
-
- struct npc_harbinger_of_flameAI : public ScriptedAI
- {
- npc_harbinger_of_flameAI(Creature* creature) : ScriptedAI(creature)
- {
- }
-
- void JustEngagedWith(Unit* /*target*/) override
- {
- for (ObjectGuid const& birdGuid : me->m_unitData->ChannelObjects)
- if (Creature* bird = ObjectAccessor::GetCreature(*me, birdGuid))
- DoZoneInCombat(bird);
-
- me->InterruptSpell(CURRENT_CHANNELED_SPELL);
- _events.Reset();
- _events.ScheduleEvent(EVENT_FIEROBLAST, 1ms);
- _events.ScheduleEvent(EVENT_FIEROCLAST_BARRAGE, 6s);
- }
-
- void JustReachedHome() override
- {
- AlysrazorTrashEvaded(me);
- }
-
- void MoveInLineOfSight(Unit* unit) override
- {
- if (me->IsInCombat())
- return;
-
- if (!unit->IsCharmedOwnedByPlayerOrPlayer())
- return;
-
- ScriptedAI::MoveInLineOfSight(unit);
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!me->IsInCombat())
- if (!me->GetCurrentSpell(CURRENT_CHANNELED_SPELL))
- if (Creature* fireBird = me->FindNearestCreature((me->GetHomePosition().GetPositionY() > -275.0f ? NPC_BLAZING_MONSTROSITY_LEFT : NPC_BLAZING_MONSTROSITY_RIGHT), 100.0f))
- DoCast(fireBird, SPELL_FIRE_CHANNELING);
-
- if (!UpdateVictim())
- return;
-
- _events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_FIEROBLAST:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, false, true, -SPELL_RIDE_MONSTROSITY))
- DoCast(target, SPELL_FIEROBLAST_TRASH);
- _events.RescheduleEvent(EVENT_FIEROBLAST, 500ms); // cast time is longer, but thanks to UNIT_STATE_CASTING check it won't trigger more often (need this because this creature gets a stacking haste aura)
- break;
- case EVENT_FIEROCLAST_BARRAGE:
- DoCastAOE(SPELL_FIEROCLAST_BARRAGE);
- _events.ScheduleEvent(EVENT_FIEROCLAST_BARRAGE, 9s, 12s);
- break;
- }
- }
- }
-
- private:
- EventMap _events;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetFirelandsAI<npc_harbinger_of_flameAI>(creature);
- }
-};
-
-class npc_blazing_monstrosity : public CreatureScript
-{
- public:
- npc_blazing_monstrosity() : CreatureScript("npc_blazing_monstrosity") { }
-
- struct npc_blazing_monstrosityAI : public PassiveAI
- {
- npc_blazing_monstrosityAI(Creature* creature) : PassiveAI(creature), _summons(creature)
- {
- }
-
- void EnterEvadeMode(EvadeReason why) override
- {
- _summons.DespawnAll();
- _events.Reset();
- PassiveAI::EnterEvadeMode(why);
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- _summons.DespawnAll();
- _events.Reset();
- }
-
- void JustReachedHome() override
- {
- AlysrazorTrashEvaded(me);
- }
-
- void JustEngagedWith(Unit* /*target*/) override
- {
- DoZoneInCombat();
- me->RemoveAurasDueToSpell(SPELL_SLEEP_ULTRA_HIGH_PRIORITY);
- me->PlayOneShotAnimKitId(ANIM_KIT_BIRD_WAKE);
- _events.Reset();
- _events.ScheduleEvent(EVENT_START_SPITTING, 6s);
- _events.ScheduleEvent(EVENT_CONTINUE_SPITTING, 9s);
- }
-
- void PassengerBoarded(Unit* passenger, int8 /*seat*/, bool apply) override
- {
- if (!apply)
- return;
-
- // Our passenger is another vehicle (boardable by players)
- DoCast(passenger, SPELL_SHARE_HEALTH, true);
- passenger->SetFaction(35);
- passenger->SetUninteractible(false);
-
- // Hack to relocate vehicle on vehicle so exiting players are not moved under map
- Movement::MoveSplineInit init(passenger);
- init.DisableTransportPathTransformations();
- init.MoveTo(0.6654003f, 0.0f, 1.9815f);
- init.SetFacing(0.0f);
- init.Launch();
- }
-
- void JustSummoned(Creature* summon) override
- {
- _summons.Summon(summon);
- }
-
- void SummonedCreatureDespawn(Creature* summon) override
- {
- _summons.Despawn(summon);
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- _events.Update(diff);
-
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_START_SPITTING:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, false, true, -SPELL_RIDE_MONSTROSITY))
- DoCast(target, SPELL_MOLTEN_BARRAGE);
- break;
- case EVENT_CONTINUE_SPITTING:
- DoCastAOE(SPELL_MOLTEN_BARRAGE_EFFECT);
- if (Creature* egg = me->FindNearestCreature(NPC_EGG_PILE, 100.0f))
- egg->AI()->DoAction(me->GetEntry());
- break;
- }
- }
- }
-
- private:
- SummonList _summons;
- EventMap _events;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetFirelandsAI<npc_blazing_monstrosityAI>(creature);
- }
-};
-
-class npc_molten_barrage : public CreatureScript
-{
- public:
- npc_molten_barrage() : CreatureScript("npc_molten_barrage") { }
-
- struct npc_molten_barrageAI : public NullCreatureAI
- {
- npc_molten_barrageAI(Creature* creature) : NullCreatureAI(creature)
- {
- }
-
- void AttackStart(Unit* target) override
- {
- if (target)
- me->GetMotionMaster()->MoveFollow(target, 0.0f, 0.0f, {}, MOTION_SLOT_DEFAULT);
- }
-
- void IsSummonedBy(WorldObject* /*summoner*/) override
- {
- DoCastAOE(SPELL_AGGRO_CLOSEST, true);
- DoCast(me, SPELL_MOLTEN_BARRAGE_VISUAL);
- DoCast(me, SPELL_INVISIBILITY_AND_STEALTH_DETECTION, true);
- }
-
- void MovementInform(uint32 movementType, uint32 /*pointId*/) override
- {
- if (movementType != EFFECT_MOTION_TYPE)
- return;
-
- DoCastAOE(SPELL_AGGRO_CLOSEST);
- me->ClearUnitState(UNIT_STATE_CANNOT_TURN);
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetFirelandsAI<npc_molten_barrageAI>(creature);
- }
-};
-
-class npc_egg_pile : public CreatureScript
-{
- public:
- npc_egg_pile() : CreatureScript("npc_egg_pile") { }
-
- struct npc_egg_pileAI : public CreatureAI
- {
- npc_egg_pileAI(Creature* creature) : CreatureAI(creature)
- {
- }
-
- void AttackStart(Unit* /*target*/) override { }
-
- void Reset() override
- {
- me->SetReactState(REACT_PASSIVE);
- _events.Reset();
- _callHatchlingSpell = 0;
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- _events.Reset();
- std::list<Creature*> eggs;
- GetCreatureListWithEntryInGrid(eggs, me, NPC_MOLTEN_EGG_TRASH, 20.0f);
- for (std::list<Creature*>::const_iterator itr = eggs.begin(); itr != eggs.end(); ++itr)
- (*itr)->CastSpell(*itr, SPELL_ALYSRAZOR_COSMETIC_EGG_XPLOSION, TRIGGERED_FULL_MASK);
-
- DoCast(me, SPELL_ALYSRAZOR_COSMETIC_EGG_XPLOSION, true);
- }
-
- void JustReachedHome() override
- {
- AlysrazorTrashEvaded(me);
- }
-
- void DoAction(int32 action) override
- {
- if (action != NPC_BLAZING_MONSTROSITY_LEFT &&
- action != NPC_BLAZING_MONSTROSITY_RIGHT)
- return;
-
- if (action == NPC_BLAZING_MONSTROSITY_LEFT)
- Talk(EMOTE_CRACKING_EGGS);
-
- _callHatchlingSpell = (action == NPC_BLAZING_MONSTROSITY_LEFT) ? SPELL_MOLTEN_EGG_TRASH_CALL_L : SPELL_MOLTEN_EGG_TRASH_CALL_R;
- DoZoneInCombat();
- _events.Reset();
- _events.ScheduleEvent(EVENT_SUMMON_SMOULDERING_HATCHLING, 1ms);
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- _events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_SUMMON_SMOULDERING_HATCHLING:
- {
- std::list<Creature*> eggs;
- MoltenEggCheck check(me);
- Trinity::CreatureListSearcher<MoltenEggCheck> searcher(me, eggs, check);
- Cell::VisitGridObjects(me, searcher, 20.0f);
- if (!eggs.empty())
- {
- Creature* egg = Trinity::Containers::SelectRandomContainerElement(eggs);
- egg->CastSpell(egg, SPELL_SUMMON_SMOULDERING_HATCHLING, TRIGGERED_FULL_MASK);
- egg->SetDisplayId(MODEL_INVISIBLE_STALKER);
- egg->m_Events.AddEventAtOffset(new RespawnEggEvent(egg), 5s);
- }
-
- if (_callHatchlingSpell)
- DoCastAOE(_callHatchlingSpell, true);
- _events.ScheduleEvent(EVENT_SUMMON_SMOULDERING_HATCHLING, 6s, 10s);
- break;
- }
- default:
- break;
- }
- }
- }
-
- private:
- EventMap _events;
- uint32 _callHatchlingSpell = 0;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetFirelandsAI<npc_egg_pileAI>(creature);
- }
-};
-
-class spell_alysrazor_cosmetic_egg_xplosion : public SpellScriptLoader
-{
- public:
- spell_alysrazor_cosmetic_egg_xplosion() : SpellScriptLoader("spell_alysrazor_cosmetic_egg_xplosion") { }
-
- class spell_alysrazor_cosmetic_egg_xplosion_SpellScript : public SpellScript
- {
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- if (!sCreatureDisplayInfoStore.LookupEntry(MODEL_INVISIBLE_STALKER))
- return false;
- return true;
- }
-
- void HandleExplosion(SpellEffIndex effIndex)
- {
- PreventHitDefaultEffect(effIndex);
- GetHitUnit()->SetDisplayId(MODEL_INVISIBLE_STALKER);
- if (Creature* creature = GetHitCreature())
- creature->DespawnOrUnsummon(4s);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_alysrazor_cosmetic_egg_xplosion_SpellScript::HandleExplosion, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_alysrazor_cosmetic_egg_xplosion_SpellScript();
- }
-};
-
-class spell_alysrazor_turn_monstrosity : public SpellScriptLoader
-{
- public:
- spell_alysrazor_turn_monstrosity() : SpellScriptLoader("spell_alysrazor_turn_monstrosity") { }
-
- class spell_alysrazor_turn_monstrosity_SpellScript : public SpellScript
- {
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo(
- {
- SPELL_GENERIC_DUMMY_CAST,
- SPELL_KNOCKBACK_RIGHT,
- SPELL_KNOCKBACK_LEFT,
- SPELL_KNOCKBACK_FORWARD,
- SPELL_KNOCKBACK_BACK
- });
- }
-
- void KnockBarrage(SpellEffIndex effIndex)
- {
- PreventHitDefaultEffect(effIndex);
- GetHitUnit()->GetMotionMaster()->MoveIdle();
- if (TempSummon* summ = GetHitUnit()->ToTempSummon())
- if (WorldObject* summoner = summ->GetSummoner())
- GetHitUnit()->CastSpell(summoner, SPELL_GENERIC_DUMMY_CAST, TRIGGERED_FULL_MASK);
-
- float angle = 0.0f;
- if (Unit* bird = GetCaster()->GetVehicleBase())
- {
- bird->SetInFront(GetHitUnit());
- angle = bird->GetOrientation();
- }
-
- uint32 spellId = 0;
- switch (GetSpellInfo()->Id)
- {
- case SPELL_RIGHT_SIDE_SMACK_R:
- case SPELL_RIGHT_SIDE_SMACK_L:
- spellId = SPELL_KNOCKBACK_RIGHT;
- angle -= float(M_PI) * 0.5f;
- break;
- case SPELL_LEFT_SIDE_SMACK_R:
- case SPELL_LEFT_SIDE_SMACK_L:
- spellId = SPELL_KNOCKBACK_LEFT;
- angle += float(M_PI) * 0.5f;
- break;
- case SPELL_HEAD_BONK_R:
- case SPELL_HEAD_BONK_L:
- spellId = SPELL_KNOCKBACK_FORWARD;
- break;
- case SPELL_TICKLE_R:
- case SPELL_TICKLE_L:
- spellId = SPELL_KNOCKBACK_BACK;
- angle -= float(M_PI);
- break;
- }
-
- // Cannot wait for object update to process facing spline, it's needed in next spell cast
- GetHitUnit()->SetOrientation(angle);
- GetHitUnit()->SetFacingTo(angle);
- GetHitUnit()->AddUnitState(UNIT_STATE_CANNOT_TURN);
- GetHitUnit()->CastSpell(GetHitUnit(), spellId, TRIGGERED_FULL_MASK);
- }
-
- void TurnBird(SpellEffIndex effIndex)
- {
- PreventHitDefaultEffect(effIndex);
- GetHitUnit()->PlayOneShotAnimKitId(ANIM_KIT_BIRD_TURN);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_alysrazor_turn_monstrosity_SpellScript::KnockBarrage, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- OnEffectHitTarget += SpellEffectFn(spell_alysrazor_turn_monstrosity_SpellScript::TurnBird, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_alysrazor_turn_monstrosity_SpellScript();
- }
-};
-
-class spell_alysrazor_aggro_closest : public SpellScriptLoader
-{
- public:
- spell_alysrazor_aggro_closest() : SpellScriptLoader("spell_alysrazor_aggro_closest") { }
-
- class spell_alysrazor_aggro_closest_SpellScript : public SpellScript
- {
- bool Load() override
- {
- return GetCaster()->GetTypeId() == TYPEID_UNIT;
- }
-
- void HandleEffect(SpellEffIndex effIndex)
- {
- PreventHitDefaultEffect(effIndex);
- float curThreat = GetCaster()->GetThreatManager().GetThreat(GetHitUnit(), true);
- GetCaster()->GetThreatManager().AddThreat(GetHitUnit(), -curThreat + 50000.0f / std::min(1.0f, GetCaster()->GetDistance(GetHitUnit())));
- }
-
- void UpdateThreat()
- {
- GetCaster()->ClearUnitState(UNIT_STATE_CASTING);
- GetCaster()->GetAI()->AttackStart(GetCaster()->ToCreature()->SelectVictim());
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_alysrazor_aggro_closest_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_DUMMY);
- AfterCast += SpellCastFn(spell_alysrazor_aggro_closest_SpellScript::UpdateThreat);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_alysrazor_aggro_closest_SpellScript();
- }
-};
-
-class spell_alysrazor_fieroblast : public SpellScriptLoader
-{
- public:
- spell_alysrazor_fieroblast() : SpellScriptLoader("spell_alysrazor_fieroblast") { }
-
- class spell_alysrazor_fieroblast_SpellScript : public SpellScript
- {
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_FIRE_IT_UP });
- }
-
- void FireItUp()
- {
- GetCaster()->CastSpell(GetCaster(), SPELL_FIRE_IT_UP, TRIGGERED_FULL_MASK);
- }
-
- void Register() override
- {
- AfterCast += SpellCastFn(spell_alysrazor_fieroblast_SpellScript::FireItUp);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_alysrazor_fieroblast_SpellScript();
- }
-};
-
-void AddSC_boss_alysrazor()
-{
- new npc_harbinger_of_flame();
- new npc_blazing_monstrosity();
- new npc_molten_barrage();
- new npc_egg_pile();
- new spell_alysrazor_cosmetic_egg_xplosion();
- new spell_alysrazor_turn_monstrosity();
- new spell_alysrazor_aggro_closest();
- new spell_alysrazor_fieroblast();
-}
diff --git a/src/server/scripts/Kalimdor/Firelands/boss_baleroc.cpp b/src/server/scripts/Kalimdor/Firelands/boss_baleroc.cpp
deleted file mode 100644
index fc9e400c7a0..00000000000
--- a/src/server/scripts/Kalimdor/Firelands/boss_baleroc.cpp
+++ /dev/null
@@ -1,839 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ScriptMgr.h"
-#include "InstanceScript.h"
-#include "SpellScript.h"
-#include "ObjectAccessor.h"
-#include "Containers.h"
-#include "firelands.h"
-#include "Map.h"
-#include "GridNotifiers.h"
-#include "PassiveAI.h"
-#include "Spell.h"
-#include "SpellAuras.h"
-#include "SpellAuraEffects.h"
-#include "SpellMgr.h"
-
-enum Spells
-{
- // Baleroc
- //SPELL_LEASH = 101514, // Server-side, used to keep him in his encounter area? TrinityCore does not need a spell to handle this
- SPELL_BLADES_OF_BALEROC = 99342,
- SPELL_INFERNO_BLADE = 99350,
- SPELL_INFERNO_STRIKE = 99351,
- SPELL_DECIMATION_BLADE = 99352,
- SPELL_DECIMATION_BLADE_2 = 99405,
- SPELL_DECIMATING_STRIKE = 99353,
- SPELL_BLAZE_OF_GLORY = 99252,
- SPELL_INCENDIARY_SOUL = 99369,
- SPELL_SHARDS_OF_TORMENT = 99259,
- SPELL_SHARDS_OF_TORMENT_SUMMON = 99260,
- SPELL_TORMENT_PRE_VISUAL = 99258,
- SPELL_TORMENT_ACTIVE = 99254,
- SPELL_TORMENT_PERIODIC = 99255,
- SPELL_WAVE_OF_TORMENT = 99261,
- SPELL_TORMENTED = 99257,
- SPELL_TORMENT = 99256,
- SPELL_COUNTDOWN = 99515,
- SPELL_COUNTDOWN_AURA = 99516,
- SPELL_COUNTDOWN_3 = 99517,
- SPELL_COUNTDOWN_AOE_EXPLOSION = 99518,
- SPELL_COUNTDOWN_VISUAL_LINK = 99519,
- SPELL_VITAL_SPARK = 99262,
- SPELL_VITAL_FLAME = 99263,
- SPELL_BERSERK = 26662,
-};
-
-enum Emotes
-{
- SAY_AGGRO = 0,
- SAY_SHARDS_OF_TORMENT = 1,
- SAY_INFERNO_BLADE = 2,
- SAY_DECIMATION_BLADE = 3,
- SAY_KILL = 4,
- SAY_DEATH = 5,
- SAY_ENRAGE = 6,
- EMOTE_ENRAGE = 7,
- EMOTE_DECIMATION_BLADE = 8,
- EMOTE_INFERNO_BLADE = 9,
-};
-
-enum Guids
-{
- GUID_TORMENTED = 1,
-};
-
-enum Actions
-{
- ACTION_EQUIP_DEFAULT = 1,
- ACTION_EQUIP_INFERNO_BLADE = 2,
- ACTION_EQUIP_DECIMATION_BLADE = 3,
-};
-
-enum Misc
-{
- EQUIP_DEFAULT = 1,
- EQUIP_INFERNO_BLADE = 2,
- EQUIP_DECIMATION_BLADE = 3,
-};
-
-enum Phases
-{
- PHASE_NONE = 0,
- PHASE_ONE = 1
-};
-
-// http://www.wowhead.com/npc=53494/baleroc
-struct boss_baleroc : public firelands_bossAI
-{
- boss_baleroc(Creature* creature) : firelands_bossAI(creature, DATA_BALEROC), _canYellKilledPlayer(true)
- {
- scheduler.SetValidator([this]
- {
- return !me->HasUnitState(UNIT_STATE_CASTING);
- });
- }
-
- void Reset() override
- {
- firelands_bossAI::Reset();
- _canYellKilledPlayer = true;
- EquipWeapon(EQUIP_DEFAULT);
- }
-
- void JustEngagedWith(Unit* target) override
- {
- firelands_bossAI::JustEngagedWith(target);
-
- Talk(SAY_AGGRO);
- PreparePhase(PHASE_ONE);
-
- _sharedThePain.clear();
- }
-
- void PreparePhase(Phases phase)
- {
- //events.SetPhase(phase);
-
- switch (phase)
- {
- case PHASE_ONE:
- scheduler.Schedule(Milliseconds(8500), [this](TaskContext context)
- {
- me->AddAura(SPELL_INCENDIARY_SOUL, me); // No cast
- DoCastVictim(SPELL_BLAZE_OF_GLORY);
- context.Repeat(Milliseconds(11500));
- });
- scheduler.Schedule(Seconds(5), [this](TaskContext context)
- {
- DoCastAOE(SPELL_SHARDS_OF_TORMENT);
- context.Repeat(Seconds(34));
- });
- if (me->GetMap()->IsHeroic())
- {
- scheduler.Schedule(Seconds(26), [this](TaskContext context)
- {
- DoCastAOE(SPELL_COUNTDOWN);
- context.Repeat(Seconds(48));
- });
- }
- scheduler.Schedule(Milliseconds(30500), [this](TaskContext context)
- {
- DoCastSelf(SPELL_BLADES_OF_BALEROC);
- context.Repeat(Seconds(47));
- });
- scheduler.Schedule(Minutes(6), [this](TaskContext)
- {
- Talk(SAY_ENRAGE);
- Talk(EMOTE_ENRAGE);
- DoCastSelf(SPELL_BERSERK);
- });
- break;
- default:
- break;
- }
- }
-
- void DoAction(int32 action) override
- {
- switch (action)
- {
- case ACTION_EQUIP_DEFAULT:
- case ACTION_EQUIP_INFERNO_BLADE:
- case ACTION_EQUIP_DECIMATION_BLADE:
- EquipWeapon(action);
- break;
- default:
- break;
- }
- }
-
- void KilledUnit(Unit* who) override
- {
- if (who->GetTypeId() == TYPEID_PLAYER && _canYellKilledPlayer)
- {
- _canYellKilledPlayer = false;
- Talk(SAY_KILL);
-
- separateScheduler.Schedule(Seconds(8), [this](TaskContext)
- {
- _canYellKilledPlayer = true;
- });
- }
- }
-
- void JustDied(Unit* killer) override
- {
- Talk(SAY_DEATH);
- instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLAZE_OF_GLORY);
- firelands_bossAI::JustDied(killer);
- }
-
- void EnterEvadeMode(EvadeReason reason) override
- {
- summons.DespawnAll();
- instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLAZE_OF_GLORY);
- firelands_bossAI::EnterEvadeMode(reason);
- }
-
- void UpdateAI(uint32 diff) override
- {
- scheduler.Update(diff);
- separateScheduler.Update(diff);
- firelands_bossAI::UpdateAI(diff);
- }
-
- void SetGUID(ObjectGuid const& guid, int32 type = 0) override
- {
- switch (type)
- {
- case GUID_TORMENTED:
- ++_sharedThePain[guid];
- break;
- default:
- break;
- }
- }
-
- uint32 GetData(uint32 type) const override
- {
- switch (type)
- {
- case GUID_TORMENTED:
- for (auto const& entry : _sharedThePain)
- if (entry.second > 3)
- return 1;
- break;
- default:
- break;
- }
-
- return 0;
- }
-
-private:
- void EquipWeapon(uint8 equipment) const
- {
- switch (equipment)
- {
- case EQUIP_DEFAULT:
- me->LoadEquipment(equipment);
- me->SetCanDualWield(true);
- break;
- case EQUIP_INFERNO_BLADE:
- case EQUIP_DECIMATION_BLADE:
- me->LoadEquipment(equipment);
- me->SetCanDualWield(false);
- break;
- default:
- break;
- }
- }
- // Our default TaskScheduler has a UNIT_STATE_CASTING validator that would get in the way of certain tasks, run them on a separate track.
- TaskScheduler separateScheduler;
- bool _canYellKilledPlayer;
- std::unordered_map<ObjectGuid, uint32> _sharedThePain;
-};
-
-// http://www.wowhead.com/npc=53495/shard-of-torment
-struct npc_shard_of_torment : public NullCreatureAI
-{
- npc_shard_of_torment(Creature* creature) : NullCreatureAI(creature) { }
-
- void IsSummonedBy(WorldObject* /*summoner*/) override
- {
- DoCastAOE(SPELL_TORMENT_PRE_VISUAL);
- scheduler.Schedule(Milliseconds(4400), [this](TaskContext)
- {
- me->RemoveAurasDueToSpell(SPELL_TORMENT_PRE_VISUAL);
- DoCastAOE(SPELL_TORMENT_ACTIVE);
- scheduler.Schedule(Milliseconds(1100), [this](TaskContext context)
- {
- DoCastAOE(SPELL_WAVE_OF_TORMENT);
- context.Repeat(Seconds(1));
- });
- });
- }
-
- void SpellHitTarget(WorldObject* /*target*/, SpellInfo const* spellInfo) override
- {
- if (spellInfo->Id != SPELL_TORMENT)
- return;
-
- scheduler.CancelAll();
- scheduler.Schedule(Milliseconds(1100), [this](TaskContext context)
- {
- DoCastAOE(SPELL_WAVE_OF_TORMENT);
- context.Repeat(Seconds(1));
- });
- }
-
- void UpdateAI(uint32 diff) override
- {
- scheduler.Update(diff);
- }
-
-private:
- TaskScheduler scheduler;
-};
-
-// http://www.wowhead.com/spell=99342/blades-of-baloroc
-class spell_baleroc_blades_of_baleroc : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_INFERNO_BLADE, SPELL_DECIMATION_BLADE });
- }
-
- void ChooseBlade(SpellEffIndex /*effIndex*/)
- {
- Creature* caster = GetCaster()->ToCreature();
- if (!caster || !caster->IsAIEnabled())
- return;
-
- switch (urand(1, 2))
- {
- case 1:
- caster->AI()->DoCast(SPELL_INFERNO_BLADE);
- caster->AI()->Talk(SAY_INFERNO_BLADE);
- caster->AI()->Talk(EMOTE_INFERNO_BLADE);
- break;
- case 2:
- caster->AI()->DoCast(SPELL_DECIMATION_BLADE);
- caster->AI()->Talk(SAY_DECIMATION_BLADE);
- caster->AI()->Talk(EMOTE_DECIMATION_BLADE);
- break;
- default:
- break;
- }
- }
-
- void Register() override
- {
- OnEffectHit += SpellEffectFn(spell_baleroc_blades_of_baleroc::ChooseBlade, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-// http://www.wowhead.com/spell=99350/inferno-blade
-class spell_baleroc_inferno_blade : public AuraScript
-{
- bool Load() override
- {
- return GetCaster()->GetTypeId() == TYPEID_UNIT;
- }
-
- void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (GetTarget()->IsAIEnabled())
- GetTarget()->GetAI()->DoAction(ACTION_EQUIP_INFERNO_BLADE);
- }
-
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (GetTarget()->IsAIEnabled())
- GetTarget()->GetAI()->DoAction(ACTION_EQUIP_DEFAULT);
- }
-
- void Register() override
- {
- OnEffectApply += AuraEffectApplyFn(spell_baleroc_inferno_blade::OnApply, EFFECT_0, SPELL_AURA_OVERRIDE_AUTOATTACK_WITH_MELEE_SPELL, AURA_EFFECT_HANDLE_REAL);
- OnEffectRemove += AuraEffectRemoveFn(spell_baleroc_inferno_blade::OnRemove, EFFECT_0, SPELL_AURA_OVERRIDE_AUTOATTACK_WITH_MELEE_SPELL, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// http://www.wowhead.com/spell=99352/decimation-blade
-class spell_baleroc_decimation_blade : public AuraScript
-{
- bool Load() override
- {
- return GetCaster()->GetTypeId() == TYPEID_UNIT;
- }
-
- void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (GetTarget()->IsAIEnabled())
- GetTarget()->GetAI()->DoAction(ACTION_EQUIP_DECIMATION_BLADE);
- }
-
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (GetTarget()->IsAIEnabled())
- GetTarget()->GetAI()->DoAction(ACTION_EQUIP_DEFAULT);
- }
-
- void Register() override
- {
- OnEffectApply += AuraEffectApplyFn(spell_baleroc_decimation_blade::OnApply, EFFECT_1, SPELL_AURA_OVERRIDE_AUTOATTACK_WITH_MELEE_SPELL, AURA_EFFECT_HANDLE_REAL);
- OnEffectRemove += AuraEffectRemoveFn(spell_baleroc_decimation_blade::OnRemove, EFFECT_1, SPELL_AURA_OVERRIDE_AUTOATTACK_WITH_MELEE_SPELL, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// http://www.wowhead.com/spell=99353/decimating-strike
-class spell_baleroc_decimating_strike : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellEffect({ { spellInfo->Id, EFFECT_2 } })
- && ValidateSpellInfo({ uint32(spellInfo->GetEffect(EFFECT_2).CalcValue()) });
- }
-
- void ChangeDamage()
- {
- int32 healthPctDmg = GetHitUnit()->CountPctFromMaxHealth(GetEffectInfo(EFFECT_0).CalcValue(GetCaster()));
- int32 flatDmg = GetEffectInfo(EFFECT_2).CalcValue(GetCaster());
-
- SetHitDamage(healthPctDmg < flatDmg ? flatDmg : healthPctDmg);
- }
-
- void Register() override
- {
- OnHit += SpellHitFn(spell_baleroc_decimating_strike::ChangeDamage);
- }
-};
-
-// http://www.wowhead.com/spell=99515/countdown
-class spell_baleroc_countdown_aoe_dummy : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_COUNTDOWN_VISUAL_LINK, SPELL_COUNTDOWN_AURA });
- }
-
- void CastSpellLink()
- {
- Unit* firstTarget = ObjectAccessor::GetUnit(*GetCaster(), _targets.front());
- Unit* secondTarget = ObjectAccessor::GetUnit(*GetCaster(), _targets.back());
- if (!firstTarget || !secondTarget)
- return;
-
- firstTarget->CastSpell(secondTarget, SPELL_COUNTDOWN_VISUAL_LINK, true);
- }
-
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetHitUnit(), SPELL_COUNTDOWN_AURA);
- }
-
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- if (WorldObject* tank = GetCaster()->GetVictim())
- targets.remove(tank);
-
- if (targets.size() < 2)
- {
- FinishCast(SPELL_FAILED_NO_VALID_TARGETS);
- return;
- }
-
- Trinity::Containers::RandomResize(targets, 2);
-
- _targets.push_back(targets.front()->GetGUID());
- _targets.push_back(targets.back()->GetGUID());
- }
-
- void Register() override
- {
- AfterCast += SpellCastFn(spell_baleroc_countdown_aoe_dummy::CastSpellLink);
- OnEffectHitTarget += SpellEffectFn(spell_baleroc_countdown_aoe_dummy::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_baleroc_countdown_aoe_dummy::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
- }
-
- GuidList _targets;
-};
-
-// http://www.wowhead.com/spell=99516/countdown
-class spell_baleroc_countdown : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_COUNTDOWN_VISUAL_LINK, SPELL_COUNTDOWN_AOE_EXPLOSION });
- }
-
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- GetTarget()->RemoveAurasDueToSpell(SPELL_COUNTDOWN_VISUAL_LINK);
- if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE)
- GetTarget()->CastSpell(static_cast<Unit*>(nullptr), SPELL_COUNTDOWN_AOE_EXPLOSION, true);
- }
-
- void Register() override
- {
- AfterEffectRemove += AuraEffectRemoveFn(spell_baleroc_countdown::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// http://www.wowhead.com/spell=99517/countdown
-class spell_baleroc_countdown_proximity_check : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_COUNTDOWN_AURA });
- }
-
- void HandleScript(SpellEffIndex effIndex)
- {
- PreventHitDefaultEffect(effIndex);
- GetCaster()->RemoveAurasDueToSpell(SPELL_COUNTDOWN_AURA);
- GetHitUnit()->RemoveAurasDueToSpell(SPELL_COUNTDOWN_AURA);
- }
-
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- targets.remove(GetCaster());
- targets.remove_if(Trinity::UnitAuraCheck(false, SPELL_COUNTDOWN_AURA));
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_baleroc_countdown_proximity_check::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_baleroc_countdown_proximity_check::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
- }
-};
-
-// http://www.wowhead.com/spell=99259/shards-of-torment
-class spell_baleroc_shards_of_torment_target_search : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHARDS_OF_TORMENT_SUMMON });
- }
-
- bool Load() override
- {
- _hasTarget = false;
- return GetCaster()->GetTypeId() == TYPEID_UNIT;
- }
-
- void OnSpellCast()
- {
- if (_hasTarget)
- ENSURE_AI(boss_baleroc, GetCaster()->GetAI())->Talk(SAY_SHARDS_OF_TORMENT);
- }
-
- void HandleScript(SpellEffIndex effIndex)
- {
- PreventHitDefaultEffect(effIndex);
- GetCaster()->CastSpell(GetHitUnit(), SPELL_SHARDS_OF_TORMENT_SUMMON, true);
- }
-
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- // Shards of torment seems to target tanks if no other targets are available as of Warlords of Draenor
- if (targets.size() <= 1)
- {
- _hasTarget = !targets.empty();
- return;
- }
-
- Unit* caster = GetCaster();
- if (WorldObject* tank = caster->GetVictim())
- targets.remove(tank);
-
- std::list<WorldObject*> melee, ranged;
- for (WorldObject* target : targets)
- {
- if (caster->IsWithinMeleeRange(target->ToUnit()))
- melee.push_back(target);
- else
- ranged.push_back(target);
- }
-
- targets.clear();
-
- if (caster->GetMap()->Is25ManRaid())
- if (WorldObject* target = GetRandomContainerElement(ranged, melee))
- targets.push_back(target);
-
- if (WorldObject* target = GetRandomContainerElement(melee, ranged))
- targets.push_back(target);
-
- _hasTarget = !targets.empty();
- }
-
- WorldObject* GetRandomContainerElement(std::list<WorldObject*>& priority1, std::list<WorldObject*>& priority2) const
- {
- WorldObject* target = nullptr;
- target = GetRandomContainerElement(&priority1);
- if (target)
- priority1.remove(target);
- else
- {
- target = GetRandomContainerElement(&priority2);
- priority2.remove(target);
- }
-
- return target;
- }
-
- static WorldObject* GetRandomContainerElement(std::list<WorldObject*> const* list)
- {
- if (!list->empty())
- return Trinity::Containers::SelectRandomContainerElement(*list);
-
- return nullptr;
- }
-
- void Register() override
- {
- OnCast += SpellCastFn(spell_baleroc_shards_of_torment_target_search::OnSpellCast);
- OnEffectHitTarget += SpellEffectFn(spell_baleroc_shards_of_torment_target_search::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_baleroc_shards_of_torment_target_search::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
- }
-
- bool _hasTarget = false;
-};
-
-// http://www.wowhead.com/spell=99253/torment
-class spell_baleroc_torment_target_search : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_TORMENT_PERIODIC });
- }
-
- void OnHit(SpellEffIndex /*effIndex*/)
- {
- Spell* spell = GetCaster()->GetCurrentSpell(CURRENT_CHANNELED_SPELL);
- if (spell && spell->m_targets.GetUnitTargetGUID() == _target)
- return;
-
- if (GetHitUnit()->GetGUID() == _target)
- GetCaster()->CastSpell(GetHitUnit(), SPELL_TORMENT_PERIODIC);
- }
-
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- targets.remove_if(PlayerCheck());
- if (targets.empty())
- return;
-
- targets.sort(Trinity::ObjectDistanceOrderPred(GetCaster()));
- _target = targets.front()->GetGUID();
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_baleroc_torment_target_search::OnHit, EFFECT_0, SPELL_EFFECT_DUMMY);
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_baleroc_torment_target_search::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
- }
-
- ObjectGuid _target;
-};
-
-// http://www.wowhead.com/spell=99256/torment
-class spell_baleroc_torment : public SpellScript
-{
- void ModifyDamage()
- {
- SetHitDamage(GetHitDamage() * GetHitUnit()->GetAuraCount(GetSpellInfo()->Id));
- }
-
- void Register() override
- {
- OnHit += SpellHitFn(spell_baleroc_torment::ModifyDamage);
- }
-};
-
-class spell_baleroc_torment_AuraScript : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_VITAL_FLAME, SPELL_VITAL_SPARK, SPELL_TORMENTED });
- }
-
- void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- Unit* healer = eventInfo.GetProcTarget();
- if (healer->HasAura(SPELL_VITAL_FLAME))
- return;
-
- bool is25ManHeroic = healer->GetMap()->IsHeroic() && healer->GetMap()->Is25ManRaid();
- uint32 stacks = healer->GetAuraCount(SPELL_VITAL_SPARK) + std::min(uint8(ceil(GetStackAmount() / (is25ManHeroic ? 5.0 : 3.0))), uint8(255));
-
- healer->SetAuraStack(SPELL_VITAL_SPARK, healer, stacks);
- if (Aura* aura = healer->GetAura(SPELL_VITAL_SPARK))
- aura->RefreshDuration();
- }
-
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEATH)
- GetTarget()->CastSpell(GetTarget(), SPELL_TORMENTED, true);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_baleroc_torment_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY);
- OnEffectRemove += AuraEffectRemoveFn(spell_baleroc_torment_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
-};
-
-// http://www.wowhead.com/spell=99257/tormented
-class spell_baleroc_tormented : public AuraScript
-{
- void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (InstanceScript* instance = GetTarget()->GetInstanceScript())
- if (Creature* baleroc = ObjectAccessor::GetCreature(*GetTarget(), instance->GetGuidData(DATA_BALEROC)))
- baleroc->AI()->SetGUID(GetTarget()->GetGUID(), GUID_TORMENTED);
- }
-
- void Register() override
- {
- OnEffectApply += AuraEffectApplyFn(spell_baleroc_tormented::OnApply, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
- }
-};
-
-// http://www.wowhead.com/spell=99489/tormented
-class spell_baleroc_tormented_spread : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_TORMENTED });
- }
-
- void HandleScript(SpellEffIndex effIndex)
- {
- PreventHitDefaultEffect(effIndex);
- GetHitUnit()->CastSpell(GetHitUnit(), SPELL_TORMENTED, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_baleroc_tormented_spread::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
-};
-
-// http://www.wowhead.com/spell=99262/vital-spark
-class spell_baleroc_vital_spark : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_BLAZE_OF_GLORY, SPELL_VITAL_FLAME });
- }
-
- void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- if (Unit* target = eventInfo.GetProcTarget())
- if (target->HasAura(SPELL_BLAZE_OF_GLORY))
- GetCaster()->CastSpell(GetCaster(), SPELL_VITAL_FLAME, true);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_baleroc_vital_spark::HandleProc, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- }
-};
-
-// http://www.wowhead.com/spell=99263/vital-flame
-class spell_baleroc_vital_flame : public AuraScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellEffect({ { SPELL_VITAL_SPARK, EFFECT_0 } });
- }
-
- void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (!GetCaster()->HasAura(SPELL_VITAL_SPARK))
- {
- stacks = 0;
- return;
- }
-
- stacks = GetCaster()->GetAuraCount(SPELL_VITAL_SPARK);
- int32 healingPct = sSpellMgr->AssertSpellInfo(SPELL_VITAL_SPARK, GetCastDifficulty())->GetEffect(EFFECT_0).CalcValue(GetCaster()) * stacks;
-
- if (GetAura()->GetEffect(EFFECT_0)->GetAmount() < healingPct)
- GetAura()->GetEffect(EFFECT_0)->SetAmount(healingPct);
-
- GetCaster()->RemoveAura(SPELL_VITAL_SPARK);
- }
-
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE)
- GetCaster()->SetAuraStack(SPELL_VITAL_SPARK, GetCaster(), stacks);
- }
-
- void Register() override
- {
- OnEffectApply += AuraEffectApplyFn(spell_baleroc_vital_flame::OnApply, EFFECT_0, SPELL_AURA_MOD_HEALING_DONE_VERSUS_AURASTATE, AURA_EFFECT_HANDLE_REAL);
- OnEffectRemove += AuraEffectRemoveFn(spell_baleroc_vital_flame::OnRemove, EFFECT_0, SPELL_AURA_MOD_HEALING_DONE_VERSUS_AURASTATE, AURA_EFFECT_HANDLE_REAL);
- }
-
- uint32 stacks = 0u;
-};
-
-// http://www.wowhead.com/achievement=5830/share-the-pain //17577
-class achievement_share_the_pain : public AchievementCriteriaScript
-{
- public:
- achievement_share_the_pain() : AchievementCriteriaScript("achievement_share_the_pain") { }
-
- bool OnCheck(Player* /*source*/, Unit* target) override
- {
- if (!target)
- return false;
-
- return target->GetAI()->GetData(GUID_TORMENTED) == 0;
- }
-};
-
-void AddSC_boss_baleroc()
-{
- RegisterFirelandsAI(boss_baleroc);
- RegisterFirelandsAI(npc_shard_of_torment);
- RegisterSpellScript(spell_baleroc_blades_of_baleroc);
- RegisterSpellScript(spell_baleroc_inferno_blade);
- RegisterSpellScript(spell_baleroc_decimation_blade);
- RegisterSpellScript(spell_baleroc_decimating_strike);
- RegisterSpellScript(spell_baleroc_countdown_aoe_dummy);
- RegisterSpellScript(spell_baleroc_countdown);
- RegisterSpellScript(spell_baleroc_countdown_proximity_check);
- RegisterSpellScript(spell_baleroc_shards_of_torment_target_search);
- RegisterSpellScript(spell_baleroc_torment_target_search);
- RegisterSpellAndAuraScriptPair(spell_baleroc_torment, spell_baleroc_torment_AuraScript);
- RegisterSpellScript(spell_baleroc_tormented);
- RegisterSpellScript(spell_baleroc_tormented_spread);
- RegisterSpellScript(spell_baleroc_vital_spark);
- RegisterSpellScript(spell_baleroc_vital_flame);
- new achievement_share_the_pain();
-};
diff --git a/src/server/scripts/Kalimdor/Firelands/firelands.cpp b/src/server/scripts/Kalimdor/Firelands/firelands.cpp
deleted file mode 100644
index 8fb40ff6420..00000000000
--- a/src/server/scripts/Kalimdor/Firelands/firelands.cpp
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ScriptMgr.h"
-#include "InstanceScript.h"
-#include "SpellScript.h"
-#include "SpellInfo.h"
-#include "Creature.h"
-#include "firelands.h"
-#include "GridNotifiers.h"
-#include "Vehicle.h"
-#include "MotionMaster.h"
-
-enum Spells
-{
- // Baleroc Trash
- SPELL_FLAME_TORRENT = 100795,
- SPELL_FIERY_TORMENT = 100797,
- SPELL_FIERY_TORMENT_DAMAGE = 100802,
- SPELL_EARTHQUAKE = 100724,
- SPELL_MAGMA_CONDUIT = 100728,
- SPELL_ERUPTION = 100755,
- SPELL_SUMMON_MAGMAKIN = 100746,
-
- // Legendary questline
- SPELL_SMOULDERING_QUEST_CHECK_A = 101089, // Alliance - Unverified
- SPELL_SMOULDERING_QUEST_CHECK_H = 101092 // Horde - Unverified
-};
-
-bool DelayedAttackStartEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
-{
- _owner->AI()->DoZoneInCombat(_owner);
- return true;
-}
-
-bool DelayedSpellCastEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
-{
- _owner->CastSpell(_target, _spellId, _triggered);
- return true;
-}
-
-void firelands_bossAI::JustEngagedWith(Unit* target)
-{
- BossAI::JustEngagedWith(target);
- instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me);
-}
-
-void firelands_bossAI::JustDied(Unit* killer)
-{
- BossAI::JustDied(killer);
- instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
- me->m_Events.AddEventAtOffset(new DelayedSpellCastEvent(me, static_cast<Unit*>(nullptr), SPELL_SMOULDERING_1, false), 2s);
- me->m_Events.AddEventAtOffset(new DelayedSpellCastEvent(me, static_cast<Unit*>(nullptr), SPELL_SMOULDERING_2, false), 2s);
-}
-
-void firelands_bossAI::EnterEvadeMode(EvadeReason why)
-{
- instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
-
- // Copy paste ScriptedAI::EnterEvadeMode functionality to exclude Reset function call
- if (!_EnterEvadeMode(why))
- return;
-
- if (!me->GetVehicle()) // otherwise me will be in evade mode forever
- {
- if (Unit* owner = me->GetCharmerOrOwner())
- {
- me->GetMotionMaster()->Clear();
- me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, me->GetFollowAngle(), {}, MOTION_SLOT_ACTIVE);
- }
- else
- {
- // Required to prevent attacking creatures that are evading and cause them to reenter combat
- // Does not apply to MoveFollow
- me->AddUnitState(UNIT_STATE_EVADE);
- me->GetMotionMaster()->MoveTargetedHome();
- }
- }
-
- // Copy paste reason
- //Reset();
-
- if (me->IsVehicle()) // use the same sequence of addtoworld, aireset may remove all summons!
- me->GetVehicleKit()->Reset(true);
-
- _DespawnAtEvade();
-}
-
-// http://www.wowhead.com/npc=54161/flame-archon
-struct npc_firelands_flame_archon : public ScriptedAI
-{
- npc_firelands_flame_archon(Creature* creature) : ScriptedAI(creature)
- {
- scheduler.SetValidator([this]
- {
- return !me->HasUnitState(UNIT_STATE_CASTING);
- });
- }
-
- void JustEngagedWith(Unit* /*attacker*/) override
- {
- scheduler.Schedule(Seconds(10), Seconds(12), [this](TaskContext context)
- {
- DoCastAOE(SPELL_FLAME_TORRENT);
- context.Repeat(Seconds(15), Seconds(17));
- });
- scheduler.Schedule(Seconds(25), [this](TaskContext context)
- {
- DoCastAOE(SPELL_FIERY_TORMENT);
- context.Repeat(Seconds(45));
- });
- }
-
- void JustDied(Unit* killer) override
- {
- scheduler.CancelAll();
- ScriptedAI::JustDied(killer);
- }
-
- void EnterEvadeMode(EvadeReason why) override
- {
- scheduler.CancelAll();
- ScriptedAI::EnterEvadeMode(why);
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- scheduler.Update(diff);
- }
-
-private:
- TaskScheduler scheduler;
-};
-
-// http://www.wowhead.com/npc=54143/molten-flamefather
-struct npc_firelands_molten_flamefather : public ScriptedAI
-{
- npc_firelands_molten_flamefather(Creature* creature) : ScriptedAI(creature)
- {
- scheduler.SetValidator([this]
- {
- return !me->HasUnitState(UNIT_STATE_CASTING);
- });
- }
-
- void JustSummoned(Creature* summon) override
- {
- if (summon->GetEntry() != NPC_MAGMA_CONDUIT)
- return;
-
- summon->CastSpell(summon, SPELL_SUMMON_MAGMAKIN);
- }
-
- void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override
- {
- if (summon->GetEntry() != NPC_MAGMA_CONDUIT)
- return;
-
- summon->DespawnOrUnsummon();
- }
-
- void JustEngagedWith(Unit* /*attacker*/) override
- {
- scheduler.Schedule(Seconds(5), [this](TaskContext context)
- {
- DoCastAOE(SPELL_MAGMA_CONDUIT);
- if (Is25ManRaid())
- DoCastAOE(SPELL_MAGMA_CONDUIT);
- context.Repeat(Seconds(25));
- });
- scheduler.Schedule(Milliseconds(12800), [this](TaskContext context)
- {
- DoCastAOE(SPELL_EARTHQUAKE);
- context.Repeat(Milliseconds(32500));
- });
- }
-
- void JustDied(Unit* killer) override
- {
- scheduler.CancelAll();
- ScriptedAI::JustDied(killer);
- }
-
- void EnterEvadeMode(EvadeReason why) override
- {
- scheduler.CancelAll();
- ScriptedAI::EnterEvadeMode(why);
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- scheduler.Update(diff);
- }
-
-private:
- TaskScheduler scheduler;
-};
-
-// http://www.wowhead.com/npc=54144/magmakin
-struct npc_firelands_magmakin : public ScriptedAI
-{
- npc_firelands_magmakin(Creature* creature) : ScriptedAI(creature)
- {
- me->SetCanMelee(false); // DoSpellAttackIfReady
- }
-
- void IsSummonedBy(WorldObject* /*summoner*/) override
- {
- //Not actually sniffed behavior
- Unit* target = me->SelectNearestTarget(50.0f, true);
- if (!target)
- return;
-
- AddThreat(target, 50000000.0f);
- // TODO: Fixate mechanic
- }
-
- void UpdateAI(uint32 /*diff*/) override
- {
- if (!UpdateVictim())
- return;
-
- DoSpellAttackIfReady(SPELL_ERUPTION);
- }
-};
-
-// http://www.wowhead.com/spell=100799/fiery-torment
-class spell_firelands_fiery_torment : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_FIERY_TORMENT_DAMAGE });
- }
-
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetHitUnit(), SPELL_FIERY_TORMENT_DAMAGE, true);
- }
-
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- if (targets.empty())
- return;
-
- targets.sort(Trinity::ObjectDistanceOrderPred(GetCaster(), true));
- targets.resize(1);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_firelands_fiery_torment::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_firelands_fiery_torment::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
- }
-};
-
-// http://www.wowhead.com/spell=101089/smouldering
-// http://www.wowhead.com/spell=101092/smouldering
-class spell_firelands_smouldering : public SpellScript
-{
- void CheckQuestStatus(std::list<WorldObject*>& targets)
- {
- uint32 questId = 0;
- switch (GetSpellInfo()->Id)
- {
- case SPELL_SMOULDERING_QUEST_CHECK_A:
- questId = QUEST_HEART_OF_FLAME_A;
- break;
- case SPELL_SMOULDERING_QUEST_CHECK_H:
- questId = QUEST_HEART_OF_FLAME_H;
- break;
- default:
- break;
- }
-
- bool raidHasQuest = targets.end() != std::find_if(targets.begin(), targets.end(), [questId](WorldObject* worldObject)
- {
- if (Player* player = worldObject->ToPlayer())
- if (player->GetQuestStatus(questId) == QUEST_STATUS_INCOMPLETE)
- return true;
-
- return false;
- });
-
- targets.clear();
- if (raidHasQuest)
- targets.push_back(GetCaster());
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_firelands_smouldering::CheckQuestStatus, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
- }
-};
-
-// http://www.wowhead.com/spell=101093/smouldering
-class spell_firelands_smouldering_aura : public SpellScript
-{
- void SetTarget(WorldObject*& target)
- {
- target = GetCaster();
- }
-
- void Register() override
- {
- OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_firelands_smouldering_aura::SetTarget, EFFECT_0, TARGET_UNIT_NEARBY_ENTRY);
- }
-};
-
-void AddSC_firelands()
-{
- RegisterFirelandsAI(npc_firelands_flame_archon);
- RegisterFirelandsAI(npc_firelands_molten_flamefather);
- RegisterFirelandsAI(npc_firelands_magmakin);
- RegisterSpellScript(spell_firelands_fiery_torment);
- RegisterSpellScript(spell_firelands_smouldering);
- RegisterSpellScript(spell_firelands_smouldering_aura);
-}
diff --git a/src/server/scripts/Kalimdor/Firelands/firelands.h b/src/server/scripts/Kalimdor/Firelands/firelands.h
deleted file mode 100644
index 321393ce8ef..00000000000
--- a/src/server/scripts/Kalimdor/Firelands/firelands.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef FIRELANDS_H_
-#define FIRELANDS_H_
-
-#include "CreatureAIImpl.h"
-#include "EventProcessor.h"
-#include "ScriptedCreature.h"
-
-class Creature;
-
-#define DataHeader "FL"
-#define FirelandsScriptName "instance_firelands"
-
-uint32 const EncounterCount = 7;
-
-enum FLDataTypes
-{
- DATA_BETH_TILAC = 0,
- DATA_LORD_RHYOLITH = 1,
- DATA_SHANNOX = 2,
- DATA_ALYSRAZOR = 3,
- DATA_BALEROC = 4,
- DATA_MAJORDOMO_STAGHELM = 5,
- DATA_RAGNAROS = 6,
-};
-
-enum FLCreatureIds
-{
- // Bosses
- NPC_SHANNOX = 53691,
- NPC_LORD_RHYOLITH = 52558,
- NPC_BETH_TILAC = 52498,
- NPC_ALYSRAZOR = 52530,
- NPC_BALEROC = 53494,
- NPC_MAJORDOMO_STAGHELM = 52571,
- NPC_RAGNAROS = 52409,
-
- // Alysrazor
- NPC_BLAZING_MONSTROSITY_LEFT = 53786,
- NPC_BLAZING_MONSTROSITY_RIGHT = 53791,
- NPC_EGG_PILE = 53795,
- NPC_HARBINGER_OF_FLAME = 53793,
- NPC_MOLTEN_EGG_TRASH = 53914,
- NPC_SMOULDERING_HATCHLING = 53794,
-
- // Baleroc
- NPC_MAGMA_CONDUIT = 54145,
- NPC_MAGMAKIN = 54144
-};
-
-enum GameobjectIds
-{
- GO_BALEROC_FIREWALL = 209066
-};
-
-enum FirelandsSpells
-{
- SPELL_SMOULDERING_1 = 101089,
- SPELL_SMOULDERING_2 = 101092,
-};
-
-enum FirelandsQuests
-{
- QUEST_HEART_OF_FLAME_A = 29307,
- QUEST_HEART_OF_FLAME_H = 29308
-};
-
-class DelayedAttackStartEvent : public BasicEvent
-{
- public:
- DelayedAttackStartEvent(Creature* owner) : _owner(owner) { }
-
- bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) override;
-
- private:
- Creature* _owner;
-};
-
-class DelayedSpellCastEvent : public BasicEvent
-{
- public:
- DelayedSpellCastEvent(Creature* owner, Unit* target, uint32 spellId, bool triggered) : _owner(owner), _target(target), _spellId(spellId), _triggered(triggered) { }
-
- bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) override;
-
- private:
- Creature* _owner;
- Unit* _target;
- uint32 _spellId;
- bool _triggered;
-};
-
-class PlayerCheck
-{
- public:
- bool operator()(WorldObject* object) const
- {
- return object->GetTypeId() != TYPEID_PLAYER;
- }
-};
-
-struct firelands_bossAI : public BossAI
-{
- firelands_bossAI(Creature* creature, uint32 bossId) : BossAI(creature, bossId) { }
-
- void JustEngagedWith(Unit* target) override;
- void JustDied(Unit* killer) override;
- void EnterEvadeMode(EvadeReason why) override;
-};
-
-template<typename AI>
-inline AI* GetFirelandsAI(Creature* creature)
-{
- return GetInstanceAI<AI>(creature, FirelandsScriptName);
-}
-
-#define RegisterFirelandsAI(AI) RegisterCreatureAIWithFactory(AI, GetFirelandsAI)
-
-#endif // FIRELANDS_H_
diff --git a/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp b/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp
deleted file mode 100644
index 11ea87763a6..00000000000
--- a/src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ScriptMgr.h"
-#include "Creature.h"
-#include "firelands.h"
-#include "GameObject.h"
-#include "InstanceScript.h"
-#include "Map.h"
-
-DungeonEncounterData const encounters[] =
-{
- { DATA_BETH_TILAC, {{ 1197 }} },
- { DATA_LORD_RHYOLITH, {{ 1204 }} },
- { DATA_SHANNOX, {{ 1205 }} },
- { DATA_ALYSRAZOR, {{ 1206 }} },
- { DATA_BALEROC, {{ 1200 }} },
- { DATA_MAJORDOMO_STAGHELM, {{ 1185 }} },
- { DATA_RAGNAROS, {{ 1203 }} }
-};
-
-class instance_firelands : public InstanceMapScript
-{
- public:
- instance_firelands() : InstanceMapScript(FirelandsScriptName, 720) { }
-
- struct instance_firelands_InstanceScript : public InstanceScript
- {
- instance_firelands_InstanceScript(InstanceMap* map) : InstanceScript(map)
- {
- SetHeaders(DataHeader);
- SetBossNumber(EncounterCount);
- LoadDungeonEncounterData(encounters);
- }
-
- void OnCreatureCreate(Creature* creature) override
- {
- switch (creature->GetEntry())
- {
- case NPC_SMOULDERING_HATCHLING:
- // Cannot directly start attacking here as the creature is not yet on map
- creature->m_Events.AddEventAtOffset(new DelayedAttackStartEvent(creature), 500ms);
- break;
- case NPC_BALEROC:
- BalerocGUID = creature->GetGUID();
- break;
- default:
- break;
- }
- }
-
- void OnGameObjectCreate(GameObject* go) override
- {
- switch (go->GetEntry())
- {
- case GO_BALEROC_FIREWALL:
- BalerocDoorGUID = go->GetGUID();
- if (GetBossState(DATA_SHANNOX) == DONE || GetBossState(DATA_BALEROC) == DONE)
- go->SetGoState(GO_STATE_ACTIVE);
- break;
- default:
- break;
- }
- }
-
- bool SetBossState(uint32 type, EncounterState state) override
- {
- if (!InstanceScript::SetBossState(type, state))
- return false;
-
- if ((type == DATA_SHANNOX && state == DONE) || (type == DATA_BALEROC && state != IN_PROGRESS))
- {
- if (GameObject* door = instance->GetGameObject(BalerocDoorGUID))
- door->SetGoState(GO_STATE_ACTIVE);
- }
- else if (type == DATA_BALEROC && state == IN_PROGRESS)
- if (GameObject* door = instance->GetGameObject(BalerocDoorGUID))
- door->SetGoState(GO_STATE_READY);
-
- return true;
- }
-
- ObjectGuid GetGuidData(uint32 type) const override
- {
- switch (type)
- {
- case DATA_BALEROC:
- return BalerocGUID;
- default:
- break;
- }
- return ObjectGuid::Empty;
- }
-
- protected:
- ObjectGuid BalerocDoorGUID;
- ObjectGuid BalerocGUID;
- };
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const override
- {
- return new instance_firelands_InstanceScript(map);
- }
-};
-
-void AddSC_instance_firelands()
-{
- new instance_firelands();
-}
diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp
deleted file mode 100644
index 2f5f96f29c4..00000000000
--- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp
+++ /dev/null
@@ -1,570 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ScriptMgr.h"
-#include "Containers.h"
-#include "GridNotifiers.h"
-#include "halls_of_origination.h"
-#include "InstanceScript.h"
-#include "Map.h"
-#include "MotionMaster.h"
-#include "ObjectAccessor.h"
-#include "Player.h"
-#include "ScriptedCreature.h"
-#include "SpellAuraEffects.h"
-#include "SpellScript.h"
-
-enum Texts
-{
- ANRAPHET_SAY_INTRO = 0,
- ANRAPHET_SAY_AGGRO = 1,
- ANRAPHET_SAY_OMEGA_STANCE = 2,
- ANRAPHET_SAY_KILL = 3,
- ANRAPHET_SAY_DEATH = 4,
-
- BRANN_SAY_DOOR_INTRO = 0, // Right, let's go! Just need to input the final entry sequence into the door mechanism... and...
- BRANN_SAY_UNLOCK_DOOR = 1, // That did the trick! The control room should be right behind this... oh... wow...
- BRANN_SAY_TROGGS = 2, // What? This isn't the control room! There's another entire defense mechanism in place, and the blasted Rock Troggs broke into here somehow. Troggs. Why did it have to be Troggs!
- BRANN_SAY_THINK = 3, // Ok, let me think a moment.
- BRANN_SAY_MIRRORS = 4, // Mirrors pointing all over the place.
- BRANN_SAY_ELEMENTALS = 5, // Four platforms with huge elementals.
- BRANN_SAY_GET_IT = 6, // I got it! I saw a tablet that mentioned this chamber. This is the Vault of Lights! Ok, simple enough. I need you adventurers to take out each of the four elementals to trigger the opening sequence for the far door!
- BRANN_1_ELEMENTAL_DEAD = 7, // One down!
- BRANN_2_ELEMENTAL_DEAD = 8, // Another one down! Just look at those light beams! They seem to be connecting to the far door!
- BRANN_3_ELEMENTAL_DEAD = 9, // One more elemental to go! The door is almost open!
- BRANN_4_ELEMENTAL_DEAD = 10, // That''s it, you''ve done it! The vault door is opening! Now we can... oh, no!
- BRANN_SAY_ANRAPHET_DIED = 11, // We''ve done it! The control room is breached!
- BRANN_SAY_MOMENT = 12 // Here we go! Now this should only take a moment...
-};
-
-enum Events
-{
- EVENT_BRANN_MOVE_INTRO = 1,
- EVENT_BRANN_UNLOCK_DOOR = 2,
- EVENT_BRANN_THINK = 3,
- EVENT_BRANN_SET_ORIENTATION_1 = 4,
- EVENT_BRANN_SET_ORIENTATION_2 = 5,
- EVENT_BRANN_SET_ORIENTATION_3 = 6,
- EVENT_BRANN_SAY_ELEMENTALS = 7,
- EVENT_BRANN_SAY_GET_IT = 8,
- EVENT_BRANN_SET_ORIENTATION_4 = 9,
-
- EVENT_ANRAPHET_APPEAR = 10,
- EVENT_ANRAPHET_ACTIVATE = 11,
- EVENT_ANRAPHET_DESTROY = 12,
- EVENT_ANRAPHET_READY = 13,
- EVENT_ANRAPHET_NEMESIS_STRIKE = 14,
- EVENT_ANRAPHET_ALPHA_BEAMS = 15,
- EVENT_ANRAPHET_OMEGA_STANCE = 16,
- EVENT_ANRAPHET_CRUMBLING_RUIN = 17,
- EVENT_ANRAPHET_ACTIVATE_OMEGA = 18
-};
-
-enum Spells
-{
- SPELL_DESTRUCTION_PROTOCOL = 77437,
-
- SPELL_ALPHA_BEAMS = 76184,
- SPELL_ALPHA_BEAMS_BACK_CAST = 76912,
-
- SPELL_CRUMBLING_RUIN = 75609,
-
- SPELL_NEMESIS_STRIKE = 75604,
-
- SPELL_OMEGA_STANCE_SUMMON = 77106,
- SPELL_OMEGA_STANCE = 75622,
- SPELL_OMEGA_STANCE_SPIDER_TRIGGER = 77121,
-};
-
-enum Phases
-{
- PHASE_INTRO = 1,
- PHASE_COMBAT = 2,
-
- PHASE_MASK_COMBAT = (1 << PHASE_COMBAT),
-};
-
-enum Points
-{
- POINT_ANRAPHET_ACTIVATE = 0,
- MAX_BRANN_WAYPOINTS_INTRO = 17
-};
-
-enum GossipMenuIds
-{
- GOSSIP_MENU_START_INTRO = 11339,
-};
-
-Position const AnraphetActivatePos = {-193.656f, 366.689f, 75.91001f, 3.138207f};
-
-Position const BrannIntroWaypoint[MAX_BRANN_WAYPOINTS_INTRO] =
-{
- {-429.583f, 367.019f, 89.79282f, 0.0f},
- {-409.9531f, 367.0469f, 89.81111f, 0.0f},
- {-397.8246f, 366.967f, 86.37722f, 0.0f},
- {-383.7813f, 366.8229f, 82.07919f, 0.0f},
- {-368.2604f, 366.7448f, 77.0984f, 0.0f},
- {-353.6458f, 366.4896f, 75.92504f, 0.0f},
- {-309.0608f, 366.7205f, 75.91345f, 0.0f},
- {-276.3303f, 367.0f, 75.92413f, 0.0f},
- {-246.5104f, 366.6389f, 75.87791f, 0.0f},
- {-202.0417f, 366.7517f, 75.92508f, 0.0f},
- {-187.6024f, 366.7656f, 76.23077f, 0.0f},
- {-155.0938f, 366.783f, 86.45834f, 0.0f},
- {-143.5694f, 366.8177f, 89.73354f, 0.0f},
- {-128.5608f, 366.8629f, 89.74199f, 0.0f},
- {-103.559f, 366.5938f, 89.79725f, 0.0f},
- {-71.58507f, 367.0278f, 89.77069f, 0.0f},
- {-35.04861f, 366.6563f, 89.77447f, 0.0f},
-};
-
-class boss_anraphet : public CreatureScript
-{
-public:
- boss_anraphet() : CreatureScript("boss_anraphet") { }
-
- struct boss_anraphetAI : public BossAI
- {
- boss_anraphetAI(Creature* creature) : BossAI(creature, DATA_ANRAPHET) { }
-
- void ScheduleCombatEvents()
- {
- events.ScheduleEvent(EVENT_ANRAPHET_NEMESIS_STRIKE, 8s, 0, PHASE_COMBAT);
- events.ScheduleEvent(EVENT_ANRAPHET_ALPHA_BEAMS, 10s, 0, PHASE_COMBAT);
- events.ScheduleEvent(EVENT_ANRAPHET_OMEGA_STANCE, 35s, 0, PHASE_COMBAT);
- }
-
- void Reset() override
- {
- _Reset();
- me->SetWalk(false);
- events.SetPhase(PHASE_INTRO);
- if (instance->GetData(DATA_DEAD_ELEMENTALS) == 4)
- {
- // Set to combat automatically, Brann's event won't repeat
- me->SetUninteractible(false);
- events.SetPhase(PHASE_COMBAT);
- ScheduleCombatEvents();
- me->SetHomePosition(AnraphetActivatePos);
- }
- }
-
- void JustEngagedWith(Unit* who) override
- {
- instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
- Talk(ANRAPHET_SAY_AGGRO);
- BossAI::JustEngagedWith(who);
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
- Talk(ANRAPHET_SAY_DEATH);
-
- if (Creature* brann = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_BRANN_0_GUID)))
- brann->AI()->DoAction(ACTION_ANRAPHET_DIED);
-
- _JustDied();
- }
-
- void KilledUnit(Unit* victim) override
- {
- if (victim->GetTypeId() == TYPEID_PLAYER)
- Talk(ANRAPHET_SAY_KILL);
- }
-
- void JustReachedHome() override
- {
- instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
- _JustReachedHome();
- instance->SetBossState(DATA_ANRAPHET, FAIL);
- }
-
- void DoAction(int32 action) override
- {
- if (action == ACTION_ANRAPHET_INTRO)
- events.ScheduleEvent(EVENT_ANRAPHET_APPEAR, 6s, 0, PHASE_INTRO);
- }
-
- void MovementInform(uint32 type, uint32 point) override
- {
- if (type != POINT_MOTION_TYPE)
- return;
-
- if (point == POINT_ANRAPHET_ACTIVATE)
- {
- events.ScheduleEvent(EVENT_ANRAPHET_ACTIVATE, 1500ms, 0, PHASE_INTRO);
- me->SetHomePosition(AnraphetActivatePos);
- }
- }
-
- void UpdateAI(uint32 diff) override
- {
- if ((events.GetPhaseMask() & PHASE_MASK_COMBAT) && (!UpdateVictim() || !CheckInRoom()))
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_ANRAPHET_APPEAR:
- me->SetWalk(true);
- me->GetMotionMaster()->MovePoint(POINT_ANRAPHET_ACTIVATE, AnraphetActivatePos);
- break;
- case EVENT_ANRAPHET_ACTIVATE:
- me->SetWalk(false);
- Talk(ANRAPHET_SAY_INTRO);
- events.ScheduleEvent(EVENT_ANRAPHET_DESTROY, 17500ms, 0, PHASE_INTRO);
- return;
- case EVENT_ANRAPHET_DESTROY:
- DoCastAOE(SPELL_DESTRUCTION_PROTOCOL);
- events.ScheduleEvent(EVENT_ANRAPHET_READY, 6s, 0, PHASE_INTRO);
- break;
- case EVENT_ANRAPHET_READY:
- me->SetUninteractible(false);
- events.SetPhase(PHASE_COMBAT);
- ScheduleCombatEvents();
- break;
- case EVENT_ANRAPHET_NEMESIS_STRIKE:
- DoCastVictim(SPELL_NEMESIS_STRIKE);
- events.ScheduleEvent(EVENT_ANRAPHET_NEMESIS_STRIKE, 21500ms, 0, PHASE_COMBAT);
- break;
- case EVENT_ANRAPHET_ALPHA_BEAMS:
- DoCast(me, SPELL_ALPHA_BEAMS);
- events.ScheduleEvent(EVENT_ANRAPHET_CRUMBLING_RUIN, 12500ms, 0, PHASE_COMBAT);
- events.ScheduleEvent(EVENT_ANRAPHET_ALPHA_BEAMS, 40s, 45s, 0, PHASE_COMBAT);
- break;
- case EVENT_ANRAPHET_OMEGA_STANCE:
- DoCast(me, SPELL_OMEGA_STANCE_SUMMON);
- DoCast(me, SPELL_OMEGA_STANCE);
- Talk(ANRAPHET_SAY_OMEGA_STANCE);
- events.ScheduleEvent(EVENT_ANRAPHET_OMEGA_STANCE, 45s, 50s, 0, PHASE_COMBAT);
- events.ScheduleEvent(EVENT_ANRAPHET_CRUMBLING_RUIN, 13s, 0, PHASE_COMBAT);
- break;
- case EVENT_ANRAPHET_CRUMBLING_RUIN:
- DoCast(me, SPELL_CRUMBLING_RUIN);
- break;
- }
- }
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetHallsOfOriginationAI<boss_anraphetAI>(creature);
- }
-};
-
-class npc_omega_stance : public CreatureScript
-{
- public:
- npc_omega_stance() : CreatureScript("npc_omega_stance") { }
-
- struct npc_omega_stanceAI : public ScriptedAI
- {
- npc_omega_stanceAI(Creature* creature) : ScriptedAI(creature) { }
-
- void IsSummonedBy(WorldObject* /*who*/) override
- {
- DoCast(me, SPELL_OMEGA_STANCE_SPIDER_TRIGGER, true);
- }
-
- void EnterEvadeMode(EvadeReason /*why*/) override { }
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetHallsOfOriginationAI<npc_omega_stanceAI>(creature);
- }
-};
-
-class npc_alpha_beam : public CreatureScript
-{
- public:
- npc_alpha_beam() : CreatureScript("npc_alpha_beam") { }
-
- struct npc_alpha_beamAI : public ScriptedAI
- {
- npc_alpha_beamAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
-
- void IsSummonedBy(WorldObject* /*summoner*/) override
- {
- if (Creature* anraphet = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_ANRAPHET_GUID)))
- anraphet->CastSpell(me, SPELL_ALPHA_BEAMS_BACK_CAST);
- }
-
- void EnterEvadeMode(EvadeReason /*why*/) override { } // Never evade
-
- private:
- InstanceScript* _instance;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetHallsOfOriginationAI<npc_alpha_beamAI>(creature);
- }
-};
-
-class npc_brann_bronzebeard_anraphet : public CreatureScript
-{
- public:
- npc_brann_bronzebeard_anraphet() : CreatureScript("npc_brann_bronzebeard_anraphet") { }
-
- struct npc_brann_bronzebeard_anraphetAI : public CreatureAI
- {
- npc_brann_bronzebeard_anraphetAI(Creature* creature) : CreatureAI(creature), _currentPoint(0), _instance(creature->GetInstanceScript()) { }
-
- bool OnGossipSelect(Player* /*player*/, uint32 menuId, uint32 action) override
- {
- if (_instance->GetBossState(DATA_VAULT_OF_LIGHTS) == DONE)
- return true;
-
- if (menuId == GOSSIP_MENU_START_INTRO && !action)
- {
- _instance->SetBossState(DATA_VAULT_OF_LIGHTS, IN_PROGRESS);
- _currentPoint = 0;
- events.Reset();
- me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
- me->SetWalk(true);
- Talk(BRANN_SAY_DOOR_INTRO);
- events.ScheduleEvent(EVENT_BRANN_UNLOCK_DOOR, 7500ms);
- }
- return false;
- }
-
- void DoAction(int32 action) override
- {
- switch (action)
- {
- case ACTION_ELEMENTAL_DIED:
- {
- uint32 dead = _instance->GetData(DATA_DEAD_ELEMENTALS);
- Talk(BRANN_1_ELEMENTAL_DEAD + dead - 1);
- if (dead == 4)
- {
- _instance->DoCastSpellOnPlayers(SPELL_VAULT_OF_LIGHTS_CREDIT);
- if (Creature* anraphet = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_ANRAPHET_GUID)))
- anraphet->AI()->DoAction(ACTION_ANRAPHET_INTRO);
- }
- break;
- }
- case ACTION_ANRAPHET_DIED:
- me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
- events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, 1s);
- break;
- }
- }
-
- void UpdateAI(uint32 diff) override
- {
- events.Update(diff);
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_BRANN_MOVE_INTRO:
- if (_currentPoint < MAX_BRANN_WAYPOINTS_INTRO)
- me->GetMotionMaster()->MovePoint(_currentPoint, BrannIntroWaypoint[_currentPoint]);
- break;
- case EVENT_BRANN_UNLOCK_DOOR:
- Talk(BRANN_SAY_UNLOCK_DOOR);
- _instance->SetBossState(DATA_VAULT_OF_LIGHTS, DONE);
- _instance->TriggerGameEvent(ACHIEV_VAULT_OF_LIGHTS_EVENT);
- events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, 3500ms);
- break;
- case EVENT_BRANN_THINK:
- Talk(BRANN_SAY_THINK);
- events.ScheduleEvent(EVENT_BRANN_SET_ORIENTATION_1, 6s);
- break;
- case EVENT_BRANN_SET_ORIENTATION_1:
- me->SetFacingTo(5.445427f);
- Talk(BRANN_SAY_MIRRORS);
- events.ScheduleEvent(EVENT_BRANN_SET_ORIENTATION_2, 1s);
- break;
- case EVENT_BRANN_SET_ORIENTATION_2:
- me->SetFacingTo(0.6283185f);
- events.ScheduleEvent(EVENT_BRANN_SET_ORIENTATION_3, 2500ms);
- break;
- case EVENT_BRANN_SET_ORIENTATION_3:
- me->SetFacingTo(0.01745329f);
- events.ScheduleEvent(EVENT_BRANN_SAY_ELEMENTALS, 200ms);
- break;
- case EVENT_BRANN_SAY_ELEMENTALS:
- Talk(BRANN_SAY_ELEMENTALS);
- events.ScheduleEvent(EVENT_BRANN_SAY_GET_IT, 3500ms);
- break;
- case EVENT_BRANN_SAY_GET_IT:
- Talk(BRANN_SAY_GET_IT);
- me->SetNpcFlag(UNIT_NPC_FLAG_GOSSIP);
- break;
- case EVENT_BRANN_SET_ORIENTATION_4:
- me->SetFacingTo(3.141593f);
- break;
- }
- }
- }
-
- void MovementInform(uint32 movementType, uint32 pointId) override
- {
- if (movementType != POINT_MOTION_TYPE)
- return;
-
- _currentPoint = pointId + 1;
- Milliseconds delay = 1ms;
-
- switch (pointId)
- {
- case 0:
- Talk(BRANN_SAY_TROGGS);
- events.ScheduleEvent(EVENT_BRANN_THINK, 15s);
- return;
- case 1:
- Talk(BRANN_SAY_ANRAPHET_DIED);
- delay = 1s;
- break;
- case 14:
- Talk(BRANN_SAY_MOMENT);
- delay = 2200ms;
- break;
- case 16:
- events.ScheduleEvent(EVENT_BRANN_SET_ORIENTATION_4, 6s);
- return;
- default:
- break;
- }
-
- events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, delay);
- }
-
- protected:
- EventMap events;
- uint32 _currentPoint;
- InstanceScript* _instance;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetHallsOfOriginationAI<npc_brann_bronzebeard_anraphetAI>(creature);
- }
-};
-
-class spell_anraphet_alpha_beams : public SpellScriptLoader
-{
-public:
- spell_anraphet_alpha_beams() : SpellScriptLoader("spell_anraphet_alpha_beams") { }
-
- class spell_anraphet_alpha_beams_SpellScript : public SpellScript
- {
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- if (targets.empty())
- return;
-
- WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
- targets.clear();
- targets.push_back(target);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_anraphet_alpha_beams_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_anraphet_alpha_beams_SpellScript();
- }
-};
-
-// 77106 - Omega Stance (Summon)
-class spell_anraphet_omega_stance_summon : public SpellScriptLoader
-{
-public:
- spell_anraphet_omega_stance_summon() : SpellScriptLoader("spell_anraphet_omega_stance_summon") { }
-
- class spell_anraphet_omega_stance_summon_SpellScript : public SpellScript
- {
- void SetDest(SpellDestination& dest)
- {
- dest.RelocateOffset({ 0.0f, 0.0f, 30.0f, 0.0f });
- }
-
- void Register() override
- {
- OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_anraphet_omega_stance_summon_SpellScript::SetDest, EFFECT_0, TARGET_DEST_DEST);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_anraphet_omega_stance_summon_SpellScript();
- }
-};
-
-// 77127 Omega Stance Spider Effect
-class spell_anraphet_omega_stance_spider_effect : public SpellScriptLoader
-{
-public:
- spell_anraphet_omega_stance_spider_effect() : SpellScriptLoader("spell_anraphet_omega_stance_spider_effect") { }
-
- class spell_anraphet_omega_stance_spider_effect_SpellScript : public SpellScript
- {
- void SetDest(SpellDestination& dest)
- {
- // Do our own calculations for the destination position.
- /// TODO: Remove this once we find a general rule for WorldObject::MovePosition (this spell shouldn't take the Z change into consideration)
- Unit* caster = GetCaster();
- float angle = rand_norm() * static_cast<float>(2 * M_PI);
- uint32 dist = caster->GetCombatReach() + GetSpellInfo()->GetEffect(EFFECT_0).CalcRadius(caster, SpellTargetIndex::TargetB) * rand_norm();
-
- float x = caster->GetPositionX() + dist * std::cos(angle);
- float y = caster->GetPositionY() + dist * std::sin(angle);
- float z = caster->GetMap()->GetHeight(caster->GetPhaseShift(), x, y, caster->GetPositionZ());
- float o = dest._position.GetOrientation();
-
- dest.Relocate({ x, y, z, o });
- }
-
- void Register() override
- {
- OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_anraphet_omega_stance_spider_effect_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_RANDOM);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_anraphet_omega_stance_spider_effect_SpellScript();
- }
-};
-
-void AddSC_boss_anraphet()
-{
- new boss_anraphet();
- new spell_anraphet_alpha_beams();
- new npc_brann_bronzebeard_anraphet();
- new npc_alpha_beam();
- new spell_anraphet_omega_stance_summon();
- new spell_anraphet_omega_stance_spider_effect();
- new npc_omega_stance();
-}
diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp
deleted file mode 100644
index 4e418e64bf3..00000000000
--- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ScriptMgr.h"
-#include "Containers.h"
-#include "halls_of_origination.h"
-#include "InstanceScript.h"
-#include "Map.h"
-#include "Player.h"
-#include "ScriptedCreature.h"
-#include "SpellAuraEffects.h"
-#include "SpellScript.h"
-#include "TemporarySummon.h"
-#include "Weather.h"
-
-enum Texts
-{
- SAY_AGGRO = 0,
- SAY_DEATH = 1,
-};
-
-enum Events
-{
- EVENT_RAGING_SMASH = 1,
- EVENT_FLAME_BOLT = 2,
- EVENT_EARTH_SPIKE = 3,
- EVENT_PTAH_EXPLODE = 4,
- EVENT_QUICKSAND = 5,
-};
-
-enum Spells
-{
- SPELL_RAGING_SMASH = 83650,
- SPELL_FLAME_BOLT = 77370,
- SPELL_EARTH_SPIKE_WARN = 94974,
-
- SPELL_PTAH_EXPLOSION = 75519,
- SPELL_SANDSTORM = 75491,
-
- SPELL_SUMMON_QUICKSAND = 75550, // Spell not in DBC, no SMSG_SPELL_START/GO for it
-
- SPELL_BEETLE_BURROW = 75463,
-
- SPELL_SUMMON_JEWELED_SCARAB = 75462,
- SPELL_SUMMON_DUSTBONE_HORROR = 75521,
-};
-
-enum Phases
-{
- PHASE_NORMAL = 1,
- PHASE_DISPERSE = 2,
-
- PHASE_MASK_DISPERSE = (1 << PHASE_DISPERSE),
- PHASE_MASK_NORMAL = (1 << PHASE_NORMAL),
-};
-
-enum PtahData
-{
- DATA_SUMMON_DEATHS = 0
-};
-
-class SummonScarab : public BasicEvent
-{
-public:
- SummonScarab(Unit* owner, InstanceScript* instance) : _owner(owner), _instance(instance) { }
-
- bool Execute(uint64 /*execTime*/, uint32 /*diff*/) override
- {
- if (!_instance || _instance->GetBossState(DATA_EARTHRAGER_PTAH) != IN_PROGRESS)
- return true; // delete event
-
- _owner->CastSpell(_owner, SPELL_SUMMON_JEWELED_SCARAB);
- _owner->RemoveAurasDueToSpell(SPELL_BEETLE_BURROW);
- return true;
- }
-protected:
- Unit* _owner;
- InstanceScript* _instance;
-};
-
-class boss_earthrager_ptah : public CreatureScript
-{
-public:
- boss_earthrager_ptah() : CreatureScript("boss_earthrager_ptah") { }
-
- struct boss_earthrager_ptahAI : public BossAI
- {
- boss_earthrager_ptahAI(Creature* creature) : BossAI(creature, DATA_EARTHRAGER_PTAH), _summonDeaths(0), _hasDispersed(false) { }
-
- void Cleanup()
- {
- std::list<Creature*> units;
-
- GetCreatureListWithEntryInGrid(units, me, NPC_DUSTBONE_HORROR, 100.0f);
- for (std::list<Creature*>::iterator itr = units.begin(); itr != units.end(); ++itr)
- (*itr)->DespawnOrUnsummon();
-
- units.clear();
- GetCreatureListWithEntryInGrid(units, me, NPC_JEWELED_SCARAB, 100.0f);
- for (std::list<Creature*>::iterator itr = units.begin(); itr != units.end(); ++itr)
- (*itr)->DespawnOrUnsummon();
- }
-
- void Reset() override
- {
- me->SetCanMelee(true);
- _summonDeaths = 0;
- _hasDispersed = false;
- Cleanup();
- _Reset();
- events.SetPhase(PHASE_NORMAL);
- events.ScheduleEvent(EVENT_RAGING_SMASH, 7s, 12s, 0, PHASE_NORMAL);
- events.ScheduleEvent(EVENT_FLAME_BOLT, 15s, 0, PHASE_NORMAL);
- events.ScheduleEvent(EVENT_EARTH_SPIKE, 16s, 21s, 0, PHASE_NORMAL);
- }
-
- void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
- {
- if (me->HealthBelowPctDamaged(50, damage) && (events.GetPhaseMask() & PHASE_MASK_NORMAL) && !_hasDispersed)
- {
- events.SetPhase(PHASE_DISPERSE);
- _hasDispersed = true;
-
- me->AttackStop();
- me->SetCanMelee(false);
- DoCast(me, SPELL_SANDSTORM);
- me->GetMap()->SetZoneWeather(AREA_TOMB_OF_THE_EARTHRAGER, WEATHER_STATE_LIGHT_SANDSTORM, 1.0f);
- events.ScheduleEvent(EVENT_PTAH_EXPLODE, 6s, 0, PHASE_DISPERSE);
- events.ScheduleEvent(EVENT_QUICKSAND, 10s, 0, PHASE_DISPERSE);
-
- std::list<Creature*> stalkers;
- GetCreatureListWithEntryInGrid(stalkers, me, NPC_BEETLE_STALKER, 100.0f);
- std::list<Creature*> beetlers = stalkers;
-
- Trinity::Containers::RandomResize(beetlers, 9); // Holds the summoners of Jeweled Scarab
-
- for (std::list<Creature*>::iterator itr = beetlers.begin(); itr != beetlers.end(); ++itr)
- {
- stalkers.remove((*itr)); // Remove it to prevent a single trigger from spawning multiple npcs.
- (*itr)->CastSpell((*itr), SPELL_BEETLE_BURROW); // Cast visual
- // Summon after 5 seconds.
- (*itr)->m_Events.AddEventAtOffset(new SummonScarab((*itr), instance), 5s);
- }
-
- Trinity::Containers::RandomResize(stalkers, 2); // Holds the summoners of Dustbone Horror
-
- for (std::list<Creature*>::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr)
- (*itr)->CastSpell((*itr), SPELL_SUMMON_DUSTBONE_HORROR);
- }
- }
-
- void SetData(uint32 index, uint32 /*value*/) override
- {
- if (index == DATA_SUMMON_DEATHS)
- {
- ++_summonDeaths;
- if (_summonDeaths == 11) // All summons died
- {
- me->GetMap()->SetZoneWeather(AREA_TOMB_OF_THE_EARTHRAGER, WEATHER_STATE_FOG, 0.0f);
- me->RemoveAurasDueToSpell(SPELL_PTAH_EXPLOSION);
- me->SetCanMelee(true);
- events.SetPhase(PHASE_NORMAL);
- events.ScheduleEvent(EVENT_RAGING_SMASH, 7s, 12s, 0, PHASE_NORMAL);
- events.ScheduleEvent(EVENT_FLAME_BOLT, 15s, 0, PHASE_NORMAL);
- events.ScheduleEvent(EVENT_EARTH_SPIKE, 16s, 21s, 0, PHASE_NORMAL);
- }
- }
- }
-
- void JustEngagedWith(Unit* who) override
- {
- instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
- Talk(SAY_AGGRO);
- BossAI::JustEngagedWith(who);
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
- Talk(SAY_DEATH);
- _JustDied();
- Cleanup();
- }
-
- void JustReachedHome() override
- {
- instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
- _JustReachedHome();
- instance->SetBossState(DATA_EARTHRAGER_PTAH, FAIL);
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim() || !CheckInRoom())
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_RAGING_SMASH:
- DoCastVictim(SPELL_RAGING_SMASH);
- events.ScheduleEvent(EVENT_RAGING_SMASH, 7s, 12s, 0, PHASE_NORMAL);
- break;
- case EVENT_FLAME_BOLT:
- DoCast(me, SPELL_FLAME_BOLT);
- events.ScheduleEvent(EVENT_FLAME_BOLT, 15s, 0, PHASE_NORMAL);
- break;
- case EVENT_EARTH_SPIKE:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
- DoCast(target, SPELL_EARTH_SPIKE_WARN);
- events.ScheduleEvent(EVENT_EARTH_SPIKE, 16s, 21s, 0, PHASE_NORMAL);
- break;
- case EVENT_PTAH_EXPLODE:
- DoCast(me, SPELL_PTAH_EXPLOSION);
- break;
- case EVENT_QUICKSAND:
- // Spell not in DBC, it is not cast either, according to sniffs
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
- if (Creature* quicksand = me->SummonCreature(NPC_QUICKSAND, *target))
- quicksand->SetCreatedBySpell(SPELL_SUMMON_QUICKSAND);
- events.ScheduleEvent(EVENT_QUICKSAND, 10s, 0, PHASE_DISPERSE);
- break;
- }
- }
- }
-
- protected:
- uint8 _summonDeaths;
- bool _hasDispersed;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetHallsOfOriginationAI<boss_earthrager_ptahAI>(creature);
- }
-};
-
-class spell_earthrager_ptah_flame_bolt : public SpellScriptLoader
-{
- public:
- spell_earthrager_ptah_flame_bolt() : SpellScriptLoader("spell_earthrager_ptah_flame_bolt") { }
-
- class spell_earthrager_ptah_flame_bolt_SpellScript : public SpellScript
- {
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- Trinity::Containers::RandomResize(targets, GetCaster()->GetMap()->IsHeroic() ? 3 : 2);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_earthrager_ptah_flame_bolt_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_earthrager_ptah_flame_bolt_SpellScript();
- }
-};
-
-class spell_earthrager_ptah_explosion : public SpellScriptLoader
-{
-public:
- spell_earthrager_ptah_explosion() : SpellScriptLoader("spell_earthrager_ptah_explosion") { }
-
- class spell_earthrager_ptah_explosion_AuraScript : public AuraScript
- {
- void SetFlags(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (Unit* ptah = GetCaster())
- {
- ptah->SetUninteractible(true);
- ptah->SetUnitFlag(UNIT_FLAG_PREVENT_EMOTES_FROM_CHAT_TEXT);
- ptah->SetUnitFlag2(UNIT_FLAG2_FEIGN_DEATH);
- }
- }
-
- void RemoveFlags(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (Unit* ptah = GetCaster())
- {
- ptah->SetUninteractible(false);
- ptah->RemoveUnitFlag(UNIT_FLAG_PREVENT_EMOTES_FROM_CHAT_TEXT);
- ptah->RemoveUnitFlag2(UNIT_FLAG2_FEIGN_DEATH);
- }
- }
-
- void Register() override
- {
- OnEffectApply += AuraEffectApplyFn(spell_earthrager_ptah_explosion_AuraScript::SetFlags, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- OnEffectRemove += AuraEffectRemoveFn(spell_earthrager_ptah_explosion_AuraScript::RemoveFlags, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
- };
-
- AuraScript* GetAuraScript() const override
- {
- return new spell_earthrager_ptah_explosion_AuraScript();
- }
-};
-
-void AddSC_boss_earthrager_ptah()
-{
- new boss_earthrager_ptah();
- new spell_earthrager_ptah_flame_bolt();
- new spell_earthrager_ptah_explosion();
-}
diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp
deleted file mode 100644
index 2552ff7cd89..00000000000
--- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ScriptMgr.h"
-#include "GridNotifiers.h"
-#include "halls_of_origination.h"
-#include "InstanceScript.h"
-#include "ObjectAccessor.h"
-#include "Player.h"
-#include "ScriptedCreature.h"
-#include "SpellAuraEffects.h"
-#include "SpellScript.h"
-
-enum Texts
-{
- SAY_AGGRO = 0,
- SAY_SHIELD = 1,
- EMOTE_SHIELD = 2,
- EMOTE_UNSHIELD = 3,
- SAY_KILL = 4,
- SAY_DEATH = 5
-};
-
-enum Events
-{
- EVENT_DIVINE_RECKONING = 1,
- EVENT_BURNING_LIGHT = 2,
- EVENT_SEAR = 3,
-};
-
-enum Spells
-{
- SPELL_DIVINE_RECKONING = 75592,
- SPELL_BURNING_LIGHT = 75115,
- SPELL_REVERBERATING_HYMN = 75322,
- SPELL_SHIELD_OF_LIGHT = 74938,
-
- SPELL_ACTIVATE_BEACONS = 76599,
- SPELL_TELEPORT = 74969,
-
- SPELL_SHIELD_VISUAL_RIGHT = 83698,
- SPELL_BEAM_OF_LIGHT_RIGHT = 76573,
-
- SPELL_SHIELD_VISUAL_LEFT = 83697,
- SPELL_BEAM_OF_LIGHT_LEFT = 74930,
-
- SPELL_SEARING_LIGHT = 75194,
-};
-
-enum Phases
-{
- PHASE_SHIELDED = 0,
- PHASE_FIRST_SHIELD = 1, // Ready to be shielded for the first time
- PHASE_SECOND_SHIELD = 2, // First shield already happened, ready to be shielded a second time
- PHASE_FINAL = 3 // Already shielded twice, ready to finish the encounter normally.
-};
-
-enum Actions
-{
- ACTION_DISABLE_BEACON,
-};
-
-class boss_temple_guardian_anhuur : public CreatureScript
-{
-public:
- boss_temple_guardian_anhuur() : CreatureScript("boss_temple_guardian_anhuur") { }
-
- struct boss_temple_guardian_anhuurAI : public BossAI
- {
- boss_temple_guardian_anhuurAI(Creature* creature) : BossAI(creature, DATA_TEMPLE_GUARDIAN_ANHUUR)
- {
- Initialize();
- }
-
- void Initialize()
- {
- _phase = PHASE_FIRST_SHIELD;
- _oldPhase = PHASE_FIRST_SHIELD;
- _beacons = 0;
- }
-
- void CleanStalkers()
- {
- std::list<Creature*> stalkers;
- GetCreatureListWithEntryInGrid(stalkers, me, NPC_CAVE_IN_STALKER, 100.0f);
- for (std::list<Creature*>::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr)
- {
- (*itr)->RemoveAurasDueToSpell(SPELL_BEAM_OF_LIGHT_RIGHT);
- (*itr)->RemoveAurasDueToSpell(SPELL_BEAM_OF_LIGHT_LEFT);
- }
- }
-
- void Reset() override
- {
- Initialize();
- _Reset();
- CleanStalkers();
- me->RemoveAurasDueToSpell(SPELL_SHIELD_OF_LIGHT);
- events.ScheduleEvent(EVENT_DIVINE_RECKONING, 10s, 12s);
- events.ScheduleEvent(EVENT_BURNING_LIGHT, 12s);
- }
-
- void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
- {
- if ((me->HealthBelowPctDamaged(66, damage) && _phase == PHASE_FIRST_SHIELD) ||
- (me->HealthBelowPctDamaged(33, damage) && _phase == PHASE_SECOND_SHIELD))
- {
- _beacons = 2;
- _phase++; // Increase the phase
- _oldPhase = _phase;
-
- _phase = PHASE_SHIELDED;
-
- me->InterruptNonMeleeSpells(true);
- me->AttackStop();
- DoCast(me, SPELL_TELEPORT);
-
- DoCast(me, SPELL_SHIELD_OF_LIGHT);
-
- DoCastAOE(SPELL_ACTIVATE_BEACONS);
-
- GameObject* door = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_ANHUUR_DOOR));
- if (door)
- {
- std::list<Creature*> stalkers;
- GetCreatureListWithEntryInGrid(stalkers, me, NPC_CAVE_IN_STALKER, 100.0f);
-
- stalkers.remove_if(Trinity::HeightDifferenceCheck(door, 0.0f, false)); // Target only the bottom ones
- for (std::list<Creature*>::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr)
- {
- if ((*itr)->GetPositionX() > door->GetPositionX())
- {
- (*itr)->CastSpell((*itr), SPELL_SHIELD_VISUAL_LEFT, true);
- (*itr)->CastSpell((*itr), SPELL_BEAM_OF_LIGHT_LEFT, true);
- }
- else
- {
- (*itr)->CastSpell((*itr), SPELL_SHIELD_VISUAL_RIGHT, true);
- (*itr)->CastSpell((*itr), SPELL_BEAM_OF_LIGHT_RIGHT, true);
- }
- }
- }
-
- DoCast(me, SPELL_REVERBERATING_HYMN);
-
- Talk(EMOTE_SHIELD);
- Talk(SAY_SHIELD);
- }
- }
-
- void DoAction(int32 action) override
- {
- if (action == ACTION_DISABLE_BEACON)
- {
- --_beacons;
- if (!_beacons)
- {
- me->RemoveAurasDueToSpell(SPELL_SHIELD_OF_LIGHT);
- Talk(EMOTE_UNSHIELD);
- _phase = _oldPhase;
- }
- }
- }
-
- void JustEngagedWith(Unit* who) override
- {
- instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
- Talk(SAY_AGGRO);
- BossAI::JustEngagedWith(who);
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
- Talk(SAY_DEATH);
- _JustDied();
- }
-
- void KilledUnit(Unit* victim) override
- {
- if (victim->GetTypeId() == TYPEID_PLAYER)
- Talk(SAY_KILL);
- }
-
- void JustReachedHome() override
- {
- instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
- _JustReachedHome();
- instance->SetBossState(DATA_TEMPLE_GUARDIAN_ANHUUR, FAIL);
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim() || !CheckInRoom() || me->GetCurrentSpell(CURRENT_CHANNELED_SPELL) || _phase == PHASE_SHIELDED)
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_DIVINE_RECKONING:
- DoCastVictim(SPELL_DIVINE_RECKONING);
- events.ScheduleEvent(EVENT_DIVINE_RECKONING, 10s, 12s);
- break;
- case EVENT_BURNING_LIGHT:
- {
- Unit* unit = SelectTarget(SelectTargetMethod::Random, 0, NonTankTargetSelector(me));
- if (!unit)
- unit = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true);
- DoCast(unit, SPELL_BURNING_LIGHT);
- events.ScheduleEvent(EVENT_SEAR, 2s);
- events.ScheduleEvent(EVENT_BURNING_LIGHT, 12s);
- break;
- }
- case EVENT_SEAR:
- {
- Unit* target = me->FindNearestCreature(NPC_SEARING_LIGHT, 100.0f);
- if (!target)
- break;
-
- std::list<Creature*> stalkers;
- GetCreatureListWithEntryInGrid(stalkers, me, NPC_CAVE_IN_STALKER, 100.0f);
- stalkers.remove_if(Trinity::HeightDifferenceCheck(ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_ANHUUR_DOOR)), 5.0f, true));
-
- if (stalkers.empty())
- break;
-
- stalkers.sort(Trinity::ObjectDistanceOrderPred(target));
-
- // Get the closest statue face (any of its eyes)
- Creature* eye1 = stalkers.front();
- stalkers.remove(eye1); // Remove the eye.
- stalkers.sort(Trinity::ObjectDistanceOrderPred(eye1)); // Find the second eye.
- Creature* eye2 = stalkers.front();
-
- eye1->CastSpell(eye1, SPELL_SEARING_LIGHT, true);
- eye2->CastSpell(eye2, SPELL_SEARING_LIGHT, true);
- break;
- }
- }
- }
- }
-
- private:
- uint8 _phase;
- uint8 _oldPhase;
- uint8 _beacons;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetHallsOfOriginationAI<boss_temple_guardian_anhuurAI>(creature);
- }
-};
-
-class spell_anhuur_shield_of_light : public SpellScriptLoader
-{
- public:
- spell_anhuur_shield_of_light() : SpellScriptLoader("spell_anhuur_shield_of_light") { }
-
- class spell_anhuur_shield_of_light_SpellScript : public SpellScript
- {
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- if (InstanceScript* const script = GetCaster()->GetInstanceScript())
- {
- if (GameObject* go = ObjectAccessor::GetGameObject(*GetCaster(), script->GetGuidData(DATA_ANHUUR_DOOR)))
- {
- targets.remove_if(Trinity::HeightDifferenceCheck(go, 5.0f, false));
- targets.remove(GetCaster());
- targets.sort(Trinity::ObjectDistanceOrderPred(GetCaster()));
- targets.resize(2);
- }
- }
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_anhuur_shield_of_light_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENTRY);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_anhuur_shield_of_light_SpellScript();
- }
-};
-
-class spell_anhuur_disable_beacon_beams : public SpellScriptLoader
-{
- public:
- spell_anhuur_disable_beacon_beams() : SpellScriptLoader("spell_anhuur_disable_beacon_beams") { }
-
- class spell_anhuur_disable_beacon_beams_SpellScript : public SpellScript
- {
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- GetHitUnit()->RemoveAurasDueToSpell(GetEffectValue());
- }
-
- void Notify(SpellEffIndex /*index*/)
- {
- GameObject* caster = GetGObjCaster();
- if (!caster)
- return;
-
- if (InstanceScript* instance = caster->GetInstanceScript())
- if (Creature* anhuur = instance->GetCreature(DATA_TEMPLE_GUARDIAN_ANHUUR))
- if (CreatureAI* ai = anhuur->AI())
- ai->DoAction(ACTION_DISABLE_BEACON);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_anhuur_disable_beacon_beams_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- OnEffectHit += SpellEffectFn(spell_anhuur_disable_beacon_beams_SpellScript::Notify, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_anhuur_disable_beacon_beams_SpellScript();
- }
-};
-
-class spell_anhuur_divine_reckoning : public SpellScriptLoader
-{
-public:
- spell_anhuur_divine_reckoning() : SpellScriptLoader("spell_anhuur_divine_reckoning") { }
-
- class spell_anhuur_divine_reckoning_AuraScript : public AuraScript
- {
- void OnPeriodic(AuraEffect const* aurEff)
- {
- if (Unit* caster = GetCaster())
- {
- CastSpellExtraArgs args;
- args.AddSpellMod(SPELLVALUE_BASE_POINT0, aurEff->GetAmount());
- caster->CastSpell(GetTarget(), aurEff->GetSpellEffectInfo().TriggerSpell, args);
- }
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_anhuur_divine_reckoning_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- }
- };
-
- AuraScript* GetAuraScript() const override
- {
- return new spell_anhuur_divine_reckoning_AuraScript();
- }
-};
-
-void AddSC_boss_temple_guardian_anhuur()
-{
- new boss_temple_guardian_anhuur();
- new spell_anhuur_shield_of_light();
- new spell_anhuur_disable_beacon_beams();
- new spell_anhuur_divine_reckoning();
-}
diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h
deleted file mode 100644
index e8eb243c79e..00000000000
--- a/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef HALLS_OF_ORIGINATION_H
-#define HALLS_OF_ORIGINATION_H
-
-#include "CreatureAIImpl.h"
-
-#define DataHeader "HOO"
-#define HoOScriptName "instance_halls_of_origination"
-
-uint32 const EncounterCount = 12;
-
-enum HOOData
-{
- // Bosses
- DATA_TEMPLE_GUARDIAN_ANHUUR,
- DATA_EARTHRAGER_PTAH,
- DATA_VAULT_OF_LIGHTS,
- DATA_FIRE_WARDEN,
- DATA_EARTH_WARDEN,
- DATA_WATER_WARDEN,
- DATA_AIR_WARDEN,
- DATA_ANRAPHET,
- DATA_ISISET,
- DATA_AMMUNAE,
- DATA_SETESH,
- DATA_RAJH,
-
- // Temple Guardian Anhuur
- DATA_ANHUUR_GUID,
- DATA_ANHUUR_LEFT_BEACON,
- DATA_ANHUUR_RIGHT_BEACON,
- DATA_ANHUUR_BRIDGE,
- DATA_ANHUUR_DOOR,
-
- // Anraphet
- DATA_BRANN_0_GUID,
- DATA_DEAD_ELEMENTALS,
- DATA_ANRAPHET_GUID,
-};
-
-enum HOOCreatures
-{
- BOSS_TEMPLE_GUARDIAN_ANHUUR = 39425,
- NPC_CAVE_IN_STALKER = 40183,
- NPC_SEARING_LIGHT = 40283,
-
- BOSS_EARTHRAGER_PTAH = 39428,
- NPC_BEETLE_STALKER = 40459, // Summons both Jeweled Scarab and Dustbone Horror
- NPC_JEWELED_SCARAB = 40458,
- NPC_DUSTBONE_HORROR = 40450,
- NPC_QUICKSAND = 40503, // Summoned by a spell not in dbc (75550)
-
- BOSS_ANRAPHET = 39788,
- NPC_FIRE_WARDEN = 39800,
- NPC_EARTH_WARDEN = 39801,
- NPC_WATER_WARDEN = 39802,
- NPC_AIR_WARDEN = 39803,
-
- WARDEN_ENTRY_DATA_DELTA = NPC_FIRE_WARDEN - uint8(DATA_FIRE_WARDEN),
-
- NPC_BRANN_BRONZEBEARD_0 = 39908,
- NPC_OMEGA_STANCE = 41194,
-};
-
-enum HOOGameObjects
-{
- GO_ANHUURS_BRIDGE = 206506,
- GO_DOODAD_ULDUM_ELEVATOR_COL01 = 207725,
- GO_ANHUURS_DOOR = 202307,
- GO_ANHUURS_RIGHT_BEACON = 203136,
- GO_ANHUURS_LEFT_BEACON = 203133,
-
- GO_VAULT_OF_LIGHTS_DOOR = 202313,
- GO_SUN_MIRROR = 207726,
- GO_ANRAPHET_DOOR = 202314,
-
- GO_DOODAD_ULDUM_LIGHTMACHINE_01 = 207375,
- GO_DOODAD_ULDUM_LIGHTMACHINE_02 = 207374,
- GO_DOODAD_ULDUM_LIGHTMACHINE_03 = 207377,
- GO_DOODAD_ULDUM_LIGHTMACHINE_04 = 207376,
-
- GO_DOODAD_ULDUM_LASERBEAMS01 = 207662, // Matches GO_DOODAD_ULDUM_LIGHTMACHINE_02
- GO_DOODAD_ULDUM_LASERBEAMS_01 = 207663, // Matches GO_DOODAD_ULDUM_LIGHTMACHINE_01
- GO_DOODAD_ULDUM_LASERBEAMS_02 = 207664, // Matches GO_DOODAD_ULDUM_LIGHTMACHINE_04
- GO_DOODAD_ULDUM_LASERBEAMS_03 = 207665, // Matches GO_DOODAD_ULDUM_LIGHTMACHINE_03
-};
-
-enum HOOMisc
-{
- AREA_TOMB_OF_THE_EARTHRAGER = 4945,
- ACHIEV_VAULT_OF_LIGHTS_EVENT = 24212, // Faster Than The Speed Of Light
- SPELL_VAULT_OF_LIGHTS_CREDIT = 94067, // Not in DBC
-};
-
-enum HOOGlobalActions
-{
- ACTION_ANRAPHET_INTRO,
- ACTION_ELEMENTAL_DIED,
- ACTION_ANRAPHET_DIED,
- ACTION_OMEGA_TRIGGER,
-};
-
-template<typename AI>
-inline AI* GetHallsOfOriginationAI(Creature* creature)
-{
- return GetInstanceAI<AI>(creature, HoOScriptName);
-}
-
-#endif // HALLS_OF_ORIGINATION_H
diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp
deleted file mode 100644
index f77d814f3df..00000000000
--- a/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ScriptMgr.h"
-#include "Creature.h"
-#include "CreatureAI.h"
-#include "GameObject.h"
-#include "halls_of_origination.h"
-#include "InstanceScript.h"
-#include "Map.h"
-
-DoorData const doorData[] =
-{
- {GO_ANHUURS_DOOR, DATA_TEMPLE_GUARDIAN_ANHUUR, EncounterDoorBehavior::OpenWhenDone },
- {GO_ANHUURS_BRIDGE, DATA_TEMPLE_GUARDIAN_ANHUUR, EncounterDoorBehavior::OpenWhenDone },
- {GO_DOODAD_ULDUM_ELEVATOR_COL01, DATA_TEMPLE_GUARDIAN_ANHUUR, EncounterDoorBehavior::OpenWhenDone },
- {GO_VAULT_OF_LIGHTS_DOOR, DATA_VAULT_OF_LIGHTS, EncounterDoorBehavior::OpenWhenDone },
- {GO_DOODAD_ULDUM_LIGHTMACHINE_02, DATA_EARTH_WARDEN, EncounterDoorBehavior::OpenWhenDone },
- {GO_DOODAD_ULDUM_LASERBEAMS01, DATA_EARTH_WARDEN, EncounterDoorBehavior::OpenWhenDone },
- {GO_DOODAD_ULDUM_LIGHTMACHINE_01, DATA_FIRE_WARDEN, EncounterDoorBehavior::OpenWhenDone },
- {GO_DOODAD_ULDUM_LASERBEAMS_01, DATA_FIRE_WARDEN, EncounterDoorBehavior::OpenWhenDone },
- {GO_DOODAD_ULDUM_LIGHTMACHINE_03, DATA_WATER_WARDEN, EncounterDoorBehavior::OpenWhenDone },
- {GO_DOODAD_ULDUM_LASERBEAMS_03, DATA_WATER_WARDEN, EncounterDoorBehavior::OpenWhenDone },
- {GO_DOODAD_ULDUM_LIGHTMACHINE_04, DATA_AIR_WARDEN, EncounterDoorBehavior::OpenWhenDone },
- {GO_DOODAD_ULDUM_LASERBEAMS_02, DATA_AIR_WARDEN, EncounterDoorBehavior::OpenWhenDone },
- {0, 0, EncounterDoorBehavior::OpenWhenNotInProgress }
-};
-
-DungeonEncounterData const encounters[] =
-{
- { DATA_TEMPLE_GUARDIAN_ANHUUR, {{ 1080 }} },
- { DATA_EARTHRAGER_PTAH, {{ 1076 }} },
- { DATA_ANRAPHET, {{ 1075 }} },
- { DATA_ISISET, {{ 1077 }} },
- { DATA_AMMUNAE, {{ 1074 }} },
- { DATA_SETESH, {{ 1079 }} },
- { DATA_RAJH, {{ 1078 }} }
-};
-
-class instance_halls_of_origination : public InstanceMapScript
-{
- public:
- instance_halls_of_origination() : InstanceMapScript(HoOScriptName, 644) { }
-
- struct instance_halls_of_origination_InstanceMapScript : public InstanceScript
- {
- instance_halls_of_origination_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
- {
- SetHeaders(DataHeader);
- SetBossNumber(EncounterCount);
- LoadDoorData(doorData);
- LoadDungeonEncounterData(encounters);
- _deadElementals = 0;
- }
-
- void OnGameObjectCreate(GameObject* go) override
- {
- switch (go->GetEntry())
- {
- case GO_ANHUURS_BRIDGE:
- AnhuursBridgeGUID = go->GetGUID();
- [[fallthrough]];
- case GO_DOODAD_ULDUM_ELEVATOR_COL01:
- case GO_VAULT_OF_LIGHTS_DOOR:
- case GO_DOODAD_ULDUM_LIGHTMACHINE_01:
- case GO_DOODAD_ULDUM_LIGHTMACHINE_02:
- case GO_DOODAD_ULDUM_LIGHTMACHINE_03:
- case GO_DOODAD_ULDUM_LIGHTMACHINE_04:
- case GO_DOODAD_ULDUM_LASERBEAMS01:
- case GO_DOODAD_ULDUM_LASERBEAMS_01:
- case GO_DOODAD_ULDUM_LASERBEAMS_02:
- case GO_DOODAD_ULDUM_LASERBEAMS_03:
- AddDoor(go, true);
- break;
- case GO_ANHUURS_DOOR:
- AnhuursDoorGUID = go->GetGUID();
- AddDoor(go, true);
- break;
- case GO_ANHUURS_RIGHT_BEACON:
- AnhuurRightBeaconGUID = go->GetGUID();
- break;
- case GO_ANHUURS_LEFT_BEACON:
- AnhuurLeftBeaconGUID = go->GetGUID();
- break;
- case GO_SUN_MIRROR:
- SunMirrorGUID = go->GetGUID();
- break;
- case GO_ANRAPHET_DOOR:
- AnraphetDoorGUID = go->GetGUID();
- break;
- }
- }
-
- void OnGameObjectRemove(GameObject* go) override
- {
- switch (go->GetEntry())
- {
- case GO_ANHUURS_BRIDGE:
- case GO_DOODAD_ULDUM_ELEVATOR_COL01:
- case GO_ANHUURS_DOOR:
- case GO_VAULT_OF_LIGHTS_DOOR:
- case GO_DOODAD_ULDUM_LIGHTMACHINE_01:
- case GO_DOODAD_ULDUM_LIGHTMACHINE_02:
- case GO_DOODAD_ULDUM_LIGHTMACHINE_03:
- case GO_DOODAD_ULDUM_LIGHTMACHINE_04:
- case GO_DOODAD_ULDUM_LASERBEAMS01:
- case GO_DOODAD_ULDUM_LASERBEAMS_01:
- case GO_DOODAD_ULDUM_LASERBEAMS_02:
- case GO_DOODAD_ULDUM_LASERBEAMS_03:
- AddDoor(go, false);
- break;
- }
- }
-
- void OnCreatureCreate(Creature* creature) override
- {
- switch (creature->GetEntry())
- {
- case BOSS_TEMPLE_GUARDIAN_ANHUUR:
- TempleGuardianAnhuurGUID = creature->GetGUID();
- break;
- case NPC_BRANN_BRONZEBEARD_0:
- BrannBronzebeardGUID = creature->GetGUID();
- break;
- case BOSS_ANRAPHET:
- AnraphetGUID = creature->GetGUID();
- break;
- }
- }
-
- uint32 GetData(uint32 data) const override
- {
- switch (data)
- {
- case DATA_DEAD_ELEMENTALS:
- return _deadElementals;
- default:
- break;
- }
-
- return 0;
- }
-
- ObjectGuid GetGuidData(uint32 index) const override
- {
- switch (index)
- {
- case DATA_ANHUUR_BRIDGE:
- return AnhuursBridgeGUID;
- case DATA_ANHUUR_DOOR:
- return AnhuursDoorGUID;
- case DATA_ANHUUR_LEFT_BEACON:
- return AnhuurLeftBeaconGUID;
- case DATA_ANHUUR_RIGHT_BEACON:
- return AnhuurRightBeaconGUID;
- case DATA_ANHUUR_GUID:
- return TempleGuardianAnhuurGUID;
- case DATA_BRANN_0_GUID:
- return BrannBronzebeardGUID;
- case DATA_ANRAPHET_GUID:
- return AnraphetGUID;
- }
-
- return ObjectGuid::Empty;
- }
-
- void IncreaseDeadElementals(uint32 inc)
- {
- _deadElementals += inc;
- if (_deadElementals == 4)
- {
- if (GameObject* mirror = instance->GetGameObject(SunMirrorGUID))
- mirror->SetGoState(GO_STATE_ACTIVE);
- if (GameObject* door = instance->GetGameObject(AnraphetDoorGUID))
- door->SetGoState(GO_STATE_ACTIVE);
- }
- }
-
- void OnUnitDeath(Unit* unit) override
- {
- Creature* creature = unit->ToCreature();
- if (!creature)
- return;
-
- switch (creature->GetEntry())
- {
- case NPC_FIRE_WARDEN:
- case NPC_EARTH_WARDEN:
- case NPC_WATER_WARDEN:
- case NPC_AIR_WARDEN:
- uint32 data = creature->GetEntry() - WARDEN_ENTRY_DATA_DELTA;
- SetBossState(data, IN_PROGRESS); // Needs to be set to IN_PROGRESS or else the gameobjects state won't be updated
- SetBossState(data, DONE);
- IncreaseDeadElementals(1);
- if (Creature* brann = instance->GetCreature(BrannBronzebeardGUID))
- brann->AI()->DoAction(ACTION_ELEMENTAL_DIED);
- break;
- }
- }
-
- void AfterDataLoad() override
- {
- if (GetBossState(BOSS_ANRAPHET) == DONE)
- IncreaseDeadElementals(4);
- }
-
- protected:
- ObjectGuid TempleGuardianAnhuurGUID;
- ObjectGuid AnhuursBridgeGUID;
- ObjectGuid AnhuursDoorGUID;
- ObjectGuid AnhuurRightBeaconGUID;
- ObjectGuid AnhuurLeftBeaconGUID;
- ObjectGuid BrannBronzebeardGUID;
- ObjectGuid AnraphetGUID;
- ObjectGuid AnraphetDoorGUID;
- ObjectGuid SunMirrorGUID;
- uint32 _deadElementals;
- };
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const override
- {
- return new instance_halls_of_origination_InstanceMapScript(map);
- }
-};
-
-void AddSC_instance_halls_of_origination()
-{
- new instance_halls_of_origination();
-}
diff --git a/src/server/scripts/Kalimdor/LostCityOfTheTolvir/boss_general_husam.cpp b/src/server/scripts/Kalimdor/LostCityOfTheTolvir/boss_general_husam.cpp
deleted file mode 100644
index a14b42f3d75..00000000000
--- a/src/server/scripts/Kalimdor/LostCityOfTheTolvir/boss_general_husam.cpp
+++ /dev/null
@@ -1,547 +0,0 @@
-/*
-* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
-*
-* 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "ScriptMgr.h"
-#include "Containers.h"
-#include "InstanceScript.h"
-#include "lost_city_of_the_tolvir.h"
-#include "MoveSplineInit.h"
-#include "MotionMaster.h"
-#include "PassiveAI.h"
-#include "ScriptedCreature.h"
-#include "SpellInfo.h"
-#include "SpellScript.h"
-#include "TemporarySummon.h"
-#include "Vehicle.h"
-
-enum HusamSpells
-{
- // General Husam
- SPELL_HAMMER_FIST = 83654,
- SPELL_SHOCKWAVE = 83445,
- SPELL_SHOCKWAVE_VISUAL = 83130,
- SPELL_SUMMON_SHOCKWAVE_TARGET_N = 83131,
- SPELL_SUMMON_SHOCKWAVE_TARGET_S = 83132,
- SPELL_SUMMON_SHOCKWAVE_TARGET_E = 83133,
- SPELL_SUMMON_SHOCKWAVE_TARGET_W = 83134,
- SPELL_MYSTIC_TRAP = 83644,
- SPELL_THROW_LAND_MINES = 83122,
- SPELL_DETONATE_TRAPS = 91263,
- SPELL_BAD_INTENTIONS = 83113,
- SPELL_HURL = 83236,
- SPELL_THROW_VISUAL = 83371,
-
- // Shockwave Stalker
- SPELL_SHOCKWAVE_SUMMON_EFFECT = 83128,
- SPELL_SHOCKWAVE_VISUAL_PERIODIC_SUMMON_TRIGGER = 83129,
-
- // Shockwave Visual
- SPELL_SHOCKWAVE_DAMAGE = 83454,
-
- // Tol'Vir Land Mine
- SPELL_TOLVIR_LAND_MINE_VISUAL = 83110,
- SPELL_LAND_MINE_PLAYER_SEARCH_TRIGGER = 83111,
- SPELL_LAND_MINE_PLAYER_SEARCH_EFFECT = 83112,
- SPELL_LAND_MINE_PERIODIC = 85523,
- SPELL_MYSTIC_TRAP_DAMAGE = 83171,
-
- // Bad Intentions Target
- SPELL_HARD_IMPACT = 83339,
- SPELL_EJECT_ALL_PASSENGERS = 50630
-};
-
-enum HusamEvents
-{
- // General Husam
- EVENT_HAMMER_FIST = 1,
- EVENT_MYSTIC_TRAP,
- EVENT_BAD_INTENTIONS,
- EVENT_THROW_PLAYER,
- EVENT_SHOCKWAVE,
- EVENT_DETONATE_TRAPS,
-
- // Tol'Vir Land Mine
- EVENT_READY_MINE,
- EVENT_START_COUNTDOWN,
- EVENT_CLEAR_AURAS
-};
-
-enum HusamActions
-{
- // General Husam
- ACTION_SAY_DETONATE_TRAPS = 0,
-
- // Tol'vir Land Mine
- ACTION_INITIATE_COUNTDOWN = 0,
- ACTION_DETONATE = 1
-};
-
-enum HusamTexts
-{
- // General Husam
- SAY_AGGRO = 0,
- SAY_SLAY = 1,
- SAY_SHOCKWAVE = 2,
- SAY_ANNOUNCE_SHOCKWAVE = 3,
- SAY_DETONATE_MINES = 4,
- SAY_DEATH = 5
-};
-
-enum HusamMisc
-{
- SEAT_PLAYER = 0
-};
-
-struct boss_general_husam : public BossAI
-{
- boss_general_husam(Creature* creature) : BossAI(creature, BOSS_GENERAL_HUSAM), _shockwaveStalkerCount(0) { }
-
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
- Talk(SAY_AGGRO);
-
- events.ScheduleEvent(EVENT_HAMMER_FIST, 7s, 10s);
- events.ScheduleEvent(EVENT_MYSTIC_TRAP, 7s, 10s);
- events.ScheduleEvent(EVENT_BAD_INTENTIONS, 12s, 13s);
- events.ScheduleEvent(EVENT_SHOCKWAVE, IsHeroic() ? 15s : 18s);
- if (IsHeroic() || IsTimewalking())
- events.ScheduleEvent(EVENT_DETONATE_TRAPS, 22s);
- }
-
- void KilledUnit(Unit* victim) override
- {
- if (victim->IsPlayer())
- Talk(SAY_SLAY);
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- summons.DespawnAll();
- instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
- Talk(SAY_DEATH);
- }
-
- void EnterEvadeMode(EvadeReason /*why*/) override
- {
- _EnterEvadeMode();
- summons.DespawnAll();
- instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
- _DespawnAtEvade();
- }
-
- void JustSummoned(Creature* summon) override
- {
- summons.Summon(summon);
-
- switch (summon->GetEntry())
- {
- case NPC_SHOCKWAVE_STALKER:
- {
- ++_shockwaveStalkerCount;
- float orientation = summon->GetAbsoluteAngle(me) + float(M_PI);
- Position dest = summon->GetPosition();
- dest.m_positionX += std::cos(orientation) * 40.f;
- dest.m_positionY += std::sin(orientation) * 40.f;
-
- std::function<void(Movement::MoveSplineInit&)> initializer = [dest](Movement::MoveSplineInit& init)
- {
- init.MoveTo(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ(), false);
- init.SetVelocity(8.f);
- };
- summon->GetMotionMaster()->LaunchMoveSpline(std::move(initializer));
- summon->CastSpell(nullptr, SPELL_SHOCKWAVE_VISUAL_PERIODIC_SUMMON_TRIGGER);
-
- if (_shockwaveStalkerCount == 4)
- {
- DoCastSelf(SPELL_SHOCKWAVE);
- _shockwaveStalkerCount = 0;
- }
- break;
- }
- default:
- break;
- }
- }
-
- void PassengerBoarded(Unit* /*passenger*/, int8 /*seatId*/, bool apply) override
- {
- if (apply)
- events.ScheduleEvent(EVENT_THROW_PLAYER, 1s);
- }
-
- void DoAction(int32 action) override
- {
- if (action == ACTION_SAY_DETONATE_TRAPS)
- Talk(SAY_DETONATE_MINES);
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_HAMMER_FIST:
- DoCastSelf(SPELL_HAMMER_FIST);
- events.Repeat(21s);
- break;
- case EVENT_MYSTIC_TRAP:
- DoCastAOE(SPELL_MYSTIC_TRAP, CastSpellExtraArgs().AddSpellMod(SPELLVALUE_MAX_TARGETS, 3));
- events.Repeat(11s, 12s);
- break;
- case EVENT_BAD_INTENTIONS:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, NonTankTargetSelector(me)))
- DoCast(target, SPELL_BAD_INTENTIONS);
- break;
- case EVENT_SHOCKWAVE:
- Talk(SAY_ANNOUNCE_SHOCKWAVE);
- Talk(SAY_SHOCKWAVE);
- DoCastSelf(SPELL_SUMMON_SHOCKWAVE_TARGET_N);
- DoCastSelf(SPELL_SUMMON_SHOCKWAVE_TARGET_S);
- DoCastSelf(SPELL_SUMMON_SHOCKWAVE_TARGET_E);
- DoCastSelf(SPELL_SUMMON_SHOCKWAVE_TARGET_W);
-
- events.RescheduleEvent(EVENT_MYSTIC_TRAP, 8s, 10s);
- events.RescheduleEvent(EVENT_HAMMER_FIST, 10s, 12s);
- events.RescheduleEvent(EVENT_BAD_INTENTIONS, 17s);
- events.Repeat(39s);
- break;
- case EVENT_DETONATE_TRAPS:
- DoCastSelf(SPELL_DETONATE_TRAPS);
- events.DelayEvents(2s);
- events.Repeat(32s);
- break;
- case EVENT_THROW_PLAYER:
- DoCastSelf(SPELL_HURL);
- DoCastSelf(SPELL_THROW_VISUAL);
- me->SetReactState(REACT_AGGRESSIVE);
- break;
- default:
- break;
- }
- }
- }
-
-private:
- uint8 _shockwaveStalkerCount;
-};
-
-struct npc_husam_tolvir_land_mine : public NullCreatureAI
-{
- npc_husam_tolvir_land_mine(Creature* creature) : NullCreatureAI(creature), _instance(nullptr) { }
-
- void InitializeAI() override
- {
- _instance = me->GetInstanceScript();
- }
-
- void JustAppeared() override
- {
- if (!_instance)
- return;
-
- switch (me->GetEntry())
- {
- case NPC_TOLVIR_LAND_MINE_TARGET:
- if (Creature* husam = _instance->GetCreature(BOSS_GENERAL_HUSAM))
- husam->CastSpell(me, SPELL_THROW_LAND_MINES);
- me->DespawnOrUnsummon(6s);
- break;
- case NPC_TOLVIR_LAND_MINE_VEHICLE:
- if (Creature* husam = _instance->GetCreature(BOSS_GENERAL_HUSAM))
- {
- if (CreatureAI* ai = husam->AI())
- {
- ai->JustSummoned(me);
- if (Creature* landMine = DoSummon(NPC_TOLVIR_LAND_MINE_CASTER, me->GetPosition(), 0s, TEMPSUMMON_MANUAL_DESPAWN))
- ai->JustSummoned(landMine);
- }
- }
- break;
- case NPC_TOLVIR_LAND_MINE_CASTER:
- if (me->IsSummon())
- if (Unit* summoner = me->ToTempSummon()->GetSummonerUnit())
- me->EnterVehicle(summoner);
- _events.ScheduleEvent(EVENT_READY_MINE, 2s);
- break;
- default:
- break;
- }
- }
-
- void PassengerBoarded(Unit* /*passenger*/, int8 /*seatId*/, bool apply) override
- {
- // If our casting land mine has despawned, we also despawn alongside it.
- if (me->GetEntry() == NPC_TOLVIR_LAND_MINE_VEHICLE && !apply)
- me->DespawnOrUnsummon();
- }
-
- void DoAction(int32 action) override
- {
- switch (action)
- {
- case ACTION_INITIATE_COUNTDOWN:
- _events.RescheduleEvent(EVENT_START_COUNTDOWN, 1ms);
- break;
- case ACTION_DETONATE:
- _events.Reset();
- DoCastSelf(SPELL_MYSTIC_TRAP_DAMAGE);
- me->RemoveAurasDueToSpell(SPELL_LAND_MINE_PLAYER_SEARCH_TRIGGER);
- me->RemoveAurasDueToSpell(SPELL_TOLVIR_LAND_MINE_VISUAL);
- me->RemoveAurasDueToSpell(SPELL_LAND_MINE_PERIODIC);
- me->DespawnOrUnsummon(6s);
- break;
- default:
- break;
- }
- }
-
- void UpdateAI(uint32 diff) override
- {
- _events.Update(diff);
-
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_READY_MINE:
- DoCastSelf(SPELL_TOLVIR_LAND_MINE_VISUAL);
- DoCastSelf(SPELL_LAND_MINE_PLAYER_SEARCH_TRIGGER);
- _events.ScheduleEvent(EVENT_START_COUNTDOWN, 20s);
- break;
- case EVENT_START_COUNTDOWN:
- DoCastSelf(SPELL_LAND_MINE_PERIODIC);
- _events.ScheduleEvent(EVENT_CLEAR_AURAS, 5s);
- break;
- case EVENT_CLEAR_AURAS:
- me->RemoveAurasDueToSpell(SPELL_TOLVIR_LAND_MINE_VISUAL);
- me->RemoveAurasDueToSpell(SPELL_LAND_MINE_PLAYER_SEARCH_TRIGGER);
- me->DespawnOrUnsummon(6s);
- break;
- default:
- break;
- }
- }
- }
-
-private:
- EventMap _events;
- InstanceScript* _instance;
-};
-
-struct npc_husam_bad_intentions_target : public NullCreatureAI
-{
- npc_husam_bad_intentions_target(Creature* creature) : NullCreatureAI(creature) { }
-
- void PassengerBoarded(Unit* passenger, int8 /*seatId*/, bool apply) override
- {
- if (apply)
- {
- me->m_Events.AddEventAtOffset([&, passenger]()
- {
- if (passenger)
- {
- DoCast(passenger, SPELL_HARD_IMPACT);
- DoCastSelf(SPELL_EJECT_ALL_PASSENGERS);
- }
- }, 400ms);
- }
- }
-};
-
-struct npc_husam_shockwave_visual : public NullCreatureAI
-{
- npc_husam_shockwave_visual(Creature* creature) : NullCreatureAI(creature) { }
-
- void JustAppeared() override
- {
- me->m_Events.AddEventAtOffset([&]() { DoCastSelf(SPELL_SHOCKWAVE_DAMAGE); }, 4s + 600ms);
- me->m_Events.AddEventAtOffset([&]() { me->RemoveAllAuras(); }, 7s);
- me->DespawnOrUnsummon(12s);
- }
-};
-
-class spell_husam_hammer_fist : public AuraScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellEffect({ { spellInfo->Id, EFFECT_0 } }) && ValidateSpellInfo({ spellInfo->GetEffect(EFFECT_0).TriggerSpell });
- }
-
- void HandleTick(AuraEffect const* /*aurEff*/)
- {
- PreventDefaultAction();
- GetTarget()->CastSpell(GetCaster()->GetVictim(), GetSpellInfo()->GetEffect(EFFECT_0).TriggerSpell, true);
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_husam_hammer_fist::HandleTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
- }
-};
-
-class spell_husam_shockwave : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHOCKWAVE_VISUAL });
- }
-
- void EffectScriptEffect(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetHitUnit(), SPELL_SHOCKWAVE_VISUAL, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_husam_shockwave::EffectScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
-};
-
-class spell_husam_shockwave_summon_search : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SHOCKWAVE_SUMMON_EFFECT });
- }
-
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- if (targets.empty())
- GetCaster()->CastSpell(GetCaster(), SPELL_SHOCKWAVE_SUMMON_EFFECT, true);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_husam_shockwave_summon_search::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
- }
-};
-
-class spell_husam_detonate_traps : public SpellScript
-{
- void HandlePostCastText()
- {
- if (Creature* caster = GetCaster()->ToCreature())
- if (CreatureAI* ai = caster->AI())
- ai->DoAction(ACTION_SAY_DETONATE_TRAPS);
- }
-
- void HandleScriptEffect(SpellEffIndex /*effIndex*/)
- {
- if (Creature* target = GetHitCreature())
- if (CreatureAI* ai = target->AI())
- ai->DoAction(ACTION_INITIATE_COUNTDOWN);
- }
-
- void Register() override
- {
- AfterCast += SpellCastFn(spell_husam_detonate_traps::HandlePostCastText);
- OnEffectHitTarget += SpellEffectFn(spell_husam_detonate_traps::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
-};
-
-class spell_husam_bad_intentions : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } }) && ValidateSpellInfo({ static_cast<uint32>(spellInfo->GetEffect(EFFECT_1).BasePoints) });
- }
-
- void HandleScriptEffect(SpellEffIndex /*effIndex*/)
- {
- if (Unit* caster = GetCaster())
- {
- Unit* target = GetHitUnit();
- target->CastStop();
- target->CastSpell(caster, static_cast<uint32>(GetSpellInfo()->GetEffect(EFFECT_1).BasePoints), true);
- }
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_husam_bad_intentions::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
- }
-};
-
-class spell_husam_hurl : public SpellScript
-{
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellEffect({ { spellInfo->Id, EFFECT_0 } }) && ValidateSpellInfo({ static_cast<uint32>(spellInfo->GetEffect(EFFECT_0).BasePoints) });
- }
-
- void HandleScriptEffect(SpellEffIndex /*effIndex*/)
- {
- if (Vehicle* vehicle = GetCaster()->GetVehicleKit())
- {
- if (Unit* passenger = vehicle->GetPassenger(SEAT_PLAYER))
- {
- if (Creature* intentionsTarget = GetCaster()->FindNearestCreature(NPC_BAD_INTENTIONS_TARGET, 100.0f))
- passenger->CastSpell(intentionsTarget, static_cast<uint32>(GetSpellInfo()->GetEffect(EFFECT_0).BasePoints), true);
- else
- passenger->ExitVehicle(); // Safety case to avoid players getting stuck in Husam's hand
- }
- }
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_husam_hurl::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
-};
-
-class spell_husam_land_mine_player_search_effect : public SpellScript
-{
- void HandleDummyEffect(SpellEffIndex /*effIndex*/)
- {
- if (Unit* caster = GetCaster())
- if (Creature* creature = caster->ToCreature())
- if (creature->IsAIEnabled())
- creature->AI()->DoAction(ACTION_DETONATE);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_husam_land_mine_player_search_effect::HandleDummyEffect, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
-};
-
-void AddSC_boss_general_husam()
-{
- RegisterLostCityOfTheTolvirAI(boss_general_husam);
- RegisterLostCityOfTheTolvirAI(npc_husam_tolvir_land_mine);
- RegisterLostCityOfTheTolvirAI(npc_husam_bad_intentions_target);
- RegisterLostCityOfTheTolvirAI(npc_husam_shockwave_visual);
- RegisterSpellScript(spell_husam_hammer_fist);
- RegisterSpellScript(spell_husam_shockwave);
- RegisterSpellScript(spell_husam_shockwave_summon_search);
- RegisterSpellScript(spell_husam_detonate_traps);
- RegisterSpellScript(spell_husam_bad_intentions);
- RegisterSpellScript(spell_husam_hurl);
- RegisterSpellScript(spell_husam_land_mine_player_search_effect);
-}
diff --git a/src/server/scripts/Kalimdor/LostCityOfTheTolvir/boss_lockmaw.cpp b/src/server/scripts/Kalimdor/LostCityOfTheTolvir/boss_lockmaw.cpp
deleted file mode 100644
index 1b235ebed4c..00000000000
--- a/src/server/scripts/Kalimdor/LostCityOfTheTolvir/boss_lockmaw.cpp
+++ /dev/null
@@ -1,561 +0,0 @@
-/*
-* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
-*
-* 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, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "ScriptMgr.h"
-#include "Containers.h"
-#include "InstanceScript.h"
-#include "lost_city_of_the_tolvir.h"
-#include "MotionMaster.h"
-#include "ObjectAccessor.h"
-#include "ScriptedCreature.h"
-#include "SpellScript.h"
-
-enum LockmawSpells
-{
- // Lockmaw
- SPELL_VISCOUS_POISON = 81630,
- SPELL_SCENT_OF_BLOOD = 81690,
- SPELL_VENOMOUS_RAGE = 81706,
- SPELL_DUST_FLAIL = 81652,
- SPELL_DUST_FLAIL_CHANNELED = 81642,
-
- // Add Stalker
- SPELL_SUMMON_CROCOLISK = 84242,
- SPELL_AUGH_1 = 84809, // Casts Paralytic Blow Dart
- SPELL_AUGH_2 = 84808, // Casts Whirlwind
-
- // Adds
- SPELL_STEALTHED = 84244,
-
- // Dust Flail
- SPELL_DUST_FLAIL_PERIODIC = 81646,
-
- // Augh (Add)
- SPELL_PARALYTIC_BLOW_DART = 84799,
- SPELL_SMOKE_BOMB = 84768,
- SPELL_RANDOM_AGGRO_TAUNT = 50230,
- SPELL_WHIRLWIND = 84784,
-
- // Augh (Boss)
- SPELL_FRENZY = 91415,
- SPELL_DRAGONS_BREATH = 83776,
- SPELL_WHIRLWIND_BOSS = 91408
-};
-
-enum LockmawEvents
-{
- // Lockmaw
- EVENT_VISCOUS_POISON = 1,
- EVENT_SCENT_OF_BLOOD,
- EVENT_VENOMOUS_RAGE,
- EVENT_DUST_FLAIL,
- EVENT_CHANNEL_DUST_FLAIL,
- EVENT_TURN_AGGRESSIVE,
- EVENT_SUMMON_AUGH_ADD,
-
- // Augh (Add)
- EVENT_MOVE_TOWARDS_BOSS,
- EVENT_HARASS_PLAYERS,
- EVENT_PARALYTIC_BLOW_DART,
- EVENT_SCREAM,
- EVENT_SMOKE_BOMB,
- EVENT_WHIRLWIND,
- EVENT_STEALTHED,
- EVENT_LEAVE_ARENA,
-
- // Augh (Boss)
- EVENT_SAY_INTRO_2,
- EVENT_SET_EMOTE_STATE,
- EVENT_TURN_ATTACKABLE,
- EVENT_SAY_INTRO_3,
- EVENT_SAY_INTRO_4,
- EVENT_SAY_INTRO_5,
- EVENT_DRAGONS_BREATH
-};
-
-enum LockmawPhases
-{
- // Augh (Boss)
- PHASE_INTRO = 1,
- PHASE_COMBAT = 2
-};
-
-enum LockmawTexts
-{
- // Augh (Adds)
- SAY_HARASS_PLAYER = 0,
- SAY_SCREAM = 1,
-
- // Augh (Boss)
- SAY_ANNOUNCE_APPEARANCE = 0,
- SAY_INTRO_1 = 1,
- SAY_INTRO_2 = 2,
- SAY_INTRO_3 = 3,
- SAY_INTRO_4 = 4,
- SAY_INTRO_5 = 5
-};
-
-enum class LockmawAughAddType : uint8
-{
- ParalyticBlowDart = 0,
- Whirlwind = 1
-};
-
-enum LockmawMovemPoints
-{
- POINT_PARALYTIC_BLOW_DART = 0,
- POINT_AUGH_HOME_POSITION = 0
-};
-
-// Instead of using a fixate or taunt aura, the Crocolisks use a flat threat amount instead
-static constexpr float SCENT_OF_BLOOD_THREAT_AMOUNT = 500000.f;
-static Position const AughRespawnPosition = { -11062.5f, -1662.39f, 0.7606202f, 0.8028514f };
-
-struct boss_lockmaw : public BossAI
-{
- boss_lockmaw(Creature* creature) : BossAI(creature, BOSS_LOCKMAW), _enraged(false), _aughAddType(LockmawAughAddType::ParalyticBlowDart) { }
-
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
-
- events.ScheduleEvent(EVENT_VISCOUS_POISON, 10s);
- events.ScheduleEvent(EVENT_SCENT_OF_BLOOD, 5s);
- events.ScheduleEvent(EVENT_DUST_FLAIL, 18s);
- events.ScheduleEvent(EVENT_SUMMON_AUGH_ADD, 8s);
- }
-
- void EnterEvadeMode(EvadeReason /*why*/) override
- {
- summons.DespawnAll();
- instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
- _EnterEvadeMode();
- _DespawnAtEvade();
- }
-
- void JustDied(Unit* killer) override
- {
- BossAI::JustDied(killer);
- instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
- instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_SCENT_OF_BLOOD);
- instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_VISCOUS_POISON);
- }
-
- void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
- {
- if (damage >= me->GetHealth())
- return;
-
- if (!_enraged && me->HealthBelowPctDamaged(30, damage))
- {
- events.ScheduleEvent(EVENT_VENOMOUS_RAGE, 1ms);
- _enraged = true;
- }
- }
-
- bool CanAIAttack(Unit const* victim) const override
- {
- // Patch 4.0.6 (2011-02-08): Lockmaw no longer tolerates fighting in his treasure room.
- return victim && victim->IsOutdoors();
- }
-
- void JustSummoned(Creature* summon) override
- {
- summons.Summon(summon);
-
- switch (summon->GetEntry())
- {
- case NPC_DUST_FLAIL_CASTER:
- summon->CastSpell(nullptr, SPELL_DUST_FLAIL_PERIODIC);
- break;
- default:
- break;
- }
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_VISCOUS_POISON:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 45.f, true, 0.f))
- DoCast(target, SPELL_VISCOUS_POISON);
- else
- DoCastVictim(SPELL_VISCOUS_POISON);
-
- events.Repeat(30s);
- break;
- case EVENT_SCENT_OF_BLOOD:
- // just a occasional cleanup of despawned summons to keep the container slim
- summons.RemoveNotExisting();
- DoCastAOE(SPELL_SCENT_OF_BLOOD);
- events.Repeat(30s);
- break;
- case EVENT_VENOMOUS_RAGE:
- DoCastSelf(SPELL_VENOMOUS_RAGE);
- break;
- case EVENT_DUST_FLAIL:
- me->AttackStop();
- me->SetReactState(REACT_PASSIVE);
- DoCastSelf(SPELL_DUST_FLAIL);
- events.ScheduleEvent(EVENT_CHANNEL_DUST_FLAIL, 1s);
- events.Repeat(30s);
- break;
- case EVENT_CHANNEL_DUST_FLAIL:
- if (Creature const* dustFlail = instance->GetCreature(DATA_DUST_FLAIL))
- {
- // because splines need one update tick to update the position, we have to set the orientation manually because we need it NOW.
- me->SetOrientation(me->GetAbsoluteAngle(dustFlail));
- me->SetFacingToObject(dustFlail);
- DoCastSelf(SPELL_DUST_FLAIL_CHANNELED);
- events.ScheduleEvent(EVENT_TURN_AGGRESSIVE, 7s);
- }
- else
- me->SetReactState(REACT_AGGRESSIVE);
- break;
- case EVENT_TURN_AGGRESSIVE:
- me->SetReactState(REACT_AGGRESSIVE);
- break;
- case EVENT_SUMMON_AUGH_ADD:
- instance->SetData(DATA_SHUFFLE_ADD_STALKERS, 0);
- if (Creature* addStalker = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ADD_STALKER_1)))
- {
- addStalker->CastSpell(nullptr, _aughAddType == LockmawAughAddType::ParalyticBlowDart ? SPELL_AUGH_1 : SPELL_AUGH_2);
- events.Repeat(_aughAddType == LockmawAughAddType::ParalyticBlowDart ? 20s : 40s);
- _aughAddType = _aughAddType == LockmawAughAddType::ParalyticBlowDart ? LockmawAughAddType::Whirlwind : LockmawAughAddType::ParalyticBlowDart;
- }
- break;
- default:
- break;
- }
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
- }
- }
-private:
- bool _enraged;
- LockmawAughAddType _aughAddType;
-};
-
-struct npc_lockmaw_frenzied_crocolisk : public ScriptedAI
-{
- npc_lockmaw_frenzied_crocolisk(Creature* creature) : ScriptedAI(creature) { }
-
- void JustAppeared() override
- {
- DoZoneInCombat();
- DoCastSelf(SPELL_STEALTHED);
- me->SetCorpseDelay(5); // Frenzied Crocolisks despawn 5 seconds after death
-
- if (Unit* victim = SelectTarget(SelectTargetMethod::Random, 0, 500.f, true, true, SPELL_SCENT_OF_BLOOD))
- AddThreat(victim, SCENT_OF_BLOOD_THREAT_AMOUNT);
- }
-};
-
-static constexpr float AUGH_DISTANCE_TO_BOSS = 20.f;
-
-struct npc_lockmaw_augh_add : public ScriptedAI
-{
- npc_lockmaw_augh_add(Creature* creature) : ScriptedAI(creature), _instance(nullptr) { }
-
- void InitializeAI() override
- {
- _instance = me->GetInstanceScript();
-
- if (me->GetEntry() == NPC_AUGH_ADD_1)
- me->SetReactState(REACT_PASSIVE);
- }
-
- void JustAppeared() override
- {
- if (me->GetEntry() == NPC_AUGH_ADD_1)
- {
- DoCastSelf(SPELL_STEALTHED);
- _events.ScheduleEvent(EVENT_STEALTHED, 1ms);
- _events.ScheduleEvent(EVENT_MOVE_TOWARDS_BOSS, 2s);
- }
- else
- {
- DoZoneInCombat();
- _events.ScheduleEvent(EVENT_STEALTHED, 2s);
- _events.ScheduleEvent(EVENT_WHIRLWIND, 3s);
- }
- }
-
- void MovementInform(uint32 motionType, uint32 pointId) override
- {
- if (motionType != POINT_MOTION_TYPE && pointId != POINT_PARALYTIC_BLOW_DART)
- return;
-
- _events.ScheduleEvent(EVENT_HARASS_PLAYERS, 1ms);
- _events.ScheduleEvent(EVENT_PARALYTIC_BLOW_DART, 1s);
- }
-
- void UpdateAI(uint32 diff) override
- {
- // Augh does perform events even if he is not engaged, so we do not return here
- UpdateVictim();
-
- _events.Update(diff);
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_MOVE_TOWARDS_BOSS:
- {
- DoZoneInCombat();
- Creature* lockmaw = _instance->GetCreature(BOSS_LOCKMAW);
- if (!lockmaw)
- {
- // This should never happen at this stage, but just to be sure....
- me->DespawnOrUnsummon();
- return;
- }
- me->GetMotionMaster()->MovePoint(POINT_PARALYTIC_BLOW_DART, lockmaw->GetPosition(), true, std::nullopt, std::nullopt, MovementWalkRunSpeedSelectionMode::ForceWalk, AUGH_DISTANCE_TO_BOSS);
- break;
- }
- case EVENT_HARASS_PLAYERS:
- Talk(SAY_HARASS_PLAYER);
- break;
- case EVENT_PARALYTIC_BLOW_DART:
- DoCastAOE(SPELL_PARALYTIC_BLOW_DART, CastSpellExtraArgs().AddSpellMod(SPELLVALUE_MAX_TARGETS, 1));
- _events.ScheduleEvent(EVENT_SCREAM, 3s);
- break;
- case EVENT_SCREAM:
- Talk(SAY_SCREAM);
- _events.ScheduleEvent(EVENT_SMOKE_BOMB, 1s);
- break;
- case EVENT_SMOKE_BOMB:
- DoCastAOE(SPELL_SMOKE_BOMB);
- me->DespawnOrUnsummon(3s + 500ms);
- break;
- case EVENT_WHIRLWIND:
- me->SetReactState(REACT_AGGRESSIVE);
- DoCastAOE(SPELL_RANDOM_AGGRO_TAUNT);
- DoCastSelf(SPELL_WHIRLWIND);
- _events.ScheduleEvent(EVENT_LEAVE_ARENA, 20s);
- break;
- case EVENT_STEALTHED:
- DoCastSelf(SPELL_STEALTHED);
- break;
- case EVENT_LEAVE_ARENA:
- me->AttackStop();
- me->SetReactState(REACT_PASSIVE);
- if (Creature* addStalker = me->FindNearestCreature(NPC_ADD_STALKER, 200.f))
- me->GetMotionMaster()->MovePoint(0, addStalker->GetPosition());
- me->DespawnOrUnsummon(4s);
- break;
- default:
- break;
- }
- }
- }
-
-private:
- EventMap _events;
- InstanceScript* _instance;
-};
-
-struct npc_lockmaw_augh_boss : public ScriptedAI
-{
- npc_lockmaw_augh_boss(Creature* creature) : ScriptedAI(creature), _instance(nullptr) { }
-
- void InitializeAI() override
- {
- _instance = me->GetInstanceScript();
- if (_instance->GetData(DATA_HEROIC_AUGH_DESPAWNED))
- me->Relocate(AughRespawnPosition);
- else
- me->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
-
- me->SetReactState(REACT_PASSIVE);
- }
-
- void JustAppeared() override
- {
- if (!_instance->GetData(DATA_HEROIC_AUGH_DESPAWNED))
- {
- Talk(SAY_ANNOUNCE_APPEARANCE);
- me->GetMotionMaster()->MovePoint(POINT_AUGH_HOME_POSITION, AughRespawnPosition, true, std::nullopt, std::nullopt, MovementWalkRunSpeedSelectionMode::ForceWalk);
- }
- }
-
- void JustEngagedWith(Unit* /*who*/) override
- {
- me->SetReactState(REACT_AGGRESSIVE);
- me->SetEmoteState(EMOTE_ONESHOT_NONE);
- DoCastSelf(SPELL_FRENZY);
- _events.SetPhase(PHASE_COMBAT);
- _events.ScheduleEvent(EVENT_PARALYTIC_BLOW_DART, 8s);
- _events.ScheduleEvent(EVENT_WHIRLWIND, 9s);
- _events.ScheduleEvent(EVENT_DRAGONS_BREATH, 6s);
- }
-
- void EnterEvadeMode(EvadeReason /*why*/) override
- {
- _instance->SetData(DATA_HEROIC_AUGH_DESPAWNED, 1);
- me->DespawnOrUnsummon(0s, 30s);
- }
-
- void MovementInform(uint32 motionType, uint32 pointId) override
- {
- if (motionType != POINT_MOTION_TYPE && pointId != POINT_AUGH_HOME_POSITION)
- return;
-
- me->SetFacingTo(AughRespawnPosition.GetOrientation());
- Talk(SAY_INTRO_1);
-
- _events.SetPhase(PHASE_INTRO);
- _events.ScheduleEvent(EVENT_SAY_INTRO_2, 3s, 0, PHASE_INTRO);
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim() && !_events.IsInPhase(PHASE_INTRO))
- return;
-
- _events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_SAY_INTRO_2:
- Talk(SAY_INTRO_2);
- _events.ScheduleEvent(EVENT_SET_EMOTE_STATE, 3s + 500ms, 0, PHASE_INTRO);
- break;
- case EVENT_SET_EMOTE_STATE:
- me->SetEmoteState(EMOTE_STATE_SPELL_CHANNEL_OMNI);
- _events.ScheduleEvent(EVENT_TURN_ATTACKABLE, 3s + 500ms, 0, PHASE_INTRO);
- break;
- case EVENT_TURN_ATTACKABLE:
- me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
- _events.ScheduleEvent(EVENT_SAY_INTRO_3, 11s, 0, PHASE_INTRO);
- break;
- case EVENT_SAY_INTRO_3:
- Talk(SAY_INTRO_3);
- _events.ScheduleEvent(EVENT_SAY_INTRO_4, 8s + 500ms, 0, PHASE_INTRO);
- break;
- case EVENT_SAY_INTRO_4:
- Talk(SAY_INTRO_4);
- _events.ScheduleEvent(EVENT_SAY_INTRO_5, 8s + 500ms, 0, PHASE_INTRO);
- break;
- case EVENT_SAY_INTRO_5:
- Talk(SAY_INTRO_5);
- _events.ScheduleEvent(EVENT_SAY_INTRO_3, 21s, 0, PHASE_INTRO);
- break;
- case EVENT_PARALYTIC_BLOW_DART:
- DoCastAOE(SPELL_PARALYTIC_BLOW_DART, CastSpellExtraArgs().AddSpellMod(SPELLVALUE_MAX_TARGETS, 1));
- _events.Repeat(10s, 15s);
- break;
- case EVENT_WHIRLWIND:
- DoCastAOE(SPELL_RANDOM_AGGRO_TAUNT);
- DoCastSelf(SPELL_WHIRLWIND_BOSS);
- _events.Repeat(29s);
- break;
- case EVENT_DRAGONS_BREATH:
- DoCastAOE(SPELL_DRAGONS_BREATH);
- _events.Repeat(28s);
- break;
- default:
- break;
- }
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
- }
- }
-
-private:
- EventMap _events;
- InstanceScript* _instance;
-};
-
-class spell_lockmaw_scent_of_blood : public SpellScript
-{
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SUMMON_CROCOLISK });
- }
-
- void SelectTarget(std::list<WorldObject*>& targets)
- {
- if (targets.size() <= 1)
- return;
-
- std::list<WorldObject*> targetsCopy = targets;
- targetsCopy.remove_if([caster = GetCaster()](WorldObject const* target)
- {
- return caster->GetVictim() != target;
- });
-
- if (!targetsCopy.empty())
- {
- Trinity::Containers::RandomResize(targetsCopy, 1);
- targets = targetsCopy;
- }
- else
- Trinity::Containers::RandomResize(targets, 1);
- }
-
- void HandleCrocoliskSummoning()
- {
- Unit* caster = GetCaster();
- if (!caster)
- return;
-
- InstanceScript* instance = caster->GetInstanceScript();
- if (!instance)
- return;
-
- // Shuffle the stored add stalkers so that we will get four random add stalkers in the next step below
- instance->SetData(DATA_SHUFFLE_ADD_STALKERS, 0);
-
- for (uint32 i = DATA_ADD_STALKER_1; i <= DATA_ADD_STALKER_4; ++i)
- if (Creature* addStalker = ObjectAccessor::GetCreature(*caster, instance->GetGuidData(i)))
- addStalker->CastSpell(nullptr, SPELL_SUMMON_CROCOLISK);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_lockmaw_scent_of_blood::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
- AfterCast += SpellCastFn(spell_lockmaw_scent_of_blood::HandleCrocoliskSummoning);
- }
-};
-
-void AddSC_boss_lockmaw()
-{
- RegisterLostCityOfTheTolvirAI(boss_lockmaw);
- RegisterLostCityOfTheTolvirAI(npc_lockmaw_frenzied_crocolisk);
- RegisterLostCityOfTheTolvirAI(npc_lockmaw_augh_add);
- RegisterLostCityOfTheTolvirAI(npc_lockmaw_augh_boss);
- RegisterSpellScript(spell_lockmaw_scent_of_blood);
-}
diff --git a/src/server/scripts/Kalimdor/LostCityOfTheTolvir/instance_lost_city_of_the_tolvir.cpp b/src/server/scripts/Kalimdor/LostCityOfTheTolvir/instance_lost_city_of_the_tolvir.cpp
deleted file mode 100644
index 88aba2b8666..00000000000
--- a/src/server/scripts/Kalimdor/LostCityOfTheTolvir/instance_lost_city_of_the_tolvir.cpp
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include "ScriptMgr.h"
-#include "Containers.h"
-#include "Creature.h"
-#include "CreatureAI.h"
-#include "EventMap.h"
-#include "InstanceScript.h"
-#include "lost_city_of_the_tolvir.h"
-#include "Map.h"
-
-static constexpr ObjectData const creatureData[] =
-{
- { NPC_GENERAL_HUSAM, BOSS_GENERAL_HUSAM },
- { NPC_LOCKMAW, BOSS_LOCKMAW },
- { NPC_HIGH_PROPHET_BARIM, BOSS_HIGH_PROPHET_BARIM },
- { NPC_SIAMAT, BOSS_SIAMAT },
- { NPC_DUST_FLAIL, DATA_DUST_FLAIL },
- { 0, 0 } // End
-};
-
-static constexpr DungeonEncounterData const encounters[] =
-{
- { BOSS_GENERAL_HUSAM, {{ 1052 }} },
- { BOSS_LOCKMAW, {{ 1054 }} },
- { BOSS_HIGH_PROPHET_BARIM, {{ 1053 }} },
- { BOSS_SIAMAT, {{ 1055 }} }
-};
-
-enum LCTEvents
-{
- EVENT_SPAWN_HEROIC_AUGH = 1
-};
-
-enum LCTSpawnGroups
-{
- SPAWN_GROUP_ID_SIAMAT_WIND_TUNNEL = 1036,
- SPAWN_GROUP_ID_AUGH_HEROIC = 1037
-};
-
-class instance_lost_city_of_the_tolvir : public InstanceMapScript
-{
-public:
- instance_lost_city_of_the_tolvir() : InstanceMapScript(LCTScriptName, 755) { }
-
- struct instance_lost_city_of_the_tolvir_InstanceMapScript : public InstanceScript
- {
- instance_lost_city_of_the_tolvir_InstanceMapScript(InstanceMap* map) : InstanceScript(map), _heroicAughDespawned(false)
- {
- SetHeaders(DataHeader);
- SetBossNumber(EncounterCount);
- LoadDungeonEncounterData(encounters);
- LoadObjectData(creatureData, nullptr);
- }
-
- void OnCreatureCreate(Creature* creature) override
- {
- InstanceScript::OnCreatureCreate(creature);
-
- switch (creature->GetEntry())
- {
- case NPC_ADD_STALKER:
- _lockmawAddStalkerGUIDs.push_back(creature->GetGUID());
- break;
- case NPC_FRENZIED_CROCOLISK:
- case NPC_AUGH_ADD_1:
- case NPC_AUGH_ADD_2:
- // Some adds are spawned by Add Stalkers so we have to register them via instance script for Lockmaw to clean up
- if (Creature* lockmaw = GetCreature(BOSS_LOCKMAW))
- if (CreatureAI* ai = lockmaw->AI())
- ai->JustSummoned(creature);
- break;
- default:
- break;
- }
- }
-
- bool SetBossState(uint32 id, EncounterState state) override
- {
- if (!InstanceScript::SetBossState(id, state))
- return false;
-
- switch (id)
- {
- case BOSS_LOCKMAW:
- if (state == DONE && (instance->IsHeroic() || instance->IsTimewalking()))
- _events.ScheduleEvent(EVENT_SPAWN_HEROIC_AUGH, 1ms);
- break;
- default:
- break;
- }
-
- if (GetBossState(BOSS_GENERAL_HUSAM) == DONE && GetBossState(BOSS_LOCKMAW) == DONE && GetBossState(BOSS_HIGH_PROPHET_BARIM) == DONE)
- EnableSiamat();
-
- return true;
- }
-
- void SetData(uint32 type, uint32 value) override
- {
- switch (type)
- {
- case DATA_SHUFFLE_ADD_STALKERS:
- Trinity::Containers::RandomShuffle(_lockmawAddStalkerGUIDs);
- break;
- case DATA_HEROIC_AUGH_DESPAWNED:
- _heroicAughDespawned = value != 0 ? true : false;
- break;
- default:
- break;
- }
- }
-
- uint32 GetData(uint32 type) const override
- {
- switch (type)
- {
- case DATA_HEROIC_AUGH_DESPAWNED:
- return static_cast<uint8>(_heroicAughDespawned);
- default:
- return 0;
- }
-
- return 0;
- }
-
- void Update(uint32 diff) override
- {
- InstanceScript::Update(diff);
-
- _events.Update(diff);
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_SPAWN_HEROIC_AUGH:
- instance->SpawnGroupSpawn(SPAWN_GROUP_ID_AUGH_HEROIC);
- break;
- default:
- break;
- }
- }
- }
-
- void AfterDataLoad() override
- {
- if (GetBossState(BOSS_GENERAL_HUSAM) == DONE && GetBossState(BOSS_LOCKMAW) == DONE && GetBossState(BOSS_HIGH_PROPHET_BARIM) == DONE)
- EnableSiamat();
- }
-
- ObjectGuid GetGuidData(uint32 type) const override
- {
- switch (type)
- {
- case DATA_ADD_STALKER_1:
- case DATA_ADD_STALKER_2:
- case DATA_ADD_STALKER_3:
- case DATA_ADD_STALKER_4:
- if (_lockmawAddStalkerGUIDs.size() >= (type - DATA_ADD_STALKER_1 + 1))
- return _lockmawAddStalkerGUIDs[(type - DATA_ADD_STALKER_1)];
- else
- return ObjectGuid::Empty;
- default:
- return InstanceScript::GetGuidData(type);
- }
-
- return InstanceScript::GetGuidData(type);
- }
- private:
- EventMap _events;
- std::vector<ObjectGuid> _lockmawAddStalkerGUIDs;
- bool _heroicAughDespawned;
-
- void EnableSiamat()
- {
- instance->SpawnGroupSpawn(SPAWN_GROUP_ID_SIAMAT_WIND_TUNNEL);
- }
- };
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const override
- {
- return new instance_lost_city_of_the_tolvir_InstanceMapScript(map);
- }
-};
-
-void AddSC_instance_lost_city_of_the_tolvir()
-{
- new instance_lost_city_of_the_tolvir();
-}
diff --git a/src/server/scripts/Kalimdor/LostCityOfTheTolvir/lost_city_of_the_tolvir.h b/src/server/scripts/Kalimdor/LostCityOfTheTolvir/lost_city_of_the_tolvir.h
deleted file mode 100644
index b700defb391..00000000000
--- a/src/server/scripts/Kalimdor/LostCityOfTheTolvir/lost_city_of_the_tolvir.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef LostCityOfTheTolvir_h__
-#define LostCityOfTheTolvir_h__
-
-#include "CreatureAIImpl.h"
-
-#define DataHeader "LCT"
-#define LCTScriptName "instance_lost_city_of_the_tolvir"
-
-static constexpr uint32 EncounterCount = 4;
-
-enum LCTData
-{
- // Encounters
- BOSS_GENERAL_HUSAM = 0,
- BOSS_LOCKMAW = 1,
- BOSS_HIGH_PROPHET_BARIM = 2,
- BOSS_SIAMAT = 3,
-
- DATA_SHUFFLE_ADD_STALKERS,
- DATA_ADD_STALKER_1,
- DATA_ADD_STALKER_2,
- DATA_ADD_STALKER_3,
- DATA_ADD_STALKER_4,
- DATA_DUST_FLAIL,
- DATA_HEROIC_AUGH_DESPAWNED
-};
-
-enum LCTCreatureIds
-{
- // Bosses
- NPC_GENERAL_HUSAM = 44577,
- NPC_LOCKMAW = 43614,
- NPC_HIGH_PROPHET_BARIM = 43612,
- NPC_SIAMAT = 44819,
-
- // Encounter related creatures
- /*General Husam*/
- NPC_BAD_INTENTIONS_TARGET = 44586,
- NPC_SHOCKWAVE_STALKER = 44711,
- NPC_TOLVIR_LAND_MINE_TARGET = 44840,
- NPC_TOLVIR_LAND_MINE_VEHICLE = 44798,
- NPC_TOLVIR_LAND_MINE_CASTER = 44796,
-
- /*Lockmaw*/
- NPC_ADD_STALKER = 45124,
- NPC_FRENZIED_CROCOLISK = 43658,
- NPC_DUST_FLAIL = 43655,
- NPC_DUST_FLAIL_CASTER = 43650,
- NPC_AUGH_ADD_1 = 45379,
- NPC_AUGH_ADD_2 = 45378,
-};
-
-template <class AI, class T>
-inline AI* GetLostCityOfTheTolvirAI(T* obj)
-{
- return GetInstanceAI<AI>(obj, LCTScriptName);
-}
-
-#define RegisterLostCityOfTheTolvirAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetLostCityOfTheTolvirAI)
-
-#endif // LostCityOfTheTolvir_h__
diff --git a/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp b/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp
index 277348eefc8..bbf45cead3e 100644
--- a/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp
+++ b/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp
@@ -95,10 +95,6 @@ void AddSC_boss_twinemperors();
void AddSC_boss_ouro();
void AddSC_npc_anubisath_sentinel();
void AddSC_instance_temple_of_ahnqiraj();
-// The Lost City of the Tol'vir
-void AddSC_boss_general_husam();
-void AddSC_boss_lockmaw();
-void AddSC_instance_lost_city_of_the_tolvir();
// Wailing caverns
void AddSC_wailing_caverns();
void AddSC_instance_wailing_caverns();
@@ -106,14 +102,6 @@ void AddSC_instance_wailing_caverns();
void AddSC_boss_zum_rah();
void AddSC_zulfarrak();
void AddSC_instance_zulfarrak();
-void AddSC_instance_halls_of_origination();
-void AddSC_boss_temple_guardian_anhuur();
-void AddSC_boss_earthrager_ptah();
-void AddSC_boss_anraphet();
-void AddSC_instance_firelands();
-void AddSC_firelands();
-void AddSC_boss_alysrazor();
-void AddSC_boss_baleroc();
void AddSC_ashenvale();
void AddSC_azshara();
@@ -220,10 +208,6 @@ void AddKalimdorScripts()
AddSC_boss_ouro();
AddSC_npc_anubisath_sentinel();
AddSC_instance_temple_of_ahnqiraj();
- // The Lost City of the Tol'vir
- AddSC_boss_general_husam();
- AddSC_boss_lockmaw();
- AddSC_instance_lost_city_of_the_tolvir();
// Wailing caverns
AddSC_wailing_caverns();
AddSC_instance_wailing_caverns();
@@ -253,14 +237,4 @@ void AddKalimdorScripts()
AddSC_thunder_bluff();
// AddSC_ungoro_crater();
AddSC_winterspring();
-
- AddSC_instance_halls_of_origination();
- AddSC_boss_temple_guardian_anhuur();
- AddSC_boss_earthrager_ptah();
- AddSC_boss_anraphet();
-
- AddSC_instance_firelands();
- AddSC_firelands();
- AddSC_boss_alysrazor();
- AddSC_boss_baleroc();
}