AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Guild Class Reference

#include "Guild.h"

Classes

class  BankEventLogEntry
 
class  BankMoveItemData
 
class  BankTab
 
class  EventLogEntry
 
class  LogEntry
 
class  LogHolder
 
class  Member
 
class  MoveItemData
 
class  PlayerMoveItemData
 
class  RankInfo
 

Public Member Functions

Member const * GetMember (ObjectGuid guid) const
 
Member * GetMember (ObjectGuid guid)
 
Member * GetMember (std::string_view name)
 
 Guild ()
 
 ~Guild ()
 
bool Create (Player *pLeader, std::string_view name)
 
void Disband ()
 
uint32 GetId () const
 
ObjectGuid GetLeaderGUID () const
 
std::string const & GetName () const
 
std::string const & GetMOTD () const
 
std::string const & GetInfo () const
 
bool SetName (std::string_view const &name)
 
void SetMOTD (std::string_view motd)
 
void SetInfo (std::string_view info)
 
void HandleRoster (WorldSession *session)
 
void HandleQuery (WorldSession *session)
 
void HandleSetMOTD (WorldSession *session, std::string_view motd)
 
void HandleSetInfo (WorldSession *session, std::string_view info)
 
void HandleSetEmblem (WorldSession *session, EmblemInfo const &emblemInfo)
 
void HandleSetEmblem (EmblemInfo const &emblemInfo)
 
void HandleSetLeader (WorldSession *session, std::string_view name)
 
void HandleSetBankTabInfo (WorldSession *session, uint8 tabId, std::string_view name, std::string_view icon)
 
void HandleSetMemberNote (WorldSession *session, std::string_view name, std::string_view note, bool isPublic)
 
void HandleSetRankInfo (WorldSession *session, uint8 rankId, std::string_view name, uint32 rights, uint32 moneyPerDay, std::array< GuildBankRightsAndSlots, GUILD_BANK_MAX_TABS > const &rightsAndSlots)
 
void HandleSetRankInfo (uint8 rankId, Optional< std::string_view > name, Optional< uint32 > rights={}, Optional< uint32 > moneyPerDay={})
 
void HandleBuyBankTab (WorldSession *session, uint8 tabId)
 
void HandleInviteMember (WorldSession *session, std::string const &name)
 
void HandleAcceptMember (WorldSession *session)
 
void HandleLeaveMember (WorldSession *session)
 
void HandleRemoveMember (WorldSession *session, std::string_view name)
 
void HandleUpdateMemberRank (WorldSession *session, std::string_view name, bool demote)
 
void HandleAddNewRank (WorldSession *session, std::string_view name)
 
void HandleRemoveRank (WorldSession *session, uint8 rankId)
 
void HandleRemoveLowestRank (WorldSession *session)
 
void HandleMemberDepositMoney (WorldSession *session, uint32 amount)
 
bool HandleMemberWithdrawMoney (WorldSession *session, uint32 amount, bool repair=false)
 
void HandleMemberLogout (WorldSession *session)
 
void HandleDisband (WorldSession *session)
 
void UpdateMemberData (Player *player, uint8 dataid, uint32 value)
 
void OnPlayerStatusChange (Player *player, uint32 flag, bool state)
 
void SendInfo (WorldSession *session) const
 
void SendEventLog (WorldSession *session) const
 
void SendBankLog (WorldSession *session, uint8 tabId) const
 
void SendBankTabsInfo (WorldSession *session, bool showTabs=false)
 
void SendBankTabData (WorldSession *session, uint8 tabId, bool sendAllSlots) const
 
void SendBankTabText (WorldSession *session, uint8 tabId) const
 
void SendPermissions (WorldSession *session)
 
void SendMoneyInfo (WorldSession *session) const
 
void SendLoginInfo (WorldSession *session)
 
bool LoadFromDB (Field *fields)
 
void LoadRankFromDB (Field *fields)
 
bool LoadMemberFromDB (Field *fields)
 
bool LoadEventLogFromDB (Field *fields)
 
void LoadBankRightFromDB (Field *fields)
 
void LoadBankTabFromDB (Field *fields)
 
bool LoadBankEventLogFromDB (Field *fields)
 
bool LoadBankItemFromDB (Field *fields)
 
bool Validate ()
 
void BroadcastToGuild (WorldSession *session, bool officerOnly, std::string_view msg, uint32 language=LANG_UNIVERSAL) const
 
void BroadcastPacketToRank (WorldPacket const *packet, uint8 rankId) const
 
void BroadcastPacket (WorldPacket const *packet) const
 
void MassInviteToEvent (WorldSession *session, uint32 minLevel, uint32 maxLevel, uint32 minRank)
 
template<class Do >
void BroadcastWorker (Do &_do, Player *except=nullptr)
 
bool AddMember (ObjectGuid guid, uint8 rankId=GUILD_RANK_NONE)
 
void DeleteMember (ObjectGuid guid, bool isDisbanding=false, bool isKicked=false, bool canDeleteGuild=false)
 
bool ChangeMemberRank (ObjectGuid guid, uint8 newRank)
 
void SwapItems (Player *player, uint8 tabId, uint8 slotId, uint8 destTabId, uint8 destSlotId, uint32 splitedAmount)
 
void SwapItemsWithInventory (Player *player, bool toChar, uint8 tabId, uint8 slotId, uint8 playerBag, uint8 playerSlotId, uint32 splitedAmount)
 
uint64 GetTotalBankMoney () const
 
uint32 GetMemberCount () const
 
time_t GetCreatedDate () const
 
void SetBankTabText (uint8 tabId, std::string_view text)
 
void ResetTimes ()
 
bool ModifyBankMoney (CharacterDatabaseTransaction trans, uint64 const &amount, bool add)
 
uint32 GetMemberSize () const
 
std::unordered_map< uint32, Member > const & GetUnorderedMembers () const
 
bool HasRankRight (Player *player, uint32 right) const
 
uint32 GetRankRights (uint8 rankId) const
 
bool MemberHasTabRights (ObjectGuid guid, uint8 tabId, uint32 rights) const
 

Static Public Member Functions

static void SendCommandResult (WorldSession *session, GuildCommandType type, GuildCommandError errCode, std::string_view param={})
 
static void SendSaveEmblemResult (WorldSession *session, GuildEmblemError errCode)
 

Protected Attributes

uint32 m_id
 
std::string m_name
 
ObjectGuid m_leaderGuid
 
std::string m_motd
 
std::string m_info
 
time_t m_createdDate
 
EmblemInfo m_emblemInfo
 
uint32 m_accountsNumber
 
uint64 m_bankMoney
 
std::vector< RankInfo > m_ranks
 
std::unordered_map< uint32, Member > m_members
 
std::vector< BankTab > m_bankTabs
 
LogHolder< EventLogEntry > m_eventLog
 
std::array< LogHolder< BankEventLogEntry >, GUILD_BANK_MAX_TABS+1 > m_bankEventLog = {}
 

Private Member Functions

uint8 _GetRanksSize () const
 
RankInfo const * GetRankInfo (uint8 rankId) const
 
RankInfo * GetRankInfo (uint8 rankId)
 
bool _HasRankRight (Player *player, uint32 right) const
 
uint8 _GetLowestRankId () const
 
uint8 _GetPurchasedTabsSize () const
 
BankTab * GetBankTab (uint8 tabId)
 
BankTab const * GetBankTab (uint8 tabId) const
 
void _DeleteMemberFromDB (ObjectGuid::LowType lowguid) const
 
void _CreateNewBankTab ()
 
void _CreateDefaultGuildRanks (CharacterDatabaseTransaction trans, LocaleConstant loc)
 
bool _CreateRank (CharacterDatabaseTransaction trans, std::string_view name, uint32 rights)
 
void _UpdateAccountsNumber ()
 
bool _IsLeader (Player *player) const
 
void _DeleteBankItems (CharacterDatabaseTransaction trans, bool removeItemsFromDB=false)
 
bool _ModifyBankMoney (CharacterDatabaseTransaction trans, uint64 amount, bool add)
 
void _SetLeaderGUID (Member &pLeader)
 
void _SetRankBankMoneyPerDay (uint8 rankId, uint32 moneyPerDay)
 
void _SetRankBankTabRightsAndSlots (uint8 rankId, GuildBankRightsAndSlots rightsAndSlots, bool saveToDB=true)
 
int8 _GetRankBankTabRights (uint8 rankId, uint8 tabId) const
 
uint32 _GetRankRights (uint8 rankId) const
 
int32 _GetRankBankMoneyPerDay (uint8 rankId) const
 
int32 _GetRankBankTabSlotsPerDay (uint8 rankId, uint8 tabId) const
 
std::string _GetRankName (uint8 rankId) const
 
int32 _GetMemberRemainingSlots (Member const &member, uint8 tabId) const
 
int32 _GetMemberRemainingMoney (Member const &member) const
 
void _UpdateMemberWithdrawSlots (CharacterDatabaseTransaction trans, ObjectGuid guid, uint8 tabId)
 
bool _MemberHasTabRights (ObjectGuid guid, uint8 tabId, uint32 rights) const
 
void _LogEvent (GuildEventLogTypes eventType, ObjectGuid playerGuid1, ObjectGuid playerGuid2=ObjectGuid::Empty, uint8 newRank=0)
 
void _LogBankEvent (CharacterDatabaseTransaction trans, GuildBankEventLogTypes eventType, uint8 tabId, ObjectGuid playerGuid, uint32 itemOrMoney, uint16 itemStackCount=0, uint8 destTabId=0)
 
Item * _GetItem (uint8 tabId, uint8 slotId) const
 
void _RemoveItem (CharacterDatabaseTransaction trans, uint8 tabId, uint8 slotId)
 
void _MoveItems (MoveItemData *pSrc, MoveItemData *pDest, uint32 splitedAmount)
 
bool _DoItemsMove (MoveItemData *pSrc, MoveItemData *pDest, bool sendError, uint32 splitedAmount=0)
 
void _SendBankContent (WorldSession *session, uint8 tabId, bool sendAllSlots) const
 
void _SendBankMoneyUpdate (WorldSession *session) const
 
void _SendBankContentUpdate (MoveItemData *pSrc, MoveItemData *pDest) const
 
void _SendBankContentUpdate (uint8 tabId, SlotIds slots) const
 
void _SendBankList (WorldSession *session=nullptr, uint8 tabId=0, bool sendFullSlots=false, SlotIds *slots=nullptr) const
 
void _BroadcastEvent (GuildEvents guildEvent, ObjectGuid guid=ObjectGuid::Empty, Optional< std::string_view > param1={}, Optional< std::string_view > param2={}, Optional< std::string_view > param3={}) const
 

Detailed Description

Constructor & Destructor Documentation

◆ Guild()

Guild::Guild ( )
1042 :
1043 m_id(0),
1044 m_createdDate(0),
1046 m_bankMoney(0)
1047{
1048}
uint64 m_bankMoney
Definition Guild.h:805
uint32 m_id
Definition Guild.h:796
uint32 m_accountsNumber
Definition Guild.h:804
time_t m_createdDate
Definition Guild.h:801

◆ ~Guild()

Guild::~Guild ( )
1051{
1052 CharacterDatabaseTransaction temp(nullptr);
1053 _DeleteBankItems(temp);
1054}
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition DatabaseEnvFwd.h:69
void _DeleteBankItems(CharacterDatabaseTransaction trans, bool removeItemsFromDB=false)
Definition Guild.cpp:2539

References _DeleteBankItems().

Member Function Documentation

◆ _BroadcastEvent()

void Guild::_BroadcastEvent ( GuildEvents  guildEvent,
ObjectGuid  guid = ObjectGuid::Empty,
Optional< std::string_view >  param1 = {},
Optional< std::string_view >  param2 = {},
Optional< std::string_view >  param3 = {} 
) const
private
2891{
2893 event.Type = guildEvent;
2894 if (param1)
2895 event.Params.push_back(*param1);
2896
2897 if (param2)
2898 {
2899 event.Params.resize(2);
2900 event.Params[1] = *param2;
2901 }
2902
2903 if (param3)
2904 {
2905 event.Params.resize(3);
2906 event.Params[2] = *param3;
2907 }
2908 event.Guid = guid;
2909 BroadcastPacket(event.Write());
2910 LOG_DEBUG("guild", "SMSG_GUILD_EVENT [Broadcast] Event: {}", guildEvent);
2911}
#define LOG_DEBUG(filterType__,...)
Definition Log.h:157
void BroadcastPacket(WorldPacket const *packet) const
Definition Guild.cpp:2217
Definition GuildPackets.h:203
WorldPacket const * Write() override
Definition GuildPackets.cpp:122
uint8 Type
Definition GuildPackets.h:209

References BroadcastPacket(), LOG_DEBUG, WorldPackets::Guild::GuildEvent::Type, and WorldPackets::Guild::GuildEvent::Write().

Referenced by AddMember(), DeleteMember(), Disband(), HandleAddNewRank(), HandleBuyBankTab(), HandleLeaveMember(), HandleMemberDepositMoney(), HandleMemberLogout(), HandleMemberWithdrawMoney(), HandleRemoveMember(), HandleRemoveRank(), HandleSetBankTabInfo(), HandleSetLeader(), HandleSetRankInfo(), HandleSetRankInfo(), HandleUpdateMemberRank(), ResetTimes(), SendLoginInfo(), and SetMOTD().

◆ _CreateDefaultGuildRanks()

void Guild::_CreateDefaultGuildRanks ( CharacterDatabaseTransaction  trans,
LocaleConstant  loc 
)
private
2490{
2491 uint32 const chatRights = GR_RIGHT_GCHATLISTEN | GR_RIGHT_GCHATSPEAK;
2492 _CreateRank(trans, sObjectMgr->GetAcoreString(LANG_GUILD_MASTER, loc), GR_RIGHT_ALL);
2493 _CreateRank(trans, sObjectMgr->GetAcoreString(LANG_GUILD_OFFICER, loc), GR_RIGHT_ALL);
2494 _CreateRank(trans, sObjectMgr->GetAcoreString(LANG_GUILD_VETERAN, loc), chatRights);
2495 _CreateRank(trans, sObjectMgr->GetAcoreString(LANG_GUILD_MEMBER, loc), chatRights);
2496 _CreateRank(trans, sObjectMgr->GetAcoreString(LANG_GUILD_INITIATE, loc), chatRights);
2497}
std::uint32_t uint32
Definition Define.h:107
@ GR_RIGHT_GCHATSPEAK
Definition Guild.h:78
@ GR_RIGHT_ALL
Definition Guild.h:94
@ GR_RIGHT_GCHATLISTEN
Definition Guild.h:77
@ LANG_GUILD_MASTER
Definition Language.h:759
@ LANG_GUILD_VETERAN
Definition Language.h:761
@ LANG_GUILD_OFFICER
Definition Language.h:760
@ LANG_GUILD_INITIATE
Definition Language.h:763
@ LANG_GUILD_MEMBER
Definition Language.h:762
#define sObjectMgr
Definition ObjectMgr.h:1731
bool _CreateRank(CharacterDatabaseTransaction trans, std::string_view name, uint32 rights)
Definition Guild.cpp:2499

References _CreateRank(), GR_RIGHT_ALL, GR_RIGHT_GCHATLISTEN, GR_RIGHT_GCHATSPEAK, LANG_GUILD_INITIATE, LANG_GUILD_MASTER, LANG_GUILD_MEMBER, LANG_GUILD_OFFICER, LANG_GUILD_VETERAN, and sObjectMgr.

Referenced by Create(), and Validate().

◆ _CreateNewBankTab()

void Guild::_CreateNewBankTab ( )
private
2464{
2465 uint8 tabId = _GetPurchasedTabsSize(); // Next free id
2466 m_bankTabs.emplace_back(m_id, tabId);
2467
2468 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2469
2471 stmt->SetData(0, m_id);
2472 stmt->SetData (1, tabId);
2473 trans->Append(stmt);
2474
2475 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GUILD_BANK_TAB);
2476 stmt->SetData(0, m_id);
2477 stmt->SetData (1, tabId);
2478 trans->Append(stmt);
2479
2480 ++tabId;
2481 for (auto& m_rank : m_ranks)
2482 m_rank.CreateMissingTabsIfNeeded(tabId, trans, false);
2483
2484 CharacterDatabase.CommitTransaction(trans);
2485}
@ CHAR_INS_GUILD_BANK_TAB
Definition CharacterDatabase.h:151
@ CHAR_DEL_GUILD_BANK_TAB
Definition CharacterDatabase.h:152
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
std::uint8_t uint8
Definition Define.h:109
std::vector< BankTab > m_bankTabs
Definition Guild.h:809
uint8 _GetPurchasedTabsSize() const
Definition Guild.h:829
std::vector< RankInfo > m_ranks
Definition Guild.h:807
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition PreparedStatement.h:77
Definition PreparedStatement.h:157

References _GetPurchasedTabsSize(), CHAR_DEL_GUILD_BANK_TAB, CHAR_INS_GUILD_BANK_TAB, CharacterDatabase, m_bankTabs, m_id, m_ranks, and PreparedStatementBase::SetData().

Referenced by Create(), and HandleBuyBankTab().

◆ _CreateRank()

bool Guild::_CreateRank ( CharacterDatabaseTransaction  trans,
std::string_view  name,
uint32  rights 
)
private
2500{
2501 uint8 newRankId = _GetRanksSize();
2502 if (newRankId >= GUILD_RANKS_MAX_COUNT)
2503 return false;
2504
2505 // Ranks represent sequence 0, 1, 2, ... where 0 means guildmaster
2506 RankInfo info(m_id, newRankId, name, rights, 0);
2507 m_ranks.push_back(info);
2508
2509 info.CreateMissingTabsIfNeeded(_GetPurchasedTabsSize(), trans);
2510 info.SaveToDB(trans);
2511
2512 return true;
2513}
@ GUILD_RANKS_MAX_COUNT
Definition Guild.h:46
uint8 _GetRanksSize() const
Definition Guild.h:816

References _GetPurchasedTabsSize(), _GetRanksSize(), Guild::RankInfo::CreateMissingTabsIfNeeded(), GUILD_RANKS_MAX_COUNT, m_id, m_ranks, and Guild::RankInfo::SaveToDB().

Referenced by _CreateDefaultGuildRanks(), and HandleAddNewRank().

◆ _DeleteBankItems()

void Guild::_DeleteBankItems ( CharacterDatabaseTransaction  trans,
bool  removeItemsFromDB = false 
)
private
2540{
2541 for (uint8 tabId = 0; tabId < _GetPurchasedTabsSize(); ++tabId)
2542 {
2543 m_bankTabs[tabId].Delete(trans, removeItemsFromDB);
2544 }
2545 m_bankTabs.clear();
2546}

References _GetPurchasedTabsSize(), and m_bankTabs.

Referenced by Disband(), and ~Guild().

◆ _DeleteMemberFromDB()

void Guild::_DeleteMemberFromDB ( ObjectGuid::LowType  lowguid) const
inlineprivate
834 {
836 stmt->SetData(0, lowguid);
837 CharacterDatabase.Execute(stmt);
838 }
@ CHAR_DEL_GUILD_MEMBER
Definition CharacterDatabase.h:145

References CHAR_DEL_GUILD_MEMBER, CharacterDatabase, and PreparedStatementBase::SetData().

Referenced by DeleteMember(), and LoadMemberFromDB().

◆ _DoItemsMove()

