mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-14 09:39:11 +00:00
Fix corrupt item cache crashes, bot whispers, trade crashes
This commit is contained in:
@@ -830,7 +830,7 @@ bool Guild::BankMoveItemData::HasStoreRights(MoveItemData* pOther) const
|
||||
// Do not check rights if item is being swapped within the same bank tab
|
||||
if (pOther->IsBank() && pOther->GetContainer() == m_container)
|
||||
return true;
|
||||
return m_pGuild->_MemberHasTabRights(m_pPlayer->GetGUID(), m_container, GUILD_BANK_RIGHT_DEPOSIT_ITEM);
|
||||
return m_pGuild->MemberHasTabRights(m_pPlayer->GetGUID(), m_container, GUILD_BANK_RIGHT_DEPOSIT_ITEM);
|
||||
}
|
||||
|
||||
bool Guild::BankMoveItemData::HasWithdrawRights(MoveItemData* pOther) const
|
||||
@@ -1214,7 +1214,7 @@ void Guild::HandleRoster(WorldSession* session)
|
||||
}
|
||||
}
|
||||
|
||||
bool sendOfficerNote = _HasRankRight(session->GetPlayer(), GR_RIGHT_VIEWOFFNOTE);
|
||||
bool sendOfficerNote = HasRankRight(session->GetPlayer(), GR_RIGHT_VIEWOFFNOTE);
|
||||
for (auto const& [guid, member] : m_members)
|
||||
{
|
||||
WorldPackets::Guild::GuildRosterMemberData& memberData = roster.MemberData.emplace_back();
|
||||
@@ -1270,7 +1270,7 @@ void Guild::HandleSetMOTD(WorldSession* session, std::string_view motd)
|
||||
return;
|
||||
|
||||
// Player must have rights to set MOTD
|
||||
if (!_HasRankRight(session->GetPlayer(), GR_RIGHT_SETMOTD))
|
||||
if (!HasRankRight(session->GetPlayer(), GR_RIGHT_SETMOTD))
|
||||
SendCommandResult(session, GUILD_COMMAND_EDIT_MOTD, ERR_GUILD_PERMISSIONS);
|
||||
else
|
||||
{
|
||||
@@ -1293,7 +1293,7 @@ void Guild::HandleSetInfo(WorldSession* session, std::string_view info)
|
||||
return;
|
||||
|
||||
// Player must have rights to set guild's info
|
||||
if (_HasRankRight(session->GetPlayer(), GR_RIGHT_MODIFY_GUILD_INFO))
|
||||
if (HasRankRight(session->GetPlayer(), GR_RIGHT_MODIFY_GUILD_INFO))
|
||||
{
|
||||
m_info = info;
|
||||
|
||||
@@ -1326,6 +1326,12 @@ void Guild::HandleSetEmblem(WorldSession* session, const EmblemInfo& emblemInfo)
|
||||
}
|
||||
}
|
||||
|
||||
void Guild::HandleSetEmblem(EmblemInfo const& emblemInfo)
|
||||
{
|
||||
m_emblemInfo = emblemInfo;
|
||||
m_emblemInfo.SaveToDB(m_id);
|
||||
}
|
||||
|
||||
void Guild::HandleSetLeader(WorldSession* session, std::string_view name)
|
||||
{
|
||||
Player* player = session->GetPlayer();
|
||||
@@ -1362,7 +1368,7 @@ void Guild::HandleSetBankTabInfo(WorldSession* session, uint8 tabId, std::string
|
||||
void Guild::HandleSetMemberNote(WorldSession* session, std::string_view name, std::string_view note, bool isPublic)
|
||||
{
|
||||
// Player must have rights to set public/officer note
|
||||
if (!_HasRankRight(session->GetPlayer(), isPublic ? GR_RIGHT_EPNOTE : GR_RIGHT_EOFFNOTE))
|
||||
if (!HasRankRight(session->GetPlayer(), isPublic ? GR_RIGHT_EPNOTE : GR_RIGHT_EOFFNOTE))
|
||||
SendCommandResult(session, GUILD_COMMAND_PUBLIC_NOTE, ERR_GUILD_PERMISSIONS);
|
||||
else if (Member* member = GetMember(name))
|
||||
{
|
||||
@@ -1395,6 +1401,29 @@ void Guild::HandleSetRankInfo(WorldSession* session, uint8 rankId, std::string_v
|
||||
}
|
||||
}
|
||||
|
||||
void Guild::HandleSetRankInfo(uint8 rankId, uint32 rights, std::string_view name, uint32 moneyPerDay)
|
||||
{
|
||||
if (RankInfo* rankInfo = GetRankInfo(rankId))
|
||||
{
|
||||
if (!name.empty())
|
||||
{
|
||||
rankInfo->SetName(name);
|
||||
}
|
||||
|
||||
if (rights > 0)
|
||||
{
|
||||
rankInfo->SetRights(rights);
|
||||
}
|
||||
|
||||
if (moneyPerDay > 0)
|
||||
{
|
||||
_SetRankBankMoneyPerDay(rankId, moneyPerDay);
|
||||
}
|
||||
|
||||
_BroadcastEvent(GE_RANK_UPDATED, ObjectGuid::Empty, std::to_string(rankId), rankInfo->GetName(), std::to_string(m_ranks.size()));
|
||||
}
|
||||
}
|
||||
|
||||
void Guild::HandleBuyBankTab(WorldSession* session, uint8 tabId)
|
||||
{
|
||||
Player* player = session->GetPlayer();
|
||||
@@ -1457,7 +1486,7 @@ void Guild::HandleInviteMember(WorldSession* session, std::string const& name)
|
||||
return;
|
||||
}
|
||||
// Inviting player must have rights to invite
|
||||
if (!_HasRankRight(player, GR_RIGHT_INVITE))
|
||||
if (!HasRankRight(player, GR_RIGHT_INVITE))
|
||||
{
|
||||
SendCommandResult(session, GUILD_COMMAND_INVITE, ERR_GUILD_PERMISSIONS);
|
||||
return;
|
||||
@@ -1528,7 +1557,7 @@ void Guild::HandleRemoveMember(WorldSession* session, std::string_view name)
|
||||
{
|
||||
Player* player = session->GetPlayer();
|
||||
// Player must have rights to remove members
|
||||
if (!_HasRankRight(player, GR_RIGHT_REMOVE))
|
||||
if (!HasRankRight(player, GR_RIGHT_REMOVE))
|
||||
SendCommandResult(session, GUILD_COMMAND_REMOVE, ERR_GUILD_PERMISSIONS);
|
||||
else if (Member* member = GetMember(name))
|
||||
{
|
||||
@@ -1558,7 +1587,7 @@ void Guild::HandleUpdateMemberRank(WorldSession* session, std::string_view name,
|
||||
Player* player = session->GetPlayer();
|
||||
GuildCommandType type = demote ? GUILD_COMMAND_DEMOTE : GUILD_COMMAND_PROMOTE;
|
||||
// Player must have rights to promote
|
||||
if (!_HasRankRight(player, demote ? GR_RIGHT_DEMOTE : GR_RIGHT_PROMOTE))
|
||||
if (!HasRankRight(player, demote ? GR_RIGHT_DEMOTE : GR_RIGHT_PROMOTE))
|
||||
SendCommandResult(session, type, ERR_GUILD_PERMISSIONS);
|
||||
// Promoted player must be a member of guild
|
||||
else if (Member* member = GetMember(name))
|
||||
@@ -1820,7 +1849,7 @@ void Guild::SendPermissions(WorldSession* session) const
|
||||
WorldPackets::Guild::GuildPermissionsQueryResults queryResult;
|
||||
queryResult.RankID = rankId;
|
||||
queryResult.WithdrawGoldLimit = _GetRankBankMoneyPerDay(rankId);
|
||||
queryResult.Flags = _GetRankRights(rankId);
|
||||
queryResult.Flags = GetRankRights(rankId);
|
||||
queryResult.NumTabs = _GetPurchasedTabsSize();
|
||||
|
||||
for (uint8 tabId = 0; tabId < GUILD_BANK_MAX_TABS; ++tabId)
|
||||
@@ -2088,13 +2117,13 @@ bool Guild::Validate()
|
||||
// Broadcasts
|
||||
void Guild::BroadcastToGuild(WorldSession* session, bool officerOnly, std::string_view msg, uint32 language) const
|
||||
{
|
||||
if (session && session->GetPlayer() && _HasRankRight(session->GetPlayer(), officerOnly ? GR_RIGHT_OFFCHATSPEAK : GR_RIGHT_GCHATSPEAK))
|
||||
if (session && session->GetPlayer() && HasRankRight(session->GetPlayer(), officerOnly ? GR_RIGHT_OFFCHATSPEAK : GR_RIGHT_GCHATSPEAK))
|
||||
{
|
||||
WorldPacket data;
|
||||
ChatHandler::BuildChatPacket(data, officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, Language(language), session->GetPlayer(), nullptr, msg);
|
||||
for (auto const& [guid, member] : m_members)
|
||||
if (Player* player = member.FindPlayer())
|
||||
if (_HasRankRight(player, officerOnly ? GR_RIGHT_OFFCHATLISTEN : GR_RIGHT_GCHATLISTEN) && !player->GetSocial()->HasIgnore(session->GetPlayer()->GetGUID()))
|
||||
if (HasRankRight(player, officerOnly ? GR_RIGHT_OFFCHATLISTEN : GR_RIGHT_GCHATLISTEN) && !player->GetSocial()->HasIgnore(session->GetPlayer()->GetGUID()))
|
||||
player->GetSession()->SendPacket(&data);
|
||||
}
|
||||
}
|
||||
@@ -2497,7 +2526,7 @@ inline std::string Guild::_GetRankName(uint8 rankId) const
|
||||
return "<unknown>";
|
||||
}
|
||||
|
||||
inline uint32 Guild::_GetRankRights(uint8 rankId) const
|
||||
uint32 Guild::GetRankRights(uint8 rankId) const
|
||||
{
|
||||
if (const RankInfo* rankInfo = GetRankInfo(rankId))
|
||||
return rankInfo->GetRights();
|
||||
@@ -2546,7 +2575,7 @@ inline int32 Guild::_GetMemberRemainingMoney(Member const& member) const
|
||||
if (rankId == GR_GUILDMASTER)
|
||||
return static_cast<int32>(GUILD_WITHDRAW_MONEY_UNLIMITED);
|
||||
|
||||
if ((_GetRankRights(rankId) & (GR_RIGHT_WITHDRAW_REPAIR | GR_RIGHT_WITHDRAW_GOLD)) != 0)
|
||||
if ((GetRankRights(rankId) & (GR_RIGHT_WITHDRAW_REPAIR | GR_RIGHT_WITHDRAW_GOLD)) != 0)
|
||||
{
|
||||
int32 remaining = _GetRankBankMoneyPerDay(rankId) - member.GetBankWithdrawValue(GUILD_BANK_MAX_TABS);
|
||||
if (remaining > 0)
|
||||
@@ -2566,7 +2595,7 @@ inline void Guild::_UpdateMemberWithdrawSlots(CharacterDatabaseTransaction trans
|
||||
}
|
||||
}
|
||||
|
||||
inline bool Guild::_MemberHasTabRights(ObjectGuid guid, uint8 tabId, uint32 rights) const
|
||||
bool Guild::MemberHasTabRights(ObjectGuid guid, uint8 tabId, uint32 rights) const
|
||||
{
|
||||
if (const Member* member = GetMember(guid))
|
||||
{
|
||||
@@ -2578,6 +2607,19 @@ inline bool Guild::_MemberHasTabRights(ObjectGuid guid, uint8 tabId, uint32 righ
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Guild::HasRankRight(Player* player, uint32 right) const
|
||||
{
|
||||
if (player)
|
||||
{
|
||||
if (Member const* member = GetMember(player->GetGUID()))
|
||||
{
|
||||
return (GetRankRights(member->GetRankId()) & right) != GR_RIGHT_EMPTY;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Add new event log record
|
||||
inline void Guild::_LogEvent(GuildEventLogTypes eventType, ObjectGuid playerGuid1, ObjectGuid playerGuid2, uint8 newRank)
|
||||
{
|
||||
@@ -2723,7 +2765,7 @@ bool Guild::_DoItemsMove(MoveItemData* pSrc, MoveItemData* pDest, bool sendError
|
||||
void Guild::_SendBankContent(WorldSession* session, uint8 tabId, bool sendAllSlots) const
|
||||
{
|
||||
ObjectGuid guid = session->GetPlayer()->GetGUID();
|
||||
if (!_MemberHasTabRights(guid, tabId, GUILD_BANK_RIGHT_VIEW_TAB))
|
||||
if (!MemberHasTabRights(guid, tabId, GUILD_BANK_RIGHT_VIEW_TAB))
|
||||
return;
|
||||
|
||||
_SendBankList(session, tabId, sendAllSlots);
|
||||
@@ -2883,7 +2925,7 @@ void Guild::_SendBankList(WorldSession* session /* = nullptr*/, uint8 tabId /*=
|
||||
packet.Write();
|
||||
for (auto const& [guid, member] : m_members)
|
||||
{
|
||||
if (!_MemberHasTabRights(member.GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB))
|
||||
if (!MemberHasTabRights(member.GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB))
|
||||
continue;
|
||||
Player* player = member.FindPlayer();
|
||||
if (!player)
|
||||
|
||||
Reference in New Issue
Block a user