50 itr->second->SaveToDB();
57 TC_LOG_ERROR(
"guild",
"Guild ids overflow!! Can't continue, shutting down server. ");
66 GuildContainer::const_iterator itr =
GuildStore.find(guildId);
68 return itr->second.get();
110 if (itr->second->GetLeaderGUID() == guid)
111 return itr->second.get();
119 TC_LOG_INFO(
"server.loading",
"Loading guilds definitions...");
124 QueryResult result =
CharacterDatabase.Query(
"SELECT g.guildid, g.name, g.leaderguid, g.EmblemStyle, g.EmblemColor, g.BorderStyle, g.BorderColor, "
126 "g.BackgroundColor, g.info, g.motd, g.createdate, g.BankMoney, COUNT(gbt.guildid) "
127 "FROM guild g LEFT JOIN guild_bank_tab gbt ON g.guildid = gbt.guildid GROUP BY g.guildid ORDER BY g.guildid ASC");
131 TC_LOG_INFO(
"server.loading",
">> Loaded 0 guild definitions. DB table `guild` is empty.");
139 Field* fields = result->Fetch();
152 while (result->NextRow());
159 TC_LOG_INFO(
"server.loading",
"Loading guild ranks...");
164 CharacterDatabase.DirectExecute(
"DELETE gr FROM guild_rank gr LEFT JOIN guild g ON gr.guildId = g.guildId WHERE g.guildId IS NULL");
167 QueryResult result =
CharacterDatabase.Query(
"SELECT guildid, rid, RankOrder, rname, rights, BankMoneyPerDay FROM guild_rank ORDER BY guildid ASC, rid ASC");
171 TC_LOG_INFO(
"server.loading",
">> Loaded 0 guild ranks. DB table `guild_rank` is empty.");
178 Field* fields = result->Fetch();
182 guild->LoadRankFromDB(fields);
186 while (result->NextRow());
193 TC_LOG_INFO(
"server.loading",
"Loading guild members...");
198 CharacterDatabase.DirectExecute(
"DELETE gm FROM guild_member gm LEFT JOIN guild g ON gm.guildId = g.guildId WHERE g.guildId IS NULL");
199 CharacterDatabase.DirectExecute(
"DELETE gm FROM guild_member_withdraw gm LEFT JOIN guild_member g ON gm.guid = g.guid WHERE g.guid IS NULL");
202 QueryResult result =
CharacterDatabase.Query(
"SELECT gm.guildid, gm.guid, `rank`, pnote, offnote, w.tab0, w.tab1, w.tab2, w.tab3, w.tab4, w.tab5, "
204 "w.tab6, w.tab7, w.money, c.name, c.level, c.race, c.class, c.gender, c.zone, c.account, c.logout_time "
205 "FROM guild_member gm "
206 "LEFT JOIN guild_member_withdraw w ON gm.guid = w.guid "
207 "LEFT JOIN characters c ON c.guid = gm.guid ORDER BY gm.guildid ASC");
210 TC_LOG_INFO(
"server.loading",
">> Loaded 0 guild members. DB table `guild_member` is empty.");
217 Field* fields = result->Fetch();
221 guild->LoadMemberFromDB(fields);
225 while (result->NextRow());
232 TC_LOG_INFO(
"server.loading",
"Loading bank tab rights...");
237 CharacterDatabase.DirectExecute(
"DELETE gbr FROM guild_bank_right gbr LEFT JOIN guild g ON gbr.guildId = g.guildId WHERE g.guildId IS NULL");
240 QueryResult result =
CharacterDatabase.Query(
"SELECT guildid, TabId, rid, gbright, SlotPerDay FROM guild_bank_right ORDER BY guildid ASC, TabId ASC");
244 TC_LOG_INFO(
"server.loading",
">> Loaded 0 guild bank tab rights. DB table `guild_bank_right` is empty.");
251 Field* fields = result->Fetch();
255 guild->LoadBankRightFromDB(fields);
259 while (result->NextRow());
266 TC_LOG_INFO(
"server.loading",
"Loading guild event logs...");
273 QueryResult result =
CharacterDatabase.Query(
"SELECT guildid, LogGuid, EventType, PlayerGuid1, PlayerGuid2, NewRank, TimeStamp FROM guild_eventlog ORDER BY TimeStamp DESC, LogGuid DESC");
277 TC_LOG_INFO(
"server.loading",
">> Loaded 0 guild event logs. DB table `guild_eventlog` is empty.");
284 Field* fields = result->Fetch();
288 guild->LoadEventLogFromDB(fields);
292 while (result->NextRow());
299 TC_LOG_INFO(
"server.loading",
"Loading guild bank event logs...");
307 QueryResult result =
CharacterDatabase.Query(
"SELECT guildid, TabId, LogGuid, EventType, PlayerGuid, ItemOrMoney, ItemStackCount, DestTabId, TimeStamp FROM guild_bank_eventlog ORDER BY TimeStamp DESC, LogGuid DESC");
311 TC_LOG_INFO(
"server.loading",
">> Loaded 0 guild bank event logs. DB table `guild_bank_eventlog` is empty.");
318 Field* fields = result->Fetch();
322 guild->LoadBankEventLogFromDB(fields);
326 while (result->NextRow());
333 TC_LOG_INFO(
"server.loading",
"Loading Guild News...");
340 QueryResult result =
CharacterDatabase.Query(
"SELECT guildid, LogGuid, EventType, PlayerGuid, Flags, Value, Timestamp FROM guild_newslog ORDER BY TimeStamp DESC, LogGuid DESC");
343 TC_LOG_INFO(
"server.loading",
">> Loaded 0 guild event logs. DB table `guild_newslog` is empty.");
349 Field* fields = result->Fetch();
353 guild->LoadGuildNewsLogFromDB(fields);
357 while (result->NextRow());
364 TC_LOG_INFO(
"server.loading",
"Loading guild bank tabs...");
369 CharacterDatabase.DirectExecute(
"DELETE gbt FROM guild_bank_tab gbt LEFT JOIN guild g ON gbt.guildId = g.guildId WHERE g.guildId IS NULL");
372 QueryResult result =
CharacterDatabase.Query(
"SELECT guildid, TabId, TabName, TabIcon, TabText FROM guild_bank_tab ORDER BY guildid ASC, TabId ASC");
376 TC_LOG_INFO(
"server.loading",
">> Loaded 0 guild bank tabs. DB table `guild_bank_tab` is empty.");
383 Field* fields = result->Fetch();
387 guild->LoadBankTabFromDB(fields);
391 while (result->NextRow());
398 TC_LOG_INFO(
"server.loading",
"Filling bank tabs with items...");
403 CharacterDatabase.DirectExecute(
"DELETE gbi FROM guild_bank_item gbi LEFT JOIN guild g ON gbi.guildId = g.guildId WHERE g.guildId IS NULL");
427 TC_LOG_INFO(
"server.loading",
">> Loaded 0 guild bank tab items. DB table `guild_bank_item` or `item_instance` is empty.");
434 Field* fields = result->Fetch();
438 guild->LoadBankItemFromDB(fields);
442 while (result->NextRow());
449 TC_LOG_INFO(
"server.loading",
"Loading guild achievements...");
453 uint64 achievementCount = 0;
467 if (achievementResult)
468 achievementCount += achievementResult->GetRowCount();
470 criteriaCount += criteriaResult->GetRowCount();
472 itr->second->GetAchievementMgr().LoadFromDB(achievementResult, criteriaResult);
475 TC_LOG_INFO(
"server.loading",
">> Loaded {} guild achievements and {} criterias in {} ms", achievementCount, criteriaCount,
GetMSTimeDiffToNow(oldMSTime));
479 TC_LOG_INFO(
"misc",
"Validating data of loaded guilds...");
485 Guild* guild = itr->second.get();
504 TC_LOG_INFO(
"server.loading",
">> Loaded 0 guild reward definitions. DB table `guild_rewards` is empty.");
513 Field* fields = result->Fetch();
516 reward.
RaceMask = { advstd::bit_cast<std::array<int32, 2>>(fields[2].
GetUInt64()) };
521 TC_LOG_ERROR(
"sql.sql",
"Guild rewards constains not existing item entry {}", reward.
ItemID);
534 if (reqAchievementResult)
538 fields = reqAchievementResult->Fetch();
544 TC_LOG_ERROR(
"sql.sql",
"Guild rewards constains not existing achievement entry {}", requiredAchievementId);
549 }
while (reqAchievementResult->NextRow());
554 }
while (result->NextRow());
564 if (
Guild* guild = itr->second.get())
565 guild->ResetTimes(week);
@ CHAR_SEL_GUILD_BANK_ITEMS
@ CHAR_SEL_GUILD_ACHIEVEMENT
@ CHAR_DEL_GUILD_MEMBER_WITHDRAW
@ CHAR_SEL_GUILD_ACHIEVEMENT_CRITERIA
DB2Storage< AchievementEntry > sAchievementStore("Achievement.db2", &AchievementLoadInfo::Instance)
std::shared_ptr< ResultSet > QueryResult
std::shared_ptr< PreparedResultSet > PreparedQueryResult
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
#define TC_LOG_ERROR(filterType__, message__,...)
#define TC_LOG_INFO(filterType__, message__,...)
#define MAX_REPUTATION_RANK
TC_COMMON_API bool StringEqualI(std::string_view str1, std::string_view str2)
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
@ WORLD_SEL_GUILD_REWARDS_REQ_ACHIEVEMENTS
Class used to access individual fields of database query result.
uint64 GetUInt64() const noexcept
uint32 GetUInt32() const noexcept
uint8 GetUInt8() const noexcept
std::string GetGuildNameById(ObjectGuid::LowType guildId) const
GuildContainer GuildStore
void ResetTimes(bool week)
Guild * GetGuildById(ObjectGuid::LowType guildId) const
std::vector< GuildReward > GuildRewards
ObjectGuid::LowType NextGuildId
Guild * GetGuildByLeader(ObjectGuid guid) const
void AddGuild(Guild *guild)
ObjectGuid::LowType GenerateGuildId()
Guild * GetGuildByGuid(ObjectGuid guid) const
void RemoveGuild(ObjectGuid::LowType guildId)
static GuildMgr * instance()
Guild * GetGuildByName(std::string_view guildName) const
void SetWeakPtr(Trinity::unique_weak_ptr< Guild > weakRef)
ObjectGuid::LowType GetId() const
bool LoadFromDB(Field *fields)
std::string const & GetName() const
LowType GetCounter() const
void setUInt32(uint8 index, uint32 value)
void setUInt64(uint8 index, uint64 value)
Specialized variant of std::shared_ptr that enforces unique ownership and/or std::unique_ptr with std...
static void StopNow(uint8 exitcode)
@ CONFIG_GUILD_EVENT_LOG_COUNT
@ CONFIG_GUILD_BANK_EVENT_LOG_COUNT
@ CONFIG_GUILD_NEWS_LOG_COUNT
std::vector< uint32 > AchievementsRequired
Trinity::RaceMask< std::array< int32, 2 > > RaceMask