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 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
 
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 (LocaleConstant loc)
 
bool _CreateRank (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:802
uint32 m_id
Definition Guild.h:793
uint32 m_accountsNumber
Definition Guild.h:801
time_t m_createdDate
Definition Guild.h:798

◆ ~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:2519

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
2871{
2873 event.Type = guildEvent;
2874 if (param1)
2875 event.Params.push_back(*param1);
2876
2877 if (param2)
2878 {
2879 event.Params.resize(2);
2880 event.Params[1] = *param2;
2881 }
2882
2883 if (param3)
2884 {
2885 event.Params.resize(3);
2886 event.Params[2] = *param3;
2887 }
2888 event.Guid = guid;
2889 BroadcastPacket(event.Write());
2890 LOG_DEBUG("guild", "SMSG_GUILD_EVENT [Broadcast] Event: {}", guildEvent);
2891}
#define LOG_DEBUG(filterType__,...)
Definition Log.h:157
void BroadcastPacket(WorldPacket const *packet) const
Definition Guild.cpp:2190
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(), HandleSetMOTD(), HandleSetRankInfo(), HandleSetRankInfo(), HandleUpdateMemberRank(), ResetTimes(), and SendLoginInfo().

◆ _CreateDefaultGuildRanks()

void Guild::_CreateDefaultGuildRanks ( LocaleConstant  loc)
private
2461{
2463 stmt->SetData(0, m_id);
2464 CharacterDatabase.Execute(stmt);
2465
2466 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_RIGHTS);
2467 stmt->SetData(0, m_id);
2468 CharacterDatabase.Execute(stmt);
2469
2470 _CreateRank(sObjectMgr->GetAcoreString(LANG_GUILD_MASTER, loc), GR_RIGHT_ALL);
2471 _CreateRank(sObjectMgr->GetAcoreString(LANG_GUILD_OFFICER, loc), GR_RIGHT_ALL);
2475}
@ CHAR_DEL_GUILD_BANK_RIGHTS
Definition CharacterDatabase.h:158
@ CHAR_DEL_GUILD_RANKS
Definition CharacterDatabase.h:149
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
@ 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(std::string_view name, uint32 rights)
Definition Guild.cpp:2477
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition PreparedStatement.h:77
Definition PreparedStatement.h:157

References _CreateRank(), CHAR_DEL_GUILD_BANK_RIGHTS, CHAR_DEL_GUILD_RANKS, CharacterDatabase, GR_RIGHT_ALL, GR_RIGHT_GCHATLISTEN, GR_RIGHT_GCHATSPEAK, LANG_GUILD_INITIATE, LANG_GUILD_MASTER, LANG_GUILD_MEMBER, LANG_GUILD_OFFICER, LANG_GUILD_VETERAN, m_id, PreparedStatementBase::SetData(), and sObjectMgr.

Referenced by Create(), and Validate().

◆ _CreateNewBankTab()

void Guild::_CreateNewBankTab ( )
private
2437{
2438 uint8 tabId = _GetPurchasedTabsSize(); // Next free id
2439 m_bankTabs.emplace_back(m_id, tabId);
2440
2441 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2442
2444 stmt->SetData(0, m_id);
2445 stmt->SetData (1, tabId);
2446 trans->Append(stmt);
2447
2448 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GUILD_BANK_TAB);
2449 stmt->SetData(0, m_id);
2450 stmt->SetData (1, tabId);
2451 trans->Append(stmt);
2452
2453 ++tabId;
2454 for (auto& m_rank : m_ranks)
2455 m_rank.CreateMissingTabsIfNeeded(tabId, trans, false);
2456
2457 CharacterDatabase.CommitTransaction(trans);
2458}
@ CHAR_INS_GUILD_BANK_TAB
Definition CharacterDatabase.h:151
@ CHAR_DEL_GUILD_BANK_TAB
Definition CharacterDatabase.h:152
std::uint8_t uint8
Definition Define.h:109
std::vector< BankTab > m_bankTabs
Definition Guild.h:806
uint8 _GetPurchasedTabsSize() const
Definition Guild.h:826
std::vector< RankInfo > m_ranks
Definition Guild.h:804

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 ( std::string_view  name,
uint32  rights 
)
private
2478{
2479 uint8 newRankId = _GetRanksSize();
2480 if (newRankId >= GUILD_RANKS_MAX_COUNT)
2481 return false;
2482
2483 // Ranks represent sequence 0, 1, 2, ... where 0 means guildmaster
2484 RankInfo info(m_id, newRankId, name, rights, 0);
2485 m_ranks.push_back(info);
2486
2487 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2488 info.CreateMissingTabsIfNeeded(_GetPurchasedTabsSize(), trans);
2489 info.SaveToDB(trans);
2490 CharacterDatabase.CommitTransaction(trans);
2491
2492 return true;
2493}
@ GUILD_RANKS_MAX_COUNT
Definition Guild.h:46
uint8 _GetRanksSize() const
Definition Guild.h:813

References _GetPurchasedTabsSize(), _GetRanksSize(), CharacterDatabase, 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
2520{
2521 for (uint8 tabId = 0; tabId < _GetPurchasedTabsSize(); ++tabId)
2522 {
2523 m_bankTabs[tabId].Delete(trans, removeItemsFromDB);
2524 }
2525 m_bankTabs.clear();
2526}

References _GetPurchasedTabsSize(), and m_bankTabs.

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

◆ _DeleteMemberFromDB()

void Guild::_DeleteMemberFromDB ( ObjectGuid::LowType  lowguid) const
inlineprivate
831 {
833 stmt->SetData(0, lowguid);
834 CharacterDatabase.Execute(stmt);
835 }
@ 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
2775{
2776 Item* pDestItem = pDest->GetItem();
2777 bool swap = (pDestItem != nullptr);
2778
2779 Item* pSrcItem = pSrc->GetItem(splitedAmount);
2780 // 1. Can store source item in destination
2781 if (!pDest->CanStore(pSrcItem, swap, sendError))
2782 return false;
2783
2784 // 2. Can store destination item in source
2785 if (swap)
2786 if (!pSrc->CanStore(pDestItem, true, true))
2787 return false;
2788
2789 // GM LOG (TODO: move to scripts)
2790 pDest->LogAction(pSrc);
2791 if (swap)
2792 pSrc->LogAction(pDest);
2793
2794 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2795 // 3. Log bank events
2796 pDest->LogBankEvent(trans, pSrc, pSrcItem->GetCount());
2797 if (swap)
2798 pSrc->LogBankEvent(trans, pDest, pDestItem->GetCount());
2799
2800 // 4. Remove item from source
2801 pSrc->RemoveItem(trans, pDest, splitedAmount);
2802
2803 // 5. Remove item from destination
2804 if (swap)
2805 pDest->RemoveItem(trans, pSrc);
2806
2807 // 6. Store item in destination
2808 pDest->StoreItem(trans, pSrcItem);
2809
2810 // 7. Store item in source
2811 if (swap)
2812 pSrc->StoreItem(trans, pDestItem);
2813
2814 CharacterDatabase.CommitTransaction(trans);
2815 return true;
2816}
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
2709{
2710 if (BankTab const* tab = GetBankTab(tabId))
2711 return tab->GetItem(slotId);
2712 return nullptr;
2713}
BankTab * GetBankTab(uint8 tabId)
Definition Guild.h:827

References GetBankTab().

◆ _GetLowestRankId()

uint8 Guild::_GetLowestRankId ( ) const
inlineprivate
824{ 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
2624{
2625 uint8 rankId = member.GetRankId();
2626 if (rankId == GR_GUILDMASTER)
2627 return static_cast<int32>(GUILD_WITHDRAW_MONEY_UNLIMITED);
2628
2630 {
2631 int32 remaining = _GetRankBankMoneyPerDay(rankId) - member.GetBankWithdrawValue(GUILD_BANK_MAX_TABS);
2632 if (remaining > 0)
2633 return remaining;
2634 }
2635 return 0;
2636}
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:2580
int32 _GetRankBankMoneyPerDay(uint8 rankId) const
Definition Guild.cpp:2587

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
2610{
2611 uint8 rankId = member.GetRankId();
2612 if (rankId == GR_GUILDMASTER)
2613 return static_cast<int32>(GUILD_WITHDRAW_SLOT_UNLIMITED);
2614 if ((_GetRankBankTabRights(rankId, tabId) & GUILD_BANK_RIGHT_VIEW_TAB) != 0)
2615 {
2616 int32 remaining = _GetRankBankTabSlotsPerDay(rankId, tabId) - member.GetBankWithdrawValue(tabId);
2617 if (remaining > 0)
2618 return remaining;
2619 }
2620 return 0;
2621}
@ 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:2602
int32 _GetRankBankTabSlotsPerDay(uint8 rankId, uint8 tabId) const
Definition Guild.cpp:2594

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
2588{
2589 if (RankInfo const* rankInfo = GetRankInfo(rankId))
2590 return rankInfo->GetBankMoneyPerDay();
2591 return 0;
2592}
RankInfo const * GetRankInfo(uint8 rankId) const
Definition Guild.h:814

References GetRankInfo().

Referenced by _GetMemberRemainingMoney(), and SendPermissions().

◆ _GetRankBankTabRights()

int8 Guild::_GetRankBankTabRights ( uint8  rankId,
uint8  tabId 
) const
inlineprivate
2603{
2604 if (RankInfo const* rankInfo = GetRankInfo(rankId))
2605 return rankInfo->GetBankTabRights(tabId);
2606 return 0;
2607}

References GetRankInfo().

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

◆ _GetRankBankTabSlotsPerDay()

int32 Guild::_GetRankBankTabSlotsPerDay ( uint8  rankId,
uint8  tabId 
) const
inlineprivate
2595{
2596 if (tabId < _GetPurchasedTabsSize())
2597 if (RankInfo const* rankInfo = GetRankInfo(rankId))
2598 return rankInfo->GetBankTabSlotsPerDay(tabId);
2599 return 0;
2600}

References _GetPurchasedTabsSize(), and GetRankInfo().

Referenced by _GetMemberRemainingSlots(), and _UpdateMemberWithdrawSlots().

◆ _GetRankName()

std::string Guild::_GetRankName ( uint8  rankId) const
inlineprivate
2574{
2575 if (RankInfo const* rankInfo = GetRankInfo(rankId))
2576 return rankInfo->GetName();
2577 return "<unknown>";
2578}

References GetRankInfo().

Referenced by HandleUpdateMemberRank().

◆ _GetRankRights()

uint32 Guild::_GetRankRights ( uint8  rankId) const
inlineprivate
2581{
2582 if (RankInfo const* rankInfo = GetRankInfo(rankId))
2583 return rankInfo->GetRights();
2584 return 0;
2585}

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
817 {
818 if (player)
819 if (Member const* member = GetMember(player->GetGUID()))
820 return (_GetRankRights(member->GetRankId()) & right) != GR_RIGHT_EMPTY;
821 return false;
822 }
@ 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
2511{
2512 if (player->GetGUID() == m_leaderGuid)
2513 return true;
2514 if (Member const* member = GetMember(player->GetGUID()))
2515 return member->IsRank(GR_GUILDMASTER);
2516 return false;
2517}
ObjectGuid m_leaderGuid
Definition Guild.h:795

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
2688{
2689 if (tabId > GUILD_BANK_MAX_TABS)
2690 return;
2691
2692 // not logging moves within the same tab
2693 if (eventType == GUILD_BANK_LOG_MOVE_ITEM && tabId == destTabId)
2694 return;
2695
2696 uint8 dbTabId = tabId;
2697 if (BankEventLogEntry::IsMoneyEvent(eventType))
2698 {
2699 tabId = GUILD_BANK_MAX_TABS;
2700 dbTabId = GUILD_BANK_MONEY_LOGS_TAB;
2701 }
2702 LogHolder<BankEventLogEntry>& pLog = m_bankEventLog[tabId];
2703 pLog.AddEvent(trans, m_id, pLog.GetNextGUID(), eventType, dbTabId, guid, itemOrMoney, itemStackCount, destTabId);
2704
2705 sScriptMgr->OnGuildBankEvent(this, uint8(eventType), tabId, guid.GetCounter(), itemOrMoney, itemStackCount, destTabId);
2706}
@ GUILD_BANK_MONEY_LOGS_TAB
Definition Guild.h:44
@ GUILD_BANK_LOG_MOVE_ITEM
Definition Guild.h:199
#define sScriptMgr
Definition ScriptMgr.h:766
bool IsMoneyEvent() const
Definition Guild.h:457
std::array< LogHolder< BankEventLogEntry >, GUILD_BANK_MAX_TABS+1 > m_bankEventLog
Definition Guild.h:810

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
2678{
2679 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2680 m_eventLog.AddEvent(trans, m_id, m_eventLog.GetNextGUID(), eventType, playerGuid1, playerGuid2, newRank);
2681 CharacterDatabase.CommitTransaction(trans);
2682
2683 sScriptMgr->OnGuildEvent(this, uint8(eventType), playerGuid1.GetCounter(), playerGuid2.GetCounter(), newRank);
2684}
LogHolder< EventLogEntry > m_eventLog
Definition Guild.h:809
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
2650{
2651 if (Member const* member = GetMember(guid))
2652 {
2653 // Leader always has full rights
2654 if (member->IsRank(GR_GUILDMASTER) || m_leaderGuid == guid)
2655 return true;
2656 return (_GetRankBankTabRights(member->GetRankId(), tabId) & rights) == rights;
2657 }
2658 return false;
2659}

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
2529{
2530 if (add)
2531 m_bankMoney += amount;
2532 else
2533 {
2534 // Check if there is enough money in bank.
2535 if (m_bankMoney < amount)
2536 return false;
2537 m_bankMoney -= amount;
2538 }
2539
2541 stmt->SetData(0, m_bankMoney);
2542 stmt->SetData(1, m_id);
2543 trans->Append(stmt);
2544 return true;
2545}
@ 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
2722{
2723 // 1. Initialize source item
2724 if (!pSrc->InitItem())
2725 return; // No source item
2726
2727 // 2. Check source item
2728 if (!pSrc->CheckItem(splitedAmount))
2729 return; // Source item or splited amount is invalid
2730
2731 // 3. Check destination rights
2732 if (!pDest->HasStoreRights(pSrc))
2733 return; // Player has no rights to store item in destination
2734
2735 // 4. Check source withdraw rights
2736 if (!pSrc->HasWithdrawRights(pDest))
2737 return; // Player has no rights to withdraw items from source
2738
2739 // 5. Check split
2740 if (splitedAmount)
2741 {
2742 // 5.1. Clone source item
2743 if (!pSrc->CloneItem(splitedAmount))
2744 return; // Item could not be cloned
2745
2746 // 5.2. Move splited item to destination
2747 _DoItemsMove(pSrc, pDest, true, splitedAmount);
2748 }
2749 else // 6. No split
2750 {
2751 // 6.1. Try to merge items in destination (pDest->GetItem() == nullptr)
2752 if (!_DoItemsMove(pSrc, pDest, false)) // Item could not be merged
2753 {
2754 // 6.2. Try to swap items
2755 // 6.2.1. Initialize destination item
2756 if (!pDest->InitItem())
2757 return;
2758
2759 // 6.2.2. Check rights to store item in source (opposite direction)
2760 if (!pSrc->HasStoreRights(pDest))
2761 return; // Player has no rights to store item in source (opposite direction)
2762
2763 if (!pDest->HasWithdrawRights(pSrc))
2764 return; // Player has no rights to withdraw item from destination (opposite direction)
2765
2766 // 6.2.3. Swap items (pDest->GetItem() != nullptr)
2767 _DoItemsMove(pSrc, pDest, true);
2768 }
2769 }
2770 // 7. Send changes
2771 _SendBankContentUpdate(pSrc, pDest);
2772}
bool _DoItemsMove(MoveItemData *pSrc, MoveItemData *pDest, bool sendError, uint32 splitedAmount=0)
Definition Guild.cpp:2774
void _SendBankContentUpdate(MoveItemData *pSrc, MoveItemData *pDest) const
Definition Guild.cpp:2832

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
2716{
2717 if (BankTab* pTab = GetBankTab(tabId))
2718 pTab->SetItem(trans, slotId, nullptr);
2719}

References GetBankTab().

◆ _SendBankContent()

void Guild::_SendBankContent ( WorldSession *  session,
uint8  tabId,
bool  sendAllSlots 
) const
private
2819{
2820 ObjectGuid guid = session->GetPlayer()->GetGUID();
2822 return;
2823
2824 _SendBankList(session, tabId, sendAllSlots);
2825}
void _SendBankList(WorldSession *session=nullptr, uint8 tabId=0, bool sendFullSlots=false, SlotIds *slots=nullptr) const
Definition Guild.cpp:2893
bool _MemberHasTabRights(ObjectGuid guid, uint8 tabId, uint32 rights) const
Definition Guild.cpp:2649
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
2833{
2834 ASSERT(pSrc->IsBank() || pDest->IsBank());
2835
2836 uint8 tabId = 0;
2837 SlotIds slots;
2838 if (pSrc->IsBank()) // B ->
2839 {
2840 tabId = pSrc->GetContainer();
2841 slots.insert(pSrc->GetSlotId());
2842 if (pDest->IsBank()) // B -> B
2843 {
2844 // Same tab - add destination slots to collection
2845 if (pDest->GetContainer() == pSrc->GetContainer())
2846 pDest->CopySlots(slots);
2847 else // Different tabs - send second message
2848 {
2849 SlotIds destSlots;
2850 pDest->CopySlots(destSlots);
2851 _SendBankContentUpdate(pDest->GetContainer(), destSlots);
2852 }
2853 }
2854 }
2855 else if (pDest->IsBank()) // C -> B
2856 {
2857 tabId = pDest->GetContainer();
2858 pDest->CopySlots(slots);
2859 }
2860
2861 _SendBankContentUpdate(tabId, slots);
2862}
#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
2865{
2866 _SendBankList(nullptr, tabId, false, &slots);
2867}

References _SendBankList().

◆ _SendBankList()

void Guild::_SendBankList ( WorldSession *  session = nullptr,
uint8  tabId = 0,
bool  sendFullSlots = false,
SlotIds *  slots = nullptr 
) const
private
2894{
2895 if (!sScriptMgr->CanGuildSendBankList(this, session, tabId, sendAllSlots))
2896 return;
2897
2899
2900 packet.Money = m_bankMoney;
2901 packet.Tab = int32(tabId);
2902 packet.FullUpdate = sendAllSlots;
2903
2904 if (sendAllSlots && !tabId)
2905 {
2906 packet.TabInfo.reserve(_GetPurchasedTabsSize());
2907 for (uint8 i = 0; i < _GetPurchasedTabsSize(); ++i)
2908 {
2910 tabInfo.Name = m_bankTabs[i].GetName();
2911 tabInfo.Icon = m_bankTabs[i].GetIcon();
2912 packet.TabInfo.push_back(tabInfo);
2913 }
2914 }
2915
2916 if (BankTab const* tab = GetBankTab(tabId))
2917 {
2918 auto fillItems = [&](auto begin, auto end, bool skipEmpty)
2919 {
2920 for (auto itr = begin; itr != end; ++itr)
2921 {
2922 if (Item* tabItem = tab->GetItem(*itr))
2923 {
2925
2926 itemInfo.Slot = *itr;
2927 itemInfo.ItemID = tabItem->GetEntry();
2928 itemInfo.Count = int32(tabItem->GetCount());
2929 itemInfo.Charges = int32(std::abs(tabItem->GetSpellCharges()));
2930 itemInfo.EnchantmentID = int32(tabItem->GetEnchantmentId(PERM_ENCHANTMENT_SLOT));
2931 itemInfo.Flags = tabItem->GetInt32Value(ITEM_FIELD_FLAGS);
2932 itemInfo.RandomPropertiesID = tabItem->GetItemRandomPropertyId();
2933 itemInfo.RandomPropertiesSeed = int32(tabItem->GetItemSuffixFactor());
2934
2935 for (uint32 socketSlot = 0; socketSlot < MAX_GEM_SOCKETS; ++socketSlot)
2936 {
2937 if (uint32 enchId = tabItem->GetEnchantmentId(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT + socketSlot)))
2938 {
2940 gem.SocketIndex = socketSlot;
2941 gem.SocketEnchantID = int32(enchId);
2942 itemInfo.SocketEnchant.push_back(gem);
2943 }
2944 }
2945
2946 packet.ItemInfo.push_back(itemInfo);
2947 }
2948 else if (!skipEmpty)
2949 {
2951
2952 itemInfo.Slot = *itr;
2953 itemInfo.ItemID = 0;
2954
2955 packet.ItemInfo.push_back(itemInfo);
2956 }
2957 }
2958
2959 };
2960
2961 if (sendAllSlots)
2962 fillItems(boost::make_counting_iterator(uint8(0)), boost::make_counting_iterator(uint8(GUILD_BANK_MAX_SLOTS)), true);
2963 else if (slots && !slots->empty())
2964 fillItems(slots->begin(), slots->end(), false);
2965 }
2966
2967 if (session)
2968 {
2969 if (Member const* member = GetMember(session->GetPlayer()->GetGUID()))
2970 packet.WithdrawalsRemaining = _GetMemberRemainingSlots(*member, tabId);
2971
2972 session->SendPacket(packet.Write());
2973 LOG_DEBUG("guild", "SMSG_GUILD_BANK_LIST [{}]: TabId: {}, FullSlots: {}, slots: {}",
2974 session->GetPlayerInfo(), tabId, sendAllSlots, packet.WithdrawalsRemaining);
2975 }
2976 else
2977 {
2978 packet.Write();
2979 for (auto const& [guid, member] : m_members)
2980 {
2981 if (!member.ShouldReceiveBankPartialUpdatePackets())
2982 continue;
2983
2984 if (!_MemberHasTabRights(member.GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB))
2985 continue;
2986
2987 Player* player = member.FindPlayer();
2988 if (!player)
2989 continue;
2990
2992 player->SendDirectMessage(packet.GetRawPacket());
2993 LOG_DEBUG("guild", "SMSG_GUILD_BANK_LIST [{}]: TabId: {}, FullSlots: {}, slots: {}"
2994 , player->GetName(), tabId, sendAllSlots, packet.WithdrawalsRemaining);
2995 }
2996 }
2997}
std::uint32_t uint32
Definition Define.h:107
@ 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:2609
std::unordered_map< uint32, Member > m_members
Definition Guild.h:805
Definition Player.h:1086
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5864
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:308
std::string GetPlayerInfo() const
Definition WorldSession.cpp:272
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
2828{
2829 _SendBankList(session);
2830}

References _SendBankList().

◆ _SetLeaderGUID()

void Guild::_SetLeaderGUID ( Member &  pLeader)
private
2548{
2549 m_leaderGuid = pLeader.GetGUID();
2550 pLeader.ChangeRank(GR_GUILDMASTER);
2551
2553 stmt->SetData(0, m_leaderGuid.GetCounter());
2554 stmt->SetData(1, m_id);
2555 CharacterDatabase.Execute(stmt);
2556}
@ 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
2559{
2560 if (RankInfo* rankInfo = GetRankInfo(rankId))
2561 rankInfo->SetBankMoneyPerDay(moneyPerDay);
2562}

References GetRankInfo().

Referenced by HandleSetRankInfo(), and HandleSetRankInfo().

◆ _SetRankBankTabRightsAndSlots()

void Guild::_SetRankBankTabRightsAndSlots ( uint8  rankId,
GuildBankRightsAndSlots  rightsAndSlots,
bool  saveToDB = true 
)
private
2565{
2566 if (rightsAndSlots.GetTabId() >= _GetPurchasedTabsSize())
2567 return;
2568
2569 if (RankInfo* rankInfo = GetRankInfo(rankId))
2570 rankInfo->SetBankTabSlotsAndRights(rightsAndSlots, saveToDB);
2571}
uint8 GetTabId() const
Definition Guild.h:282

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

Referenced by HandleSetRankInfo(), and LoadBankRightFromDB().

◆ _UpdateAccountsNumber()

void Guild::_UpdateAccountsNumber ( )
private
2498{
2499 // We use a set to be sure each element will be unique
2500 std::unordered_set<uint32> accountsIdSet;
2501 for (auto const& [guid, member] : m_members)
2502 accountsIdSet.insert(member.GetAccountId());
2503
2504 m_accountsNumber = accountsIdSet.size();
2505}

References m_accountsNumber, and m_members.

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

◆ _UpdateMemberWithdrawSlots()

void Guild::_UpdateMemberWithdrawSlots ( CharacterDatabaseTransaction  trans,
ObjectGuid  guid,
uint8  tabId 
)
inlineprivate
2639{
2640 if (Member* member = GetMember(guid))
2641 {
2642 uint8 rankId = member->GetRankId();
2643 if (rankId != GR_GUILDMASTER
2644 && member->GetBankWithdrawValue(tabId) < _GetRankBankTabSlotsPerDay(rankId, tabId))
2645 member->UpdateBankWithdrawValue(trans, tabId, 1);
2646 }
2647}

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

◆ AddMember()

bool Guild::AddMember ( ObjectGuid  guid,
uint8  rankId = GUILD_RANK_NONE 
)
2231{
2233 // Player cannot be in guild
2234 if (player)
2235 {
2236 if (player->GetGuildId() != 0)
2237 return false;
2238 }
2239 else if (sCharacterCache->GetCharacterGuildIdByGuid(guid) != 0)
2240 return false;
2241
2242 // Remove all player signs from another petitions
2243 // This will be prevent attempt to join many guilds and corrupt guild data integrity
2245
2246 ObjectGuid::LowType lowguid = guid.GetCounter();
2247
2248 // If rank was not passed, assign lowest possible rank
2249 if (rankId == GUILD_RANK_NONE)
2250 rankId = _GetLowestRankId();
2251
2252 auto [memberIt, isNew] = m_members.try_emplace(lowguid, m_id, guid, rankId);
2253 if (!isNew)
2254 {
2255 LOG_ERROR("guild", "Tried to add {} to guild '{}'. Member already exists.", guid.ToString(), m_name);
2256 return false;
2257 }
2258
2259 Member& member = memberIt->second;
2260 std::string name;
2261 if (player)
2262 {
2263 player->SetInGuild(m_id);
2264 player->SetGuildIdInvited(0);
2265 player->SetRank(rankId);
2266 member.SetStats(player);
2267 SendLoginInfo(player->GetSession());
2268 name = player->GetName();
2269 }
2270 else
2271 {
2272 member.ResetFlags();
2273
2274 bool ok = false;
2275 // xinef: sync query
2276 // Player must exist
2278 stmt->SetData(0, guid.GetCounter());
2279 if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
2280 {
2281 Field* fields = result->Fetch();
2282 name = fields[0].Get<std::string>();
2283 member.SetStats(
2284 name,
2285 fields[1].Get<uint8>(),
2286 fields[2].Get<uint8>(),
2287 fields[3].Get<uint8>(),
2288 fields[4].Get<uint16>(),
2289 fields[5].Get<uint32>());
2290
2291 ok = member.CheckStats();
2292 }
2293 if (!ok)
2294 {
2295 m_members.erase(memberIt);
2296 return false;
2297 }
2298 sCharacterCache->UpdateCharacterGuildId(guid, m_id);
2299 }
2300
2301 CharacterDatabaseTransaction trans(nullptr);
2302 member.SaveToDB(trans);
2303
2306 _BroadcastEvent(GE_JOINED, guid, name);
2307
2308 // Call scripts if member was succesfully added (and stored to database)
2309 sScriptMgr->OnGuildAddMember(this, player, rankId);
2310
2311 return true;
2312}
#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:1933
std::string m_name
Definition Guild.h:794
void _UpdateAccountsNumber()
Definition Guild.cpp:2497
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:2869
void _LogEvent(GuildEventLogTypes eventType, ObjectGuid playerGuid1, ObjectGuid playerGuid2=ObjectGuid::Empty, uint8 newRank=0)
Definition Guild.cpp:2677
uint8 _GetLowestRankId() const
Definition Guild.h:824
std::string ToString() const
Definition ObjectGuid.cpp:48
uint32 LowType
Definition ObjectGuid.h:125
void SetGuildIdInvited(uint32 GuildId)
Definition Player.h:1928
uint32 GetGuildId() const
Definition Player.h:1929
WorldSession * GetSession() const
Definition Player.h:2031
void SetInGuild(uint32 GuildId)
Definition Player.h:1920
void SetRank(uint8 rankId)
Definition Player.h:1926
static void RemovePetitionsAndSigns(ObjectGuid guid, uint32 type)
Definition Player.cpp:10283
@ 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
2191{
2192 for (auto const& [guid, member] : m_members)
2193 if (Player* player = member.FindPlayer())
2194 player->SendDirectMessage(packet);
2195}
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
2183{
2184 for (auto const& [guid, member] : m_members)
2185 if (member.IsRank(rankId))
2186 if (Player* player = member.FindPlayer())
2187 player->SendDirectMessage(packet);
2188}

References m_members.

◆ BroadcastToGuild()

void Guild::BroadcastToGuild ( WorldSession *  session,
bool  officerOnly,
std::string_view  msg,
uint32  language = LANG_UNIVERSAL 
) const
2170{
2171 if (session && session->GetPlayer() && _HasRankRight(session->GetPlayer(), officerOnly ? GR_RIGHT_OFFCHATSPEAK : GR_RIGHT_GCHATSPEAK))
2172 {
2173 WorldPacket data;
2174 ChatHandler::BuildChatPacket(data, officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, Language(language), session->GetPlayer(), nullptr, msg);
2175 for (auto const& [guid, member] : m_members)
2176 if (Player* player = member.FindPlayer())
2177 if (_HasRankRight(player, officerOnly ? GR_RIGHT_OFFCHATLISTEN : GR_RIGHT_GCHATLISTEN) && !player->GetSocial()->HasIgnore(session->GetPlayer()->GetGUID()))
2178 player->SendDirectMessage(&data);
2179 }
2180}
@ 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:816
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
758 {
759 for (auto const& m_member : m_members)
760 if (Player* player = m_member.second.FindPlayer())
761 if (player != except)
762 _do(player);
763 }

References m_members.

Referenced by AchievementMgr::SendAchievementEarned().

◆ ChangeMemberRank()

bool Guild::ChangeMemberRank ( ObjectGuid  guid,
uint8  newRank 
)
2376{
2377 if (newRank <= _GetLowestRankId()) // Validate rank (allow only existing ranks)
2378 if (Member* member = GetMember(guid))
2379 {
2380 member->ChangeRank(newRank);
2381
2382 if (newRank == GR_GUILDMASTER)
2383 {
2384 m_leaderGuid = guid;
2385
2387 stmt->SetData(0, m_leaderGuid.GetCounter());
2388 stmt->SetData(1, m_id);
2389 CharacterDatabase.Execute(stmt);
2390 }
2391
2392 return true;
2393 }
2394 return false;
2395}

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 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1079
1081 stmt->SetData(0, m_id);
1082 trans->Append(stmt);
1083
1084 uint8 index = 0;
1085 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GUILD);
1086 stmt->SetData( index, m_id);
1087 stmt->SetData(++index, m_name);
1088 stmt->SetData(++index, m_leaderGuid.GetCounter());
1089 stmt->SetData(++index, m_info);
1090 stmt->SetData(++index, m_motd);
1091 stmt->SetData(++index, uint32(m_createdDate));
1092 stmt->SetData(++index, m_emblemInfo.GetStyle());
1093 stmt->SetData(++index, m_emblemInfo.GetColor());
1094 stmt->SetData(++index, m_emblemInfo.GetBorderStyle());
1095 stmt->SetData(++index, m_emblemInfo.GetBorderColor());
1096 stmt->SetData(++index, m_emblemInfo.GetBackgroundColor());
1097 stmt->SetData(++index, m_bankMoney);
1098 trans->Append(stmt);
1099
1100 CharacterDatabase.CommitTransaction(trans);
1101 _CreateDefaultGuildRanks(pLeaderSession->GetSessionDbLocaleIndex()); // Create default ranks
1102 bool ret = AddMember(m_leaderGuid, GR_GUILDMASTER); // Add guildmaster
1103
1104 for (short i = 0; i < static_cast<short>(sWorld->getIntConfig(CONFIG_GUILD_BANK_INITIAL_TABS)); i++)
1105 {
1107 }
1108
1109 if (ret)
1110 sScriptMgr->OnGuildCreate(this, pLeader, m_name);
1111
1112 return ret;
1113}
@ CHAR_INS_GUILD
Definition CharacterDatabase.h:141
@ CHAR_DEL_GUILD_MEMBERS
Definition CharacterDatabase.h:146
#define sGuildMgr
Definition GuildMgr.h:51
@ CONFIG_GUILD_BANK_INITIAL_TABS
Definition WorldConfig.h:375
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:2436
bool AddMember(ObjectGuid guid, uint8 rankId=GUILD_RANK_NONE)
Definition Guild.cpp:2230
std::string m_motd
Definition Guild.h:796
EmblemInfo m_emblemInfo
Definition Guild.h:800
std::string m_info
Definition Guild.h:797
void _CreateDefaultGuildRanks(LocaleConstant loc)
Definition Guild.cpp:2460
Player session in the World.
Definition WorldSession.h:430
LocaleConstant GetSessionDbLocaleIndex() const
Definition WorldSession.h:647
#define sWorld
Definition World.h:318
Seconds GetGameTime()
Definition GameTime.cpp:38

References _CreateDefaultGuildRanks(), _CreateNewBankTab(), AddMember(), CHAR_DEL_GUILD_MEMBERS, 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 
)
2315{
2316 ObjectGuid::LowType lowguid = guid.GetCounter();
2318
2319 // Guild master can be deleted when loading guild and guid doesn't exist in characters table
2320 // or when he is removed from guild by gm command
2321 if (m_leaderGuid == guid && !isDisbanding)
2322 {
2323 Member* oldLeader = nullptr;
2324 Member* newLeader = nullptr;
2325 for (auto& [guid, member] : m_members)
2326 {
2327 if (guid == lowguid)
2328 oldLeader = &member;
2329 else if (!newLeader || newLeader->GetRankId() > member.GetRankId())
2330 newLeader = &member;
2331 }
2332
2333 if (!newLeader)
2334 {
2335 Disband();
2336 if (canDeleteGuild)
2337 delete this;
2338 return;
2339 }
2340
2341 _SetLeaderGUID(*newLeader);
2342
2343 // If player not online data in data field will be loaded from guild tabs no need to update it !!
2344 if (Player* newLeaderPlayer = newLeader->FindPlayer())
2345 newLeaderPlayer->SetRank(GR_GUILDMASTER);
2346
2347 // If leader does not exist (at guild loading with deleted leader) do not send broadcasts
2348 if (oldLeader)
2349 {
2350 _BroadcastEvent(GE_LEADER_CHANGED, ObjectGuid::Empty, oldLeader->GetName(), newLeader->GetName());
2351 _BroadcastEvent(GE_LEFT, guid, oldLeader->GetName());
2352 }
2353 }
2354 // Call script on remove before member is actually removed from guild (and database)
2355 sScriptMgr->OnGuildRemoveMember(this, player, isDisbanding, isKicked);
2356
2357 m_members.erase(lowguid);
2358
2359 // If player not online data in data field will be loaded from guild tabs no need to update it !!
2360 if (player)
2361 {
2362 player->SetInGuild(0);
2363 player->SetRank(0);
2364 }
2365 else
2366 {
2367 sCharacterCache->UpdateCharacterGuildId(guid, 0);
2368 }
2369
2371 if (!isDisbanding)
2373}
@ GE_LEFT
Definition Guild.h:151
@ GE_LEADER_CHANGED
Definition Guild.h:154
void _SetLeaderGUID(Member &pLeader)
Definition Guild.cpp:2547
void Disband()
Definition Guild.cpp:1116
void _DeleteMemberFromDB(ObjectGuid::LowType lowguid) const
Definition Guild.h:830
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 ( )
1117{
1118 // Call scripts before guild data removed from database
1119 sScriptMgr->OnGuildDisband(this);
1120
1122 // Remove all members
1123 while (!m_members.empty())
1124 {
1125 auto itr = m_members.begin();
1126 DeleteMember(itr->second.GetGUID(), true);
1127 }
1128
1129 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1130
1132 stmt->SetData(0, m_id);
1133 trans->Append(stmt);
1134
1135 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_RANKS);
1136 stmt->SetData(0, m_id);
1137 trans->Append(stmt);
1138
1139 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_TABS);
1140 stmt->SetData(0, m_id);
1141 trans->Append(stmt);
1142
1143 // Free bank tab used memory and delete items stored in them
1144 _DeleteBankItems(trans, true);
1145
1146 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_ITEMS);
1147 stmt->SetData(0, m_id);
1148 trans->Append(stmt);
1149
1150 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_RIGHTS);
1151 stmt->SetData(0, m_id);
1152 trans->Append(stmt);
1153
1154 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_EVENTLOGS);
1155 stmt->SetData(0, m_id);
1156 trans->Append(stmt);
1157
1158 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_EVENTLOGS);
1159 stmt->SetData(0, m_id);
1160 trans->Append(stmt);
1161
1162 CharacterDatabase.CommitTransaction(trans);
1163 sGuildMgr->RemoveGuild(m_id);
1164}
@ CHAR_DEL_GUILD_BANK_TABS
Definition CharacterDatabase.h:153
@ CHAR_DEL_GUILD
Definition CharacterDatabase.h:142
@ 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
@ GE_DISBANDED
Definition Guild.h:155
void DeleteMember(ObjectGuid guid, bool isDisbanding=false, bool isKicked=false, bool canDeleteGuild=false)
Definition Guild.cpp:2314

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
827{ 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
828{ 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
786{ 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
815{ return rankId < _GetRanksSize() ? &m_ranks[rankId] : nullptr; }

References _GetRanksSize(), and m_ranks.

◆ GetRankInfo() [2/2]

◆ GetRankRights()

uint32 Guild::GetRankRights ( uint8  rankId) const
2667{
2668 return _GetRankRights(rankId);
2669}

References _GetRankRights().

◆ GetTotalBankMoney()

uint64 Guild::GetTotalBankMoney ( ) const
inline

◆ HandleAcceptMember()

void Guild::HandleAcceptMember ( WorldSession *  session)
1532{
1533 Player* player = session->GetPlayer();
1534 if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && player->GetTeamId() != sCharacterCache->GetCharacterTeamByGuid(GetLeaderGUID()))
1535 {
1536 return;
1537 }
1538
1539 AddMember(player->GetGUID());
1540}
@ 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:2139

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 
)
1661{
1662 uint8 size = _GetRanksSize();
1663 if (size >= GUILD_RANKS_MAX_COUNT)
1664 return;
1665
1666 // Only leader can add new rank
1667 if (_IsLeader(session->GetPlayer()))
1669 _BroadcastEvent(GE_RANK_UPDATED, ObjectGuid::Empty, std::to_string(size), name, std::to_string(m_ranks.size()));
1670}
@ GE_RANK_UPDATED
Definition Guild.h:157
bool _IsLeader(Player *player) const
Definition Guild.cpp:2510

References _BroadcastEvent(), _CreateRank(), _GetRanksSize(), _IsLeader(), 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

1440{
1441 Player* player = session->GetPlayer();
1442 if (!player)
1443 return;
1444
1445 Member const* member = GetMember(player->GetGUID());
1446 if (!member)
1447 return;
1448
1450 return;
1451
1452 if (tabId != _GetPurchasedTabsSize())
1453 return;
1454
1455 uint32 tabCost = _GetGuildBankTabPrice(tabId);
1456 if (!tabCost)
1457 return;
1458
1459 if (!player->HasEnoughMoney(tabCost)) // Should not happen, this is checked by client
1460 return;
1461
1462 player->ModifyMoney(-int32(tabCost));
1463
1466 SendPermissions(session);
1467}
uint32 _GetGuildBankTabPrice(uint8 tabId)
Definition Guild.cpp:94
@ GE_BANK_TAB_PURCHASED
Definition Guild.h:162
void SendPermissions(WorldSession *session)
Definition Guild.cpp:1889
bool ModifyMoney(int32 amount, bool sendError=true)
Definition Player.cpp:11689
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)
1810{
1811 // Only leader can disband guild
1812 if (_IsLeader(session->GetPlayer()))
1813 {
1814 Disband();
1815 LOG_DEBUG("guild", "Guild Successfully Disbanded");
1816 delete this;
1817 }
1818}

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

◆ HandleInviteMember()

void Guild::HandleInviteMember ( WorldSession *  session,
std::string const &  name 
)
1470{
1471 Player* pInvitee = ObjectAccessor::FindPlayerByName(name, false);
1472 if (!pInvitee)
1473 {
1475 return;
1476 }
1477
1478 Player* player = session->GetPlayer();
1479 // Do not show invitations from ignored players
1480 if (pInvitee->GetSocial()->HasIgnore(player->GetGUID()))
1481 return;
1482
1483 uint32 memberLimit = sWorld->getIntConfig(CONFIG_GUILD_MEMBER_LIMIT);
1484 if (memberLimit > 0 && player->GetGuild()->GetMemberCount() >= memberLimit)
1485 {
1486 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);
1488 return;
1489 }
1490
1491 if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && pInvitee->GetTeamId(true) != player->GetTeamId(true))
1492 {
1494 return;
1495 }
1496 // Invited player cannot be in another guild
1497 if (pInvitee->GetGuildId())
1498 {
1500 return;
1501 }
1502 // Invited player cannot be invited
1503 if (pInvitee->GetGuildIdInvited())
1504 {
1506 return;
1507 }
1508 // Inviting player must have rights to invite
1509 if (!_HasRankRight(player, GR_RIGHT_INVITE))
1510 {
1512 return;
1513 }
1514
1516
1517 LOG_DEBUG("guild", "Player {} invited {} to join his Guild", player->GetName(), pInvitee->GetName());
1518
1519 pInvitee->SetGuildIdInvited(m_id);
1520 _LogEvent(GUILD_EVENT_LOG_INVITE_PLAYER, player->GetGUID(), pInvitee->GetGUID());
1521
1523
1524 invite.InviterName = player->GetName();
1525 invite.GuildName = GetName();
1526
1527 pInvitee->SendDirectMessage(invite.Write());
1528 LOG_DEBUG("guild", "SMSG_GUILD_INVITE [{}]", pInvitee->GetName());
1529}
@ 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:382
Definition Chat.h:37
void PSendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition Chat.cpp:219
uint32 GetMemberCount() const
Definition Guild.h:777
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:1931
Guild * GetGuild() const
Definition Player.cpp:16383
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)
1543{
1544 Player* player = session->GetPlayer();
1545 bool disband = false;
1546
1547 // If leader is leaving
1548 if (_IsLeader(player))
1549 {
1550 if (m_members.size() > 1)
1551 // Leader cannot leave if he is not the last member
1553 else
1554 {
1555 // Guild is disbanded if leader leaves.
1556 Disband();
1557 disband = true;
1558 }
1559 }
1560 else
1561 {
1562 DeleteMember(player->GetGUID(), false, false);
1563
1565 _BroadcastEvent(GE_LEFT, player->GetGUID(), player->GetName());
1566
1568 }
1569
1570 sCalendarMgr->RemovePlayerGuildEventsAndSignups(player->GetGUID(), GetId());
1571
1572 if (disband)
1573 delete this;
1574}
#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 
)
1701{
1702 Player* player = session->GetPlayer();
1703
1704 // Call script after validation and before money transfer.
1705 sScriptMgr->OnGuildMemberDepositMoney(this, player, amount);
1706
1707 if (m_bankMoney > GUILD_BANK_MONEY_LIMIT - amount)
1708 {
1710 return;
1711 }
1712
1713 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1714 _ModifyBankMoney(trans, amount, true);
1715
1716 player->ModifyMoney(-int32(amount));
1717 player->SaveGoldToDB(trans);
1718 _LogBankEvent(trans, GUILD_BANK_LOG_DEPOSIT_MONEY, uint8(0), player->GetGUID(), amount);
1719
1720 CharacterDatabase.CommitTransaction(trans);
1721
1723 {
1724 LOG_GM(session->GetAccountId(), "GM {} (Account: {}) deposited {} to guild bank (Guild: {} GuildId: {})",
1725 player->GetName(), session->GetAccountId(), amount, GetName(), GetId());
1726 }
1727
1728 std::string aux = Acore::Impl::ByteArrayToHexStr(reinterpret_cast<uint8*>(&m_bankMoney), 8, true);
1730
1731 if (amount > 10 * GOLD) // receiver_acc = Guild id, receiver_name = Guild name
1732 CharacterDatabase.Execute("INSERT INTO log_money VALUES({}, {}, \"{}\", \"{}\", {}, \"{}\", {}, \"(guild members: {}, new amount: {}, leader guid low: {}, sender level: {})\", NOW(), {})",
1733 session->GetAccountId(), player->GetGUID().GetCounter(), player->GetName(), session->GetRemoteAddress(), GetId(), GetName(), amount, GetMemberCount(), GetTotalBankMoney(), GetLeaderGUID().GetCounter(), player->GetLevel(), 3);
1734}
@ 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:2528
void _LogBankEvent(CharacterDatabaseTransaction trans, GuildBankEventLogTypes eventType, uint8 tabId, ObjectGuid playerGuid, uint32 itemOrMoney, uint16 itemStackCount=0, uint8 destTabId=0)
Definition Guild.cpp:2687
uint64 GetTotalBankMoney() const
Definition Guild.h:776
void SaveGoldToDB(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7320
uint8 GetLevel() const
Definition Unit.h:1109
bool HasPermission(uint32 permissionId)
Definition WorldSession.cpp:1691
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)
1798{
1799 Player* player = session->GetPlayer();
1800 if (Member* member = GetMember(player->GetGUID()))
1801 {
1802 member->SetStats(player);
1803 member->UpdateLogoutTime();
1804 member->ResetFlags();
1805 }
1806 _BroadcastEvent(GE_SIGNED_OFF, player->GetGUID(), player->GetName());
1807}
@ 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 
)
1737{
1738 //clamp amount to MAX_MONEY_AMOUNT, Players can't hold more than that anyway
1739 amount = std::min(amount, uint32(MAX_MONEY_AMOUNT));
1740
1741 if (m_bankMoney < amount) // Not enough money in bank
1742 return false;
1743
1744 Player* player = session->GetPlayer();
1745
1746 Member* member = GetMember(player->GetGUID());
1747 if (!member)
1748 return false;
1749
1750 if (uint32(_GetMemberRemainingMoney(*member)) < amount) // Check if we have enough slot/money today
1751 return false;
1752
1753 if (!(_GetRankRights(member->GetRankId()) & GR_RIGHT_WITHDRAW_REPAIR) && repair)
1754 return false;
1755
1756 // Call script after validation and before money transfer.
1757 sScriptMgr->OnGuildMemberWitdrawMoney(this, player, amount, repair);
1758
1759 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1760
1761 if (!_ModifyBankMoney(trans, amount, false))
1762 return false;
1763
1764 if (!repair)
1765 {
1766 if (!player->ModifyMoney(amount))
1767 {
1768 _ModifyBankMoney(trans, amount, true);
1769 return false;
1770 }
1771
1772 player->SaveGoldToDB(trans);
1773 }
1774
1775 // Update remaining money amount
1776 member->UpdateBankWithdrawValue(trans, GUILD_BANK_MAX_TABS, amount);
1777
1778 // Log guild bank event
1779 _LogBankEvent(trans, repair ? GUILD_BANK_LOG_REPAIR_MONEY : GUILD_BANK_LOG_WITHDRAW_MONEY, uint8(0), player->GetGUID(), amount);
1780 CharacterDatabase.CommitTransaction(trans);
1781
1783 {
1784 LOG_GM(session->GetAccountId(), "GM {} (Account: {}) withdrew {} from guild bank (Guild: {} GuildId: {})",
1785 player->GetName(), session->GetAccountId(), amount, GetName(), GetId());
1786 }
1787
1788 if (amount > 10 * GOLD) // sender_acc = 0 (guild has no account), sender_guid = Guild id, sender_name = Guild name
1789 CharacterDatabase.Execute("INSERT INTO log_money VALUES({}, {}, \"{}\", \"{}\", {}, \"{}\", {}, \"(guild, members: {}, new amount: {}, leader guid low: {}, withdrawer level: {})\", NOW(), {})",
1790 0, GetId(), GetName(), session->GetRemoteAddress(), session->GetAccountId(), player->GetName(), amount, GetMemberCount(), GetTotalBankMoney(), GetLeaderGUID().GetCounter(), player->GetLevel(), 4);
1791
1792 std::string aux = Acore::Impl::ByteArrayToHexStr(reinterpret_cast<uint8*>(&m_bankMoney), 8, true);
1794 return true;
1795}
@ 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:2623

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)
1259{
1261 response.GuildId = m_id;
1262
1268
1269 for (uint8 i = 0; i < _GetRanksSize(); ++i)
1270 response.Info.Ranks[i] = m_ranks[i].GetName();
1271
1272 response.Info.RankCount = _GetRanksSize();
1273
1274 response.Info.GuildName = m_name;
1275
1276 session->SendPacket(response.Write());
1277 LOG_DEBUG("guild", "SMSG_GUILD_QUERY_RESPONSE [{}]", session->GetPlayerInfo());
1278}
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)
1673{
1675}
void HandleRemoveRank(WorldSession *session, uint8 rankId)
Definition Guild.cpp:1677

References _GetLowestRankId(), and HandleRemoveRank().

◆ HandleRemoveMember()

void Guild::HandleRemoveMember ( WorldSession *  session,
std::string_view  name 
)
1577{
1578 Player* player = session->GetPlayer();
1579 // Player must have rights to remove members
1580 if (!_HasRankRight(player, GR_RIGHT_REMOVE))
1582 else if (Member* member = GetMember(name))
1583 {
1584 // Guild masters cannot be removed
1585 if (member->IsRank(GR_GUILDMASTER))
1587 // Do not allow to remove player with the same rank or higher
1588 else
1589 {
1590 Member const* memberMe = GetMember(player->GetGUID());
1591 if (!memberMe || member->IsRankNotLower(memberMe->GetRankId()))
1593 else
1594 {
1595 // Copy values since everything will be deleted in DeleteMember().
1596 ObjectGuid guid = member->GetGUID();
1597 std::string memberName = member->GetName();
1598
1599 // After call to DeleteMember pointer to member becomes invalid
1600 DeleteMember(guid, false, true);
1602 _BroadcastEvent(GE_REMOVED, ObjectGuid::Empty, memberName, player->GetName());
1603 }
1604 }
1605 }
1606}
@ 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 
)
1678{
1679 // Cannot remove rank if total count is minimum allowed by the client or is not leader
1680 if (_GetRanksSize() <= GUILD_RANKS_MIN_COUNT || rankId >= _GetRanksSize() || !_IsLeader(session->GetPlayer()))
1681 return;
1682
1683 // Delete bank rights for rank
1685 stmt->SetData(0, m_id);
1686 stmt->SetData(1, rankId);
1687 CharacterDatabase.Execute(stmt);
1688 // Delete rank
1689 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_LOWEST_RANK);
1690 stmt->SetData(0, m_id);
1691 stmt->SetData(1, rankId);
1692 CharacterDatabase.Execute(stmt);
1693
1694 // match what the sql statement does
1695 m_ranks.erase(m_ranks.begin() + rankId, m_ranks.end());
1696
1697 _BroadcastEvent(GE_RANK_DELETED, ObjectGuid::Empty, std::to_string(m_ranks.size()));
1698}
@ 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)
1212{
1214
1215 roster.RankData.reserve(m_ranks.size());
1216 for (RankInfo const& rank : m_ranks)
1217 {
1218 WorldPackets::Guild::GuildRankData& rankData = roster.RankData.emplace_back();
1219
1220 rankData.Flags = rank.GetRights();
1221 rankData.WithdrawGoldLimit = rank.GetBankMoneyPerDay();
1222 for (uint8 i = 0; i < GUILD_BANK_MAX_TABS; ++i)
1223 {
1224 rankData.TabFlags[i] = rank.GetBankTabRights(i);
1225 rankData.TabWithdrawItemLimit[i] = rank.GetBankTabSlotsPerDay(i);
1226 }
1227 }
1228
1229 bool sendOfficerNote = _HasRankRight(session->GetPlayer(), GR_RIGHT_VIEWOFFNOTE);
1230 roster.MemberData.reserve(m_members.size());
1231 for (auto const& [guid, member] : m_members)
1232 {
1233 WorldPackets::Guild::GuildRosterMemberData& memberData = roster.MemberData.emplace_back();
1234
1235 memberData.Guid = member.GetGUID();
1236 memberData.RankID = int32(member.GetRankId());
1237 memberData.AreaID = int32(member.GetZoneId());
1238 memberData.LastSave = float(float(GameTime::GetGameTime().count() - member.GetLogoutTime()) / DAY);
1239
1240 memberData.Status = member.GetFlags();
1241 memberData.Level = member.GetLevel();
1242 memberData.ClassID = member.GetClass();
1243 memberData.Gender = member.GetGender();
1244
1245 memberData.Name = member.GetName();
1246 memberData.Note = member.GetPublicNote();
1247 if (sendOfficerNote)
1248 memberData.OfficerNote = member.GetOfficerNote();
1249 }
1250
1251 roster.WelcomeText = m_motd;
1252 roster.InfoText = m_info;
1253
1254 LOG_DEBUG("guild", "SMSG_GUILD_ROSTER [{}]", session->GetPlayerInfo());
1255 session->SendPacket(roster.Write());
1256}
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 
)
1367{
1368 BankTab* tab = GetBankTab(tabId);
1369 if (!tab)
1370 {
1371 LOG_ERROR("guild", "Guild::HandleSetBankTabInfo: Player {} trying to change bank tab info from unexisting tab {}.",
1372 session->GetPlayerInfo(), tabId);
1373 return;
1374 }
1375
1376 tab->SetInfo(name, icon);
1377 _BroadcastEvent(GE_BANK_TAB_UPDATED, ObjectGuid::Empty, std::to_string(tabId), tab->GetName(), tab->GetIcon());
1378}
@ 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)
1342{
1343 m_emblemInfo = emblemInfo;
1345}
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 
)
1323{
1324 Player* player = session->GetPlayer();
1325 if (!_IsLeader(player))
1326 SendSaveEmblemResult(session, ERR_GUILDEMBLEM_NOTGUILDMASTER); // "Only guild leaders can create emblems."
1327 else if (!player->HasEnoughMoney(EMBLEM_PRICE))
1328 SendSaveEmblemResult(session, ERR_GUILDEMBLEM_NOTENOUGHMONEY); // "You can't afford to do that."
1329 else
1330 {
1331 player->ModifyMoney(-int32(EMBLEM_PRICE));
1332
1333 HandleSetEmblem(emblemInfo);
1334
1335 SendSaveEmblemResult(session, ERR_GUILDEMBLEM_SUCCESS); // "Guild Emblem saved."
1336
1337 HandleQuery(session);
1338 }
1339}
#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:1258
static void SendSaveEmblemResult(WorldSession *session, GuildEmblemError errCode)
Definition Guild.cpp:126
void HandleSetEmblem(WorldSession *session, EmblemInfo const &emblemInfo)
Definition Guild.cpp:1322

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 
)
1304{
1305 if (m_info == info)
1306 return;
1307
1308 // Player must have rights to set guild's info
1310 {
1311 m_info = info;
1312
1313 sScriptMgr->OnGuildInfoChanged(this, m_info);
1314
1316 stmt->SetData(0, m_info);
1317 stmt->SetData(1, m_id);
1318 CharacterDatabase.Execute(stmt);
1319 }
1320}
@ CHAR_UPD_GUILD_INFO
Definition CharacterDatabase.h:170
@ GR_RIGHT_MODIFY_GUILD_INFO
Definition Guild.h:89

References _HasRankRight(), CHAR_UPD_GUILD_INFO, CharacterDatabase, WorldSession::GetPlayer(), GR_RIGHT_MODIFY_GUILD_INFO, m_id, m_info, PreparedStatementBase::SetData(), and sScriptMgr.

◆ HandleSetLeader()

void Guild::HandleSetLeader ( WorldSession *  session,
std::string_view  name 
)
1348{
1349 Player* player = session->GetPlayer();
1350 // Only leader can assign new leader
1351 if (!_IsLeader(player))
1353 // Old leader must be a member of guild
1354 else if (Member* pOldLeader = GetMember(player->GetGUID()))
1355 {
1356 // New leader must be a member of guild
1357 if (Member* pNewLeader = GetMember(name))
1358 {
1359 _SetLeaderGUID(*pNewLeader);
1360 pOldLeader->ChangeRank(GR_OFFICER);
1361 _BroadcastEvent(GE_LEADER_CHANGED, ObjectGuid::Empty, player->GetName(), pNewLeader->GetName());
1362 }
1363 }
1364}
@ 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 
)
1381{
1382 // Player must have rights to set public/officer note
1383 if (!_HasRankRight(session->GetPlayer(), isPublic ? GR_RIGHT_EPNOTE : GR_RIGHT_EOFFNOTE))
1385 else if (Member* member = GetMember(name))
1386 {
1387 if (isPublic)
1388 member->SetPublicNote(note);
1389 else
1390 member->SetOfficerNote(note);
1391
1392 HandleRoster(session);
1393 }
1394}
@ 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:1211

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 
)
1281{
1282 if (m_motd == motd)
1283 return;
1284
1285 // Player must have rights to set MOTD
1286 if (!_HasRankRight(session->GetPlayer(), GR_RIGHT_SETMOTD))
1288 else
1289 {
1290 m_motd = motd;
1291
1292 sScriptMgr->OnGuildMOTDChanged(this, m_motd);
1293
1295 stmt->SetData(0, m_motd);
1296 stmt->SetData(1, m_id);
1297 CharacterDatabase.Execute(stmt);
1298
1300 }
1301}
@ CHAR_UPD_GUILD_MOTD
Definition CharacterDatabase.h:169
@ GE_MOTD
Definition Guild.h:149
@ GUILD_COMMAND_EDIT_MOTD
Definition Guild.h:107
@ GR_RIGHT_SETMOTD
Definition Guild.h:85

References _BroadcastEvent(), _HasRankRight(), CHAR_UPD_GUILD_MOTD, CharacterDatabase, ObjectGuid::Empty, ERR_GUILD_PERMISSIONS, GE_MOTD, WorldSession::GetPlayer(), GR_RIGHT_SETMOTD, GUILD_COMMAND_EDIT_MOTD, m_id, m_motd, SendCommandResult(), PreparedStatementBase::SetData(), and sScriptMgr.

◆ HandleSetRankInfo() [1/2]

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

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 
)
1397{
1398 // Only leader can modify ranks
1399 if (!_IsLeader(session->GetPlayer()))
1401 else if (RankInfo* rankInfo = GetRankInfo(rankId))
1402 {
1403 rankInfo->SetName(name);
1404 rankInfo->SetRights(rights);
1405 _SetRankBankMoneyPerDay(rankId, moneyPerDay);
1406
1407 for (auto& rightsAndSlot : rightsAndSlots)
1408 _SetRankBankTabRightsAndSlots(rankId, rightsAndSlot);
1409
1410 _BroadcastEvent(GE_RANK_UPDATED, ObjectGuid::Empty, std::to_string(rankId), rankInfo->GetName(), std::to_string(m_ranks.size()));
1411
1412 LOG_DEBUG("guild", "Changed RankName to '{}', rights to 0x{:08X}", rankInfo->GetName(), rights);
1413 }
1414}
@ GUILD_COMMAND_CHANGE_RANK
Definition Guild.h:110
void _SetRankBankTabRightsAndSlots(uint8 rankId, GuildBankRightsAndSlots rightsAndSlots, bool saveToDB=true)
Definition Guild.cpp:2564

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 
)
1609{
1610 Player* player = session->GetPlayer();
1612 // Player must have rights to promote
1613 if (!_HasRankRight(player, demote ? GR_RIGHT_DEMOTE : GR_RIGHT_PROMOTE))
1615 // Promoted player must be a member of guild
1616 else if (Member* member = GetMember(name))
1617 {
1618 // Player cannot promote himself
1619 if (member->IsSamePlayer(player->GetGUID()))
1620 {
1622 return;
1623 }
1624
1625 Member const* memberMe = GetMember(player->GetGUID());
1626 uint8 rankId = memberMe->GetRankId();
1627 if (demote)
1628 {
1629 // Player can demote only lower rank members
1630 if (member->IsRankNotLower(rankId))
1631 {
1632 SendCommandResult(session, type, ERR_GUILD_RANK_TOO_HIGH_S, name);
1633 return;
1634 }
1635 // Lowest rank cannot be demoted
1636 if (member->GetRankId() >= _GetLowestRankId())
1637 {
1638 SendCommandResult(session, type, ERR_GUILD_RANK_TOO_LOW_S, name);
1639 return;
1640 }
1641 }
1642 else
1643 {
1644 // Allow to promote only to lower rank than member's rank
1645 // member->GetRankId() + 1 is the highest rank that current player can promote to
1646 if (member->IsRankNotLower(rankId + 1))
1647 {
1648 SendCommandResult(session, type, ERR_GUILD_RANK_TOO_HIGH_S, name);
1649 return;
1650 }
1651 }
1652
1653 uint32 newRankId = member->GetRankId() + (demote ? 1 : -1);
1654 member->ChangeRank(newRankId);
1655 _LogEvent(demote ? GUILD_EVENT_LOG_DEMOTE_PLAYER : GUILD_EVENT_LOG_PROMOTE_PLAYER, player->GetGUID(), member->GetGUID(), newRankId);
1656 _BroadcastEvent(demote ? GE_DEMOTION : GE_PROMOTION, ObjectGuid::Empty, player->GetName(), member->GetName(), _GetRankName(newRankId));
1657 }
1658}
@ 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:2573

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
2662{
2663 return _HasRankRight(player, right);
2664}

References _HasRankRight().

◆ LoadBankEventLogFromDB()

bool Guild::LoadBankEventLogFromDB ( Field *  fields)
2036{
2037 uint8 dbTabId = fields[1].Get<uint8>();
2038 bool isMoneyTab = (dbTabId == GUILD_BANK_MONEY_LOGS_TAB);
2039 if (dbTabId < _GetPurchasedTabsSize() || isMoneyTab)
2040 {
2041 uint8 tabId = isMoneyTab ? uint8(GUILD_BANK_MAX_TABS) : dbTabId;
2042 LogHolder<BankEventLogEntry>& bankLog = m_bankEventLog[tabId];
2043 if (bankLog.CanInsert())
2044 {
2045 ObjectGuid::LowType guid = fields[2].Get<uint32>();
2046 GuildBankEventLogTypes eventType = GuildBankEventLogTypes(fields[3].Get<uint8>());
2047 if (BankEventLogEntry::IsMoneyEvent(eventType))
2048 {
2049 if (!isMoneyTab)
2050 {
2051 LOG_ERROR("guild", "GuildBankEventLog ERROR: MoneyEvent(LogGuid: {}, Guild: {}) does not belong to money tab ({}), ignoring...", guid, m_id, dbTabId);
2052 return false;
2053 }
2054 }
2055 else if (isMoneyTab)
2056 {
2057 LOG_ERROR("guild", "GuildBankEventLog ERROR: non-money event (LogGuid: {}, Guild: {}) belongs to money tab, ignoring...", guid, m_id);
2058 return false;
2059 }
2060 bankLog.LoadEvent(
2061 m_id, // guild id
2062 guid, // guid
2063 time_t(fields[8].Get<uint32>()), // timestamp
2064 dbTabId, // tab id
2065 eventType, // event type
2066 ObjectGuid::Create<HighGuid::Player>(fields[4].Get<uint32>()), // player guid
2067 fields[5].Get<uint32>(), // item or money
2068 fields[6].Get<uint16>(), // itam stack count
2069 fields[7].Get<uint8>()); // dest tab id
2070 }
2071 }
2072 return true;
2073}
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)
2085{
2086 uint8 tabId = fields[12].Get<uint8>();
2087 if (tabId >= _GetPurchasedTabsSize())
2088 {
2089 LOG_ERROR("guild", "Invalid tab for item (GUID: {}, id: #{}) in guild bank, skipped.",
2090 fields[14].Get<uint32>(), fields[15].Get<uint32>());
2091 return false;
2092 }
2093 return m_bankTabs[tabId].LoadItemFromDB(fields);
2094}

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

◆ LoadBankRightFromDB()

void Guild::LoadBankRightFromDB ( Field *  fields)
2011{
2012 // tabId rights slots
2013 GuildBankRightsAndSlots rightsAndSlots(fields[1].Get<uint8>(), fields[3].Get<uint8>(), fields[4].Get<uint32>());
2014 // rankId
2015 _SetRankBankTabRightsAndSlots(fields[2].Get<uint8>(), rightsAndSlots, false);
2016}
Definition Guild.h:266

References _SetRankBankTabRightsAndSlots().

◆ LoadBankTabFromDB()

void Guild::LoadBankTabFromDB ( Field *  fields)
2076{
2077 uint8 tabId = fields[1].Get<uint8>();
2078 if (tabId >= _GetPurchasedTabsSize())
2079 LOG_ERROR("guild", "Invalid tab (tabId: {}) in guild bank, skipped.", tabId);
2080 else
2081 m_bankTabs[tabId].LoadFromDB(fields);
2082}

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

◆ LoadEventLogFromDB()

bool Guild::LoadEventLogFromDB ( Field *  fields)
2019{
2020 if (m_eventLog.CanInsert())
2021 {
2022 m_eventLog.LoadEvent(
2023 m_id, // guild id
2024 fields[1].Get<uint32>(), // guid
2025 time_t(fields[6].Get<uint32>()), // timestamp
2026 GuildEventLogTypes(fields[2].Get<uint8>()), // event type
2027 ObjectGuid::Create<HighGuid::Player>(fields[3].Get<uint32>()), // player guid 1
2028 ObjectGuid::Create<HighGuid::Player>(fields[4].Get<uint32>()), // player guid 2
2029 fields[5].Get<uint8>()); // rank
2030 return true;
2031 }
2032 return false;
2033}
GuildEventLogTypes
Definition Guild.h:209

References m_eventLog, and m_id.

◆ LoadFromDB()

bool Guild::LoadFromDB ( Field *  fields)
1956{
1957 m_id = fields[0].Get<uint32>();
1958 m_name = fields[1].Get<std::string>();
1959 m_leaderGuid = ObjectGuid::Create<HighGuid::Player>(fields[2].Get<uint32>());
1960 m_emblemInfo.LoadFromDB(fields);
1961 m_info = fields[8].Get<std::string>();
1962 m_motd = fields[9].Get<std::string>();
1963 m_createdDate = time_t(fields[10].Get<uint32>());
1964 m_bankMoney = fields[11].Get<uint64>();
1965
1966 uint8 purchasedTabs = uint8(fields[12].Get<uint64>());
1967 if (purchasedTabs > GUILD_BANK_MAX_TABS)
1968 purchasedTabs = GUILD_BANK_MAX_TABS;
1969
1970 m_bankTabs.clear();
1971 m_bankTabs.reserve(purchasedTabs);
1972 for (uint8 i = 0; i < purchasedTabs; ++i)
1973 m_bankTabs.emplace_back(m_id, i);
1974 return true;
1975}
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)
1987{
1988 ObjectGuid::LowType lowguid = fields[1].Get<uint32>();
1989 ObjectGuid playerGuid(HighGuid::Player, lowguid);
1990
1991 auto [memberIt, isNew] = m_members.try_emplace(lowguid, m_id, playerGuid, fields[2].Get<uint8>());
1992 if (!isNew)
1993 {
1994 LOG_ERROR("guild", "Tried to add {} to guild '{}'. Member already exists.", playerGuid.ToString(), m_name);
1995 return false;
1996 }
1997
1998 Member& member = memberIt->second;
1999 if (!member.LoadFromDB(fields))
2000 {
2001 _DeleteMemberFromDB(lowguid);
2002 m_members.erase(memberIt);
2003 return false;
2004 }
2005
2006 sCharacterCache->UpdateCharacterGuildId(playerGuid, GetId());
2007 return true;
2008}

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)
1978{
1979 RankInfo rankInfo(m_id);
1980
1981 rankInfo.LoadFromDB(fields);
1982
1983 m_ranks.push_back(rankInfo);
1984}

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

◆ MassInviteToEvent()

void Guild::MassInviteToEvent ( WorldSession *  session,
uint32  minLevel,
uint32  maxLevel,
uint32  minRank 
)
2198{
2199 uint32 count = 0;
2200
2202 data << uint32(count); // count placeholder
2203
2204 for (auto const& [guid, member] : m_members)
2205 {
2206 // not sure if needed, maybe client checks it as well
2207 if (count >= CALENDAR_MAX_INVITES)
2208 {
2209 if (Player* player = session->GetPlayer())
2210 sCalendarMgr->SendCalendarCommandResult(player->GetGUID(), CALENDAR_ERROR_INVITES_EXCEEDED);
2211 return;
2212 }
2213
2214 uint32 level = sCharacterCache->GetCharacterLevelByGuid(member.GetGUID());
2215
2216 if (member.GetGUID() != session->GetPlayer()->GetGUID() && level >= minLevel && level <= maxLevel && member.IsRankNotLower(minRank))
2217 {
2218 data.appendPackGUID(member.GetGUID().GetRawValue());
2219 data << uint8(0); // unk
2220 ++count;
2221 }
2222 }
2223
2224 data.put<uint32>(0, count);
2225
2226 session->SendPacket(&data);
2227}
@ 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
2672{
2673 return _MemberHasTabRights(guid, tabId, rights);
2674}

References _MemberHasTabRights().

◆ ModifyBankMoney()

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

References _ModifyBankMoney().

◆ OnPlayerStatusChange()

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

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

◆ ResetTimes()

void Guild::ResetTimes ( )
3000{
3001 for (auto& [guid, member] : m_members)
3002 member.ResetValues();
3003
3005}
@ 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
1848{
1849 // GUILD_BANK_MAX_TABS send by client for money log
1850 if (tabId < _GetPurchasedTabsSize() || tabId == GUILD_BANK_MAX_TABS)
1851 {
1852 std::list<BankEventLogEntry> const& bankEventLog = m_bankEventLog[tabId].GetGuildLog();
1853
1855 packet.Tab = tabId;
1856
1857 packet.Entry.reserve(bankEventLog.size());
1858 for (BankEventLogEntry const& entry : bankEventLog)
1859 entry.WritePacket(packet);
1860
1861 session->SendPacket(packet.Write());
1862 LOG_DEBUG("guild", "MSG_GUILD_BANK_LOG_QUERY [{}]", session->GetPlayerInfo());
1863 }
1864}
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
1867{
1868 if (tabId < _GetPurchasedTabsSize())
1869 _SendBankContent(session, tabId, sendAllSlots);
1870}
void _SendBankContent(WorldSession *session, uint8 tabId, bool sendAllSlots) const
Definition Guild.cpp:2818

References _GetPurchasedTabsSize(), and _SendBankContent().

◆ SendBankTabsInfo()

void Guild::SendBankTabsInfo ( WorldSession *  session,
bool  showTabs = false 
)
1873{
1874 Member* member = GetMember(session->GetPlayer()->GetGUID());
1875 if (!member)
1876 return;
1877
1878 member->SubscribeToGuildBankUpdatePackets();
1879
1880 _SendBankList(session, 0, sendAllSlots);
1881}

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

Referenced by WorldSession::HandleGuildBankerActivate().

◆ SendBankTabText()

void Guild::SendBankTabText ( WorldSession *  session,
uint8  tabId 
) const
1884{
1885 if (BankTab const* tab = GetBankTab(tabId))
1886 tab->SendText(this, session);
1887}

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
1834{
1835 std::list<EventLogEntry> const& eventLog = m_eventLog.GetGuildLog();
1836
1838 packet.Entry.reserve(eventLog.size());
1839
1840 for (EventLogEntry const& entry : eventLog)
1841 entry.WritePacket(packet);
1842
1843 session->SendPacket(packet.Write());
1844 LOG_DEBUG("guild", "MSG_GUILD_EVENT_LOG_QUERY [{}]", session->GetPlayerInfo());
1845}
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)
1934{
1936 motd.Type = GE_MOTD;
1937 motd.Params.emplace_back(m_motd);
1938 session->SendPacket(motd.Write());
1939
1940 LOG_DEBUG("guild", "SMSG_GUILD_EVENT [{}] MOTD", session->GetPlayerInfo());
1941
1942 Player* player = session->GetPlayer();
1943
1944 HandleRoster(session);
1945 _BroadcastEvent(GE_SIGNED_ON, player->GetGUID(), player->GetName());
1946
1947 if (Member* member = GetMember(player->GetGUID()))
1948 {
1949 member->SetStats(player);
1950 member->AddFlag(GUILDMEMBER_STATUS_ONLINE);
1951 }
1952}
@ 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
1919{
1920 Member const* member = GetMember(session->GetPlayer()->GetGUID());
1921 if (!member)
1922 return;
1923
1924 int32 amount = _GetMemberRemainingMoney(*member);
1925
1927 packet.RemainingWithdrawMoney = amount;
1928 session->SendPacket(packet.Write());
1929
1930 LOG_DEBUG("guild", "MSG_GUILD_BANK_MONEY_WITHDRAWN [{}] Money: {}", session->GetPlayerInfo(), amount);
1931}
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)
1890{
1891 Member* member = GetMember(session->GetPlayer()->GetGUID());
1892 if (!member)
1893 return;
1894
1895 // We are unsubscribing here since it is the only reliable way to handle /reload from player as
1896 // GuildPermissionsQuery is sent on each reload, and we don't want to send partial changes while client
1897 // doesn't know the full state
1898 member->UnsubscribeFromGuildBankUpdatePackets();
1899
1900 uint8 rankId = member->GetRankId();
1901
1903 queryResult.RankID = rankId;
1904 queryResult.WithdrawGoldLimit = _GetRankBankMoneyPerDay(rankId);
1905 queryResult.Flags = _GetRankRights(rankId);
1906 queryResult.NumTabs = _GetPurchasedTabsSize();
1907
1908 for (uint8 tabId = 0; tabId < GUILD_BANK_MAX_TABS; ++tabId)
1909 {
1910 queryResult.Tab[tabId].Flags = _GetRankBankTabRights(rankId, tabId);
1911 queryResult.Tab[tabId].WithdrawItemLimit = _GetMemberRemainingSlots(*member, tabId);
1912 }
1913
1914 session->SendPacket(queryResult.Write());
1915 LOG_DEBUG("guild", "MSG_GUILD_PERMISSIONS [{}] Rank: {}", session->GetPlayerInfo(), rankId);
1916}
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 
)
2427{
2428 if (BankTab* pTab = GetBankTab(tabId))
2429 {
2430 pTab->SetText(text);
2431 pTab->SendText(this, nullptr);
2432 }
2433}

References GetBankTab().

◆ SetName()

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

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 
)
2399{
2400 if (tabId >= _GetPurchasedTabsSize() || slotId >= GUILD_BANK_MAX_SLOTS ||
2401 destTabId >= _GetPurchasedTabsSize() || destSlotId >= GUILD_BANK_MAX_SLOTS)
2402 return;
2403
2404 if (tabId == destTabId && slotId == destSlotId)
2405 return;
2406
2407 BankMoveItemData from(this, player, tabId, slotId);
2408 BankMoveItemData to(this, player, destTabId, destSlotId);
2409 _MoveItems(&from, &to, splitedAmount);
2410}
void _MoveItems(MoveItemData *pSrc, MoveItemData *pDest, uint32 splitedAmount)
Definition Guild.cpp:2721

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 
)
2413{
2414 if ((slotId >= GUILD_BANK_MAX_SLOTS && slotId != NULL_SLOT) || tabId >= _GetPurchasedTabsSize())
2415 return;
2416
2417 BankMoveItemData bankData(this, player, tabId, slotId);
2418 PlayerMoveItemData charData(this, player, playerBag, playerSlotId);
2419 if (toChar)
2420 _MoveItems(&bankData, &charData, splitedAmount);
2421 else
2422 _MoveItems(&charData, &bankData, splitedAmount);
2423}
@ 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 
)
1167{
1168 if (Member* member = GetMember(player->GetGUID()))
1169 {
1170 switch (dataid)
1171 {
1173 member->SetZoneID(value);
1174 break;
1176 member->SetLevel(value);
1177 break;
1178 default:
1179 LOG_ERROR("guild", "Guild::UpdateMemberData: Called with incorrect DATAID {} (value {})", dataid, value);
1180 return;
1181 }
1182 //HandleRoster();
1183 }
1184}
@ 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 ( )
2098{
2099 // Validate ranks data
2100 // GUILD RANKS represent a sequence starting from 0 = GUILD_MASTER (ALL PRIVILEGES) to max 9 (lowest privileges).
2101 // The lower rank id is considered higher rank - so promotion does rank-- and demotion does rank++
2102 // Between ranks in sequence cannot be gaps - so 0, 1, 2, 4 is impossible
2103 // Min ranks count is 5 and max is 10.
2104 bool broken_ranks = false;
2105 uint8 ranks = _GetRanksSize();
2106 if (ranks < GUILD_RANKS_MIN_COUNT || ranks > GUILD_RANKS_MAX_COUNT)
2107 {
2108 LOG_ERROR("guild", "Guild {} has invalid number of ranks, creating new...", m_id);
2109 broken_ranks = true;
2110 }
2111 else
2112 {
2113 for (uint8 rankId = 0; rankId < ranks; ++rankId)
2114 {
2115 RankInfo* rankInfo = GetRankInfo(rankId);
2116 if (rankInfo->GetId() != rankId)
2117 {
2118 LOG_ERROR("guild", "Guild {} has broken rank id {}, creating default set of ranks...", m_id, rankId);
2119 broken_ranks = true;
2120 }
2121 else
2122 {
2123 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2124 rankInfo->CreateMissingTabsIfNeeded(_GetPurchasedTabsSize(), trans, true);
2125 CharacterDatabase.CommitTransaction(trans);
2126 }
2127 }
2128 }
2129
2130 if (broken_ranks)
2131 {
2132 m_ranks.clear();
2134 }
2135
2136 // Validate members' data
2137 for (auto& [guid, member] : m_members)
2138 if (member.GetRankId() > _GetRanksSize())
2139 member.ChangeRank(_GetLowestRankId());
2140
2141 // Repair the structure of the guild.
2142 // If the guildmaster doesn't exist or isn't member of the guild
2143 // attempt to promote another member.
2144 Member* pLeader = GetMember(m_leaderGuid);
2145 if (!pLeader)
2146 {
2148 // If no more members left, disband guild
2149 if (m_members.empty())
2150 {
2151 Disband();
2152 return false;
2153 }
2154 }
2155 else if (!pLeader->IsRank(GR_GUILDMASTER))
2156 _SetLeaderGUID(*pLeader);
2157
2158 // Check config if multiple guildmasters are allowed
2159 if (!sConfigMgr->GetOption<bool>("Guild.AllowMultipleGuildMaster", 0))
2160 for (auto& [guid, member] : m_members)
2161 if ((member.GetRankId() == GR_GUILDMASTER) && !member.IsSamePlayer(m_leaderGuid))
2162 member.ChangeRank(GR_OFFICER);
2163
2165 return true;
2166}
#define DEFAULT_LOCALE
Definition Common.h:139
#define sConfigMgr
Definition Config.h:93

References _CreateDefaultGuildRanks(), _GetLowestRankId(), _GetPurchasedTabsSize(), _GetRanksSize(), _SetLeaderGUID(), _UpdateAccountsNumber(), 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, and sConfigMgr.

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: