From 9b3d37f0cf7a55c728d189bd341976ef6c12f910 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Thu, 19 Aug 2010 07:35:43 +0400 Subject: [PATCH] [10378] Avoid double lookup member slot in guild operations. Also more wide use ObjectGuid in guild code and fixed some uint32->uint64 guid assigns. --- src/game/Guild.cpp | 193 +++++++++++++++------------------- src/game/Guild.h | 50 +++++---- src/game/GuildHandler.cpp | 105 +++++++++--------- src/game/Level3.cpp | 8 +- src/game/ObjectMgr.cpp | 2 +- src/game/PetitionsHandler.cpp | 7 +- src/game/Player.cpp | 2 +- src/game/WorldSession.cpp | 10 +- src/shared/revision_nr.h | 2 +- 9 files changed, 189 insertions(+), 190 deletions(-) diff --git a/src/game/Guild.cpp b/src/game/Guild.cpp index 580f22f5a..764725d28 100644 --- a/src/game/Guild.cpp +++ b/src/game/Guild.cpp @@ -29,11 +29,56 @@ #include "Language.h" #include "World.h" +//// MemberSlot //////////////////////////////////////////// +void MemberSlot::SetMemberStats(Player* player) +{ + Name = player->GetName(); + Level = player->getLevel(); + Class = player->getClass(); + ZoneId = player->GetZoneId(); +} + +void MemberSlot::UpdateLogoutTime() +{ + LogoutTime = time(NULL); +} + +void MemberSlot::SetPNOTE(std::string pnote) +{ + Pnote = pnote; + + // pnote now can be used for encoding to DB + CharacterDatabase.escape_string(pnote); + CharacterDatabase.PExecute("UPDATE guild_member SET pnote = '%s' WHERE guid = '%u'", pnote.c_str(), guid.GetCounter()); +} + +void MemberSlot::SetOFFNOTE(std::string offnote) +{ + OFFnote = offnote; + + // offnote now can be used for encoding to DB + CharacterDatabase.escape_string(offnote); + CharacterDatabase.PExecute("UPDATE guild_member SET offnote = '%s' WHERE guid = '%u'", offnote.c_str(), guid.GetCounter()); +} + +void MemberSlot::ChangeRank(uint32 newRank) +{ + RankId = newRank; + + Player *player = sObjectMgr.GetPlayer(guid); + // If player not online data in data field will be loaded from guild tabs no need to update it !! + if (player) + player->SetRank(newRank); + + CharacterDatabase.PExecute("UPDATE guild_member SET rank='%u' WHERE guid='%u'", newRank, guid.GetCounter()); +} + +//// Guild ///////////////////////////////////////////////// + Guild::Guild() { m_Id = 0; m_Name = ""; - m_LeaderGuid = 0; GINFO = MOTD = ""; m_EmblemStyle = 0; m_EmblemColor = 0; @@ -66,7 +111,7 @@ bool Guild::Create(Player* leader, std::string gname) if (!lSession) return false; - m_LeaderGuid = leader->GetGUID(); + m_LeaderGuid = leader->GetObjectGuid(); m_Name = gname; GINFO = ""; MOTD = "No message set."; @@ -74,7 +119,7 @@ bool Guild::Create(Player* leader, std::string gname) m_Id = sObjectMgr.GenerateGuildId(); m_CreatedDate = time(0); - DEBUG_LOG("GUILD: creating guild %s to leader: %u", gname.c_str(), GUID_LOPART(m_LeaderGuid)); + DEBUG_LOG("GUILD: creating guild %s to leader: %s", gname.c_str(), m_LeaderGuid.GetString().c_str()); // gname already assigned to Guild::name, use it to encode string for DB CharacterDatabase.escape_string(gname); @@ -89,7 +134,7 @@ bool Guild::Create(Player* leader, std::string gname) CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guildid='%u'", m_Id); CharacterDatabase.PExecute("INSERT INTO guild (guildid,name,leaderguid,info,motd,createdate,EmblemStyle,EmblemColor,BorderStyle,BorderColor,BackgroundColor,BankMoney) " "VALUES('%u','%s','%u', '%s', '%s','" UI64FMTD "','%u','%u','%u','%u','%u','" UI64FMTD "')", - m_Id, gname.c_str(), GUID_LOPART(m_LeaderGuid), dbGINFO.c_str(), dbMOTD.c_str(), uint64(m_CreatedDate), m_EmblemStyle, m_EmblemColor, m_BorderStyle, m_BorderColor, m_BackgroundColor, m_GuildBankMoney); + m_Id, gname.c_str(), m_LeaderGuid.GetCounter(), dbGINFO.c_str(), dbMOTD.c_str(), uint64(m_CreatedDate), m_EmblemStyle, m_EmblemColor, m_BorderStyle, m_BorderColor, m_BackgroundColor, m_GuildBankMoney); CharacterDatabase.CommitTransaction(); CreateDefaultGuildRanks(lSession->GetSessionDbLocaleIndex()); @@ -111,7 +156,7 @@ void Guild::CreateDefaultGuildRanks(int locale_idx) SetBankMoneyPerDay((uint32)GR_GUILDMASTER, WITHDRAW_MONEY_UNLIMITED); } -bool Guild::AddMember(uint64 plGuid, uint32 plRank) +bool Guild::AddMember(ObjectGuid plGuid, uint32 plRank) { Player* pl = sObjectMgr.GetPlayer(plGuid); if (pl) @@ -129,9 +174,13 @@ bool Guild::AddMember(uint64 plGuid, uint32 plRank) // this will be prevent attempt joining player to many guilds and corrupt guild data integrity Player::RemovePetitionsAndSigns(plGuid, 9); + uint32 lowguid = plGuid.GetCounter(); + // fill player data MemberSlot newmember; + newmember.guid = plGuid; + if (pl) { newmember.accountId = pl->GetSession()->GetAccountId(); @@ -143,7 +192,7 @@ bool Guild::AddMember(uint64 plGuid, uint32 plRank) else { // 0 1 2 3 4 - QueryResult *result = CharacterDatabase.PQuery("SELECT name,level,class,zone,account FROM characters WHERE guid = '%u'", GUID_LOPART(plGuid)); + QueryResult *result = CharacterDatabase.PQuery("SELECT name,level,class,zone,account FROM characters WHERE guid = '%u'", lowguid); if (!result) return false; // player doesn't exist @@ -157,7 +206,7 @@ bool Guild::AddMember(uint64 plGuid, uint32 plRank) if (newmember.Level < 1 || newmember.Level > STRONG_MAX_LEVEL || newmember.Class < CLASS_WARRIOR || newmember.Class >= MAX_CLASSES) { - sLog.outError("Player (GUID: %u) has a broken data in field `characters` table, cannot add him to guild.",GUID_LOPART(plGuid)); + sLog.outError("%s has a broken data in field `characters` table, cannot add him to guild.", plGuid.GetString().c_str()); return false; } } @@ -169,7 +218,7 @@ bool Guild::AddMember(uint64 plGuid, uint32 plRank) newmember.BankResetTimeMoney = 0; // this will force update at first query for (int i = 0; i < GUILD_BANK_MAX_TABS; ++i) newmember.BankResetTimeTab[i] = 0; - members[GUID_LOPART(plGuid)] = newmember; + members[lowguid] = newmember; std::string dbPnote = newmember.Pnote; std::string dbOFFnote = newmember.OFFnote; @@ -177,7 +226,7 @@ bool Guild::AddMember(uint64 plGuid, uint32 plRank) CharacterDatabase.escape_string(dbOFFnote); CharacterDatabase.PExecute("INSERT INTO guild_member (guildid,guid,rank,pnote,offnote) VALUES ('%u', '%u', '%u','%s','%s')", - m_Id, GUID_LOPART(plGuid), newmember.RankId, dbPnote.c_str(), dbOFFnote.c_str()); + m_Id, lowguid, newmember.RankId, dbPnote.c_str(), dbOFFnote.c_str()); // If player not in game data in data field will be loaded from guild tables, no need to update it!! if (pl) @@ -219,7 +268,7 @@ bool Guild::LoadGuildFromDB(QueryResult *guildDataResult) m_Id = fields[0].GetUInt32(); m_Name = fields[1].GetCppString(); - m_LeaderGuid = MAKE_NEW_GUID(fields[2].GetUInt32(), 0, HIGHGUID_PLAYER); + m_LeaderGuid = ObjectGuid(HIGHGUID_PLAYER, fields[2].GetUInt32()); m_EmblemStyle = fields[3].GetUInt32(); m_EmblemColor = fields[4].GetUInt32(); m_BorderStyle = fields[5].GetUInt32(); @@ -248,7 +297,7 @@ bool Guild::CheckGuildStructure() // Repair the structure of guild // If the guildmaster doesn't exist or isn't the member of guild // attempt to promote another member - int32 GM_rights = GetRank(GUID_LOPART(m_LeaderGuid)); + int32 GM_rights = GetRank(m_LeaderGuid); if (GM_rights == -1) { DelMember(m_LeaderGuid); @@ -259,13 +308,10 @@ bool Guild::CheckGuildStructure() else if (GM_rights != GR_GUILDMASTER) SetLeader(m_LeaderGuid); - // Allow only 1 guildmaster - for (MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr) - { - if (itr->second.RankId == GR_GUILDMASTER && GUID_LOPART(m_LeaderGuid) != itr->first) - //set right of member to officer - ChangeRank(itr->first, GR_OFFICER); - } + // Allow only 1 guildmaster, set other to officer + for (MemberList::iterator itr = members.begin(); itr != members.end(); ++itr) + if (itr->second.RankId == GR_GUILDMASTER && m_LeaderGuid != itr->second.guid) + itr->second.ChangeRank(GR_OFFICER); return true; } @@ -373,7 +419,7 @@ bool Guild::LoadMembersFromDB(QueryResult *guildMembersResult) MemberSlot newmember; uint32 lowguid = fields[1].GetUInt32(); - ObjectGuid guid = ObjectGuid(HIGHGUID_PLAYER, lowguid); + newmember.guid = ObjectGuid(HIGHGUID_PLAYER, lowguid); newmember.RankId = fields[2].GetUInt32(); // don't allow member to have not existing rank! if (newmember.RankId >= m_Ranks.size()) @@ -399,20 +445,20 @@ bool Guild::LoadMembersFromDB(QueryResult *guildMembersResult) // this code will remove not existing character guids from guild if (newmember.Level < 1 || newmember.Level > STRONG_MAX_LEVEL) // can be at broken `data` field { - sLog.outError("%s has a broken data in field `characters`.`data`, deleting him from guild!", guid.GetString().c_str()); + sLog.outError("%s has a broken data in field `characters`.`data`, deleting him from guild!", newmember.guid.GetString().c_str()); CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guid = '%u'", lowguid); continue; } if (!newmember.ZoneId) { - sLog.outError("%s has broken zone-data", guid.GetString().c_str()); + sLog.outError("%s has broken zone-data", newmember.guid.GetString().c_str()); // here it will also try the same, to get the zone from characters-table, but additional it tries to find // the zone through xy coords .. this is a bit redundant, but shouldn't be called often - newmember.ZoneId = Player::GetZoneIdFromDB(guid); + newmember.ZoneId = Player::GetZoneIdFromDB(newmember.guid); } if (newmember.Class < CLASS_WARRIOR || newmember.Class >= MAX_CLASSES) // can be at broken `class` field { - sLog.outError("%s has a broken data in field `characters`.`class`, deleting him from guild!", guid.GetString().c_str()); + sLog.outError("%s has a broken data in field `characters`.`class`, deleting him from guild!", newmember.guid.GetString().c_str()); CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guid = '%u'", lowguid); continue; } @@ -429,41 +475,32 @@ bool Guild::LoadMembersFromDB(QueryResult *guildMembersResult) return true; } -void Guild::SetMemberStats(uint64 guid) +void Guild::SetLeader(ObjectGuid guid) { - MemberList::iterator itr = members.find(GUID_LOPART(guid)); - if (itr == members.end() ) + MemberSlot* slot = GetMemberSlot(guid); + if (!slot) return; - Player *pl = ObjectAccessor::FindPlayer(guid); - if (!pl) - return; - itr->second.Name = pl->GetName(); - itr->second.Level = pl->getLevel(); - itr->second.Class = pl->getClass(); - itr->second.ZoneId = pl->GetZoneId(); -} - -void Guild::SetLeader(uint64 guid) -{ m_LeaderGuid = guid; - ChangeRank(guid, GR_GUILDMASTER); + slot->ChangeRank(GR_GUILDMASTER); - CharacterDatabase.PExecute("UPDATE guild SET leaderguid='%u' WHERE guildid='%u'", GUID_LOPART(guid), m_Id); + CharacterDatabase.PExecute("UPDATE guild SET leaderguid='%u' WHERE guildid='%u'", guid.GetCounter(), m_Id); } -void Guild::DelMember(uint64 guid, bool isDisbanding) +void Guild::DelMember(ObjectGuid guid, bool isDisbanding) { + uint32 lowguid = guid.GetCounter(); + // guild master can be deleted when loading guild and guid doesn't exist in characters table // or when he is removed from guild by gm command if (m_LeaderGuid == guid && !isDisbanding) { MemberSlot* oldLeader = NULL; MemberSlot* best = NULL; - uint64 newLeaderGUID = 0; + ObjectGuid newLeaderGUID; for (Guild::MemberList::iterator i = members.begin(); i != members.end(); ++i) { - if (i->first == GUID_LOPART(guid)) + if (i->first == lowguid) { oldLeader = &(i->second); continue; @@ -472,7 +509,7 @@ void Guild::DelMember(uint64 guid, bool isDisbanding) if (!best || best->RankId > i->second.RankId) { best = &(i->second); - newLeaderGUID = i->first; + newLeaderGUID = ObjectGuid(HIGHGUID_PLAYER, i->first); } } if (!best) @@ -495,7 +532,7 @@ void Guild::DelMember(uint64 guid, bool isDisbanding) } } - members.erase(GUID_LOPART(guid)); + members.erase(lowguid); Player *player = sObjectMgr.GetPlayer(guid); // If player not online data in data field will be loaded from guild tabs no need to update it !! @@ -505,50 +542,12 @@ void Guild::DelMember(uint64 guid, bool isDisbanding) player->SetRank(0); } - CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guid = '%u'", GUID_LOPART(guid)); + CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guid = '%u'", lowguid); if (!isDisbanding) UpdateAccountsNumber(); } -void Guild::ChangeRank(uint64 guid, uint32 newRank) -{ - MemberList::iterator itr = members.find(GUID_LOPART(guid)); - if (itr != members.end()) - itr->second.RankId = newRank; - - Player *player = sObjectMgr.GetPlayer(guid); - // If player not online data in data field will be loaded from guild tabs no need to update it !! - if (player) - player->SetRank(newRank); - - CharacterDatabase.PExecute( "UPDATE guild_member SET rank='%u' WHERE guid='%u'", newRank, GUID_LOPART(guid) ); -} - -void Guild::SetPNOTE(uint64 guid,std::string pnote) -{ - MemberList::iterator itr = members.find(GUID_LOPART(guid)); - if (itr == members.end()) - return; - - itr->second.Pnote = pnote; - - // pnote now can be used for encoding to DB - CharacterDatabase.escape_string(pnote); - CharacterDatabase.PExecute("UPDATE guild_member SET pnote = '%s' WHERE guid = '%u'", pnote.c_str(), itr->first); -} - -void Guild::SetOFFNOTE(uint64 guid,std::string offnote) -{ - MemberList::iterator itr = members.find(GUID_LOPART(guid)); - if (itr == members.end()) - return; - itr->second.OFFnote = offnote; - // offnote now can be used for encoding to DB - CharacterDatabase.escape_string(offnote); - CharacterDatabase.PExecute("UPDATE guild_member SET offnote = '%s' WHERE guid = '%u'", offnote.c_str(), itr->first); -} - void Guild::BroadcastToGuild(WorldSession *session, const std::string& msg, uint32 language) { if (session && session->GetPlayer() && HasRankRight(session->GetPlayer()->GetRank(),GR_RIGHT_GCHATSPEAK)) @@ -685,15 +684,6 @@ void Guild::SetRankRights(uint32 rankId, uint32 rights) CharacterDatabase.PExecute("UPDATE guild_rank SET rights='%u' WHERE rid='%u' AND guildid='%u'", rights, rankId, m_Id); } -int32 Guild::GetRank(uint32 LowGuid) -{ - MemberList::const_iterator itr = members.find(LowGuid); - if (itr == members.end()) - return -1; - - return itr->second.RankId; -} - void Guild::Disband() { BroadcastEvent(GE_DISBANDED); @@ -701,7 +691,7 @@ void Guild::Disband() while (!members.empty()) { MemberList::const_iterator itr = members.begin(); - DelMember(MAKE_NEW_GUID(itr->first, 0, HIGHGUID_PLAYER), true); + DelMember(ObjectGuid(HIGHGUID_PLAYER, itr->first), true); } CharacterDatabase.BeginTransaction(); @@ -813,15 +803,6 @@ void Guild::SetEmblem(uint32 emblemStyle, uint32 emblemColor, uint32 borderStyle CharacterDatabase.PExecute("UPDATE guild SET EmblemStyle=%u, EmblemColor=%u, BorderStyle=%u, BorderColor=%u, BackgroundColor=%u WHERE guildid = %u", m_EmblemStyle, m_EmblemColor, m_BorderStyle, m_BorderColor, m_BackgroundColor, m_Id); } -void Guild::UpdateLogoutTime(uint64 guid) -{ - MemberList::iterator itr = members.find(GUID_LOPART(guid)); - if (itr == members.end() ) - return; - - itr->second.LogoutTime = time(NULL); -} - /** * Return the number of accounts that are in the guild after possible update if required * A player may have many characters in the guild, but with the same account @@ -909,14 +890,14 @@ void Guild::LoadGuildEventLogFromDB() } // Add entry to guild eventlog -void Guild::LogGuildEvent(uint8 EventType, uint32 PlayerGuid1, uint32 PlayerGuid2, uint8 NewRank) +void Guild::LogGuildEvent(uint8 EventType, ObjectGuid playerGuid1, ObjectGuid playerGuid2, uint8 newRank) { GuildEventLogEntry NewEvent; // Create event NewEvent.EventType = EventType; - NewEvent.PlayerGuid1 = PlayerGuid1; - NewEvent.PlayerGuid2 = PlayerGuid2; - NewEvent.NewRank = NewRank; + NewEvent.PlayerGuid1 = playerGuid1.GetCounter(); + NewEvent.PlayerGuid2 = playerGuid2.GetCounter(); + NewEvent.NewRank = newRank; NewEvent.TimeStamp = uint32(time(NULL)); // Count new LogGuid m_GuildEventLogNextGuid = (m_GuildEventLogNextGuid + 1) % sWorld.getConfig(CONFIG_UINT32_GUILD_EVENT_LOG_COUNT); diff --git a/src/game/Guild.h b/src/game/Guild.h index cbc0cb003..beae14d39 100644 --- a/src/game/Guild.h +++ b/src/game/Guild.h @@ -252,6 +252,13 @@ typedef std::vector GuildItemPosCountVec; struct MemberSlot { + void SetMemberStats(Player* player); + void UpdateLogoutTime(); + void SetPNOTE(std::string pnote); + void SetOFFNOTE(std::string offnote); + void ChangeRank(uint32 newRank); + + ObjectGuid guid; uint32 accountId; std::string Name; uint32 RankId; @@ -296,11 +303,11 @@ class Guild void Disband(); void DeleteGuildBankItems(bool alsoInDB = false); - typedef std::map MemberList; + typedef UNORDERED_MAP MemberList; typedef std::vector RankList; uint32 GetId(){ return m_Id; } - const uint64& GetLeader(){ return m_LeaderGuid; } + ObjectGuid GetLeaderGuid() const { return m_LeaderGuid; } std::string const& GetName() const { return m_Name; } std::string const& GetMOTD() const { return MOTD; } std::string const& GetGINFO() const { return GINFO; } @@ -313,17 +320,14 @@ class Guild uint32 GetBorderColor() const { return m_BorderColor; } uint32 GetBackgroundColor() const { return m_BackgroundColor; } - void SetLeader(uint64 guid); - bool AddMember(uint64 plGuid, uint32 plRank); - void ChangeRank(uint64 guid, uint32 newRank); - void DelMember(uint64 guid, bool isDisbanding = false); + void SetLeader(ObjectGuid guid); + bool AddMember(ObjectGuid plGuid, uint32 plRank); + void DelMember(ObjectGuid guid, bool isDisbanding = false); //lowest rank is the count of ranks - 1 (the highest rank_id in table) uint32 GetLowestRank() const { return m_Ranks.size() - 1; } void SetMOTD(std::string motd); void SetGINFO(std::string ginfo); - void SetPNOTE(uint64 guid, std::string pnote); - void SetOFFNOTE(uint64 guid, std::string offnote); void SetEmblem(uint32 emblemStyle, uint32 emblemColor, uint32 borderStyle, uint32 borderColor, uint32 backgroundColor); uint32 GetMemberSize() const { return members.size(); } @@ -334,8 +338,6 @@ class Guild bool LoadRanksFromDB(QueryResult *guildRanksResult); bool LoadMembersFromDB(QueryResult *guildMembersResult); - void SetMemberStats(uint64 guid); - void BroadcastToGuild(WorldSession *session, const std::string& msg, uint32 language = LANG_UNIVERSAL); void BroadcastToOfficers(WorldSession *session, const std::string& msg, uint32 language = LANG_UNIVERSAL); void BroadcastPacketToRank(WorldPacket *packet, uint32 rankId); @@ -368,32 +370,35 @@ class Guild { return ((GetRankRights(rankId) & right) != GR_RIGHT_EMPTY) ? true : false; } - int32 GetRank(uint32 LowGuid); - bool IsMember(uint32 LowGuid) + + int32 GetRank(ObjectGuid guid) { - return (members.find(LowGuid) != members.end()); + MemberSlot* slot = GetMemberSlot(guid); + return slot ? slot->RankId : -1; } - MemberSlot* GetMemberSlot(const std::string& name, uint64& guid) + + MemberSlot* GetMemberSlot(ObjectGuid guid) + { + MemberList::iterator itr = members.find(guid.GetCounter()); + return itr != members.end() ? &itr->second : NULL; + } + + MemberSlot* GetMemberSlot(const std::string& name) { for(MemberList::iterator itr = members.begin(); itr != members.end(); ++itr) - { if(itr->second.Name == name) - { - guid = itr->first; return &itr->second; - } - } + return NULL; } void Roster(WorldSession *session = NULL); // NULL = broadcast void Query(WorldSession *session); - void UpdateLogoutTime(uint64 guid); // Guild EventLog void LoadGuildEventLogFromDB(); void DisplayGuildEventLog(WorldSession *session); - void LogGuildEvent(uint8 EventType, uint32 PlayerGuid1, uint32 PlayerGuid2, uint8 NewRank); + void LogGuildEvent(uint8 EventType, ObjectGuid playerGuid1, ObjectGuid playerGuid2 = ObjectGuid(), uint8 newRank = 0); // ** Guild bank ** // Content & item deposit/withdraw @@ -442,7 +447,7 @@ class Guild uint32 m_Id; std::string m_Name; - uint64 m_LeaderGuid; + ObjectGuid m_LeaderGuid; std::string MOTD; std::string GINFO; time_t m_CreatedDate; @@ -476,6 +481,7 @@ class Guild private: void UpdateAccountsNumber() { m_accountsNumber = 0;}// mark for lazy calculation at request in GetAccountsNumber + void _ChangeRank(ObjectGuid guid, MemberSlot* slot, uint32 newRank); // used only from high level Swap/Move functions Item* GetItem(uint8 TabId, uint8 SlotId); diff --git a/src/game/GuildHandler.cpp b/src/game/GuildHandler.cpp index 8b943c06d..a42a98ea1 100644 --- a/src/game/GuildHandler.cpp +++ b/src/game/GuildHandler.cpp @@ -123,7 +123,7 @@ void WorldSession::HandleGuildInviteOpcode(WorldPacket& recvPacket) player->SetGuildIdInvited(GetPlayer()->GetGuildId()); // Put record into guildlog - guild->LogGuildEvent(GUILD_EVENT_LOG_INVITE_PLAYER, GetPlayer()->GetGUIDLow(), player->GetGUIDLow(), 0); + guild->LogGuildEvent(GUILD_EVENT_LOG_INVITE_PLAYER, GetPlayer()->GetObjectGuid(), player->GetObjectGuid()); WorldPacket data(SMSG_GUILD_INVITE, (8+10)); // guess size data << GetPlayer()->GetName(); @@ -156,8 +156,7 @@ void WorldSession::HandleGuildRemoveOpcode(WorldPacket& recvPacket) return; } - uint64 plGuid; - MemberSlot* slot = guild->GetMemberSlot(plName, plGuid); + MemberSlot* slot = guild->GetMemberSlot(plName); if (!slot) { SendGuildCommandResult(GUILD_INVITE_S, plName, ERR_GUILD_PLAYER_NOT_IN_GUILD_S); @@ -177,9 +176,9 @@ void WorldSession::HandleGuildRemoveOpcode(WorldPacket& recvPacket) return; } - guild->DelMember(plGuid); + guild->DelMember(slot->guid); // Put record into guild log - guild->LogGuildEvent(GUILD_EVENT_LOG_UNINVITE_PLAYER, GetPlayer()->GetGUIDLow(), GUID_LOPART(plGuid), 0); + guild->LogGuildEvent(GUILD_EVENT_LOG_UNINVITE_PLAYER, GetPlayer()->GetObjectGuid(), slot->guid); guild->BroadcastEvent(GE_REMOVED, plName.c_str(), _player->GetName()); } @@ -192,17 +191,17 @@ void WorldSession::HandleGuildAcceptOpcode(WorldPacket& /*recvPacket*/) DEBUG_LOG("WORLD: Received CMSG_GUILD_ACCEPT"); guild = sObjectMgr.GetGuildById(player->GetGuildIdInvited()); - if(!guild || player->GetGuildId()) + if (!guild || player->GetGuildId()) return; // not let enemies sign guild charter - if (!sWorld.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_INTERACTION_GUILD) && player->GetTeam() != sObjectMgr.GetPlayerTeamByGUID(guild->GetLeader())) + if (!sWorld.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_INTERACTION_GUILD) && player->GetTeam() != sObjectMgr.GetPlayerTeamByGUID(guild->GetLeaderGuid())) return; - if(!guild->AddMember(GetPlayer()->GetGUID(),guild->GetLowestRank())) + if (!guild->AddMember(GetPlayer()->GetObjectGuid(),guild->GetLowestRank())) return; // Put record into guild log - guild->LogGuildEvent(GUILD_EVENT_LOG_JOIN_GUILD, GetPlayer()->GetGUIDLow(), 0, 0); + guild->LogGuildEvent(GUILD_EVENT_LOG_JOIN_GUILD, GetPlayer()->GetObjectGuid()); guild->BroadcastEvent(GE_JOINED, player->GetObjectGuid(), player->GetName()); } @@ -264,16 +263,14 @@ void WorldSession::HandleGuildPromoteOpcode(WorldPacket& recvPacket) return; } - uint64 plGuid; - MemberSlot* slot = guild->GetMemberSlot(plName, plGuid); - + MemberSlot* slot = guild->GetMemberSlot(plName); if (!slot) { SendGuildCommandResult(GUILD_INVITE_S, plName, ERR_GUILD_PLAYER_NOT_IN_GUILD_S); return; } - if (plGuid == GetPlayer()->GetGUID()) + if (slot->guid == GetPlayer()->GetObjectGuid()) { SendGuildCommandResult(GUILD_INVITE_S, "", ERR_GUILD_NAME_INVALID); return; @@ -282,7 +279,7 @@ void WorldSession::HandleGuildPromoteOpcode(WorldPacket& recvPacket) // allow to promote only to lower rank than member's rank // guildmaster's rank = 0 // GetPlayer()->GetRank() + 1 is highest rank that current player can promote to - if(GetPlayer()->GetRank() + 1 >= slot->RankId) + if (GetPlayer()->GetRank() + 1 >= slot->RankId) { SendGuildCommandResult(GUILD_INVITE_S, plName, ERR_GUILD_RANK_TOO_HIGH_S); return; @@ -290,9 +287,9 @@ void WorldSession::HandleGuildPromoteOpcode(WorldPacket& recvPacket) uint32 newRankId = slot->RankId - 1; //when promoting player, rank is decreased - guild->ChangeRank(plGuid, newRankId); + slot->ChangeRank(newRankId); // Put record into guild log - guild->LogGuildEvent(GUILD_EVENT_LOG_PROMOTE_PLAYER, GetPlayer()->GetGUIDLow(), GUID_LOPART(plGuid), newRankId); + guild->LogGuildEvent(GUILD_EVENT_LOG_PROMOTE_PLAYER, GetPlayer()->GetObjectGuid(), slot->guid, newRankId); guild->BroadcastEvent(GE_PROMOTION, _player->GetName(), plName.c_str(), guild->GetRankName(newRankId).c_str()); } @@ -321,8 +318,7 @@ void WorldSession::HandleGuildDemoteOpcode(WorldPacket& recvPacket) return; } - uint64 plGuid; - MemberSlot* slot = guild->GetMemberSlot(plName, plGuid); + MemberSlot* slot = guild->GetMemberSlot(plName); if (!slot) { @@ -330,7 +326,7 @@ void WorldSession::HandleGuildDemoteOpcode(WorldPacket& recvPacket) return; } - if (plGuid == GetPlayer()->GetGUID()) + if (slot->guid == GetPlayer()->GetObjectGuid()) { SendGuildCommandResult(GUILD_INVITE_S, "", ERR_GUILD_NAME_INVALID); return; @@ -352,9 +348,9 @@ void WorldSession::HandleGuildDemoteOpcode(WorldPacket& recvPacket) uint32 newRankId = slot->RankId + 1; //when demoting player, rank is increased - guild->ChangeRank(plGuid, newRankId); + slot->ChangeRank(newRankId); // Put record into guild log - guild->LogGuildEvent(GUILD_EVENT_LOG_DEMOTE_PLAYER, GetPlayer()->GetGUIDLow(), GUID_LOPART(plGuid), newRankId); + guild->LogGuildEvent(GUILD_EVENT_LOG_DEMOTE_PLAYER, GetPlayer()->GetObjectGuid(), slot->guid, newRankId); guild->BroadcastEvent(GE_DEMOTION, _player->GetName(), plName.c_str(), guild->GetRankName(slot->RankId).c_str()); } @@ -364,27 +360,27 @@ void WorldSession::HandleGuildLeaveOpcode(WorldPacket& /*recvPacket*/) DEBUG_LOG("WORLD: Received CMSG_GUILD_LEAVE"); Guild *guild = sObjectMgr.GetGuildById(_player->GetGuildId()); - if(!guild) + if (!guild) { SendGuildCommandResult(GUILD_CREATE_S, "", ERR_GUILD_PLAYER_NOT_IN_GUILD); return; } - if(_player->GetGUID() == guild->GetLeader() && guild->GetMemberSize() > 1) + if (_player->GetObjectGuid() == guild->GetLeaderGuid() && guild->GetMemberSize() > 1) { SendGuildCommandResult(GUILD_QUIT_S, "", ERR_GUILD_LEADER_LEAVE); return; } - if(_player->GetGUID() == guild->GetLeader()) + if (_player->GetObjectGuid() == guild->GetLeaderGuid()) { guild->Disband(); return; } - guild->DelMember(_player->GetGUID()); + guild->DelMember(_player->GetObjectGuid()); // Put record into guild log - guild->LogGuildEvent(GUILD_EVENT_LOG_LEAVE_GUILD, _player->GetGUIDLow(), 0, 0); + guild->LogGuildEvent(GUILD_EVENT_LOG_LEAVE_GUILD, _player->GetObjectGuid()); guild->BroadcastEvent(GE_LEFT, _player->GetGUID(), _player->GetName()); @@ -396,13 +392,13 @@ void WorldSession::HandleGuildDisbandOpcode(WorldPacket& /*recvPacket*/) DEBUG_LOG("WORLD: Received CMSG_GUILD_DISBAND"); Guild *guild = sObjectMgr.GetGuildById(GetPlayer()->GetGuildId()); - if(!guild) + if (!guild) { SendGuildCommandResult(GUILD_CREATE_S, "", ERR_GUILD_PLAYER_NOT_IN_GUILD); return; } - if(GetPlayer()->GetGUID() != guild->GetLeader()) + if (GetPlayer()->GetObjectGuid() != guild->GetLeaderGuid()) { SendGuildCommandResult(GUILD_INVITE_S, "", ERR_GUILD_PERMISSIONS); return; @@ -433,23 +429,28 @@ void WorldSession::HandleGuildLeaderOpcode(WorldPacket& recvPacket) return; } - if (oldLeader->GetGUID() != guild->GetLeader()) + if (oldLeader->GetObjectGuid() != guild->GetLeaderGuid()) { SendGuildCommandResult(GUILD_INVITE_S, "", ERR_GUILD_PERMISSIONS); return; } - uint64 newLeaderGUID; - MemberSlot* slot = guild->GetMemberSlot(name, newLeaderGUID); + MemberSlot* oldSlot = guild->GetMemberSlot(oldLeader->GetObjectGuid()); + if (!oldSlot) + { + SendGuildCommandResult(GUILD_INVITE_S, "", ERR_GUILD_PERMISSIONS); + return; + } + MemberSlot* slot = guild->GetMemberSlot(name); if (!slot) { SendGuildCommandResult(GUILD_INVITE_S, name, ERR_GUILD_PLAYER_NOT_IN_GUILD_S); return; } - guild->SetLeader(newLeaderGUID); - guild->ChangeRank(oldLeader->GetGUID(), GR_OFFICER); + guild->SetLeader(slot->guid); + oldSlot->ChangeRank(GR_OFFICER); guild->BroadcastEvent(GE_LEADER_CHANGED, oldLeader->GetName(), name.c_str()); } @@ -506,9 +507,7 @@ void WorldSession::HandleGuildSetPublicNoteOpcode(WorldPacket& recvPacket) return; } - uint64 plGuid; - MemberSlot* slot = guild->GetMemberSlot(name, plGuid); - + MemberSlot* slot = guild->GetMemberSlot(name); if (!slot) { SendGuildCommandResult(GUILD_INVITE_S, name, ERR_GUILD_PLAYER_NOT_IN_GUILD_S); @@ -516,7 +515,8 @@ void WorldSession::HandleGuildSetPublicNoteOpcode(WorldPacket& recvPacket) } recvPacket >> PNOTE; - guild->SetPNOTE(plGuid, PNOTE); + + slot->SetPNOTE(PNOTE); guild->Roster(this); } @@ -544,9 +544,7 @@ void WorldSession::HandleGuildSetOfficerNoteOpcode(WorldPacket& recvPacket) return; } - uint64 plGuid; - MemberSlot* slot = guild->GetMemberSlot(plName, plGuid); - + MemberSlot* slot = guild->GetMemberSlot(plName); if (!slot) { SendGuildCommandResult(GUILD_INVITE_S, plName, ERR_GUILD_PLAYER_NOT_IN_GUILD_S); @@ -554,7 +552,8 @@ void WorldSession::HandleGuildSetOfficerNoteOpcode(WorldPacket& recvPacket) } recvPacket >> OFFNOTE; - guild->SetOFFNOTE(plGuid, OFFNOTE); + + slot->SetOFFNOTE(OFFNOTE); guild->Roster(this); } @@ -568,13 +567,14 @@ void WorldSession::HandleGuildRankOpcode(WorldPacket& recvPacket) DEBUG_LOG("WORLD: Received CMSG_GUILD_RANK"); Guild *guild = sObjectMgr.GetGuildById(GetPlayer()->GetGuildId()); - if(!guild) + if (!guild) { recvPacket.rpos(recvPacket.wpos()); // set to end to avoid warnings spam SendGuildCommandResult(GUILD_CREATE_S, "", ERR_GUILD_PLAYER_NOT_IN_GUILD); return; } - else if(GetPlayer()->GetGUID() != guild->GetLeader()) + + if (GetPlayer()->GetObjectGuid() != guild->GetLeaderGuid()) { recvPacket.rpos(recvPacket.wpos()); // set to end to avoid warnings spam SendGuildCommandResult(GUILD_INVITE_S, "", ERR_GUILD_PERMISSIONS); @@ -618,19 +618,19 @@ void WorldSession::HandleGuildAddRankOpcode(WorldPacket& recvPacket) recvPacket >> rankname; Guild *guild = sObjectMgr.GetGuildById(GetPlayer()->GetGuildId()); - if(!guild) + if (!guild) { SendGuildCommandResult(GUILD_CREATE_S, "", ERR_GUILD_PLAYER_NOT_IN_GUILD); return; } - if(GetPlayer()->GetGUID() != guild->GetLeader()) + if (GetPlayer()->GetObjectGuid() != guild->GetLeaderGuid()) { SendGuildCommandResult(GUILD_INVITE_S, "", ERR_GUILD_PERMISSIONS); return; } - if(guild->GetRanksSize() >= GUILD_RANKS_MAX_COUNT) // client not let create more 10 than ranks + if (guild->GetRanksSize() >= GUILD_RANKS_MAX_COUNT) // client not let create more 10 than ranks return; guild->CreateRank(rankname, GR_RIGHT_GCHATLISTEN | GR_RIGHT_GCHATSPEAK); @@ -644,12 +644,13 @@ void WorldSession::HandleGuildDelRankOpcode(WorldPacket& /*recvPacket*/) DEBUG_LOG("WORLD: Received CMSG_GUILD_DEL_RANK"); Guild *guild = sObjectMgr.GetGuildById(GetPlayer()->GetGuildId()); - if(!guild) + if (!guild) { SendGuildCommandResult(GUILD_CREATE_S, "", ERR_GUILD_PLAYER_NOT_IN_GUILD); return; } - else if(GetPlayer()->GetGUID() != guild->GetLeader()) + + if (GetPlayer()->GetObjectGuid() != guild->GetLeaderGuid()) { SendGuildCommandResult(GUILD_INVITE_S, "", ERR_GUILD_PERMISSIONS); return; @@ -715,25 +716,25 @@ void WorldSession::HandleSaveGuildEmblemOpcode(WorldPacket& recvPacket) } // remove fake death - if(GetPlayer()->hasUnitState(UNIT_STAT_DIED)) + if (GetPlayer()->hasUnitState(UNIT_STAT_DIED)) GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); Guild *guild = sObjectMgr.GetGuildById(GetPlayer()->GetGuildId()); - if(!guild) + if (!guild) { //"You are not part of a guild!"; SendSaveGuildEmblem(ERR_GUILDEMBLEM_NOGUILD); return; } - if (guild->GetLeader() != GetPlayer()->GetGUID()) + if (guild->GetLeaderGuid() != GetPlayer()->GetObjectGuid()) { //"Only guild leaders can create emblems." SendSaveGuildEmblem(ERR_GUILDEMBLEM_NOTGUILDMASTER); return; } - if(GetPlayer()->GetMoney() < 10*GOLD) + if (GetPlayer()->GetMoney() < 10*GOLD) { //"You can't afford to do that." SendSaveGuildEmblem(ERR_GUILDEMBLEM_NOTENOUGHMONEY); diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index 4d1cc9e4c..b5701f1c2 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -3564,7 +3564,7 @@ bool ChatHandler::HandleGuildUninviteCommand(char *args) if (!targetGuild) return false; - targetGuild->DelMember (target_guid); + targetGuild->DelMember(target_guid); return true; } @@ -3593,7 +3593,11 @@ bool ChatHandler::HandleGuildRankCommand(char *args) if (newrank > targetGuild->GetLowestRank ()) return false; - targetGuild->ChangeRank (target_guid,newrank); + MemberSlot* slot = targetGuild->GetMemberSlot(target_guid); + if (!slot) + return false; + + slot->ChangeRank(newrank); return true; } diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index a90a1b1c1..aec3da22f 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -233,7 +233,7 @@ std::string ObjectMgr::GetGuildNameById(uint32 GuildId) const Guild* ObjectMgr::GetGuildByLeader(ObjectGuid guid) const { for(GuildMap::const_iterator itr = mGuildMap.begin(); itr != mGuildMap.end(); ++itr) - if (itr->second->GetLeader() == guid.GetRawValue()) + if (itr->second->GetLeaderGuid() == guid) return itr->second; return NULL; diff --git a/src/game/PetitionsHandler.cpp b/src/game/PetitionsHandler.cpp index 0907c3497..e7475a1b7 100644 --- a/src/game/PetitionsHandler.cpp +++ b/src/game/PetitionsHandler.cpp @@ -839,7 +839,12 @@ void WorldSession::HandleTurnInPetitionOpcode(WorldPacket & recv_data) for(uint8 i = 0; i < signs; ++i) { Field* fields = result->Fetch(); - guild->AddMember(fields[0].GetUInt64(), guild->GetLowestRank()); + + ObjectGuid signguid = ObjectGuid(HIGHGUID_PLAYER, fields[0].GetUInt32()); + if (signguid.IsEmpty()) + continue; + + guild->AddMember(signguid, guild->GetLowestRank()); result->NextRow(); } } diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 5f4a3e6aa..0163b0bb9 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -4172,7 +4172,7 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe // remove from guild if (uint32 guildId = GetGuildIdFromDB(playerguid)) if (Guild* guild = sObjectMgr.GetGuildById(guildId)) - guild->DelMember(playerguid.GetRawValue()); + guild->DelMember(playerguid); // remove from arena teams LeaveAllArenaTeams(playerguid); diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp index 282951557..775313730 100644 --- a/src/game/WorldSession.cpp +++ b/src/game/WorldSession.cpp @@ -379,11 +379,13 @@ void WorldSession::LogoutPlayer(bool Save) LoginDatabase.PExecute("UPDATE account SET active_realm_id = 0 WHERE id = '%u'", GetAccountId()); ///- If the player is in a guild, update the guild roster and broadcast a logout message to other guild members - Guild *guild = sObjectMgr.GetGuildById(_player->GetGuildId()); - if(guild) + if (Guild *guild = sObjectMgr.GetGuildById(_player->GetGuildId())) { - guild->SetMemberStats(_player->GetGUID()); - guild->UpdateLogoutTime(_player->GetGUID()); + if (MemberSlot* slot = guild->GetMemberSlot(_player->GetObjectGuid())) + { + slot->SetMemberStats(_player); + slot->UpdateLogoutTime(); + } guild->BroadcastEvent(GE_SIGNED_OFF, _player->GetGUID(), _player->GetName()); } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 9fdc7fde0..3a5ae0eda 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "10377" + #define REVISION_NR "10378" #endif // __REVISION_NR_H__