mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-20 09:17:36 +01:00
* Send the proper number of accounts in a guild in the SMSG_GUILD_INFO packet
* Patch by Toinan67 --HG-- branch : trunk
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
// *************************************************
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user