mirror of
https://github.com/mangosfour/server.git
synced 2025-12-15 10:37:02 +00:00
[10378] Avoid double lookup member slot in guild operations.
Also more wide use ObjectGuid in guild code and fixed some uint32->uint64 guid assigns.
This commit is contained in:
parent
f2406c1962
commit
9b3d37f0cf
9 changed files with 189 additions and 190 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -252,6 +252,13 @@ typedef std::vector<GuildItemPosCount> 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<uint32, MemberSlot> MemberList;
|
||||
typedef UNORDERED_MAP<uint32, MemberSlot> MemberList;
|
||||
typedef std::vector<RankInfo> 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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef __REVISION_NR_H__
|
||||
#define __REVISION_NR_H__
|
||||
#define REVISION_NR "10377"
|
||||
#define REVISION_NR "10378"
|
||||
#endif // __REVISION_NR_H__
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue