diff options
Diffstat (limited to 'src/server/game')
-rw-r--r-- | src/server/game/Battlegrounds/Battleground.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Transport/Transport.h | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Handlers/MovementHandler.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Maps/Map.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Maps/MapManager.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Maps/TransportMgr.cpp | 175 | ||||
-rw-r--r-- | src/server/game/Maps/TransportMgr.h | 59 | ||||
-rw-r--r-- | src/server/game/Scripting/ScriptMgr.cpp | 1 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 4 |
11 files changed, 148 insertions, 98 deletions
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 6fbed319b01..9eb8d239f67 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -23,6 +23,7 @@ #include "Creature.h" #include "CreatureTextMgr.h" #include "DatabaseEnv.h" +#include "DB2Stores.h" #include "Formulas.h" #include "GameTime.h" #include "GridNotifiersImpl.h" diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 6e44854e77e..ba5573d171b 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -24,6 +24,7 @@ #include "CombatLogPackets.h" #include "Common.h" #include "Creature.h" +#include "DB2Stores.h" #include "GameTime.h" #include "GridNotifiersImpl.h" #include "InstanceScenario.h" diff --git a/src/server/game/Entities/Transport/Transport.h b/src/server/game/Entities/Transport/Transport.h index b41fd7e9b4a..2a5c2340cf7 100644 --- a/src/server/game/Entities/Transport/Transport.h +++ b/src/server/game/Entities/Transport/Transport.h @@ -23,6 +23,7 @@ #include "VehicleDefines.h" struct CreatureData; +struct SummonPropertiesEntry; class TC_GAME_API Transport : public GameObject, public TransportBase { diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index a1b85a33ff1..fd749e40970 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -34,6 +34,7 @@ #include "CreatureAI.h" #include "CreatureAIImpl.h" #include "CreatureGroups.h" +#include "DB2Stores.h" #include "Formulas.h" #include "GameTime.h" #include "GridNotifiersImpl.h" diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 523bcc7c7a5..ddc0ce9d1d0 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -19,6 +19,7 @@ #include "Battleground.h" #include "Common.h" #include "Corpse.h" +#include "DB2Stores.h" #include "FlightPathMovementGenerator.h" #include "GameTime.h" #include "Garrison.h" diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 3e935230c24..01880d7bcea 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -21,6 +21,7 @@ #include "CharacterPackets.h" #include "Conversation.h" #include "DatabaseEnv.h" +#include "DB2Stores.h" #include "DisableMgr.h" #include "DynamicTree.h" #include "GameObjectModel.h" diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp index 31645ea0cd7..89136a72481 100644 --- a/src/server/game/Maps/MapManager.cpp +++ b/src/server/game/Maps/MapManager.cpp @@ -18,6 +18,7 @@ #include "MapManager.h" #include "InstanceSaveMgr.h" #include "DatabaseEnv.h" +#include "DB2Stores.h" #include "Log.h" #include "ObjectAccessor.h" #include "Transport.h" diff --git a/src/server/game/Maps/TransportMgr.cpp b/src/server/game/Maps/TransportMgr.cpp index 50f055fb18a..871f43de6c1 100644 --- a/src/server/game/Maps/TransportMgr.cpp +++ b/src/server/game/Maps/TransportMgr.cpp @@ -16,7 +16,9 @@ */ #include "TransportMgr.h" +#include "Containers.h" #include "DatabaseEnv.h" +#include "DB2Stores.h" #include "InstanceScript.h" #include "Log.h" #include "MapManager.h" @@ -27,13 +29,16 @@ #include "Spline.h" #include "Transport.h" -TransportTemplate::~TransportTemplate() +bool KeyFrame::IsStopFrame() const { + return (Node->Flags & TAXI_PATH_NODE_FLAG_STOP) != 0; } -TransportMgr::TransportMgr() { } +TransportTemplate::~TransportTemplate() = default; -TransportMgr::~TransportMgr() { } +TransportMgr::TransportMgr() = default; + +TransportMgr::~TransportMgr() = default; TransportMgr* TransportMgr::instance() { @@ -104,6 +109,83 @@ void TransportMgr::LoadTransportAnimationAndRotation() AddPathRotationToTransport(rot->GameObjectsID, rot->TimeIndex, rot); } +void TransportMgr::LoadTransportSpawns() +{ + if (_transportTemplates.empty()) + return; + + uint32 oldMSTime = getMSTime(); + + QueryResult result = WorldDatabase.Query("SELECT guid, entry, phaseUseFlags, phaseid, phasegroup FROM transports"); + + uint32 count = 0; + if (result) + { + do + { + Field* fields = result->Fetch(); + ObjectGuid::LowType guid = fields[0].GetUInt64(); + uint32 entry = fields[1].GetUInt32(); + uint8 phaseUseFlags = fields[2].GetUInt8(); + uint32 phaseId = fields[3].GetUInt32(); + uint32 phaseGroupId = fields[4].GetUInt32(); + + if (!GetTransportTemplate(entry)) + { + TC_LOG_ERROR("sql.sql", "Table `transports` have transport (GUID: " UI64FMTD " Entry: %u) with unknown gameobject `entry` set, skipped.", guid, entry); + continue; + } + + if (phaseUseFlags & ~PHASE_USE_FLAGS_ALL) + { + TC_LOG_ERROR("sql.sql", "Table `transports` have transport (GUID: " UI64FMTD " Entry: %u) with unknown `phaseUseFlags` set, removed unknown value.", guid, entry); + phaseUseFlags &= PHASE_USE_FLAGS_ALL; + } + + if (phaseUseFlags & PHASE_USE_FLAGS_ALWAYS_VISIBLE && phaseUseFlags & PHASE_USE_FLAGS_INVERSE) + { + TC_LOG_ERROR("sql.sql", "Table `transports` have transport (GUID: " UI64FMTD " Entry: %u) has both `phaseUseFlags` PHASE_USE_FLAGS_ALWAYS_VISIBLE and PHASE_USE_FLAGS_INVERSE," + " removing PHASE_USE_FLAGS_INVERSE.", guid, entry); + phaseUseFlags &= ~PHASE_USE_FLAGS_INVERSE; + } + + if (phaseGroupId && phaseId) + { + TC_LOG_ERROR("sql.sql", "Table `transports` have transport (GUID: " UI64FMTD " Entry: %u) with both `phaseid` and `phasegroup` set, `phasegroup` set to 0", guid, entry); + phaseGroupId = 0; + } + + if (phaseId) + { + if (!sPhaseStore.LookupEntry(phaseId)) + { + TC_LOG_ERROR("sql.sql", "Table `transports` have transport (GUID: " UI64FMTD " Entry: %u) with `phaseid` %u does not exist, set to 0", guid, entry, phaseId); + phaseId = 0; + } + } + + if (phaseGroupId) + { + if (!sDB2Manager.GetPhasesForGroup(phaseGroupId)) + { + TC_LOG_ERROR("sql.sql", "Table `transports` have transport (GUID: " UI64FMTD " Entry: %u) with `phaseGroup` %u does not exist, set to 0", guid, entry, phaseGroupId); + phaseGroupId = 0; + } + } + + TransportSpawn& spawn = _transportSpawns[guid]; + spawn.SpawnId = guid; + spawn.TransportGameObjectId = entry; + spawn.PhaseUseFlags = phaseUseFlags; + spawn.PhaseId = phaseId; + spawn.PhaseGroup = phaseGroupId; + + } while (result->NextRow()); + } + + TC_LOG_INFO("server.loading", ">> Spawned %u continent transports in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); +} + class SplineRawInitializer { public: @@ -430,84 +512,43 @@ Transport* TransportMgr::CreateTransport(uint32 entry, ObjectGuid::LowType guid void TransportMgr::SpawnContinentTransports() { - if (_transportTemplates.empty()) - return; - uint32 oldMSTime = getMSTime(); - - QueryResult result = WorldDatabase.Query("SELECT guid, entry, phaseUseFlags, phaseid, phasegroup FROM transports"); - uint32 count = 0; - if (result) - { - do - { - Field* fields = result->Fetch(); - ObjectGuid::LowType guid = fields[0].GetUInt64(); - uint32 entry = fields[1].GetUInt32(); - uint8 phaseUseFlags = fields[2].GetUInt8(); - uint32 phaseId = fields[3].GetUInt32(); - uint32 phaseGroupId = fields[4].GetUInt32(); - - if (phaseUseFlags & ~PHASE_USE_FLAGS_ALL) - { - TC_LOG_ERROR("sql.sql", "Table `transports` have transport (GUID: " UI64FMTD " Entry: %u) with unknown `phaseUseFlags` set, removed unknown value.", guid, entry); - phaseUseFlags &= PHASE_USE_FLAGS_ALL; - } - - if (phaseUseFlags & PHASE_USE_FLAGS_ALWAYS_VISIBLE && phaseUseFlags & PHASE_USE_FLAGS_INVERSE) - { - TC_LOG_ERROR("sql.sql", "Table `transports` have transport (GUID: " UI64FMTD " Entry: %u) has both `phaseUseFlags` PHASE_USE_FLAGS_ALWAYS_VISIBLE and PHASE_USE_FLAGS_INVERSE," - " removing PHASE_USE_FLAGS_INVERSE.", guid, entry); - phaseUseFlags &= ~PHASE_USE_FLAGS_INVERSE; - } - - if (phaseGroupId && phaseId) - { - TC_LOG_ERROR("sql.sql", "Table `transports` have transport (GUID: " UI64FMTD " Entry: %u) with both `phaseid` and `phasegroup` set, `phasegroup` set to 0", guid, entry); - phaseGroupId = 0; - } - if (phaseId) - { - if (!sPhaseStore.LookupEntry(phaseId)) - { - TC_LOG_ERROR("sql.sql", "Table `transports` have transport (GUID: " UI64FMTD " Entry: %u) with `phaseid` %u does not exist, set to 0", guid, entry, phaseId); - phaseId = 0; - } - } - - if (phaseGroupId) - { - if (!sDB2Manager.GetPhasesForGroup(phaseGroupId)) - { - TC_LOG_ERROR("sql.sql", "Table `transports` have transport (GUID: " UI64FMTD " Entry: %u) with `phaseGroup` %u does not exist, set to 0", guid, entry, phaseGroupId); - phaseGroupId = 0; - } - } - - if (TransportTemplate const* tInfo = GetTransportTemplate(entry)) - if (!tInfo->inInstance) - if (CreateTransport(entry, guid, nullptr, phaseUseFlags, phaseId, phaseGroupId)) - ++count; - - } while (result->NextRow()); - } + for (auto itr = _transportSpawns.begin(); itr != _transportSpawns.end(); ++itr) + if (!ASSERT_NOTNULL(GetTransportTemplate(itr->second.TransportGameObjectId))->inInstance) + if (CreateTransport(itr->second.TransportGameObjectId, itr->second.SpawnId, nullptr, itr->second.PhaseUseFlags, itr->second.PhaseId, itr->second.PhaseGroup)) + ++count; TC_LOG_INFO("server.loading", ">> Spawned %u continent transports in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } void TransportMgr::CreateInstanceTransports(Map* map) { - TransportInstanceMap::const_iterator mapTransports = _instanceTransports.find(map->GetId()); + auto mapTransports = _instanceTransports.find(map->GetId()); // no transports here - if (mapTransports == _instanceTransports.end() || mapTransports->second.empty()) + if (mapTransports == _instanceTransports.end()) return; // create transports - for (std::set<uint32>::const_iterator itr = mapTransports->second.begin(); itr != mapTransports->second.end(); ++itr) - CreateTransport(*itr, UI64LIT(0), map); + for (uint32 transportGameObjectId : mapTransports->second) + CreateTransport(transportGameObjectId, UI64LIT(0), map); +} + +TransportTemplate const* TransportMgr::GetTransportTemplate(uint32 entry) const +{ + return Trinity::Containers::MapGetValuePtr(_transportTemplates, entry); +} + +TransportAnimation const* TransportMgr::GetTransportAnimInfo(uint32 entry) const +{ + return Trinity::Containers::MapGetValuePtr(_transportAnimations, entry); +} + +TransportSpawn const* TransportMgr::GetTransportSpawn(ObjectGuid::LowType spawnId) const +{ + return Trinity::Containers::MapGetValuePtr(_transportSpawns, spawnId); } TransportAnimationEntry const* TransportAnimation::GetAnimNode(uint32 time) const diff --git a/src/server/game/Maps/TransportMgr.h b/src/server/game/Maps/TransportMgr.h index ef381d125a2..58fa2ecc807 100644 --- a/src/server/game/Maps/TransportMgr.h +++ b/src/server/game/Maps/TransportMgr.h @@ -18,12 +18,16 @@ #ifndef TRANSPORTMGR_H #define TRANSPORTMGR_H -#include "DB2Stores.h" #include "ObjectGuid.h" +#include <map> #include <memory> +#include <unordered_map> struct KeyFrame; struct GameObjectTemplate; +struct TaxiPathNodeEntry; +struct TransportAnimationEntry; +struct TransportRotationEntry; struct TransportTemplate; class Transport; class Map; @@ -33,12 +37,8 @@ namespace Movement template <typename length_type> class Spline; } -typedef Movement::Spline<double> TransportSpline; -typedef std::vector<KeyFrame> KeyFrameVec; -typedef std::unordered_map<uint32, TransportTemplate> TransportTemplates; -typedef std::set<Transport*> TransportSet; -typedef std::unordered_map<uint32, TransportSet> TransportMap; -typedef std::unordered_map<uint32, std::set<uint32> > TransportInstanceMap; +using TransportSpline = Movement::Spline<double>; +using KeyFrameVec = std::vector<KeyFrame>; struct KeyFrame { @@ -66,7 +66,7 @@ struct KeyFrame uint32 NextArriveTime; bool IsTeleportFrame() const { return Teleport; } - bool IsStopFrame() const { return (Node->Flags & TAXI_PATH_NODE_FLAG_STOP) != 0; } + bool IsStopFrame() const; }; struct TransportTemplate @@ -83,22 +83,26 @@ struct TransportTemplate uint32 entry; }; -typedef std::map<uint32, TransportAnimationEntry const*> TransportPathContainer; -typedef std::map<uint32, TransportRotationEntry const*> TransportPathRotationContainer; - struct TC_GAME_API TransportAnimation { TransportAnimation() : TotalTime(0) { } - TransportPathContainer Path; - TransportPathRotationContainer Rotations; + std::map<uint32, TransportAnimationEntry const*> Path; + std::map<uint32, TransportRotationEntry const*> Rotations; uint32 TotalTime; TransportAnimationEntry const* GetAnimNode(uint32 time) const; TransportRotationEntry const* GetAnimRotation(uint32 time) const; }; -typedef std::map<uint32, TransportAnimation> TransportAnimationContainer; +struct TransportSpawn +{ + ObjectGuid::LowType SpawnId = UI64LIT(0); + uint32 TransportGameObjectId = 0; // entry in respective _template table + uint8 PhaseUseFlags = 0; + uint32 PhaseId = 0; + uint32 PhaseGroup = 0; +}; class TC_GAME_API TransportMgr { @@ -111,6 +115,8 @@ class TC_GAME_API TransportMgr void LoadTransportAnimationAndRotation(); + void LoadTransportSpawns(); + // Creates a transport using given GameObject template entry Transport* CreateTransport(uint32 entry, ObjectGuid::LowType guid = UI64LIT(0), Map* map = nullptr, uint8 phaseUseFlags = 0, uint32 phaseId = 0, uint32 phaseGroupId = 0); @@ -120,22 +126,11 @@ class TC_GAME_API TransportMgr // creates all transports for instance void CreateInstanceTransports(Map* map); - TransportTemplate const* GetTransportTemplate(uint32 entry) const - { - TransportTemplates::const_iterator itr = _transportTemplates.find(entry); - if (itr != _transportTemplates.end()) - return &itr->second; - return nullptr; - } + TransportTemplate const* GetTransportTemplate(uint32 entry) const; - TransportAnimation const* GetTransportAnimInfo(uint32 entry) const - { - TransportAnimationContainer::const_iterator itr = _transportAnimations.find(entry); - if (itr != _transportAnimations.end()) - return &itr->second; + TransportAnimation const* GetTransportAnimInfo(uint32 entry) const; - return nullptr; - } + TransportSpawn const* GetTransportSpawn(ObjectGuid::LowType spawnId) const; private: TransportMgr(); @@ -154,12 +149,14 @@ class TC_GAME_API TransportMgr } // Container storing transport templates - TransportTemplates _transportTemplates; + std::unordered_map<uint32, TransportTemplate> _transportTemplates; // Container storing transport entries to create for instanced maps - TransportInstanceMap _instanceTransports; + std::unordered_map<uint32, std::set<uint32>> _instanceTransports; + + std::map<uint32, TransportAnimation> _transportAnimations; - TransportAnimationContainer _transportAnimations; + std::unordered_map<ObjectGuid::LowType, TransportSpawn> _transportSpawns; }; #define sTransportMgr TransportMgr::instance() diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 8df91f40ff5..a74251922c3 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -23,6 +23,7 @@ #include "Creature.h" #include "CreatureAI.h" #include "CreatureAIImpl.h" +#include "DB2Stores.h" #include "Errors.h" #include "GameObject.h" #include "GossipDef.h" diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index b67199da1c5..f0c1faffc02 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -45,6 +45,7 @@ #include "CreatureGroups.h" #include "CreatureTextMgr.h" #include "DatabaseEnv.h" +#include "DB2Stores.h" #include "DisableMgr.h" #include "GameEventMgr.h" #include "GameObjectModel.h" @@ -1823,6 +1824,9 @@ void World::SetInitialWorldSettings() TC_LOG_INFO("server.loading", "Loading Transport animations and rotations..."); sTransportMgr->LoadTransportAnimationAndRotation(); + TC_LOG_INFO("server.loading", "Loading Transport spawns..."); + sTransportMgr->LoadTransportSpawns(); + TC_LOG_INFO("server.loading", "Loading Spell Rank Data..."); sSpellMgr->LoadSpellRanks(); |