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 ( )
1034 :
1035 m_id(0),
1036 m_createdDate(0),
1038 m_bankMoney(0)
1039{
1040}
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 ( )
1043{
1044 CharacterDatabaseTransaction temp(nullptr);
1045 _DeleteBankItems(temp);
1046}
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition DatabaseEnvFwd.h:69
void _DeleteBankItems(CharacterDatabaseTransaction trans, bool removeItemsFromDB=false)
Definition Guild.cpp:2471

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
2808{
2810 event.Type = guildEvent;
2811 if (param1)
2812 event.Params.push_back(*param1);
2813
2814 if (param2)
2815 {
2816 event.Params.resize(2);
2817 event.Params[1] = *param2;
2818 }
2819
2820 if (param3)
2821 {
2822 event.Params.resize(3);
2823 event.Params[2] = *param3;
2824 }
2825 event.Guid = guid;
2826 BroadcastPacket(event.Write());
2827 LOG_DEBUG("guild", "SMSG_GUILD_EVENT [Broadcast] Event: {}", guildEvent);
2828}
#define LOG_DEBUG(filterType__,...)
Definition Log.h:170
void BroadcastPacket(WorldPacket const *packet) const
Definition Guild.cpp:2142
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
2413{
2415 stmt->SetData(0, m_id);
2416 CharacterDatabase.Execute(stmt);
2417
2418 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_RIGHTS);
2419 stmt->SetData(0, m_id);
2420 CharacterDatabase.Execute(stmt);
2421
2422 _CreateRank(sObjectMgr->GetAcoreString(LANG_GUILD_MASTER, loc), GR_RIGHT_ALL);
2423 _CreateRank(sObjectMgr->GetAcoreString(LANG_GUILD_OFFICER, loc), GR_RIGHT_ALL);
2427}
@ 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:756
@ LANG_GUILD_VETERAN
Definition Language.h:758
@ LANG_GUILD_OFFICER
Definition Language.h:757
@ LANG_GUILD_INITIATE
Definition Language.h:760
@ LANG_GUILD_MEMBER
Definition Language.h:759
#define sObjectMgr
Definition ObjectMgr.h:1686
bool _CreateRank(std::string_view name, uint32 rights)
Definition Guild.cpp:2429
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
2389{
2390 uint8 tabId = _GetPurchasedTabsSize(); // Next free id
2391 m_bankTabs.emplace_back(m_id, tabId);
2392
2393 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2394
2396 stmt->SetData(0, m_id);
2397 stmt->SetData (1, tabId);
2398 trans->Append(stmt);
2399
2400 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GUILD_BANK_TAB);
2401 stmt->SetData(0, m_id);
2402 stmt->SetData (1, tabId);
2403 trans->Append(stmt);
2404
2405 ++tabId;
2406 for (auto& m_rank : m_ranks)
2407 m_rank.CreateMissingTabsIfNeeded(tabId, trans, false);
2408
2409 CharacterDatabase.CommitTransaction(trans);
2410}
@ 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
2430{
2431 uint8 newRankId = _GetRanksSize();
2432 if (newRankId >= GUILD_RANKS_MAX_COUNT)
2433 return false;
2434
2435 // Ranks represent sequence 0, 1, 2, ... where 0 means guildmaster
2436 RankInfo info(m_id, newRankId, name, rights, 0);
2437 m_ranks.push_back(info);
2438
2439 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2440 info.CreateMissingTabsIfNeeded(_GetPurchasedTabsSize(), trans);
2441 info.SaveToDB(trans);
2442 CharacterDatabase.CommitTransaction(trans);
2443
2444 return true;
2445}
@ 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
2472{
2473 for (uint8 tabId = 0; tabId < _GetPurchasedTabsSize(); ++tabId)
2474 {
2475 m_bankTabs[tabId].Delete(trans, removeItemsFromDB);
2476 }
2477 m_bankTabs.clear();
2478}

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
2712{
2713 Item* pDestItem = pDest->GetItem();
2714 bool swap = (pDestItem != nullptr);
2715
2716 Item* pSrcItem = pSrc->GetItem(splitedAmount);
2717 // 1. Can store source item in destination
2718 if (!pDest->CanStore(pSrcItem, swap, sendError))
2719 return false;
2720
2721 // 2. Can store destination item in source
2722 if (swap)
2723 if (!pSrc->CanStore(pDestItem, true, true))
2724 return false;
2725
2726 // GM LOG (TODO: move to scripts)
2727 pDest->LogAction(pSrc);
2728 if (swap)
2729 pSrc->LogAction(pDest);
2730
2731 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2732 // 3. Log bank events
2733 pDest->LogBankEvent(trans, pSrc, pSrcItem->GetCount());
2734 if (swap)
2735 pSrc->LogBankEvent(trans, pDest, pDestItem->GetCount());
2736
2737 // 4. Remove item from source
2738 pSrc->RemoveItem(trans, pDest, splitedAmount);
2739
2740 // 5. Remove item from destination
2741 if (swap)
2742 pDest->RemoveItem(trans, pSrc);
2743
2744 // 6. Store item in destination
2745 pDest->StoreItem(trans, pSrcItem);
2746
2747 // 7. Store item in source
2748 if (swap)
2749 pSrc->StoreItem(trans, pDestItem);
2750
2751 CharacterDatabase.CommitTransaction(trans);
2752 return true;
2753}
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
2646{
2647 if (const BankTab* tab = GetBankTab(tabId))
2648 return tab->GetItem(slotId);
2649 return nullptr;
2650}
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
2576{
2577 uint8 rankId = member.GetRankId();
2578 if (rankId == GR_GUILDMASTER)
2579 return static_cast<int32>(GUILD_WITHDRAW_MONEY_UNLIMITED);
2580
2582 {
2583 int32 remaining = _GetRankBankMoneyPerDay(rankId) - member.GetBankWithdrawValue(GUILD_BANK_MAX_TABS);
2584 if (remaining > 0)
2585 return remaining;
2586 }
2587 return 0;
2588}
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:2532
int32 _GetRankBankMoneyPerDay(uint8 rankId) const
Definition Guild.cpp:2539

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
2562{
2563 uint8 rankId = member.GetRankId();
2564 if (rankId == GR_GUILDMASTER)
2565 return static_cast<int32>(GUILD_WITHDRAW_SLOT_UNLIMITED);
2566 if ((_GetRankBankTabRights(rankId, tabId) & GUILD_BANK_RIGHT_VIEW_TAB) != 0)
2567 {
2568 int32 remaining = _GetRankBankTabSlotsPerDay(rankId, tabId) - member.GetBankWithdrawValue(tabId);
2569 if (remaining > 0)
2570 return remaining;
2571 }
2572 return 0;
2573}
@ 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:2554
int32 _GetRankBankTabSlotsPerDay(uint8 rankId, uint8 tabId) const
Definition Guild.cpp:2546

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
2540{
2541 if (const RankInfo* rankInfo = GetRankInfo(rankId))
2542 return rankInfo->GetBankMoneyPerDay();
2543 return 0;
2544}
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
2555{
2556 if (const RankInfo* rankInfo = GetRankInfo(rankId))
2557 return rankInfo->GetBankTabRights(tabId);
2558 return 0;
2559}

References GetRankInfo().

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

◆ _GetRankBankTabSlotsPerDay()

int32 Guild::_GetRankBankTabSlotsPerDay ( uint8  rankId,
uint8  tabId 
) const
inlineprivate
2547{
2548 if (tabId < _GetPurchasedTabsSize())
2549 if (const RankInfo* rankInfo = GetRankInfo(rankId))
2550 return rankInfo->GetBankTabSlotsPerDay(tabId);
2551 return 0;
2552}

References _GetPurchasedTabsSize(), and GetRankInfo().

Referenced by _GetMemberRemainingSlots(), and _UpdateMemberWithdrawSlots().

◆ _GetRankName()

std::string Guild::_GetRankName ( uint8  rankId) const
inlineprivate
2526{
2527 if (const RankInfo* rankInfo = GetRankInfo(rankId))
2528 return rankInfo->GetName();
2529 return "<unknown>";
2530}

References GetRankInfo().

Referenced by HandleUpdateMemberRank().

◆ _GetRankRights()

uint32 Guild::_GetRankRights ( uint8  rankId) const
inlineprivate
2533{
2534 if (const RankInfo* rankInfo = GetRankInfo(rankId))
2535 return rankInfo->GetRights();
2536 return 0;
2537}

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

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
2463{
2464 if (player->GetGUID() == m_leaderGuid)
2465 return true;
2466 if (const Member* member = GetMember(player->GetGUID()))
2467 return member->IsRank(GR_GUILDMASTER);
2468 return false;
2469}
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
2625{
2626 if (tabId > GUILD_BANK_MAX_TABS)
2627 return;
2628
2629 // not logging moves within the same tab
2630 if (eventType == GUILD_BANK_LOG_MOVE_ITEM && tabId == destTabId)
2631 return;
2632
2633 uint8 dbTabId = tabId;
2634 if (BankEventLogEntry::IsMoneyEvent(eventType))
2635 {
2636 tabId = GUILD_BANK_MAX_TABS;
2637 dbTabId = GUILD_BANK_MONEY_LOGS_TAB;
2638 }
2639 LogHolder<BankEventLogEntry>& pLog = m_bankEventLog[tabId];
2640 pLog.AddEvent(trans, m_id, pLog.GetNextGUID(), eventType, dbTabId, guid, itemOrMoney, itemStackCount, destTabId);
2641
2642 sScriptMgr->OnGuildBankEvent(this, uint8(eventType), tabId, guid.GetCounter(), itemOrMoney, itemStackCount, destTabId);
2643}
@ GUILD_BANK_MONEY_LOGS_TAB
Definition Guild.h:44
@ GUILD_BANK_LOG_MOVE_ITEM
Definition Guild.h:199
#define sScriptMgr
Definition ScriptMgr.h:719
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
2615{
2616 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2617 m_eventLog.AddEvent(trans, m_id, m_eventLog.GetNextGUID(), eventType, playerGuid1, playerGuid2, newRank);
2618 CharacterDatabase.CommitTransaction(trans);
2619
2620 sScriptMgr->OnGuildEvent(this, uint8(eventType), playerGuid1.GetCounter(), playerGuid2.GetCounter(), newRank);
2621}
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
2602{
2603 if (const Member* member = GetMember(guid))
2604 {
2605 // Leader always has full rights
2606 if (member->IsRank(GR_GUILDMASTER) || m_leaderGuid == guid)
2607 return true;
2608 return (_GetRankBankTabRights(member->GetRankId(), tabId) & rights) == rights;
2609 }
2610 return false;
2611}

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

Referenced by _SendBankContent(), and _SendBankList().

◆ _ModifyBankMoney()

bool Guild::_ModifyBankMoney ( CharacterDatabaseTransaction  trans,
uint64  amount,
bool  add 
)
private
2481{
2482 if (add)
2483 m_bankMoney += amount;
2484 else
2485 {
2486 // Check if there is enough money in bank.
2487 if (m_bankMoney < amount)
2488 return false;
2489 m_bankMoney -= amount;
2490 }
2491
2493 stmt->SetData(0, m_bankMoney);
2494 stmt->SetData(1, m_id);
2495 trans->Append(stmt);
2496 return true;
2497}
@ 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
2659{
2660 // 1. Initialize source item
2661 if (!pSrc->InitItem())
2662 return; // No source item
2663
2664 // 2. Check source item
2665 if (!pSrc->CheckItem(splitedAmount))
2666 return; // Source item or splited amount is invalid
2667
2668 // 3. Check destination rights
2669 if (!pDest->HasStoreRights(pSrc))
2670 return; // Player has no rights to store item in destination
2671
2672 // 4. Check source withdraw rights
2673 if (!pSrc->HasWithdrawRights(pDest))
2674 return; // Player has no rights to withdraw items from source
2675
2676 // 5. Check split
2677 if (splitedAmount)
2678 {
2679 // 5.1. Clone source item
2680 if (!pSrc->CloneItem(splitedAmount))
2681 return; // Item could not be cloned
2682
2683 // 5.2. Move splited item to destination
2684 _DoItemsMove(pSrc, pDest, true, splitedAmount);
2685 }
2686 else // 6. No split
2687 {
2688 // 6.1. Try to merge items in destination (pDest->GetItem() == nullptr)
2689 if (!_DoItemsMove(pSrc, pDest, false)) // Item could not be merged
2690 {
2691 // 6.2. Try to swap items
2692 // 6.2.1. Initialize destination item
2693 if (!pDest->InitItem())
2694 return;
2695
2696 // 6.2.2. Check rights to store item in source (opposite direction)
2697 if (!pSrc->HasStoreRights(pDest))
2698 return; // Player has no rights to store item in source (opposite direction)
2699
2700 if (!pDest->HasWithdrawRights(pSrc))
2701 return; // Player has no rights to withdraw item from destination (opposite direction)
2702
2703 // 6.2.3. Swap items (pDest->GetItem() != nullptr)
2704 _DoItemsMove(pSrc, pDest, true);
2705 }
2706 }
2707 // 7. Send changes
2708 _SendBankContentUpdate(pSrc, pDest);
2709}
bool _DoItemsMove(MoveItemData *pSrc, MoveItemData *pDest, bool sendError, uint32 splitedAmount=0)
Definition Guild.cpp:2711
void _SendBankContentUpdate(MoveItemData *pSrc, MoveItemData *pDest) const
Definition Guild.cpp:2769

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
2653{
2654 if (BankTab* pTab = GetBankTab(tabId))
2655 pTab->SetItem(trans, slotId, nullptr);
2656}

References GetBankTab().

◆ _SendBankContent()

void Guild::_SendBankContent ( WorldSession session,
uint8  tabId,
bool  sendAllSlots 
) const
private
2756{
2757 ObjectGuid guid = session->GetPlayer()->GetGUID();
2759 return;
2760
2761 _SendBankList(session, tabId, sendAllSlots);
2762}
void _SendBankList(WorldSession *session=nullptr, uint8 tabId=0, bool sendFullSlots=false, SlotIds *slots=nullptr) const
Definition Guild.cpp:2830
bool _MemberHasTabRights(ObjectGuid guid, uint8 tabId, uint32 rights) const
Definition Guild.cpp:2601
Definition ObjectGuid.h:118
Player * GetPlayer() const
Definition WorldSession.h:435

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
2770{
2771 ASSERT(pSrc->IsBank() || pDest->IsBank());
2772
2773 uint8 tabId = 0;
2774 SlotIds slots;
2775 if (pSrc->IsBank()) // B ->
2776 {
2777 tabId = pSrc->GetContainer();
2778 slots.insert(pSrc->GetSlotId());
2779 if (pDest->IsBank()) // B -> B
2780 {
2781 // Same tab - add destination slots to collection
2782 if (pDest->GetContainer() == pSrc->GetContainer())
2783 pDest->CopySlots(slots);
2784 else // Different tabs - send second message
2785 {
2786 SlotIds destSlots;
2787 pDest->CopySlots(destSlots);
2788 _SendBankContentUpdate(pDest->GetContainer(), destSlots);
2789 }
2790 }
2791 }
2792 else if (pDest->IsBank()) // C -> B
2793 {
2794 tabId = pDest->GetContainer();
2795 pDest->CopySlots(slots);
2796 }
2797
2798 _SendBankContentUpdate(tabId, slots);
2799}
#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
2802{
2803 _SendBankList(nullptr, tabId, false, &slots);
2804}

References _SendBankList().

◆ _SendBankList()

void Guild::_SendBankList ( WorldSession session = nullptr,
uint8  tabId = 0,
bool  sendFullSlots = false,
SlotIds slots = nullptr 
) const
private
2831{
2832 if (!sScriptMgr->CanGuildSendBankList(this, session, tabId, sendAllSlots))
2833 return;
2834
2836
2837 packet.Money = m_bankMoney;
2838 packet.Tab = int32(tabId);
2839 packet.FullUpdate = sendAllSlots;
2840
2841 if (sendAllSlots && !tabId)
2842 {
2843 packet.TabInfo.reserve(_GetPurchasedTabsSize());
2844 for (uint8 i = 0; i < _GetPurchasedTabsSize(); ++i)
2845 {
2847 tabInfo.Name = m_bankTabs[i].GetName();
2848 tabInfo.Icon = m_bankTabs[i].GetIcon();
2849 packet.TabInfo.push_back(tabInfo);
2850 }
2851 }
2852
2853 if (BankTab const* tab = GetBankTab(tabId))
2854 {
2855 auto fillItems = [&](auto begin, auto end, bool skipEmpty)
2856 {
2857 for (auto itr = begin; itr != end; ++itr)
2858 {
2859 if (Item* tabItem = tab->GetItem(*itr))
2860 {
2862
2863 itemInfo.Slot = *itr;
2864 itemInfo.ItemID = tabItem->GetEntry();
2865 itemInfo.Count = int32(tabItem->GetCount());
2866 itemInfo.Charges = int32(std::abs(tabItem->GetSpellCharges()));
2867 itemInfo.EnchantmentID = int32(tabItem->GetEnchantmentId(PERM_ENCHANTMENT_SLOT));
2868 itemInfo.Flags = tabItem->GetInt32Value(ITEM_FIELD_FLAGS);
2869 itemInfo.RandomPropertiesID = tabItem->GetItemRandomPropertyId();
2870 itemInfo.RandomPropertiesSeed = int32(tabItem->GetItemSuffixFactor());
2871
2872 for (uint32 socketSlot = 0; socketSlot < MAX_GEM_SOCKETS; ++socketSlot)
2873 {
2874 if (uint32 enchId = tabItem->GetEnchantmentId(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT + socketSlot)))
2875 {
2877 gem.SocketIndex = socketSlot;
2878 gem.SocketEnchantID = int32(enchId);
2879 itemInfo.SocketEnchant.push_back(gem);
2880 }
2881 }
2882
2883 packet.ItemInfo.push_back(itemInfo);
2884 }
2885 else if (!skipEmpty)
2886 {
2888
2889 itemInfo.Slot = *itr;
2890 itemInfo.ItemID = 0;
2891
2892 packet.ItemInfo.push_back(itemInfo);
2893 }
2894 }
2895
2896 };
2897
2898 if (sendAllSlots)
2899 fillItems(boost::make_counting_iterator(uint8(0)), boost::make_counting_iterator(uint8(GUILD_BANK_MAX_SLOTS)), true);
2900 else if (slots && !slots->empty())
2901 fillItems(slots->begin(), slots->end(), false);
2902 }
2903
2904 if (session)
2905 {
2906 if (Member const* member = GetMember(session->GetPlayer()->GetGUID()))
2907 packet.WithdrawalsRemaining = _GetMemberRemainingSlots(*member, tabId);
2908
2909 session->SendPacket(packet.Write());
2910 LOG_DEBUG("guild", "SMSG_GUILD_BANK_LIST [{}]: TabId: {}, FullSlots: {}, slots: {}",
2911 session->GetPlayerInfo(), tabId, sendAllSlots, packet.WithdrawalsRemaining);
2912 }
2913 else
2914 {
2915 packet.Write();
2916 for (auto const& [guid, member] : m_members)
2917 {
2918 if (!member.ShouldReceiveBankPartialUpdatePackets())
2919 continue;
2920
2921 if (!_MemberHasTabRights(member.GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB))
2922 continue;
2923
2924 Player* player = member.FindPlayer();
2925 if (!player)
2926 continue;
2927
2929 player->SendDirectMessage(packet.GetRawPacket());
2930 LOG_DEBUG("guild", "SMSG_GUILD_BANK_LIST [{}]: TabId: {}, FullSlots: {}, slots: {}"
2931 , player->GetName(), tabId, sendAllSlots, packet.WithdrawalsRemaining);
2932 }
2933 }
2934}
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:2561
std::unordered_map< uint32, Member > m_members
Definition Guild.h:795
Definition Player.h:1066
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5685
std::string const & GetName() const
Definition Object.h:524
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:283
std::string GetPlayerInfo() const
Definition WorldSession.cpp:247
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
2765{
2766 _SendBankList(session);
2767}

