diff options
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.cpp | 38 | ||||
-rw-r--r-- | src/server/game/Guilds/Guild.h | 4 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Handlers/GuildHandler.cpp | 4 |
4 files changed, 40 insertions, 10 deletions
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 94295a8b564..4890c67c6b4 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3423,8 +3423,8 @@ void ObjectMgr::LoadGuilds() "BankResetTimeTab0,BankRemSlotsTab0,BankResetTimeTab1,BankRemSlotsTab1,BankResetTimeTab2,BankRemSlotsTab2," // 13 14 15 16 17 18 "BankResetTimeTab3,BankRemSlotsTab3,BankResetTimeTab4,BankRemSlotsTab4,BankResetTimeTab5,BankRemSlotsTab5," - // 19 20 21 22 23 - "characters.name, characters.level, characters.class, characters.zone, characters.logout_time " + // 19 20 21 22 23 24 + "characters.name, characters.level, characters.class, characters.zone, characters.logout_time, characters.account " "FROM guild_member LEFT JOIN characters ON characters.guid = guild_member.guid ORDER BY guildid ASC"); // load guild bank tab rights diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index f1f3187bc32..6937db14e88 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -43,6 +43,7 @@ Guild::Guild() m_BorderStyle = 0; m_BorderColor = 0; m_BackgroundColor = 0; + m_accountsNumber = 0; m_CreatedDate = time(0); @@ -136,6 +137,7 @@ bool Guild::AddMember(uint64 plGuid, uint32 plRank) if (pl) { + newmember.accountId = pl->GetSession()->GetAccountId(); newmember.Name = pl->GetName(); newmember.ZoneId = pl->GetZoneId(); newmember.Level = pl->getLevel(); @@ -143,15 +145,16 @@ bool Guild::AddMember(uint64 plGuid, uint32 plRank) } else { - QueryResult_AutoPtr result = CharacterDatabase.PQuery("SELECT name,zone,level,class FROM characters WHERE guid = '%u'", GUID_LOPART(plGuid)); + QueryResult_AutoPtr result = CharacterDatabase.PQuery("SELECT name,zone,level,class,account FROM characters WHERE guid = '%u'", GUID_LOPART(plGuid)); if (!result) return false; // player doesn't exist - Field *fields = result->Fetch(); - newmember.Name = fields[0].GetCppString(); - newmember.ZoneId = fields[1].GetUInt32(); - newmember.Level = fields[2].GetUInt8(); - newmember.Class = fields[3].GetUInt8(); + Field *fields = result->Fetch(); + newmember.Name = fields[0].GetCppString(); + newmember.ZoneId = fields[1].GetUInt32(); + newmember.Level = fields[2].GetUInt8(); + newmember.Class = fields[3].GetUInt8(); + newmember.accountId = fields[4].GetInt32(); if (newmember.Level < 1 || newmember.Level > STRONG_MAX_LEVEL || newmember.Class < CLASS_WARRIOR || newmember.Class >= MAX_CLASSES) @@ -185,6 +188,9 @@ bool Guild::AddMember(uint64 plGuid, uint32 plRank) pl->SetRank(newmember.RankId); pl->SetGuildIdInvited(0); } + + UpdateAccountsNumber(); + return true; } @@ -340,6 +346,8 @@ bool Guild::LoadMembersFromDB(QueryResult_AutoPtr guildMembersResult) if (!guildMembersResult) return false; + UpdateAccountsNumber(); + do { Field *fields = guildMembersResult->Fetch(); @@ -382,6 +390,7 @@ bool Guild::LoadMembersFromDB(QueryResult_AutoPtr guildMembersResult) newmember.Class = fields[21].GetUInt8(); newmember.ZoneId = fields[22].GetUInt32(); newmember.LogoutTime = fields[23].GetUInt64(); + newmember.accountId = fields[24].GetInt32(); //this code will remove unexisting character guids from guild if (newmember.Level < 1 || newmember.Level > STRONG_MAX_LEVEL) // can be at broken `data` field @@ -492,6 +501,9 @@ void Guild::DelMember(uint64 guid, bool isDisbanding) } CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guid = '%u'", GUID_LOPART(guid)); + + if (!isDisbanding) + UpdateAccountsNumber(); } void Guild::ChangeRank(uint64 guid, uint32 newRank) @@ -801,6 +813,20 @@ void Guild::UpdateLogoutTime(uint64 guid) itr->second.LogoutTime = time(NULL); } +/** + * Updates the number of accounts that are in the guild + * A player may have many characters in the guild, but with the same account + */ +void Guild::UpdateAccountsNumber() +{ + // We use a set to be sure each element will be unique + std::set<uint32> accountsIdSet; + for (MembersList::const_iterator itr = members.begin(); itr != members.end(); ++itr) + accountsIdSet.insert(itr->second.accountId); + + m_accountsNumber = accountsIdSet.size(); +} + // ************************************************* // Guild Eventlog part // ************************************************* diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index 4a9121dedff..e4d02f20758 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -250,6 +250,7 @@ typedef std::vector<GuildItemPosCount> GuildItemPosCountVec; struct MemberSlot { uint64 LogoutTime; + uint32 accountId; std::string Name; std::string Pnote; std::string OFFnote; @@ -322,6 +323,7 @@ class Guild void SetEmblem(uint32 emblemStyle, uint32 emblemColor, uint32 borderStyle, uint32 borderColor, uint32 backgroundColor); uint32 GetMemberSize() const { return members.size(); } + uint32 GetAccountsNumber() const { return m_accountsNumber; } bool LoadGuildFromDB(QueryResult_AutoPtr guildDataResult); bool CheckGuildStructure(); @@ -441,6 +443,7 @@ class Guild uint32 m_BorderStyle; uint32 m_BorderColor; uint32 m_BackgroundColor; + uint32 m_accountsNumber; RankList m_Ranks; @@ -464,6 +467,7 @@ class Guild uint8 m_PurchasedTabs; private: + void UpdateAccountsNumber(); // used only from high level Swap/Move functions Item* GetItem(uint8 TabId, uint8 SlotId); uint8 CanStoreItem(uint8 tab, uint8 slot, GuildItemPosCountVec& dest, uint32 count, Item *pItem, bool swap = false) const; diff --git a/src/server/game/Server/Protocol/Handlers/GuildHandler.cpp b/src/server/game/Server/Protocol/Handlers/GuildHandler.cpp index 4db1961e7af..b2325212b6c 100644 --- a/src/server/game/Server/Protocol/Handlers/GuildHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/GuildHandler.cpp @@ -234,8 +234,8 @@ void WorldSession::HandleGuildInfoOpcode(WorldPacket& /*recvPacket*/) WorldPacket data(SMSG_GUILD_INFO, (guild->GetName().size() + 4 + 4 + 4)); data << guild->GetName(); data << secsToTimeBitFields(guild->GetCreatedDate()); // 3.x (prev. year + month + day) - data << guild->GetMemberSize(); // char amount - data << guild->GetMemberSize(); // acc amount + data << guild->GetMemberSize(); // char amount + data << guild->GetAccountsNumber(); // amount of accounts SendPacket(&data); } |