diff options
34 files changed, 1 insertions, 9365 deletions
diff --git a/sql/updates/world/wotlk_classic/2024_02_16_00_world.sql b/sql/updates/world/wotlk_classic/2024_02_16_00_world.sql new file mode 100644 index 00000000000..a2cc10478b6 --- /dev/null +++ b/sql/updates/world/wotlk_classic/2024_02_16_00_world.sql @@ -0,0 +1 @@ +DELETE FROM `battlefield_template` WHERE `ScriptName`= 'battlefield_tb'; 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(); } |