aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/Battlefield/BattlefieldTB.cpp
diff options
context:
space:
mode:
authorOvahlord <dreadkiller@gmx.de>2024-02-16 15:40:47 +0100
committerOvahlord <dreadkiller@gmx.de>2024-02-16 15:40:47 +0100
commit8e01b350e3492126948291cc859c9d990e28f130 (patch)
treead9e458694bd1aa4c197c1462a95227098b44d25 /src/server/scripts/Battlefield/BattlefieldTB.cpp
parent6331b44e0f7155a4004086543dc0c1769e8670d9 (diff)
Scripts/Misc: removed more post WotLK scripts
Diffstat (limited to 'src/server/scripts/Battlefield/BattlefieldTB.cpp')
-rw-r--r--src/server/scripts/Battlefield/BattlefieldTB.cpp781
1 files changed, 0 insertions, 781 deletions
diff --git a/src/server/scripts/Battlefield/BattlefieldTB.cpp b/src/server/scripts/Battlefield/BattlefieldTB.cpp
deleted file mode 100644
index 05222f50052..00000000000
--- a/src/server/scripts/Battlefield/BattlefieldTB.cpp
+++ /dev/null
@@ -1,781 +0,0 @@
-/*
-* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
-*
-* This program is free software; you can redistribute it and/or modify it
-* under the terms of the GNU General Public License as published by the
-* Free Software Foundation; either version 2 of the License, or (at your
-* option) any later version.
-*
-* This program is distributed in the hope that it will be useful, but WITHOUT
-* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-* more details.
-*
-* You should have received a copy of the GNU General Public License along
-* with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-// TO-DO:
-// - Implement proper support for vehicles (Player::VehicleSpellInitialize())
-// - Siege Engine Turret (45564) crashing server (Auras: Unknown Shapeshift Type: 24)
-// - Graveyard spirit phasing, ressurection, Spiritual Immunity aura for players nearby
-// - Warn and teleport players out of the Baradin Hold instance (need sniffs; spell 94964?)
-// - Not sure, but players should probably be able to ressurect from guide spirits when there's no battle
-// - Check and script achievements
-
-#include "BattlefieldTB.h"
-#include "AchievementMgr.h"
-#include "Battleground.h"
-#include "CreatureTextMgr.h"
-#include "GameObject.h"
-#include "GameTime.h"
-#include "ObjectAccessor.h"
-#include "Player.h"
-#include "Random.h"
-#include "ScriptMgr.h"
-#include "TemporarySummon.h"
-#include "World.h"
-#include "WorldStateMgr.h"
-
-BattlefieldTB::~BattlefieldTB() { }
-
-bool BattlefieldTB::SetupBattlefield()
-{
- m_TypeId = BATTLEFIELD_TB; // See enum BattlefieldTypes
- m_BattleId = BATTLEFIELD_BATTLEID_TB;
- m_ZoneId = BATTLEFIELD_TB_ZONEID;
-
- InitStalker(NPC_DEBUG_ANNOUNCER, TolBaradDebugAnnouncerPos);
-
- m_MaxPlayer = sWorld->getIntConfig(CONFIG_TOLBARAD_PLR_MAX);
- m_IsEnabled = sWorld->getBoolConfig(CONFIG_TOLBARAD_ENABLE);
- m_MinPlayer = sWorld->getIntConfig(CONFIG_TOLBARAD_PLR_MIN);
- m_MinLevel = sWorld->getIntConfig(CONFIG_TOLBARAD_PLR_MIN_LVL);
- m_BattleTime = sWorld->getIntConfig(CONFIG_TOLBARAD_BATTLETIME) * MINUTE * IN_MILLISECONDS;
- m_BonusTime = sWorld->getIntConfig(CONFIG_TOLBARAD_BONUSTIME) * MINUTE * IN_MILLISECONDS;
- m_NoWarBattleTime = sWorld->getIntConfig(CONFIG_TOLBARAD_NOBATTLETIME) * MINUTE * IN_MILLISECONDS;
- m_RestartAfterCrash = sWorld->getIntConfig(CONFIG_TOLBARAD_RESTART_AFTER_CRASH) * MINUTE * IN_MILLISECONDS;
-
- m_TimeForAcceptInvite = 20;
- m_StartGroupingTimer = 15 * MINUTE * IN_MILLISECONDS;
- m_StartGrouping = false;
- m_isActive = false;
-
- KickPosition.Relocate(-605.5f, 1181.31f, 95.96f, 6.177155f);
- KickPosition.m_mapId = m_MapId;
-
- RegisterZone(m_ZoneId);
-
- m_Data32.resize(BATTLEFIELD_TB_DATA_MAX);
-
- updatedNPCAndObjects = true;
- m_updateObjectsTimer = 0;
-
- // Was there a battle going on or time isn't set yet? Then use m_RestartAfterCrash
- if (sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_STATE_BATTLE, m_Map) == 1 || sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, m_Map) < GameTime::GetGameTime())
- {
- sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_STATE_BATTLE, 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, GameTime::GetGameTime() + m_RestartAfterCrash / IN_MILLISECONDS, false, m_Map);
- }
-
- // Set timer
- m_Timer = sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, m_Map) - GameTime::GetGameTime();
-
- // Defending team isn't set yet? Choose randomly.
- if (sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_FACTION_CONTROLLING, m_Map) == 0)
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_FACTION_CONTROLLING, uint32(urand(1, 2)), false, m_Map);
-
- // Set defender team
- SetDefenderTeam(TeamId(sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_FACTION_CONTROLLING, m_Map) - 1));
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE_SHOW, 1, false, m_Map);
- sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, GameTime::GetGameTime() + m_Timer / IN_MILLISECONDS, false, m_Map);
-
- sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_FACTION_CONTROLLING, GetDefenderTeam() + 1, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_ALLIANCE_CONTROLS_SHOW, GetDefenderTeam() == TEAM_ALLIANCE ? 1 : 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_HORDE_CONTROLS_SHOW, GetDefenderTeam() == TEAM_HORDE ? 1 : 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_KEEP_ALLIANCE, GetDefenderTeam() == TEAM_ALLIANCE ? 1 : 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_KEEP_HORDE, GetDefenderTeam() == TEAM_HORDE ? 1 : 0, false, m_Map);
-
- // Create capture points
- for (uint8 i = 0; i < TB_BASE_COUNT; i++)
- {
- //Spawn flag pole
- if (GameObject* go = SpawnGameObject(TBCapturePoints[i].entryFlagPole[GetDefenderTeam()], TBCapturePoints[i].pos, QuaternionData::fromEulerAnglesZYX(TBCapturePoints[i].pos.GetOrientation(), 0.0f, 0.0f)))
- {
- std::unique_ptr<TolBaradCapturePoint> controlZone = std::make_unique<TolBaradCapturePoint>(this, TBCapturePoints[i]);
- if (GetDefenderTeam() == TEAM_ALLIANCE)
- {
- sWorldStateMgr->SetValue(controlZone->GetWorldStateAllianceControlled(), 1, false, GetMap());
- go->HandleCustomTypeCommand(GameObjectType::SetControlZoneValue(100));
- go->SetGoArtKit(TB_GO_ARTKIT_FLAG_ALLIANCE);
- }
- else if (GetDefenderTeam() == TEAM_HORDE)
- {
- sWorldStateMgr->SetValue(controlZone->GetWorldStateHordeControlled(), 1, false, GetMap());
- go->HandleCustomTypeCommand(GameObjectType::SetControlZoneValue(0));
- go->SetGoArtKit(TB_GO_ARTKIT_FLAG_HORDE);
- }
-
- ControlZoneHandlers[go->GetEntry()] = std::move(controlZone);
- }
- }
-
- // Spawn towers
- for (uint8 i = 0; i < TB_TOWERS_COUNT; i++)
- if (GameObject* go = SpawnGameObject(TBTowers[i].entry, TBTowers[i].pos, QuaternionData::fromEulerAnglesZYX(TBTowers[i].pos.GetOrientation(), 0.0f, 0.0f)))
- Towers.insert(go->GetGUID());
-
- // Init Graveyards
- SetGraveyardNumber(BATTLEFIELD_TB_GRAVEYARD_MAX);
-
- // Graveyards
- for (uint8 i = 0; i < BATTLEFIELD_TB_GRAVEYARD_MAX; i++)
- {
- BfGraveyard* graveyard = new BfGraveyard(this);
-
- // When between games, the graveyard is controlled by the defending team
- graveyard->Initialize(GetDefenderTeam(), TBGraveyards[i].gyid);
-
- // Spawn spirits
- for (uint8 team = 0; team < 2; team++)
- if (Creature* creature = SpawnCreature(TBGraveyards[i].spiritEntry[team], TBGraveyards[i].pos))
- graveyard->SetSpirit(creature, TeamId(team));
-
- m_GraveyardList[i] = graveyard;
- }
-
- // Time warning vars
- warnedFiveMinutes = false;
- warnedTwoMinutes = false;
- warnedOneMinute = false;
-
- UpdateNPCsAndGameObjects();
-
- return true;
-}
-
-bool BattlefieldTB::Update(uint32 diff)
-{
- bool m_return = Battlefield::Update(diff);
-
- // Minutes till battle preparation warnings
- if (GetState() == BATTLEFIELD_INACTIVE)
- {
- if (m_Timer <= 5 * MINUTE * IN_MILLISECONDS + m_StartGroupingTimer && !warnedFiveMinutes)
- {
- warnedFiveMinutes = true;
- SendWarning(TB_TEXT_PREPARATIONS_IN_5_MIN);
- }
-
- if (m_Timer <= 2 * MINUTE * IN_MILLISECONDS + m_StartGroupingTimer && !warnedTwoMinutes)
- {
- warnedTwoMinutes = true;
- SendWarning(TB_TEXT_PREPARATIONS_IN_2_MIN);
- }
-
- if (m_Timer <= 1 * MINUTE * IN_MILLISECONDS + m_StartGroupingTimer && !warnedOneMinute)
- {
- warnedOneMinute = true;
- SendWarning(TB_TEXT_PREPARATIONS_IN_1_MIN);
- }
- }
-
- if (!updatedNPCAndObjects)
- {
- if (m_updateObjectsTimer <= diff)
- {
- UpdateNPCsAndGameObjects();
- updatedNPCAndObjects = true;
- }
- else
- m_updateObjectsTimer -= diff;
- }
-
- return m_return;
-}
-
-void BattlefieldTB::OnPlayerEnterZone(Player* player)
-{
- if (!m_isActive)
- RemoveAurasFromPlayer(player);
-}
-
-void BattlefieldTB::OnPlayerLeaveZone(Player* player)
-{
- if (!m_isActive)
- RemoveAurasFromPlayer(player);
-}
-
-void BattlefieldTB::OnPlayerJoinWar(Player* player)
-{
- RemoveAurasFromPlayer(player);
-
- player->SetPvP(true);
-
- // Bonus damage buff for attackers
- if (player->GetTeamId() == GetAttackerTeam())
- {
- int32 towersDestroyed = sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_TOWERS_DESTROYED, m_Map);
- if (towersDestroyed > 0)
- player->CastSpell(player, SPELL_TOWER_ATTACK_BONUS, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_AURA_STACK, towersDestroyed));
- }
-}
-
-void BattlefieldTB::OnPlayerLeaveWar(Player* player)
-{
- RemoveAurasFromPlayer(player);
-}
-
-void BattlefieldTB::RemoveAurasFromPlayer(Player* player)
-{
- player->RemoveAurasDueToSpell(SPELL_TB_SLOW_FALL);
- player->RemoveAurasDueToSpell(SPELL_TB_VETERAN);
- player->RemoveAurasDueToSpell(SPELL_TOWER_ATTACK_BONUS);
- player->RemoveAurasDueToSpell(SPELL_TB_SPIRITUAL_IMMUNITY);
-}
-
-void BattlefieldTB::OnStartGrouping()
-{
- UpdateNPCsAndGameObjects();
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_STATE_PREPARATIONS, 1, false, m_Map);
-
- // Teleport players out of questing area
- for (uint8 team = 0; team < PVP_TEAMS_COUNT; ++team)
- for (ObjectGuid const& guid : m_players[team])
- if (Player* player = ObjectAccessor::FindPlayer(guid))
- if (player->GetAreaId() == TBQuestAreas[m_iCellblockRandom].entry)
- player->CastSpell(player, TBQuestAreas[m_iCellblockRandom].teleportSpell, true);
-
- // Should we also teleport players out of Baradin Hold underground area?
-}
-
-void BattlefieldTB::OnBattleStart()
-{
- SetData(BATTLEFIELD_TB_DATA_TOWERS_INTACT, uint32(3));
-
- UpdateNPCsAndGameObjects();
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_BATTLE_END_SHOW, 1, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_BATTLE_END, GameTime::GetGameTime() + m_Timer / IN_MILLISECONDS, false, m_Map);
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE_SHOW, 0, false, m_Map);
- sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, 0, false, m_Map);
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_ALLIANCE_ATTACKING_SHOW, GetAttackerTeam() == TEAM_ALLIANCE ? 1 : 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_HORDE_ATTACKING_SHOW, GetAttackerTeam() == TEAM_HORDE ? 1 : 0, false, m_Map);
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_ALLIANCE_CONTROLS_SHOW, 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_HORDE_CONTROLS_SHOW, 0, false, m_Map);
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_BUILDINGS_CAPTURED_SHOW, 1, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_BUILDINGS_CAPTURED, 0, false, m_Map);
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TOWERS_DESTROYED_SHOW, 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TOWERS_DESTROYED, 0, false, m_Map);
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_STATE_PREPARATIONS, 0, false, m_Map);
- sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_STATE_BATTLE, 1, false, m_Map);
-
- // Towers/spires
- for (uint8 i = 0; i < TB_TOWERS_COUNT; i++)
- {
- sWorldStateMgr->SetValue(TBTowers[i].wsIntact[GetDefenderTeam()], 1, false, m_Map);
- sWorldStateMgr->SetValue(TBTowers[i].wsDamaged[GetDefenderTeam()], 0, false, m_Map);
- sWorldStateMgr->SetValue(TBTowers[i].wsDestroyed, 0, false, m_Map);
- sWorldStateMgr->SetValue(TBTowers[i].wsDamaged[GetAttackerTeam()], 0, false, m_Map);
- sWorldStateMgr->SetValue(TBTowers[i].wsIntact[GetAttackerTeam()], 0, false, m_Map);
- }
-}
-
-void BattlefieldTB::OnBattleEnd(bool endByTimer)
-{
- if (!endByTimer) // Attackers win (but now they are defenders already)
- SendWarning(GetDefenderTeam() == TEAM_ALLIANCE ? TB_TEXT_FORTRESS_CAPTURE_ALLIANCE : TB_TEXT_FORTRESS_CAPTURE_HORDE);
- else // Defenders win
- SendWarning(GetDefenderTeam() == TEAM_ALLIANCE ? TB_TEXT_FORTRESS_DEFEND_ALLIANCE : TB_TEXT_FORTRESS_DEFEND_HORDE);
-
- // UpdateNPCsAndGameObjects() must be called 1 minute after battle ends
- m_updateObjectsTimer = 1 * MINUTE * IN_MILLISECONDS;
- updatedNPCAndObjects = false;
-
- // Complete quest
- TeamCastSpell(GetDefenderTeam(), GetDefenderTeam() == TEAM_ALLIANCE ? SPELL_VICTORY_ALLIANCE : SPELL_VICTORY_HORDE);
-
- // Rewards
- TeamCastSpell(GetDefenderTeam(), GetDefenderTeam() == TEAM_ALLIANCE ? SPELL_REWARD_VICTORY_ALLIANCE : SPELL_REWARD_VICTORY_HORDE);
- for (uint32 i = 0; i < GetData(BATTLEFIELD_TB_DATA_TOWERS_INTACT); i++) // Unsure, for each intact tower or only once for having any tower intact?
- TeamCastSpell(GetDefenderTeam(), SPELL_REWARD_TOWER_INTACT);
- TeamCastSpell(GetAttackerTeam(), SPELL_REWARD_DEFEAT);
-
- for (uint8 team = 0; team < 2; ++team)
- {
- for (ObjectGuid const& guid : m_PlayersInWar[team])
- if (Player* player = ObjectAccessor::FindPlayer(guid))
- RemoveAurasFromPlayer(player);
-
- m_PlayersInWar[team].clear();
- }
-
- // Reset time warning vars
- warnedFiveMinutes = false;
- warnedTwoMinutes = false;
- warnedOneMinute = false;
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_BATTLE_END_SHOW, 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_BATTLE_END, 0, false, m_Map);
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE_SHOW, 1, false, m_Map);
- sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_TIME_NEXT_BATTLE, GameTime::GetGameTime() + m_NoWarBattleTime / IN_MILLISECONDS, false, m_Map);
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_ALLIANCE_ATTACKING_SHOW, 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_HORDE_ATTACKING_SHOW, 0, false, m_Map);
-
- sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_FACTION_CONTROLLING, GetDefenderTeam() + 1, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_ALLIANCE_CONTROLS_SHOW, GetDefenderTeam() == TEAM_ALLIANCE ? 1 : 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_HORDE_CONTROLS_SHOW, GetDefenderTeam() == TEAM_HORDE ? 1 : 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_KEEP_ALLIANCE, GetDefenderTeam() == TEAM_ALLIANCE ? 1 : 0, false, m_Map);
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_KEEP_HORDE, GetDefenderTeam() == TEAM_HORDE ? 1 : 0, false, m_Map);
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_BUILDINGS_CAPTURED_SHOW, 0, false, m_Map);
-
- sWorldStateMgr->SetValueAndSaveInDb(WS_BATTLEFIELD_TB_STATE_BATTLE, 0, false, m_Map);
-}
-
-void BattlefieldTB::UpdateNPCsAndGameObjects()
-{
- for (ObjectGuid guid : BattleInactiveNPCs)
- if (Creature* creature = GetCreature(guid))
- HideNpc(creature);
-
- for (ObjectGuid guid : BattleInactiveGOs)
- if (GameObject* gameobject = GetGameObject(guid))
- gameobject->SetRespawnTime(RESPAWN_ONE_DAY);
-
- for (ObjectGuid guid : TemporaryNPCs)
- if (Creature* creature = GetCreature(guid))
- creature->RemoveFromWorld();
- TemporaryNPCs.clear();
-
- for (ObjectGuid guid : TemporaryGOs)
- if (GameObject* gameobject = GetGameObject(guid))
- gameobject->Delete();
- TemporaryGOs.clear();
-
- // Tol Barad gates - closed during warmup
- if (GameObject* gates = GetGameObject(TBGatesGUID))
- gates->SetGoState(GetState() == BATTLEFIELD_WARMUP ? GO_STATE_READY : GO_STATE_ACTIVE);
-
- // Baradin Hold door - open when inactive
- if (GameObject* door = GetGameObject(TBDoorGUID))
- door->SetGoState(GetState() == BATTLEFIELD_INACTIVE ? GO_STATE_ACTIVE : GO_STATE_READY);
-
- // Decide which cellblock and questgiver will be active.
- m_iCellblockRandom = GetState() == BATTLEFIELD_INACTIVE ? urand(CELLBLOCK_THE_HOLE, CELLBLOCK_CURSED_DEPTHS) : uint8(CELLBLOCK_NONE);
-
- // To The Hole gate
- if (GameObject* door = GetGameObject(m_gateToTheHoleGUID))
- door->SetGoState(m_iCellblockRandom == CELLBLOCK_THE_HOLE ? GO_STATE_ACTIVE : GO_STATE_READY);
-
- // D-Block gate
- if (GameObject* door = GetGameObject(m_gateDBlockGUID))
- door->SetGoState(m_iCellblockRandom == CELLBLOCK_D_BLOCK ? GO_STATE_ACTIVE : GO_STATE_READY);
-
- // Cursed Depths gate
- if (GameObject* door = GetGameObject(m_gateCursedDepthsGUID))
- door->SetGoState(m_iCellblockRandom == CELLBLOCK_CURSED_DEPTHS ? GO_STATE_ACTIVE : GO_STATE_READY);
-
- if (GetState() == BATTLEFIELD_INACTIVE)
- {
- // Delete capture points
- ControlZoneHandlers.clear();
-
- // Create capture points
- for (uint8 i = 0; i < TB_BASE_COUNT; i++)
- {
- if (GameObject* go = SpawnGameObject(TBCapturePoints[i].entryFlagPole[GetDefenderTeam()], TBCapturePoints[i].pos, QuaternionData::fromEulerAnglesZYX(TBCapturePoints[i].pos.GetOrientation(), 0.0f, 0.0f)))
- {
- std::unique_ptr<TolBaradCapturePoint> controlZone = std::make_unique<TolBaradCapturePoint>(this, TBCapturePoints[i]);
- if (GetDefenderTeam() == TEAM_ALLIANCE)
- {
- sWorldStateMgr->SetValue(controlZone->GetWorldStateAllianceControlled(), 1, false, GetMap());
- go->HandleCustomTypeCommand(GameObjectType::SetControlZoneValue(100));
- go->SetGoArtKit(TB_GO_ARTKIT_FLAG_ALLIANCE);
- }
- else if (GetDefenderTeam() == TEAM_HORDE)
- {
- sWorldStateMgr->SetValue(controlZone->GetWorldStateHordeControlled(), 1, false, GetMap());
- go->HandleCustomTypeCommand(GameObjectType::SetControlZoneValue(0));
- go->SetGoArtKit(TB_GO_ARTKIT_FLAG_HORDE);
- }
-
- ControlZoneHandlers[go->GetEntry()] = std::move(controlZone);
- }
- }
-
- for (ObjectGuid guid : BattleInactiveNPCs)
- if (Creature* creature = GetCreature(guid))
- ShowNpc(creature, true);
-
- for (ObjectGuid guid : BattleInactiveGOs)
- if (GameObject* gameobject = GetGameObject(guid))
- gameobject->SetRespawnTime(RESPAWN_IMMEDIATELY);
-
- for (uint8 i = 0; i < TB_QUEST_INFANTRY_MAX; i++)
- {
- uint32 entry = TB_QUEST_INFANTRY[GetDefenderTeam()][urand(0,3)];
- if (Creature* creature = SpawnCreature(entry, TBQuestInfantrySpawnData[i]))
- TemporaryNPCs.insert(creature->GetGUID());
- }
-
- for (uint8 i = 0; i < TB_GUARDS_MAX; i++)
- if (Creature* creature = SpawnCreature(GetDefenderTeam() == TEAM_ALLIANCE ? NPC_BARADIN_GUARD : NPC_HELLSCREAMS_SENTRY, GuardNPCSpawns[i]))
- TemporaryNPCs.insert(creature->GetGUID());
-
- for (uint8 i = 0; i < TB_FACTION_NPC_MAX; i++)
- if (Creature* creature = SpawnCreature(GetDefenderTeam() == TEAM_ALLIANCE ? FactionNPCSpawns[i].entryAlliance : FactionNPCSpawns[i].entryHorde, FactionNPCSpawns[i].pos))
- TemporaryNPCs.insert(creature->GetGUID());
-
- if (Creature* creature = SpawnCreature(RandomQuestgivers[GetDefenderTeam()][m_iCellblockRandom], RandomQuestgiverPos))
- TemporaryNPCs.insert(creature->GetGUID());
-
- // Spawn portals
- for (uint8 i = 0; i < TB_PORTAL_MAX; i++)
- if (GameObject* go = SpawnGameObject(TBPortalEntry[GetDefenderTeam()], TBPortals[i], QuaternionData::fromEulerAnglesZYX(TBPortals[i].GetOrientation(), 0.0f, 0.0f)))
- TemporaryGOs.insert(go->GetGUID());
-
- // Update towers
- for (ObjectGuid guid : Towers)
- if (GameObject* go = GetGameObject(guid))
- go->SetDestructibleState(GO_DESTRUCTIBLE_REBUILDING);
- }
- else if (GetState() == BATTLEFIELD_IN_PROGRESS)
- {
- for (uint8 i = 0; i < TB_ABANDONED_SIEGE_ENGINE_COUNT; i++)
- if (Creature* creature = SpawnCreature(NPC_ABANDONED_SIEGE_ENGINE, TBAbandonedSiegeEngineSpawnData[i]))
- TemporaryNPCs.insert(creature->GetGUID());
-
- for (ObjectGuid guid : Towers)
- {
- if (GameObject* go = GetGameObject(guid))
- {
- go->SetDestructibleState(GO_DESTRUCTIBLE_INTACT);
- go->ModifyHealth(go->GetGOValue()->Building.MaxHealth);
- }
- }
- }
-
- // Spawn banners
- for (uint8 i = 0; i < TB_BANNER_MAX; i++)
- if (GameObject* go = SpawnGameObject(TBBannerEntry[GetDefenderTeam()], TBBanners[i], QuaternionData::fromEulerAnglesZYX(TBBanners[i].GetOrientation(), 0.0f, 0.0f)))
- TemporaryGOs.insert(go->GetGUID());
-
- // Set graveyard controls
- for (uint8 i = 0; i < BATTLEFIELD_TB_GRAVEYARD_MAX; i++)
- if (BfGraveyard* graveyard = GetGraveyardById(i))
- graveyard->GiveControlTo(!IsWarTime() || TBGraveyards[i].defenderControls ? GetDefenderTeam() : GetAttackerTeam());
-}
-
-void BattlefieldTB::OnCreatureCreate(Creature* creature)
-{
- switch (creature->GetEntry())
- {
- // Store NPCs that need visibility toggling
- case NPC_TOLBARAD_CAPTIVE_SPIRIT:
- case NPC_TOLBARAD_CELLBLOCK_OOZE:
- case NPC_TOLBARAD_ARCHMAGE_GALUS:
- case NPC_TOLBARAD_GHASTLY_CONVICT:
- case NPC_TOLBARAD_SHIVARRA_DESTROYER:
- case NPC_TOLBARAD_CELL_WATCHER:
- case NPC_TOLBARAD_SVARNOS:
- case NPC_TOLBARAD_JAILED_WRATHGUARD:
- case NPC_TOLBARAD_IMPRISONED_IMP:
- case NPC_TOLBARAD_WARDEN_SILVA:
- case NPC_TOLBARAD_WARDEN_GUARD:
- case NPC_TOLBARAD_IMPRISONED_WORKER:
- case NPC_TOLBARAD_EXILED_MAGE:
- case NPC_CROCOLISK:
- case NPC_PROBLIM:
- BattleInactiveNPCs.insert(creature->GetGUID());
- if (GetState() == BATTLEFIELD_WARMUP) // If battle is about to start, we must hide these.
- HideNpc(creature);
- break;
- case NPC_ABANDONED_SIEGE_ENGINE:
- creature->SetFaction(TBFactions[GetDefenderTeam()]);
- creature->CastSpell(creature, SPELL_THICK_LAYER_OF_RUST, true);
- break;
- case NPC_SIEGE_ENGINE_TURRET:
- if (Unit* vehiclebase = creature->GetCharmerOrOwner()->GetVehicleBase())
- creature->EnterVehicle(vehiclebase);
- break;
- case NPC_TOWER_RANGE_FINDER:
- creature->CastSpell(creature, SPELL_TOWER_RANGE_FINDER_PERIODIC, true);
- break;
- case NPC_TB_GY_SPIRIT_BARADIN_HOLD_A:
- case NPC_TB_GY_SPIRIT_BARADIN_HOLD_H:
- case NPC_TB_GY_SPIRIT_IRONCLAD_GARRISON_A:
- case NPC_TB_GY_SPIRIT_WARDENS_VIGIL_A:
- case NPC_TB_GY_SPIRIT_EAST_SPIRE_A:
- case NPC_TB_GY_SPIRIT_SOUTH_SPIRE_A:
- case NPC_TB_GY_SPIRIT_WEST_SPIRE_A:
- case NPC_TB_GY_SPIRIT_SLAGWORKS_A:
- case NPC_TB_GY_SPIRIT_IRONCLAD_GARRISON_H:
- case NPC_TB_GY_SPIRIT_WARDENS_VIGIL_H:
- case NPC_TB_GY_SPIRIT_SLAGWORKS_H:
- case NPC_TB_GY_SPIRIT_WEST_SPIRE_H:
- case NPC_TB_GY_SPIRIT_EAST_SPIRE_H:
- case NPC_TB_GY_SPIRIT_SOUTH_SPIRE_H:
- creature->CastSpell(creature, SPELL_TB_SPIRITUAL_IMMUNITY, true);
- break;
- default:
- break;
- }
-}
-
-void BattlefieldTB::OnGameObjectCreate(GameObject* go)
-{
- switch (go->GetEntry())
- {
- case GO_TOLBARAD_GATES:
- TBGatesGUID = go->GetGUID();
- go->SetGoState(GetState() == BATTLEFIELD_WARMUP ? GO_STATE_READY : GO_STATE_ACTIVE);
- break;
- case GO_TOLBARAD_DOOR:
- TBDoorGUID = go->GetGUID();
- go->SetGoState(GetState() == BATTLEFIELD_INACTIVE ? GO_STATE_ACTIVE : GO_STATE_READY);
- break;
- case GO_GATE_TO_THE_HOLE:
- m_gateToTheHoleGUID = go->GetGUID();
- go->SetGoState(m_iCellblockRandom == CELLBLOCK_THE_HOLE ? GO_STATE_ACTIVE : GO_STATE_READY);
- break;
- case GO_GATE_D_BLOCK:
- m_gateDBlockGUID = go->GetGUID();
- go->SetGoState(m_iCellblockRandom == CELLBLOCK_D_BLOCK ? GO_STATE_ACTIVE : GO_STATE_READY);
- break;
- case GO_CURSED_DEPTHS_GATE:
- m_gateCursedDepthsGUID = go->GetGUID();
- go->SetGoState(m_iCellblockRandom == CELLBLOCK_CURSED_DEPTHS ? GO_STATE_ACTIVE : GO_STATE_READY);
- break;
- case GO_CRATE_OF_CELLBLOCK_RATIONS:
- case GO_CURSED_SHACKLES:
- case GO_DUSTY_PRISON_JOURNAL:
- case GO_TB_MEETING_STONE:
- case GO_TB_INSTANCE_VISUAL_1:
- case GO_TB_INSTANCE_VISUAL_2:
- case GO_TB_INSTANCE_VISUAL_3:
- case GO_TB_INSTANCE_VISUAL_4:
- BattleInactiveGOs.insert(go->GetGUID());
- if (GetState() == BATTLEFIELD_WARMUP) // If battle is about to start, we must hide these.
- go->SetRespawnTime(RESPAWN_ONE_DAY);
- break;
- default:
- break;
- }
-}
-
-void BattlefieldTB::ProcessEvent(WorldObject* obj, uint32 eventId, WorldObject* invoker)
-{
- Battlefield::ProcessEvent(obj, eventId, invoker);
- if (!IsWarTime())
- return;
-
- if (eventId == EVENT_COUNT_CAPTURED_BASE)
- {
- UpdateCapturedBaseCount();
- return;
- }
-
- if (!obj)
- return;
-
- GameObject* go = obj->ToGameObject();
- if (!go)
- return;
-
- TBTowerId towerId;
- switch (go->GetEntry())
- {
- case GO_WEST_SPIRE:
- towerId = TB_TOWER_WEST_SPIRE;
- break;
- case GO_EAST_SPIRE:
- towerId = TB_TOWER_EAST_SPIRE;
- break;
- case GO_SOUTH_SPIRE:
- towerId = TB_TOWER_SOUTH_SPIRE;
- break;
- default:
- return;
- }
-
- if (go->GetDestructibleState() == GO_DESTRUCTIBLE_DAMAGED)
- TowerDamaged(towerId);
- else if (go->GetDestructibleState() == GO_DESTRUCTIBLE_DESTROYED)
- TowerDestroyed(towerId);
-}
-
-void BattlefieldTB::TowerDamaged(TBTowerId tbTowerId)
-{
- if (!IsWarTime())
- return;
-
- SendWarning(TBTowers[tbTowerId].textDamaged);
-
- SetData(BATTLEFIELD_TB_DATA_TOWERS_INTACT, GetData(BATTLEFIELD_TB_DATA_TOWERS_INTACT) - 1);
-
- sWorldStateMgr->SetValue(TBTowers[tbTowerId].wsIntact[GetDefenderTeam()], 0, false, m_Map);
- sWorldStateMgr->SetValue(TBTowers[tbTowerId].wsDamaged[GetDefenderTeam()], 1, false, m_Map);
-
- TeamCastSpell(GetAttackerTeam(), SPELL_REWARD_TOWER_DAMAGED);
-}
-
-void BattlefieldTB::TowerDestroyed(TBTowerId tbTowerId)
-{
- if (!IsWarTime())
- return;
-
- // Add 5 minute bonus time
- m_Timer += m_BonusTime;
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TIME_BATTLE_END, GameTime::GetGameTime() + m_Timer / IN_MILLISECONDS, false, m_Map);
-
- SendWarning(TBTowers[tbTowerId].textDestroyed);
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TOWERS_DESTROYED_SHOW, 1, false, m_Map);
- int32 towersDestroyed = sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_TOWERS_DESTROYED, m_Map) + 1;
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_TOWERS_DESTROYED, towersDestroyed, false, m_Map);
-
- sWorldStateMgr->SetValue(TBTowers[tbTowerId].wsDamaged[GetDefenderTeam()], 0, false, m_Map);
- sWorldStateMgr->SetValue(TBTowers[tbTowerId].wsDestroyed, 1, false, m_Map);
-
- // Attack bonus buff
- for (ObjectGuid const& guid : m_PlayersInWar[GetAttackerTeam()])
- if (Player* player = ObjectAccessor::FindPlayer(guid))
- player->CastSpell(player, SPELL_TOWER_ATTACK_BONUS, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_AURA_STACK, towersDestroyed));
-
- // Honor reward
- TeamCastSpell(GetAttackerTeam(), SPELL_REWARD_TOWER_DESTROYED);
-}
-
-void BattlefieldTB::UpdateCapturedBaseCount()
-{
- uint32 numCapturedBases = 0; // How many bases attacker has captured
-
- // these world states are either 0 or 1
- if (GetAttackerTeam() == TEAM_ALLIANCE)
- {
- numCapturedBases += sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_GARRISON_ALLIANCE_CONTROLLED, GetMap());
- numCapturedBases += sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_VIGIL_ALLIANCE_CONTROLLED, GetMap());
- numCapturedBases += sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_SLAGWORKS_ALLIANCE_CONTROLLED, GetMap());
- }
- else if (GetAttackerTeam() == TEAM_HORDE)
- {
- numCapturedBases += sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_GARRISON_HORDE_CONTROLLED, GetMap());
- numCapturedBases += sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_VIGIL_HORDE_CONTROLLED, GetMap());
- numCapturedBases += sWorldStateMgr->GetValue(WS_BATTLEFIELD_TB_SLAGWORKS_HORDE_CONTROLLED, GetMap());
- }
-
- sWorldStateMgr->SetValue(WS_BATTLEFIELD_TB_BUILDINGS_CAPTURED, numCapturedBases, false, m_Map);
-
- // Check if attackers won
- if (numCapturedBases == TB_BASE_COUNT)
- EndBattle(false);
-}
-
-// Called when player kill a unit in wg zone
-void BattlefieldTB::HandleKill(Player* killer, Unit* victim)
-{
- if (killer == victim || victim->GetTypeId() != TYPEID_PLAYER)
- return;
-
- TeamId killerTeam = killer->GetTeamId();
- for (ObjectGuid const& guid : m_PlayersInWar[killerTeam])
- if (Player* player = ObjectAccessor::FindPlayer(guid))
- if (player->GetDistance2d(killer) < 40.0f)
- PromotePlayer(player);
-}
-
-void BattlefieldTB::PromotePlayer(Player* killer)
-{
- if (!m_isActive || killer->HasAura(SPELL_TB_VETERAN))
- return;
-
- killer->CastSpell(killer, SPELL_TB_VETERAN, true);
-}
-
-TolBaradCapturePoint::TolBaradCapturePoint(BattlefieldTB* battlefield, TBCapturePointSpawnData const& data) : BattlefieldControlZoneHandler(battlefield),
- _textIdHordeCaptured(data.textGained[TEAM_HORDE]), _textIdAllianceCaptured(data.textGained[TEAM_ALLIANCE]),
- _textIdHordeLost(data.textLost[TEAM_HORDE]), _textIdAllianceLost(data.textLost[TEAM_ALLIANCE]),
- _worldstateHordeControlled(data.wsControlled[TEAM_HORDE]), _worldstateAllianceControlled(data.wsControlled[TEAM_ALLIANCE]),
- _worldstateHordeCapturing(data.wsCapturing[TEAM_HORDE]), _worldstateAllianceCapturing(data.wsCapturing[TEAM_ALLIANCE]),
- _worldstateNeutral(data.wsNeutral)
-{
-}
-
-void TolBaradCapturePoint::HandleContestedEventHorde(GameObject* controlZone)
-{
- BattlefieldControlZoneHandler::HandleContestedEventHorde(controlZone);
-}
-
-void TolBaradCapturePoint::HandleContestedEventAlliance(GameObject* controlZone)
-{
- BattlefieldControlZoneHandler::HandleContestedEventAlliance(controlZone);
-}
-
-void TolBaradCapturePoint::HandleProgressEventHorde(GameObject* controlZone)
-{
- BattlefieldControlZoneHandler::HandleProgressEventHorde(controlZone);
- GetBattlefield()->SendWarning(_textIdHordeCaptured);
- controlZone->SetGoArtKit(TB_GO_ARTKIT_FLAG_HORDE);
- sWorldStateMgr->SetValue(_worldstateHordeControlled, 1, false, controlZone->GetMap());
- sWorldStateMgr->SetValue(_worldstateHordeCapturing, 0, false, controlZone->GetMap());
- GetBattlefield()->ProcessEvent(nullptr, EVENT_COUNT_CAPTURED_BASE, nullptr);
-}
-
-void TolBaradCapturePoint::HandleProgressEventAlliance(GameObject* controlZone)
-{
- BattlefieldControlZoneHandler::HandleProgressEventAlliance(controlZone);
- GetBattlefield()->SendWarning(_textIdAllianceCaptured);
- controlZone->SetGoArtKit(TB_GO_ARTKIT_FLAG_ALLIANCE);
- sWorldStateMgr->SetValue(_worldstateAllianceControlled, 1, false, controlZone->GetMap());
- sWorldStateMgr->SetValue(_worldstateAllianceCapturing, 0, false, controlZone->GetMap());
- GetBattlefield()->ProcessEvent(nullptr, EVENT_COUNT_CAPTURED_BASE, nullptr);
-}
-
-void TolBaradCapturePoint::HandleNeutralEventHorde(GameObject* controlZone)
-{
- GetBattlefield()->SendWarning(_textIdHordeLost);
- sWorldStateMgr->SetValue(_worldstateHordeControlled, 0, false, controlZone->GetMap());
- sWorldStateMgr->SetValue(_worldstateAllianceCapturing, 1, false, controlZone->GetMap());
- BattlefieldControlZoneHandler::HandleNeutralEventHorde(controlZone);
-}
-
-void TolBaradCapturePoint::HandleNeutralEventAlliance(GameObject* controlZone)
-{
- GetBattlefield()->SendWarning(_textIdAllianceLost);
- sWorldStateMgr->SetValue(_worldstateAllianceControlled, 0, false, controlZone->GetMap());
- sWorldStateMgr->SetValue(_worldstateHordeCapturing, 1, false, controlZone->GetMap());
- BattlefieldControlZoneHandler::HandleNeutralEventAlliance(controlZone);
-}
-
-void TolBaradCapturePoint::HandleNeutralEvent(GameObject* controlZone)
-{
- BattlefieldControlZoneHandler::HandleNeutralEvent(controlZone);
- controlZone->SetGoArtKit(TB_GO_ARTKIT_FLAG_NONE);
-}
-
-class Battlefield_tol_barad : public BattlefieldScript
-{
-public:
- Battlefield_tol_barad() : BattlefieldScript("battlefield_tb") { }
-
- Battlefield* GetBattlefield(Map* map) const override
- {
- return new BattlefieldTB(map);
- }
-};
-
-void AddSC_BF_tol_barad()
-{
- new Battlefield_tol_barad();
-}