aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2021-10-02 19:59:56 +0200
committerShauren <shauren.trinity@gmail.com>2021-10-02 19:59:56 +0200
commit2d7af28e9fe8958ecb5b302b8fee96b75320f84d (patch)
tree6099107bdfaf0aeebc7ab661ca0ea04c2ace2cec /src/server
parentf6f2de76c79e8de7aba85ea5ebbe6450b2c04585 (diff)
Core/Transports: Store information about continent transports
Diffstat (limited to 'src/server')
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp1
-rw-r--r--src/server/game/Entities/Object/Object.cpp1
-rw-r--r--src/server/game/Entities/Transport/Transport.h1
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp1
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp1
-rw-r--r--src/server/game/Maps/Map.cpp1
-rw-r--r--src/server/game/Maps/MapManager.cpp1
-rw-r--r--src/server/game/Maps/TransportMgr.cpp175
-rw-r--r--src/server/game/Maps/TransportMgr.h59
-rw-r--r--src/server/game/Scripting/ScriptMgr.cpp1
-rw-r--r--src/server/game/World/World.cpp4
-rw-r--r--src/server/scripts/Commands/cs_debug.cpp1
-rw-r--r--src/server/scripts/Commands/cs_go.cpp1
-rw-r--r--src/server/scripts/Commands/cs_npc.cpp1
14 files changed, 151 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();
diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp
index 21293084000..fd5fd2143e1 100644
--- a/src/server/scripts/Commands/cs_debug.cpp
+++ b/src/server/scripts/Commands/cs_debug.cpp
@@ -31,6 +31,7 @@ EndScriptData */
#include "Chat.h"
#include "ChatPackets.h"
#include "Conversation.h"
+#include "DB2Stores.h"
#include "GossipDef.h"
#include "GridNotifiersImpl.h"
#include "InstanceScript.h"
diff --git a/src/server/scripts/Commands/cs_go.cpp b/src/server/scripts/Commands/cs_go.cpp
index 3be61113c6d..30cc0dda2a1 100644
--- a/src/server/scripts/Commands/cs_go.cpp
+++ b/src/server/scripts/Commands/cs_go.cpp
@@ -25,6 +25,7 @@ EndScriptData */
#include "ScriptMgr.h"
#include "Chat.h"
#include "DatabaseEnv.h"
+#include "DB2Stores.h"
#include "Language.h"
#include "MapManager.h"
#include "ObjectMgr.h"
diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp
index c6b0805de0f..167b6e6c93c 100644
--- a/src/server/scripts/Commands/cs_npc.cpp
+++ b/src/server/scripts/Commands/cs_npc.cpp
@@ -27,6 +27,7 @@ EndScriptData */
#include "CreatureAI.h"
#include "CreatureGroups.h"
#include "DatabaseEnv.h"
+#include "DB2Stores.h"
#include "FollowMovementGenerator.h"
#include "GameTime.h"
#include "Language.h"