bool Guild::_DoItemsMove ( MoveItemData *  pSrc,
MoveItemData *  pDest,
bool  sendError,
uint32  splitedAmount = 0 
)
private
2795{
2796 Item* pDestItem = pDest->GetItem();
2797 bool swap = (pDestItem != nullptr);
2798
2799 Item* pSrcItem = pSrc->GetItem(splitedAmount);
2800 // 1. Can store source item in destination
2801 if (!pDest->CanStore(pSrcItem, swap, sendError))
2802 return false;
2803
2804 // 2. Can store destination item in source
2805 if (swap)
2806 if (!pSrc->CanStore(pDestItem, true, true))
2807 return false;
2808
2809 // GM LOG (TODO: move to scripts)
2810 pDest->LogAction(pSrc);
2811 if (swap)
2812 pSrc->LogAction(pDest);
2813
2814 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2815 // 3. Log bank events
2816 pDest->LogBankEvent(trans, pSrc, pSrcItem->GetCount());
2817 if (swap)
2818 pSrc->LogBankEvent(trans, pDest, pDestItem->GetCount());
2819
2820 // 4. Remove item from source
2821 pSrc->RemoveItem(trans, pDest, splitedAmount);
2822
2823 // 5. Remove item from destination
2824 if (swap)
2825 pDest->RemoveItem(trans, pSrc);
2826
2827 // 6. Store item in destination
2828 pDest->StoreItem(trans, pSrcItem);
2829
2830 // 7. Store item in source
2831 if (swap)
2832 pSrc->StoreItem(trans, pDestItem);
2833
2834 CharacterDatabase.CommitTransaction(trans);
2835 return true;
2836}
Definition Item.h:220
uint32 GetCount() const
Definition Item.h:272

References Guild::MoveItemData::CanStore(), CharacterDatabase, Item::GetCount(), Guild::MoveItemData::GetItem(), Guild::MoveItemData::LogAction(), Guild::MoveItemData::LogBankEvent(), Guild::MoveItemData::RemoveItem(), and Guild::MoveItemData::StoreItem().

Referenced by _MoveItems().

◆ _GetItem()

Item * Guild::_GetItem ( uint8  tabId,
uint8  slotId 
) const
inlineprivate
2729{
2730 if (BankTab const* tab = GetBankTab(tabId))
2731 return tab->GetItem(slotId);
2732 return nullptr;
2733}
BankTab * GetBankTab(uint8 tabId)
Definition Guild.h:830

References GetBankTab().

◆ _GetLowestRankId()

uint8 Guild::_GetLowestRankId ( ) const
inlineprivate
827{ return uint8(m_ranks.size() - 1); }

References m_ranks.

Referenced by AddMember(), ChangeMemberRank(), HandleRemoveLowestRank(), HandleUpdateMemberRank(), and Validate().

◆ _GetMemberRemainingMoney()

int32 Guild::_GetMemberRemainingMoney ( Member const &  member) const
inlineprivate
2644{
2645 uint8 rankId = member.GetRankId();
2646 if (rankId == GR_GUILDMASTER)
2647 return static_cast<int32>(GUILD_WITHDRAW_MONEY_UNLIMITED);
2648
2650 {
2651 int32 remaining = _GetRankBankMoneyPerDay(rankId) - member.GetBankWithdrawValue(GUILD_BANK_MAX_TABS);
2652 if (remaining > 0)
2653 return remaining;
2654 }
2655 return 0;
2656}
std::int32_t int32
Definition Define.h:103
@ GUILD_WITHDRAW_MONEY_UNLIMITED
Definition Guild.h:48
@ GUILD_BANK_MAX_TABS
Definition Guild.h:42
@ GR_GUILDMASTER
Definition Guild.h:65
@ GR_RIGHT_WITHDRAW_REPAIR
Definition Guild.h:91
@ GR_RIGHT_WITHDRAW_GOLD
Definition Guild.h:92
uint32 _GetRankRights(uint8 rankId) const
Definition Guild.cpp:2600
int32 _GetRankBankMoneyPerDay(uint8 rankId) const
Definition Guild.cpp:2607

References _GetRankBankMoneyPerDay(), _GetRankRights(), Guild::Member::GetBankWithdrawValue(), Guild::Member::GetRankId(), GR_GUILDMASTER, GR_RIGHT_WITHDRAW_GOLD, GR_RIGHT_WITHDRAW_REPAIR, GUILD_BANK_MAX_TABS, and GUILD_WITHDRAW_MONEY_UNLIMITED.

Referenced by HandleMemberWithdrawMoney(), and SendMoneyInfo().

◆ _GetMemberRemainingSlots()

int32 Guild::_GetMemberRemainingSlots ( Member const &  member,
uint8  tabId 
) const
inlineprivate
2630{
2631 uint8 rankId = member.GetRankId();
2632 if (rankId == GR_GUILDMASTER)
2633 return static_cast<int32>(GUILD_WITHDRAW_SLOT_UNLIMITED);
2634 if ((_GetRankBankTabRights(rankId, tabId) & GUILD_BANK_RIGHT_VIEW_TAB) != 0)
2635 {
2636 int32 remaining = _GetRankBankTabSlotsPerDay(rankId, tabId) - member.GetBankWithdrawValue(tabId);
2637 if (remaining > 0)
2638 return remaining;
2639 }
2640 return 0;
2641}
@ GUILD_WITHDRAW_SLOT_UNLIMITED
Definition Guild.h:49
@ GUILD_BANK_RIGHT_VIEW_TAB
Definition Guild.h:187
int8 _GetRankBankTabRights(uint8 rankId, uint8 tabId) const
Definition Guild.cpp:2622
int32 _GetRankBankTabSlotsPerDay(uint8 rankId, uint8 tabId) const
Definition Guild.cpp:2614

References _GetRankBankTabRights(), _GetRankBankTabSlotsPerDay(), Guild::Member::GetBankWithdrawValue(), Guild::Member::GetRankId(), GR_GUILDMASTER, GUILD_BANK_RIGHT_VIEW_TAB, and GUILD_WITHDRAW_SLOT_UNLIMITED.

Referenced by _SendBankList(), and SendPermissions().

◆ _GetPurchasedTabsSize()

◆ _GetRankBankMoneyPerDay()

int32 Guild::_GetRankBankMoneyPerDay ( uint8  rankId) const
inlineprivate
2608{
2609 if (RankInfo const* rankInfo = GetRankInfo(rankId))
2610 return rankInfo->GetBankMoneyPerDay();
2611 return 0;
2612}
RankInfo const * GetRankInfo(uint8 rankId) const
Definition Guild.h:817

References GetRankInfo().

Referenced by _GetMemberRemainingMoney(), and SendPermissions().

◆ _GetRankBankTabRights()

int8 Guild::_GetRankBankTabRights ( uint8  rankId,
uint8  tabId 
) const
inlineprivate
2623{
2624 if (RankInfo const* rankInfo = GetRankInfo(rankId))
2625 return rankInfo->GetBankTabRights(tabId);
2626 return 0;
2627}

References GetRankInfo().

Referenced by _GetMemberRemainingSlots(), _MemberHasTabRights(), and SendPermissions().

◆ _GetRankBankTabSlotsPerDay()

int32 Guild::_GetRankBankTabSlotsPerDay ( uint8  rankId,
uint8  tabId 
) const
inlineprivate
2615{
2616 if (tabId < _GetPurchasedTabsSize())
2617 if (RankInfo const* rankInfo = GetRankInfo(rankId))
2618 return rankInfo->GetBankTabSlotsPerDay(tabId);
2619 return 0;
2620}

References _GetPurchasedTabsSize(), and GetRankInfo().

Referenced by _GetMemberRemainingSlots(), and _UpdateMemberWithdrawSlots().

◆ _GetRankName()

std::string Guild::_GetRankName ( uint8  rankId) const
inlineprivate
2594{
2595 if (RankInfo const* rankInfo = GetRankInfo(rankId))
2596 return rankInfo->GetName();
2597 return "<unknown>";
2598}

References GetRankInfo().

Referenced by HandleUpdateMemberRank().

◆ _GetRankRights()

uint32 Guild::_GetRankRights ( uint8  rankId) const
inlineprivate
2601{
2602 if (RankInfo const* rankInfo = GetRankInfo(rankId))
2603 return rankInfo->GetRights();
2604 return 0;
2605}

References GetRankInfo().

Referenced by _GetMemberRemainingMoney(), _HasRankRight(), GetRankRights(), HandleMemberWithdrawMoney(), and SendPermissions().

◆ _GetRanksSize()

uint8 Guild::_GetRanksSize ( ) const
inlineprivate

◆ _HasRankRight()

bool Guild::_HasRankRight ( Player *  player,
uint32  right 
) const
inlineprivate
820 {
821 if (player)
822 if (Member const* member = GetMember(player->GetGUID()))
823 return (_GetRankRights(member->GetRankId()) & right) != GR_RIGHT_EMPTY;
824 return false;
825 }
@ GR_RIGHT_EMPTY
Definition Guild.h:76
Member const * GetMember(ObjectGuid guid) const
Definition Guild.h:384
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:120

References _GetRankRights(), Object::GetGUID(), GetMember(), and GR_RIGHT_EMPTY.

Referenced by BroadcastToGuild(), HandleInviteMember(), HandleRemoveMember(), HandleRoster(), HandleSetInfo(), HandleSetMemberNote(), HandleSetMOTD(), HandleUpdateMemberRank(), and HasRankRight().

◆ _IsLeader()

bool Guild::_IsLeader ( Player *  player) const
private
2531{
2532 if (player->GetGUID() == m_leaderGuid)
2533 return true;
2534 if (Member const* member = GetMember(player->GetGUID()))
2535 return member->IsRank(GR_GUILDMASTER);
2536 return false;
2537}
ObjectGuid m_leaderGuid
Definition Guild.h:798

References Object::GetGUID(), GetMember(), GR_GUILDMASTER, and m_leaderGuid.

Referenced by HandleAddNewRank(), HandleDisband(), HandleLeaveMember(), HandleRemoveRank(), HandleSetEmblem(), HandleSetLeader(), and HandleSetRankInfo().

◆ _LogBankEvent()

void Guild::_LogBankEvent ( CharacterDatabaseTransaction  trans,
GuildBankEventLogTypes  eventType,
uint8  tabId,
ObjectGuid  playerGuid,
uint32  itemOrMoney,
uint16  itemStackCount = 0,
uint8  destTabId = 0 
)
private
2708{
2709 if (tabId > GUILD_BANK_MAX_TABS)
2710 return;
2711
2712 // not logging moves within the same tab
2713 if (eventType == GUILD_BANK_LOG_MOVE_ITEM && tabId == destTabId)
2714 return;
2715
2716 uint8 dbTabId = tabId;
2717 if (BankEventLogEntry::IsMoneyEvent(eventType))
2718 {
2719 tabId = GUILD_BANK_MAX_TABS;
2720 dbTabId = GUILD_BANK_MONEY_LOGS_TAB;
2721 }
2722 LogHolder<BankEventLogEntry>& pLog = m_bankEventLog[tabId];
2723 pLog.AddEvent(trans, m_id, pLog.GetNextGUID(), eventType, dbTabId, guid, itemOrMoney, itemStackCount, destTabId);
2724
2725 sScriptMgr->OnGuildBankEvent(this, uint8(eventType), tabId, guid.GetCounter(), itemOrMoney, itemStackCount, destTabId);
2726}
@ GUILD_BANK_MONEY_LOGS_TAB
Definition Guild.h:44
@ GUILD_BANK_LOG_MOVE_ITEM
Definition Guild.h:199
#define sScriptMgr
Definition ScriptMgr.h:769
bool IsMoneyEvent() const
Definition Guild.h:457
std::array< LogHolder< BankEventLogEntry >, GUILD_BANK_MAX_TABS+1 > m_bankEventLog
Definition Guild.h:813

References Guild::LogHolder< Entry >::AddEvent(), ObjectGuid::GetCounter(), Guild::LogHolder< Entry >::GetNextGUID(), GUILD_BANK_LOG_MOVE_ITEM, GUILD_BANK_MAX_TABS, GUILD_BANK_MONEY_LOGS_TAB, Guild::BankEventLogEntry::IsMoneyEvent(), m_bankEventLog, m_id, and sScriptMgr.

Referenced by HandleMemberDepositMoney(), and HandleMemberWithdrawMoney().

◆ _LogEvent()

void Guild::_LogEvent ( GuildEventLogTypes  eventType,
ObjectGuid  playerGuid1,
ObjectGuid  playerGuid2 = ObjectGuid::Empty,
uint8  newRank = 0 
)
inlineprivate
2698{
2699 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2700 m_eventLog.AddEvent(trans, m_id, m_eventLog.GetNextGUID(), eventType, playerGuid1, playerGuid2, newRank);
2701 CharacterDatabase.CommitTransaction(trans);
2702
2703 sScriptMgr->OnGuildEvent(this, uint8(eventType), playerGuid1.GetCounter(), playerGuid2.GetCounter(), newRank);
2704}
LogHolder< EventLogEntry > m_eventLog
Definition Guild.h:812
LowType GetCounter() const
Definition ObjectGuid.h:149

References CharacterDatabase, ObjectGuid::GetCounter(), m_eventLog, m_id, and sScriptMgr.

Referenced by AddMember(), HandleInviteMember(), HandleLeaveMember(), HandleRemoveMember(), and HandleUpdateMemberRank().

◆ _MemberHasTabRights()

bool Guild::_MemberHasTabRights ( ObjectGuid  guid,
uint8  tabId,
uint32  rights 
) const
inlineprivate
2670{
2671 if (Member const* member = GetMember(guid))
2672 {
2673 // Leader always has full rights
2674 if (member->IsRank(GR_GUILDMASTER) || m_leaderGuid == guid)
2675 return true;
2676 return (_GetRankBankTabRights(member->GetRankId(), tabId) & rights) == rights;
2677 }
2678 return false;
2679}

References _GetRankBankTabRights(), GetMember(), GR_GUILDMASTER, and m_leaderGuid.

Referenced by _SendBankContent(), _SendBankList(), and MemberHasTabRights().

◆ _ModifyBankMoney()

bool Guild::_ModifyBankMoney ( CharacterDatabaseTransaction  trans,
uint64  amount,
bool  add 
)
private
2549{
2550 if (add)
2551 m_bankMoney += amount;
2552 else
2553 {
2554 // Check if there is enough money in bank.
2555 if (m_bankMoney < amount)
2556 return false;
2557 m_bankMoney -= amount;
2558 }
2559
2561 stmt->SetData(0, m_bankMoney);
2562 stmt->SetData(1, m_id);
2563 trans->Append(stmt);
2564 return true;
2565}
@ CHAR_UPD_GUILD_BANK_MONEY
Definition CharacterDatabase.h:176

References CHAR_UPD_GUILD_BANK_MONEY, CharacterDatabase, m_bankMoney, m_id, and PreparedStatementBase::SetData().

Referenced by HandleMemberDepositMoney(), HandleMemberWithdrawMoney(), and ModifyBankMoney().

◆ _MoveItems()

void Guild::_MoveItems ( MoveItemData *  pSrc,
MoveItemData *  pDest,
uint32  splitedAmount 
)
private
2742{
2743 // 1. Initialize source item
2744 if (!pSrc->InitItem())
2745 return; // No source item
2746
2747 // 2. Check source item
2748 if (!pSrc->CheckItem(splitedAmount))
2749 return; // Source item or splited amount is invalid
2750
2751 // 3. Check destination rights
2752 if (!pDest->HasStoreRights(pSrc))
2753 return; // Player has no rights to store item in destination
2754
2755 // 4. Check source withdraw rights
2756 if (!pSrc->HasWithdrawRights(pDest))
2757 return; // Player has no rights to withdraw items from source
2758
2759 // 5. Check split
2760 if (splitedAmount)
2761 {
2762 // 5.1. Clone source item
2763 if (!pSrc->CloneItem(splitedAmount))
2764 return; // Item could not be cloned
2765
2766 // 5.2. Move splited item to destination
2767 _DoItemsMove(pSrc, pDest, true, splitedAmount);
2768 }
2769 else // 6. No split
2770 {
2771 // 6.1. Try to merge items in destination (pDest->GetItem() == nullptr)
2772 if (!_DoItemsMove(pSrc, pDest, false)) // Item could not be merged
2773 {
2774 // 6.2. Try to swap items
2775 // 6.2.1. Initialize destination item
2776 if (!pDest->InitItem())
2777 return;
2778
2779 // 6.2.2. Check rights to store item in source (opposite direction)
2780 if (!pSrc->HasStoreRights(pDest))
2781 return; // Player has no rights to store item in source (opposite direction)
2782
2783 if (!pDest->HasWithdrawRights(pSrc))
2784 return; // Player has no rights to withdraw item from destination (opposite direction)
2785
2786 // 6.2.3. Swap items (pDest->GetItem() != nullptr)
2787 _DoItemsMove(pSrc, pDest, true);
2788 }
2789 }
2790 // 7. Send changes
2791 _SendBankContentUpdate(pSrc, pDest);
2792}
bool _DoItemsMove(MoveItemData *pSrc, MoveItemData *pDest, bool sendError, uint32 splitedAmount=0)
Definition Guild.cpp:2794
void _SendBankContentUpdate(MoveItemData *pSrc, MoveItemData *pDest) const
Definition Guild.cpp:2852

References _DoItemsMove(), _SendBankContentUpdate(), Guild::MoveItemData::CheckItem(), Guild::MoveItemData::CloneItem(), Guild::MoveItemData::HasStoreRights(), Guild::MoveItemData::HasWithdrawRights(), and Guild::MoveItemData::InitItem().

Referenced by SwapItems(), and SwapItemsWithInventory().

◆ _RemoveItem()

void Guild::_RemoveItem ( CharacterDatabaseTransaction  trans,
uint8  tabId,
uint8  slotId 
)
inlineprivate
2736{
2737 if (BankTab* pTab = GetBankTab(tabId))
2738 pTab->SetItem(trans, slotId, nullptr);
2739}

References GetBankTab().

◆ _SendBankContent()

void Guild::_SendBankContent ( WorldSession *  session,
uint8  tabId,
bool  sendAllSlots 
) const
private
2839{
2840 ObjectGuid guid = session->GetPlayer()->GetGUID();
2842 return;
2843
2844 _SendBankList(session, tabId, sendAllSlots);
2845}
void _SendBankList(WorldSession *session=nullptr, uint8 tabId=0, bool sendFullSlots=false, SlotIds *slots=nullptr) const
Definition Guild.cpp:2913
bool _MemberHasTabRights(ObjectGuid guid, uint8 tabId, uint32 rights) const
Definition Guild.cpp:2669
Definition ObjectGuid.h:121
Player * GetPlayer() const
Definition WorldSession.h:503

References _MemberHasTabRights(), _SendBankList(), Object::GetGUID(), WorldSession::GetPlayer(), and GUILD_BANK_RIGHT_VIEW_TAB.

Referenced by SendBankTabData().

◆ _SendBankContentUpdate() [1/2]

void Guild::_SendBankContentUpdate ( MoveItemData *  pSrc,
MoveItemData *  pDest 
) const
private
2853{
2854 ASSERT(pSrc->IsBank() || pDest->IsBank());
2855
2856 uint8 tabId = 0;
2857 SlotIds slots;
2858 if (pSrc->IsBank()) // B ->
2859 {
2860 tabId = pSrc->GetContainer();
2861 slots.insert(pSrc->GetSlotId());
2862 if (pDest->IsBank()) // B -> B
2863 {
2864 // Same tab - add destination slots to collection
2865 if (pDest->GetContainer() == pSrc->GetContainer())
2866 pDest->CopySlots(slots);
2867 else // Different tabs - send second message
2868 {
2869 SlotIds destSlots;
2870 pDest->CopySlots(destSlots);
2871 _SendBankContentUpdate(pDest->GetContainer(), destSlots);
2872 }
2873 }
2874 }
2875 else if (pDest->IsBank()) // C -> B
2876 {
2877 tabId = pDest->GetContainer();
2878 pDest->CopySlots(slots);
2879 }
2880
2881 _SendBankContentUpdate(tabId, slots);
2882}
#define ASSERT
Definition Errors.h:68
std::set< uint8 > SlotIds
Definition Guild.h:292

References _SendBankContentUpdate(), ASSERT, Guild::MoveItemData::CopySlots(), Guild::MoveItemData::GetContainer(), Guild::MoveItemData::GetSlotId(), and Guild::MoveItemData::IsBank().

Referenced by _MoveItems(), and _SendBankContentUpdate().

◆ _SendBankContentUpdate() [2/2]

void Guild::_SendBankContentUpdate ( uint8  tabId,
SlotIds  slots 
) const
private
2885{
2886 _SendBankList(nullptr, tabId, false, &slots);
2887}

References _SendBankList().

◆ _SendBankList()

void Guild::_SendBankList ( WorldSession *  session = nullptr,
uint8  tabId = 0,
bool  sendFullSlots = false,
SlotIds *  slots = nullptr 
) const
private
2914{
2915 if (!sScriptMgr->CanGuildSendBankList(this, session, tabId, sendAllSlots))
2916 return;
2917
2919
2920 packet.Money = m_bankMoney;
2921 packet.Tab = int32(tabId);
2922 packet.FullUpdate = sendAllSlots;
2923
2924 if (sendAllSlots && !tabId)
2925 {
2926 packet.TabInfo.reserve(_GetPurchasedTabsSize());
2927 for (uint8 i = 0; i < _GetPurchasedTabsSize(); ++i)
2928 {
2930 tabInfo.Name = m_bankTabs[i].GetName();
2931 tabInfo.Icon = m_bankTabs[i].GetIcon();
2932 packet.TabInfo.push_back(tabInfo);
2933 }
2934 }
2935
2936 if (BankTab const* tab = GetBankTab(tabId))
2937 {
2938 auto fillItems = [&](auto begin, auto end, bool skipEmpty)
2939 {
2940 for (auto itr = begin; itr != end; ++itr)
2941 {
2942 if (Item* tabItem = tab->GetItem(*itr))
2943 {
2945
2946 itemInfo.Slot = *itr;
2947 itemInfo.ItemID = tabItem->GetEntry();
2948 itemInfo.Count = int32(tabItem->GetCount());
2949 itemInfo.Charges = int32(std::abs(tabItem->GetSpellCharges()));
2950 itemInfo.EnchantmentID = int32(tabItem->GetEnchantmentId(PERM_ENCHANTMENT_SLOT));
2951 itemInfo.Flags = tabItem->GetInt32Value(ITEM_FIELD_FLAGS);
2952 itemInfo.RandomPropertiesID = tabItem->GetItemRandomPropertyId();
2953 itemInfo.RandomPropertiesSeed = int32(tabItem->GetItemSuffixFactor());
2954
2955 for (uint32 socketSlot = 0; socketSlot < MAX_GEM_SOCKETS; ++socketSlot)
2956 {
2957 if (uint32 enchId = tabItem->GetEnchantmentId(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT + socketSlot)))
2958 {
2960 gem.SocketIndex = socketSlot;
2961 gem.SocketEnchantID = int32(enchId);
2962 itemInfo.SocketEnchant.push_back(gem);
2963 }
2964 }
2965
2966 packet.ItemInfo.push_back(itemInfo);
2967 }
2968 else if (!skipEmpty)
2969 {
2971
2972 itemInfo.Slot = *itr;
2973 itemInfo.ItemID = 0;
2974
2975 packet.ItemInfo.push_back(itemInfo);
2976 }
2977 }
2978
2979 };
2980
2981 if (sendAllSlots)
2982 fillItems(boost::make_counting_iterator(uint8(0)), boost::make_counting_iterator(uint8(GUILD_BANK_MAX_SLOTS)), true);
2983 else if (slots && !slots->empty())
2984 fillItems(slots->begin(), slots->end(), false);
2985 }
2986
2987 if (session)
2988 {
2989 if (Member const* member = GetMember(session->GetPlayer()->GetGUID()))
2990 packet.WithdrawalsRemaining = _GetMemberRemainingSlots(*member, tabId);
2991
2992 session->SendPacket(packet.Write());
2993 LOG_DEBUG("guild", "SMSG_GUILD_BANK_LIST [{}]: TabId: {}, FullSlots: {}, slots: {}",
2994 session->GetPlayerInfo(), tabId, sendAllSlots, packet.WithdrawalsRemaining);
2995 }
2996 else
2997 {
2998 packet.Write();
2999 for (auto const& [guid, member] : m_members)
3000 {
3001 if (!member.ShouldReceiveBankPartialUpdatePackets())
3002 continue;
3003
3004 if (!_MemberHasTabRights(member.GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB))
3005 continue;
3006
3007 Player* player = member.FindPlayer();
3008 if (!player)
3009 continue;
3010
3012 player->SendDirectMessage(packet.GetRawPacket());
3013 LOG_DEBUG("guild", "SMSG_GUILD_BANK_LIST [{}]: TabId: {}, FullSlots: {}, slots: {}"
3014 , player->GetName(), tabId, sendAllSlots, packet.WithdrawalsRemaining);
3015 }
3016 }
3017}
@ GUILD_BANK_MAX_SLOTS
Definition Guild.h:43
#define MAX_GEM_SOCKETS
Definition Item.h:188
EnchantmentSlot
Definition Item.h:168
@ PERM_ENCHANTMENT_SLOT
Definition Item.h:169
@ SOCK_ENCHANTMENT_SLOT
Definition Item.h:171
@ ITEM_FIELD_FLAGS
Definition UpdateFields.h:42
int32 _GetMemberRemainingSlots(Member const &member, uint8 tabId) const
Definition Guild.cpp:2629
std::unordered_map< uint32, Member > m_members
Definition Guild.h:808
Definition Player.h:1086
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5886
std::string const & GetName() const
Definition Object.h:535
Definition GuildPackets.h:482
int32 WithdrawalsRemaining
Definition GuildPackets.h:490
bool FullUpdate
Definition GuildPackets.h:493
WorldPacket const * Write() override
Definition GuildPackets.cpp:285
void SetWithdrawalsRemaining(int32 withdrawalsRemaining)
Definition GuildPackets.cpp:331
uint8 Tab
Definition GuildPackets.h:491
std::vector< GuildBankTabInfo > TabInfo
Definition GuildPackets.h:489
uint64 Money
Definition GuildPackets.h:492
std::vector< GuildBankItemInfo > ItemInfo
Definition GuildPackets.h:488
WorldPacket const * GetRawPacket() const
Definition Packet.h:38
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition WorldSession.cpp:309
std::string GetPlayerInfo() const
Definition WorldSession.cpp:273
Definition GuildPackets.h:463
int32 EnchantmentID
Definition GuildPackets.h:469
int32 Flags
Definition GuildPackets.h:471
std::vector< GuildBankSocketEnchant > SocketEnchant
Definition GuildPackets.h:472
uint32 ItemID
Definition GuildPackets.h:464
int32 Count
Definition GuildPackets.h:468
int32 RandomPropertiesID
Definition GuildPackets.h:466
int32 Charges
Definition GuildPackets.h:470
int32 RandomPropertiesSeed
Definition GuildPackets.h:465
uint8 Slot
Definition GuildPackets.h:467
Definition GuildPackets.h:457
uint8 SocketIndex
Definition GuildPackets.h:458
int32 SocketEnchantID
Definition GuildPackets.h:459
Definition GuildPackets.h:476
std::string Name
Definition GuildPackets.h:477
std::string Icon
Definition GuildPackets.h:478

References _GetMemberRemainingSlots(), _GetPurchasedTabsSize(), _MemberHasTabRights(), WorldPackets::Guild::GuildBankItemInfo::Charges, WorldPackets::Guild::GuildBankItemInfo::Count, WorldPackets::Guild::GuildBankItemInfo::EnchantmentID, WorldPackets::Guild::GuildBankItemInfo::Flags, WorldPackets::Guild::GuildBankQueryResults::FullUpdate, GetBankTab(), Object::GetGUID(), GetMember(), WorldObject::GetName(), WorldSession::GetPlayer(), WorldSession::GetPlayerInfo(), WorldPackets::Packet::GetRawPacket(), GUILD_BANK_MAX_SLOTS, GUILD_BANK_RIGHT_VIEW_TAB, WorldPackets::Guild::GuildBankTabInfo::Icon, ITEM_FIELD_FLAGS, WorldPackets::Guild::GuildBankItemInfo::ItemID, WorldPackets::Guild::GuildBankQueryResults::ItemInfo, LOG_DEBUG, m_bankMoney, m_bankTabs, m_members, MAX_GEM_SOCKETS, WorldPackets::Guild::GuildBankQueryResults::Money, WorldPackets::Guild::GuildBankTabInfo::Name, PERM_ENCHANTMENT_SLOT, WorldPackets::Guild::GuildBankItemInfo::RandomPropertiesID, WorldPackets::Guild::GuildBankItemInfo::RandomPropertiesSeed, Player::SendDirectMessage(), WorldSession::SendPacket(), WorldPackets::Guild::GuildBankQueryResults::SetWithdrawalsRemaining(), WorldPackets::Guild::GuildBankItemInfo::Slot, SOCK_ENCHANTMENT_SLOT, WorldPackets::Guild::GuildBankItemInfo::SocketEnchant, WorldPackets::Guild::GuildBankSocketEnchant::SocketEnchantID, WorldPackets::Guild::GuildBankSocketEnchant::SocketIndex, sScriptMgr, WorldPackets::Guild::GuildBankQueryResults::Tab, WorldPackets::Guild::GuildBankQueryResults::TabInfo, WorldPackets::Guild::GuildBankQueryResults::WithdrawalsRemaining, and WorldPackets::Guild::GuildBankQueryResults::Write().

Referenced by _SendBankContent(), _SendBankContentUpdate(), _SendBankMoneyUpdate(), and SendBankTabsInfo().

◆ _SendBankMoneyUpdate()

void Guild::_SendBankMoneyUpdate ( WorldSession *  session) const
private
2848{
2849 _SendBankList(session);
2850}

References _SendBankList().

◆ _SetLeaderGUID()

void Guild::_SetLeaderGUID ( Member &  pLeader)
private
2568{
2569 m_leaderGuid = pLeader.GetGUID();
2570 pLeader.ChangeRank(GR_GUILDMASTER);
2571
2573 stmt->SetData(0, m_leaderGuid.GetCounter());
2574 stmt->SetData(1, m_id);
2575 CharacterDatabase.Execute(stmt);
2576}
@ CHAR_UPD_GUILD_LEADER
Definition CharacterDatabase.h:171

References Guild::Member::ChangeRank(), CHAR_UPD_GUILD_LEADER, CharacterDatabase, ObjectGuid::GetCounter(), Guild::Member::GetGUID(), GR_GUILDMASTER, m_id, m_leaderGuid, and PreparedStatementBase::SetData().

Referenced by DeleteMember(), HandleSetLeader(), and Validate().

◆ _SetRankBankMoneyPerDay()

void Guild::_SetRankBankMoneyPerDay ( uint8  rankId,
uint32  moneyPerDay 
)
private
2579{
2580 if (RankInfo* rankInfo = GetRankInfo(rankId))
2581 rankInfo->SetBankMoneyPerDay(moneyPerDay);
2582}

References GetRankInfo().

Referenced by HandleSetRankInfo(), and HandleSetRankInfo().

◆ _SetRankBankTabRightsAndSlots()

void Guild::_SetRankBankTabRightsAndSlots ( uint8  rankId,
GuildBankRightsAndSlots  rightsAndSlots,
bool  saveToDB = true 
)
private
2585{
2586 if (rightsAndSlots.GetTabId() >= _GetPurchasedTabsSize())
2587 return;
2588
2589 if (RankInfo* rankInfo = GetRankInfo(rankId))
2590 rankInfo->SetBankTabSlotsAndRights(rightsAndSlots, saveToDB);
2591}
uint8 GetTabId() const
Definition Guild.h:282

References _GetPurchasedTabsSize(), GetRankInfo(), and GuildBankRightsAndSlots::GetTabId().

Referenced by HandleSetRankInfo(), and LoadBankRightFromDB().

◆ _UpdateAccountsNumber()

void Guild::_UpdateAccountsNumber ( )
private
2518{
2519 // We use a set to be sure each element will be unique
2520 std::unordered_set<uint32> accountsIdSet;
2521 for (auto const& [guid, member] : m_members)
2522 accountsIdSet.insert(member.GetAccountId());
2523
2524 m_accountsNumber = accountsIdSet.size();
2525}

References m_accountsNumber, and m_members.

Referenced by AddMember(), DeleteMember(), and Validate().

◆ _UpdateMemberWithdrawSlots()

void Guild::_UpdateMemberWithdrawSlots ( CharacterDatabaseTransaction  trans,
ObjectGuid  guid,
uint8  tabId 
)
inlineprivate
2659{
2660 if (Member* member = GetMember(guid))
2661 {
2662 uint8 rankId = member->GetRankId();
2663 if (rankId != GR_GUILDMASTER
2664 && member->GetBankWithdrawValue(tabId) < _GetRankBankTabSlotsPerDay(rankId, tabId))
2665 member->UpdateBankWithdrawValue(trans, tabId, 1);
2666 }
2667}

References _GetRankBankTabSlotsPerDay(), GetMember(), and GR_GUILDMASTER.

◆ AddMember()

bool Guild::AddMember ( ObjectGuid  guid,
uint8  rankId = GUILD_RANK_NONE 
)
2258{
2260 // Player cannot be in guild
2261 if (player)
2262 {
2263 if (player->GetGuildId() != 0)
2264 return false;
2265 }
2266 else if (sCharacterCache->GetCharacterGuildIdByGuid(guid) != 0)
2267 return false;
2268
2269 // Remove all player signs from another petitions
2270 // This will be prevent attempt to join many guilds and corrupt guild data integrity
2272
2273 ObjectGuid::LowType lowguid = guid.GetCounter();
2274
2275 // If rank was not passed, assign lowest possible rank
2276 if (rankId == GUILD_RANK_NONE)
2277 rankId = _GetLowestRankId();
2278
2279 auto [memberIt, isNew] = m_members.try_emplace(lowguid, m_id, guid, rankId);
2280 if (!isNew)
2281 {
2282 LOG_ERROR("guild", "Tried to add {} to guild '{}'. Member already exists.", guid.ToString(), m_name);
2283 return false;
2284 }
2285
2286 Member& member = memberIt->second;
2287 std::string name;
2288 if (player)
2289 {
2290 player->SetInGuild(m_id);
2291 player->SetGuildIdInvited(0);
2292 player->SetRank(rankId);
2293 member.SetStats(player);
2294 SendLoginInfo(player->GetSession());
2295 name = player->GetName();
2296 }
2297 else
2298 {
2299 member.ResetFlags();
2300
2301 bool ok = false;
2302 // xinef: sync query
2303 // Player must exist
2305 stmt->SetData(0, guid.GetCounter());
2306 if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
2307 {
2308 Field* fields = result->Fetch();
2309 name = fields[0].Get<std::string>();
2310 member.SetStats(
2311 name,
2312 fields[1].Get<uint8>(),
2313 fields[2].Get<uint8>(),
2314 fields[3].Get<uint8>(),
2315 fields[4].Get<uint16>(),
2316 fields[5].Get<uint32>());
2317
2318 ok = member.CheckStats();
2319 }
2320 if (!ok)
2321 {
2322 m_members.erase(memberIt);
2323 return false;
2324 }
2325 sCharacterCache->UpdateCharacterGuildId(guid, m_id);
2326 }
2327
2328 CharacterDatabaseTransaction trans(nullptr);
2329 member.SaveToDB(trans);
2330
2333 _BroadcastEvent(GE_JOINED, guid, name);
2334
2335 // Call scripts if member was succesfully added (and stored to database)
2336 sScriptMgr->OnGuildAddMember(this, player, rankId);
2337
2338 return true;
2339}
#define sCharacterCache
Definition CharacterCache.h:88
@ CHAR_SEL_CHAR_DATA_FOR_GUILD
Definition CharacterDatabase.h:182
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition DatabaseEnvFwd.h:45
std::uint16_t uint16
Definition Define.h:108
@ GE_JOINED
Definition Guild.h:150
@ GUILD_RANK_NONE
Definition Guild.h:47
@ GUILD_EVENT_LOG_JOIN_GUILD
Definition Guild.h:211
#define LOG_ERROR(filterType__,...)
Definition Log.h:145
Class used to access individual fields of database query result.
Definition Field.h:99
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition Field.h:113
void SendLoginInfo(WorldSession *session)
Definition Guild.cpp:1943
std::string m_name
Definition Guild.h:797
void _UpdateAccountsNumber()
Definition Guild.cpp:2517
void _BroadcastEvent(GuildEvents guildEvent, ObjectGuid guid=ObjectGuid::Empty, Optional< std::string_view > param1={}, Optional< std::string_view > param2={}, Optional< std::string_view > param3={}) const
Definition Guild.cpp:2889
void _LogEvent(GuildEventLogTypes eventType, ObjectGuid playerGuid1, ObjectGuid playerGuid2=ObjectGuid::Empty, uint8 newRank=0)
Definition Guild.cpp:2697
uint8 _GetLowestRankId() const
Definition Guild.h:827
std::string ToString() const
Definition ObjectGuid.cpp:49
uint32 LowType
Definition ObjectGuid.h:125
void SetGuildIdInvited(uint32 GuildId)
Definition Player.h:1929
uint32 GetGuildId() const
Definition Player.h:1930
WorldSession * GetSession() const
Definition Player.h:2032
void SetInGuild(uint32 GuildId)
Definition Player.h:1921
void SetRank(uint8 rankId)
Definition Player.h:1927
static void RemovePetitionsAndSigns(ObjectGuid guid, uint32 type)
Definition Player.cpp:10305
@ GUILD_CHARTER_TYPE
Definition WorldSession.h:287
Player * FindConnectedPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:281

References _BroadcastEvent(), _GetLowestRankId(), _LogEvent(), _UpdateAccountsNumber(), CHAR_SEL_CHAR_DATA_FOR_GUILD, CharacterDatabase, Guild::Member::CheckStats(), ObjectAccessor::FindConnectedPlayer(), GE_JOINED, Field::Get(), ObjectGuid::GetCounter(), Player::GetGuildId(), WorldObject::GetName(), Player::GetSession(), GUILD_CHARTER_TYPE, GUILD_EVENT_LOG_JOIN_GUILD, GUILD_RANK_NONE, LOG_ERROR, m_id, m_members, m_name, Player::RemovePetitionsAndSigns(), Guild::Member::ResetFlags(), Guild::Member::SaveToDB(), sCharacterCache, SendLoginInfo(), PreparedStatementBase::SetData(), Player::SetGuildIdInvited(), Player::SetInGuild(), Player::SetRank(), Guild::Member::SetStats(), sScriptMgr, and ObjectGuid::ToString().

Referenced by Create(), HandleAcceptMember(), guild_commandscript::HandleGuildInviteCommand(), and WorldSession::HandleTurnInPetitionOpcode().

◆ BroadcastPacket()

void Guild::BroadcastPacket ( WorldPacket const *  packet) const
2218{
2219 for (auto const& [guid, member] : m_members)
2220 if (Player* player = member.FindPlayer())
2221 player->SendDirectMessage(packet);
2222}
Player * FindPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:269

References m_members.

Referenced by _BroadcastEvent(), and Guild::BankTab::SendText().

◆ BroadcastPacketToRank()

void Guild::BroadcastPacketToRank ( WorldPacket const *  packet,
uint8  rankId 
) const
2210{
2211 for (auto const& [guid, member] : m_members)
2212 if (member.IsRank(rankId))
2213 if (Player* player = member.FindPlayer())
2214 player->SendDirectMessage(packet);
2215}

References m_members.

◆ BroadcastToGuild()

void Guild::BroadcastToGuild ( WorldSession *  session,
bool  officerOnly,
std::string_view  msg,
uint32  language = LANG_UNIVERSAL 
) const
2197{
2198 if (session && session->GetPlayer() && _HasRankRight(session->GetPlayer(), officerOnly ? GR_RIGHT_OFFCHATSPEAK : GR_RIGHT_GCHATSPEAK))
2199 {
2200 WorldPacket data;
2201 ChatHandler::BuildChatPacket(data, officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, Language(language), session->GetPlayer(), nullptr, msg);
2202 for (auto const& [guid, member] : m_members)
2203 if (Player* player = member.FindPlayer())
2204 if (_HasRankRight(player, officerOnly ? GR_RIGHT_OFFCHATLISTEN : GR_RIGHT_GCHATLISTEN) && !player->GetSocial()->HasIgnore(session->GetPlayer()->GetGUID()))
2205 player->SendDirectMessage(&data);
2206 }
2207}
@ GR_RIGHT_OFFCHATSPEAK
Definition Guild.h:80
@ GR_RIGHT_OFFCHATLISTEN
Definition Guild.h:79
@ CHAT_MSG_GUILD
Definition SharedDefines.h:3389
@ CHAT_MSG_OFFICER
Definition SharedDefines.h:3390
Language
Definition SharedDefines.h:722
static std::size_t BuildChatPacket(WorldPacket &data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, std::string const &senderName="", std::string const &receiverName="", uint32 achievementId=0, bool gmMessage=false, std::string const &channelName="")
Definition Chat.cpp:273
bool _HasRankRight(Player *player, uint32 right) const
Definition Guild.h:819
Definition WorldPacket.h:26
Player * GetPlayer(Map const *, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:244

References _HasRankRight(), ChatHandler::BuildChatPacket(), CHAT_MSG_GUILD, CHAT_MSG_OFFICER, Object::GetGUID(), WorldSession::GetPlayer(), GR_RIGHT_GCHATLISTEN, GR_RIGHT_GCHATSPEAK, GR_RIGHT_OFFCHATLISTEN, GR_RIGHT_OFFCHATSPEAK, and m_members.

◆ BroadcastWorker()

template<class Do >
void Guild::BroadcastWorker ( Do &  _do,
Player *  except = nullptr 
)
inline
760 {
761 for (auto const& m_member : m_members)
762 if (Player* player = m_member.second.FindPlayer())
763 if (player != except)
764 _do(player);
765 }

References m_members.

Referenced by AchievementMgr::SendAchievementEarned().

◆ ChangeMemberRank()

bool Guild::ChangeMemberRank ( ObjectGuid  guid,
uint8  newRank 
)
2403{
2404 if (newRank <= _GetLowestRankId()) // Validate rank (allow only existing ranks)
2405 if (Member* member = GetMember(guid))
2406 {
2407 member->ChangeRank(newRank);
2408
2409 if (newRank == GR_GUILDMASTER)
2410 {
2411 m_leaderGuid = guid;
2412
2414 stmt->SetData(0, m_leaderGuid.GetCounter());
2415 stmt->SetData(1, m_id);
2416 CharacterDatabase.Execute(stmt);
2417 }
2418
2419 return true;
2420 }
2421 return false;
2422}

References _GetLowestRankId(), CHAR_UPD_GUILD_LEADER, CharacterDatabase, ObjectGuid::GetCounter(), GetMember(), GR_GUILDMASTER, m_id, m_leaderGuid, and PreparedStatementBase::SetData().

Referenced by guild_commandscript::HandleGuildRankCommand().

◆ Create()

bool Guild::Create ( Player *  pLeader,
std::string_view  name 
)
1058{
1059 // Check if guild with such name already exists
1060 if (sGuildMgr->GetGuildByName(name))
1061 return false;
1062
1063 WorldSession* pLeaderSession = pLeader->GetSession();
1064 if (!pLeaderSession)
1065 return false;
1066
1067 m_id = sGuildMgr->GenerateGuildId();
1068 m_leaderGuid = pLeader->GetGUID();
1069 m_name = name;
1070 m_info = "";
1071 m_motd = "No message set.";
1072 m_bankMoney = 0;
1074
1075 LOG_DEBUG("guild", "GUILD: creating guild [{}] for leader {} ({})",
1076 m_name, pLeader->GetName(), m_leaderGuid.ToString());
1077
1078 // Nothing to delete first: a new id is MAX(guildid) + 1, never reused while running, and
1079 // orphaned rows are removed at startup. A DELETE here could run after AddMember()'s INSERT.
1080 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1081
1082 uint8 index = 0;
1084 stmt->SetData( index, m_id);
1085 stmt->SetData(++index, m_name);
1086 stmt->SetData(++index, m_leaderGuid.GetCounter());
1087 stmt->SetData(++index, m_info);
1088 stmt->SetData(++index, m_motd);
1089 stmt->SetData(++index, uint32(m_createdDate));
1090 stmt->SetData(++index, m_emblemInfo.GetStyle());
1091 stmt->SetData(++index, m_emblemInfo.GetColor());
1092 stmt->SetData(++index, m_emblemInfo.GetBorderStyle());
1093 stmt->SetData(++index, m_emblemInfo.GetBorderColor());
1094 stmt->SetData(++index, m_emblemInfo.GetBackgroundColor());
1095 stmt->SetData(++index, m_bankMoney);
1096 trans->Append(stmt);
1097
1098 _CreateDefaultGuildRanks(trans, pLeaderSession->GetSessionDbLocaleIndex()); // Create default ranks
1099 CharacterDatabase.CommitTransaction(trans);
1100 bool ret = AddMember(m_leaderGuid, GR_GUILDMASTER); // Add guildmaster
1101
1102 for (short i = 0; i < static_cast<short>(sWorld->getIntConfig(CONFIG_GUILD_BANK_INITIAL_TABS)); i++)
1103 {
1105 }
1106
1107 if (ret)
1108 sScriptMgr->OnGuildCreate(this, pLeader, m_name);
1109
1110 return ret;
1111}
@ CHAR_INS_GUILD
Definition CharacterDatabase.h:141
#define sGuildMgr
Definition GuildMgr.h:51
@ CONFIG_GUILD_BANK_INITIAL_TABS
Definition WorldConfig.h:376
uint32 GetStyle() const
Definition Guild.h:250
uint32 GetColor() const
Definition Guild.h:251
uint32 GetBackgroundColor() const
Definition Guild.h:254
uint32 GetBorderStyle() const
Definition Guild.h:252
uint32 GetBorderColor() const
Definition Guild.h:253
void _CreateNewBankTab()
Definition Guild.cpp:2463
bool AddMember(ObjectGuid guid, uint8 rankId=GUILD_RANK_NONE)
Definition Guild.cpp:2257
std::string m_motd
Definition Guild.h:799
EmblemInfo m_emblemInfo
Definition Guild.h:803
void _CreateDefaultGuildRanks(CharacterDatabaseTransaction trans, LocaleConstant loc)
Definition Guild.cpp:2489
std::string m_info
Definition Guild.h:800
Player session in the World.
Definition WorldSession.h:430
LocaleConstant GetSessionDbLocaleIndex() const
Definition WorldSession.h:647
#define sWorld
Definition World.h:337
Seconds GetGameTime()
Definition GameTime.cpp:39

References _CreateDefaultGuildRanks(), _CreateNewBankTab(), AddMember(), CHAR_INS_GUILD, CharacterDatabase, CONFIG_GUILD_BANK_INITIAL_TABS, EmblemInfo::GetBackgroundColor(), EmblemInfo::GetBorderColor(), EmblemInfo::GetBorderStyle(), EmblemInfo::GetColor(), ObjectGuid::GetCounter(), GameTime::GetGameTime(), Object::GetGUID(), WorldObject::GetName(), Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), EmblemInfo::GetStyle(), GR_GUILDMASTER, LOG_DEBUG, m_bankMoney, m_createdDate, m_emblemInfo, m_id, m_info, m_leaderGuid, m_motd, m_name, PreparedStatementBase::SetData(), sGuildMgr, sScriptMgr, sWorld, and ObjectGuid::ToString().

Referenced by guild_commandscript::HandleGuildCreateCommand(), and WorldSession::HandleTurnInPetitionOpcode().

◆ DeleteMember()

void Guild::DeleteMember ( ObjectGuid  guid,
bool  isDisbanding = false,
bool  isKicked = false,
bool  canDeleteGuild = false 
)
2342{
2343 ObjectGuid::LowType lowguid = guid.GetCounter();
2345
2346 // Guild master can be deleted when loading guild and guid doesn't exist in characters table
2347 // or when he is removed from guild by gm command
2348 if (m_leaderGuid == guid && !isDisbanding)
2349 {
2350 Member* oldLeader = nullptr;
2351 Member* newLeader = nullptr;
2352 for (auto& [guid, member] : m_members)
2353 {
2354 if (guid == lowguid)
2355 oldLeader = &member;
2356 else if (!newLeader || newLeader->GetRankId() > member.GetRankId())
2357 newLeader = &member;
2358 }
2359
2360 if (!newLeader)
2361 {
2362 Disband();
2363 if (canDeleteGuild)
2364 delete this;
2365 return;
2366 }
2367
2368 _SetLeaderGUID(*newLeader);
2369
2370 // If player not online data in data field will be loaded from guild tabs no need to update it !!
2371 if (Player* newLeaderPlayer = newLeader->FindPlayer())
2372 newLeaderPlayer->SetRank(GR_GUILDMASTER);
2373
2374 // If leader does not exist (at guild loading with deleted leader) do not send broadcasts
2375 if (oldLeader)
2376 {
2377 _BroadcastEvent(GE_LEADER_CHANGED, ObjectGuid::Empty, oldLeader->GetName(), newLeader->GetName());
2378 _BroadcastEvent(GE_LEFT, guid, oldLeader->GetName());
2379 }
2380 }
2381 // Call script on remove before member is actually removed from guild (and database)
2382 sScriptMgr->OnGuildRemoveMember(this, player, isDisbanding, isKicked);
2383
2384 m_members.erase(lowguid);
2385
2386 // If player not online data in data field will be loaded from guild tabs no need to update it !!
2387 if (player)
2388 {
2389 player->SetInGuild(0);
2390 player->SetRank(0);
2391 }
2392 else
2393 {
2394 sCharacterCache->UpdateCharacterGuildId(guid, 0);
2395 }
2396
2398 if (!isDisbanding)
2400}
@ GE_LEFT
Definition Guild.h:151
@ GE_LEADER_CHANGED
Definition Guild.h:154
void _SetLeaderGUID(Member &pLeader)
Definition Guild.cpp:2567
void Disband()
Definition Guild.cpp:1114
void _DeleteMemberFromDB(ObjectGuid::LowType lowguid) const
Definition Guild.h:833
static ObjectGuid const Empty
Definition ObjectGuid.h:123

References _BroadcastEvent(), _DeleteMemberFromDB(), _SetLeaderGUID(), _UpdateAccountsNumber(), Disband(), ObjectGuid::Empty, ObjectAccessor::FindConnectedPlayer(), Guild::Member::FindPlayer(), GE_LEADER_CHANGED, GE_LEFT, ObjectGuid::GetCounter(), Guild::Member::GetName(), Guild::Member::GetRankId(), GR_GUILDMASTER, m_leaderGuid, m_members, sCharacterCache, Player::SetInGuild(), Player::SetRank(), and sScriptMgr.

Referenced by Disband(), guild_commandscript::HandleGuildUninviteCommand(), HandleLeaveMember(), HandleRemoveMember(), and Validate().

◆ Disband()

void Guild::Disband ( )
1115{
1116 // Call scripts before guild data removed from database
1117 sScriptMgr->OnGuildDisband(this);
1118
1120 // Remove all members
1121 while (!m_members.empty())
1122 {
1123 auto itr = m_members.begin();
1124 DeleteMember(itr->second.GetGUID(), true);
1125 }
1126
1127 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1128
1130 stmt->SetData(0, m_id);
1131 trans->Append(stmt);
1132
1133 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_RANKS);
1134 stmt->SetData(0, m_id);
1135 trans->Append(stmt);
1136
1137 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_TABS);
1138 stmt->SetData(0, m_id);
1139 trans->Append(stmt);
1140
1141 // Free bank tab used memory and delete items stored in them
1142 _DeleteBankItems(trans, true);
1143
1144 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_ITEMS);
1145 stmt->SetData(0, m_id);
1146 trans->Append(stmt);
1147
1148 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_RIGHTS);
1149 stmt->SetData(0, m_id);
1150 trans->Append(stmt);
1151
1152 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_EVENTLOGS);
1153 stmt->SetData(0, m_id);
1154 trans->Append(stmt);
1155
1156 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_EVENTLOGS);
1157 stmt->SetData(0, m_id);
1158 trans->Append(stmt);
1159
1160 CharacterDatabase.CommitTransaction(trans);
1161 sGuildMgr->RemoveGuild(m_id);
1162}
@ CHAR_DEL_GUILD_BANK_TABS
Definition CharacterDatabase.h:153
@ CHAR_DEL_GUILD
Definition CharacterDatabase.h:142
@ CHAR_DEL_GUILD_BANK_RIGHTS
Definition CharacterDatabase.h:158
@ CHAR_DEL_GUILD_BANK_EVENTLOGS
Definition CharacterDatabase.h:162
@ CHAR_DEL_GUILD_BANK_ITEMS
Definition CharacterDatabase.h:156
@ CHAR_DEL_GUILD_EVENTLOGS
Definition CharacterDatabase.h:165
@ CHAR_DEL_GUILD_RANKS
Definition CharacterDatabase.h:149
@ GE_DISBANDED
Definition Guild.h:155
void DeleteMember(ObjectGuid guid, bool isDisbanding=false, bool isKicked=false, bool canDeleteGuild=false)
Definition Guild.cpp:2341

References _BroadcastEvent(), _DeleteBankItems(), CHAR_DEL_GUILD, CHAR_DEL_GUILD_BANK_EVENTLOGS, CHAR_DEL_GUILD_BANK_ITEMS, CHAR_DEL_GUILD_BANK_RIGHTS, CHAR_DEL_GUILD_BANK_TABS, CHAR_DEL_GUILD_EVENTLOGS, CHAR_DEL_GUILD_RANKS, CharacterDatabase, DeleteMember(), GE_DISBANDED, m_id, m_members, PreparedStatementBase::SetData(), sGuildMgr, and sScriptMgr.

Referenced by DeleteMember(), HandleDisband(), guild_commandscript::HandleGuildDeleteCommand(), HandleLeaveMember(), and Validate().

◆ GetBankTab() [1/2]

BankTab * Guild::GetBankTab ( uint8  tabId)
inlineprivate
830{ return tabId < m_bankTabs.size() ? &m_bankTabs[tabId] : nullptr; }

References m_bankTabs.

Referenced by _GetItem(), _RemoveItem(), _SendBankList(), HandleSetBankTabInfo(), SendBankTabText(), and SetBankTabText().

◆ GetBankTab() [2/2]

BankTab const * Guild::GetBankTab ( uint8  tabId) const
inlineprivate
831{ return tabId < m_bankTabs.size() ? &m_bankTabs[tabId] : nullptr; }

References m_bankTabs.

◆ GetCreatedDate()

time_t Guild::GetCreatedDate ( ) const
inline

◆ GetId()

◆ GetInfo()

std::string const & Guild::GetInfo ( ) const
inline
693{ return m_info; }

References m_info.

Referenced by guild_commandscript::HandleGuildInfoCommand().

◆ GetLeaderGUID()

◆ GetMember() [1/3]

Member * Guild::GetMember ( ObjectGuid  guid)
inline
390 {
391 auto itr = m_members.find(guid.GetCounter());
392 return (itr != m_members.end()) ? &itr->second : nullptr;
393 }

References ObjectGuid::GetCounter(), and m_members.

◆ GetMember() [2/3]

◆ GetMember() [3/3]

Member * Guild::GetMember ( std::string_view  name)
inline
395 {
396 for (auto& m_member : m_members)
397 if (m_member.second.GetName() == name)
398 return &m_member.second;
399
400 return nullptr;
401 }
std::string const & GetName() const
Definition Guild.h:691

References m_members.

◆ GetMemberCount()

uint32 Guild::GetMemberCount ( ) const
inline

◆ GetMemberSize()

uint32 Guild::GetMemberSize ( ) const
inline
788{ return m_members.size(); }

References m_members.

◆ GetMOTD()

std::string const & Guild::GetMOTD ( ) const
inline
692{ return m_motd; }

References m_motd.

Referenced by guild_commandscript::HandleGuildInfoCommand().

◆ GetName()

◆ GetRankInfo() [1/2]

RankInfo * Guild::GetRankInfo ( uint8  rankId)
inlineprivate
818{ return rankId < _GetRanksSize() ? &m_ranks[rankId] : nullptr; }

References _GetRanksSize(), and m_ranks.

◆ GetRankInfo() [2/2]

◆ GetRankRights()

uint32 Guild::GetRankRights ( uint8  rankId) const
2687{
2688 return _GetRankRights(rankId);
2689}

References _GetRankRights().

◆ GetTotalBankMoney()

uint64 Guild::GetTotalBankMoney ( ) const
inline

◆ GetUnorderedMembers()

std::unordered_map< uint32, Member > const & Guild::GetUnorderedMembers ( ) const
inline
789{ return m_members; }

References m_members.

◆ HandleAcceptMember()

void Guild::HandleAcceptMember ( WorldSession *  session)
1536{
1537 Player* player = session->GetPlayer();
1538 if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && player->GetTeamId() != sCharacterCache->GetCharacterTeamByGuid(GetLeaderGUID()))
1539 {
1540 return;
1541 }
1542
1543 AddMember(player->GetGUID());
1544}
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD
Definition WorldConfig.h:36
ObjectGuid GetLeaderGUID() const
Definition Guild.h:690
TeamId GetTeamId(bool original=false) const
Definition Player.h:2140

References AddMember(), CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD, Object::GetGUID(), GetLeaderGUID(), WorldSession::GetPlayer(), Player::GetTeamId(), sCharacterCache, and sWorld.

◆ HandleAddNewRank()

void Guild::HandleAddNewRank ( WorldSession *  session,
std::string_view  name 
)
1665{
1666 uint8 size = _GetRanksSize();
1667 if (size >= GUILD_RANKS_MAX_COUNT)
1668 return;
1669
1670 // Only leader can add new rank
1671 if (_IsLeader(session->GetPlayer()))
1672 {
1673 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1675 {
1676 CharacterDatabase.CommitTransaction(trans);
1677 _BroadcastEvent(GE_RANK_UPDATED, ObjectGuid::Empty, std::to_string(size), name, std::to_string(m_ranks.size()));
1678 }
1679 }
1680}
@ GE_RANK_UPDATED
Definition Guild.h:157
bool _IsLeader(Player *player) const
Definition Guild.cpp:2530

References _BroadcastEvent(), _CreateRank(), _GetRanksSize(), _IsLeader(), CharacterDatabase, ObjectGuid::Empty, GE_RANK_UPDATED, WorldSession::GetPlayer(), GR_RIGHT_GCHATLISTEN, GR_RIGHT_GCHATSPEAK, GUILD_RANKS_MAX_COUNT, and m_ranks.

◆ HandleBuyBankTab()

void Guild::HandleBuyBankTab ( WorldSession *  session,
uint8  tabId 
)

Hack to force client to update permissions

1444{
1445 Player* player = session->GetPlayer();
1446 if (!player)
1447 return;
1448
1449 Member const* member = GetMember(player->GetGUID());
1450 if (!member)
1451 return;
1452
1454 return;
1455
1456 if (tabId != _GetPurchasedTabsSize())
1457 return;
1458
1459 uint32 tabCost = _GetGuildBankTabPrice(tabId);
1460 if (!tabCost)
1461 return;
1462
1463 if (!player->HasEnoughMoney(tabCost)) // Should not happen, this is checked by client
1464 return;
1465
1466 player->ModifyMoney(-int32(tabCost));
1467
1470 SendPermissions(session);
1471}
uint32 _GetGuildBankTabPrice(uint8 tabId)
Definition Guild.cpp:94
@ GE_BANK_TAB_PURCHASED
Definition Guild.h:162
void SendPermissions(WorldSession *session)
Definition Guild.cpp:1899
bool ModifyMoney(int32 amount, bool sendError=true)
Definition Player.cpp:11711
bool HasEnoughMoney(uint32 amount) const
Definition Player.h:1633

References _BroadcastEvent(), _CreateNewBankTab(), _GetGuildBankTabPrice(), _GetPurchasedTabsSize(), GE_BANK_TAB_PURCHASED, Object::GetGUID(), GetMember(), WorldSession::GetPlayer(), GUILD_BANK_MAX_TABS, Player::HasEnoughMoney(), Player::ModifyMoney(), and SendPermissions().

◆ HandleDisband()

void Guild::HandleDisband ( WorldSession *  session)
1820{
1821 // Only leader can disband guild
1822 if (_IsLeader(session->GetPlayer()))
1823 {
1824 Disband();
1825 LOG_DEBUG("guild", "Guild Successfully Disbanded");
1826 delete this;
1827 }
1828}

References _IsLeader(), Disband(), WorldSession::GetPlayer(), and LOG_DEBUG.

◆ HandleInviteMember()

void Guild::HandleInviteMember ( WorldSession *  session,
std::string const &  name 
)
1474{
1475 Player* pInvitee = ObjectAccessor::FindPlayerByName(name, false);
1476 if (!pInvitee)
1477 {
1479 return;
1480 }
1481
1482 Player* player = session->GetPlayer();
1483 // Do not show invitations from ignored players
1484 if (pInvitee->GetSocial()->HasIgnore(player->GetGUID()))
1485 return;
1486
1487 uint32 memberLimit = sWorld->getIntConfig(CONFIG_GUILD_MEMBER_LIMIT);
1488 if (memberLimit > 0 && player->GetGuild()->GetMemberCount() >= memberLimit)
1489 {
1490 ChatHandler(player->GetSession()).PSendSysMessage("Your guild has reached the maximum amount of members ({}). You cannot send another invite until the guild member count is lower.", memberLimit);
1492 return;
1493 }
1494
1495 if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && pInvitee->GetTeamId(true) != player->GetTeamId(true))
1496 {
1498 return;
1499 }
1500 // Invited player cannot be in another guild
1501 if (pInvitee->GetGuildId())
1502 {
1504 return;
1505 }
1506 // Invited player cannot be invited
1507 if (pInvitee->GetGuildIdInvited())
1508 {
1510 return;
1511 }
1512 // Inviting player must have rights to invite
1513 if (!_HasRankRight(player, GR_RIGHT_INVITE))
1514 {
1516 return;
1517 }
1518
1520
1521 LOG_DEBUG("guild", "Player {} invited {} to join his Guild", player->GetName(), pInvitee->GetName());
1522
1523 pInvitee->SetGuildIdInvited(m_id);
1524 _LogEvent(GUILD_EVENT_LOG_INVITE_PLAYER, player->GetGUID(), pInvitee->GetGUID());
1525
1527
1528 invite.InviterName = player->GetName();
1529 invite.GuildName = GetName();
1530
1531 pInvitee->SendDirectMessage(invite.Write());
1532 LOG_DEBUG("guild", "SMSG_GUILD_INVITE [{}]", pInvitee->GetName());
1533}
@ GUILD_COMMAND_INVITE
Definition Guild.h:100
@ ERR_GUILD_PERMISSIONS
Definition Guild.h:128
@ ERR_ALREADY_IN_GUILD_S
Definition Guild.h:122
@ ERR_GUILD_COMMAND_SUCCESS
Definition Guild.h:119
@ ERR_GUILD_NOT_ALLIED
Definition Guild.h:132
@ ERR_GUILD_INTERNAL
Definition Guild.h:120
@ ERR_GUILD_PLAYER_NOT_FOUND_S
Definition Guild.h:131
@ ERR_ALREADY_INVITED_TO_GUILD_S
Definition Guild.h:124
@ GR_RIGHT_INVITE
Definition Guild.h:81
@ GUILD_EVENT_LOG_INVITE_PLAYER
Definition Guild.h:210
@ CONFIG_GUILD_MEMBER_LIMIT
Definition WorldConfig.h:383
Definition Chat.h:37
void PSendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition Chat.cpp:219
uint32 GetMemberCount() const
Definition Guild.h:779
static void SendCommandResult(WorldSession *session, GuildCommandType type, GuildCommandError errCode, std::string_view param={})
Definition Guild.cpp:115
bool HasIgnore(ObjectGuid const &ignore_guid) const
Definition SocialMgr.cpp:194
uint32 GetGuildIdInvited()
Definition Player.h:1932
Guild * GetGuild() const
Definition Player.cpp:16441
PlayerSocial * GetSocial()
Definition Player.h:1158
Definition GuildPackets.h:192
WorldPacket const * Write() override
Definition GuildPackets.cpp:95
std::string InviterName
Definition GuildPackets.h:198
std::string GuildName
Definition GuildPackets.h:199
Player * FindPlayerByName(std::string const &name, bool checkInWorld=true)
Definition ObjectAccessor.cpp:295

References _HasRankRight(), _LogEvent(), CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD, CONFIG_GUILD_MEMBER_LIMIT, ERR_ALREADY_IN_GUILD_S, ERR_ALREADY_INVITED_TO_GUILD_S, ERR_GUILD_COMMAND_SUCCESS, ERR_GUILD_INTERNAL, ERR_GUILD_NOT_ALLIED, ERR_GUILD_PERMISSIONS, ERR_GUILD_PLAYER_NOT_FOUND_S, ObjectAccessor::FindPlayerByName(), Object::GetGUID(), Player::GetGuild(), Player::GetGuildId(), Player::GetGuildIdInvited(), GetMemberCount(), WorldObject::GetName(), GetName(), WorldSession::GetPlayer(), Player::GetSession(), Player::GetSocial(), Player::GetTeamId(), GR_RIGHT_INVITE, GUILD_COMMAND_INVITE, GUILD_EVENT_LOG_INVITE_PLAYER, WorldPackets::Guild::GuildInvite::GuildName, PlayerSocial::HasIgnore(), WorldPackets::Guild::GuildInvite::InviterName, LOG_DEBUG, m_id, ChatHandler::PSendSysMessage(), SendCommandResult(), Player::SendDirectMessage(), Player::SetGuildIdInvited(), sWorld, and WorldPackets::Guild::GuildInvite::Write().

◆ HandleLeaveMember()

void Guild::HandleLeaveMember ( WorldSession *  session)
1547{
1548 Player* player = session->GetPlayer();
1549 bool disband = false;
1550
1551 // If leader is leaving
1552 if (_IsLeader(player))
1553 {
1554 if (m_members.size() > 1)
1555 // Leader cannot leave if he is not the last member
1557 else
1558 {
1559 // Guild is disbanded if leader leaves.
1560 Disband();
1561 disband = true;
1562 }
1563 }
1564 else
1565 {
1566 DeleteMember(player->GetGUID(), false, false);
1567
1569 _BroadcastEvent(GE_LEFT, player->GetGUID(), player->GetName());
1570
1572 }
1573
1574 sCalendarMgr->RemovePlayerGuildEventsAndSignups(player->GetGUID(), GetId());
1575
1576 if (disband)
1577 delete this;
1578}
#define sCalendarMgr
Definition CalendarMgr.h:344
@ GUILD_COMMAND_QUIT
Definition Guild.h:101
@ ERR_GUILD_LEADER_LEAVE
Definition Guild.h:127
@ GUILD_EVENT_LOG_LEAVE_GUILD
Definition Guild.h:215
uint32 GetId() const
Definition Guild.h:689

References _BroadcastEvent(), _IsLeader(), _LogEvent(), DeleteMember(), Disband(), ERR_GUILD_COMMAND_SUCCESS, ERR_GUILD_LEADER_LEAVE, GE_LEFT, Object::GetGUID(), GetId(), WorldObject::GetName(), WorldSession::GetPlayer(), GUILD_COMMAND_QUIT, GUILD_EVENT_LOG_LEAVE_GUILD, m_members, m_name, sCalendarMgr, and SendCommandResult().

◆ HandleMemberDepositMoney()

void Guild::HandleMemberDepositMoney ( WorldSession *  session,
uint32  amount 
)
1711{
1712 Player* player = session->GetPlayer();
1713
1714 // Call script after validation and before money transfer.
1715 sScriptMgr->OnGuildMemberDepositMoney(this, player, amount);
1716
1717 if (m_bankMoney > GUILD_BANK_MONEY_LIMIT - amount)
1718 {
1720 return;
1721 }
1722
1723 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1724 _ModifyBankMoney(trans, amount, true);
1725
1726 player->ModifyMoney(-int32(amount));
1727 player->SaveGoldToDB(trans);
1728 _LogBankEvent(trans, GUILD_BANK_LOG_DEPOSIT_MONEY, uint8(0), player->GetGUID(), amount);
1729
1730 CharacterDatabase.CommitTransaction(trans);
1731
1733 {
1734 LOG_GM(session->GetAccountId(), "GM {} (Account: {}) deposited {} to guild bank (Guild: {} GuildId: {})",
1735 player->GetName(), session->GetAccountId(), amount, GetName(), GetId());
1736 }
1737
1738 std::string aux = Acore::Impl::ByteArrayToHexStr(reinterpret_cast<uint8*>(&m_bankMoney), 8, true);
1740
1741 if (amount > 10 * GOLD) // receiver_acc = Guild id, receiver_name = Guild name
1742 CharacterDatabase.Execute("INSERT INTO log_money VALUES({}, {}, \"{}\", \"{}\", {}, \"{}\", {}, \"(guild members: {}, new amount: {}, leader guid low: {}, sender level: {})\", NOW(), {})",
1743 session->GetAccountId(), player->GetGUID().GetCounter(), player->GetName(), session->GetRemoteAddress(), GetId(), GetName(), amount, GetMemberCount(), GetTotalBankMoney(), GetLeaderGUID().GetCounter(), player->GetLevel(), 3);
1744}
@ GE_BANK_MONEY_SET
Definition Guild.h:164
constexpr uint64 GUILD_BANK_MONEY_LIMIT
Definition Guild.h:54
@ GUILD_COMMAND_MOVE_ITEM
Definition Guild.h:113
@ ERR_GUILD_BANK_FULL
Definition Guild.h:141
@ GUILD_BANK_LOG_DEPOSIT_MONEY
Definition Guild.h:200
#define LOG_GM(accountId__,...)
Definition Log.h:164
@ GOLD
Definition SharedDefines.h:241
bool _ModifyBankMoney(CharacterDatabaseTransaction trans, uint64 amount, bool add)
Definition Guild.cpp:2548
void _LogBankEvent(CharacterDatabaseTransaction trans, GuildBankEventLogTypes eventType, uint8 tabId, ObjectGuid playerGuid, uint32 itemOrMoney, uint16 itemStackCount=0, uint8 destTabId=0)
Definition Guild.cpp:2707
uint64 GetTotalBankMoney() const
Definition Guild.h:778
void SaveGoldToDB(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7327
uint8 GetLevel() const
Definition Unit.h:1117
bool HasPermission(uint32 permissionId)
Definition WorldSession.cpp:1701
uint32 GetAccountId() const
Definition WorldSession.h:502
std::string const & GetRemoteAddress()
Definition WorldSession.h:512
AC_COMMON_API std::string ByteArrayToHexStr(uint8 const *bytes, std::size_t length, bool reverse=false)
Definition Util.cpp:545
@ RBAC_PERM_LOG_GM_TRADE
Definition RBAC.h:62

References _BroadcastEvent(), _LogBankEvent(), _ModifyBankMoney(), Acore::Impl::ByteArrayToHexStr(), CharacterDatabase, ObjectGuid::Empty, ERR_GUILD_BANK_FULL, GE_BANK_MONEY_SET, WorldSession::GetAccountId(), ObjectGuid::GetCounter(), Object::GetGUID(), GetId(), GetLeaderGUID(), Unit::GetLevel(), GetMemberCount(), WorldObject::GetName(), GetName(), WorldSession::GetPlayer(), WorldSession::GetRemoteAddress(), GetTotalBankMoney(), GOLD, GUILD_BANK_LOG_DEPOSIT_MONEY, GUILD_BANK_MONEY_LIMIT, GUILD_COMMAND_MOVE_ITEM, WorldSession::HasPermission(), LOG_GM, m_bankMoney, Player::ModifyMoney(), rbac::RBAC_PERM_LOG_GM_TRADE, Player::SaveGoldToDB(), SendCommandResult(), and sScriptMgr.

◆ HandleMemberLogout()

void Guild::HandleMemberLogout ( WorldSession *  session)
1808{
1809 Player* player = session->GetPlayer();
1810 if (Member* member = GetMember(player->GetGUID()))
1811 {
1812 member->SetStats(player);
1813 member->UpdateLogoutTime();
1814 member->ResetFlags();
1815 }
1816 _BroadcastEvent(GE_SIGNED_OFF, player->GetGUID(), player->GetName());
1817}
@ GE_SIGNED_OFF
Definition Guild.h:160

References _BroadcastEvent(), GE_SIGNED_OFF, Object::GetGUID(), GetMember(), WorldObject::GetName(), and WorldSession::GetPlayer().

◆ HandleMemberWithdrawMoney()

bool Guild::HandleMemberWithdrawMoney ( WorldSession *  session,
uint32  amount,
bool  repair = false 
)
1747{
1748 //clamp amount to MAX_MONEY_AMOUNT, Players can't hold more than that anyway
1749 amount = std::min(amount, uint32(MAX_MONEY_AMOUNT));
1750
1751 if (m_bankMoney < amount) // Not enough money in bank
1752 return false;
1753
1754 Player* player = session->GetPlayer();
1755
1756 Member* member = GetMember(player->GetGUID());
1757 if (!member)
1758 return false;
1759
1760 if (uint32(_GetMemberRemainingMoney(*member)) < amount) // Check if we have enough slot/money today
1761 return false;
1762
1763 if (!(_GetRankRights(member->GetRankId()) & GR_RIGHT_WITHDRAW_REPAIR) && repair)
1764 return false;
1765
1766 // Call script after validation and before money transfer.
1767 sScriptMgr->OnGuildMemberWitdrawMoney(this, player, amount, repair);
1768
1769 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1770
1771 if (!_ModifyBankMoney(trans, amount, false))
1772 return false;
1773
1774 if (!repair)
1775 {
1776 if (!player->ModifyMoney(amount))
1777 {
1778 _ModifyBankMoney(trans, amount, true);
1779 return false;
1780 }
1781
1782 player->SaveGoldToDB(trans);
1783 }
1784
1785 // Update remaining money amount
1786 member->UpdateBankWithdrawValue(trans, GUILD_BANK_MAX_TABS, amount);
1787
1788 // Log guild bank event
1789 _LogBankEvent(trans, repair ? GUILD_BANK_LOG_REPAIR_MONEY : GUILD_BANK_LOG_WITHDRAW_MONEY, uint8(0), player->GetGUID(), amount);
1790 CharacterDatabase.CommitTransaction(trans);
1791
1793 {
1794 LOG_GM(session->GetAccountId(), "GM {} (Account: {}) withdrew {} from guild bank (Guild: {} GuildId: {})",
1795 player->GetName(), session->GetAccountId(), amount, GetName(), GetId());
1796 }
1797
1798 if (amount > 10 * GOLD) // sender_acc = 0 (guild has no account), sender_guid = Guild id, sender_name = Guild name
1799 CharacterDatabase.Execute("INSERT INTO log_money VALUES({}, {}, \"{}\", \"{}\", {}, \"{}\", {}, \"(guild, members: {}, new amount: {}, leader guid low: {}, withdrawer level: {})\", NOW(), {})",
1800 0, GetId(), GetName(), session->GetRemoteAddress(), session->GetAccountId(), player->GetName(), amount, GetMemberCount(), GetTotalBankMoney(), GetLeaderGUID().GetCounter(), player->GetLevel(), 4);
1801
1802 std::string aux = Acore::Impl::ByteArrayToHexStr(reinterpret_cast<uint8*>(&m_bankMoney), 8, true);
1804 return true;
1805}
@ GUILD_BANK_LOG_WITHDRAW_MONEY
Definition Guild.h:201
@ GUILD_BANK_LOG_REPAIR_MONEY
Definition Guild.h:202
#define MAX_MONEY_AMOUNT
Definition Player.h:924
int32 _GetMemberRemainingMoney(Member const &member) const
Definition Guild.cpp:2643

References _BroadcastEvent(), _GetMemberRemainingMoney(), _GetRankRights(), _LogBankEvent(), _ModifyBankMoney(), Acore::Impl::ByteArrayToHexStr(), CharacterDatabase, ObjectGuid::Empty, GE_BANK_MONEY_SET, WorldSession::GetAccountId(), Object::GetGUID(), GetId(), GetLeaderGUID(), Unit::GetLevel(), GetMember(), GetMemberCount(), WorldObject::GetName(), GetName(), WorldSession::GetPlayer(), Guild::Member::GetRankId(), WorldSession::GetRemoteAddress(), GetTotalBankMoney(), GOLD, GR_RIGHT_WITHDRAW_REPAIR, GUILD_BANK_LOG_REPAIR_MONEY, GUILD_BANK_LOG_WITHDRAW_MONEY, GUILD_BANK_MAX_TABS, WorldSession::HasPermission(), LOG_GM, m_bankMoney, MAX_MONEY_AMOUNT, Player::ModifyMoney(), rbac::RBAC_PERM_LOG_GM_TRADE, Player::SaveGoldToDB(), sScriptMgr, and Guild::Member::UpdateBankWithdrawValue().

Referenced by Player::DurabilityRepair().

◆ HandleQuery()

void Guild::HandleQuery ( WorldSession *  session)
1257{
1259 response.GuildId = m_id;
1260
1266
1267 for (uint8 i = 0; i < _GetRanksSize(); ++i)
1268 response.Info.Ranks[i] = m_ranks[i].GetName();
1269
1270 response.Info.RankCount = _GetRanksSize();
1271
1272 response.Info.GuildName = m_name;
1273
1274 session->SendPacket(response.Write());
1275 LOG_DEBUG("guild", "SMSG_GUILD_QUERY_RESPONSE [{}]", session->GetPlayerInfo());
1276}
uint32 GuildId
Definition GuildPackets.h:62
GuildInfo Info
Definition GuildPackets.h:63
WorldPacket const * Write() override
Definition GuildPackets.cpp:28
uint32 EmblemColor
Definition GuildPackets.h:49
std::string GuildName
Definition GuildPackets.h:43
uint32 EmblemStyle
Definition GuildPackets.h:48
uint32 BackgroundColor
Definition GuildPackets.h:52
uint32 BorderColor
Definition GuildPackets.h:51
uint32 BorderStyle
Definition GuildPackets.h:50
uint32 RankCount
Definition GuildPackets.h:46
std::array< std::string, GUILD_RANKS_MAX_COUNT > Ranks
Definition GuildPackets.h:45

References _GetRanksSize(), WorldPackets::Guild::GuildInfo::BackgroundColor, WorldPackets::Guild::GuildInfo::BorderColor, WorldPackets::Guild::GuildInfo::BorderStyle, WorldPackets::Guild::GuildInfo::EmblemColor, WorldPackets::Guild::GuildInfo::EmblemStyle, EmblemInfo::GetBackgroundColor(), EmblemInfo::GetBorderColor(), EmblemInfo::GetBorderStyle(), EmblemInfo::GetColor(), WorldSession::GetPlayerInfo(), EmblemInfo::GetStyle(), WorldPackets::Guild::QueryGuildInfoResponse::GuildId, WorldPackets::Guild::GuildInfo::GuildName, WorldPackets::Guild::QueryGuildInfoResponse::Info, LOG_DEBUG, m_emblemInfo, m_id, m_name, m_ranks, WorldPackets::Guild::GuildInfo::RankCount, WorldPackets::Guild::GuildInfo::Ranks, WorldSession::SendPacket(), and WorldPackets::Guild::QueryGuildInfoResponse::Write().

Referenced by HandleSetEmblem().

◆ HandleRemoveLowestRank()

void Guild::HandleRemoveLowestRank ( WorldSession *  session)
1683{
1685}
void HandleRemoveRank(WorldSession *session, uint8 rankId)
Definition Guild.cpp:1687

References _GetLowestRankId(), and HandleRemoveRank().

◆ HandleRemoveMember()

void Guild::HandleRemoveMember ( WorldSession *  session,
std::string_view  name 
)
1581{
1582 Player* player = session->GetPlayer();
1583 // Player must have rights to remove members
1584 if (!_HasRankRight(player, GR_RIGHT_REMOVE))
1586 else if (Member* member = GetMember(name))
1587 {
1588 // Guild masters cannot be removed
1589 if (member->IsRank(GR_GUILDMASTER))
1591 // Do not allow to remove player with the same rank or higher
1592 else
1593 {
1594 Member const* memberMe = GetMember(player->GetGUID());
1595 if (!memberMe || member->IsRankNotLower(memberMe->GetRankId()))
1597 else
1598 {
1599 // Copy values since everything will be deleted in DeleteMember().
1600 ObjectGuid guid = member->GetGUID();
1601 std::string memberName = member->GetName();
1602
1603 // After call to DeleteMember pointer to member becomes invalid
1604 DeleteMember(guid, false, true);
1606 _BroadcastEvent(GE_REMOVED, ObjectGuid::Empty, memberName, player->GetName());
1607 }
1608 }
1609 }
1610}
@ GE_REMOVED
Definition Guild.h:152
@ GUILD_COMMAND_REMOVE
Definition Guild.h:105
@ ERR_GUILD_RANK_TOO_HIGH_S
Definition Guild.h:133
@ GR_RIGHT_REMOVE
Definition Guild.h:82
@ GUILD_EVENT_LOG_UNINVITE_PLAYER
Definition Guild.h:214

References _BroadcastEvent(), _HasRankRight(), _LogEvent(), DeleteMember(), ObjectGuid::Empty, ERR_GUILD_LEADER_LEAVE, ERR_GUILD_PERMISSIONS, ERR_GUILD_RANK_TOO_HIGH_S, GE_REMOVED, Object::GetGUID(), GetMember(), WorldObject::GetName(), WorldSession::GetPlayer(), Guild::Member::GetRankId(), GR_GUILDMASTER, GR_RIGHT_REMOVE, GUILD_COMMAND_REMOVE, GUILD_EVENT_LOG_UNINVITE_PLAYER, Guild::Member::IsRankNotLower(), and SendCommandResult().

◆ HandleRemoveRank()

void Guild::HandleRemoveRank ( WorldSession *  session,
uint8  rankId 
)
1688{
1689 // Cannot remove rank if total count is minimum allowed by the client or is not leader
1690 if (_GetRanksSize() <= GUILD_RANKS_MIN_COUNT || rankId >= _GetRanksSize() || !_IsLeader(session->GetPlayer()))
1691 return;
1692
1693 // Delete bank rights for rank
1695 stmt->SetData(0, m_id);
1696 stmt->SetData(1, rankId);
1697 CharacterDatabase.Execute(stmt);
1698 // Delete rank
1699 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_LOWEST_RANK);
1700 stmt->SetData(0, m_id);
1701 stmt->SetData(1, rankId);
1702 CharacterDatabase.Execute(stmt);
1703
1704 // match what the sql statement does
1705 m_ranks.erase(m_ranks.begin() + rankId, m_ranks.end());
1706
1707 _BroadcastEvent(GE_RANK_DELETED, ObjectGuid::Empty, std::to_string(m_ranks.size()));
1708}
@ CHAR_DEL_GUILD_BANK_RIGHTS_FOR_RANK
Definition CharacterDatabase.h:159
@ CHAR_DEL_GUILD_LOWEST_RANK
Definition CharacterDatabase.h:150
@ GE_RANK_DELETED
Definition Guild.h:158
@ GUILD_RANKS_MIN_COUNT
Definition Guild.h:45

References _BroadcastEvent(), _GetRanksSize(), _IsLeader(), CHAR_DEL_GUILD_BANK_RIGHTS_FOR_RANK, CHAR_DEL_GUILD_LOWEST_RANK, CharacterDatabase, ObjectGuid::Empty, GE_RANK_DELETED, WorldSession::GetPlayer(), GUILD_RANKS_MIN_COUNT, m_id, m_ranks, and PreparedStatementBase::SetData().

Referenced by HandleRemoveLowestRank().

◆ HandleRoster()

void Guild::HandleRoster ( WorldSession *  session)
1210{
1212
1213 roster.RankData.reserve(m_ranks.size());
1214 for (RankInfo const& rank : m_ranks)
1215 {
1216 WorldPackets::Guild::GuildRankData& rankData = roster.RankData.emplace_back();
1217
1218 rankData.Flags = rank.GetRights();
1219 rankData.WithdrawGoldLimit = rank.GetBankMoneyPerDay();
1220 for (uint8 i = 0; i < GUILD_BANK_MAX_TABS; ++i)
1221 {
1222 rankData.TabFlags[i] = rank.GetBankTabRights(i);
1223 rankData.TabWithdrawItemLimit[i] = rank.GetBankTabSlotsPerDay(i);
1224 }
1225 }
1226
1227 bool sendOfficerNote = _HasRankRight(session->GetPlayer(), GR_RIGHT_VIEWOFFNOTE);
1228 roster.MemberData.reserve(m_members.size());
1229 for (auto const& [guid, member] : m_members)
1230 {
1231 WorldPackets::Guild::GuildRosterMemberData& memberData = roster.MemberData.emplace_back();
1232
1233 memberData.Guid = member.GetGUID();
1234 memberData.RankID = int32(member.GetRankId());
1235 memberData.AreaID = int32(member.GetZoneId());
1236 memberData.LastSave = float(float(GameTime::GetGameTime().count() - member.GetLogoutTime()) / DAY);
1237
1238 memberData.Status = member.GetFlags();
1239 memberData.Level = member.GetLevel();
1240 memberData.ClassID = member.GetClass();
1241 memberData.Gender = member.GetGender();
1242
1243 memberData.Name = member.GetName();
1244 memberData.Note = member.GetPublicNote();
1245 if (sendOfficerNote)
1246 memberData.OfficerNote = member.GetOfficerNote();
1247 }
1248
1249 roster.WelcomeText = m_motd;
1250 roster.InfoText = m_info;
1251
1252 LOG_DEBUG("guild", "SMSG_GUILD_ROSTER [{}]", session->GetPlayerInfo());
1253 session->SendPacket(roster.Write());
1254}
constexpr auto DAY
Definition Common.h:49
@ GR_RIGHT_VIEWOFFNOTE
Definition Guild.h:87
Definition GuildPackets.h:131
WorldPacket const * Write() override
Definition GuildPackets.cpp:60
std::string WelcomeText
Definition GuildPackets.h:139
std::vector< GuildRankData > RankData
Definition GuildPackets.h:138
std::vector< GuildRosterMemberData > MemberData
Definition GuildPackets.h:137
std::string InfoText
Definition GuildPackets.h:140
Definition GuildPackets.h:123
uint32 WithdrawGoldLimit
Definition GuildPackets.h:125
uint32 Flags
Definition GuildPackets.h:124
uint32 TabWithdrawItemLimit[GUILD_BANK_MAX_TABS]
Definition GuildPackets.h:127
uint32 TabFlags[GUILD_BANK_MAX_TABS]
Definition GuildPackets.h:126
Definition GuildPackets.h:106
int32 RankID
Definition GuildPackets.h:110
uint8 Level
Definition GuildPackets.h:117
uint8 ClassID
Definition GuildPackets.h:118
int32 AreaID
Definition GuildPackets.h:111
ObjectGuid Guid
Definition GuildPackets.h:107
std::string Note
Definition GuildPackets.h:114
uint8 Status
Definition GuildPackets.h:116
uint8 Gender
Definition GuildPackets.h:119
float LastSave
Definition GuildPackets.h:112
std::string Name
Definition GuildPackets.h:113
std::string OfficerNote
Definition GuildPackets.h:115

References _HasRankRight(), WorldPackets::Guild::GuildRosterMemberData::AreaID, WorldPackets::Guild::GuildRosterMemberData::ClassID, DAY, WorldPackets::Guild::GuildRankData::Flags, WorldPackets::Guild::GuildRosterMemberData::Gender, GameTime::GetGameTime(), WorldSession::GetPlayer(), WorldSession::GetPlayerInfo(), GR_RIGHT_VIEWOFFNOTE, WorldPackets::Guild::GuildRosterMemberData::Guid, GUILD_BANK_MAX_TABS, WorldPackets::Guild::GuildRoster::InfoText, WorldPackets::Guild::GuildRosterMemberData::LastSave, WorldPackets::Guild::GuildRosterMemberData::Level, LOG_DEBUG, m_info, m_members, m_motd, m_ranks, WorldPackets::Guild::GuildRoster::MemberData, WorldPackets::Guild::GuildRosterMemberData::Name, WorldPackets::Guild::GuildRosterMemberData::Note, WorldPackets::Guild::GuildRosterMemberData::OfficerNote, WorldPackets::Guild::GuildRoster::RankData, WorldPackets::Guild::GuildRosterMemberData::RankID, WorldSession::SendPacket(), WorldPackets::Guild::GuildRosterMemberData::Status, WorldPackets::Guild::GuildRankData::TabFlags, WorldPackets::Guild::GuildRankData::TabWithdrawItemLimit, WorldPackets::Guild::GuildRoster::WelcomeText, WorldPackets::Guild::GuildRankData::WithdrawGoldLimit, and WorldPackets::Guild::GuildRoster::Write().

Referenced by HandleSetMemberNote(), and SendLoginInfo().

◆ HandleSetBankTabInfo()

void Guild::HandleSetBankTabInfo ( WorldSession *  session,
uint8  tabId,
std::string_view  name,
std::string_view  icon 
)
1371{
1372 BankTab* tab = GetBankTab(tabId);
1373 if (!tab)
1374 {
1375 LOG_ERROR("guild", "Guild::HandleSetBankTabInfo: Player {} trying to change bank tab info from unexisting tab {}.",
1376 session->GetPlayerInfo(), tabId);
1377 return;
1378 }
1379
1380 tab->SetInfo(name, icon);
1381 _BroadcastEvent(GE_BANK_TAB_UPDATED, ObjectGuid::Empty, std::to_string(tabId), tab->GetName(), tab->GetIcon());
1382}
@ GE_BANK_TAB_UPDATED
Definition Guild.h:163

References _BroadcastEvent(), ObjectGuid::Empty, GE_BANK_TAB_UPDATED, GetBankTab(), Guild::BankTab::GetIcon(), Guild::BankTab::GetName(), WorldSession::GetPlayerInfo(), LOG_ERROR, and Guild::BankTab::SetInfo().

◆ HandleSetEmblem() [1/2]

void Guild::HandleSetEmblem ( EmblemInfo const &  emblemInfo)
1346{
1347 m_emblemInfo = emblemInfo;
1349}
void SaveToDB(uint32 guildId) const
Definition Guild.cpp:702

References m_emblemInfo, m_id, and EmblemInfo::SaveToDB().

◆ HandleSetEmblem() [2/2]

void Guild::HandleSetEmblem ( WorldSession *  session,
EmblemInfo const &  emblemInfo 
)
1327{
1328 Player* player = session->GetPlayer();
1329 if (!_IsLeader(player))
1330 SendSaveEmblemResult(session, ERR_GUILDEMBLEM_NOTGUILDMASTER); // "Only guild leaders can create emblems."
1331 else if (!player->HasEnoughMoney(EMBLEM_PRICE))
1332 SendSaveEmblemResult(session, ERR_GUILDEMBLEM_NOTENOUGHMONEY); // "You can't afford to do that."
1333 else
1334 {
1335 player->ModifyMoney(-int32(EMBLEM_PRICE));
1336
1337 HandleSetEmblem(emblemInfo);
1338
1339 SendSaveEmblemResult(session, ERR_GUILDEMBLEM_SUCCESS); // "Guild Emblem saved."
1340
1341 HandleQuery(session);
1342 }
1343}
#define EMBLEM_PRICE
Definition Guild.cpp:42
@ ERR_GUILDEMBLEM_NOTGUILDMASTER
Definition Guild.h:223
@ ERR_GUILDEMBLEM_NOTENOUGHMONEY
Definition Guild.h:224
@ ERR_GUILDEMBLEM_SUCCESS
Definition Guild.h:220
void HandleQuery(WorldSession *session)
Definition Guild.cpp:1256
static void SendSaveEmblemResult(WorldSession *session, GuildEmblemError errCode)
Definition Guild.cpp:126
void HandleSetEmblem(WorldSession *session, EmblemInfo const &emblemInfo)
Definition Guild.cpp:1326

References _IsLeader(), EMBLEM_PRICE, ERR_GUILDEMBLEM_NOTENOUGHMONEY, ERR_GUILDEMBLEM_NOTGUILDMASTER, ERR_GUILDEMBLEM_SUCCESS, WorldSession::GetPlayer(), HandleQuery(), HandleSetEmblem(), Player::HasEnoughMoney(), Player::ModifyMoney(), and SendSaveEmblemResult().

Referenced by HandleSetEmblem().

◆ HandleSetInfo()

void Guild::HandleSetInfo ( WorldSession *  session,
std::string_view  info 
)
1305{
1306 if (m_info == info)
1307 return;
1308
1309 // Player must have rights to set guild's info
1311 SetInfo(info);
1312}
@ GR_RIGHT_MODIFY_GUILD_INFO
Definition Guild.h:89
void SetInfo(std::string_view info)
Definition Guild.cpp:1314

References _HasRankRight(), WorldSession::GetPlayer(), GR_RIGHT_MODIFY_GUILD_INFO, m_info, and SetInfo().

◆ HandleSetLeader()

void Guild::HandleSetLeader ( WorldSession *  session,
std::string_view  name 
)
1352{
1353 Player* player = session->GetPlayer();
1354 // Only leader can assign new leader
1355 if (!_IsLeader(player))
1357 // Old leader must be a member of guild
1358 else if (Member* pOldLeader = GetMember(player->GetGUID()))
1359 {
1360 // New leader must be a member of guild
1361 if (Member* pNewLeader = GetMember(name))
1362 {
1363 _SetLeaderGUID(*pNewLeader);
1364 pOldLeader->ChangeRank(GR_OFFICER);
1365 _BroadcastEvent(GE_LEADER_CHANGED, ObjectGuid::Empty, player->GetName(), pNewLeader->GetName());
1366 }
1367 }
1368}
@ GUILD_COMMAND_CHANGE_LEADER
Definition Guild.h:106
@ GR_OFFICER
Definition Guild.h:66

References _BroadcastEvent(), _IsLeader(), _SetLeaderGUID(), ObjectGuid::Empty, ERR_GUILD_PERMISSIONS, GE_LEADER_CHANGED, Object::GetGUID(), GetMember(), WorldObject::GetName(), WorldSession::GetPlayer(), GR_OFFICER, GUILD_COMMAND_CHANGE_LEADER, and SendCommandResult().

◆ HandleSetMemberNote()

void Guild::HandleSetMemberNote ( WorldSession *  session,
std::string_view  name,
std::string_view  note,
bool  isPublic 
)
1385{
1386 // Player must have rights to set public/officer note
1387 if (!_HasRankRight(session->GetPlayer(), isPublic ? GR_RIGHT_EPNOTE : GR_RIGHT_EOFFNOTE))
1389 else if (Member* member = GetMember(name))
1390 {
1391 if (isPublic)
1392 member->SetPublicNote(note);
1393 else
1394 member->SetOfficerNote(note);
1395
1396 HandleRoster(session);
1397 }
1398}
@ GUILD_COMMAND_PUBLIC_NOTE
Definition Guild.h:111
@ GR_RIGHT_EOFFNOTE
Definition Guild.h:88
@ GR_RIGHT_EPNOTE
Definition Guild.h:86
void HandleRoster(WorldSession *session)
Definition Guild.cpp:1209

References _HasRankRight(), ERR_GUILD_PERMISSIONS, GetMember(), WorldSession::GetPlayer(), GR_RIGHT_EOFFNOTE, GR_RIGHT_EPNOTE, GUILD_COMMAND_PUBLIC_NOTE, HandleRoster(), and SendCommandResult().

◆ HandleSetMOTD()

void Guild::HandleSetMOTD ( WorldSession *  session,
std::string_view  motd 
)
1279{
1280 if (m_motd == motd)
1281 return;
1282
1283 // Player must have rights to set MOTD
1284 if (!_HasRankRight(session->GetPlayer(), GR_RIGHT_SETMOTD))
1286 else
1287 SetMOTD(motd);
1288}
@ GUILD_COMMAND_EDIT_MOTD
Definition Guild.h:107
@ GR_RIGHT_SETMOTD
Definition Guild.h:85
void SetMOTD(std::string_view motd)
Definition Guild.cpp:1290

References _HasRankRight(), ERR_GUILD_PERMISSIONS, WorldSession::GetPlayer(), GR_RIGHT_SETMOTD, GUILD_COMMAND_EDIT_MOTD, m_motd, SendCommandResult(), and SetMOTD().

◆ HandleSetRankInfo() [1/2]

void Guild::HandleSetRankInfo ( uint8  rankId,
Optional< std::string_view >  name,
Optional< uint32 >  rights = {},
Optional< uint32 >  moneyPerDay = {} 
)
1422{
1423 RankInfo* rankInfo = GetRankInfo(rankId);
1424 if (!rankInfo)
1425 return;
1426
1427 if (!name && !rights && !moneyPerDay)
1428 return;
1429
1430 if (name)
1431 rankInfo->SetName(*name);
1432
1433 if (rights)
1434 rankInfo->SetRights(*rights);
1435
1436 if (moneyPerDay)
1437 _SetRankBankMoneyPerDay(rankId, *moneyPerDay);
1438
1439 _BroadcastEvent(GE_RANK_UPDATED, ObjectGuid::Empty, std::to_string(rankId), rankInfo->GetName(),
1440 std::to_string(m_ranks.size()));
1441}
void _SetRankBankMoneyPerDay(uint8 rankId, uint32 moneyPerDay)
Definition Guild.cpp:2578

References _BroadcastEvent(), _SetRankBankMoneyPerDay(), ObjectGuid::Empty, GE_RANK_UPDATED, Guild::RankInfo::GetName(), GetRankInfo(), m_ranks, Guild::RankInfo::SetName(), and Guild::RankInfo::SetRights().

◆ HandleSetRankInfo() [2/2]

void Guild::HandleSetRankInfo ( WorldSession *  session,
uint8  rankId,
std::string_view  name,
uint32  rights,
uint32  moneyPerDay,
std::array< GuildBankRightsAndSlots, GUILD_BANK_MAX_TABS > const &  rightsAndSlots 
)
1401{
1402 // Only leader can modify ranks
1403 if (!_IsLeader(session->GetPlayer()))
1405 else if (RankInfo* rankInfo = GetRankInfo(rankId))
1406 {
1407 rankInfo->SetName(name);
1408 rankInfo->SetRights(rights);
1409 _SetRankBankMoneyPerDay(rankId, moneyPerDay);
1410
1411 for (auto& rightsAndSlot : rightsAndSlots)
1412 _SetRankBankTabRightsAndSlots(rankId, rightsAndSlot);
1413
1414 _BroadcastEvent(GE_RANK_UPDATED, ObjectGuid::Empty, std::to_string(rankId), rankInfo->GetName(), std::to_string(m_ranks.size()));
1415
1416 LOG_DEBUG("guild", "Changed RankName to '{}', rights to 0x{:08X}", rankInfo->GetName(), rights);
1417 }
1418}
@ GUILD_COMMAND_CHANGE_RANK
Definition Guild.h:110
void _SetRankBankTabRightsAndSlots(uint8 rankId, GuildBankRightsAndSlots rightsAndSlots, bool saveToDB=true)
Definition Guild.cpp:2584

References _BroadcastEvent(), _IsLeader(), _SetRankBankMoneyPerDay(), _SetRankBankTabRightsAndSlots(), ObjectGuid::Empty, ERR_GUILD_PERMISSIONS, GE_RANK_UPDATED, WorldSession::GetPlayer(), GetRankInfo(), GUILD_COMMAND_CHANGE_RANK, LOG_DEBUG, m_ranks, and SendCommandResult().

Referenced by WorldSession::HandleGuildRankOpcode().

◆ HandleUpdateMemberRank()

void Guild::HandleUpdateMemberRank ( WorldSession *  session,
std::string_view  name,
bool  demote 
)
1613{
1614 Player* player = session->GetPlayer();
1616 // Player must have rights to promote
1617 if (!_HasRankRight(player, demote ? GR_RIGHT_DEMOTE : GR_RIGHT_PROMOTE))
1619 // Promoted player must be a member of guild
1620 else if (Member* member = GetMember(name))
1621 {
1622 // Player cannot promote himself
1623 if (member->IsSamePlayer(player->GetGUID()))
1624 {
1626 return;
1627 }
1628
1629 Member const* memberMe = GetMember(player->GetGUID());
1630 uint8 rankId = memberMe->GetRankId();
1631 if (demote)
1632 {
1633 // Player can demote only lower rank members
1634 if (member->IsRankNotLower(rankId))
1635 {
1636 SendCommandResult(session, type, ERR_GUILD_RANK_TOO_HIGH_S, name);
1637 return;
1638 }
1639 // Lowest rank cannot be demoted
1640 if (member->GetRankId() >= _GetLowestRankId())
1641 {
1642 SendCommandResult(session, type, ERR_GUILD_RANK_TOO_LOW_S, name);
1643 return;
1644 }
1645 }
1646 else
1647 {
1648 // Allow to promote only to lower rank than member's rank
1649 // member->GetRankId() + 1 is the highest rank that current player can promote to
1650 if (member->IsRankNotLower(rankId + 1))
1651 {
1652 SendCommandResult(session, type, ERR_GUILD_RANK_TOO_HIGH_S, name);
1653 return;
1654 }
1655 }
1656
1657 uint32 newRankId = member->GetRankId() + (demote ? 1 : -1);
1658 member->ChangeRank(newRankId);
1659 _LogEvent(demote ? GUILD_EVENT_LOG_DEMOTE_PLAYER : GUILD_EVENT_LOG_PROMOTE_PLAYER, player->GetGUID(), member->GetGUID(), newRankId);
1660 _BroadcastEvent(demote ? GE_DEMOTION : GE_PROMOTION, ObjectGuid::Empty, player->GetName(), member->GetName(), _GetRankName(newRankId));
1661 }
1662}
@ GE_PROMOTION
Definition Guild.h:147
@ GE_DEMOTION
Definition Guild.h:148
GuildCommandType
Definition Guild.h:98
@ GUILD_COMMAND_PROMOTE
Definition Guild.h:103
@ GUILD_COMMAND_DEMOTE
Definition Guild.h:104
@ ERR_GUILD_RANK_TOO_LOW_S
Definition Guild.h:134
@ ERR_GUILD_NAME_INVALID
Definition Guild.h:125
@ GR_RIGHT_DEMOTE
Definition Guild.h:84
@ GR_RIGHT_PROMOTE
Definition Guild.h:83
@ GUILD_EVENT_LOG_PROMOTE_PLAYER
Definition Guild.h:212
@ GUILD_EVENT_LOG_DEMOTE_PLAYER
Definition Guild.h:213
std::string _GetRankName(uint8 rankId) const
Definition Guild.cpp:2593

References _BroadcastEvent(), _GetLowestRankId(), _GetRankName(), _HasRankRight(), _LogEvent(), ObjectGuid::Empty, ERR_GUILD_NAME_INVALID, ERR_GUILD_PERMISSIONS, ERR_GUILD_RANK_TOO_HIGH_S, ERR_GUILD_RANK_TOO_LOW_S, GE_DEMOTION, GE_PROMOTION, Object::GetGUID(), GetMember(), WorldObject::GetName(), WorldSession::GetPlayer(), Guild::Member::GetRankId(), GR_RIGHT_DEMOTE, GR_RIGHT_PROMOTE, GUILD_COMMAND_DEMOTE, GUILD_COMMAND_PROMOTE, GUILD_EVENT_LOG_DEMOTE_PLAYER, GUILD_EVENT_LOG_PROMOTE_PLAYER, and SendCommandResult().

◆ HasRankRight()

bool Guild::HasRankRight ( Player *  player,
uint32  right 
) const
2682{
2683 return _HasRankRight(player, right);
2684}

References _HasRankRight().

◆ LoadBankEventLogFromDB()

bool Guild::LoadBankEventLogFromDB ( Field *  fields)
2046{
2047 uint8 dbTabId = fields[1].Get<uint8>();
2048 bool isMoneyTab = (dbTabId == GUILD_BANK_MONEY_LOGS_TAB);
2049 if (dbTabId < _GetPurchasedTabsSize() || isMoneyTab)
2050 {
2051 uint8 tabId = isMoneyTab ? uint8(GUILD_BANK_MAX_TABS) : dbTabId;
2052 LogHolder<BankEventLogEntry>& bankLog = m_bankEventLog[tabId];
2053 if (bankLog.CanInsert())
2054 {
2055 ObjectGuid::LowType guid = fields[2].Get<uint32>();
2056 GuildBankEventLogTypes eventType = GuildBankEventLogTypes(fields[3].Get<uint8>());
2057 if (BankEventLogEntry::IsMoneyEvent(eventType))
2058 {
2059 if (!isMoneyTab)
2060 {
2061 LOG_ERROR("guild", "GuildBankEventLog ERROR: MoneyEvent(LogGuid: {}, Guild: {}) does not belong to money tab ({}), ignoring...", guid, m_id, dbTabId);
2062 return false;
2063 }
2064 }
2065 else if (isMoneyTab)
2066 {
2067 LOG_ERROR("guild", "GuildBankEventLog ERROR: non-money event (LogGuid: {}, Guild: {}) belongs to money tab, ignoring...", guid, m_id);
2068 return false;
2069 }
2070 bankLog.LoadEvent(
2071 m_id, // guild id
2072 guid, // guid
2073 time_t(fields[8].Get<uint32>()), // timestamp
2074 dbTabId, // tab id
2075 eventType, // event type
2076 ObjectGuid::Create<HighGuid::Player>(fields[4].Get<uint32>()), // player guid
2077 fields[5].Get<uint32>(), // item or money
2078 fields[6].Get<uint16>(), // itam stack count
2079 fields[7].Get<uint8>()); // dest tab id
2080 }
2081 }
2082 return true;
2083}
GuildBankEventLogTypes
Definition Guild.h:196

References _GetPurchasedTabsSize(), Guild::LogHolder< Entry >::CanInsert(), Field::Get(), GUILD_BANK_MAX_TABS, GUILD_BANK_MONEY_LOGS_TAB, Guild::BankEventLogEntry::IsMoneyEvent(), Guild::LogHolder< Entry >::LoadEvent(), LOG_ERROR, m_bankEventLog, and m_id.

◆ LoadBankItemFromDB()

bool Guild::LoadBankItemFromDB ( Field *  fields)
2095{
2096 uint8 tabId = fields[12].Get<uint8>();
2097 if (tabId >= _GetPurchasedTabsSize())
2098 {
2099 LOG_ERROR("guild", "Invalid tab for item (GUID: {}, id: #{}) in guild bank, skipped.",
2100 fields[14].Get<uint32>(), fields[15].Get<uint32>());
2101 return false;
2102 }
2103 return m_bankTabs[tabId].LoadItemFromDB(fields);
2104}

References _GetPurchasedTabsSize(), Field::Get(), LOG_ERROR, and m_bankTabs.

◆ LoadBankRightFromDB()

void Guild::LoadBankRightFromDB ( Field *  fields)
2021{
2022 // tabId rights slots
2023 GuildBankRightsAndSlots rightsAndSlots(fields[1].Get<uint8>(), fields[3].Get<uint8>(), fields[4].Get<uint32>());
2024 // rankId
2025 _SetRankBankTabRightsAndSlots(fields[2].Get<uint8>(), rightsAndSlots, false);
2026}
Definition Guild.h:266

References _SetRankBankTabRightsAndSlots().

◆ LoadBankTabFromDB()

void Guild::LoadBankTabFromDB ( Field *  fields)
2086{
2087 uint8 tabId = fields[1].Get<uint8>();
2088 if (tabId >= _GetPurchasedTabsSize())
2089 LOG_ERROR("guild", "Invalid tab (tabId: {}) in guild bank, skipped.", tabId);
2090 else
2091 m_bankTabs[tabId].LoadFromDB(fields);
2092}

References _GetPurchasedTabsSize(), Field::Get(), LOG_ERROR, and m_bankTabs.

◆ LoadEventLogFromDB()

bool Guild::LoadEventLogFromDB ( Field *  fields)
2029{
2030 if (m_eventLog.CanInsert())
2031 {
2032 m_eventLog.LoadEvent(
2033 m_id, // guild id
2034 fields[1].Get<uint32>(), // guid
2035 time_t(fields[6].Get<uint32>()), // timestamp
2036 GuildEventLogTypes(fields[2].Get<uint8>()), // event type
2037 ObjectGuid::Create<HighGuid::Player>(fields[3].Get<uint32>()), // player guid 1
2038 ObjectGuid::Create<HighGuid::Player>(fields[4].Get<uint32>()), // player guid 2
2039 fields[5].Get<uint8>()); // rank
2040 return true;
2041 }
2042 return false;
2043}
GuildEventLogTypes
Definition Guild.h:209

References m_eventLog, and m_id.

◆ LoadFromDB()

bool Guild::LoadFromDB ( Field *  fields)
1966{
1967 m_id = fields[0].Get<uint32>();
1968 m_name = fields[1].Get<std::string>();
1969 m_leaderGuid = ObjectGuid::Create<HighGuid::Player>(fields[2].Get<uint32>());
1970 m_emblemInfo.LoadFromDB(fields);
1971 m_info = fields[8].Get<std::string>();
1972 m_motd = fields[9].Get<std::string>();
1973 m_createdDate = time_t(fields[10].Get<uint32>());
1974 m_bankMoney = fields[11].Get<uint64>();
1975
1976 uint8 purchasedTabs = uint8(fields[12].Get<uint64>());
1977 if (purchasedTabs > GUILD_BANK_MAX_TABS)
1978 purchasedTabs = GUILD_BANK_MAX_TABS;
1979
1980 m_bankTabs.clear();
1981 m_bankTabs.reserve(purchasedTabs);
1982 for (uint8 i = 0; i < purchasedTabs; ++i)
1983 m_bankTabs.emplace_back(m_id, i);
1984 return true;
1985}
std::uint64_t uint64
Definition Define.h:106
void LoadFromDB(Field *fields)
Definition Guild.cpp:693

References Field::Get(), GUILD_BANK_MAX_TABS, EmblemInfo::LoadFromDB(), m_bankMoney, m_bankTabs, m_createdDate, m_emblemInfo, m_id, m_info, m_leaderGuid, m_motd, and m_name.

Referenced by GuildMgr::LoadGuilds().

◆ LoadMemberFromDB()

bool Guild::LoadMemberFromDB ( Field *  fields)
1997{
1998 ObjectGuid::LowType lowguid = fields[1].Get<uint32>();
1999 ObjectGuid playerGuid(HighGuid::Player, lowguid);
2000
2001 auto [memberIt, isNew] = m_members.try_emplace(lowguid, m_id, playerGuid, fields[2].Get<uint8>());
2002 if (!isNew)
2003 {
2004 LOG_ERROR("guild", "Tried to add {} to guild '{}'. Member already exists.", playerGuid.ToString(), m_name);
2005 return false;
2006 }
2007
2008 Member& member = memberIt->second;
2009 if (!member.LoadFromDB(fields))
2010 {
2011 _DeleteMemberFromDB(lowguid);
2012 m_members.erase(memberIt);
2013 return false;
2014 }
2015
2016 sCharacterCache->UpdateCharacterGuildId(playerGuid, GetId());
2017 return true;
2018}

References _DeleteMemberFromDB(), Field::Get(), GetId(), Guild::Member::LoadFromDB(), LOG_ERROR, m_id, m_members, m_name, Player, and sCharacterCache.

◆ LoadRankFromDB()

void Guild::LoadRankFromDB ( Field *  fields)
1988{
1989 RankInfo rankInfo(m_id);
1990
1991 rankInfo.LoadFromDB(fields);
1992
1993 m_ranks.push_back(rankInfo);
1994}

References Guild::RankInfo::LoadFromDB(), m_id, and m_ranks.

◆ MassInviteToEvent()

void Guild::MassInviteToEvent ( WorldSession *  session,
uint32  minLevel,
uint32  maxLevel,
uint32  minRank 
)
2225{
2226 uint32 count = 0;
2227
2229 data << uint32(count); // count placeholder
2230
2231 for (auto const& [guid, member] : m_members)
2232 {
2233 // not sure if needed, maybe client checks it as well
2234 if (count >= CALENDAR_MAX_INVITES)
2235 {
2236 if (Player* player = session->GetPlayer())
2237 sCalendarMgr->SendCalendarCommandResult(player->GetGUID(), CALENDAR_ERROR_INVITES_EXCEEDED);
2238 return;
2239 }
2240
2241 uint32 level = sCharacterCache->GetCharacterLevelByGuid(member.GetGUID());
2242
2243 if (member.GetGUID() != session->GetPlayer()->GetGUID() && level >= minLevel && level <= maxLevel && member.IsRankNotLower(minRank))
2244 {
2245 data.appendPackGUID(member.GetGUID().GetRawValue());
2246 data << uint8(0); // unk
2247 ++count;
2248 }
2249 }
2250
2251 data.put<uint32>(0, count);
2252
2253 session->SendPacket(&data);
2254}
@ CALENDAR_ERROR_INVITES_EXCEEDED
Definition CalendarMgr.h:104
@ CALENDAR_MAX_INVITES
Definition CalendarMgr.h:130
@ SMSG_CALENDAR_FILTER_GUILD
Definition Opcodes.h:1110

References ByteBuffer::appendPackGUID(), CALENDAR_ERROR_INVITES_EXCEEDED, CALENDAR_MAX_INVITES, Object::GetGUID(), WorldSession::GetPlayer(), m_members, ByteBuffer::put(), sCalendarMgr, sCharacterCache, WorldSession::SendPacket(), and SMSG_CALENDAR_FILTER_GUILD.

◆ MemberHasTabRights()

bool Guild::MemberHasTabRights ( ObjectGuid  guid,
uint8  tabId,
uint32  rights 
) const
2692{
2693 return _MemberHasTabRights(guid, tabId, rights);
2694}

References _MemberHasTabRights().

◆ ModifyBankMoney()

bool Guild::ModifyBankMoney ( CharacterDatabaseTransaction  trans,
uint64 const &  amount,
bool  add 
)
inline
787{ return _ModifyBankMoney(trans, amount, add); }

References _ModifyBankMoney().

◆ OnPlayerStatusChange()

void Guild::OnPlayerStatusChange ( Player *  player,
uint32  flag,
bool  state 
)
1185{
1186 if (Member* member = GetMember(player->GetGUID()))
1187 {
1188 if (state)
1189 member->AddFlag(flag);
1190 else member->RemFlag(flag);
1191 }
1192}

References Object::GetGUID(), and GetMember().

◆ ResetTimes()

void Guild::ResetTimes ( )
3020{
3021 for (auto& [guid, member] : m_members)
3022 member.ResetValues();
3023
3025}
@ GE_BANK_TAB_AND_MONEY_UPDATED
Definition Guild.h:165

References _BroadcastEvent(), ObjectGuid::Empty, GE_BANK_TAB_AND_MONEY_UPDATED, and m_members.

◆ SendBankLog()

void Guild::SendBankLog ( WorldSession *  session,
uint8  tabId 
) const
1858{
1859 // GUILD_BANK_MAX_TABS send by client for money log
1860 if (tabId < _GetPurchasedTabsSize() || tabId == GUILD_BANK_MAX_TABS)
1861 {
1862 std::list<BankEventLogEntry> const& bankEventLog = m_bankEventLog[tabId].GetGuildLog();
1863
1865 packet.Tab = tabId;
1866
1867 packet.Entry.reserve(bankEventLog.size());
1868 for (BankEventLogEntry const& entry : bankEventLog)
1869 entry.WritePacket(packet);
1870
1871 session->SendPacket(packet.Write());
1872 LOG_DEBUG("guild", "MSG_GUILD_BANK_LOG_QUERY [{}]", session->GetPlayerInfo());
1873 }
1874}
uint8 Tab
Definition GuildPackets.h:552
std::vector< GuildBankLogEntry > Entry
Definition GuildPackets.h:553
WorldPacket const * Write() override
Definition GuildPackets.cpp:385

References _GetPurchasedTabsSize(), WorldPackets::Guild::GuildBankLogQueryResults::Entry, WorldSession::GetPlayerInfo(), GUILD_BANK_MAX_TABS, LOG_DEBUG, m_bankEventLog, WorldSession::SendPacket(), WorldPackets::Guild::GuildBankLogQueryResults::Tab, and WorldPackets::Guild::GuildBankLogQueryResults::Write().

◆ SendBankTabData()

void Guild::SendBankTabData ( WorldSession *  session,
uint8  tabId,
bool  sendAllSlots 
) const
1877{
1878 if (tabId < _GetPurchasedTabsSize())
1879 _SendBankContent(session, tabId, sendAllSlots);
1880}
void _SendBankContent(WorldSession *session, uint8 tabId, bool sendAllSlots) const
Definition Guild.cpp:2838

References _GetPurchasedTabsSize(), and _SendBankContent().

◆ SendBankTabsInfo()

void Guild::SendBankTabsInfo ( WorldSession *  session,
bool  showTabs = false 
)
1883{
1884 Member* member = GetMember(session->GetPlayer()->GetGUID());
1885 if (!member)
1886 return;
1887
1888 member->SubscribeToGuildBankUpdatePackets();
1889
1890 _SendBankList(session, 0, sendAllSlots);
1891}

References _SendBankList(), Object::GetGUID(), GetMember(), WorldSession::GetPlayer(), and Guild::Member::SubscribeToGuildBankUpdatePackets().

Referenced by WorldSession::HandleGuildBankerActivate().

◆ SendBankTabText()

void Guild::SendBankTabText ( WorldSession *  session,
uint8  tabId 
) const
1894{
1895 if (BankTab const* tab = GetBankTab(tabId))
1896 tab->SendText(this, session);
1897}

References GetBankTab().

◆ SendCommandResult()

void Guild::SendCommandResult ( WorldSession *  session,
GuildCommandType  type,
GuildCommandError  errCode,
std::string_view  param = {} 
)
static
116{
118 resultPacket.Command = type;
119 resultPacket.Result = errCode;
120 resultPacket.Name = param;
121 session->SendPacket(resultPacket.Write());
122
123 LOG_DEBUG("guild", "SMSG_GUILD_COMMAND_RESULT [{}]: Type: {}, code: {}, param: {}", session->GetPlayerInfo(), type, errCode, resultPacket.Name);
124}
Definition GuildPackets.h:154
int32 Command
Definition GuildPackets.h:162
std::string Name
Definition GuildPackets.h:160
WorldPacket const * Write() override
Definition GuildPackets.cpp:81
int32 Result
Definition GuildPackets.h:161

References WorldPackets::Guild::GuildCommandResult::Command, WorldSession::GetPlayerInfo(), LOG_DEBUG, WorldPackets::Guild::GuildCommandResult::Name, WorldPackets::Guild::GuildCommandResult::Result, WorldSession::SendPacket(), and WorldPackets::Guild::GuildCommandResult::Write().

Referenced by WorldSession::HandleGuildAcceptOpcode(), WorldSession::HandleGuildBankerActivate(), WorldSession::HandleGuildRosterOpcode(), HandleInviteMember(), HandleLeaveMember(), HandleMemberDepositMoney(), WorldSession::HandleOfferPetitionOpcode(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandlePetitionRenameOpcode(), WorldSession::HandlePetitionSignOpcode(), HandleRemoveMember(), HandleSetLeader(), HandleSetMemberNote(), HandleSetMOTD(), HandleSetRankInfo(), WorldSession::HandleTurnInPetitionOpcode(), and HandleUpdateMemberRank().

◆ SendEventLog()

void Guild::SendEventLog ( WorldSession *  session) const
1844{
1845 std::list<EventLogEntry> const& eventLog = m_eventLog.GetGuildLog();
1846
1848 packet.Entry.reserve(eventLog.size());
1849
1850 for (EventLogEntry const& entry : eventLog)
1851 entry.WritePacket(packet);
1852
1853 session->SendPacket(packet.Write());
1854 LOG_DEBUG("guild", "MSG_GUILD_EVENT_LOG_QUERY [{}]", session->GetPlayerInfo());
1855}
std::vector< GuildEventEntry > Entry
Definition GuildPackets.h:238
WorldPacket const * Write() override
Definition GuildPackets.cpp:144

References WorldPackets::Guild::GuildEventLogQueryResults::Entry, WorldSession::GetPlayerInfo(), LOG_DEBUG, m_eventLog, WorldSession::SendPacket(), and WorldPackets::Guild::GuildEventLogQueryResults::Write().

◆ SendInfo()

void Guild::SendInfo ( WorldSession *  session) const

◆ SendLoginInfo()

void Guild::SendLoginInfo ( WorldSession *  session)
1944{
1946 motd.Type = GE_MOTD;
1947 motd.Params.emplace_back(m_motd);
1948 session->SendPacket(motd.Write());
1949
1950 LOG_DEBUG("guild", "SMSG_GUILD_EVENT [{}] MOTD", session->GetPlayerInfo());
1951
1952 Player* player = session->GetPlayer();
1953
1954 HandleRoster(session);
1955 _BroadcastEvent(GE_SIGNED_ON, player->GetGUID(), player->GetName());
1956
1957 if (Member* member = GetMember(player->GetGUID()))
1958 {
1959 member->SetStats(player);
1960 member->AddFlag(GUILDMEMBER_STATUS_ONLINE);
1961 }
1962}
@ GE_MOTD
Definition Guild.h:149
@ GE_SIGNED_ON
Definition Guild.h:159
@ GUILDMEMBER_STATUS_ONLINE
Definition Guild.h:231
boost::container::static_vector< std::string_view, 3 > Params
Definition GuildPackets.h:210

References _BroadcastEvent(), GE_MOTD, GE_SIGNED_ON, Object::GetGUID(), GetMember(), WorldObject::GetName(), WorldSession::GetPlayer(), WorldSession::GetPlayerInfo(), GUILDMEMBER_STATUS_ONLINE, HandleRoster(), LOG_DEBUG, m_motd, WorldPackets::Guild::GuildEvent::Params, WorldSession::SendPacket(), WorldPackets::Guild::GuildEvent::Type, and WorldPackets::Guild::GuildEvent::Write().

Referenced by AddMember(), and WorldSession::HandlePlayerLoginFromDB().

◆ SendMoneyInfo()

void Guild::SendMoneyInfo ( WorldSession *  session) const
1929{
1930 Member const* member = GetMember(session->GetPlayer()->GetGUID());
1931 if (!member)
1932 return;
1933
1934 int32 amount = _GetMemberRemainingMoney(*member);
1935
1937 packet.RemainingWithdrawMoney = amount;
1938 session->SendPacket(packet.Write());
1939
1940 LOG_DEBUG("guild", "MSG_GUILD_BANK_MONEY_WITHDRAWN [{}] Money: {}", session->GetPlayerInfo(), amount);
1941}
int32 RemainingWithdrawMoney
Definition GuildPackets.h:442
WorldPacket const * Write() override
Definition GuildPackets.cpp:272

References _GetMemberRemainingMoney(), Object::GetGUID(), GetMember(), WorldSession::GetPlayer(), WorldSession::GetPlayerInfo(), LOG_DEBUG, WorldPackets::Guild::GuildBankRemainingWithdrawMoney::RemainingWithdrawMoney, WorldSession::SendPacket(), and WorldPackets::Guild::GuildBankRemainingWithdrawMoney::Write().

◆ SendPermissions()

void Guild::SendPermissions ( WorldSession *  session)
1900{
1901 Member* member = GetMember(session->GetPlayer()->GetGUID());
1902 if (!member)
1903 return;
1904
1905 // We are unsubscribing here since it is the only reliable way to handle /reload from player as
1906 // GuildPermissionsQuery is sent on each reload, and we don't want to send partial changes while client
1907 // doesn't know the full state
1908 member->UnsubscribeFromGuildBankUpdatePackets();
1909
1910 uint8 rankId = member->GetRankId();
1911
1913 queryResult.RankID = rankId;
1914 queryResult.WithdrawGoldLimit = _GetRankBankMoneyPerDay(rankId);
1915 queryResult.Flags = _GetRankRights(rankId);
1916 queryResult.NumTabs = _GetPurchasedTabsSize();
1917
1918 for (uint8 tabId = 0; tabId < GUILD_BANK_MAX_TABS; ++tabId)
1919 {
1920 queryResult.Tab[tabId].Flags = _GetRankBankTabRights(rankId, tabId);
1921 queryResult.Tab[tabId].WithdrawItemLimit = _GetMemberRemainingSlots(*member, tabId);
1922 }
1923
1924 session->SendPacket(queryResult.Write());
1925 LOG_DEBUG("guild", "MSG_GUILD_PERMISSIONS [{}] Rank: {}", session->GetPlayerInfo(), rankId);
1926}
int32 Flags
Definition GuildPackets.h:264
WorldPacket const * Write() override
Definition GuildPackets.cpp:164
uint32 RankID
Definition GuildPackets.h:265
int32 WithdrawGoldLimit
Definition GuildPackets.h:263
int8 NumTabs
Definition GuildPackets.h:262
std::array< GuildRankTabPermissions, GUILD_BANK_MAX_TABS > Tab
Definition GuildPackets.h:266

References _GetMemberRemainingSlots(), _GetPurchasedTabsSize(), _GetRankBankMoneyPerDay(), _GetRankBankTabRights(), _GetRankRights(), WorldPackets::Guild::GuildPermissionsQueryResults::Flags, Object::GetGUID(), GetMember(), WorldSession::GetPlayer(), WorldSession::GetPlayerInfo(), Guild::Member::GetRankId(), GUILD_BANK_MAX_TABS, LOG_DEBUG, WorldPackets::Guild::GuildPermissionsQueryResults::NumTabs, WorldPackets::Guild::GuildPermissionsQueryResults::RankID, WorldSession::SendPacket(), WorldPackets::Guild::GuildPermissionsQueryResults::Tab, Guild::Member::UnsubscribeFromGuildBankUpdatePackets(), WorldPackets::Guild::GuildPermissionsQueryResults::WithdrawGoldLimit, and WorldPackets::Guild::GuildPermissionsQueryResults::Write().

Referenced by HandleBuyBankTab().

◆ SendSaveEmblemResult()

void Guild::SendSaveEmblemResult ( WorldSession *  session,
GuildEmblemError  errCode 
)
static
127{
129 saveResponse.Error = int32(errCode);
130 session->SendPacket(saveResponse.Write());
131
132 LOG_DEBUG("guild", "MSG_SAVE_GUILD_EMBLEM [{}] Code: {}", session->GetPlayerInfo(), errCode);
133}
Definition GuildPackets.h:614
WorldPacket const * Write() override
Definition GuildPackets.cpp:453
int32 Error
Definition GuildPackets.h:620

References WorldPackets::Guild::PlayerSaveGuildEmblem::Error, WorldSession::GetPlayerInfo(), LOG_DEBUG, WorldSession::SendPacket(), and WorldPackets::Guild::PlayerSaveGuildEmblem::Write().

Referenced by WorldSession::HandleSaveGuildEmblemOpcode(), and HandleSetEmblem().

◆ SetBankTabText()

void Guild::SetBankTabText ( uint8  tabId,
std::string_view  text 
)
2454{
2455 if (BankTab* pTab = GetBankTab(tabId))
2456 {
2457 pTab->SetText(text);
2458 pTab->SendText(this, nullptr);
2459 }
2460}

References GetBankTab().

◆ SetInfo()

void Guild::SetInfo ( std::string_view  info)
1315{
1316 m_info = info;
1317
1318 sScriptMgr->OnGuildInfoChanged(this, m_info);
1319
1321 stmt->SetData(0, m_info);
1322 stmt->SetData(1, m_id);
1323 CharacterDatabase.Execute(stmt);
1324}
@ CHAR_UPD_GUILD_INFO
Definition CharacterDatabase.h:170

References CHAR_UPD_GUILD_INFO, CharacterDatabase, m_id, m_info, PreparedStatementBase::SetData(), and sScriptMgr.

Referenced by HandleSetInfo().

◆ SetMOTD()

void Guild::SetMOTD ( std::string_view  motd)
1291{
1292 m_motd = motd;
1293
1294 sScriptMgr->OnGuildMOTDChanged(this, m_motd);
1295
1297 stmt->SetData(0, m_motd);
1298 stmt->SetData(1, m_id);
1299 CharacterDatabase.Execute(stmt);
1300
1302}
@ CHAR_UPD_GUILD_MOTD
Definition CharacterDatabase.h:169

References _BroadcastEvent(), CHAR_UPD_GUILD_MOTD, CharacterDatabase, ObjectGuid::Empty, GE_MOTD, m_id, m_motd, PreparedStatementBase::SetData(), and sScriptMgr.

Referenced by HandleSetMOTD().

◆ SetName()

bool Guild::SetName ( std::string_view const &  name)
1195{
1196 if (m_name == name || name.empty() || name.length() > 24 || !ObjectMgr::IsValidCharterName(name))
1197 {
1198 return false;
1199 }
1200
1201 m_name = name;
1203 stmt->SetData(0, m_name);
1204 stmt->SetData(1, GetId());
1205 CharacterDatabase.Execute(stmt);
1206 return true;
1207}
@ CHAR_UPD_GUILD_NAME
Definition CharacterDatabase.h:143
static bool IsValidCharterName(std::string_view name)
Definition ObjectMgr.cpp:9346

References CHAR_UPD_GUILD_NAME, CharacterDatabase, GetId(), ObjectMgr::IsValidCharterName(), m_name, and PreparedStatementBase::SetData().

Referenced by guild_commandscript::HandleGuildRenameCommand().

◆ SwapItems()

void Guild::SwapItems ( Player *  player,
uint8  tabId,
uint8  slotId,
uint8  destTabId,
uint8  destSlotId,
uint32  splitedAmount 
)
2426{
2427 if (tabId >= _GetPurchasedTabsSize() || slotId >= GUILD_BANK_MAX_SLOTS ||
2428 destTabId >= _GetPurchasedTabsSize() || destSlotId >= GUILD_BANK_MAX_SLOTS)
2429 return;
2430
2431 if (tabId == destTabId && slotId == destSlotId)
2432 return;
2433
2434 BankMoveItemData from(this, player, tabId, slotId);
2435 BankMoveItemData to(this, player, destTabId, destSlotId);
2436 _MoveItems(&from, &to, splitedAmount);
2437}
void _MoveItems(MoveItemData *pSrc, MoveItemData *pDest, uint32 splitedAmount)
Definition Guild.cpp:2741

References _GetPurchasedTabsSize(), _MoveItems(), and GUILD_BANK_MAX_SLOTS.

Referenced by WorldSession::HandleGuildBankSwapItems().

◆ SwapItemsWithInventory()

void Guild::SwapItemsWithInventory ( Player *  player,
bool  toChar,
uint8  tabId,
uint8  slotId,
uint8  playerBag,
uint8  playerSlotId,
uint32  splitedAmount 
)
2440{
2441 if ((slotId >= GUILD_BANK_MAX_SLOTS && slotId != NULL_SLOT) || tabId >= _GetPurchasedTabsSize())
2442 return;
2443
2444 BankMoveItemData bankData(this, player, tabId, slotId);
2445 PlayerMoveItemData charData(this, player, playerBag, playerSlotId);
2446 if (toChar)
2447 _MoveItems(&bankData, &charData, splitedAmount);
2448 else
2449 _MoveItems(&charData, &bankData, splitedAmount);
2450}
@ NULL_SLOT
Definition Item.h:41

References _GetPurchasedTabsSize(), _MoveItems(), GUILD_BANK_MAX_SLOTS, and NULL_SLOT.

Referenced by WorldSession::HandleGuildBankSwapItems().

◆ UpdateMemberData()

void Guild::UpdateMemberData ( Player *  player,
uint8  dataid,
uint32  value 
)
1165{
1166 if (Member* member = GetMember(player->GetGUID()))
1167 {
1168 switch (dataid)
1169 {
1171 member->SetZoneID(value);
1172 break;
1174 member->SetLevel(value);
1175 break;
1176 default:
1177 LOG_ERROR("guild", "Guild::UpdateMemberData: Called with incorrect DATAID {} (value {})", dataid, value);
1178 return;
1179 }
1180 //HandleRoster();
1181 }
1182}
@ GUILD_MEMBER_DATA_LEVEL
Definition Guild.h:59
@ GUILD_MEMBER_DATA_ZONEID
Definition Guild.h:58

References Object::GetGUID(), GetMember(), GUILD_MEMBER_DATA_LEVEL, GUILD_MEMBER_DATA_ZONEID, and LOG_ERROR.

◆ Validate()

bool Guild::Validate ( )
2108{
2109 // Validate ranks data
2110 // GUILD RANKS represent a sequence starting from 0 = GUILD_MASTER (ALL PRIVILEGES) to max 9 (lowest privileges).
2111 // The lower rank id is considered higher rank - so promotion does rank-- and demotion does rank++
2112 // Between ranks in sequence cannot be gaps - so 0, 1, 2, 4 is impossible
2113 // Min ranks count is 5 and max is 10.
2114 bool broken_ranks = false;
2115 uint8 ranks = _GetRanksSize();
2116 if (ranks < GUILD_RANKS_MIN_COUNT || ranks > GUILD_RANKS_MAX_COUNT)
2117 {
2118 LOG_ERROR("guild", "Guild {} has invalid number of ranks, creating new...", m_id);
2119 broken_ranks = true;
2120 }
2121 else
2122 {
2123 for (uint8 rankId = 0; rankId < ranks; ++rankId)
2124 {
2125 RankInfo* rankInfo = GetRankInfo(rankId);
2126 if (rankInfo->GetId() != rankId)
2127 {
2128 LOG_ERROR("guild", "Guild {} has broken rank id {}, creating default set of ranks...", m_id, rankId);
2129 broken_ranks = true;
2130 }
2131 else
2132 {
2133 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2134 rankInfo->CreateMissingTabsIfNeeded(_GetPurchasedTabsSize(), trans, true);
2135 CharacterDatabase.CommitTransaction(trans);
2136 }
2137 }
2138 }
2139
2140 if (broken_ranks)
2141 {
2142 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2143
2144 // Only delete when there are rank rows: a DELETE on an empty range takes gap
2145 // locks that deadlock against the INSERTs of guilds repaired in parallel.
2146 // Bank rights are written with ON DUPLICATE KEY UPDATE.
2147 if (!m_ranks.empty())
2148 {
2150 stmt->SetData(0, m_id);
2151 trans->Append(stmt);
2152
2153 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_RIGHTS);
2154 stmt->SetData(0, m_id);
2155 trans->Append(stmt);
2156 }
2157
2158 m_ranks.clear();
2160 CharacterDatabase.CommitTransaction(trans);
2161 }
2162
2163 // Validate members' data
2164 for (auto& [guid, member] : m_members)
2165 if (member.GetRankId() > _GetRanksSize())
2166 member.ChangeRank(_GetLowestRankId());
2167
2168 // Repair the structure of the guild.
2169 // If the guildmaster doesn't exist or isn't member of the guild
2170 // attempt to promote another member.
2171 Member* pLeader = GetMember(m_leaderGuid);
2172 if (!pLeader)
2173 {
2175 // If no more members left, disband guild
2176 if (m_members.empty())
2177 {
2178 Disband();
2179 return false;
2180 }
2181 }
2182 else if (!pLeader->IsRank(GR_GUILDMASTER))
2183 _SetLeaderGUID(*pLeader);
2184
2185 // Check config if multiple guildmasters are allowed
2186 if (!sConfigMgr->GetOption<bool>("Guild.AllowMultipleGuildMaster", 0))
2187 for (auto& [guid, member] : m_members)
2188 if ((member.GetRankId() == GR_GUILDMASTER) && !member.IsSamePlayer(m_leaderGuid))
2189 member.ChangeRank(GR_OFFICER);
2190
2192 return true;
2193}
#define DEFAULT_LOCALE
Definition Common.h:140
#define sConfigMgr
Definition Config.h:93

References _CreateDefaultGuildRanks(), _GetLowestRankId(), _GetPurchasedTabsSize(), _GetRanksSize(), _SetLeaderGUID(), _UpdateAccountsNumber(), CHAR_DEL_GUILD_BANK_RIGHTS, CHAR_DEL_GUILD_RANKS, CharacterDatabase, Guild::RankInfo::CreateMissingTabsIfNeeded(), DEFAULT_LOCALE, DeleteMember(), Disband(), Guild::RankInfo::GetId(), GetMember(), GetRankInfo(), GR_GUILDMASTER, GR_OFFICER, GUILD_RANKS_MAX_COUNT, Guild::Member::IsRank(), LOG_ERROR, m_id, m_leaderGuid, m_members, m_ranks, sConfigMgr, and PreparedStatementBase::SetData().

Referenced by GuildMgr::LoadGuilds().

Member Data Documentation

◆ m_accountsNumber

uint32 Guild::m_accountsNumber
protected

Referenced by _UpdateAccountsNumber(), and SendInfo().

◆ m_bankEventLog

std::array<LogHolder<BankEventLogEntry>, GUILD_BANK_MAX_TABS + 1> Guild::m_bankEventLog = {}
protected

◆ m_bankMoney

◆ m_bankTabs

◆ m_createdDate

time_t Guild::m_createdDate
protected

◆ m_emblemInfo

EmblemInfo Guild::m_emblemInfo
protected

◆ m_eventLog

LogHolder<EventLogEntry> Guild::m_eventLog
protected

◆ m_id

◆ m_info

std::string Guild::m_info
protected

◆ m_leaderGuid

◆ m_members

◆ m_motd

std::string Guild::m_motd
protected

◆ m_name

◆ m_ranks


The documentation for this class was generated from the following files: