aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Battlefield/Battlefield.cpp7
-rw-r--r--src/server/game/Battlefield/Battlefield.h2
-rw-r--r--src/server/game/Battlefield/BattlefieldMgr.cpp122
-rw-r--r--src/server/game/Battlefield/BattlefieldMgr.h31
-rw-r--r--src/server/game/Entities/Object/Object.cpp2
-rw-r--r--src/server/game/Entities/Player/Player.cpp4
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp2
-rw-r--r--src/server/game/Handlers/BattleGroundHandler.cpp6
-rw-r--r--src/server/game/Maps/Map.cpp3
-rw-r--r--src/server/game/Scripting/ScriptMgr.cpp4
-rw-r--r--src/server/game/Scripting/ScriptMgr.h4
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp2
-rw-r--r--src/server/game/Spells/Spell.cpp2
-rw-r--r--src/server/game/Spells/SpellMgr.cpp8
-rw-r--r--src/server/scripts/Battlefield/BattlefieldTB.cpp6
-rw-r--r--src/server/scripts/Battlefield/BattlefieldTB.h1
-rw-r--r--src/server/scripts/Battlefield/BattlefieldWG.cpp28
-rw-r--r--src/server/scripts/Battlefield/BattlefieldWG.h1
-rw-r--r--src/server/scripts/Commands/cs_bf.cpp11
-rw-r--r--src/server/scripts/Commands/cs_debug.cpp2
-rw-r--r--src/server/scripts/Northrend/zone_wintergrasp.cpp26
21 files changed, 160 insertions, 114 deletions
diff --git a/src/server/game/Battlefield/Battlefield.cpp b/src/server/game/Battlefield/Battlefield.cpp
index 6542277bea1..94881ea0f32 100644
--- a/src/server/game/Battlefield/Battlefield.cpp
+++ b/src/server/game/Battlefield/Battlefield.cpp
@@ -33,10 +33,9 @@
#include "ObjectAccessor.h"
#include "ObjectMgr.h"
#include "WorldSession.h"
-#include "WorldStatePackets.h"
#include <G3D/g3dmath.h>
-Battlefield::Battlefield()
+Battlefield::Battlefield(Map* map)
{
m_Timer = 0;
m_IsEnabled = true;
@@ -46,8 +45,8 @@ Battlefield::Battlefield()
m_TypeId = 0;
m_BattleId = 0;
m_ZoneId = 0;
- m_Map = nullptr;
- m_MapId = 0;
+ m_Map = map;
+ m_MapId = map->GetId();
m_MaxPlayer = 0;
m_MinPlayer = 0;
m_MinLevel = 0;
diff --git a/src/server/game/Battlefield/Battlefield.h b/src/server/game/Battlefield/Battlefield.h
index 09fddd04750..4ef68b4343c 100644
--- a/src/server/game/Battlefield/Battlefield.h
+++ b/src/server/game/Battlefield/Battlefield.h
@@ -212,7 +212,7 @@ class TC_GAME_API Battlefield : public ZoneScript
public:
/// Constructor
- Battlefield();
+ explicit Battlefield(Map* map);
/// Destructor
virtual ~Battlefield();
diff --git a/src/server/game/Battlefield/BattlefieldMgr.cpp b/src/server/game/Battlefield/BattlefieldMgr.cpp
index 4f1e0e1e824..a0400ff6090 100644
--- a/src/server/game/Battlefield/BattlefieldMgr.cpp
+++ b/src/server/game/Battlefield/BattlefieldMgr.cpp
@@ -16,25 +16,28 @@
*/
#include "BattlefieldMgr.h"
+#include "Containers.h"
#include "DatabaseEnv.h"
-#include "ObjectMgr.h"
#include "Log.h"
+#include "Map.h"
+#include "ObjectMgr.h"
#include "Player.h"
#include "ScriptMgr.h"
-BattlefieldMgr::BattlefieldMgr()
+namespace
{
- _updateTimer = 0;
+constexpr std::array<uint32, BATTLEFIELD_MAX> BattlefieldIdToMapId = { 0, 571, 732 };
+constexpr std::array<uint32, BATTLEFIELD_MAX> BattlefieldIdToZoneId = { 0, 4197, 5095 }; // imitate World_PVP_Area.db2
+std::array<uint32, BATTLEFIELD_MAX> BattlefieldIdToScriptId = { 0, 0, 0 };
}
-BattlefieldMgr::~BattlefieldMgr()
+BattlefieldMgr::BattlefieldMgr()
{
- for (BattlefieldSet::iterator itr = _battlefieldSet.begin(); itr != _battlefieldSet.end(); ++itr)
- delete *itr;
-
- _battlefieldMap.clear();
+ _updateTimer = 0;
}
+BattlefieldMgr::~BattlefieldMgr() = default;
+
BattlefieldMgr* BattlefieldMgr::instance()
{
static BattlefieldMgr instance;
@@ -61,22 +64,8 @@ void BattlefieldMgr::InitBattlefield()
continue;
}
- uint32 scriptId = sObjectMgr->GetScriptId(fields[1].GetString());
+ BattlefieldIdToScriptId[typeId] = sObjectMgr->GetScriptId(fields[1].GetString());
- Battlefield* bf = sScriptMgr->CreateBattlefield(scriptId);
- if (!bf)
- continue;
-
- if (!bf->SetupBattlefield())
- {
- TC_LOG_INFO("bg.battlefield", "Setting up battlefield with TypeId %u failed.", typeId);
- delete bf;
- }
- else
- {
- _battlefieldSet.push_back(bf);
- TC_LOG_INFO("bg.battlefield", "Setting up battlefield with TypeId %u succeeded.", typeId);
- }
++count;
} while (result->NextRow());
@@ -85,15 +74,45 @@ void BattlefieldMgr::InitBattlefield()
TC_LOG_INFO("server.loading", ">> Loaded %u battlefields in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
}
+void BattlefieldMgr::CreateBattlefieldsForMap(Map* map)
+{
+ for (uint32 i = 0; i < BATTLEFIELD_MAX; ++i)
+ {
+ if (!BattlefieldIdToScriptId[i])
+ continue;
+
+ if (BattlefieldIdToMapId[i] != map->GetId())
+ continue;
+
+ Battlefield* bf = sScriptMgr->CreateBattlefield(BattlefieldIdToScriptId[i], map);
+ if (!bf)
+ continue;
+
+ if (!bf->SetupBattlefield())
+ {
+ TC_LOG_INFO("bg.battlefield", "Setting up battlefield with TypeId %u on map %u instance id %u failed.", i, map->GetId(), map->GetInstanceId());
+ delete bf;
+ }
+
+ _battlefieldsByMap[map].emplace_back(bf);
+ TC_LOG_INFO("bg.battlefield", "Setting up battlefield with TypeId %u on map %u instance id %u succeeded.", i, map->GetId(), map->GetInstanceId());
+ }
+}
+
+void BattlefieldMgr::DestroyBattlefieldsForMap(Map const* map)
+{
+ _battlefieldsByMap.erase(map);
+}
+
void BattlefieldMgr::AddZone(uint32 zoneId, Battlefield* bf)
{
- _battlefieldMap[zoneId] = bf;
+ _battlefieldsByZone[{ bf->GetMap(), zoneId }] = bf;
}
void BattlefieldMgr::HandlePlayerEnterZone(Player* player, uint32 zoneId)
{
- BattlefieldMap::iterator itr = _battlefieldMap.find(zoneId);
- if (itr == _battlefieldMap.end())
+ auto itr = _battlefieldsByZone.find({ player->GetMap(), zoneId });
+ if (itr == _battlefieldsByZone.end())
return;
Battlefield* bf = itr->second;
@@ -106,8 +125,8 @@ void BattlefieldMgr::HandlePlayerEnterZone(Player* player, uint32 zoneId)
void BattlefieldMgr::HandlePlayerLeaveZone(Player* player, uint32 zoneId)
{
- BattlefieldMap::iterator itr = _battlefieldMap.find(zoneId);
- if (itr == _battlefieldMap.end())
+ auto itr = _battlefieldsByZone.find({ player->GetMap(), zoneId });
+ if (itr == _battlefieldsByZone.end())
return;
// teleport: remove once in removefromworld, once in updatezone
@@ -118,10 +137,15 @@ void BattlefieldMgr::HandlePlayerLeaveZone(Player* player, uint32 zoneId)
TC_LOG_DEBUG("bg.battlefield", "Player %s left battlefield id %u", player->GetGUID().ToString().c_str(), itr->second->GetTypeId());
}
-Battlefield* BattlefieldMgr::GetBattlefieldToZoneId(uint32 zoneId)
+bool BattlefieldMgr::IsWorldPvpArea(uint32 zoneId) const
{
- BattlefieldMap::iterator itr = _battlefieldMap.find(zoneId);
- if (itr == _battlefieldMap.end())
+ return std::find(BattlefieldIdToZoneId.begin(), BattlefieldIdToZoneId.end(), zoneId) != BattlefieldIdToZoneId.end();
+}
+
+Battlefield* BattlefieldMgr::GetBattlefieldToZoneId(Map const* map, uint32 zoneId)
+{
+ auto itr = _battlefieldsByZone.find({ map, zoneId });
+ if (itr == _battlefieldsByZone.end())
{
// no handle for this zone, return
return nullptr;
@@ -133,30 +157,12 @@ Battlefield* BattlefieldMgr::GetBattlefieldToZoneId(uint32 zoneId)
return itr->second;
}
-Battlefield* BattlefieldMgr::GetBattlefieldByBattleId(uint32 battleId)
+Battlefield* BattlefieldMgr::GetBattlefieldByBattleId(Map const* map, uint32 battleId)
{
- for (BattlefieldSet::iterator itr = _battlefieldSet.begin(); itr != _battlefieldSet.end(); ++itr)
- {
- if ((*itr)->GetBattleId() == battleId)
- return *itr;
- }
- return nullptr;
-}
-
-Battlefield* BattlefieldMgr::GetBattlefieldByQueueId(uint64 queueId)
-{
- for (Battlefield* bf : _battlefieldSet)
- if (bf->GetQueueId() == queueId)
- return bf;
-
- return nullptr;
-}
-
-ZoneScript* BattlefieldMgr::GetZoneScript(uint32 zoneId)
-{
- BattlefieldMap::iterator itr = _battlefieldMap.find(zoneId);
- if (itr != _battlefieldMap.end())
- return itr->second;
+ if (BattlefieldsMapByMap::mapped_type const* battlefields = Trinity::Containers::MapGetValuePtr(_battlefieldsByMap, map))
+ for (std::unique_ptr<Battlefield> const& battlefield : *battlefields)
+ if (battlefield->GetBattleId() == battleId)
+ return battlefield.get();
return nullptr;
}
@@ -166,9 +172,11 @@ void BattlefieldMgr::Update(uint32 diff)
_updateTimer += diff;
if (_updateTimer > BATTLEFIELD_OBJECTIVE_UPDATE_INTERVAL)
{
- for (BattlefieldSet::iterator itr = _battlefieldSet.begin(); itr != _battlefieldSet.end(); ++itr)
- if ((*itr)->IsEnabled())
- (*itr)->Update(_updateTimer);
+ for (auto const& [map, battlefields] : _battlefieldsByMap)
+ for (std::unique_ptr<Battlefield> const& bfItr : battlefields)
+ if (bfItr->IsEnabled())
+ bfItr->Update(_updateTimer);
+
_updateTimer = 0;
}
}
diff --git a/src/server/game/Battlefield/BattlefieldMgr.h b/src/server/game/Battlefield/BattlefieldMgr.h
index a18f3608bce..9f34d419dd8 100644
--- a/src/server/game/Battlefield/BattlefieldMgr.h
+++ b/src/server/game/Battlefield/BattlefieldMgr.h
@@ -19,6 +19,10 @@
#define BATTLEFIELD_MGR_H_
#include "Battlefield.h"
+#include "Hash.h"
+#include <memory>
+#include <unordered_map>
+#include <vector>
class Player;
class ZoneScript;
@@ -27,22 +31,31 @@ class ZoneScript;
class TC_GAME_API BattlefieldMgr
{
public:
+ BattlefieldMgr(BattlefieldMgr const&) = delete;
+ BattlefieldMgr(BattlefieldMgr&&) = delete;
+
+ BattlefieldMgr& operator=(BattlefieldMgr const&) = delete;
+ BattlefieldMgr& operator=(BattlefieldMgr&&) = delete;
+
static BattlefieldMgr* instance();
// create battlefield events
void InitBattlefield();
+ void CreateBattlefieldsForMap(Map* map);
+
+ void DestroyBattlefieldsForMap(Map const* map);
+
// called when a player enters an battlefield area
void HandlePlayerEnterZone(Player* player, uint32 zoneId);
// called when player leaves an battlefield area
void HandlePlayerLeaveZone(Player* player, uint32 zoneId);
- // return assigned battlefield
- Battlefield* GetBattlefieldToZoneId(uint32 zoneId);
- Battlefield* GetBattlefieldByBattleId(uint32 battleId);
- Battlefield* GetBattlefieldByQueueId(uint64 queueId);
+ bool IsWorldPvpArea(uint32 zoneId) const;
- ZoneScript* GetZoneScript(uint32 zoneId);
+ // return assigned battlefield
+ Battlefield* GetBattlefieldToZoneId(Map const* map, uint32 zoneId);
+ Battlefield* GetBattlefieldByBattleId(Map const* map, uint32 battleId);
void AddZone(uint32 zoneId, Battlefield* bf);
@@ -52,14 +65,14 @@ class TC_GAME_API BattlefieldMgr
BattlefieldMgr();
~BattlefieldMgr();
- typedef std::vector<Battlefield*> BattlefieldSet;
- typedef std::map<uint32 /*zoneId*/, Battlefield*> BattlefieldMap;
+ typedef std::unordered_map<Map const*, std::vector<std::unique_ptr<Battlefield>>> BattlefieldsMapByMap;
+ typedef std::unordered_map<std::pair<Map const*, uint32 /*zoneid*/>, Battlefield*> BattlefieldMapByZone;
// contains all initiated battlefield events
// used when initing / cleaning up
- BattlefieldSet _battlefieldSet;
+ BattlefieldsMapByMap _battlefieldsByMap;
// maps the zone ids to an battlefield event
// used in player event handling
- BattlefieldMap _battlefieldMap;
+ BattlefieldMapByZone _battlefieldsByZone;
// update interval
uint32 _updateTimer;
};
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 71a85d3d3f3..d4c8b8aec40 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -1901,7 +1901,7 @@ ZoneScript* WorldObject::FindZoneScript() const
return reinterpret_cast<ZoneScript*>(instanceMap->GetInstanceScript());
else if (!map->IsBattlegroundOrArena())
{
- if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId()))
+ if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(map, GetZoneId()))
return bf;
else
return sOutdoorPvPMgr->GetOutdoorPvPToZoneId(map, GetZoneId());
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 2f176ea74a4..6d428abf54e 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -4769,7 +4769,7 @@ void Player::RepopAtGraveyard()
ClosestGrave = bg->GetClosestGraveyard(this);
else
{
- if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId()))
+ if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(GetMap(), GetZoneId()))
ClosestGrave = bf->GetClosestGraveyard(this);
else
ClosestGrave = sObjectMgr->GetClosestGraveyard(*this, GetTeam(), this);
@@ -26736,7 +26736,7 @@ bool Player::IsAreaThatActivatesPvpTalents(uint32 areaID) const
if (area->Flags[0] & AREA_FLAG_ARENA)
return true;
- if (sBattlefieldMgr->GetBattlefieldToZoneId(area->ID))
+ if (sBattlefieldMgr->IsWorldPvpArea(area->ID))
return true;
area = sAreaTableStore.LookupEntry(area->ParentAreaID);
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index bf816e5409c..d42751dcbf0 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -10813,7 +10813,7 @@ void Unit::SetMeleeAnimKitId(uint16 animKitId)
if (OutdoorPvP* pvp = player->GetOutdoorPvP())
pvp->HandleKill(player, victim);
- if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetZoneId()))
+ if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetMap(), player->GetZoneId()))
bf->HandleKill(player, victim);
}
diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp
index 1cdf21855c7..6ba748d3f6b 100644
--- a/src/server/game/Handlers/BattleGroundHandler.cpp
+++ b/src/server/game/Handlers/BattleGroundHandler.cpp
@@ -661,7 +661,7 @@ void WorldSession::HandleAreaSpiritHealerQueryOpcode(WorldPackets::Battleground:
if (Battleground* bg = _player->GetBattleground())
sBattlegroundMgr->SendAreaSpiritHealerQueryOpcode(_player, bg, areaSpiritHealerQuery.HealerGuid);
- if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(_player->GetZoneId()))
+ if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(_player->GetMap(), _player->GetZoneId()))
bf->SendAreaSpiritHealerQueryOpcode(_player, areaSpiritHealerQuery.HealerGuid);
}
@@ -677,7 +677,7 @@ void WorldSession::HandleAreaSpiritHealerQueueOpcode(WorldPackets::Battleground:
if (Battleground* bg = _player->GetBattleground())
bg->AddPlayerToResurrectQueue(areaSpiritHealerQueue.HealerGuid, _player->GetGUID());
- if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(_player->GetZoneId()))
+ if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(_player->GetMap(), _player->GetZoneId()))
bf->AddPlayerToResurrectQueue(areaSpiritHealerQueue.HealerGuid, _player->GetGUID());
}
@@ -686,7 +686,7 @@ void WorldSession::HandleHearthAndResurrect(WorldPackets::Battleground::HearthAn
if (_player->IsInFlight())
return;
- if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(_player->GetZoneId()))
+ if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(_player->GetMap(), _player->GetZoneId()))
{
bf->PlayerAskToLeave(_player);
return;
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 4eab4881150..3c122dfd70a 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -16,6 +16,7 @@
*/
#include "Map.h"
+#include "BattlefieldMgr.h"
#include "Battleground.h"
#include "CellImpl.h"
#include "CharacterPackets.h"
@@ -96,6 +97,7 @@ Map::~Map()
sMapMgr->DecreaseScheduledScriptCount(m_scriptSchedule.size());
sOutdoorPvPMgr->DestroyOutdoorPvPForMap(this);
+ sBattlefieldMgr->DestroyBattlefieldsForMap(this);
if (m_parentMap == this)
delete m_childTerrainMaps;
@@ -379,6 +381,7 @@ i_scriptLock(false), _respawnCheckTimer(0)
_worldStateValues = sWorldStateMgr->GetInitialWorldStatesForMap(this);
sOutdoorPvPMgr->CreateOutdoorPvPForMap(this);
+ sBattlefieldMgr->CreateBattlefieldsForMap(this);
sScriptMgr->OnCreateMap(this);
}
diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp
index 4cf0c6c3eea..9c2821fa962 100644
--- a/src/server/game/Scripting/ScriptMgr.cpp
+++ b/src/server/game/Scripting/ScriptMgr.cpp
@@ -1737,10 +1737,10 @@ bool ScriptMgr::OnAreaTrigger(Player* player, AreaTriggerEntry const* trigger, b
return entered ? tmpscript->OnTrigger(player, trigger) : tmpscript->OnExit(player, trigger);
}
-Battlefield* ScriptMgr::CreateBattlefield(uint32 scriptId)
+Battlefield* ScriptMgr::CreateBattlefield(uint32 scriptId, Map* map)
{
GET_SCRIPT_RET(BattlefieldScript, scriptId, tmpscript, nullptr);
- return tmpscript->GetBattlefield();
+ return tmpscript->GetBattlefield(map);
}
Battleground* ScriptMgr::CreateBattleground(BattlegroundTypeId /*typeId*/)
diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h
index d729a0309f0..06ab3c2d0c8 100644
--- a/src/server/game/Scripting/ScriptMgr.h
+++ b/src/server/game/Scripting/ScriptMgr.h
@@ -522,7 +522,7 @@ class TC_GAME_API BattlefieldScript : public ScriptObject
~BattlefieldScript();
- virtual Battlefield* GetBattlefield() const = 0;
+ virtual Battlefield* GetBattlefield(Map* map) const = 0;
};
class TC_GAME_API BattlegroundScript : public ScriptObject
@@ -1146,7 +1146,7 @@ class TC_GAME_API ScriptMgr
public: /* BattlefieldScript */
- Battlefield* CreateBattlefield(uint32 scriptId);
+ Battlefield* CreateBattlefield(uint32 scriptId, Map* map);
public: /* BattlegroundScript */
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index 449ee122b37..52fb6ea128b 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -4583,7 +4583,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool
{
if (Battleground* bg = target->ToPlayer()->GetBattleground())
bg->RemovePlayerFromResurrectQueue(target->GetGUID());
- if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(target->GetZoneId()))
+ if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(target->GetMap(), target->GetZoneId()))
bf->RemovePlayerFromResurrectQueue(target->GetGUID());
}
break;
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 1268330ceec..a5a974601d3 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -6528,7 +6528,7 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32
// allow always ghost flight spells
if (m_originalCaster && m_originalCaster->GetTypeId() == TYPEID_PLAYER && m_originalCaster->IsAlive())
{
- Battlefield* Bf = sBattlefieldMgr->GetBattlefieldToZoneId(m_originalCaster->GetZoneId());
+ Battlefield* Bf = sBattlefieldMgr->GetBattlefieldToZoneId(m_originalCaster->GetMap(), m_originalCaster->GetZoneId());
if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(m_originalCaster->GetAreaId()))
if (area->Flags[0] & AREA_FLAG_NO_FLY_ZONE || (Bf && !Bf->CanFlyIn()))
return SPELL_FAILED_NOT_HERE;
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 87603c9a888..5eb160086c2 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -750,7 +750,7 @@ bool SpellArea::IsFitToRequirements(Player const* player, uint32 newZone, uint32
if (!player)
return false;
- Battlefield* Bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetZoneId());
+ Battlefield* Bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetMap(), player->GetZoneId());
if (!Bf || Bf->CanFlyIn() || (!player->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) && !player->HasAuraType(SPELL_AURA_FLY)))
return false;
break;
@@ -761,7 +761,7 @@ bool SpellArea::IsFitToRequirements(Player const* player, uint32 newZone, uint32
if (!player)
return false;
- Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetZoneId());
+ Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetMap(), player->GetZoneId());
if (!bf || bf->GetTypeId() != BATTLEFIELD_WG)
return false;
@@ -781,7 +781,7 @@ bool SpellArea::IsFitToRequirements(Player const* player, uint32 newZone, uint32
if (!player)
return false;
- if (Battlefield* battlefieldWG = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG))
+ if (Battlefield* battlefieldWG = sBattlefieldMgr->GetBattlefieldByBattleId(player->GetMap(), BATTLEFIELD_BATTLEID_WG))
return battlefieldWG->IsEnabled() && (player->GetTeamId() == battlefieldWG->GetDefenderTeam()) && !battlefieldWG->IsWarTime();
break;
}
@@ -790,7 +790,7 @@ bool SpellArea::IsFitToRequirements(Player const* player, uint32 newZone, uint32
if (!player)
return false;
- if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetZoneId()))
+ if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetMap(), player->GetZoneId()))
return bf->IsWarTime();
break;
}
diff --git a/src/server/scripts/Battlefield/BattlefieldTB.cpp b/src/server/scripts/Battlefield/BattlefieldTB.cpp
index 33fc29c1ecb..93ed4da8131 100644
--- a/src/server/scripts/Battlefield/BattlefieldTB.cpp
+++ b/src/server/scripts/Battlefield/BattlefieldTB.cpp
@@ -45,8 +45,6 @@ bool BattlefieldTB::SetupBattlefield()
m_TypeId = BATTLEFIELD_TB; // See enum BattlefieldTypes
m_BattleId = BATTLEFIELD_BATTLEID_TB;
m_ZoneId = BATTLEFIELD_TB_ZONEID;
- m_MapId = BATTLEFIELD_TB_MAPID;
- m_Map = sMapMgr->CreateBaseMap(m_MapId);
InitStalker(NPC_DEBUG_ANNOUNCER, TolBaradDebugAnnouncerPos);
@@ -757,9 +755,9 @@ class Battlefield_tol_barad : public BattlefieldScript
public:
Battlefield_tol_barad() : BattlefieldScript("battlefield_tb") { }
- Battlefield* GetBattlefield() const override
+ Battlefield* GetBattlefield(Map* map) const override
{
- return new BattlefieldTB();
+ return new BattlefieldTB(map);
}
};
diff --git a/src/server/scripts/Battlefield/BattlefieldTB.h b/src/server/scripts/Battlefield/BattlefieldTB.h
index 9792ba818e4..ed274a2e49e 100644
--- a/src/server/scripts/Battlefield/BattlefieldTB.h
+++ b/src/server/scripts/Battlefield/BattlefieldTB.h
@@ -549,6 +549,7 @@ class TolBaradCapturePoint : public BfCapturePoint
class BattlefieldTB : public Battlefield
{
public:
+ using Battlefield::Battlefield;
~BattlefieldTB();
void OnStartGrouping() override;
diff --git a/src/server/scripts/Battlefield/BattlefieldWG.cpp b/src/server/scripts/Battlefield/BattlefieldWG.cpp
index fcf9d6c3dc8..895868b9cec 100644
--- a/src/server/scripts/Battlefield/BattlefieldWG.cpp
+++ b/src/server/scripts/Battlefield/BattlefieldWG.cpp
@@ -411,8 +411,6 @@ bool BattlefieldWG::SetupBattlefield()
m_TypeId = BATTLEFIELD_WG; // See enum BattlefieldTypes
m_BattleId = BATTLEFIELD_BATTLEID_WG;
m_ZoneId = AREA_WINTERGRASP;
- m_MapId = BATTLEFIELD_WG_MAPID;
- m_Map = sMapMgr->CreateBaseMap(m_MapId);
InitStalker(BATTLEFIELD_WG_NPC_STALKER, WintergraspStalkerPos);
@@ -1477,6 +1475,26 @@ void BfWGGameObjectBuilding::Init(GameObject* go)
}
_state = WintergraspGameObjectState(sWorldStateMgr->GetValue(_worldState, _wg->GetMap()));
+ if (_state == BATTLEFIELD_WG_OBJECTSTATE_NONE)
+ {
+ // set to default state based on type
+ switch (_teamControl)
+ {
+ case TEAM_ALLIANCE:
+ _state = BATTLEFIELD_WG_OBJECTSTATE_ALLIANCE_INTACT;
+ break;
+ case TEAM_HORDE:
+ _state = BATTLEFIELD_WG_OBJECTSTATE_HORDE_INTACT;
+ break;
+ case TEAM_NEUTRAL:
+ _state = BATTLEFIELD_WG_OBJECTSTATE_NEUTRAL_INTACT;
+ break;
+ default:
+ break;
+ }
+ sWorldStateMgr->SetValueAndSaveInDb(_worldState, _state, false, _wg->GetMap());
+ }
+
switch (_state)
{
case BATTLEFIELD_WG_OBJECTSTATE_NEUTRAL_INTACT:
@@ -1774,9 +1792,9 @@ class Battlefield_wintergrasp : public BattlefieldScript
public:
Battlefield_wintergrasp() : BattlefieldScript("battlefield_wg") { }
- Battlefield* GetBattlefield() const override
+ Battlefield* GetBattlefield(Map* map) const override
{
- return new BattlefieldWG();
+ return new BattlefieldWG(map);
}
};
@@ -1794,7 +1812,7 @@ public:
if (!killer || killer->GetTypeId() != TYPEID_PLAYER)
return;
- BattlefieldWG* wintergrasp = static_cast<BattlefieldWG*>(sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG));
+ BattlefieldWG* wintergrasp = static_cast<BattlefieldWG*>(sBattlefieldMgr->GetBattlefieldByBattleId(killer->GetMap(), BATTLEFIELD_BATTLEID_WG));
if (!wintergrasp)
return;
diff --git a/src/server/scripts/Battlefield/BattlefieldWG.h b/src/server/scripts/Battlefield/BattlefieldWG.h
index c15bd592962..3f10861fe58 100644
--- a/src/server/scripts/Battlefield/BattlefieldWG.h
+++ b/src/server/scripts/Battlefield/BattlefieldWG.h
@@ -200,6 +200,7 @@ class WintergraspCapturePoint : public BfCapturePoint
class BattlefieldWG : public Battlefield
{
public:
+ using Battlefield::Battlefield;
~BattlefieldWG();
/**
* \brief Called when the battle start
diff --git a/src/server/scripts/Commands/cs_bf.cpp b/src/server/scripts/Commands/cs_bf.cpp
index 55d9ecc68d7..d883b5609bd 100644
--- a/src/server/scripts/Commands/cs_bf.cpp
+++ b/src/server/scripts/Commands/cs_bf.cpp
@@ -26,6 +26,7 @@ EndScriptData */
#include "BattlefieldMgr.h"
#include "Chat.h"
#include "ChatCommand.h"
+#include "Player.h"
#include "RBAC.h"
using namespace Trinity::ChatCommands;
@@ -54,7 +55,7 @@ public:
static bool HandleBattlefieldStart(ChatHandler* handler, uint32 battleId)
{
- Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleId);
+ Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(handler->GetPlayer()->GetMap(), battleId);
if (!bf)
return false;
@@ -69,7 +70,7 @@ public:
static bool HandleBattlefieldEnd(ChatHandler* handler, uint32 battleId)
{
- Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleId);
+ Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(handler->GetPlayer()->GetMap(), battleId);
if (!bf)
return false;
@@ -84,7 +85,7 @@ public:
static bool HandleBattlefieldEnable(ChatHandler* handler, uint32 battleId)
{
- Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleId);
+ Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(handler->GetPlayer()->GetMap(), battleId);
if (!bf)
return false;
@@ -107,7 +108,7 @@ public:
static bool HandleBattlefieldSwitch(ChatHandler* handler, uint32 battleId)
{
- Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleId);
+ Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(handler->GetPlayer()->GetMap(), battleId);
if (!bf)
return false;
@@ -121,7 +122,7 @@ public:
static bool HandleBattlefieldTimer(ChatHandler* handler, uint32 battleId, uint32 time)
{
- Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(battleId);
+ Battlefield* bf = sBattlefieldMgr->GetBattlefieldByBattleId(handler->GetPlayer()->GetMap(), battleId);
if (!bf)
return false;
diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp
index 97b772f18c9..b3879bafd56 100644
--- a/src/server/scripts/Commands/cs_debug.cpp
+++ b/src/server/scripts/Commands/cs_debug.cpp
@@ -1408,7 +1408,7 @@ public:
nearestLoc = bg->GetClosestGraveyard(player);
else
{
- if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetZoneId()))
+ if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetMap(), player->GetZoneId()))
nearestLoc = bf->GetClosestGraveyard(player);
else
nearestLoc = sObjectMgr->GetClosestGraveyard(*player, player->GetTeam(), player);
diff --git a/src/server/scripts/Northrend/zone_wintergrasp.cpp b/src/server/scripts/Northrend/zone_wintergrasp.cpp
index 2290a35bfa4..fb981b037aa 100644
--- a/src/server/scripts/Northrend/zone_wintergrasp.cpp
+++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp
@@ -172,7 +172,7 @@ struct npc_wg_demolisher_engineer : public ScriptedAI
private:
bool CanBuild() const
{
- Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
+ Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(me->GetMap(), BATTLEFIELD_BATTLEID_WG);
if (!wintergrasp)
return false;
@@ -203,7 +203,7 @@ struct npc_wg_spirit_guide : public ScriptedAI
if (me->IsQuestGiver())
player->PrepareQuestMenu(me->GetGUID());
- Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
+ Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(me->GetMap(), BATTLEFIELD_BATTLEID_WG);
if (!wintergrasp)
return true;
@@ -221,7 +221,7 @@ struct npc_wg_spirit_guide : public ScriptedAI
uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
CloseGossipMenuFor(player);
- Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
+ Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(me->GetMap(), BATTLEFIELD_BATTLEID_WG);
if (wintergrasp)
{
GraveyardVect gy = wintergrasp->GetGraveyardVector();
@@ -272,7 +272,7 @@ struct npc_wg_queue : public ScriptedAI
if (me->IsQuestGiver())
player->PrepareQuestMenu(me->GetGUID());
- Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
+ Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(me->GetMap(), BATTLEFIELD_BATTLEID_WG);
if (!wintergrasp)
return true;
@@ -300,7 +300,7 @@ struct npc_wg_queue : public ScriptedAI
{
CloseGossipMenuFor(player);
- Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
+ Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(me->GetMap(), BATTLEFIELD_BATTLEID_WG);
if (!wintergrasp)
return true;
@@ -441,8 +441,8 @@ class spell_wintergrasp_defender_teleport : public SpellScript
SpellCastResult CheckCast()
{
- if (Battlefield* wg = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG))
- if (Player* target = GetExplTargetUnit()->ToPlayer())
+ if (Player* target = GetExplTargetUnit()->ToPlayer())
+ if (Battlefield* wg = sBattlefieldMgr->GetBattlefieldByBattleId(target->GetMap(), BATTLEFIELD_BATTLEID_WG))
// check if we are in Wintergrasp at all, SotA uses same teleport spells
if ((target->GetZoneId() == AREA_WINTERGRASP && target->GetTeamId() != wg->GetDefenderTeam()) || target->HasAura(SPELL_WINTERGRASP_TELEPORT_TRIGGER))
return SPELL_FAILED_BAD_TARGETS;
@@ -528,9 +528,11 @@ class condition_is_wintergrasp_horde : public ConditionScript
public:
condition_is_wintergrasp_horde() : ConditionScript("condition_is_wintergrasp_horde") { }
- bool OnConditionCheck(Condition const* /* condition */, ConditionSourceInfo& /* sourceInfo */)
+ bool OnConditionCheck(Condition const* /* condition */, ConditionSourceInfo& sourceInfo)
{
- Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
+ if (!sourceInfo.mConditionMap)
+ return false;
+ Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(sourceInfo.mConditionMap, BATTLEFIELD_BATTLEID_WG);
if (wintergrasp->IsEnabled() && wintergrasp->GetDefenderTeam() == TEAM_HORDE)
return true;
return false;
@@ -542,9 +544,11 @@ class condition_is_wintergrasp_alliance : public ConditionScript
public:
condition_is_wintergrasp_alliance() : ConditionScript("condition_is_wintergrasp_alliance") { }
- bool OnConditionCheck(Condition const* /* condition */, ConditionSourceInfo& /* sourceInfo */)
+ bool OnConditionCheck(Condition const* /* condition */, ConditionSourceInfo& sourceInfo)
{
- Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
+ if (!sourceInfo.mConditionMap)
+ return false;
+ Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(sourceInfo.mConditionMap, BATTLEFIELD_BATTLEID_WG);
if (wintergrasp->IsEnabled() && wintergrasp->GetDefenderTeam() == TEAM_ALLIANCE)
return true;
return false;