References _SendBankList().

◆ _SetLeaderGUID()

void Guild::_SetLeaderGUID ( Member pLeader)
private
2500{
2501 m_leaderGuid = pLeader.GetGUID();
2502 pLeader.ChangeRank(GR_GUILDMASTER);
2503
2505 stmt->SetData(0, m_leaderGuid.GetCounter());
2506 stmt->SetData(1, m_id);
2507 CharacterDatabase.Execute(stmt);
2508}
@ 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
2511{
2512 if (RankInfo* rankInfo = GetRankInfo(rankId))
2513 rankInfo->SetBankMoneyPerDay(moneyPerDay);
2514}

References GetRankInfo().

Referenced by HandleSetRankInfo().

◆ _SetRankBankTabRightsAndSlots()

void Guild::_SetRankBankTabRightsAndSlots ( uint8  rankId,
GuildBankRightsAndSlots  rightsAndSlots,
bool  saveToDB = true 
)
private
2517{
2518 if (rightsAndSlots.GetTabId() >= _GetPurchasedTabsSize())
2519 return;
2520
2521 if (RankInfo* rankInfo = GetRankInfo(rankId))
2522 rankInfo->SetBankTabSlotsAndRights(rightsAndSlots, saveToDB);
2523}
uint8 GetTabId() const
Definition Guild.h:279

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

Referenced by HandleSetRankInfo(), and LoadBankRightFromDB().

◆ _UpdateAccountsNumber()

void Guild::_UpdateAccountsNumber ( )
private
2450{
2451 // We use a set to be sure each element will be unique
2452 std::unordered_set<uint32> accountsIdSet;
2453 for (auto const& [guid, member] : m_members)
2454 accountsIdSet.insert(member.GetAccountId());
2455
2456 m_accountsNumber = accountsIdSet.size();
2457}

References m_accountsNumber, and m_members.

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

◆ _UpdateMemberWithdrawSlots()

void Guild::_UpdateMemberWithdrawSlots ( CharacterDatabaseTransaction  trans,
ObjectGuid  guid,
uint8  tabId 
)
inlineprivate
2591{
2592 if (Member* member = GetMember(guid))
2593 {
2594 uint8 rankId = member->GetRankId();
2595 if (rankId != GR_GUILDMASTER
2596 && member->GetBankWithdrawValue(tabId) < _GetRankBankTabSlotsPerDay(rankId, tabId))
2597 member->UpdateBankWithdrawValue(trans, tabId, 1);
2598 }
2599}

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

◆ AddMember()

bool Guild::AddMember ( ObjectGuid  guid,
uint8  rankId = GUILD_RANK_NONE 
)
2183{
2185 // Player cannot be in guild
2186 if (player)
2187 {
2188 if (player->GetGuildId() != 0)
2189 return false;
2190 }
2191 else if (sCharacterCache->GetCharacterGuildIdByGuid(guid) != 0)
2192 return false;
2193
2194 // Remove all player signs from another petitions
2195 // This will be prevent attempt to join many guilds and corrupt guild data integrity
2197
2198 ObjectGuid::LowType lowguid = guid.GetCounter();
2199
2200 // If rank was not passed, assign lowest possible rank
2201 if (rankId == GUILD_RANK_NONE)
2202 rankId = _GetLowestRankId();
2203
2204 auto [memberIt, isNew] = m_members.try_emplace(lowguid, m_id, guid, rankId);
2205 if (!isNew)
2206 {
2207 LOG_ERROR("guild", "Tried to add {} to guild '{}'. Member already exists.", guid.ToString(), m_name);
2208 return false;
2209 }
2210
2211 Member& member = memberIt->second;
2212 std::string name;
2213 if (player)
2214 {
2215 player->SetInGuild(m_id);
2216 player->SetGuildIdInvited(0);
2217 player->SetRank(rankId);
2218 member.SetStats(player);
2219 SendLoginInfo(player->GetSession());
2220 name = player->GetName();
2221 }
2222 else
2223 {
2224 member.ResetFlags();
2225
2226 bool ok = false;
2227 // xinef: sync query
2228 // Player must exist
2230 stmt->SetData(0, guid.GetCounter());
2231 if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
2232 {
2233 Field* fields = result->Fetch();
2234 name = fields[0].Get<std::string>();
2235 member.SetStats(
2236 name,
2237 fields[1].Get<uint8>(),
2238 fields[2].Get<uint8>(),
2239 fields[3].Get<uint8>(),
2240 fields[4].Get<uint16>(),
2241 fields[5].Get<uint32>());
2242
2243 ok = member.CheckStats();
2244 }
2245 if (!ok)
2246 {
2247 m_members.erase(memberIt);
2248 return false;
2249 }
2250 sCharacterCache->UpdateCharacterGuildId(guid, m_id);
2251 }
2252
2253 CharacterDatabaseTransaction trans(nullptr);
2254 member.SaveToDB(trans);
2255
2258 _BroadcastEvent(GE_JOINED, guid, name);
2259
2260 // Call scripts if member was succesfully added (and stored to database)
2261 sScriptMgr->OnGuildAddMember(this, player, rankId);
2262
2263 return true;
2264}
#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:158
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:1885
std::string m_name
Definition Guild.h:784
void _UpdateAccountsNumber()
Definition Guild.cpp:2449
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:2806
void _LogEvent(GuildEventLogTypes eventType, ObjectGuid playerGuid1, ObjectGuid playerGuid2=ObjectGuid::Empty, uint8 newRank=0)
Definition Guild.cpp:2614
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:1890
uint32 GetGuildId() const
Definition Player.h:1891
WorldSession * GetSession() const
Definition Player.h:1993
void SetInGuild(uint32 GuildId)
Definition Player.h:1882
void SetRank(uint8 rankId)
Definition Player.h:1888
static void RemovePetitionsAndSigns(ObjectGuid guid, uint32 type)
Definition Player.cpp:10085
@ GUILD_CHARTER_TYPE
Definition WorldSession.h:267
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
2143{
2144 for (auto const& [guid, member] : m_members)
2145 if (Player* player = member.FindPlayer())
2146 player->SendDirectMessage(packet);
2147}
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
2135{
2136 for (auto const& [guid, member] : m_members)
2137 if (member.IsRank(rankId))
2138 if (Player* player = member.FindPlayer())
2139 player->SendDirectMessage(packet);
2140}

References m_members.

◆ BroadcastToGuild()

void Guild::BroadcastToGuild ( WorldSession session,
bool  officerOnly,
std::string_view  msg,
uint32  language = LANG_UNIVERSAL 
) const
2122{
2123 if (session && session->GetPlayer() && _HasRankRight(session->GetPlayer(), officerOnly ? GR_RIGHT_OFFCHATSPEAK : GR_RIGHT_GCHATSPEAK))
2124 {
2125 WorldPacket data;
2126 ChatHandler::BuildChatPacket(data, officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, Language(language), session->GetPlayer(), nullptr, msg);
2127 for (auto const& [guid, member] : m_members)
2128 if (Player* player = member.FindPlayer())
2129 if (_HasRankRight(player, officerOnly ? GR_RIGHT_OFFCHATLISTEN : GR_RIGHT_GCHATLISTEN) && !player->GetSocial()->HasIgnore(session->GetPlayer()->GetGUID()))
2130 player->SendDirectMessage(&data);
2131 }
2132}
@ GR_RIGHT_OFFCHATSPEAK
Definition Guild.h:80
@ GR_RIGHT_OFFCHATLISTEN
Definition Guild.h:79
@ CHAT_MSG_GUILD
Definition SharedDefines.h:3396
@ CHAT_MSG_OFFICER
Definition SharedDefines.h:3397
Language
Definition SharedDefines.h:745
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:265
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 
)
2328{
2329 if (newRank <= _GetLowestRankId()) // Validate rank (allow only existing ranks)
2330 if (Member* member = GetMember(guid))
2331 {
2332 member->ChangeRank(newRank);
2333
2334 if (newRank == GR_GUILDMASTER)
2335 {
2336 m_leaderGuid = guid;
2337
2339 stmt->SetData(0, m_leaderGuid.GetCounter());
2340 stmt->SetData(1, m_id);
2341 CharacterDatabase.Execute(stmt);
2342 }
2343
2344 return true;
2345 }
2346 return false;
2347}

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 
)
1050{
1051 // Check if guild with such name already exists
1052 if (sGuildMgr->GetGuildByName(name))
1053 return false;
1054
1055 WorldSession* pLeaderSession = pLeader->GetSession();
1056 if (!pLeaderSession)
1057 return false;
1058
1059 m_id = sGuildMgr->GenerateGuildId();
1060 m_leaderGuid = pLeader->GetGUID();
1061 m_name = name;
1062 m_info = "";
1063 m_motd = "No message set.";
1064 m_bankMoney = 0;
1066
1067 LOG_DEBUG("guild", "GUILD: creating guild [{}] for leader {} ({})",
1068 m_name, pLeader->GetName(), m_leaderGuid.ToString());
1069
1070 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1071
1073 stmt->SetData(0, m_id);
1074 trans->Append(stmt);
1075
1076 uint8 index = 0;
1077 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GUILD);
1078 stmt->SetData( index, m_id);
1079 stmt->SetData(++index, m_name);
1080 stmt->SetData(++index, m_leaderGuid.GetCounter());
1081 stmt->SetData(++index, m_info);
1082 stmt->SetData(++index, m_motd);
1083 stmt->SetData(++index, uint32(m_createdDate));
1084 stmt->SetData(++index, m_emblemInfo.GetStyle());
1085 stmt->SetData(++index, m_emblemInfo.GetColor());
1086 stmt->SetData(++index, m_emblemInfo.GetBorderStyle());
1087 stmt->SetData(++index, m_emblemInfo.GetBorderColor());
1088 stmt->SetData(++index, m_emblemInfo.GetBackgroundColor());
1089 stmt->SetData(++index, m_bankMoney);
1090 trans->Append(stmt);
1091
1092 CharacterDatabase.CommitTransaction(trans);
1093 _CreateDefaultGuildRanks(pLeaderSession->GetSessionDbLocaleIndex()); // Create default ranks
1094 bool ret = AddMember(m_leaderGuid, GR_GUILDMASTER); // Add guildmaster
1095
1096 for (short i = 0; i < static_cast<short>(sWorld->getIntConfig(CONFIG_GUILD_BANK_INITIAL_TABS)); i++)
1097 {
1099 }
1100
1101 if (ret)
1102 sScriptMgr->OnGuildCreate(this, pLeader, m_name);
1103
1104 return ret;
1105}
@ 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:362
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:2388
bool AddMember(ObjectGuid guid, uint8 rankId=GUILD_RANK_NONE)
Definition Guild.cpp:2182
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:2412
Player session in the World.
Definition WorldSession.h:375
LocaleConstant GetSessionDbLocaleIndex() const
Definition WorldSession.h:570
#define sWorld
Definition World.h:316
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 
)
2267{
2268 ObjectGuid::LowType lowguid = guid.GetCounter();
2270
2271 // Guild master can be deleted when loading guild and guid doesn't exist in characters table
2272 // or when he is removed from guild by gm command
2273 if (m_leaderGuid == guid && !isDisbanding)
2274 {
2275 Member* oldLeader = nullptr;
2276 Member* newLeader = nullptr;
2277 for (auto& [guid, member] : m_members)
2278 {
2279 if (guid == lowguid)
2280 oldLeader = &member;
2281 else if (!newLeader || newLeader->GetRankId() > member.GetRankId())
2282 newLeader = &member;
2283 }
2284
2285 if (!newLeader)
2286 {
2287 Disband();
2288 if (canDeleteGuild)
2289 delete this;
2290 return;
2291 }
2292
2293 _SetLeaderGUID(*newLeader);
2294
2295 // If player not online data in data field will be loaded from guild tabs no need to update it !!
2296 if (Player* newLeaderPlayer = newLeader->FindPlayer())
2297 newLeaderPlayer->SetRank(GR_GUILDMASTER);
2298
2299 // If leader does not exist (at guild loading with deleted leader) do not send broadcasts
2300 if (oldLeader)
2301 {
2302 _BroadcastEvent(GE_LEADER_CHANGED, ObjectGuid::Empty, oldLeader->GetName(), newLeader->GetName());
2303 _BroadcastEvent(GE_LEFT, guid, oldLeader->GetName());
2304 }
2305 }
2306 // Call script on remove before member is actually removed from guild (and database)
2307 sScriptMgr->OnGuildRemoveMember(this, player, isDisbanding, isKicked);
2308
2309 m_members.erase(lowguid);
2310
2311 // If player not online data in data field will be loaded from guild tabs no need to update it !!
2312 if (player)
2313 {
2314 player->SetInGuild(0);
2315 player->SetRank(0);
2316 }
2317 else
2318 {
2319 sCharacterCache->UpdateCharacterGuildId(guid, 0);
2320 }
2321
2323 if (!isDisbanding)
2325}
@ GE_LEFT
Definition Guild.h:151
@ GE_LEADER_CHANGED
Definition Guild.h:154
void _SetLeaderGUID(Member &pLeader)
Definition Guild.cpp:2499
void Disband()
Definition Guild.cpp:1108
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 ( )
1109{
1110 // Call scripts before guild data removed from database
1111 sScriptMgr->OnGuildDisband(this);
1112
1114 // Remove all members
1115 while (!m_members.empty())
1116 {
1117 auto itr = m_members.begin();
1118 DeleteMember(itr->second.GetGUID(), true);
1119 }
1120
1121 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1122
1124 stmt->SetData(0, m_id);
1125 trans->Append(stmt);
1126
1127 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_RANKS);
1128 stmt->SetData(0, m_id);
1129 trans->Append(stmt);
1130
1131 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_TABS);
1132 stmt->SetData(0, m_id);
1133 trans->Append(stmt);
1134
1135 // Free bank tab used memory and delete items stored in them
1136 _DeleteBankItems(trans, true);
1137
1138 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_ITEMS);
1139 stmt->SetData(0, m_id);
1140 trans->Append(stmt);
1141
1142 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_RIGHTS);
1143 stmt->SetData(0, m_id);
1144 trans->Append(stmt);
1145
1146 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_EVENTLOGS);
1147 stmt->SetData(0, m_id);
1148 trans->Append(stmt);
1149
1150 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_EVENTLOGS);
1151 stmt->SetData(0, m_id);
1152 trans->Append(stmt);
1153
1154 CharacterDatabase.CommitTransaction(trans);
1155 sGuildMgr->RemoveGuild(m_id);
1156}
@ 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:2266

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)
1496{
1497 Player* player = session->GetPlayer();
1498 if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && player->GetTeamId() != sCharacterCache->GetCharacterTeamByGuid(GetLeaderGUID()))
1499 {
1500 return;
1501 }
1502
1503 AddMember(player->GetGUID());
1504}
@ 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:2101

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 
)
1625{
1626 uint8 size = _GetRanksSize();
1627 if (size >= GUILD_RANKS_MAX_COUNT)
1628 return;
1629
1630 // Only leader can add new rank
1631 if (_IsLeader(session->GetPlayer()))
1633 _BroadcastEvent(GE_RANK_UPDATED, ObjectGuid::Empty, std::to_string(size), name, std::to_string(m_ranks.size()));
1634}
@ GE_RANK_UPDATED
Definition Guild.h:157
bool _IsLeader(Player *player) const
Definition Guild.cpp:2462

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

1404{
1405 Player* player = session->GetPlayer();
1406 if (!player)
1407 return;
1408
1409 Member const* member = GetMember(player->GetGUID());
1410 if (!member)
1411 return;
1412
1414 return;
1415
1416 if (tabId != _GetPurchasedTabsSize())
1417 return;
1418
1419 uint32 tabCost = _GetGuildBankTabPrice(tabId);
1420 if (!tabCost)
1421 return;
1422
1423 if (!player->HasEnoughMoney(tabCost)) // Should not happen, this is checked by client
1424 return;
1425
1426 player->ModifyMoney(-int32(tabCost));
1427
1430 SendPermissions(session);
1431}
uint32 _GetGuildBankTabPrice(uint8 tabId)
Definition Guild.cpp:93
@ GE_BANK_TAB_PURCHASED
Definition Guild.h:162
void SendPermissions(WorldSession *session)
Definition Guild.cpp:1841
bool ModifyMoney(int32 amount, bool sendError=true)
Definition Player.cpp:11472
bool HasEnoughMoney(uint32 amount) const
Definition Player.h:1601

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)
1762{
1763 // Only leader can disband guild
1764 if (_IsLeader(session->GetPlayer()))
1765 {
1766 Disband();
1767 LOG_DEBUG("guild", "Guild Successfully Disbanded");
1768 delete this;
1769 }
1770}

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

◆ HandleInviteMember()

void Guild::HandleInviteMember ( WorldSession session,
std::string const &  name 
)
1434{
1435 Player* pInvitee = ObjectAccessor::FindPlayerByName(name, false);
1436 if (!pInvitee)
1437 {
1439 return;
1440 }
1441
1442 Player* player = session->GetPlayer();
1443 // Do not show invitations from ignored players
1444 if (pInvitee->GetSocial()->HasIgnore(player->GetGUID()))
1445 return;
1446
1447 uint32 memberLimit = sWorld->getIntConfig(CONFIG_GUILD_MEMBER_LIMIT);
1448 if (memberLimit > 0 && player->GetGuild()->GetMemberCount() >= memberLimit)
1449 {
1450 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);
1452 return;
1453 }
1454
1455 if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && pInvitee->GetTeamId(true) != player->GetTeamId(true))
1456 {
1458 return;
1459 }
1460 // Invited player cannot be in another guild
1461 if (pInvitee->GetGuildId())
1462 {
1464 return;
1465 }
1466 // Invited player cannot be invited
1467 if (pInvitee->GetGuildIdInvited())
1468 {
1470 return;
1471 }
1472 // Inviting player must have rights to invite
1473 if (!_HasRankRight(player, GR_RIGHT_INVITE))
1474 {
1476 return;
1477 }
1478
1480
1481 LOG_DEBUG("guild", "Player {} invited {} to join his Guild", player->GetName(), pInvitee->GetName());
1482
1483 pInvitee->SetGuildIdInvited(m_id);
1484 _LogEvent(GUILD_EVENT_LOG_INVITE_PLAYER, player->GetGUID(), pInvitee->GetGUID());
1485
1487
1488 invite.InviterName = player->GetName();
1489 invite.GuildName = GetName();
1490
1491 pInvitee->SendDirectMessage(invite.Write());
1492 LOG_DEBUG("guild", "SMSG_GUILD_INVITE [{}]", pInvitee->GetName());
1493}
@ 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:369
Definition Chat.h:37
void PSendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition Chat.cpp:211
uint32 GetMemberCount() const
Definition Guild.h:771
static void SendCommandResult(WorldSession *session, GuildCommandType type, GuildCommandError errCode, std::string_view param={})
Definition Guild.cpp:114
bool HasIgnore(ObjectGuid const &ignore_guid) const
Definition SocialMgr.cpp:193
uint32 GetGuildIdInvited()
Definition Player.h:1893
Guild * GetGuild() const
Definition Player.cpp:15986
PlayerSocial * GetSocial()
Definition Player.h:1138
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)
1507{
1508 Player* player = session->GetPlayer();
1509 bool disband = false;
1510
1511 // If leader is leaving
1512 if (_IsLeader(player))
1513 {
1514 if (m_members.size() > 1)
1515 // Leader cannot leave if he is not the last member
1517 else
1518 {
1519 // Guild is disbanded if leader leaves.
1520 Disband();
1521 disband = true;
1522 }
1523 }
1524 else
1525 {
1526 DeleteMember(player->GetGUID(), false, false);
1527
1529 _BroadcastEvent(GE_LEFT, player->GetGUID(), player->GetName());
1530
1532 }
1533
1534 sCalendarMgr->RemovePlayerGuildEventsAndSignups(player->GetGUID(), GetId());
1535
1536 if (disband)
1537 delete this;
1538}
#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 
)
1665{
1666 Player* player = session->GetPlayer();
1667
1668 // Call script after validation and before money transfer.
1669 sScriptMgr->OnGuildMemberDepositMoney(this, player, amount);
1670
1671 if (m_bankMoney > GUILD_BANK_MONEY_LIMIT - amount)
1672 {
1674 return;
1675 }
1676
1677 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1678 _ModifyBankMoney(trans, amount, true);
1679
1680 player->ModifyMoney(-int32(amount));
1681 player->SaveGoldToDB(trans);
1682 _LogBankEvent(trans, GUILD_BANK_LOG_DEPOSIT_MONEY, uint8(0), player->GetGUID(), amount);
1683
1684 CharacterDatabase.CommitTransaction(trans);
1685
1686 std::string aux = Acore::Impl::ByteArrayToHexStr(reinterpret_cast<uint8*>(&m_bankMoney), 8, true);
1688
1689 if (amount > 10 * GOLD) // receiver_acc = Guild id, receiver_name = Guild name
1690 CharacterDatabase.Execute("INSERT INTO log_money VALUES({}, {}, \"{}\", \"{}\", {}, \"{}\", {}, \"(guild members: {}, new amount: {}, leader guid low: {}, sender level: {})\", NOW(), {})",
1691 session->GetAccountId(), player->GetGUID().GetCounter(), player->GetName(), session->GetRemoteAddress(), GetId(), GetName(), amount, GetMemberCount(), GetTotalBankMoney(), GetLeaderGUID().GetCounter(), player->GetLevel(), 3);
1692}
@ 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
@ GOLD
Definition SharedDefines.h:264
bool _ModifyBankMoney(CharacterDatabaseTransaction trans, uint64 amount, bool add)
Definition Guild.cpp:2480
void _LogBankEvent(CharacterDatabaseTransaction trans, GuildBankEventLogTypes eventType, uint8 tabId, ObjectGuid playerGuid, uint32 itemOrMoney, uint16 itemStackCount=0, uint8 destTabId=0)
Definition Guild.cpp:2624
uint64 GetTotalBankMoney() const
Definition Guild.h:770
void SaveGoldToDB(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7131
uint8 GetLevel() const
Definition Unit.h:1088
uint32 GetAccountId() const
Definition WorldSession.h:434
std::string const & GetRemoteAddress()
Definition WorldSession.h:444
AC_COMMON_API std::string ByteArrayToHexStr(uint8 const *bytes, std::size_t length, bool reverse=false)
Definition Util.cpp:545

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, m_bankMoney, Player::ModifyMoney(), Player::SaveGoldToDB(), SendCommandResult(), and sScriptMgr.

◆ HandleMemberLogout()

void Guild::HandleMemberLogout ( WorldSession session)
1750{
1751 Player* player = session->GetPlayer();
1752 if (Member* member = GetMember(player->GetGUID()))
1753 {
1754 member->SetStats(player);
1755 member->UpdateLogoutTime();
1756 member->ResetFlags();
1757 }
1758 _BroadcastEvent(GE_SIGNED_OFF, player->GetGUID(), player->GetName());
1759}
@ 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 
)
1695{
1696 //clamp amount to MAX_MONEY_AMOUNT, Players can't hold more than that anyway
1697 amount = std::min(amount, uint32(MAX_MONEY_AMOUNT));
1698
1699 if (m_bankMoney < amount) // Not enough money in bank
1700 return false;
1701
1702 Player* player = session->GetPlayer();
1703
1704 Member* member = GetMember(player->GetGUID());
1705 if (!member)
1706 return false;
1707
1708 if (uint32(_GetMemberRemainingMoney(*member)) < amount) // Check if we have enough slot/money today
1709 return false;
1710
1711 if (!(_GetRankRights(member->GetRankId()) & GR_RIGHT_WITHDRAW_REPAIR) && repair)
1712 return false;
1713
1714 // Call script after validation and before money transfer.
1715 sScriptMgr->OnGuildMemberWitdrawMoney(this, player, amount, repair);
1716
1717 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1718
1719 if (!_ModifyBankMoney(trans, amount, false))
1720 return false;
1721
1722 if (!repair)
1723 {
1724 if (!player->ModifyMoney(amount))
1725 {
1726 _ModifyBankMoney(trans, amount, true);
1727 return false;
1728 }
1729
1730 player->SaveGoldToDB(trans);
1731 }
1732
1733 // Update remaining money amount
1734 member->UpdateBankWithdrawValue(trans, GUILD_BANK_MAX_TABS, amount);
1735
1736 // Log guild bank event
1737 _LogBankEvent(trans, repair ? GUILD_BANK_LOG_REPAIR_MONEY : GUILD_BANK_LOG_WITHDRAW_MONEY, uint8(0), player->GetGUID(), amount);
1738 CharacterDatabase.CommitTransaction(trans);
1739
1740 if (amount > 10 * GOLD) // sender_acc = 0 (guild has no account), sender_guid = Guild id, sender_name = Guild name
1741 CharacterDatabase.Execute("INSERT INTO log_money VALUES({}, {}, \"{}\", \"{}\", {}, \"{}\", {}, \"(guild, members: {}, new amount: {}, leader guid low: {}, withdrawer level: {})\", NOW(), {})",
1742 0, GetId(), GetName(), session->GetRemoteAddress(), session->GetAccountId(), player->GetName(), amount, GetMemberCount(), GetTotalBankMoney(), GetLeaderGUID().GetCounter(), player->GetLevel(), 4);
1743
1744 std::string aux = Acore::Impl::ByteArrayToHexStr(reinterpret_cast<uint8*>(&m_bankMoney), 8, true);
1746 return true;
1747}
@ 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:917
int32 _GetMemberRemainingMoney(Member const &member) const
Definition Guild.cpp:2575

References _BroadcastEvent(), _GetMemberRemainingMoney(), _GetRankRights(), _LogBankEvent(), _ModifyBankMoney(), Acore::Impl::ByteArrayToHexStr(), CharacterDatabase, ObjectGuid::Empty, GE_BANK_MONEY_SET, WorldSession::GetAccountId(), ObjectGuid::GetCounter(), 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, m_bankMoney, MAX_MONEY_AMOUNT, Player::ModifyMoney(), Player::SaveGoldToDB(), sScriptMgr, and Guild::Member::UpdateBankWithdrawValue().

Referenced by Player::DurabilityRepair().

◆ HandleQuery()

void Guild::HandleQuery ( WorldSession session)
1251{
1253 response.GuildId = m_id;
1254
1260
1261 for (uint8 i = 0; i < _GetRanksSize(); ++i)
1262 response.Info.Ranks[i] = m_ranks[i].GetName();
1263
1264 response.Info.RankCount = _GetRanksSize();
1265
1266 response.Info.GuildName = m_name;
1267
1268 session->SendPacket(response.Write());
1269 LOG_DEBUG("guild", "SMSG_GUILD_QUERY_RESPONSE [{}]", session->GetPlayerInfo());
1270}
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)
1637{
1639}
void HandleRemoveRank(WorldSession *session, uint8 rankId)
Definition Guild.cpp:1641

References _GetLowestRankId(), and HandleRemoveRank().

