49 itr->second->SaveToDB();
56 TC_LOG_ERROR(
"guild",
"Guild ids overflow!! Can't continue, shutting down server. ");
65 GuildContainer::const_iterator itr =
GuildStore.find(guildId);
67 return itr->second.get();
95 return guild->GetName();
109 if (itr->second->GetLeaderGUID() == guid)
110 return itr->second.get();
118 TC_LOG_INFO(
"server.loading",
"Loading guilds definitions...");
123 QueryResult result =
CharacterDatabase.Query(
"SELECT g.guildid, g.name, g.leaderguid, g.EmblemStyle, g.EmblemColor, g.BorderStyle, g.BorderColor, "
125 "g.BackgroundColor, g.info, g.motd, g.createdate, g.BankMoney, COUNT(gbt.guildid) "
126 "FROM guild g LEFT JOIN guild_bank_tab gbt ON g.guildid = gbt.guildid GROUP BY g.guildid ORDER BY g.guildid ASC");
130 TC_LOG_INFO(
"server.loading",
">> Loaded 0 guild definitions. DB table `guild` is empty.");
138 Field* fields = result->Fetch();
151 while (result->NextRow());
158 TC_LOG_INFO(
"server.loading",
"Loading guild ranks...");
163 CharacterDatabase.DirectExecute(
"DELETE gr FROM guild_rank gr LEFT JOIN guild g ON gr.guildId = g.guildId WHERE g.guildId IS NULL");
166 QueryResult result =
CharacterDatabase.Query(
"SELECT guildid, rid, RankOrder, rname, rights, BankMoneyPerDay FROM guild_rank ORDER BY guildid ASC, rid ASC");
170 TC_LOG_INFO(
"server.loading",
">> Loaded 0 guild ranks. DB table `guild_rank` is empty.");
177 Field* fields = result->Fetch();
181 guild->LoadRankFromDB(fields);
185 while (result->NextRow());
192 TC_LOG_INFO(
"server.loading",
"Loading guild members...");
197 CharacterDatabase.DirectExecute(
"DELETE gm FROM guild_member gm LEFT JOIN guild g ON gm.guildId = g.guildId WHERE g.guildId IS NULL");
198 CharacterDatabase.DirectExecute(
"DELETE gm FROM guild_member_withdraw gm LEFT JOIN guild_member g ON gm.guid = g.guid WHERE g.guid IS NULL");
201 QueryResult result =
CharacterDatabase.Query(
"SELECT gm.guildid, gm.guid, `rank`, pnote, offnote, w.tab0, w.tab1, w.tab2, w.tab3, w.tab4, w.tab5, "
203 "w.tab6, w.tab7, w.money, c.name, c.level, c.race, c.class, c.gender, c.zone, c.account, c.logout_time "
204 "FROM guild_member gm "
205 "LEFT JOIN guild_member_withdraw w ON gm.guid = w.guid "
206 "LEFT JOIN characters c ON c.guid = gm.guid ORDER BY gm.guildid ASC");
209 TC_LOG_INFO(
"server.loading",
">> Loaded 0 guild members. DB table `guild_member` is empty.");
216 Field* fields = result->Fetch();
220 guild->LoadMemberFromDB(fields);
224 while (result->NextRow());
231 TC_LOG_INFO(
"server.loading",
"Loading bank tab rights...");
236 CharacterDatabase.DirectExecute(
"DELETE gbr FROM guild_bank_right gbr LEFT JOIN guild g ON gbr.guildId = g.guildId WHERE g.guildId IS NULL");
239 QueryResult result =
CharacterDatabase.Query(
"SELECT guildid, TabId, rid, gbright, SlotPerDay FROM guild_bank_right ORDER BY guildid ASC, TabId ASC");
243 TC_LOG_INFO(
"server.loading",
">> Loaded 0 guild bank tab rights. DB table `guild_bank_right` is empty.");
250 Field* fields = result->Fetch();
254 guild->LoadBankRightFromDB(fields);
258 while (result->NextRow());
265 TC_LOG_INFO(
"server.loading",
"Loading guild event logs...");
272 QueryResult result =
CharacterDatabase.Query(
"SELECT guildid, LogGuid, EventType, PlayerGuid1, PlayerGuid2, NewRank, TimeStamp FROM guild_eventlog ORDER BY TimeStamp DESC, LogGuid DESC");
276 TC_LOG_INFO(
"server.loading",
">> Loaded 0 guild event logs. DB table `guild_eventlog` is empty.");
283 Field* fields = result->Fetch();
287 guild->LoadEventLogFromDB(fields);
291 while (result->NextRow());
298 TC_LOG_INFO(
"server.loading",
"Loading guild bank event logs...");
306 QueryResult result =
CharacterDatabase.Query(
"SELECT guildid, TabId, LogGuid, EventType, PlayerGuid, ItemOrMoney, ItemStackCount, DestTabId, TimeStamp FROM guild_bank_eventlog ORDER BY TimeStamp DESC, LogGuid DESC");
310 TC_LOG_INFO(
"server.loading",
">> Loaded 0 guild bank event logs. DB table `guild_bank_eventlog` is empty.");
317 Field* fields = result->Fetch();
321 guild->LoadBankEventLogFromDB(fields);
325 while (result->NextRow());
332 TC_LOG_INFO(
"server.loading",
"Loading Guild News...");
339 QueryResult result =
CharacterDatabase.Query(
"SELECT guildid, LogGuid, EventType, PlayerGuid, Flags, Value, Timestamp FROM guild_newslog ORDER BY TimeStamp DESC, LogGuid DESC");
342 TC_LOG_INFO(
"server.loading",
">> Loaded 0 guild event logs. DB table `guild_newslog` is empty.");
348 Field* fields = result->Fetch();
352 guild->LoadGuildNewsLogFromDB(fields);
356 while (result->NextRow());
363 TC_LOG_INFO(
"server.loading",
"Loading guild bank tabs...");
368 CharacterDatabase.DirectExecute(
"DELETE gbt FROM guild_bank_tab gbt LEFT JOIN guild g ON gbt.guildId = g.guildId WHERE g.guildId IS NULL");
371 QueryResult result =
CharacterDatabase.Query(
"SELECT guildid, TabId, TabName, TabIcon, TabText FROM guild_bank_tab ORDER BY guildid ASC, TabId ASC");
375 TC_LOG_INFO(
"server.loading",
">> Loaded 0 guild bank tabs. DB table `guild_bank_tab` is empty.");
382 Field* fields = result->Fetch();
386 guild->LoadBankTabFromDB(fields);
390 while (result->NextRow());
397 TC_LOG_INFO(
"server.loading",
"Filling bank tabs with items...");
402 CharacterDatabase.DirectExecute(
"DELETE gbi FROM guild_bank_item gbi LEFT JOIN guild g ON gbi.guildId = g.guildId WHERE g.guildId IS NULL");
426 TC_LOG_INFO(
"server.loading",
">> Loaded 0 guild bank tab items. DB table `guild_bank_item` or `item_instance` is empty.");
433 Field* fields = result->Fetch();
437 guild->LoadBankItemFromDB(fields);
441 while (result->NextRow());
448 TC_LOG_INFO(
"server.loading",
"Loading guild achievements...");
452 uint64 achievementCount = 0;
466 if (achievementResult)
467 achievementCount += achievementResult->GetRowCount();
469 criteriaCount += criteriaResult->GetRowCount();
471 itr->second->GetAchievementMgr().LoadFromDB(achievementResult, criteriaResult);
474 TC_LOG_INFO(
"server.loading",
">> Loaded {} guild achievements and {} criterias in {} ms", achievementCount, criteriaCount,
GetMSTimeDiffToNow(oldMSTime));
478 TC_LOG_INFO(
"misc",
"Validating data of loaded guilds...");
484 Guild* guild = itr->second.get();
503 TC_LOG_ERROR(
"server.loading",
">> Loaded 0 guild reward definitions. DB table `guild_rewards` is empty.");
512 Field* fields = result->Fetch();
520 TC_LOG_ERROR(
"server.loading",
"Guild rewards constains not existing item entry {}", reward.
ItemID);
533 if (reqAchievementResult)
537 fields = reqAchievementResult->Fetch();
543 TC_LOG_ERROR(
"server.loading",
"Guild rewards constains not existing achievement entry {}", requiredAchievementId);
548 }
while (reqAchievementResult->NextRow());
553 }
while (result->NextRow());
563 if (
Guild* guild = itr->second.get())
564 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__,...)
#define TC_LOG_INFO(filterType__,...)
#define MAX_REPUTATION_RANK
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
bool StringEqualI(std::string_view a, std::string_view b)
@ WORLD_SEL_GUILD_REWARDS_REQ_ACHIEVEMENTS
Class used to access individual fields of database query result.
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)
LowType GetCounter() const
void setUInt32(const uint8 index, const uint32 value)
void setUInt64(const uint8 index, const uint64 value)
static void StopNow(uint8 exitcode)
@ CONFIG_GUILD_EVENT_LOG_COUNT
@ CONFIG_GUILD_BANK_EVENT_LOG_COUNT
@ CONFIG_GUILD_NEWS_LOG_COUNT
Trinity::RaceMask< uint64 > RaceMask
std::vector< uint32 > AchievementsRequired