mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-21 09:44:45 +01:00
Core: Optimize guild loading
--HG-- branch : trunk
This commit is contained in:
@@ -3450,33 +3450,47 @@ void ObjectMgr::BuildPlayerLevelInfo(uint8 race, uint8 _class, uint8 level, Play
|
||||
void ObjectMgr::LoadGuilds()
|
||||
{
|
||||
Guild *newGuild;
|
||||
uint32 count = 0;
|
||||
|
||||
QueryCallback<int> callback[MAX_OBJMGR_QUERY_CALLBACK];
|
||||
|
||||
SQLQueryHolder generalHolder;
|
||||
generalHolder.SetSize(MAX_OBJMGR_QUERY_CALLBACK);
|
||||
|
||||
SQLQueryHolder guildEventHolder;
|
||||
guildEventHolder.SetSize(MAX_OBJMGR_QUERY_CALLBACK);
|
||||
|
||||
SQLQueryHolder guildBankEventHolder;
|
||||
guildBankEventHolder.SetSize(MAX_OBJMGR_QUERY_CALLBACK);
|
||||
|
||||
SQLQueryHolder guildBankHolder;
|
||||
guildBankHolder.SetSize(MAX_OBJMGR_QUERY_CALLBACK);
|
||||
|
||||
|
||||
// 0 1 2 3 4 5 6
|
||||
guildEventHolder.SetQuery(OBJMGR_QUERY_CALLBACK_GUILDEVENTS, "SELECT LogGuid, EventType, PlayerGuid1, PlayerGuid2, NewRank, TimeStamp, guildid FROM guild_eventlog ORDER BY TimeStamp DESC, LogGuid DESC");
|
||||
|
||||
// 0 1 2 3 4 5 6 7 8
|
||||
guildBankEventHolder.SetQuery(OBJMGR_QUERY_CALLBACK_GUILDBANKEVENTS, "SELECT LogGuid, EventType, PlayerGuid, ItemOrMoney, ItemStackCount, DestTabId, TimeStamp, guildid, TabId FROM guild_bank_eventlog ORDER BY TimeStamp DESC,LogGuid DESC");
|
||||
|
||||
// 0 1 2 3 4
|
||||
guildBankHolder.SetQuery(OBJMGR_QUERY_CALLBACK_GUILDBANKS, "SELECT TabId, TabName, TabIcon, TabText, guildid FROM guild_bank_tab ORDER BY TabId");
|
||||
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
||||
guildBankHolder.SetQuery(OBJMGR_QUERY_CALLBACK_GUILDBANK_ITEMS, "SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, TabId, SlotId, item_guid, item_entry, guildid FROM guild_bank_item JOIN item_instance ON item_guid = guid");
|
||||
|
||||
|
||||
// 0 1 2 3 4 5 6
|
||||
QueryResult result = CharacterDatabase.Query("SELECT guild.guildid,guild.name,leaderguid,EmblemStyle,EmblemColor,BorderStyle,BorderColor,"
|
||||
generalHolder.SetQuery(OBJMGR_QUERY_CALLBACK_GUILDS, "SELECT guild.guildid,guild.name,leaderguid,EmblemStyle,EmblemColor,BorderStyle,BorderColor,"
|
||||
// 7 8 9 10 11 12
|
||||
"BackgroundColor,info,motd,createdate,BankMoney,COUNT(guild_bank_tab.guildid) "
|
||||
"FROM guild LEFT JOIN guild_bank_tab ON guild.guildid = guild_bank_tab.guildid GROUP BY guild.guildid ORDER BY guildid ASC");
|
||||
|
||||
if (!result)
|
||||
{
|
||||
|
||||
barGoLink bar(1);
|
||||
|
||||
bar.step();
|
||||
|
||||
sLog.outString();
|
||||
sLog.outString(">> Loaded %u guild definitions", count);
|
||||
return;
|
||||
}
|
||||
|
||||
// load guild ranks
|
||||
// 0 1 2 3 4
|
||||
QueryResult guildRanksResult = CharacterDatabase.Query("SELECT guildid,rid,rname,rights,BankMoneyPerDay FROM guild_rank ORDER BY guildid ASC, rid ASC");
|
||||
generalHolder.SetQuery(OBJMGR_QUERY_CALLBACK_GUILDRANKS, "SELECT guildid,rid,rname,rights,BankMoneyPerDay FROM guild_rank ORDER BY guildid ASC, rid ASC");
|
||||
|
||||
// load guild members
|
||||
// 0 1 2 3 4 5 6
|
||||
QueryResult guildMembersResult = CharacterDatabase.Query("SELECT guildid,guild_member.guid,rank,pnote,offnote,BankResetTimeMoney,BankRemMoney,"
|
||||
generalHolder.SetQuery(OBJMGR_QUERY_CALLBACK_GUILDMEMBERS, "SELECT guildid,guild_member.guid,rank,pnote,offnote,BankResetTimeMoney,BankRemMoney,"
|
||||
// 7 8 9 10 11 12
|
||||
"BankResetTimeTab0,BankRemSlotsTab0,BankResetTimeTab1,BankRemSlotsTab1,BankResetTimeTab2,BankRemSlotsTab2,"
|
||||
// 13 14 15 16 17 18
|
||||
@@ -3487,16 +3501,42 @@ void ObjectMgr::LoadGuilds()
|
||||
|
||||
// load guild bank tab rights
|
||||
// 0 1 2 3 4
|
||||
QueryResult guildBankTabRightsResult = CharacterDatabase.Query("SELECT guildid,TabId,rid,gbright,SlotPerDay FROM guild_bank_right ORDER BY guildid ASC, TabId ASC");
|
||||
generalHolder.SetQuery(OBJMGR_QUERY_CALLBACK_GUILDBANKTABRIGHTS, "SELECT guildid,TabId,rid,gbright,SlotPerDay FROM guild_bank_right ORDER BY guildid ASC, TabId ASC");
|
||||
|
||||
|
||||
|
||||
QueryResultHolderFuture generalHolderFuture = CharacterDatabase.DelayQueryHolder(&generalHolder);
|
||||
QueryResultHolderFuture guildEventHolderFuture = CharacterDatabase.DelayQueryHolder(&guildEventHolder);
|
||||
QueryResultHolderFuture guildBankEventHolderFuture = CharacterDatabase.DelayQueryHolder(&guildBankEventHolder);
|
||||
QueryResultHolderFuture guildBankHolderFuture = CharacterDatabase.DelayQueryHolder(&guildBankHolder);
|
||||
|
||||
while(!generalHolderFuture.ready())
|
||||
Sleep(5);
|
||||
|
||||
QueryResult result = generalHolder.GetResult(OBJMGR_QUERY_CALLBACK_GUILDS);
|
||||
QueryResult guildRanksResult = generalHolder.GetResult(OBJMGR_QUERY_CALLBACK_GUILDRANKS);
|
||||
QueryResult guildMembersResult = generalHolder.GetResult(OBJMGR_QUERY_CALLBACK_GUILDMEMBERS);
|
||||
QueryResult guildBankTabRightsResult = generalHolder.GetResult(OBJMGR_QUERY_CALLBACK_GUILDBANKTABRIGHTS);
|
||||
|
||||
if (!result)
|
||||
{
|
||||
barGoLink bar(1);
|
||||
|
||||
bar.step();
|
||||
|
||||
sLog.outString();
|
||||
sLog.outString(">> Loaded 0 guild definitions");
|
||||
return;
|
||||
}
|
||||
|
||||
barGoLink bar(result->GetRowCount());
|
||||
|
||||
uint32 maxid = 0;
|
||||
do
|
||||
{
|
||||
//Field *fields = result->Fetch();
|
||||
|
||||
bar.step();
|
||||
++count;
|
||||
|
||||
newGuild = new Guild;
|
||||
if (!newGuild->LoadGuildFromDB(result) ||
|
||||
@@ -3510,20 +3550,242 @@ void ObjectMgr::LoadGuilds()
|
||||
delete newGuild;
|
||||
continue;
|
||||
}
|
||||
newGuild->LoadGuildEventLogFromDB();
|
||||
newGuild->LoadGuildBankEventLogFromDB();
|
||||
newGuild->LoadGuildBankFromDB();
|
||||
|
||||
newGuild->m_TabListMap.resize(newGuild->GetPurchasedTabs());
|
||||
|
||||
AddGuild(newGuild);
|
||||
|
||||
if(maxid < newGuild->GetId())
|
||||
maxid = newGuild->GetId();
|
||||
|
||||
} while (result->NextRow());
|
||||
|
||||
std::vector<Guild*> GuildVector(maxid + 1);
|
||||
|
||||
for(GuildMap::iterator itr = mGuildMap.begin(); itr != mGuildMap.end(); ++itr)
|
||||
GuildVector[itr->second->GetId()] = (*itr).second;
|
||||
|
||||
UNORDERED_MAP<ObjectMgrQueryCallbacks, QueryResultHolderFuture*> callbackMap;
|
||||
callbackMap[OBJMGR_QUERY_CALLBACK_GUILDEVENTS] = &guildEventHolderFuture;
|
||||
callbackMap[OBJMGR_QUERY_CALLBACK_GUILDBANKEVENTS] = &guildBankEventHolderFuture;
|
||||
callbackMap[OBJMGR_QUERY_CALLBACK_GUILDBANKS] = &guildBankHolderFuture;
|
||||
|
||||
UNORDERED_MAP<ObjectMgrQueryCallbacks, QueryResultHolderFuture*>::iterator callbackItr = callbackMap.begin();
|
||||
while(!callbackMap.empty())
|
||||
{
|
||||
if(callbackItr->second->ready())
|
||||
{
|
||||
switch(callbackItr->first)
|
||||
{
|
||||
case OBJMGR_QUERY_CALLBACK_GUILDEVENTS:
|
||||
{
|
||||
QueryResult result = guildEventHolder.GetResult(OBJMGR_QUERY_CALLBACK_GUILDEVENTS);
|
||||
|
||||
LoadGuildEvents(GuildVector, result);
|
||||
break;
|
||||
}
|
||||
case OBJMGR_QUERY_CALLBACK_GUILDBANKEVENTS:
|
||||
{
|
||||
QueryResult result = guildBankEventHolder.GetResult(OBJMGR_QUERY_CALLBACK_GUILDBANKEVENTS);
|
||||
|
||||
LoadGuildBankEvents(GuildVector, result);
|
||||
break;
|
||||
}
|
||||
case OBJMGR_QUERY_CALLBACK_GUILDBANKS:
|
||||
{
|
||||
QueryResult result = guildBankHolder.GetResult(OBJMGR_QUERY_CALLBACK_GUILDBANKS);
|
||||
QueryResult itemResult = guildBankHolder.GetResult(OBJMGR_QUERY_CALLBACK_GUILDBANK_ITEMS);
|
||||
|
||||
LoadGuildBanks(GuildVector, result, itemResult);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
callbackMap.erase(callbackItr++);
|
||||
}
|
||||
else
|
||||
++callbackItr;
|
||||
|
||||
if(callbackItr == callbackMap.end())
|
||||
{
|
||||
callbackItr = callbackMap.begin();
|
||||
Sleep(5);
|
||||
}
|
||||
}
|
||||
|
||||
//delete unused LogGuid records in guild_eventlog and guild_bank_eventlog table
|
||||
//you can comment these lines if you don't plan to change CONFIG_GUILD_EVENT_LOG_COUNT and CONFIG_GUILD_BANK_EVENT_LOG_COUNT
|
||||
CharacterDatabase.PQuery("DELETE FROM guild_eventlog WHERE LogGuid > '%u'", sWorld.getIntConfig(CONFIG_GUILD_EVENT_LOG_COUNT));
|
||||
CharacterDatabase.PQuery("DELETE FROM guild_bank_eventlog WHERE LogGuid > '%u'", sWorld.getIntConfig(CONFIG_GUILD_BANK_EVENT_LOG_COUNT));
|
||||
|
||||
sLog.outString();
|
||||
sLog.outString(">> Loaded %u guild definitions", count);
|
||||
sLog.outString(">> Loaded %u guild definitions", mGuildMap.size());
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadGuildEvents(std::vector<Guild*>& GuildVector, QueryResult& result)
|
||||
{
|
||||
if(result)
|
||||
{
|
||||
do
|
||||
{
|
||||
Field *fields = result->Fetch();
|
||||
uint32 guildid = fields[6].GetUInt32();
|
||||
|
||||
if(!GuildVector[guildid]->m_GuildEventLogNextGuid)
|
||||
GuildVector[guildid]->m_GuildEventLogNextGuid = fields[0].GetUInt32();
|
||||
|
||||
if(GuildVector[guildid]->m_GuildEventLog.size() < GUILD_EVENTLOG_MAX_RECORDS)
|
||||
{
|
||||
GuildEventLogEntry NewEvent;
|
||||
NewEvent.EventType = fields[1].GetUInt8();
|
||||
NewEvent.PlayerGuid1 = fields[2].GetUInt32();
|
||||
NewEvent.PlayerGuid2 = fields[3].GetUInt32();
|
||||
NewEvent.NewRank = fields[4].GetUInt8();
|
||||
NewEvent.TimeStamp = fields[5].GetUInt64();
|
||||
|
||||
GuildVector[guildid]->m_GuildEventLog.push_front(NewEvent);
|
||||
}
|
||||
}
|
||||
while(result->NextRow());
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadGuildBankEvents(std::vector<Guild*>& GuildVector, QueryResult& result)
|
||||
{
|
||||
if(result)
|
||||
{
|
||||
do
|
||||
{
|
||||
Field *fields = result->Fetch();
|
||||
uint32 logGuid = fields[0].GetUInt32();
|
||||
uint32 guildid = fields[7].GetUInt32();
|
||||
uint8 TabId = fields[8].GetUInt8();
|
||||
|
||||
if(TabId < GuildVector[guildid]->GetPurchasedTabs() || TabId == GUILD_BANK_MONEY_LOGS_TAB)
|
||||
{
|
||||
bool canInsert;
|
||||
|
||||
if(TabId != GUILD_BANK_MONEY_LOGS_TAB)
|
||||
{
|
||||
if(!GuildVector[guildid]->m_GuildBankEventLogNextGuid_Item[TabId])
|
||||
GuildVector[guildid]->m_GuildBankEventLogNextGuid_Item[TabId] = logGuid;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!GuildVector[guildid]->m_GuildBankEventLogNextGuid_Money)
|
||||
GuildVector[guildid]->m_GuildBankEventLogNextGuid_Money = logGuid;
|
||||
}
|
||||
|
||||
if(TabId != GUILD_BANK_MONEY_LOGS_TAB)
|
||||
canInsert = GuildVector[guildid]->m_GuildBankEventLog_Item[TabId].size() < GUILD_BANK_MAX_LOGS;
|
||||
else
|
||||
canInsert = GuildVector[guildid]->m_GuildBankEventLog_Money.size() < GUILD_BANK_MAX_LOGS;
|
||||
|
||||
if(canInsert)
|
||||
{
|
||||
GuildBankEventLogEntry NewEvent;
|
||||
NewEvent.EventType = fields[1].GetUInt8();
|
||||
NewEvent.PlayerGuid = fields[2].GetUInt32();
|
||||
NewEvent.ItemOrMoney = fields[3].GetUInt32();
|
||||
NewEvent.ItemStackCount = fields[4].GetUInt8();
|
||||
NewEvent.DestTabId = fields[5].GetUInt8();
|
||||
NewEvent.TimeStamp = fields[6].GetUInt64();
|
||||
|
||||
if(TabId != GUILD_BANK_MONEY_LOGS_TAB)
|
||||
{
|
||||
if(NewEvent.isMoneyEvent())
|
||||
{
|
||||
CharacterDatabase.PExecute("UPDATE guild_bank_eventlog SET TabId='%u' WHERE guildid='%u' AND TabId='%u' AND LogGuid='%u'", GUILD_BANK_MONEY_LOGS_TAB, guildid, TabId, logGuid);
|
||||
sLog.outError("GuildBankEventLog ERROR: MoneyEvent LogGuid %u for Guild %u had incorrectly set its TabId to %u, correcting it to %u TabId", logGuid, guildid, TabId, GUILD_BANK_MONEY_LOGS_TAB);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
GuildVector[guildid]->m_GuildBankEventLog_Item[TabId].push_front(NewEvent);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!NewEvent.isMoneyEvent())
|
||||
sLog.outError("GuildBankEventLog ERROR: MoneyEvent LogGuid %u for Guild %u is not MoneyEvent - ignoring...", logGuid, guildid);
|
||||
else
|
||||
GuildVector[guildid]->m_GuildBankEventLog_Money.push_front(NewEvent);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
while(result->NextRow());
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadGuildBanks(std::vector<Guild*>& GuildVector, QueryResult& result, QueryResult& itemResult)
|
||||
{
|
||||
if(result)
|
||||
{
|
||||
do
|
||||
{
|
||||
Field *fields = result->Fetch();
|
||||
uint32 TabId = fields[0].GetUInt32();
|
||||
uint32 guildid = fields[4].GetUInt32();
|
||||
|
||||
if(TabId < GuildVector[guildid]->GetPurchasedTabs())
|
||||
{
|
||||
GuildBankTab *NewTab = new GuildBankTab;
|
||||
|
||||
NewTab->Name = fields[1].GetCppString();
|
||||
NewTab->Icon = fields[2].GetCppString();
|
||||
NewTab->Text = fields[3].GetCppString();
|
||||
|
||||
GuildVector[guildid]->m_TabListMap[TabId] = NewTab;
|
||||
}
|
||||
}
|
||||
while(result->NextRow());
|
||||
}
|
||||
|
||||
if(itemResult)
|
||||
{
|
||||
do
|
||||
{
|
||||
Field *itemfields = itemResult->Fetch();
|
||||
|
||||
uint8 TabId = itemfields[11].GetUInt8();
|
||||
uint8 SlotId = itemfields[12].GetUInt8();
|
||||
uint32 ItemGuid = itemfields[13].GetUInt32();
|
||||
uint32 ItemEntry = itemfields[14].GetUInt32();
|
||||
uint32 guildid = itemfields[15].GetUInt32();
|
||||
|
||||
if (TabId >= GuildVector[guildid]->GetPurchasedTabs())
|
||||
{
|
||||
sLog.outError("Guild::LoadGuildBankFromDB: Invalid tab for item (GUID: %u id: #%u) in guild bank, skipped.", ItemGuid,ItemEntry);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (SlotId >= GUILD_BANK_MAX_SLOTS)
|
||||
{
|
||||
sLog.outError("Guild::LoadGuildBankFromDB: Invalid slot for item (GUID: %u id: #%u) in guild bank, skipped.", ItemGuid,ItemEntry);
|
||||
continue;
|
||||
}
|
||||
|
||||
ItemPrototype const *proto = sObjectMgr.GetItemPrototype(ItemEntry);
|
||||
|
||||
if (!proto)
|
||||
{
|
||||
sLog.outError("Guild::LoadGuildBankFromDB: Unknown item (GUID: %u id: #%u) in guild bank, skipped.", ItemGuid,ItemEntry);
|
||||
continue;
|
||||
}
|
||||
|
||||
Item *pItem = NewItemOrBag(proto);
|
||||
if (!pItem->LoadFromDB(ItemGuid, 0, itemResult, ItemEntry))
|
||||
{
|
||||
CharacterDatabase.PExecute("DELETE FROM guild_bank_item WHERE guildid='%u' AND TabId='%u' AND SlotId='%u'", guildid, uint32(TabId), uint32(SlotId));
|
||||
sLog.outError("Item GUID %u not found in item_instance, deleting from Guild Bank!", ItemGuid);
|
||||
delete pItem;
|
||||
continue;
|
||||
}
|
||||
|
||||
pItem->AddToWorld();
|
||||
GuildVector[guildid]->m_TabListMap[TabId]->Slots[SlotId] = pItem;
|
||||
}
|
||||
while(itemResult->NextRow());
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadArenaTeams()
|
||||
|
||||
@@ -359,6 +359,20 @@ extern LanguageDesc lang_description[LANGUAGES_COUNT];
|
||||
|
||||
class PlayerDumpReader;
|
||||
|
||||
enum ObjectMgrQueryCallbacks
|
||||
{
|
||||
OBJMGR_QUERY_CALLBACK_GUILDEVENTS,
|
||||
OBJMGR_QUERY_CALLBACK_GUILDBANKEVENTS,
|
||||
OBJMGR_QUERY_CALLBACK_GUILDBANKS,
|
||||
OBJMGR_QUERY_CALLBACK_GUILDBANK_ITEMS,
|
||||
OBJMGR_QUERY_CALLBACK_GUILDS,
|
||||
OBJMGR_QUERY_CALLBACK_GUILDRANKS,
|
||||
OBJMGR_QUERY_CALLBACK_GUILDMEMBERS,
|
||||
OBJMGR_QUERY_CALLBACK_GUILDBANKTABRIGHTS,
|
||||
|
||||
MAX_OBJMGR_QUERY_CALLBACK
|
||||
};
|
||||
|
||||
class ObjectMgr
|
||||
{
|
||||
friend class PlayerDumpReader;
|
||||
@@ -594,6 +608,9 @@ class ObjectMgr
|
||||
}
|
||||
|
||||
void LoadGuilds();
|
||||
void LoadGuildEvents(std::vector<Guild*>& GuildVector, QueryResult& result);
|
||||
void LoadGuildBankEvents(std::vector<Guild*>& GuildVector, QueryResult& result);
|
||||
void LoadGuildBanks(std::vector<Guild*>& GuildVector, QueryResult& result, QueryResult& itemResult);
|
||||
void LoadArenaTeams();
|
||||
void LoadGroups();
|
||||
void LoadQuests();
|
||||
|
||||
@@ -872,42 +872,6 @@ void Guild::DisplayGuildEventLog(WorldSession *session)
|
||||
sLog.outDebug("WORLD: Sent (MSG_GUILD_EVENT_LOG_QUERY)");
|
||||
}
|
||||
|
||||
// Load guild eventlog from DB
|
||||
void Guild::LoadGuildEventLogFromDB()
|
||||
{
|
||||
// 0 1 2 3 4 5
|
||||
QueryResult result = CharacterDatabase.PQuery("SELECT LogGuid, EventType, PlayerGuid1, PlayerGuid2, NewRank, TimeStamp FROM guild_eventlog WHERE guildid=%u ORDER BY TimeStamp DESC,LogGuid DESC LIMIT %u", m_Id, GUILD_EVENTLOG_MAX_RECORDS);
|
||||
if (!result)
|
||||
return;
|
||||
bool isNextLogGuidSet = false;
|
||||
//uint32 configCount = sWorld.getIntConfig(CONFIG_GUILD_EVENT_LOG_COUNT);
|
||||
// First event in list will be the oldest and the latest event is last event in list
|
||||
do
|
||||
{
|
||||
Field *fields = result->Fetch();
|
||||
if (!isNextLogGuidSet)
|
||||
{
|
||||
m_GuildEventLogNextGuid = fields[0].GetUInt32();
|
||||
isNextLogGuidSet = true;
|
||||
}
|
||||
// Fill entry
|
||||
GuildEventLogEntry NewEvent;
|
||||
NewEvent.EventType = fields[1].GetUInt8();
|
||||
NewEvent.PlayerGuid1 = fields[2].GetUInt32();
|
||||
NewEvent.PlayerGuid2 = fields[3].GetUInt32();
|
||||
NewEvent.NewRank = fields[4].GetUInt8();
|
||||
NewEvent.TimeStamp = fields[5].GetUInt64();
|
||||
|
||||
// There can be a problem if more events have same TimeStamp the ORDER can be broken when fields[0].GetUInt32() == configCount, but
|
||||
// events with same timestamp can appear when there is lag, and we naivly suppose that mangos isn't laggy
|
||||
// but if problem appears, player will see set of guild events that have same timestamp in bad order
|
||||
|
||||
// Add entry to list
|
||||
m_GuildEventLog.push_front(NewEvent);
|
||||
|
||||
} while (result->NextRow());
|
||||
}
|
||||
|
||||
// Add entry to guild eventlog
|
||||
void Guild::LogGuildEvent(uint8 EventType, uint32 PlayerGuid1, uint32 PlayerGuid2, uint8 NewRank)
|
||||
{
|
||||
@@ -1121,87 +1085,6 @@ uint32 Guild::GetBankRights(uint32 rankId, uint8 TabId) const
|
||||
return m_Ranks[rankId].TabRight[TabId];
|
||||
}
|
||||
|
||||
// *************************************************
|
||||
// Guild bank loading related
|
||||
|
||||
// This load should be called on startup only
|
||||
void Guild::LoadGuildBankFromDB()
|
||||
{
|
||||
// 0 1 2 3
|
||||
QueryResult result = CharacterDatabase.PQuery("SELECT TabId, TabName, TabIcon, TabText FROM guild_bank_tab WHERE guildid='%u' ORDER BY TabId", m_Id);
|
||||
if (!result)
|
||||
{
|
||||
m_TabListMap.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
Field *fields = result->Fetch();
|
||||
uint8 tabId = fields[0].GetUInt8();
|
||||
if (tabId >= GetPurchasedTabs())
|
||||
{
|
||||
sLog.outError("Table `guild_bank_tab` have not purchased tab %u for guild %u, skipped", tabId, m_Id);
|
||||
continue;
|
||||
}
|
||||
|
||||
GuildBankTab *NewTab = new GuildBankTab;
|
||||
|
||||
NewTab->Name = fields[1].GetCppString();
|
||||
NewTab->Icon = fields[2].GetCppString();
|
||||
NewTab->Text = fields[3].GetCppString();
|
||||
|
||||
m_TabListMap[tabId] = NewTab;
|
||||
} while (result->NextRow());
|
||||
|
||||
// data needs to be at first place for Item::LoadFromDB
|
||||
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
||||
result = CharacterDatabase.PQuery("SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, TabId, SlotId, item_guid, item_entry FROM guild_bank_item JOIN item_instance ON item_guid = guid WHERE guildid='%u' ORDER BY TabId", m_Id);
|
||||
if (!result)
|
||||
return;
|
||||
|
||||
do
|
||||
{
|
||||
Field *fields = result->Fetch();
|
||||
uint8 TabId = fields[11].GetUInt8();
|
||||
uint8 SlotId = fields[12].GetUInt8();
|
||||
uint32 ItemGuid = fields[13].GetUInt32();
|
||||
uint32 ItemEntry = fields[14].GetUInt32();
|
||||
|
||||
if (TabId >= GetPurchasedTabs())
|
||||
{
|
||||
sLog.outError("Guild::LoadGuildBankFromDB: Invalid tab for item (GUID: %u id: #%u) in guild bank, skipped.", ItemGuid,ItemEntry);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (SlotId >= GUILD_BANK_MAX_SLOTS)
|
||||
{
|
||||
sLog.outError("Guild::LoadGuildBankFromDB: Invalid slot for item (GUID: %u id: #%u) in guild bank, skipped.", ItemGuid,ItemEntry);
|
||||
continue;
|
||||
}
|
||||
|
||||
ItemPrototype const *proto = sObjectMgr.GetItemPrototype(ItemEntry);
|
||||
|
||||
if (!proto)
|
||||
{
|
||||
sLog.outError("Guild::LoadGuildBankFromDB: Unknown item (GUID: %u id: #%u) in guild bank, skipped.", ItemGuid,ItemEntry);
|
||||
continue;
|
||||
}
|
||||
|
||||
Item *pItem = NewItemOrBag(proto);
|
||||
if (!pItem->LoadFromDB(ItemGuid, 0, result, ItemEntry))
|
||||
{
|
||||
CharacterDatabase.PExecute("DELETE FROM guild_bank_item WHERE guildid='%u' AND TabId='%u' AND SlotId='%u'", m_Id, uint32(TabId), uint32(SlotId));
|
||||
sLog.outError("Item GUID %u not found in item_instance, deleting from Guild Bank!", ItemGuid);
|
||||
delete pItem;
|
||||
continue;
|
||||
}
|
||||
|
||||
pItem->AddToWorld();
|
||||
m_TabListMap[TabId]->Slots[SlotId] = pItem;
|
||||
}while (result->NextRow());
|
||||
}
|
||||
|
||||
// *************************************************
|
||||
// Money deposit/withdraw related
|
||||
|
||||
@@ -1428,89 +1311,6 @@ bool Guild::LoadBankRightsFromDB(QueryResult guildBankTabRightsResult)
|
||||
// *************************************************
|
||||
// Bank log related
|
||||
|
||||
void Guild::LoadGuildBankEventLogFromDB()
|
||||
{
|
||||
// Money log is in TabId = GUILD_BANK_MONEY_LOGS_TAB
|
||||
|
||||
//uint32 configCount = sWorld.getIntConfig(CONFIG_GUILD_BANK_EVENT_LOG_COUNT);
|
||||
//cycle through all purchased guild bank item tabs
|
||||
for (uint32 tabId = 0; tabId < uint32(GetPurchasedTabs()); ++tabId)
|
||||
{
|
||||
// 0 1 2 3 4 5 6
|
||||
QueryResult result = CharacterDatabase.PQuery("SELECT LogGuid, EventType, PlayerGuid, ItemOrMoney, ItemStackCount, DestTabId, TimeStamp FROM guild_bank_eventlog WHERE guildid='%u' AND TabId='%u' ORDER BY TimeStamp DESC,LogGuid DESC LIMIT %u", m_Id, tabId, GUILD_BANK_MAX_LOGS);
|
||||
if (!result)
|
||||
continue;
|
||||
|
||||
bool isNextLogGuidSet = false;
|
||||
do
|
||||
{
|
||||
Field *fields = result->Fetch();
|
||||
|
||||
GuildBankEventLogEntry NewEvent;
|
||||
NewEvent.EventType = fields[1].GetUInt8();
|
||||
NewEvent.PlayerGuid = fields[2].GetUInt32();
|
||||
NewEvent.ItemOrMoney = fields[3].GetUInt32();
|
||||
NewEvent.ItemStackCount = fields[4].GetUInt16();
|
||||
NewEvent.DestTabId = fields[5].GetUInt8();
|
||||
NewEvent.TimeStamp = fields[6].GetUInt64();
|
||||
|
||||
//if newEvent is moneyEvent, move it to moneyEventTab in DB and report error
|
||||
if (NewEvent.isMoneyEvent())
|
||||
{
|
||||
uint32 logGuid = fields[0].GetUInt32();
|
||||
CharacterDatabase.PExecute("UPDATE guild_bank_eventlog SET TabId='%u' WHERE guildid='%u' AND TabId='%u' AND LogGuid='%u'", GUILD_BANK_MONEY_LOGS_TAB, m_Id, tabId, logGuid);
|
||||
sLog.outError("GuildBankEventLog ERROR: MoneyEvent LogGuid %u for Guild %u had incorrectly set its TabId to %u, correcting it to %u TabId", logGuid, m_Id, tabId, GUILD_BANK_MONEY_LOGS_TAB);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
//add event to list
|
||||
//events are ordered from oldest (in beginning) to latest (in the end)
|
||||
m_GuildBankEventLog_Item[tabId].push_front(NewEvent);
|
||||
|
||||
if (!isNextLogGuidSet)
|
||||
{
|
||||
m_GuildBankEventLogNextGuid_Item[tabId] = fields[0].GetUInt32();
|
||||
//we don't have to do m_GuildBankEventLogNextGuid_Item[tabId] %= configCount; - it will be done when creating new record
|
||||
isNextLogGuidSet = true;
|
||||
}
|
||||
} while (result->NextRow());
|
||||
}
|
||||
|
||||
//special handle for guild bank money log
|
||||
// 0 1 2 3 4 5 6
|
||||
QueryResult result = CharacterDatabase.PQuery("SELECT LogGuid, EventType, PlayerGuid, ItemOrMoney, ItemStackCount, DestTabId, TimeStamp FROM guild_bank_eventlog WHERE guildid='%u' AND TabId='%u' ORDER BY TimeStamp DESC,LogGuid DESC LIMIT %u", m_Id, GUILD_BANK_MONEY_LOGS_TAB, GUILD_BANK_MAX_LOGS);
|
||||
if (!result)
|
||||
return;
|
||||
|
||||
bool isNextMoneyLogGuidSet = false;
|
||||
do
|
||||
{
|
||||
Field *fields = result->Fetch();
|
||||
if (!isNextMoneyLogGuidSet)
|
||||
{
|
||||
m_GuildBankEventLogNextGuid_Money = fields[0].GetUInt32();
|
||||
//we don't have to do m_GuildBankEventLogNextGuid_Money %= configCount; - it will be done when creating new record
|
||||
isNextMoneyLogGuidSet = true;
|
||||
}
|
||||
GuildBankEventLogEntry NewEvent;
|
||||
|
||||
NewEvent.EventType = fields[1].GetUInt8();
|
||||
NewEvent.PlayerGuid = fields[2].GetUInt32();
|
||||
NewEvent.ItemOrMoney = fields[3].GetUInt32();
|
||||
NewEvent.ItemStackCount = fields[4].GetUInt16();
|
||||
NewEvent.DestTabId = fields[5].GetUInt8();
|
||||
NewEvent.TimeStamp = fields[6].GetUInt64();
|
||||
|
||||
//if newEvent is not moneyEvent, then report error
|
||||
if (!NewEvent.isMoneyEvent())
|
||||
sLog.outError("GuildBankEventLog ERROR: MoneyEvent LogGuid %u for Guild %u is not MoneyEvent - ignoring...", fields[0].GetUInt32(), m_Id);
|
||||
else
|
||||
//add event to list
|
||||
//events are ordered from oldest (in beginning) to latest (in the end)
|
||||
m_GuildBankEventLog_Money.push_front(NewEvent);
|
||||
|
||||
} while (result->NextRow());
|
||||
}
|
||||
|
||||
void Guild::DisplayGuildBankLogs(WorldSession *session, uint8 TabId)
|
||||
{
|
||||
|
||||
@@ -286,6 +286,7 @@ struct RankInfo
|
||||
|
||||
class Guild
|
||||
{
|
||||
friend class ObjectMgr;
|
||||
public:
|
||||
Guild();
|
||||
~Guild();
|
||||
@@ -385,7 +386,6 @@ class Guild
|
||||
|
||||
void UpdateLogoutTime(uint64 guid);
|
||||
// Guild EventLog
|
||||
void LoadGuildEventLogFromDB();
|
||||
void DisplayGuildEventLog(WorldSession *session);
|
||||
void LogGuildEvent(uint8 EventType, uint32 PlayerGuid1, uint32 PlayerGuid2, uint8 NewRank);
|
||||
|
||||
@@ -408,8 +408,6 @@ class Guild
|
||||
uint32 GetBankRights(uint32 rankId, uint8 TabId) const;
|
||||
bool IsMemberHaveRights(uint32 LowGuid, uint8 TabId,uint32 rights) const;
|
||||
bool CanMemberViewTab(uint32 LowGuid, uint8 TabId) const;
|
||||
// Load
|
||||
void LoadGuildBankFromDB();
|
||||
// Money deposit/withdraw
|
||||
void SendMoneyInfo(WorldSession *session, uint32 LowGuid);
|
||||
bool MemberMoneyWithdraw(uint32 amount, uint32 LowGuid, SQLTransaction& trans);
|
||||
@@ -426,7 +424,6 @@ class Guild
|
||||
// rights per day
|
||||
bool LoadBankRightsFromDB(QueryResult guildBankTabRightsResult);
|
||||
// Guild Bank Event Logs
|
||||
void LoadGuildBankEventLogFromDB();
|
||||
void DisplayGuildBankLogs(WorldSession *session, uint8 TabId);
|
||||
void LogBankEvent(SQLTransaction& trans, uint8 EventType, uint8 TabId, uint32 PlayerGuidLow, uint32 ItemOrMoney, uint16 ItemStackCount=0, uint8 DestTabId=0);
|
||||
bool AddGBankItemToDB(uint32 GuildId, uint32 BankTab , uint32 BankTabSlot , uint32 GUIDLow, uint32 Entry, SQLTransaction& trans);
|
||||
|
||||
Reference in New Issue
Block a user