◆ HandleRemoveMember()

void Guild::HandleRemoveMember ( WorldSession session,
std::string_view  name 
)
1541{
1542 Player* player = session->GetPlayer();
1543 // Player must have rights to remove members
1544 if (!_HasRankRight(player, GR_RIGHT_REMOVE))
1546 else if (Member* member = GetMember(name))
1547 {
1548 // Guild masters cannot be removed
1549 if (member->IsRank(GR_GUILDMASTER))
1551 // Do not allow to remove player with the same rank or higher
1552 else
1553 {
1554 Member const* memberMe = GetMember(player->GetGUID());
1555 if (!memberMe || member->IsRankNotLower(memberMe->GetRankId()))
1557 else
1558 {
1559 // Copy values since everything will be deleted in DeleteMember().
1560 ObjectGuid guid = member->GetGUID();
1561 std::string memberName = member->GetName();
1562
1563 // After call to DeleteMember pointer to member becomes invalid
1564 DeleteMember(guid, false, true);
1566 _BroadcastEvent(GE_REMOVED, ObjectGuid::Empty, memberName, player->GetName());
1567 }
1568 }
1569 }
1570}
@ 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 
)
1642{
1643 // Cannot remove rank if total count is minimum allowed by the client or is not leader
1644 if (_GetRanksSize() <= GUILD_RANKS_MIN_COUNT || rankId >= _GetRanksSize() || !_IsLeader(session->GetPlayer()))
1645 return;
1646
1647 // Delete bank rights for rank
1649 stmt->SetData(0, m_id);
1650 stmt->SetData(1, rankId);
1651 CharacterDatabase.Execute(stmt);
1652 // Delete rank
1653 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_LOWEST_RANK);
1654 stmt->SetData(0, m_id);
1655 stmt->SetData(1, rankId);
1656 CharacterDatabase.Execute(stmt);
1657
1658 // match what the sql statement does
1659 m_ranks.erase(m_ranks.begin() + rankId, m_ranks.end());
1660
1661 _BroadcastEvent(GE_RANK_DELETED, ObjectGuid::Empty, std::to_string(m_ranks.size()));
1662}
@ 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)
1204{
1206
1207 roster.RankData.reserve(m_ranks.size());
1208 for (RankInfo const& rank : m_ranks)
1209 {
1210 WorldPackets::Guild::GuildRankData& rankData = roster.RankData.emplace_back();
1211
1212 rankData.Flags = rank.GetRights();
1213 rankData.WithdrawGoldLimit = rank.GetBankMoneyPerDay();
1214 for (uint8 i = 0; i < GUILD_BANK_MAX_TABS; ++i)
1215 {
1216 rankData.TabFlags[i] = rank.GetBankTabRights(i);
1217 rankData.TabWithdrawItemLimit[i] = rank.GetBankTabSlotsPerDay(i);
1218 }
1219 }
1220
1221 bool sendOfficerNote = _HasRankRight(session->GetPlayer(), GR_RIGHT_VIEWOFFNOTE);
1222 roster.MemberData.reserve(m_members.size());
1223 for (auto const& [guid, member] : m_members)
1224 {
1225 WorldPackets::Guild::GuildRosterMemberData& memberData = roster.MemberData.emplace_back();
1226
1227 memberData.Guid = member.GetGUID();
1228 memberData.RankID = int32(member.GetRankId());
1229 memberData.AreaID = int32(member.GetZoneId());
1230 memberData.LastSave = float(float(GameTime::GetGameTime().count() - member.GetLogoutTime()) / DAY);
1231
1232 memberData.Status = member.GetFlags();
1233 memberData.Level = member.GetLevel();
1234 memberData.ClassID = member.GetClass();
1235 memberData.Gender = member.GetGender();
1236
1237 memberData.Name = member.GetName();
1238 memberData.Note = member.GetPublicNote();
1239 if (sendOfficerNote)
1240 memberData.OfficerNote = member.GetOfficerNote();
1241 }
1242
1243 roster.WelcomeText = m_motd;
1244 roster.InfoText = m_info;
1245
1246 LOG_DEBUG("guild", "SMSG_GUILD_ROSTER [{}]", session->GetPlayerInfo());
1247 session->SendPacket(roster.Write());
1248}
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 
)
1354{
1355 BankTab* tab = GetBankTab(tabId);
1356 if (!tab)
1357 {
1358 LOG_ERROR("guild", "Guild::HandleSetBankTabInfo: Player {} trying to change bank tab info from unexisting tab {}.",
1359 session->GetPlayerInfo(), tabId);
1360 return;
1361 }
1362
1363 tab->SetInfo(name, icon);
1364 _BroadcastEvent(GE_BANK_TAB_UPDATED, ObjectGuid::Empty, std::to_string(tabId), tab->GetName(), tab->GetIcon());
1365}
@ 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 
)
1315{
1316 Player* player = session->GetPlayer();
1317 if (!_IsLeader(player))
1318 SendSaveEmblemResult(session, ERR_GUILDEMBLEM_NOTGUILDMASTER); // "Only guild leaders can create emblems."
1319 else if (!player->HasEnoughMoney(EMBLEM_PRICE))
1320 SendSaveEmblemResult(session, ERR_GUILDEMBLEM_NOTENOUGHMONEY); // "You can't afford to do that."
1321 else
1322 {
1323 player->ModifyMoney(-int32(EMBLEM_PRICE));
1324
1325 m_emblemInfo = emblemInfo;
1327
1328 SendSaveEmblemResult(session, ERR_GUILDEMBLEM_SUCCESS); // "Guild Emblem saved."
1329
1330 HandleQuery(session);
1331 }
1332}
#define EMBLEM_PRICE
Definition Guild.cpp:41
@ 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:701
void HandleQuery(WorldSession *session)
Definition Guild.cpp:1250
static void SendSaveEmblemResult(WorldSession *session, GuildEmblemError errCode)
Definition Guild.cpp:125

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 
)
1296{
1297 if (m_info == info)
1298 return;
1299
1300 // Player must have rights to set guild's info
1302 {
1303 m_info = info;
1304
1305 sScriptMgr->OnGuildInfoChanged(this, m_info);
1306
1308 stmt->SetData(0, m_info);
1309 stmt->SetData(1, m_id);
1310 CharacterDatabase.Execute(stmt);
1311 }
1312}
@ 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 
)
1335{
1336 Player* player = session->GetPlayer();
1337 // Only leader can assign new leader
1338 if (!_IsLeader(player))
1340 // Old leader must be a member of guild
1341 else if (Member* pOldLeader = GetMember(player->GetGUID()))
1342 {
1343 // New leader must be a member of guild
1344 if (Member* pNewLeader = GetMember(name))
1345 {
1346 _SetLeaderGUID(*pNewLeader);
1347 pOldLeader->ChangeRank(GR_OFFICER);
1348 _BroadcastEvent(GE_LEADER_CHANGED, ObjectGuid::Empty, player->GetName(), pNewLeader->GetName());
1349 }
1350 }
1351}
@ 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 
)
1368{
1369 // Player must have rights to set public/officer note
1370 if (!_HasRankRight(session->GetPlayer(), isPublic ? GR_RIGHT_EPNOTE : GR_RIGHT_EOFFNOTE))
1372 else if (Member* member = GetMember(name))
1373 {
1374 if (isPublic)
1375 member->SetPublicNote(note);
1376 else
1377 member->SetOfficerNote(note);
1378
1379 HandleRoster(session);
1380 }
1381}
@ 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:1203

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 
)
1273{
1274 if (m_motd == motd)
1275 return;
1276
1277 // Player must have rights to set MOTD
1278 if (!_HasRankRight(session->GetPlayer(), GR_RIGHT_SETMOTD))
1280 else
1281 {
1282 m_motd = motd;
1283
1284 sScriptMgr->OnGuildMOTDChanged(this, m_motd);
1285
1287 stmt->SetData(0, m_motd);
1288 stmt->SetData(1, m_id);
1289 CharacterDatabase.Execute(stmt);
1290
1292 }
1293}
@ 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 
)
1384{
1385 // Only leader can modify ranks
1386 if (!_IsLeader(session->GetPlayer()))
1388 else if (RankInfo* rankInfo = GetRankInfo(rankId))
1389 {
1390 rankInfo->SetName(name);
1391 rankInfo->SetRights(rights);
1392 _SetRankBankMoneyPerDay(rankId, moneyPerDay);
1393
1394 for (auto& rightsAndSlot : rightsAndSlots)
1395 _SetRankBankTabRightsAndSlots(rankId, rightsAndSlot);
1396
1397 _BroadcastEvent(GE_RANK_UPDATED, ObjectGuid::Empty, std::to_string(rankId), rankInfo->GetName(), std::to_string(m_ranks.size()));
1398
1399 LOG_DEBUG("guild", "Changed RankName to '{}', rights to 0x{:08X}", rankInfo->GetName(), rights);
1400 }
1401}
@ GUILD_COMMAND_CHANGE_RANK
Definition Guild.h:110
void _SetRankBankTabRightsAndSlots(uint8 rankId, GuildBankRightsAndSlots rightsAndSlots, bool saveToDB=true)
Definition Guild.cpp:2516
void _SetRankBankMoneyPerDay(uint8 rankId, uint32 moneyPerDay)
Definition Guild.cpp:2510

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

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)
1988{
1989 uint8 dbTabId = fields[1].Get<uint8>();
1990 bool isMoneyTab = (dbTabId == GUILD_BANK_MONEY_LOGS_TAB);
1991 if (dbTabId < _GetPurchasedTabsSize() || isMoneyTab)
1992 {
1993 uint8 tabId = isMoneyTab ? uint8(GUILD_BANK_MAX_TABS) : dbTabId;
1994 LogHolder<BankEventLogEntry>& bankLog = m_bankEventLog[tabId];
1995 if (bankLog.CanInsert())
1996 {
1997 ObjectGuid::LowType guid = fields[2].Get<uint32>();
1998 GuildBankEventLogTypes eventType = GuildBankEventLogTypes(fields[3].Get<uint8>());
1999 if (BankEventLogEntry::IsMoneyEvent(eventType))
2000 {
2001 if (!isMoneyTab)
2002 {
2003 LOG_ERROR("guild", "GuildBankEventLog ERROR: MoneyEvent(LogGuid: {}, Guild: {}) does not belong to money tab ({}), ignoring...", guid, m_id, dbTabId);
2004 return false;
2005 }
2006 }
2007 else if (isMoneyTab)
2008 {
2009 LOG_ERROR("guild", "GuildBankEventLog ERROR: non-money event (LogGuid: {}, Guild: {}) belongs to money tab, ignoring...", guid, m_id);
2010 return false;
2011 }
2012 bankLog.LoadEvent(
2013 m_id, // guild id
2014 guid, // guid
2015 time_t(fields[8].Get<uint32>()), // timestamp
2016 dbTabId, // tab id
2017 eventType, // event type
2018 ObjectGuid::Create<HighGuid::Player>(fields[4].Get<uint32>()), // player guid
2019 fields[5].Get<uint32>(), // item or money
2020 fields[6].Get<uint16>(), // itam stack count
2021 fields[7].Get<uint8>()); // dest tab id
2022 }
2023 }
2024 return true;
2025}
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)
2037{
2038 uint8 tabId = fields[12].Get<uint8>();
2039 if (tabId >= _GetPurchasedTabsSize())
2040 {
2041 LOG_ERROR("guild", "Invalid tab for item (GUID: {}, id: #{}) in guild bank, skipped.",
2042 fields[14].Get<uint32>(), fields[15].Get<uint32>());
2043 return false;
2044 }
2045 return m_bankTabs[tabId].LoadItemFromDB(fields);
2046}

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

◆ LoadBankRightFromDB()

void Guild::LoadBankRightFromDB ( Field fields)
1963{
1964 // tabId rights slots
1965 GuildBankRightsAndSlots rightsAndSlots(fields[1].Get<uint8>(), fields[3].Get<uint8>(), fields[4].Get<uint32>());
1966 // rankId
1967 _SetRankBankTabRightsAndSlots(fields[2].Get<uint8>(), rightsAndSlots, false);
1968}
Definition Guild.h:263

References _SetRankBankTabRightsAndSlots().

◆ LoadBankTabFromDB()

void Guild::LoadBankTabFromDB ( Field fields)
2028{
2029 uint8 tabId = fields[1].Get<uint8>();
2030 if (tabId >= _GetPurchasedTabsSize())
2031 LOG_ERROR("guild", "Invalid tab (tabId: {}) in guild bank, skipped.", tabId);
2032 else
2033 m_bankTabs[tabId].LoadFromDB(fields);
2034}

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

◆ LoadEventLogFromDB()

bool Guild::LoadEventLogFromDB ( Field fields)
1971{
1972 if (m_eventLog.CanInsert())
1973 {
1974 m_eventLog.LoadEvent(
1975 m_id, // guild id
1976 fields[1].Get<uint32>(), // guid
1977 time_t(fields[6].Get<uint32>()), // timestamp
1978 GuildEventLogTypes(fields[2].Get<uint8>()), // event type
1979 ObjectGuid::Create<HighGuid::Player>(fields[3].Get<uint32>()), // player guid 1
1980 ObjectGuid::Create<HighGuid::Player>(fields[4].Get<uint32>()), // player guid 2
1981 fields[5].Get<uint8>()); // rank
1982 return true;
1983 }
1984 return false;
1985}
GuildEventLogTypes
Definition Guild.h:209

References m_eventLog, and m_id.

◆ LoadFromDB()

bool Guild::LoadFromDB ( Field fields)
1908{
1909 m_id = fields[0].Get<uint32>();
1910 m_name = fields[1].Get<std::string>();
1911 m_leaderGuid = ObjectGuid::Create<HighGuid::Player>(fields[2].Get<uint32>());
1912 m_emblemInfo.LoadFromDB(fields);
1913 m_info = fields[8].Get<std::string>();
1914 m_motd = fields[9].Get<std::string>();
1915 m_createdDate = time_t(fields[10].Get<uint32>());
1916 m_bankMoney = fields[11].Get<uint64>();
1917
1918 uint8 purchasedTabs = uint8(fields[12].Get<uint64>());
1919 if (purchasedTabs > GUILD_BANK_MAX_TABS)
1920 purchasedTabs = GUILD_BANK_MAX_TABS;
1921
1922 m_bankTabs.clear();
1923 m_bankTabs.reserve(purchasedTabs);
1924 for (uint8 i = 0; i < purchasedTabs; ++i)
1925 m_bankTabs.emplace_back(m_id, i);
1926 return true;
1927}
std::uint64_t uint64
Definition Define.h:106
void LoadFromDB(Field *fields)
Definition Guild.cpp:692

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)
1939{
1940 ObjectGuid::LowType lowguid = fields[1].Get<uint32>();
1941 ObjectGuid playerGuid(HighGuid::Player, lowguid);
1942
1943 auto [memberIt, isNew] = m_members.try_emplace(lowguid, m_id, playerGuid, fields[2].Get<uint8>());
1944 if (!isNew)
1945 {
1946 LOG_ERROR("guild", "Tried to add {} to guild '{}'. Member already exists.", playerGuid.ToString(), m_name);
1947 return false;
1948 }
1949
1950 Member& member = memberIt->second;
1951 if (!member.LoadFromDB(fields))
1952 {
1953 _DeleteMemberFromDB(lowguid);
1954 m_members.erase(memberIt);
1955 return false;
1956 }
1957
1958 sCharacterCache->UpdateCharacterGuildId(playerGuid, GetId());
1959 return true;
1960}

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)
1930{
1931 RankInfo rankInfo(m_id);
1932
1933 rankInfo.LoadFromDB(fields);
1934
1935 m_ranks.push_back(rankInfo);
1936}

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

◆ MassInviteToEvent()

void Guild::MassInviteToEvent ( WorldSession session,
uint32  minLevel,
uint32  maxLevel,
uint32  minRank 
)
2150{
2151 uint32 count = 0;
2152
2154 data << uint32(count); // count placeholder
2155
2156 for (auto const& [guid, member] : m_members)
2157 {
2158 // not sure if needed, maybe client checks it as well
2159 if (count >= CALENDAR_MAX_INVITES)
2160 {
2161 if (Player* player = session->GetPlayer())
2162 sCalendarMgr->SendCalendarCommandResult(player->GetGUID(), CALENDAR_ERROR_INVITES_EXCEEDED);
2163 return;
2164 }
2165
2166 uint32 level = sCharacterCache->GetCharacterLevelByGuid(member.GetGUID());
2167
2168 if (member.GetGUID() != session->GetPlayer()->GetGUID() && level >= minLevel && level <= maxLevel && member.IsRankNotLower(minRank))
2169 {
2170 data.appendPackGUID(member.GetGUID().GetRawValue());
2171 data << uint8(0); // unk
2172 ++count;
2173 }
2174 }
2175
2176 data.put<uint32>(0, count);
2177
2178 session->SendPacket(&data);
2179}
@ 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 
)
1179{
1180 if (Member* member = GetMember(player->GetGUID()))
1181 {
1182 if (state)
1183 member->AddFlag(flag);
1184 else member->RemFlag(flag);
1185 }
1186}

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

◆ ResetTimes()

void Guild::ResetTimes ( )
2937{
2938 for (auto& [guid, member] : m_members)
2939 member.ResetValues();
2940
2942}
@ 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
1800{
1801 // GUILD_BANK_MAX_TABS send by client for money log
1802 if (tabId < _GetPurchasedTabsSize() || tabId == GUILD_BANK_MAX_TABS)
1803 {
1804 std::list<BankEventLogEntry> const& bankEventLog = m_bankEventLog[tabId].GetGuildLog();
1805
1807 packet.Tab = tabId;
1808
1809 packet.Entry.reserve(bankEventLog.size());
1810 for (BankEventLogEntry const& entry : bankEventLog)
1811 entry.WritePacket(packet);
1812
1813 session->SendPacket(packet.Write());
1814 LOG_DEBUG("guild", "MSG_GUILD_BANK_LOG_QUERY [{}]", session->GetPlayerInfo());
1815 }
1816}
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
1819{
1820 if (tabId < _GetPurchasedTabsSize())
1821 _SendBankContent(session, tabId, sendAllSlots);
1822}
void _SendBankContent(WorldSession *session, uint8 tabId, bool sendAllSlots) const
Definition Guild.cpp:2755

References _GetPurchasedTabsSize(), and _SendBankContent().

◆ SendBankTabsInfo()

void Guild::SendBankTabsInfo ( WorldSession session,
bool  showTabs = false 
)
1825{
1826 Member* member = GetMember(session->GetPlayer()->GetGUID());
1827 if (!member)
1828 return;
1829
1830 member->SubscribeToGuildBankUpdatePackets();
1831
1832 _SendBankList(session, 0, sendAllSlots);
1833}

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

Referenced by WorldSession::HandleGuildBankerActivate().

◆ SendBankTabText()

void Guild::SendBankTabText ( WorldSession session,
uint8  tabId 
) const
1836{
1837 if (BankTab const* tab = GetBankTab(tabId))
1838 tab->SendText(this, session);
1839}

References GetBankTab().

◆ SendCommandResult()

void Guild::SendCommandResult ( WorldSession session,
GuildCommandType  type,
GuildCommandError  errCode,
std::string_view  param = {} 
)
static
115{
117 resultPacket.Command = type;
118 resultPacket.Result = errCode;
119 resultPacket.Name = param;
120 session->SendPacket(resultPacket.Write());
121
122 LOG_DEBUG("guild", "SMSG_GUILD_COMMAND_RESULT [{}]: Type: {}, code: {}, param: {}", session->GetPlayerInfo(), type, errCode, resultPacket.Name);
123}
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
1786{
1787 std::list<EventLogEntry> const& eventLog = m_eventLog.GetGuildLog();
1788
1790 packet.Entry.reserve(eventLog.size());
1791
1792 for (EventLogEntry const& entry : eventLog)
1793 entry.WritePacket(packet);
1794
1795 session->SendPacket(packet.Write());
1796 LOG_DEBUG("guild", "MSG_GUILD_EVENT_LOG_QUERY [{}]", session->GetPlayerInfo());
1797}
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)
1886{
1888 motd.Type = GE_MOTD;
1889 motd.Params.emplace_back(m_motd);
1890 session->SendPacket(motd.Write());
1891
1892 LOG_DEBUG("guild", "SMSG_GUILD_EVENT [{}] MOTD", session->GetPlayerInfo());
1893
1894 Player* player = session->GetPlayer();
1895
1896 HandleRoster(session);
1897 _BroadcastEvent(GE_SIGNED_ON, player->GetGUID(), player->GetName());
1898
1899 if (Member* member = GetMember(player->GetGUID()))
1900 {
1901 member->SetStats(player);
1902 member->AddFlag(GUILDMEMBER_STATUS_ONLINE);
1903 }
1904}
@ 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
1871{
1872 Member const* member = GetMember(session->GetPlayer()->GetGUID());
1873 if (!member)
1874 return;
1875
1876 int32 amount = _GetMemberRemainingMoney(*member);
1877
1879 packet.RemainingWithdrawMoney = amount;
1880 session->SendPacket(packet.Write());
1881
1882 LOG_DEBUG("guild", "MSG_GUILD_BANK_MONEY_WITHDRAWN [{}] Money: {}", session->GetPlayerInfo(), amount);
1883}
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)
1842{
1843 Member* member = GetMember(session->GetPlayer()->GetGUID());
1844 if (!member)
1845 return;
1846
1847 // We are unsubscribing here since it is the only reliable way to handle /reload from player as
1848 // GuildPermissionsQuery is sent on each reload, and we don't want to send partial changes while client
1849 // doesn't know the full state
1850 member->UnsubscribeFromGuildBankUpdatePackets();
1851
1852 uint8 rankId = member->GetRankId();
1853
1855 queryResult.RankID = rankId;
1856 queryResult.WithdrawGoldLimit = _GetRankBankMoneyPerDay(rankId);
1857 queryResult.Flags = _GetRankRights(rankId);
1858 queryResult.NumTabs = _GetPurchasedTabsSize();
1859
1860 for (uint8 tabId = 0; tabId < GUILD_BANK_MAX_TABS; ++tabId)
1861 {
1862 queryResult.Tab[tabId].Flags = _GetRankBankTabRights(rankId, tabId);
1863 queryResult.Tab[tabId].WithdrawItemLimit = _GetMemberRemainingSlots(*member, tabId);
1864 }
1865
1866 session->SendPacket(queryResult.Write());
1867 LOG_DEBUG("guild", "MSG_GUILD_PERMISSIONS [{}] Rank: {}", session->GetPlayerInfo(), rankId);
1868}
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
126{
128 saveResponse.Error = int32(errCode);
129 session->SendPacket(saveResponse.Write());
130
131 LOG_DEBUG("guild", "MSG_SAVE_GUILD_EMBLEM [{}] Code: {}", session->GetPlayerInfo(), errCode);
132}
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 
)
2379{
2380 if (BankTab* pTab = GetBankTab(tabId))
2381 {
2382 pTab->SetText(text);
2383 pTab->SendText(this, nullptr);
2384 }
2385}

References GetBankTab().

◆ SetName()

bool Guild::SetName ( std::string_view const &  name)
1189{
1190 if (m_name == name || name.empty() || name.length() > 24 || !ObjectMgr::IsValidCharterName(name))
1191 {
1192 return false;
1193 }
1194
1195 m_name = name;
1197 stmt->SetData(0, m_name);
1198 stmt->SetData(1, GetId());
1199 CharacterDatabase.Execute(stmt);
1200 return true;
1201}
@ CHAR_UPD_GUILD_NAME
Definition CharacterDatabase.h:142
static bool IsValidCharterName(std::string_view name)
Definition ObjectMgr.cpp:9004

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 
)
2351{
2352 if (tabId >= _GetPurchasedTabsSize() || slotId >= GUILD_BANK_MAX_SLOTS ||
2353 destTabId >= _GetPurchasedTabsSize() || destSlotId >= GUILD_BANK_MAX_SLOTS)
2354 return;
2355
2356 if (tabId == destTabId && slotId == destSlotId)
2357 return;
2358
2359 BankMoveItemData from(this, player, tabId, slotId);
2360 BankMoveItemData to(this, player, destTabId, destSlotId);
2361 _MoveItems(&from, &to, splitedAmount);
2362}
void _MoveItems(MoveItemData *pSrc, MoveItemData *pDest, uint32 splitedAmount)
Definition Guild.cpp:2658

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 
)
2365{
2366 if ((slotId >= GUILD_BANK_MAX_SLOTS && slotId != NULL_SLOT) || tabId >= _GetPurchasedTabsSize())
2367 return;
2368
2369 BankMoveItemData bankData(this, player, tabId, slotId);
2370 PlayerMoveItemData charData(this, player, playerBag, playerSlotId);
2371 if (toChar)
2372 _MoveItems(&bankData, &charData, splitedAmount);
2373 else
2374 _MoveItems(&charData, &bankData, splitedAmount);
2375}
@ 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 
)
1159{
1160 if (Member* member = GetMember(player->GetGUID()))
1161 {
1162 switch (dataid)
1163 {
1165 member->SetZoneID(value);
1166 break;
1168 member->SetLevel(value);
1169 break;
1170 default:
1171 LOG_ERROR("guild", "Guild::UpdateMemberData: Called with incorrect DATAID {} (value {})", dataid, value);
1172 return;
1173 }
1174 //HandleRoster();
1175 }
1176}
@ 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 ( )
2050{
2051 // Validate ranks data
2052 // GUILD RANKS represent a sequence starting from 0 = GUILD_MASTER (ALL PRIVILEGES) to max 9 (lowest privileges).
2053 // The lower rank id is considered higher rank - so promotion does rank-- and demotion does rank++
2054 // Between ranks in sequence cannot be gaps - so 0, 1, 2, 4 is impossible
2055 // Min ranks count is 5 and max is 10.
2056 bool broken_ranks = false;
2057 uint8 ranks = _GetRanksSize();
2058 if (ranks < GUILD_RANKS_MIN_COUNT || ranks > GUILD_RANKS_MAX_COUNT)
2059 {
2060 LOG_ERROR("guild", "Guild {} has invalid number of ranks, creating new...", m_id);
2061 broken_ranks = true;
2062 }
2063 else
2064 {
2065 for (uint8 rankId = 0; rankId < ranks; ++rankId)
2066 {
2067 RankInfo* rankInfo = GetRankInfo(rankId);
2068 if (rankInfo->GetId() != rankId)
2069 {
2070 LOG_ERROR("guild", "Guild {} has broken rank id {}, creating default set of ranks...", m_id, rankId);
2071 broken_ranks = true;
2072 }
2073 else
2074 {
2075 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2076 rankInfo->CreateMissingTabsIfNeeded(_GetPurchasedTabsSize(), trans, true);
2077 CharacterDatabase.CommitTransaction(trans);
2078 }
2079 }
2080 }
2081
2082 if (broken_ranks)
2083 {
2084 m_ranks.clear();
2086 }
2087
2088 // Validate members' data
2089 for (auto& [guid, member] : m_members)
2090 if (member.GetRankId() > _GetRanksSize())
2091 member.ChangeRank(_GetLowestRankId());
2092
2093 // Repair the structure of the guild.
2094 // If the guildmaster doesn't exist or isn't member of the guild
2095 // attempt to promote another member.
2096 Member* pLeader = GetMember(m_leaderGuid);
2097 if (!pLeader)
2098 {
2100 // If no more members left, disband guild
2101 if (m_members.empty())
2102 {
2103 Disband();
2104 return false;
2105 }
2106 }
2107 else if (!pLeader->IsRank(GR_GUILDMASTER))
2108 _SetLeaderGUID(*pLeader);
2109
2110 // Check config if multiple guildmasters are allowed
2111 if (!sConfigMgr->GetOption<bool>("Guild.AllowMultipleGuildMaster", 0))
2112 for (auto& [guid, member] : m_members)
2113 if ((member.GetRankId() == GR_GUILDMASTER) && !member.IsSamePlayer(m_leaderGuid))
2114 member.ChangeRank(GR_OFFICER);
2115
2117 return true;
2118}
#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: