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

const MemberGetMember (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, const EmblemInfo &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, const uint64 &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
 
const RankInfoGetRankInfo (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:157
@ CHAR_DEL_GUILD_RANKS
Definition CharacterDatabase.h:148
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:1723
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:150
@ CHAR_DEL_GUILD_BANK_TAB
Definition CharacterDatabase.h:151
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:144

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 (const BankTab* 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 (const RankInfo* rankInfo = GetRankInfo(rankId))
2562 return rankInfo->GetBankMoneyPerDay();
2563 return 0;
2564}
const RankInfo * 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 (const RankInfo* 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 (const RankInfo* 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 (const RankInfo* 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 (const RankInfo* 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
const Member * 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 (const Member* 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:737
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:145

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 (const Member* 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:175

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:118
Player * GetPlayer() const
Definition WorldSession.h:454

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:1084
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5692
std::string const & GetName() const
Definition Object.h:528
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:287
std::string GetPlayerInfo() const
Definition WorldSession.cpp:251
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:170

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:83
@ CHAR_SEL_CHAR_DATA_FOR_GUILD
Definition CharacterDatabase.h:181
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:47
uint32 LowType
Definition ObjectGuid.h:122
void SetGuildIdInvited(uint32 GuildId)
Definition Player.h:1917
uint32 GetGuildId() const
Definition Player.h:1918
WorldSession * GetSession() const
Definition Player.h:2020
void SetInGuild(uint32 GuildId)
Definition Player.h:1909
void SetRank(uint8 rankId)
Definition Player.h:1915
static void RemovePetitionsAndSigns(ObjectGuid guid, uint32 type)
Definition Player.cpp:10053
@ GUILD_CHARTER_TYPE
Definition WorldSession.h:276
Player * FindConnectedPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:257

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:245

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:220

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:140
@ CHAR_DEL_GUILD_MEMBERS
Definition CharacterDatabase.h:145
#define sGuildMgr
Definition GuildMgr.h:51
@ CONFIG_GUILD_BANK_INITIAL_TABS
Definition WorldConfig.h:361
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:384
LocaleConstant GetSessionDbLocaleIndex() const
Definition WorldSession.h:589
#define sWorld
Definition World.h:317
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:120

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:152
@ CHAR_DEL_GUILD
Definition CharacterDatabase.h:141
@ CHAR_DEL_GUILD_BANK_EVENTLOGS
Definition CharacterDatabase.h:161
@ CHAR_DEL_GUILD_BANK_ITEMS
Definition CharacterDatabase.h:155
@ CHAR_DEL_GUILD_EVENTLOGS
Definition CharacterDatabase.h:164
@ 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]

const RankInfo * 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:35
ObjectGuid GetLeaderGUID() const
Definition Guild.h:687
TeamId GetTeamId(bool original=false) const
Definition Player.h:2128

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:11458
bool HasEnoughMoney(uint32 amount) const
Definition Player.h:1626

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:368
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:1920
Guild * GetGuild() const
Definition Player.cpp:16061
PlayerSocial * GetSocial()
Definition Player.h:1156
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:271

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:7199
uint8 GetLevel() const
Definition Unit.h:1103
bool HasPermission(uint32 permissionId)
Definition WorldSession.cpp:1551
uint32 GetAccountId() const
Definition WorldSession.h:453
std::string const & GetRemoteAddress()
Definition WorldSession.h:463
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:923
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:158
@ CHAR_DEL_GUILD_LOWEST_RANK
Definition CharacterDatabase.h:149
@ 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,
const EmblemInfo 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:169
@ 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:168
@ 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,
const uint64 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::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:142
static bool IsValidCharterName(std::string_view name)
Definition ObjectMgr.cpp:9312

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:131
#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: