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
 
MemberGetMember (ObjectGuid guid)
 
MemberGetMember (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 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 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
 

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< RankInfom_ranks
 
std::unordered_map< uint32, Memberm_members
 
std::vector< BankTabm_bankTabs
 
LogHolder< EventLogEntrym_eventLog
 
std::array< LogHolder< BankEventLogEntry >, GUILD_BANK_MAX_TABS+1 > m_bankEventLog = {}
 

Private Member Functions

uint8 _GetRanksSize () const
 
RankInfo const * GetRankInfo (uint8 rankId) const
 
RankInfoGetRankInfo (uint8 rankId)
 
bool _HasRankRight (Player *player, uint32 right) const
 
uint8 _GetLowestRankId () const
 
uint8 _GetPurchasedTabsSize () const
 
BankTabGetBankTab (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:792
uint32 m_id
Definition Guild.h:783
uint32 m_accountsNumber
Definition Guild.h:791
time_t m_createdDate
Definition Guild.h:788

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

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
2828{
2830 event.Type = guildEvent;
2831 if (param1)
2832 event.Params.push_back(*param1);
2833
2834 if (param2)
2835 {
2836 event.Params.resize(2);
2837 event.Params[1] = *param2;
2838 }
2839
2840 if (param3)
2841 {
2842 event.Params.resize(3);
2843 event.Params[2] = *param3;
2844 }
2845 event.Guid = guid;
2846 BroadcastPacket(event.Write());
2847 LOG_DEBUG("guild", "SMSG_GUILD_EVENT [Broadcast] Event: {}", guildEvent);
2848}
#define LOG_DEBUG(filterType__,...)
Definition Log.h:157
void BroadcastPacket(WorldPacket const *packet) const
Definition Guild.cpp:2162
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(), HandleUpdateMemberRank(), ResetTimes(), and SendLoginInfo().

◆ _CreateDefaultGuildRanks()

void Guild::_CreateDefaultGuildRanks ( LocaleConstant  loc)
private
2433{
2435 stmt->SetData(0, m_id);
2436 CharacterDatabase.Execute(stmt);
2437
2438 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_RIGHTS);
2439 stmt->SetData(0, m_id);
2440 CharacterDatabase.Execute(stmt);
2441
2442 _CreateRank(sObjectMgr->GetAcoreString(LANG_GUILD_MASTER, loc), GR_RIGHT_ALL);
2443 _CreateRank(sObjectMgr->GetAcoreString(LANG_GUILD_OFFICER, loc), GR_RIGHT_ALL);
2447}
@ 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:1730
bool _CreateRank(std::string_view name, uint32 rights)
Definition Guild.cpp:2449
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
2409{
2410 uint8 tabId = _GetPurchasedTabsSize(); // Next free id
2411 m_bankTabs.emplace_back(m_id, tabId);
2412
2413 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2414
2416 stmt->SetData(0, m_id);
2417 stmt->SetData (1, tabId);
2418 trans->Append(stmt);
2419
2420 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GUILD_BANK_TAB);
2421 stmt->SetData(0, m_id);
2422 stmt->SetData (1, tabId);
2423 trans->Append(stmt);
2424
2425 ++tabId;
2426 for (auto& m_rank : m_ranks)
2427 m_rank.CreateMissingTabsIfNeeded(tabId, trans, false);
2428
2429 CharacterDatabase.CommitTransaction(trans);
2430}
@ 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:796
uint8 _GetPurchasedTabsSize() const
Definition Guild.h:816
std::vector< RankInfo > m_ranks
Definition Guild.h:794

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
2450{
2451 uint8 newRankId = _GetRanksSize();
2452 if (newRankId >= GUILD_RANKS_MAX_COUNT)
2453 return false;
2454
2455 // Ranks represent sequence 0, 1, 2, ... where 0 means guildmaster
2456 RankInfo info(m_id, newRankId, name, rights, 0);
2457 m_ranks.push_back(info);
2458
2459 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2460 info.CreateMissingTabsIfNeeded(_GetPurchasedTabsSize(), trans);
2461 info.SaveToDB(trans);
2462 CharacterDatabase.CommitTransaction(trans);
2463
2464 return true;
2465}
@ GUILD_RANKS_MAX_COUNT
Definition Guild.h:46
uint8 _GetRanksSize() const
Definition Guild.h:803

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
2492{
2493 for (uint8 tabId = 0; tabId < _GetPurchasedTabsSize(); ++tabId)
2494 {
2495 m_bankTabs[tabId].Delete(trans, removeItemsFromDB);
2496 }
2497 m_bankTabs.clear();
2498}

References _GetPurchasedTabsSize(), and m_bankTabs.

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

◆ _DeleteMemberFromDB()

void Guild::_DeleteMemberFromDB ( ObjectGuid::LowType  lowguid) const
inlineprivate
821 {
823 stmt->SetData(0, lowguid);
824 CharacterDatabase.Execute(stmt);
825 }
@ 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
2732{
2733 Item* pDestItem = pDest->GetItem();
2734 bool swap = (pDestItem != nullptr);
2735
2736 Item* pSrcItem = pSrc->GetItem(splitedAmount);
2737 // 1. Can store source item in destination
2738 if (!pDest->CanStore(pSrcItem, swap, sendError))
2739 return false;
2740
2741 // 2. Can store destination item in source
2742 if (swap)
2743 if (!pSrc->CanStore(pDestItem, true, true))
2744 return false;
2745
2746 // GM LOG (TODO: move to scripts)
2747 pDest->LogAction(pSrc);
2748 if (swap)
2749 pSrc->LogAction(pDest);
2750
2751 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2752 // 3. Log bank events
2753 pDest->LogBankEvent(trans, pSrc, pSrcItem->GetCount());
2754 if (swap)
2755 pSrc->LogBankEvent(trans, pDest, pDestItem->GetCount());
2756
2757 // 4. Remove item from source
2758 pSrc->RemoveItem(trans, pDest, splitedAmount);
2759
2760 // 5. Remove item from destination
2761 if (swap)
2762 pDest->RemoveItem(trans, pSrc);
2763
2764 // 6. Store item in destination
2765 pDest->StoreItem(trans, pSrcItem);
2766
2767 // 7. Store item in source
2768 if (swap)
2769 pSrc->StoreItem(trans, pDestItem);
2770
2771 CharacterDatabase.CommitTransaction(trans);
2772 return true;
2773}
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
2666{
2667 if (BankTab const* tab = GetBankTab(tabId))
2668 return tab->GetItem(slotId);
2669 return nullptr;
2670}
BankTab * GetBankTab(uint8 tabId)
Definition Guild.h:817

References GetBankTab().

◆ _GetLowestRankId()

uint8 Guild::_GetLowestRankId ( ) const
inlineprivate
814{ 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
2596{
2597 uint8 rankId = member.GetRankId();
2598 if (rankId == GR_GUILDMASTER)
2599 return static_cast<int32>(GUILD_WITHDRAW_MONEY_UNLIMITED);
2600
2602 {
2603 int32 remaining = _GetRankBankMoneyPerDay(rankId) - member.GetBankWithdrawValue(GUILD_BANK_MAX_TABS);
2604 if (remaining > 0)
2605 return remaining;
2606 }
2607 return 0;
2608}
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:2552
int32 _GetRankBankMoneyPerDay(uint8 rankId) const
Definition Guild.cpp:2559

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
2582{
2583 uint8 rankId = member.GetRankId();
2584 if (rankId == GR_GUILDMASTER)
2585 return static_cast<int32>(GUILD_WITHDRAW_SLOT_UNLIMITED);
2586 if ((_GetRankBankTabRights(rankId, tabId) & GUILD_BANK_RIGHT_VIEW_TAB) != 0)
2587 {
2588 int32 remaining = _GetRankBankTabSlotsPerDay(rankId, tabId) - member.GetBankWithdrawValue(tabId);
2589 if (remaining > 0)
2590 return remaining;
2591 }
2592 return 0;
2593}
@ 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:2574
int32 _GetRankBankTabSlotsPerDay(uint8 rankId, uint8 tabId) const
Definition Guild.cpp:2566

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
2560{
2561 if (RankInfo const* rankInfo = GetRankInfo(rankId))
2562 return rankInfo->GetBankMoneyPerDay();
2563 return 0;
2564}
RankInfo const * GetRankInfo(uint8 rankId) const
Definition Guild.h:804

References GetRankInfo().

Referenced by _GetMemberRemainingMoney(), and SendPermissions().

◆ _GetRankBankTabRights()

int8 Guild::_GetRankBankTabRights ( uint8  rankId,
uint8  tabId 
) const
inlineprivate
2575{
2576 if (RankInfo const* rankInfo = GetRankInfo(rankId))
2577 return rankInfo->GetBankTabRights(tabId);
2578 return 0;
2579}

References GetRankInfo().

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

◆ _GetRankBankTabSlotsPerDay()

int32 Guild::_GetRankBankTabSlotsPerDay ( uint8  rankId,
uint8  tabId 
) const
inlineprivate
2567{
2568 if (tabId < _GetPurchasedTabsSize())
2569 if (RankInfo const* rankInfo = GetRankInfo(rankId))
2570 return rankInfo->GetBankTabSlotsPerDay(tabId);
2571 return 0;
2572}

References _GetPurchasedTabsSize(), and GetRankInfo().

Referenced by _GetMemberRemainingSlots(), and _UpdateMemberWithdrawSlots().

◆ _GetRankName()

std::string Guild::_GetRankName ( uint8  rankId) const
inlineprivate
2546{
2547 if (RankInfo const* rankInfo = GetRankInfo(rankId))
2548 return rankInfo->GetName();
2549 return "<unknown>";
2550}

References GetRankInfo().

Referenced by HandleUpdateMemberRank().

◆ _GetRankRights()

uint32 Guild::_GetRankRights ( uint8  rankId) const
inlineprivate
2553{
2554 if (RankInfo const* rankInfo = GetRankInfo(rankId))
2555 return rankInfo->GetRights();
2556 return 0;
2557}

References GetRankInfo().

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

◆ _GetRanksSize()

uint8 Guild::_GetRanksSize ( ) const
inlineprivate

◆ _HasRankRight()

bool Guild::_HasRankRight ( Player player,
uint32  right 
) const
inlineprivate
807 {
808 if (player)
809 if (Member const* member = GetMember(player->GetGUID()))
810 return (_GetRankRights(member->GetRankId()) & right) != GR_RIGHT_EMPTY;
811 return false;
812 }
@ GR_RIGHT_EMPTY
Definition Guild.h:76
Member const * GetMember(ObjectGuid guid) const
Definition Guild.h:381
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:114

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

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

◆ _IsLeader()

bool Guild::_IsLeader ( Player player) const
private
2483{
2484 if (player->GetGUID() == m_leaderGuid)
2485 return true;
2486 if (Member const* member = GetMember(player->GetGUID()))
2487 return member->IsRank(GR_GUILDMASTER);
2488 return false;
2489}
ObjectGuid m_leaderGuid
Definition Guild.h:785

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
2645{
2646 if (tabId > GUILD_BANK_MAX_TABS)
2647 return;
2648
2649 // not logging moves within the same tab
2650 if (eventType == GUILD_BANK_LOG_MOVE_ITEM && tabId == destTabId)
2651 return;
2652
2653 uint8 dbTabId = tabId;
2654 if (BankEventLogEntry::IsMoneyEvent(eventType))
2655 {
2656 tabId = GUILD_BANK_MAX_TABS;
2657 dbTabId = GUILD_BANK_MONEY_LOGS_TAB;
2658 }
2659 LogHolder<BankEventLogEntry>& pLog = m_bankEventLog[tabId];
2660 pLog.AddEvent(trans, m_id, pLog.GetNextGUID(), eventType, dbTabId, guid, itemOrMoney, itemStackCount, destTabId);
2661
2662 sScriptMgr->OnGuildBankEvent(this, uint8(eventType), tabId, guid.GetCounter(), itemOrMoney, itemStackCount, destTabId);
2663}
@ GUILD_BANK_MONEY_LOGS_TAB
Definition Guild.h:44
@ GUILD_BANK_LOG_MOVE_ITEM
Definition Guild.h:199
#define sScriptMgr
Definition ScriptMgr.h:743
bool IsMoneyEvent() const
Definition Guild.h:454
std::array< LogHolder< BankEventLogEntry >, GUILD_BANK_MAX_TABS+1 > m_bankEventLog
Definition Guild.h:800

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
2635{
2636 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2637 m_eventLog.AddEvent(trans, m_id, m_eventLog.GetNextGUID(), eventType, playerGuid1, playerGuid2, newRank);
2638 CharacterDatabase.CommitTransaction(trans);
2639
2640 sScriptMgr->OnGuildEvent(this, uint8(eventType), playerGuid1.GetCounter(), playerGuid2.GetCounter(), newRank);
2641}
LogHolder< EventLogEntry > m_eventLog
Definition Guild.h:799
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
2622{
2623 if (Member const* member = GetMember(guid))
2624 {
2625 // Leader always has full rights
2626 if (member->IsRank(GR_GUILDMASTER) || m_leaderGuid == guid)
2627 return true;
2628 return (_GetRankBankTabRights(member->GetRankId(), tabId) & rights) == rights;
2629 }
2630 return false;
2631}

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

Referenced by _SendBankContent(), and _SendBankList().

◆ _ModifyBankMoney()

bool Guild::_ModifyBankMoney ( CharacterDatabaseTransaction  trans,
uint64  amount,
bool  add 
)
private
2501{
2502 if (add)
2503 m_bankMoney += amount;
2504 else
2505 {
2506 // Check if there is enough money in bank.
2507 if (m_bankMoney < amount)
2508 return false;
2509 m_bankMoney -= amount;
2510 }
2511
2513 stmt->SetData(0, m_bankMoney);
2514 stmt->SetData(1, m_id);
2515 trans->Append(stmt);
2516 return true;
2517}
@ 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
2679{
2680 // 1. Initialize source item
2681 if (!pSrc->InitItem())
2682 return; // No source item
2683
2684 // 2. Check source item
2685 if (!pSrc->CheckItem(splitedAmount))
2686 return; // Source item or splited amount is invalid
2687
2688 // 3. Check destination rights
2689 if (!pDest->HasStoreRights(pSrc))
2690 return; // Player has no rights to store item in destination
2691
2692 // 4. Check source withdraw rights
2693 if (!pSrc->HasWithdrawRights(pDest))
2694 return; // Player has no rights to withdraw items from source
2695
2696 // 5. Check split
2697 if (splitedAmount)
2698 {
2699 // 5.1. Clone source item
2700 if (!pSrc->CloneItem(splitedAmount))
2701 return; // Item could not be cloned
2702
2703 // 5.2. Move splited item to destination
2704 _DoItemsMove(pSrc, pDest, true, splitedAmount);
2705 }
2706 else // 6. No split
2707 {
2708 // 6.1. Try to merge items in destination (pDest->GetItem() == nullptr)
2709 if (!_DoItemsMove(pSrc, pDest, false)) // Item could not be merged
2710 {
2711 // 6.2. Try to swap items
2712 // 6.2.1. Initialize destination item
2713 if (!pDest->InitItem())
2714 return;
2715
2716 // 6.2.2. Check rights to store item in source (opposite direction)
2717 if (!pSrc->HasStoreRights(pDest))
2718 return; // Player has no rights to store item in source (opposite direction)
2719
2720 if (!pDest->HasWithdrawRights(pSrc))
2721 return; // Player has no rights to withdraw item from destination (opposite direction)
2722
2723 // 6.2.3. Swap items (pDest->GetItem() != nullptr)
2724 _DoItemsMove(pSrc, pDest, true);
2725 }
2726 }
2727 // 7. Send changes
2728 _SendBankContentUpdate(pSrc, pDest);
2729}
bool _DoItemsMove(MoveItemData *pSrc, MoveItemData *pDest, bool sendError, uint32 splitedAmount=0)
Definition Guild.cpp:2731
void _SendBankContentUpdate(MoveItemData *pSrc, MoveItemData *pDest) const
Definition Guild.cpp:2789

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
2673{
2674 if (BankTab* pTab = GetBankTab(tabId))
2675 pTab->SetItem(trans, slotId, nullptr);
2676}

References GetBankTab().

◆ _SendBankContent()

void Guild::_SendBankContent ( WorldSession session,
uint8  tabId,
bool  sendAllSlots 
) const
private
2776{
2777 ObjectGuid guid = session->GetPlayer()->GetGUID();
2779 return;
2780
2781 _SendBankList(session, tabId, sendAllSlots);
2782}
void _SendBankList(WorldSession *session=nullptr, uint8 tabId=0, bool sendFullSlots=false, SlotIds *slots=nullptr) const
Definition Guild.cpp:2850
bool _MemberHasTabRights(ObjectGuid guid, uint8 tabId, uint32 rights) const
Definition Guild.cpp:2621
Definition ObjectGuid.h:121
Player * GetPlayer() const
Definition WorldSession.h:480

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
2790{
2791 ASSERT(pSrc->IsBank() || pDest->IsBank());
2792
2793 uint8 tabId = 0;
2794 SlotIds slots;
2795 if (pSrc->IsBank()) // B ->
2796 {
2797 tabId = pSrc->GetContainer();
2798 slots.insert(pSrc->GetSlotId());
2799 if (pDest->IsBank()) // B -> B
2800 {
2801 // Same tab - add destination slots to collection
2802 if (pDest->GetContainer() == pSrc->GetContainer())
2803 pDest->CopySlots(slots);
2804 else // Different tabs - send second message
2805 {
2806 SlotIds destSlots;
2807 pDest->CopySlots(destSlots);
2808 _SendBankContentUpdate(pDest->GetContainer(), destSlots);
2809 }
2810 }
2811 }
2812 else if (pDest->IsBank()) // C -> B
2813 {
2814 tabId = pDest->GetContainer();
2815 pDest->CopySlots(slots);
2816 }
2817
2818 _SendBankContentUpdate(tabId, slots);
2819}
#define ASSERT
Definition Errors.h:68
std::set< uint8 > SlotIds
Definition Guild.h:289

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
2822{
2823 _SendBankList(nullptr, tabId, false, &slots);
2824}

References _SendBankList().

◆ _SendBankList()

void Guild::_SendBankList ( WorldSession session = nullptr,
uint8  tabId = 0,
bool  sendFullSlots = false,
SlotIds slots = nullptr 
) const
private
2851{
2852 if (!sScriptMgr->CanGuildSendBankList(this, session, tabId, sendAllSlots))
2853 return;
2854
2856
2857 packet.Money = m_bankMoney;
2858 packet.Tab = int32(tabId);
2859 packet.FullUpdate = sendAllSlots;
2860
2861 if (sendAllSlots && !tabId)
2862 {
2863 packet.TabInfo.reserve(_GetPurchasedTabsSize());
2864 for (uint8 i = 0; i < _GetPurchasedTabsSize(); ++i)
2865 {
2867 tabInfo.Name = m_bankTabs[i].GetName();
2868 tabInfo.Icon = m_bankTabs[i].GetIcon();
2869 packet.TabInfo.push_back(tabInfo);
2870 }
2871 }
2872
2873 if (BankTab const* tab = GetBankTab(tabId))
2874 {
2875 auto fillItems = [&](auto begin, auto end, bool skipEmpty)
2876 {
2877 for (auto itr = begin; itr != end; ++itr)
2878 {
2879 if (Item* tabItem = tab->GetItem(*itr))
2880 {
2882
2883 itemInfo.Slot = *itr;
2884 itemInfo.ItemID = tabItem->GetEntry();
2885 itemInfo.Count = int32(tabItem->GetCount());
2886 itemInfo.Charges = int32(std::abs(tabItem->GetSpellCharges()));
2887 itemInfo.EnchantmentID = int32(tabItem->GetEnchantmentId(PERM_ENCHANTMENT_SLOT));
2888 itemInfo.Flags = tabItem->GetInt32Value(ITEM_FIELD_FLAGS);
2889 itemInfo.RandomPropertiesID = tabItem->GetItemRandomPropertyId();
2890 itemInfo.RandomPropertiesSeed = int32(tabItem->GetItemSuffixFactor());
2891
2892 for (uint32 socketSlot = 0; socketSlot < MAX_GEM_SOCKETS; ++socketSlot)
2893 {
2894 if (uint32 enchId = tabItem->GetEnchantmentId(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT + socketSlot)))
2895 {
2897 gem.SocketIndex = socketSlot;
2898 gem.SocketEnchantID = int32(enchId);
2899 itemInfo.SocketEnchant.push_back(gem);
2900 }
2901 }
2902
2903 packet.ItemInfo.push_back(itemInfo);
2904 }
2905 else if (!skipEmpty)
2906 {
2908
2909 itemInfo.Slot = *itr;
2910 itemInfo.ItemID = 0;
2911
2912 packet.ItemInfo.push_back(itemInfo);
2913 }
2914 }
2915
2916 };
2917
2918 if (sendAllSlots)
2919 fillItems(boost::make_counting_iterator(uint8(0)), boost::make_counting_iterator(uint8(GUILD_BANK_MAX_SLOTS)), true);
2920 else if (slots && !slots->empty())
2921 fillItems(slots->begin(), slots->end(), false);
2922 }
2923
2924 if (session)
2925 {
2926 if (Member const* member = GetMember(session->GetPlayer()->GetGUID()))
2927 packet.WithdrawalsRemaining = _GetMemberRemainingSlots(*member, tabId);
2928
2929 session->SendPacket(packet.Write());
2930 LOG_DEBUG("guild", "SMSG_GUILD_BANK_LIST [{}]: TabId: {}, FullSlots: {}, slots: {}",
2931 session->GetPlayerInfo(), tabId, sendAllSlots, packet.WithdrawalsRemaining);
2932 }
2933 else
2934 {
2935 packet.Write();
2936 for (auto const& [guid, member] : m_members)
2937 {
2938 if (!member.ShouldReceiveBankPartialUpdatePackets())
2939 continue;
2940
2941 if (!_MemberHasTabRights(member.GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB))
2942 continue;
2943
2944 Player* player = member.FindPlayer();
2945 if (!player)
2946 continue;
2947
2949 player->SendDirectMessage(packet.GetRawPacket());
2950 LOG_DEBUG("guild", "SMSG_GUILD_BANK_LIST [{}]: TabId: {}, FullSlots: {}, slots: {}"
2951 , player->GetName(), tabId, sendAllSlots, packet.WithdrawalsRemaining);
2952 }
2953 }
2954}
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:2581
std::unordered_map< uint32, Member > m_members
Definition Guild.h:795
Definition Player.h:1086
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5852
std::string const & GetName() const
Definition Object.h:529
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:303
std::string GetPlayerInfo() const
Definition WorldSession.cpp:267
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
2785{
2786 _SendBankList(session);
2787}

References _SendBankList().

◆ _SetLeaderGUID()

void Guild::_SetLeaderGUID ( Member pLeader)
private
2520{
2521 m_leaderGuid = pLeader.GetGUID();
2522 pLeader.ChangeRank(GR_GUILDMASTER);
2523
2525 stmt->SetData(0, m_leaderGuid.GetCounter());
2526 stmt->SetData(1, m_id);
2527 CharacterDatabase.Execute(stmt);
2528}
@ 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
2531{
2532 if (RankInfo* rankInfo = GetRankInfo(rankId))
2533 rankInfo->SetBankMoneyPerDay(moneyPerDay);
2534}

References GetRankInfo().

Referenced by HandleSetRankInfo().

◆ _SetRankBankTabRightsAndSlots()

void Guild::_SetRankBankTabRightsAndSlots ( uint8  rankId,
GuildBankRightsAndSlots  rightsAndSlots,
bool  saveToDB = true 
)
private
2537{
2538 if (rightsAndSlots.GetTabId() >= _GetPurchasedTabsSize())
2539 return;
2540
2541 if (RankInfo* rankInfo = GetRankInfo(rankId))
2542 rankInfo->SetBankTabSlotsAndRights(rightsAndSlots, saveToDB);
2543}
uint8 GetTabId() const
Definition Guild.h:279

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

Referenced by HandleSetRankInfo(), and LoadBankRightFromDB().

◆ _UpdateAccountsNumber()

void Guild::_UpdateAccountsNumber ( )
private
2470{
2471 // We use a set to be sure each element will be unique
2472 std::unordered_set<uint32> accountsIdSet;
2473 for (auto const& [guid, member] : m_members)
2474 accountsIdSet.insert(member.GetAccountId());
2475
2476 m_accountsNumber = accountsIdSet.size();
2477}

References m_accountsNumber, and m_members.

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

◆ _UpdateMemberWithdrawSlots()

void Guild::_UpdateMemberWithdrawSlots ( CharacterDatabaseTransaction  trans,
ObjectGuid  guid,
uint8  tabId 
)
inlineprivate
2611{
2612 if (Member* member = GetMember(guid))
2613 {
2614 uint8 rankId = member->GetRankId();
2615 if (rankId != GR_GUILDMASTER
2616 && member->GetBankWithdrawValue(tabId) < _GetRankBankTabSlotsPerDay(rankId, tabId))
2617 member->UpdateBankWithdrawValue(trans, tabId, 1);
2618 }
2619}

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

◆ AddMember()

bool Guild::AddMember ( ObjectGuid  guid,
uint8  rankId = GUILD_RANK_NONE 
)
2203{
2205 // Player cannot be in guild
2206 if (player)
2207 {
2208 if (player->GetGuildId() != 0)
2209 return false;
2210 }
2211 else if (sCharacterCache->GetCharacterGuildIdByGuid(guid) != 0)
2212 return false;
2213
2214 // Remove all player signs from another petitions
2215 // This will be prevent attempt to join many guilds and corrupt guild data integrity
2217
2218 ObjectGuid::LowType lowguid = guid.GetCounter();
2219
2220 // If rank was not passed, assign lowest possible rank
2221 if (rankId == GUILD_RANK_NONE)
2222 rankId = _GetLowestRankId();
2223
2224 auto [memberIt, isNew] = m_members.try_emplace(lowguid, m_id, guid, rankId);
2225 if (!isNew)
2226 {
2227 LOG_ERROR("guild", "Tried to add {} to guild '{}'. Member already exists.", guid.ToString(), m_name);
2228 return false;
2229 }
2230
2231 Member& member = memberIt->second;
2232 std::string name;
2233 if (player)
2234 {
2235 player->SetInGuild(m_id);
2236 player->SetGuildIdInvited(0);
2237 player->SetRank(rankId);
2238 member.SetStats(player);
2239 SendLoginInfo(player->GetSession());
2240 name = player->GetName();
2241 }
2242 else
2243 {
2244 member.ResetFlags();
2245
2246 bool ok = false;
2247 // xinef: sync query
2248 // Player must exist
2250 stmt->SetData(0, guid.GetCounter());
2251 if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
2252 {
2253 Field* fields = result->Fetch();
2254 name = fields[0].Get<std::string>();
2255 member.SetStats(
2256 name,
2257 fields[1].Get<uint8>(),
2258 fields[2].Get<uint8>(),
2259 fields[3].Get<uint8>(),
2260 fields[4].Get<uint16>(),
2261 fields[5].Get<uint32>());
2262
2263 ok = member.CheckStats();
2264 }
2265 if (!ok)
2266 {
2267 m_members.erase(memberIt);
2268 return false;
2269 }
2270 sCharacterCache->UpdateCharacterGuildId(guid, m_id);
2271 }
2272
2273 CharacterDatabaseTransaction trans(nullptr);
2274 member.SaveToDB(trans);
2275
2278 _BroadcastEvent(GE_JOINED, guid, name);
2279
2280 // Call scripts if member was succesfully added (and stored to database)
2281 sScriptMgr->OnGuildAddMember(this, player, rankId);
2282
2283 return true;
2284}
#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:98
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition Field.h:112
void SendLoginInfo(WorldSession *session)
Definition Guild.cpp:1905
std::string m_name
Definition Guild.h:784
void _UpdateAccountsNumber()
Definition Guild.cpp:2469
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:2826
void _LogEvent(GuildEventLogTypes eventType, ObjectGuid playerGuid1, ObjectGuid playerGuid2=ObjectGuid::Empty, uint8 newRank=0)
Definition Guild.cpp:2634
uint8 _GetLowestRankId() const
Definition Guild.h:814
std::string ToString() const
Definition ObjectGuid.cpp:48
uint32 LowType
Definition ObjectGuid.h:125
void SetGuildIdInvited(uint32 GuildId)
Definition Player.h:1927
uint32 GetGuildId() const
Definition Player.h:1928
WorldSession * GetSession() const
Definition Player.h:2030
void SetInGuild(uint32 GuildId)
Definition Player.h:1919
void SetRank(uint8 rankId)
Definition Player.h:1925
static void RemovePetitionsAndSigns(ObjectGuid guid, uint32 type)
Definition Player.cpp:10275
@ 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
2163{
2164 for (auto const& [guid, member] : m_members)
2165 if (Player* player = member.FindPlayer())
2166 player->SendDirectMessage(packet);
2167}
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
2155{
2156 for (auto const& [guid, member] : m_members)
2157 if (member.IsRank(rankId))
2158 if (Player* player = member.FindPlayer())
2159 player->SendDirectMessage(packet);
2160}

References m_members.

◆ BroadcastToGuild()

void Guild::BroadcastToGuild ( WorldSession session,
bool  officerOnly,
std::string_view  msg,
uint32  language = LANG_UNIVERSAL 
) const
2142{
2143 if (session && session->GetPlayer() && _HasRankRight(session->GetPlayer(), officerOnly ? GR_RIGHT_OFFCHATSPEAK : GR_RIGHT_GCHATSPEAK))
2144 {
2145 WorldPacket data;
2146 ChatHandler::BuildChatPacket(data, officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, Language(language), session->GetPlayer(), nullptr, msg);
2147 for (auto const& [guid, member] : m_members)
2148 if (Player* player = member.FindPlayer())
2149 if (_HasRankRight(player, officerOnly ? GR_RIGHT_OFFCHATLISTEN : GR_RIGHT_GCHATLISTEN) && !player->GetSocial()->HasIgnore(session->GetPlayer()->GetGUID()))
2150 player->SendDirectMessage(&data);
2151 }
2152}
@ 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:806
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
752 {
753 for (auto const& m_member : m_members)
754 if (Player* player = m_member.second.FindPlayer())
755 if (player != except)
756 _do(player);
757 }

References m_members.

Referenced by AchievementMgr::SendAchievementEarned().

◆ ChangeMemberRank()

bool Guild::ChangeMemberRank ( ObjectGuid  guid,
uint8  newRank 
)
2348{
2349 if (newRank <= _GetLowestRankId()) // Validate rank (allow only existing ranks)
2350 if (Member* member = GetMember(guid))
2351 {
2352 member->ChangeRank(newRank);
2353
2354 if (newRank == GR_GUILDMASTER)
2355 {
2356 m_leaderGuid = guid;
2357
2359 stmt->SetData(0, m_leaderGuid.GetCounter());
2360 stmt->SetData(1, m_id);
2361 CharacterDatabase.Execute(stmt);
2362 }
2363
2364 return true;
2365 }
2366 return false;
2367}

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:376
uint32 GetStyle() const
Definition Guild.h:247
uint32 GetColor() const
Definition Guild.h:248
uint32 GetBackgroundColor() const
Definition Guild.h:251
uint32 GetBorderStyle() const
Definition Guild.h:249
uint32 GetBorderColor() const
Definition Guild.h:250
void _CreateNewBankTab()
Definition Guild.cpp:2408
bool AddMember(ObjectGuid guid, uint8 rankId=GUILD_RANK_NONE)
Definition Guild.cpp:2202
std::string m_motd
Definition Guild.h:786
EmblemInfo m_emblemInfo
Definition Guild.h:790
std::string m_info
Definition Guild.h:787
void _CreateDefaultGuildRanks(LocaleConstant loc)
Definition Guild.cpp:2432
Player session in the World.
Definition WorldSession.h:409
LocaleConstant GetSessionDbLocaleIndex() const
Definition WorldSession.h:623
#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 
)
2287{
2288 ObjectGuid::LowType lowguid = guid.GetCounter();
2290
2291 // Guild master can be deleted when loading guild and guid doesn't exist in characters table
2292 // or when he is removed from guild by gm command
2293 if (m_leaderGuid == guid && !isDisbanding)
2294 {
2295 Member* oldLeader = nullptr;
2296 Member* newLeader = nullptr;
2297 for (auto& [guid, member] : m_members)
2298 {
2299 if (guid == lowguid)
2300 oldLeader = &member;
2301 else if (!newLeader || newLeader->GetRankId() > member.GetRankId())
2302 newLeader = &member;
2303 }
2304
2305 if (!newLeader)
2306 {
2307 Disband();
2308 if (canDeleteGuild)
2309 delete this;
2310 return;
2311 }
2312
2313 _SetLeaderGUID(*newLeader);
2314
2315 // If player not online data in data field will be loaded from guild tabs no need to update it !!
2316 if (Player* newLeaderPlayer = newLeader->FindPlayer())
2317 newLeaderPlayer->SetRank(GR_GUILDMASTER);
2318
2319 // If leader does not exist (at guild loading with deleted leader) do not send broadcasts
2320 if (oldLeader)
2321 {
2322 _BroadcastEvent(GE_LEADER_CHANGED, ObjectGuid::Empty, oldLeader->GetName(), newLeader->GetName());
2323 _BroadcastEvent(GE_LEFT, guid, oldLeader->GetName());
2324 }
2325 }
2326 // Call script on remove before member is actually removed from guild (and database)
2327 sScriptMgr->OnGuildRemoveMember(this, player, isDisbanding, isKicked);
2328
2329 m_members.erase(lowguid);
2330
2331 // If player not online data in data field will be loaded from guild tabs no need to update it !!
2332 if (player)
2333 {
2334 player->SetInGuild(0);
2335 player->SetRank(0);
2336 }
2337 else
2338 {
2339 sCharacterCache->UpdateCharacterGuildId(guid, 0);
2340 }
2341
2343 if (!isDisbanding)
2345}
@ GE_LEFT
Definition Guild.h:151
@ GE_LEADER_CHANGED
Definition Guild.h:154
void _SetLeaderGUID(Member &pLeader)
Definition Guild.cpp:2519
void Disband()
Definition Guild.cpp:1116
void _DeleteMemberFromDB(ObjectGuid::LowType lowguid) const
Definition Guild.h:820
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:2286

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
817{ 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
818{ 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
690{ return m_info; }

References m_info.

Referenced by guild_commandscript::HandleGuildInfoCommand().

◆ GetLeaderGUID()

◆ GetMember() [1/3]

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

References ObjectGuid::GetCounter(), and m_members.

◆ GetMember() [2/3]

◆ GetMember() [3/3]

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

References m_members.

◆ GetMemberCount()

uint32 Guild::GetMemberCount ( ) const
inline

◆ GetMemberSize()

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

References m_members.

◆ GetMOTD()

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

References m_motd.

Referenced by guild_commandscript::HandleGuildInfoCommand().

◆ GetName()

◆ GetRankInfo() [1/2]

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

References _GetRanksSize(), and m_ranks.

◆ GetRankInfo() [2/2]

RankInfo const * Guild::GetRankInfo ( uint8  rankId) const
inlineprivate

◆ GetTotalBankMoney()

uint64 Guild::GetTotalBankMoney ( ) const
inline

◆ HandleAcceptMember()

void Guild::HandleAcceptMember ( WorldSession session)
1504{
1505 Player* player = session->GetPlayer();
1506 if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && player->GetTeamId() != sCharacterCache->GetCharacterTeamByGuid(GetLeaderGUID()))
1507 {
1508 return;
1509 }
1510
1511 AddMember(player->GetGUID());
1512}
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD
Definition WorldConfig.h:36
ObjectGuid GetLeaderGUID() const
Definition Guild.h:687
TeamId GetTeamId(bool original=false) const
Definition Player.h:2138

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 
)
1633{
1634 uint8 size = _GetRanksSize();
1635 if (size >= GUILD_RANKS_MAX_COUNT)
1636 return;
1637
1638 // Only leader can add new rank
1639 if (_IsLeader(session->GetPlayer()))
1641 _BroadcastEvent(GE_RANK_UPDATED, ObjectGuid::Empty, std::to_string(size), name, std::to_string(m_ranks.size()));
1642}
@ GE_RANK_UPDATED
Definition Guild.h:157
bool _IsLeader(Player *player) const
Definition Guild.cpp:2482

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

1412{
1413 Player* player = session->GetPlayer();
1414 if (!player)
1415 return;
1416
1417 Member const* member = GetMember(player->GetGUID());
1418 if (!member)
1419 return;
1420
1422 return;
1423
1424 if (tabId != _GetPurchasedTabsSize())
1425 return;
1426
1427 uint32 tabCost = _GetGuildBankTabPrice(tabId);
1428 if (!tabCost)
1429 return;
1430
1431 if (!player->HasEnoughMoney(tabCost)) // Should not happen, this is checked by client
1432 return;
1433
1434 player->ModifyMoney(-int32(tabCost));
1435
1438 SendPermissions(session);
1439}
uint32 _GetGuildBankTabPrice(uint8 tabId)
Definition Guild.cpp:94
@ GE_BANK_TAB_PURCHASED
Definition Guild.h:162
void SendPermissions(WorldSession *session)
Definition Guild.cpp:1861
bool ModifyMoney(int32 amount, bool sendError=true)
Definition Player.cpp:11680
bool HasEnoughMoney(uint32 amount) const
Definition Player.h:1632

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)
1782{
1783 // Only leader can disband guild
1784 if (_IsLeader(session->GetPlayer()))
1785 {
1786 Disband();
1787 LOG_DEBUG("guild", "Guild Successfully Disbanded");
1788 delete this;
1789 }
1790}

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

◆ HandleInviteMember()

void Guild::HandleInviteMember ( WorldSession session,
std::string const &  name 
)
1442{
1443 Player* pInvitee = ObjectAccessor::FindPlayerByName(name, false);
1444 if (!pInvitee)
1445 {
1447 return;
1448 }
1449
1450 Player* player = session->GetPlayer();
1451 // Do not show invitations from ignored players
1452 if (pInvitee->GetSocial()->HasIgnore(player->GetGUID()))
1453 return;
1454
1455 uint32 memberLimit = sWorld->getIntConfig(CONFIG_GUILD_MEMBER_LIMIT);
1456 if (memberLimit > 0 && player->GetGuild()->GetMemberCount() >= memberLimit)
1457 {
1458 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);
1460 return;
1461 }
1462
1463 if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && pInvitee->GetTeamId(true) != player->GetTeamId(true))
1464 {
1466 return;
1467 }
1468 // Invited player cannot be in another guild
1469 if (pInvitee->GetGuildId())
1470 {
1472 return;
1473 }
1474 // Invited player cannot be invited
1475 if (pInvitee->GetGuildIdInvited())
1476 {
1478 return;
1479 }
1480 // Inviting player must have rights to invite
1481 if (!_HasRankRight(player, GR_RIGHT_INVITE))
1482 {
1484 return;
1485 }
1486
1488
1489 LOG_DEBUG("guild", "Player {} invited {} to join his Guild", player->GetName(), pInvitee->GetName());
1490
1491 pInvitee->SetGuildIdInvited(m_id);
1492 _LogEvent(GUILD_EVENT_LOG_INVITE_PLAYER, player->GetGUID(), pInvitee->GetGUID());
1493
1495
1496 invite.InviterName = player->GetName();
1497 invite.GuildName = GetName();
1498
1499 pInvitee->SendDirectMessage(invite.Write());
1500 LOG_DEBUG("guild", "SMSG_GUILD_INVITE [{}]", pInvitee->GetName());
1501}
@ GUILD_COMMAND_INVITE
Definition Guild.h:100
@ ERR_GUILD_PERMISSIONS
Definition Guild.h:128
@ ERR_ALREADY_IN_GUILD_S
Definition Guild.h:122
@ ERR_GUILD_COMMAND_SUCCESS
Definition Guild.h:119
@ ERR_GUILD_NOT_ALLIED
Definition Guild.h:132
@ ERR_GUILD_INTERNAL
Definition Guild.h:120
@ ERR_GUILD_PLAYER_NOT_FOUND_S
Definition Guild.h:131
@ ERR_ALREADY_INVITED_TO_GUILD_S
Definition Guild.h:124
@ GR_RIGHT_INVITE
Definition Guild.h:81
@ GUILD_EVENT_LOG_INVITE_PLAYER
Definition Guild.h:210
@ CONFIG_GUILD_MEMBER_LIMIT
Definition WorldConfig.h:383
Definition Chat.h:37
void PSendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition Chat.cpp:219
uint32 GetMemberCount() const
Definition Guild.h:771
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:1930
Guild * GetGuild() const
Definition Player.cpp:16354
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)
1515{
1516 Player* player = session->GetPlayer();
1517 bool disband = false;
1518
1519 // If leader is leaving
1520 if (_IsLeader(player))
1521 {
1522 if (m_members.size() > 1)
1523 // Leader cannot leave if he is not the last member
1525 else
1526 {
1527 // Guild is disbanded if leader leaves.
1528 Disband();
1529 disband = true;
1530 }
1531 }
1532 else
1533 {
1534 DeleteMember(player->GetGUID(), false, false);
1535
1537 _BroadcastEvent(GE_LEFT, player->GetGUID(), player->GetName());
1538
1540 }
1541
1542 sCalendarMgr->RemovePlayerGuildEventsAndSignups(player->GetGUID(), GetId());
1543
1544 if (disband)
1545 delete this;
1546}
#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:686

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 
)
1673{
1674 Player* player = session->GetPlayer();
1675
1676 // Call script after validation and before money transfer.
1677 sScriptMgr->OnGuildMemberDepositMoney(this, player, amount);
1678
1679 if (m_bankMoney > GUILD_BANK_MONEY_LIMIT - amount)
1680 {
1682 return;
1683 }
1684
1685 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1686 _ModifyBankMoney(trans, amount, true);
1687
1688 player->ModifyMoney(-int32(amount));
1689 player->SaveGoldToDB(trans);
1690 _LogBankEvent(trans, GUILD_BANK_LOG_DEPOSIT_MONEY, uint8(0), player->GetGUID(), amount);
1691
1692 CharacterDatabase.CommitTransaction(trans);
1693
1695 {
1696 LOG_GM(session->GetAccountId(), "GM {} (Account: {}) deposited {} to guild bank (Guild: {} GuildId: {})",
1697 player->GetName(), session->GetAccountId(), amount, GetName(), GetId());
1698 }
1699
1700 std::string aux = Acore::Impl::ByteArrayToHexStr(reinterpret_cast<uint8*>(&m_bankMoney), 8, true);
1702
1703 if (amount > 10 * GOLD) // receiver_acc = Guild id, receiver_name = Guild name
1704 CharacterDatabase.Execute("INSERT INTO log_money VALUES({}, {}, \"{}\", \"{}\", {}, \"{}\", {}, \"(guild members: {}, new amount: {}, leader guid low: {}, sender level: {})\", NOW(), {})",
1705 session->GetAccountId(), player->GetGUID().GetCounter(), player->GetName(), session->GetRemoteAddress(), GetId(), GetName(), amount, GetMemberCount(), GetTotalBankMoney(), GetLeaderGUID().GetCounter(), player->GetLevel(), 3);
1706}
@ 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:2500
void _LogBankEvent(CharacterDatabaseTransaction trans, GuildBankEventLogTypes eventType, uint8 tabId, ObjectGuid playerGuid, uint32 itemOrMoney, uint16 itemStackCount=0, uint8 destTabId=0)
Definition Guild.cpp:2644
uint64 GetTotalBankMoney() const
Definition Guild.h:770
void SaveGoldToDB(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7285
uint8 GetLevel() const
Definition Unit.h:1104
bool HasPermission(uint32 permissionId)
Definition WorldSession.cpp:1671
uint32 GetAccountId() const
Definition WorldSession.h:479
std::string const & GetRemoteAddress()
Definition WorldSession.h:489
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)
1770{
1771 Player* player = session->GetPlayer();
1772 if (Member* member = GetMember(player->GetGUID()))
1773 {
1774 member->SetStats(player);
1775 member->UpdateLogoutTime();
1776 member->ResetFlags();
1777 }
1778 _BroadcastEvent(GE_SIGNED_OFF, player->GetGUID(), player->GetName());
1779}
@ 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 
)
1709{
1710 //clamp amount to MAX_MONEY_AMOUNT, Players can't hold more than that anyway
1711 amount = std::min(amount, uint32(MAX_MONEY_AMOUNT));
1712
1713 if (m_bankMoney < amount) // Not enough money in bank
1714 return false;
1715
1716 Player* player = session->GetPlayer();
1717
1718 Member* member = GetMember(player->GetGUID());
1719 if (!member)
1720 return false;
1721
1722 if (uint32(_GetMemberRemainingMoney(*member)) < amount) // Check if we have enough slot/money today
1723 return false;
1724
1725 if (!(_GetRankRights(member->GetRankId()) & GR_RIGHT_WITHDRAW_REPAIR) && repair)
1726 return false;
1727
1728 // Call script after validation and before money transfer.
1729 sScriptMgr->OnGuildMemberWitdrawMoney(this, player, amount, repair);
1730
1731 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1732
1733 if (!_ModifyBankMoney(trans, amount, false))
1734 return false;
1735
1736 if (!repair)
1737 {
1738 if (!player->ModifyMoney(amount))
1739 {
1740 _ModifyBankMoney(trans, amount, true);
1741 return false;
1742 }
1743
1744 player->SaveGoldToDB(trans);
1745 }
1746
1747 // Update remaining money amount
1748 member->UpdateBankWithdrawValue(trans, GUILD_BANK_MAX_TABS, amount);
1749
1750 // Log guild bank event
1751 _LogBankEvent(trans, repair ? GUILD_BANK_LOG_REPAIR_MONEY : GUILD_BANK_LOG_WITHDRAW_MONEY, uint8(0), player->GetGUID(), amount);
1752 CharacterDatabase.CommitTransaction(trans);
1753
1755 {
1756 LOG_GM(session->GetAccountId(), "GM {} (Account: {}) withdrew {} from guild bank (Guild: {} GuildId: {})",
1757 player->GetName(), session->GetAccountId(), amount, GetName(), GetId());
1758 }
1759
1760 if (amount > 10 * GOLD) // sender_acc = 0 (guild has no account), sender_guid = Guild id, sender_name = Guild name
1761 CharacterDatabase.Execute("INSERT INTO log_money VALUES({}, {}, \"{}\", \"{}\", {}, \"{}\", {}, \"(guild, members: {}, new amount: {}, leader guid low: {}, withdrawer level: {})\", NOW(), {})",
1762 0, GetId(), GetName(), session->GetRemoteAddress(), session->GetAccountId(), player->GetName(), amount, GetMemberCount(), GetTotalBankMoney(), GetLeaderGUID().GetCounter(), player->GetLevel(), 4);
1763
1764 std::string aux = Acore::Impl::ByteArrayToHexStr(reinterpret_cast<uint8*>(&m_bankMoney), 8, true);
1766 return true;
1767}
@ 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:2595

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)
1645{
1647}
void HandleRemoveRank(WorldSession *session, uint8 rankId)
Definition Guild.cpp:1649

References _GetLowestRankId(), and HandleRemoveRank().

◆ HandleRemoveMember()

void Guild::HandleRemoveMember ( WorldSession session,
std::string_view  name 
)
1549{
1550 Player* player = session->GetPlayer();
1551 // Player must have rights to remove members
1552 if (!_HasRankRight(player, GR_RIGHT_REMOVE))
1554 else if (Member* member = GetMember(name))
1555 {
1556 // Guild masters cannot be removed
1557 if (member->IsRank(GR_GUILDMASTER))
1559 // Do not allow to remove player with the same rank or higher
1560 else
1561 {
1562 Member const* memberMe = GetMember(player->GetGUID());
1563 if (!memberMe || member->IsRankNotLower(memberMe->GetRankId()))
1565 else
1566 {
1567 // Copy values since everything will be deleted in DeleteMember().
1568 ObjectGuid guid = member->GetGUID();
1569 std::string memberName = member->GetName();
1570
1571 // After call to DeleteMember pointer to member becomes invalid
1572 DeleteMember(guid, false, true);
1574 _BroadcastEvent(GE_REMOVED, ObjectGuid::Empty, memberName, player->GetName());
1575 }
1576 }
1577 }
1578}
@ 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 
)
1650{
1651 // Cannot remove rank if total count is minimum allowed by the client or is not leader
1652 if (_GetRanksSize() <= GUILD_RANKS_MIN_COUNT || rankId >= _GetRanksSize() || !_IsLeader(session->GetPlayer()))
1653 return;
1654
1655 // Delete bank rights for rank
1657 stmt->SetData(0, m_id);
1658 stmt->SetData(1, rankId);
1659 CharacterDatabase.Execute(stmt);
1660 // Delete rank
1661 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_LOWEST_RANK);
1662 stmt->SetData(0, m_id);
1663 stmt->SetData(1, rankId);
1664 CharacterDatabase.Execute(stmt);
1665
1666 // match what the sql statement does
1667 m_ranks.erase(m_ranks.begin() + rankId, m_ranks.end());
1668
1669 _BroadcastEvent(GE_RANK_DELETED, ObjectGuid::Empty, std::to_string(m_ranks.size()));
1670}
@ 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 
)
1362{
1363 BankTab* tab = GetBankTab(tabId);
1364 if (!tab)
1365 {
1366 LOG_ERROR("guild", "Guild::HandleSetBankTabInfo: Player {} trying to change bank tab info from unexisting tab {}.",
1367 session->GetPlayerInfo(), tabId);
1368 return;
1369 }
1370
1371 tab->SetInfo(name, icon);
1372 _BroadcastEvent(GE_BANK_TAB_UPDATED, ObjectGuid::Empty, std::to_string(tabId), tab->GetName(), tab->GetIcon());
1373}
@ 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()

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 m_emblemInfo = emblemInfo;
1335
1336 SendSaveEmblemResult(session, ERR_GUILDEMBLEM_SUCCESS); // "Guild Emblem saved."
1337
1338 HandleQuery(session);
1339 }
1340}
#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 SaveToDB(uint32 guildId) const
Definition Guild.cpp:702
void HandleQuery(WorldSession *session)
Definition Guild.cpp:1258
static void SendSaveEmblemResult(WorldSession *session, GuildEmblemError errCode)
Definition Guild.cpp:126

References _IsLeader(), EMBLEM_PRICE, ERR_GUILDEMBLEM_NOTENOUGHMONEY, ERR_GUILDEMBLEM_NOTGUILDMASTER, ERR_GUILDEMBLEM_SUCCESS, WorldSession::GetPlayer(), HandleQuery(), Player::HasEnoughMoney(), m_emblemInfo, m_id, Player::ModifyMoney(), EmblemInfo::SaveToDB(), and SendSaveEmblemResult().

◆ 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 
)
1343{
1344 Player* player = session->GetPlayer();
1345 // Only leader can assign new leader
1346 if (!_IsLeader(player))
1348 // Old leader must be a member of guild
1349 else if (Member* pOldLeader = GetMember(player->GetGUID()))
1350 {
1351 // New leader must be a member of guild
1352 if (Member* pNewLeader = GetMember(name))
1353 {
1354 _SetLeaderGUID(*pNewLeader);
1355 pOldLeader->ChangeRank(GR_OFFICER);
1356 _BroadcastEvent(GE_LEADER_CHANGED, ObjectGuid::Empty, player->GetName(), pNewLeader->GetName());
1357 }
1358 }
1359}
@ 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 
)
1376{
1377 // Player must have rights to set public/officer note
1378 if (!_HasRankRight(session->GetPlayer(), isPublic ? GR_RIGHT_EPNOTE : GR_RIGHT_EOFFNOTE))
1380 else if (Member* member = GetMember(name))
1381 {
1382 if (isPublic)
1383 member->SetPublicNote(note);
1384 else
1385 member->SetOfficerNote(note);
1386
1387 HandleRoster(session);
1388 }
1389}
@ 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()

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

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 
)
1581{
1582 Player* player = session->GetPlayer();
1584 // Player must have rights to promote
1585 if (!_HasRankRight(player, demote ? GR_RIGHT_DEMOTE : GR_RIGHT_PROMOTE))
1587 // Promoted player must be a member of guild
1588 else if (Member* member = GetMember(name))
1589 {
1590 // Player cannot promote himself
1591 if (member->IsSamePlayer(player->GetGUID()))
1592 {
1594 return;
1595 }
1596
1597 Member const* memberMe = GetMember(player->GetGUID());
1598 uint8 rankId = memberMe->GetRankId();
1599 if (demote)
1600 {
1601 // Player can demote only lower rank members
1602 if (member->IsRankNotLower(rankId))
1603 {
1604 SendCommandResult(session, type, ERR_GUILD_RANK_TOO_HIGH_S, name);
1605 return;
1606 }
1607 // Lowest rank cannot be demoted
1608 if (member->GetRankId() >= _GetLowestRankId())
1609 {
1610 SendCommandResult(session, type, ERR_GUILD_RANK_TOO_LOW_S, name);
1611 return;
1612 }
1613 }
1614 else
1615 {
1616 // Allow to promote only to lower rank than member's rank
1617 // member->GetRankId() + 1 is the highest rank that current player can promote to
1618 if (member->IsRankNotLower(rankId + 1))
1619 {
1620 SendCommandResult(session, type, ERR_GUILD_RANK_TOO_HIGH_S, name);
1621 return;
1622 }
1623 }
1624
1625 uint32 newRankId = member->GetRankId() + (demote ? 1 : -1);
1626 member->ChangeRank(newRankId);
1627 _LogEvent(demote ? GUILD_EVENT_LOG_DEMOTE_PLAYER : GUILD_EVENT_LOG_PROMOTE_PLAYER, player->GetGUID(), member->GetGUID(), newRankId);
1628 _BroadcastEvent(demote ? GE_DEMOTION : GE_PROMOTION, ObjectGuid::Empty, player->GetName(), member->GetName(), _GetRankName(newRankId));
1629 }
1630}
@ 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:2545

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().

◆ LoadBankEventLogFromDB()

bool Guild::LoadBankEventLogFromDB ( Field fields)
2008{
2009 uint8 dbTabId = fields[1].Get<uint8>();
2010 bool isMoneyTab = (dbTabId == GUILD_BANK_MONEY_LOGS_TAB);
2011 if (dbTabId < _GetPurchasedTabsSize() || isMoneyTab)
2012 {
2013 uint8 tabId = isMoneyTab ? uint8(GUILD_BANK_MAX_TABS) : dbTabId;
2014 LogHolder<BankEventLogEntry>& bankLog = m_bankEventLog[tabId];
2015 if (bankLog.CanInsert())
2016 {
2017 ObjectGuid::LowType guid = fields[2].Get<uint32>();
2018 GuildBankEventLogTypes eventType = GuildBankEventLogTypes(fields[3].Get<uint8>());
2019 if (BankEventLogEntry::IsMoneyEvent(eventType))
2020 {
2021 if (!isMoneyTab)
2022 {
2023 LOG_ERROR("guild", "GuildBankEventLog ERROR: MoneyEvent(LogGuid: {}, Guild: {}) does not belong to money tab ({}), ignoring...", guid, m_id, dbTabId);
2024 return false;
2025 }
2026 }
2027 else if (isMoneyTab)
2028 {
2029 LOG_ERROR("guild", "GuildBankEventLog ERROR: non-money event (LogGuid: {}, Guild: {}) belongs to money tab, ignoring...", guid, m_id);
2030 return false;
2031 }
2032 bankLog.LoadEvent(
2033 m_id, // guild id
2034 guid, // guid
2035 time_t(fields[8].Get<uint32>()), // timestamp
2036 dbTabId, // tab id
2037 eventType, // event type
2038 ObjectGuid::Create<HighGuid::Player>(fields[4].Get<uint32>()), // player guid
2039 fields[5].Get<uint32>(), // item or money
2040 fields[6].Get<uint16>(), // itam stack count
2041 fields[7].Get<uint8>()); // dest tab id
2042 }
2043 }
2044 return true;
2045}
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)
2057{
2058 uint8 tabId = fields[12].Get<uint8>();
2059 if (tabId >= _GetPurchasedTabsSize())
2060 {
2061 LOG_ERROR("guild", "Invalid tab for item (GUID: {}, id: #{}) in guild bank, skipped.",
2062 fields[14].Get<uint32>(), fields[15].Get<uint32>());
2063 return false;
2064 }
2065 return m_bankTabs[tabId].LoadItemFromDB(fields);
2066}

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

◆ LoadBankRightFromDB()

void Guild::LoadBankRightFromDB ( Field fields)
1983{
1984 // tabId rights slots
1985 GuildBankRightsAndSlots rightsAndSlots(fields[1].Get<uint8>(), fields[3].Get<uint8>(), fields[4].Get<uint32>());
1986 // rankId
1987 _SetRankBankTabRightsAndSlots(fields[2].Get<uint8>(), rightsAndSlots, false);
1988}
Definition Guild.h:263

References _SetRankBankTabRightsAndSlots().

◆ LoadBankTabFromDB()

void Guild::LoadBankTabFromDB ( Field fields)
2048{
2049 uint8 tabId = fields[1].Get<uint8>();
2050 if (tabId >= _GetPurchasedTabsSize())
2051 LOG_ERROR("guild", "Invalid tab (tabId: {}) in guild bank, skipped.", tabId);
2052 else
2053 m_bankTabs[tabId].LoadFromDB(fields);
2054}

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

◆ LoadEventLogFromDB()

bool Guild::LoadEventLogFromDB ( Field fields)
1991{
1992 if (m_eventLog.CanInsert())
1993 {
1994 m_eventLog.LoadEvent(
1995 m_id, // guild id
1996 fields[1].Get<uint32>(), // guid
1997 time_t(fields[6].Get<uint32>()), // timestamp
1998 GuildEventLogTypes(fields[2].Get<uint8>()), // event type
1999 ObjectGuid::Create<HighGuid::Player>(fields[3].Get<uint32>()), // player guid 1
2000 ObjectGuid::Create<HighGuid::Player>(fields[4].Get<uint32>()), // player guid 2
2001 fields[5].Get<uint8>()); // rank
2002 return true;
2003 }
2004 return false;
2005}
GuildEventLogTypes
Definition Guild.h:209

References m_eventLog, and m_id.

◆ LoadFromDB()

bool Guild::LoadFromDB ( Field fields)
1928{
1929 m_id = fields[0].Get<uint32>();
1930 m_name = fields[1].Get<std::string>();
1931 m_leaderGuid = ObjectGuid::Create<HighGuid::Player>(fields[2].Get<uint32>());
1932 m_emblemInfo.LoadFromDB(fields);
1933 m_info = fields[8].Get<std::string>();
1934 m_motd = fields[9].Get<std::string>();
1935 m_createdDate = time_t(fields[10].Get<uint32>());
1936 m_bankMoney = fields[11].Get<uint64>();
1937
1938 uint8 purchasedTabs = uint8(fields[12].Get<uint64>());
1939 if (purchasedTabs > GUILD_BANK_MAX_TABS)
1940 purchasedTabs = GUILD_BANK_MAX_TABS;
1941
1942 m_bankTabs.clear();
1943 m_bankTabs.reserve(purchasedTabs);
1944 for (uint8 i = 0; i < purchasedTabs; ++i)
1945 m_bankTabs.emplace_back(m_id, i);
1946 return true;
1947}
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)
1959{
1960 ObjectGuid::LowType lowguid = fields[1].Get<uint32>();
1961 ObjectGuid playerGuid(HighGuid::Player, lowguid);
1962
1963 auto [memberIt, isNew] = m_members.try_emplace(lowguid, m_id, playerGuid, fields[2].Get<uint8>());
1964 if (!isNew)
1965 {
1966 LOG_ERROR("guild", "Tried to add {} to guild '{}'. Member already exists.", playerGuid.ToString(), m_name);
1967 return false;
1968 }
1969
1970 Member& member = memberIt->second;
1971 if (!member.LoadFromDB(fields))
1972 {
1973 _DeleteMemberFromDB(lowguid);
1974 m_members.erase(memberIt);
1975 return false;
1976 }
1977
1978 sCharacterCache->UpdateCharacterGuildId(playerGuid, GetId());
1979 return true;
1980}

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)
1950{
1951 RankInfo rankInfo(m_id);
1952
1953 rankInfo.LoadFromDB(fields);
1954
1955 m_ranks.push_back(rankInfo);
1956}

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

◆ MassInviteToEvent()

void Guild::MassInviteToEvent ( WorldSession session,
uint32  minLevel,
uint32  maxLevel,
uint32  minRank 
)
2170{
2171 uint32 count = 0;
2172
2174 data << uint32(count); // count placeholder
2175
2176 for (auto const& [guid, member] : m_members)
2177 {
2178 // not sure if needed, maybe client checks it as well
2179 if (count >= CALENDAR_MAX_INVITES)
2180 {
2181 if (Player* player = session->GetPlayer())
2182 sCalendarMgr->SendCalendarCommandResult(player->GetGUID(), CALENDAR_ERROR_INVITES_EXCEEDED);
2183 return;
2184 }
2185
2186 uint32 level = sCharacterCache->GetCharacterLevelByGuid(member.GetGUID());
2187
2188 if (member.GetGUID() != session->GetPlayer()->GetGUID() && level >= minLevel && level <= maxLevel && member.IsRankNotLower(minRank))
2189 {
2190 data.appendPackGUID(member.GetGUID().GetRawValue());
2191 data << uint8(0); // unk
2192 ++count;
2193 }
2194 }
2195
2196 data.put<uint32>(0, count);
2197
2198 session->SendPacket(&data);
2199}
@ 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.

◆ ModifyBankMoney()

bool Guild::ModifyBankMoney ( CharacterDatabaseTransaction  trans,
uint64 const &  amount,
bool  add 
)
inline
779{ 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 ( )
2957{
2958 for (auto& [guid, member] : m_members)
2959 member.ResetValues();
2960
2962}
@ 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
1820{
1821 // GUILD_BANK_MAX_TABS send by client for money log
1822 if (tabId < _GetPurchasedTabsSize() || tabId == GUILD_BANK_MAX_TABS)
1823 {
1824 std::list<BankEventLogEntry> const& bankEventLog = m_bankEventLog[tabId].GetGuildLog();
1825
1827 packet.Tab = tabId;
1828
1829 packet.Entry.reserve(bankEventLog.size());
1830 for (BankEventLogEntry const& entry : bankEventLog)
1831 entry.WritePacket(packet);
1832
1833 session->SendPacket(packet.Write());
1834 LOG_DEBUG("guild", "MSG_GUILD_BANK_LOG_QUERY [{}]", session->GetPlayerInfo());
1835 }
1836}
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
1839{
1840 if (tabId < _GetPurchasedTabsSize())
1841 _SendBankContent(session, tabId, sendAllSlots);
1842}
void _SendBankContent(WorldSession *session, uint8 tabId, bool sendAllSlots) const
Definition Guild.cpp:2775

References _GetPurchasedTabsSize(), and _SendBankContent().

◆ SendBankTabsInfo()

void Guild::SendBankTabsInfo ( WorldSession session,
bool  showTabs = false 
)
1845{
1846 Member* member = GetMember(session->GetPlayer()->GetGUID());
1847 if (!member)
1848 return;
1849
1850 member->SubscribeToGuildBankUpdatePackets();
1851
1852 _SendBankList(session, 0, sendAllSlots);
1853}

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

Referenced by WorldSession::HandleGuildBankerActivate().

◆ SendBankTabText()

void Guild::SendBankTabText ( WorldSession session,
uint8  tabId 
) const
1856{
1857 if (BankTab const* tab = GetBankTab(tabId))
1858 tab->SendText(this, session);
1859}

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
1806{
1807 std::list<EventLogEntry> const& eventLog = m_eventLog.GetGuildLog();
1808
1810 packet.Entry.reserve(eventLog.size());
1811
1812 for (EventLogEntry const& entry : eventLog)
1813 entry.WritePacket(packet);
1814
1815 session->SendPacket(packet.Write());
1816 LOG_DEBUG("guild", "MSG_GUILD_EVENT_LOG_QUERY [{}]", session->GetPlayerInfo());
1817}
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)
1906{
1908 motd.Type = GE_MOTD;
1909 motd.Params.emplace_back(m_motd);
1910 session->SendPacket(motd.Write());
1911
1912 LOG_DEBUG("guild", "SMSG_GUILD_EVENT [{}] MOTD", session->GetPlayerInfo());
1913
1914 Player* player = session->GetPlayer();
1915
1916 HandleRoster(session);
1917 _BroadcastEvent(GE_SIGNED_ON, player->GetGUID(), player->GetName());
1918
1919 if (Member* member = GetMember(player->GetGUID()))
1920 {
1921 member->SetStats(player);
1922 member->AddFlag(GUILDMEMBER_STATUS_ONLINE);
1923 }
1924}
@ 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
1891{
1892 Member const* member = GetMember(session->GetPlayer()->GetGUID());
1893 if (!member)
1894 return;
1895
1896 int32 amount = _GetMemberRemainingMoney(*member);
1897
1899 packet.RemainingWithdrawMoney = amount;
1900 session->SendPacket(packet.Write());
1901
1902 LOG_DEBUG("guild", "MSG_GUILD_BANK_MONEY_WITHDRAWN [{}] Money: {}", session->GetPlayerInfo(), amount);
1903}
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)
1862{
1863 Member* member = GetMember(session->GetPlayer()->GetGUID());
1864 if (!member)
1865 return;
1866
1867 // We are unsubscribing here since it is the only reliable way to handle /reload from player as
1868 // GuildPermissionsQuery is sent on each reload, and we don't want to send partial changes while client
1869 // doesn't know the full state
1870 member->UnsubscribeFromGuildBankUpdatePackets();
1871
1872 uint8 rankId = member->GetRankId();
1873
1875 queryResult.RankID = rankId;
1876 queryResult.WithdrawGoldLimit = _GetRankBankMoneyPerDay(rankId);
1877 queryResult.Flags = _GetRankRights(rankId);
1878 queryResult.NumTabs = _GetPurchasedTabsSize();
1879
1880 for (uint8 tabId = 0; tabId < GUILD_BANK_MAX_TABS; ++tabId)
1881 {
1882 queryResult.Tab[tabId].Flags = _GetRankBankTabRights(rankId, tabId);
1883 queryResult.Tab[tabId].WithdrawItemLimit = _GetMemberRemainingSlots(*member, tabId);
1884 }
1885
1886 session->SendPacket(queryResult.Write());
1887 LOG_DEBUG("guild", "MSG_GUILD_PERMISSIONS [{}] Rank: {}", session->GetPlayerInfo(), rankId);
1888}
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 
)
2399{
2400 if (BankTab* pTab = GetBankTab(tabId))
2401 {
2402 pTab->SetText(text);
2403 pTab->SendText(this, nullptr);
2404 }
2405}

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 
)
2371{
2372 if (tabId >= _GetPurchasedTabsSize() || slotId >= GUILD_BANK_MAX_SLOTS ||
2373 destTabId >= _GetPurchasedTabsSize() || destSlotId >= GUILD_BANK_MAX_SLOTS)
2374 return;
2375
2376 if (tabId == destTabId && slotId == destSlotId)
2377 return;
2378
2379 BankMoveItemData from(this, player, tabId, slotId);
2380 BankMoveItemData to(this, player, destTabId, destSlotId);
2381 _MoveItems(&from, &to, splitedAmount);
2382}
void _MoveItems(MoveItemData *pSrc, MoveItemData *pDest, uint32 splitedAmount)
Definition Guild.cpp:2678

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 
)
2385{
2386 if ((slotId >= GUILD_BANK_MAX_SLOTS && slotId != NULL_SLOT) || tabId >= _GetPurchasedTabsSize())
2387 return;
2388
2389 BankMoveItemData bankData(this, player, tabId, slotId);
2390 PlayerMoveItemData charData(this, player, playerBag, playerSlotId);
2391 if (toChar)
2392 _MoveItems(&bankData, &charData, splitedAmount);
2393 else
2394 _MoveItems(&charData, &bankData, splitedAmount);
2395}
@ 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 ( )
2070{
2071 // Validate ranks data
2072 // GUILD RANKS represent a sequence starting from 0 = GUILD_MASTER (ALL PRIVILEGES) to max 9 (lowest privileges).
2073 // The lower rank id is considered higher rank - so promotion does rank-- and demotion does rank++
2074 // Between ranks in sequence cannot be gaps - so 0, 1, 2, 4 is impossible
2075 // Min ranks count is 5 and max is 10.
2076 bool broken_ranks = false;
2077 uint8 ranks = _GetRanksSize();
2078 if (ranks < GUILD_RANKS_MIN_COUNT || ranks > GUILD_RANKS_MAX_COUNT)
2079 {
2080 LOG_ERROR("guild", "Guild {} has invalid number of ranks, creating new...", m_id);
2081 broken_ranks = true;
2082 }
2083 else
2084 {
2085 for (uint8 rankId = 0; rankId < ranks; ++rankId)
2086 {
2087 RankInfo* rankInfo = GetRankInfo(rankId);
2088 if (rankInfo->GetId() != rankId)
2089 {
2090 LOG_ERROR("guild", "Guild {} has broken rank id {}, creating default set of ranks...", m_id, rankId);
2091 broken_ranks = true;
2092 }
2093 else
2094 {
2095 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2096 rankInfo->CreateMissingTabsIfNeeded(_GetPurchasedTabsSize(), trans, true);
2097 CharacterDatabase.CommitTransaction(trans);
2098 }
2099 }
2100 }
2101
2102 if (broken_ranks)
2103 {
2104 m_ranks.clear();
2106 }
2107
2108 // Validate members' data
2109 for (auto& [guid, member] : m_members)
2110 if (member.GetRankId() > _GetRanksSize())
2111 member.ChangeRank(_GetLowestRankId());
2112
2113 // Repair the structure of the guild.
2114 // If the guildmaster doesn't exist or isn't member of the guild
2115 // attempt to promote another member.
2116 Member* pLeader = GetMember(m_leaderGuid);
2117 if (!pLeader)
2118 {
2120 // If no more members left, disband guild
2121 if (m_members.empty())
2122 {
2123 Disband();
2124 return false;
2125 }
2126 }
2127 else if (!pLeader->IsRank(GR_GUILDMASTER))
2128 _SetLeaderGUID(*pLeader);
2129
2130 // Check config if multiple guildmasters are allowed
2131 if (!sConfigMgr->GetOption<bool>("Guild.AllowMultipleGuildMaster", 0))
2132 for (auto& [guid, member] : m_members)
2133 if ((member.GetRankId() == GR_GUILDMASTER) && !member.IsSamePlayer(m_leaderGuid))
2134 member.ChangeRank(GR_OFFICER);
2135
2137 return true;
2138}
#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: