AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
WaypointMgr Class Reference

#include "WaypointMgr.h"

Public Member Functions

void ReloadPath (uint32 id)
 
void Load ()
 
void LoadWaypointAddons ()
 
WaypointPath const * GetPath (uint32 id) const
 

Static Public Member Functions

static WaypointMgrinstance ()
 

Private Member Functions

 WaypointMgr ()
 

Private Attributes

std::unordered_map< uint32, WaypointPath_waypointStore
 

Detailed Description

Constructor & Destructor Documentation

◆ WaypointMgr()

WaypointMgr::WaypointMgr ( )
inlineprivate
49{ }

Member Function Documentation

◆ GetPath()

WaypointPath const * WaypointMgr::GetPath ( uint32  id) const
inline
40 {
41 auto itr = _waypointStore.find(id);
42 if (itr != _waypointStore.end())
43 return &itr->second;
44
45 return nullptr;
46 }
std::unordered_map< uint32, WaypointPath > _waypointStore
Definition WaypointMgr.h:51

References _waypointStore.

◆ instance()

WaypointMgr * WaypointMgr::instance ( )
static
26{
27 static WaypointMgr instance;
28 return &instance;
29}
Definition WaypointMgr.h:25
static WaypointMgr * instance()
Definition WaypointMgr.cpp:25

References instance().

Referenced by instance().

◆ Load()

void WaypointMgr::Load ( )
32{
33 uint32 oldMSTime = getMSTime();
34
35 // 0 1 2 3 4 5 6 7 8 9 10 11
36 QueryResult result = WorldDatabase.Query("SELECT id, point, position_x, position_y, position_z, orientation, velocity, delay, smoothTransition, move_type, action, action_chance FROM waypoint_data ORDER BY id, point");
37
38 if (!result)
39 {
40 LOG_WARN("server.loading", ">> Loaded 0 waypoints. DB table `waypoint_data` is empty!");
41 LOG_INFO("server.loading", " ");
42 return;
43 }
44
45 uint32 count = 0;
46
47 do
48 {
49 Field* fields = result->Fetch();
50 uint32 pathId = fields[0].Get<uint32>();
51 float x = fields[2].Get<float>();
52 float y = fields[3].Get<float>();
53 float z = fields[4].Get<float>();
54 std::optional<float> o;
55 if (!fields[5].IsNull())
56 o = fields[5].Get<float>();
57
58 float velocity = fields[6].Get<float>();
59
62
63 WaypointNode waypoint;
64 waypoint.Id = fields[1].Get<uint32>();
65 waypoint.X = x;
66 waypoint.Y = y;
67 waypoint.Z = z;
68 if (o.has_value())
69 waypoint.Orientation = o;
70 waypoint.Velocity = velocity;
71 waypoint.Delay = fields[7].Get<uint32>();
72 waypoint.SmoothTransition = fields[8].Get<bool>();
73 waypoint.MoveType = fields[9].Get<uint32>();
74
75 if (waypoint.MoveType >= WAYPOINT_MOVE_TYPE_MAX)
76 {
77 LOG_ERROR("sql.sql", "Waypoint {} in waypoint_data has invalid move_type, ignoring", waypoint.Id);
78 continue;
79 }
80
81 waypoint.EventId = fields[10].Get<uint32>();
82 waypoint.EventChance = fields[11].Get<int16>();
83
84 WaypointPath& path = _waypointStore[pathId];
85 path.Id = pathId;
86 path.Nodes.push_back(std::move(waypoint));
87 ++count;
88 } while (result->NextRow());
89
90 LOG_INFO("server.loading", ">> Loaded {} waypoints in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
91 LOG_INFO("server.loading", " ");
92}
std::shared_ptr< ResultSet > QueryResult
Definition DatabaseEnvFwd.h:27
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
Definition DatabaseEnv.cpp:20
std::uint32_t uint32
Definition Define.h:107
std::int16_t int16
Definition Define.h:104
#define LOG_INFO(filterType__,...)
Definition Log.h:166
#define LOG_ERROR(filterType__,...)
Definition Log.h:158
#define LOG_WARN(filterType__,...)
Definition Log.h:162
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition Timer.h:131
uint32 getMSTime()
Definition Timer.h:103
@ WAYPOINT_MOVE_TYPE_MAX
Definition WaypointDefines.h:33
Class used to access individual fields of database query result.
Definition Field.h:98
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition Field.h:112
void NormalizeMapCoord(float &c)
Definition GridDefines.h:202
Definition WaypointDefines.h:37
uint32 Delay
Definition WaypointDefines.h:51
uint32 EventId
Definition WaypointDefines.h:52
uint8 EventChance
Definition WaypointDefines.h:54
bool SmoothTransition
Definition WaypointDefines.h:55
std::optional< float > Orientation
Definition WaypointDefines.h:49
float X
Definition WaypointDefines.h:48
float Z
Definition WaypointDefines.h:48
float Velocity
Definition WaypointDefines.h:50
float Y
Definition WaypointDefines.h:48
uint32 Id
Definition WaypointDefines.h:47
uint32 MoveType
Definition WaypointDefines.h:53
Definition WaypointDefines.h:60
uint32 Id
Definition WaypointDefines.h:69

References _waypointStore, WaypointNode::Delay, WaypointNode::EventChance, WaypointNode::EventId, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), WaypointNode::Id, WaypointPath::Id, LOG_ERROR, LOG_INFO, LOG_WARN, WaypointNode::MoveType, Acore::NormalizeMapCoord(), WaypointNode::Orientation, WaypointNode::SmoothTransition, WaypointNode::Velocity, WAYPOINT_MOVE_TYPE_MAX, WorldDatabase, WaypointNode::X, WaypointNode::Y, and WaypointNode::Z.

◆ LoadWaypointAddons()

void WaypointMgr::LoadWaypointAddons ( )
95{
96 uint32 oldMSTime = getMSTime();
97
98 // 0 1 2 3 4 5
99 QueryResult result = WorldDatabase.Query("SELECT PathID, PointID, SplinePointIndex, PositionX, PositionY, PositionZ FROM waypoint_data_addon ORDER BY PathID, PointID, SplinePointIndex");
100
101 if (!result)
102 {
103 LOG_INFO("server.loading", ">> Loaded 0 waypoint addon data. DB table `waypoint_data_addon` is empty!");
104 LOG_INFO("server.loading", " ");
105 return;
106 }
107
108 uint32 count = 0;
109
110 do
111 {
112 Field* fields = result->Fetch();
113 uint32 pathId = fields[0].Get<uint32>();
114
115 auto it = _waypointStore.find(pathId);
116 if (it == _waypointStore.end())
117 {
118 LOG_ERROR("sql.sql", "Tried to load waypoint_data_addon data for PathID {} but there is no such path in waypoint_data. Ignoring.", pathId);
119 continue;
120 }
121
122 WaypointPath& path = it->second;
123 uint32 pointId = fields[1].Get<uint32>();
124
125 auto itr = std::find_if(path.Nodes.begin(), path.Nodes.end(), [pointId](WaypointNode const& node)
126 {
127 return node.Id == pointId;
128 });
129
130 if (itr == path.Nodes.end())
131 {
132 LOG_ERROR("sql.sql", "Tried to load waypoint_data_addon data for PointID {} of PathID {} but there is no such point in waypoint_data. Ignoring.", pointId, pathId);
133 continue;
134 }
135
136 float x = fields[3].Get<float>();
137 float y = fields[4].Get<float>();
138 float z = fields[5].Get<float>();
139
142
143 itr->SplinePoints.push_back(G3D::Vector3(x, y, z));
144
145 ++count;
146 } while (result->NextRow());
147
148 LOG_INFO("server.loading", ">> Loaded {} waypoint addon data in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
149 LOG_INFO("server.loading", " ");
150}
std::vector< WaypointNode > Nodes
Definition WaypointDefines.h:68

References _waypointStore, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, WaypointPath::Nodes, Acore::NormalizeMapCoord(), and WorldDatabase.

◆ ReloadPath()

void WaypointMgr::ReloadPath ( uint32  id)
153{
154 auto itr = _waypointStore.find(id);
155 if (itr != _waypointStore.end())
156 _waypointStore.erase(itr);
157
159
160 stmt->SetData(0, id);
161
162 PreparedQueryResult result = WorldDatabase.Query(stmt);
163
164 if (!result)
165 return;
166
167 std::vector<WaypointNode> values;
168 do
169 {
170 Field* fields = result->Fetch();
171 float x = fields[1].Get<float>();
172 float y = fields[2].Get<float>();
173 float z = fields[3].Get<float>();
174 std::optional<float> o;
175 if (!fields[4].IsNull())
176 o = fields[4].Get<float>();
177
178 float velocity = fields[5].Get<float>();
179
182
183 WaypointNode waypoint;
184 waypoint.Id = fields[0].Get<uint32>();
185 waypoint.X = x;
186 waypoint.Y = y;
187 waypoint.Z = z;
188 if (o.has_value())
189 waypoint.Orientation = o;
190 waypoint.Velocity = velocity;
191 waypoint.Delay = fields[6].Get<uint32>();
192 waypoint.SmoothTransition = fields[7].Get<bool>();
193 waypoint.MoveType = fields[8].Get<uint32>();
194
195 if (waypoint.MoveType >= WAYPOINT_MOVE_TYPE_MAX)
196 {
197 LOG_ERROR("sql.sql", "Waypoint {} in waypoint_data has invalid move_type, ignoring", waypoint.Id);
198 continue;
199 }
200
201 waypoint.EventId = fields[9].Get<uint32>();
202 waypoint.EventChance = fields[10].Get<uint8>();
203
204 values.push_back(std::move(waypoint));
205 } while (result->NextRow());
206
207 _waypointStore[id] = WaypointPath(id, std::move(values));
208}
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition DatabaseEnvFwd.h:45
std::uint8_t uint8
Definition Define.h:109
@ WORLD_SEL_WAYPOINT_DATA_BY_ID
Definition WorldDatabase.h:60
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition PreparedStatement.h:77
Definition PreparedStatement.h:157

References _waypointStore, WaypointNode::Delay, WaypointNode::EventChance, WaypointNode::EventId, Field::Get(), WaypointNode::Id, LOG_ERROR, WaypointNode::MoveType, Acore::NormalizeMapCoord(), WaypointNode::Orientation, PreparedStatementBase::SetData(), WaypointNode::SmoothTransition, WaypointNode::Velocity, WAYPOINT_MOVE_TYPE_MAX, WORLD_SEL_WAYPOINT_DATA_BY_ID, WorldDatabase, WaypointNode::X, WaypointNode::Y, and WaypointNode::Z.

Member Data Documentation

◆ _waypointStore

std::unordered_map<uint32, WaypointPath> WaypointMgr::_waypointStore
private

The documentation for this class was generated from the following files: