diff options
Diffstat (limited to 'src/server/game/Globals/ObjectMgr.cpp')
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 137 |
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) |