81{
84
85
86 QueryResult result =
WorldDatabase.Query(
"SELECT leaderGUID, memberGUID, dist, angle, groupAI, point_1, point_2 FROM creature_formations ORDER BY leaderGUID");
87 if (!result)
88 {
89 LOG_WARN(
"server.loading",
">> Loaded 0 creatures in formations. DB table `creature_formations` is empty!");
91 return;
92 }
93
95 do
96 {
97 Field const* fields = result->Fetch();
98
99
103 float const follow_dist = fields[2].
Get<
float>();
104 float const follow_angle = fields[3].
Get<
float>() * (
static_cast<float>(M_PI) / 180);
108
109
111 {
112 if (!group_member.
HasGroupFlag(std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_SUPPORTED)))
113 {
114 LOG_ERROR(
"sql.sql",
"creature_formations table leader guid {} and member guid {} has unsupported GroupAI flag value ({}). Skipped", group_member.
leaderGUID, memberGUID, group_member.
groupAI);
115 continue;
116 }
117
118 if (!group_member.
HasGroupFlag(std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_FOLLOW_LEADER)) && (follow_dist > 0.0f || follow_angle > 0.0f))
119 {
120 LOG_ERROR(
"sql.sql",
"creature_formations table member guid {} and leader guid {} cannot have follow distance or follow angle because don't have GROUP_AI_FLAG_FOLLOW_LEADER flag. Values are not gonna be used", memberGUID, group_member.
leaderGUID);
123 }
124 else
125 {
128 }
129 }
130 else
131 {
132
133 if (group_member.
groupAI && !group_member.
HasGroupFlag(std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_SUPPORTED)))
134 {
135 LOG_ERROR(
"sql.sql",
"creature_formations table leader guid {} and member guid {} has unsupported GroupAI flag value ({}). Skipped", group_member.
leaderGUID, memberGUID, group_member.
groupAI);
136 continue;
137 }
138
141 if (follow_dist > 0.0f || follow_angle > 0.0f)
142 {
143 LOG_ERROR(
"sql.sql",
"creature_formations table member guid {} and leader guid {} cannot have follow distance or follow angle. Values are not gonna be used", memberGUID, group_member.
leaderGUID);
144 }
145 }
146
148 {
149 LOG_ERROR(
"sql.sql",
"creature_formations table leader guid {} incorrect (does not exist). Skipped", group_member.
leaderGUID);
150 continue;
151 }
152
154 {
155 LOG_ERROR(
"sql.sql",
"creature_formations table member guid {} incorrect (does not exist). Skipped", memberGUID);
156 continue;
157 }
158
160 ++count;
161 } while (result->NextRow());
162
165}
std::uint32_t uint32
Definition: Define.h:108
std::uint16_t uint16
Definition: Define.h:109
#define LOG_INFO(filterType__,...)
Definition: Log.h:165
#define LOG_ERROR(filterType__,...)
Definition: Log.h:157
#define LOG_WARN(filterType__,...)
Definition: Log.h:161
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition: Timer.h:131
uint32 getMSTime()
Definition: Timer.h:103
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
Definition: DatabaseEnv.cpp:20
std::shared_ptr< ResultSet > QueryResult
Definition: DatabaseEnvFwd.h:28
#define sObjectMgr
Definition: ObjectMgr.h:1640
Class used to access individual fields of database query result.
Definition: Field.h:99
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition: Field.h:113
Definition: CreatureGroups.h:51
float follow_dist
Definition: CreatureGroups.h:63
uint32 point_1
Definition: CreatureGroups.h:66
float follow_angle
Definition: CreatureGroups.h:64
uint32 point_2
Definition: CreatureGroups.h:67
ObjectGuid::LowType leaderGUID
Definition: CreatureGroups.h:62
uint16 groupAI
Definition: CreatureGroups.h:65
bool HasGroupFlag(uint16 flag) const
Definition: CreatureGroups.h:69
CreatureGroupInfoType CreatureGroupMap
Definition: CreatureGroups.h:85
uint32 LowType
Definition: ObjectGuid.h:124