aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Globals/ObjectMgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Globals/ObjectMgr.cpp')
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp137
1 files changed, 88 insertions, 49 deletions
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 048eff35504..1b7713ab363 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -16,16 +16,15 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "AccountMgr.h"
+#include "ObjectMgr.h"
#include "AchievementMgr.h"
-#include "ArenaTeam.h"
#include "ArenaTeamMgr.h"
-#include "BattlegroundMgr.h"
+#include "Bag.h"
#include "Chat.h"
-#include "Common.h"
#include "CreatureAIFactory.h"
#include "DatabaseEnv.h"
#include "DisableMgr.h"
+#include "GameObject.h"
#include "GameObjectAIFactory.h"
#include "GossipDef.h"
#include "GroupMgr.h"
@@ -34,22 +33,26 @@
#include "Language.h"
#include "LFGMgr.h"
#include "Log.h"
+#include "LootMgr.h"
+#include "Mail.h"
#include "MapManager.h"
-#include "Object.h"
-#include "ObjectMgr.h"
+#include "MotionMaster.h"
+#include "ObjectAccessor.h"
+#include "Player.h"
#include "PoolMgr.h"
+#include "QueryPackets.h"
+#include "Random.h"
#include "ReputationMgr.h"
#include "ScriptMgr.h"
#include "SpellAuras.h"
#include "SpellMgr.h"
#include "SpellScript.h"
+#include "TemporarySummon.h"
#include "UpdateMask.h"
#include "Util.h"
#include "Vehicle.h"
#include "World.h"
-#include "Packets/QueryPackets.h"
-
ScriptMapMap sSpellScripts;
ScriptMapMap sEventScripts;
ScriptMapMap sWaypointScripts;
@@ -284,7 +287,7 @@ ObjectMgr::~ObjectMgr()
delete itr->second;
}
-void ObjectMgr::AddLocaleString(std::string const& value, LocaleConstant localeConstant, StringVector& data)
+void ObjectMgr::AddLocaleString(std::string const& value, LocaleConstant localeConstant, std::vector<std::string>& data)
{
if (!value.empty())
{
@@ -1128,7 +1131,7 @@ void ObjectMgr::LoadGameObjectAddons()
}
GameObjectAddon& gameObjectAddon = _gameObjectAddonStore[guid];
- gameObjectAddon.ParentRotation = G3D::Quat(fields[1].GetFloat(), fields[2].GetFloat(), fields[3].GetFloat(), fields[4].GetFloat());
+ gameObjectAddon.ParentRotation = QuaternionData(fields[1].GetFloat(), fields[2].GetFloat(), fields[3].GetFloat(), fields[4].GetFloat());
gameObjectAddon.invisibilityType = InvisibilityType(fields[5].GetUInt8());
gameObjectAddon.InvisibilityValue = fields[6].GetUInt32();
@@ -1148,7 +1151,7 @@ void ObjectMgr::LoadGameObjectAddons()
if (!gameObjectAddon.ParentRotation.isUnit())
{
TC_LOG_ERROR("sql.sql", "GameObject (GUID: %u) has invalid parent rotation in `gameobject_addon`, set to default", guid);
- gameObjectAddon.ParentRotation = G3D::Quat();
+ gameObjectAddon.ParentRotation = QuaternionData();
}
++count;
@@ -1310,7 +1313,7 @@ uint32 ObjectMgr::ChooseDisplayId(CreatureTemplate const* cinfo, CreatureData co
return cinfo->GetFirstInvisibleModel();
}
-void ObjectMgr::ChooseCreatureFlags(const CreatureTemplate* cinfo, uint32& npcflag, uint32& unit_flags, uint32& dynamicflags, const CreatureData* data /*= nullptr*/)
+void ObjectMgr::ChooseCreatureFlags(CreatureTemplate const* cinfo, uint32& npcflag, uint32& unit_flags, uint32& dynamicflags, CreatureData const* data /*= nullptr*/)
{
npcflag = cinfo->npcflag;
unit_flags = cinfo->unit_flags;
@@ -1442,7 +1445,7 @@ void ObjectMgr::LoadLinkedRespawn()
{
case CREATURE_TO_CREATURE:
{
- const CreatureData* slave = GetCreatureData(guidLow);
+ CreatureData const* slave = GetCreatureData(guidLow);
if (!slave)
{
TC_LOG_ERROR("sql.sql", "LinkedRespawn: Creature (guid) '%u' not found in creature table", guidLow);
@@ -1450,7 +1453,7 @@ void ObjectMgr::LoadLinkedRespawn()
break;
}
- const CreatureData* master = GetCreatureData(linkedGuidLow);
+ CreatureData const* master = GetCreatureData(linkedGuidLow);
if (!master)
{
TC_LOG_ERROR("sql.sql", "LinkedRespawn: Creature (linkedGuid) '%u' not found in creature table", linkedGuidLow);
@@ -1458,7 +1461,7 @@ void ObjectMgr::LoadLinkedRespawn()
break;
}
- const MapEntry* const map = sMapStore.LookupEntry(master->mapid);
+ MapEntry const* const map = sMapStore.LookupEntry(master->mapid);
if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
{
TC_LOG_ERROR("sql.sql", "LinkedRespawn: Creature '%u' linking to Creature '%u' on an unpermitted map.", guidLow, linkedGuidLow);
@@ -1479,7 +1482,7 @@ void ObjectMgr::LoadLinkedRespawn()
}
case CREATURE_TO_GO:
{
- const CreatureData* slave = GetCreatureData(guidLow);
+ CreatureData const* slave = GetCreatureData(guidLow);
if (!slave)
{
TC_LOG_ERROR("sql.sql", "LinkedRespawn: Creature (guid) '%u' not found in creature table", guidLow);
@@ -1487,7 +1490,7 @@ void ObjectMgr::LoadLinkedRespawn()
break;
}
- const GameObjectData* master = GetGOData(linkedGuidLow);
+ GameObjectData const* master = GetGOData(linkedGuidLow);
if (!master)
{
TC_LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (linkedGuid) '%u' not found in gameobject table", linkedGuidLow);
@@ -1495,7 +1498,7 @@ void ObjectMgr::LoadLinkedRespawn()
break;
}
- const MapEntry* const map = sMapStore.LookupEntry(master->mapid);
+ MapEntry const* const map = sMapStore.LookupEntry(master->mapid);
if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
{
TC_LOG_ERROR("sql.sql", "LinkedRespawn: Creature '%u' linking to Gameobject '%u' on an unpermitted map.", guidLow, linkedGuidLow);
@@ -1516,7 +1519,7 @@ void ObjectMgr::LoadLinkedRespawn()
}
case GO_TO_GO:
{
- const GameObjectData* slave = GetGOData(guidLow);
+ GameObjectData const* slave = GetGOData(guidLow);
if (!slave)
{
TC_LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (guid) '%u' not found in gameobject table", guidLow);
@@ -1524,7 +1527,7 @@ void ObjectMgr::LoadLinkedRespawn()
break;
}
- const GameObjectData* master = GetGOData(linkedGuidLow);
+ GameObjectData const* master = GetGOData(linkedGuidLow);
if (!master)
{
TC_LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (linkedGuid) '%u' not found in gameobject table", linkedGuidLow);
@@ -1532,7 +1535,7 @@ void ObjectMgr::LoadLinkedRespawn()
break;
}
- const MapEntry* const map = sMapStore.LookupEntry(master->mapid);
+ MapEntry const* const map = sMapStore.LookupEntry(master->mapid);
if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
{
TC_LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject '%u' linking to Gameobject '%u' on an unpermitted map.", guidLow, linkedGuidLow);
@@ -1553,7 +1556,7 @@ void ObjectMgr::LoadLinkedRespawn()
}
case GO_TO_CREATURE:
{
- const GameObjectData* slave = GetGOData(guidLow);
+ GameObjectData const* slave = GetGOData(guidLow);
if (!slave)
{
TC_LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject (guid) '%u' not found in gameobject table", guidLow);
@@ -1561,7 +1564,7 @@ void ObjectMgr::LoadLinkedRespawn()
break;
}
- const CreatureData* master = GetCreatureData(linkedGuidLow);
+ CreatureData const* master = GetCreatureData(linkedGuidLow);
if (!master)
{
TC_LOG_ERROR("sql.sql", "LinkedRespawn: Creature (linkedGuid) '%u' not found in creature table", linkedGuidLow);
@@ -1569,7 +1572,7 @@ void ObjectMgr::LoadLinkedRespawn()
break;
}
- const MapEntry* const map = sMapStore.LookupEntry(master->mapid);
+ MapEntry const* const map = sMapStore.LookupEntry(master->mapid);
if (!map || !map->Instanceable() || (master->mapid != slave->mapid))
{
TC_LOG_ERROR("sql.sql", "LinkedRespawn: Gameobject '%u' linking to Creature '%u' on an unpermitted map.", guidLow, linkedGuidLow);
@@ -1838,7 +1841,7 @@ void ObjectMgr::LoadCreatures()
if (cInfo->flags_extra & CREATURE_FLAG_EXTRA_INSTANCE_BIND)
{
- if (!mapEntry || !mapEntry->IsDungeon())
+ if (!mapEntry->IsDungeon())
TC_LOG_ERROR("sql.sql", "Table `creature` has creature (GUID: %u Entry: %u) with `creature_template`.`flags_extra` including CREATURE_FLAG_EXTRA_INSTANCE_BIND but creature is not in instance.", guid, data.id);
}
@@ -1934,7 +1937,7 @@ void ObjectMgr::RemoveCreatureFromGrid(ObjectGuid::LowType guid, CreatureData co
}
}
-ObjectGuid::LowType ObjectMgr::AddGOData(uint32 entry, uint32 mapId, Position const& pos, G3D::Quat const& rot, uint32 spawntimedelay /*= 0*/)
+ObjectGuid::LowType ObjectMgr::AddGOData(uint32 entry, uint32 mapId, Position const& pos, QuaternionData const& rot, uint32 spawntimedelay /*= 0*/)
{
GameObjectTemplate const* goinfo = GetGameObjectTemplate(entry);
if (!goinfo)
@@ -4670,6 +4673,18 @@ void ObjectMgr::LoadQuests()
TC_LOG_INFO("server.loading", ">> Loaded %lu quests definitions in %u ms", (unsigned long)_questTemplates.size(), GetMSTimeDiffToNow(oldMSTime));
}
+void ObjectMgr::LoadQuestStartersAndEnders()
+{
+ TC_LOG_INFO("server.loading", "Loading GO Start Quest Data...");
+ LoadGameobjectQuestStarters();
+ TC_LOG_INFO("server.loading", "Loading GO End Quest Data...");
+ LoadGameobjectQuestEnders();
+ TC_LOG_INFO("server.loading", "Loading Creature Start Quest Data...");
+ LoadCreatureQuestStarters();
+ TC_LOG_INFO("server.loading", "Loading Creature End Quest Data...");
+ LoadCreatureQuestEnders();
+}
+
void ObjectMgr::LoadQuestLocales()
{
uint32 oldMSTime = getMSTime();
@@ -5957,7 +5972,7 @@ void ObjectMgr::LoadGraveyardZones()
{
uint32 oldMSTime = getMSTime();
- GraveYardStore.clear(); // need for reload case
+ GraveyardStore.clear(); // need for reload case
// 0 1 2
QueryResult result = WorldDatabase.Query("SELECT ID, GhostZone, Faction FROM graveyard_zone");
@@ -6006,14 +6021,14 @@ void ObjectMgr::LoadGraveyardZones()
continue;
}
- if (!AddGraveYardLink(safeLocId, zoneId, team, false))
+ if (!AddGraveyardLink(safeLocId, zoneId, team, false))
TC_LOG_ERROR("sql.sql", "Table `graveyard_zone` has a duplicate record for Graveyard (ID: %u) and Zone (ID: %u), skipped.", safeLocId, zoneId);
} while (result->NextRow());
TC_LOG_INFO("server.loading", ">> Loaded %u graveyard-zone links in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
}
-WorldSafeLocsEntry const* ObjectMgr::GetDefaultGraveYard(uint32 team) const
+WorldSafeLocsEntry const* ObjectMgr::GetDefaultGraveyard(uint32 team) const
{
enum DefaultGraveyard
{
@@ -6028,7 +6043,7 @@ WorldSafeLocsEntry const* ObjectMgr::GetDefaultGraveYard(uint32 team) const
else return nullptr;
}
-WorldSafeLocsEntry const* ObjectMgr::GetClosestGraveYard(float x, float y, float z, uint32 MapId, uint32 team) const
+WorldSafeLocsEntry const* ObjectMgr::GetClosestGraveyard(float x, float y, float z, uint32 MapId, uint32 team) const
{
// search for zone associated closest graveyard
uint32 zoneId = sMapMgr->GetZoneId(MapId, x, y, z);
@@ -6038,7 +6053,7 @@ WorldSafeLocsEntry const* ObjectMgr::GetClosestGraveYard(float x, float y, float
if (z > -500)
{
TC_LOG_ERROR("misc", "ZoneId not found for map %u coords (%f, %f, %f)", MapId, x, y, z);
- return GetDefaultGraveYard(team);
+ return GetDefaultGraveyard(team);
}
}
@@ -6049,7 +6064,7 @@ WorldSafeLocsEntry const* ObjectMgr::GetClosestGraveYard(float x, float y, float
// then check faction
// if mapId != graveyard.mapId (ghost in instance) and search any graveyard associated
// then check faction
- GraveYardMapBounds range = GraveYardStore.equal_range(zoneId);
+ GraveyardMapBounds range = GraveyardStore.equal_range(zoneId);
MapEntry const* map = sMapStore.LookupEntry(MapId);
// not need to check validity of map object; MapId _MUST_ be valid here
@@ -6057,7 +6072,7 @@ WorldSafeLocsEntry const* ObjectMgr::GetClosestGraveYard(float x, float y, float
{
if (zoneId != 0) // zone == 0 can't be fixed, used by bliz for bugged zones
TC_LOG_ERROR("sql.sql", "Table `graveyard_zone` incomplete: Zone %u Team %u does not have a linked graveyard.", zoneId, team);
- return GetDefaultGraveYard(team);
+ return GetDefaultGraveyard(team);
}
// at corpse map
@@ -6077,7 +6092,7 @@ WorldSafeLocsEntry const* ObjectMgr::GetClosestGraveYard(float x, float y, float
for (; range.first != range.second; ++range.first)
{
- GraveYardData const& data = range.first->second;
+ GraveyardData const& data = range.first->second;
WorldSafeLocsEntry const* entry = sWorldSafeLocsStore.LookupEntry(data.safeLocId);
if (!entry)
@@ -6153,29 +6168,45 @@ WorldSafeLocsEntry const* ObjectMgr::GetClosestGraveYard(float x, float y, float
return entryFar;
}
-GraveYardData const* ObjectMgr::FindGraveYardData(uint32 id, uint32 zoneId) const
+GraveyardData const* ObjectMgr::FindGraveyardData(uint32 id, uint32 zoneId) const
{
- GraveYardMapBounds range = GraveYardStore.equal_range(zoneId);
+ GraveyardMapBounds range = GraveyardStore.equal_range(zoneId);
for (; range.first != range.second; ++range.first)
{
- GraveYardData const& data = range.first->second;
+ GraveyardData const& data = range.first->second;
if (data.safeLocId == id)
return &data;
}
return nullptr;
}
-bool ObjectMgr::AddGraveYardLink(uint32 id, uint32 zoneId, uint32 team, bool persist /*= true*/)
+AreaTrigger const* ObjectMgr::GetAreaTrigger(uint32 trigger) const
+{
+ AreaTriggerContainer::const_iterator itr = _areaTriggerStore.find(trigger);
+ if (itr != _areaTriggerStore.end())
+ return &itr->second;
+ return nullptr;
+}
+
+AccessRequirement const* ObjectMgr::GetAccessRequirement(uint32 mapid, Difficulty difficulty) const
+{
+ AccessRequirementContainer::const_iterator itr = _accessRequirementStore.find(MAKE_PAIR32(mapid, difficulty));
+ if (itr != _accessRequirementStore.end())
+ return itr->second;
+ return nullptr;
+}
+
+bool ObjectMgr::AddGraveyardLink(uint32 id, uint32 zoneId, uint32 team, bool persist /*= true*/)
{
- if (FindGraveYardData(id, zoneId))
+ if (FindGraveyardData(id, zoneId))
return false;
// add link to loaded data
- GraveYardData data;
+ GraveyardData data;
data.safeLocId = id;
data.team = team;
- GraveYardStore.insert(GraveYardContainer::value_type(zoneId, data));
+ GraveyardStore.insert(GraveyardContainer::value_type(zoneId, data));
// add link to DB
if (persist)
@@ -6192,9 +6223,9 @@ bool ObjectMgr::AddGraveYardLink(uint32 id, uint32 zoneId, uint32 team, bool per
return true;
}
-void ObjectMgr::RemoveGraveYardLink(uint32 id, uint32 zoneId, uint32 team, bool persist /*= false*/)
+void ObjectMgr::RemoveGraveyardLink(uint32 id, uint32 zoneId, uint32 team, bool persist /*= false*/)
{
- GraveYardMapBoundsNonConst range = GraveYardStore.equal_range(zoneId);
+ GraveyardMapBoundsNonConst range = GraveyardStore.equal_range(zoneId);
if (range.first == range.second)
{
//TC_LOG_ERROR("sql.sql", "Table `graveyard_zone` incomplete: Zone %u Team %u does not have a linked graveyard.", zoneId, team);
@@ -6206,7 +6237,7 @@ void ObjectMgr::RemoveGraveYardLink(uint32 id, uint32 zoneId, uint32 team, bool
for (; range.first != range.second; ++range.first)
{
- GraveYardData & data = range.first->second;
+ GraveyardData & data = range.first->second;
// skip not matching safezone id
if (data.safeLocId != id)
@@ -6226,7 +6257,7 @@ void ObjectMgr::RemoveGraveYardLink(uint32 id, uint32 zoneId, uint32 team, bool
return;
// remove from links
- GraveYardStore.erase(range.first);
+ GraveyardStore.erase(range.first);
// remove link from DB
if (persist)
@@ -6405,13 +6436,13 @@ AreaTrigger const* ObjectMgr::GetGoBackTrigger(uint32 Map) const
{
bool useParentDbValue = false;
uint32 parentId = 0;
- const MapEntry* mapEntry = sMapStore.LookupEntry(Map);
+ MapEntry const* mapEntry = sMapStore.LookupEntry(Map);
if (!mapEntry || mapEntry->entrance_map < 0)
return nullptr;
if (mapEntry->IsDungeon())
{
- const InstanceTemplate* iTemplate = sObjectMgr->GetInstanceTemplate(Map);
+ InstanceTemplate const* iTemplate = sObjectMgr->GetInstanceTemplate(Map);
if (!iTemplate)
return nullptr;
@@ -6984,8 +7015,8 @@ void ObjectMgr::LoadPetNumber()
std::string ObjectMgr::GeneratePetName(uint32 entry)
{
- StringVector& list0 = _petHalfName0[entry];
- StringVector& list1 = _petHalfName1[entry];
+ std::vector<std::string>& list0 = _petHalfName0[entry];
+ std::vector<std::string>& list1 = _petHalfName1[entry];
if (list0.empty() || list1.empty())
{
@@ -9217,6 +9248,14 @@ VehicleAccessoryList const* ObjectMgr::GetVehicleAccessoryList(Vehicle* veh) con
return nullptr;
}
+DungeonEncounterList const* ObjectMgr::GetDungeonEncounterList(uint32 mapId, Difficulty difficulty) const
+{
+ std::unordered_map<uint32, DungeonEncounterList>::const_iterator itr = _dungeonEncounterStore.find(MAKE_PAIR32(mapId, difficulty));
+ if (itr != _dungeonEncounterStore.end())
+ return &itr->second;
+ return nullptr;
+}
+
PlayerInfo const* ObjectMgr::GetPlayerInfo(uint32 race, uint32 class_) const
{
if (race >= MAX_RACES)