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 officer)
 
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:2467

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
2804{
2806 event.Type = guildEvent;
2807 if (param1)
2808 event.Params.push_back(*param1);
2809
2810 if (param2)
2811 {
2812 event.Params.resize(2);
2813 event.Params[1] = *param2;
2814 }
2815
2816 if (param3)
2817 {
2818 event.Params.resize(3);
2819 event.Params[2] = *param3;
2820 }
2821 event.Guid = guid;
2822 BroadcastPacket(event.Write());
2823 LOG_DEBUG("guild", "SMSG_GUILD_EVENT [Broadcast] Event: {}", guildEvent);
2824}
#define LOG_DEBUG(filterType__,...)
Definition Log.h:169
void BroadcastPacket(WorldPacket const *packet) const
Definition Guild.cpp:2138
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
2409{
2411 stmt->SetData(0, m_id);
2412 CharacterDatabase.Execute(stmt);
2413
2414 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_RIGHTS);
2415 stmt->SetData(0, m_id);
2416 CharacterDatabase.Execute(stmt);
2417
2418 _CreateRank(sObjectMgr->GetAcoreString(LANG_GUILD_MASTER, loc), GR_RIGHT_ALL);
2419 _CreateRank(sObjectMgr->GetAcoreString(LANG_GUILD_OFFICER, loc), GR_RIGHT_ALL);
2423}
@ 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:749
@ LANG_GUILD_VETERAN
Definition Language.h:751
@ LANG_GUILD_OFFICER
Definition Language.h:750
@ LANG_GUILD_INITIATE
Definition Language.h:753
@ LANG_GUILD_MEMBER
Definition Language.h:752
#define sObjectMgr
Definition ObjectMgr.h:1636
bool _CreateRank(std::string_view name, uint32 rights)
Definition Guild.cpp:2425
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
2385{
2386 uint8 tabId = _GetPurchasedTabsSize(); // Next free id
2387 m_bankTabs.emplace_back(m_id, tabId);
2388
2389 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2390
2392 stmt->SetData(0, m_id);
2393 stmt->SetData (1, tabId);
2394 trans->Append(stmt);
2395
2396 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GUILD_BANK_TAB);
2397 stmt->SetData(0, m_id);
2398 stmt->SetData (1, tabId);
2399 trans->Append(stmt);
2400
2401 ++tabId;
2402 for (auto& m_rank : m_ranks)
2403 m_rank.CreateMissingTabsIfNeeded(tabId, trans, false);
2404
2405 CharacterDatabase.CommitTransaction(trans);
2406}
@ 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
2426{
2427 uint8 newRankId = _GetRanksSize();
2428 if (newRankId >= GUILD_RANKS_MAX_COUNT)
2429 return false;
2430
2431 // Ranks represent sequence 0, 1, 2, ... where 0 means guildmaster
2432 RankInfo info(m_id, newRankId, name, rights, 0);
2433 m_ranks.push_back(info);
2434
2435 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2436 info.CreateMissingTabsIfNeeded(_GetPurchasedTabsSize(), trans);
2437 info.SaveToDB(trans);
2438 CharacterDatabase.CommitTransaction(trans);
2439
2440 return true;
2441}
@ 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
2468{
2469 for (uint8 tabId = 0; tabId < _GetPurchasedTabsSize(); ++tabId)
2470 {
2471 m_bankTabs[tabId].Delete(trans, removeItemsFromDB);
2472 }
2473 m_bankTabs.clear();
2474}

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

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

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
2536{
2537 if (const RankInfo* rankInfo = GetRankInfo(rankId))
2538 return rankInfo->GetBankMoneyPerDay();
2539 return 0;
2540}
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
2551{
2552 if (const RankInfo* rankInfo = GetRankInfo(rankId))
2553 return rankInfo->GetBankTabRights(tabId);
2554 return 0;
2555}

References GetRankInfo().

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

◆ _GetRankBankTabSlotsPerDay()

int32 Guild::_GetRankBankTabSlotsPerDay ( uint8  rankId,
uint8  tabId 
) const
inlineprivate
2543{
2544 if (tabId < _GetPurchasedTabsSize())
2545 if (const RankInfo* rankInfo = GetRankInfo(rankId))
2546 return rankInfo->GetBankTabSlotsPerDay(tabId);
2547 return 0;
2548}

References _GetPurchasedTabsSize(), and GetRankInfo().

Referenced by _GetMemberRemainingSlots(), and _UpdateMemberWithdrawSlots().

◆ _GetRankName()

std::string Guild::_GetRankName ( uint8  rankId) const
inlineprivate
2522{
2523 if (const RankInfo* rankInfo = GetRankInfo(rankId))
2524 return rankInfo->GetName();
2525 return "<unknown>";
2526}

References GetRankInfo().

Referenced by HandleUpdateMemberRank().

◆ _GetRankRights()

uint32 Guild::_GetRankRights ( uint8  rankId) const
inlineprivate
2529{
2530 if (const RankInfo* rankInfo = GetRankInfo(rankId))
2531 return rankInfo->GetRights();
2532 return 0;
2533}

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

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

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

Referenced by _SendBankContent(), and _SendBankList().

◆ _ModifyBankMoney()

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

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
2649{
2650 if (BankTab* pTab = GetBankTab(tabId))
2651 pTab->SetItem(trans, slotId, nullptr);
2652}

References GetBankTab().

◆ _SendBankContent()

void Guild::_SendBankContent ( WorldSession session,
uint8  tabId,
bool  sendAllSlots 
) const
private
2752{
2753 ObjectGuid guid = session->GetPlayer()->GetGUID();
2755 return;
2756
2757 _SendBankList(session, tabId, sendAllSlots);
2758}
void _SendBankList(WorldSession *session=nullptr, uint8 tabId=0, bool sendFullSlots=false, SlotIds *slots=nullptr) const
Definition Guild.cpp:2826
bool _MemberHasTabRights(ObjectGuid guid, uint8 tabId, uint32 rights) const
Definition Guild.cpp:2597
Definition ObjectGuid.h:118
Player * GetPlayer() const
Definition WorldSession.h:376

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

References _SendBankList().

◆ _SendBankList()

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

References _SendBankList().

◆ _SetLeaderGUID()

void Guild::_SetLeaderGUID ( Member pLeader)
private
2496{
2497 m_leaderGuid = pLeader.GetGUID();
2498 pLeader.ChangeRank(GR_GUILDMASTER);
2499
2501 stmt->SetData(0, m_leaderGuid.GetCounter());
2502 stmt->SetData(1, m_id);
2503 CharacterDatabase.Execute(stmt);
2504}
@ 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
2507{
2508 if (RankInfo* rankInfo = GetRankInfo(rankId))
2509 rankInfo->SetBankMoneyPerDay(moneyPerDay);
2510}

References GetRankInfo().

Referenced by HandleSetRankInfo().

◆ _SetRankBankTabRightsAndSlots()

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

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

Referenced by HandleSetRankInfo(), and LoadBankRightFromDB().

◆ _UpdateAccountsNumber()

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

References m_accountsNumber, and m_members.

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

◆ _UpdateMemberWithdrawSlots()

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

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

◆ AddMember()

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

References m_members.

◆ BroadcastToGuild()

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

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 IWorld.h:406
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:2384
bool AddMember(ObjectGuid guid, uint8 rankId=GUILD_RANK_NONE)
Definition Guild.cpp:2178
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:2408
Player session in the World.
Definition WorldSession.h:330
LocaleConstant GetSessionDbLocaleIndex() const
Definition WorldSession.h:512
#define sWorld
Definition World.h:363
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 
)
2263{
2264 ObjectGuid::LowType lowguid = guid.GetCounter();
2266
2267 // Guild master can be deleted when loading guild and guid doesn't exist in characters table
2268 // or when he is removed from guild by gm command
2269 if (m_leaderGuid == guid && !isDisbanding)
2270 {
2271 Member* oldLeader = nullptr;
2272 Member* newLeader = nullptr;
2273 for (auto& [guid, member] : m_members)
2274 {
2275 if (guid == lowguid)
2276 oldLeader = &member;
2277 else if (!newLeader || newLeader->GetRankId() > member.GetRankId())
2278 newLeader = &member;
2279 }
2280
2281 if (!newLeader)
2282 {
2283 Disband();
2284 if (canDeleteGuild)
2285 delete this;
2286 return;
2287 }
2288
2289 _SetLeaderGUID(*newLeader);
2290
2291 // If player not online data in data field will be loaded from guild tabs no need to update it !!
2292 if (Player* newLeaderPlayer = newLeader->FindPlayer())
2293 newLeaderPlayer->SetRank(GR_GUILDMASTER);
2294
2295 // If leader does not exist (at guild loading with deleted leader) do not send broadcasts
2296 if (oldLeader)
2297 {
2298 _BroadcastEvent(GE_LEADER_CHANGED, ObjectGuid::Empty, oldLeader->GetName(), newLeader->GetName());
2299 _BroadcastEvent(GE_LEFT, guid, oldLeader->GetName());
2300 }
2301 }
2302 // Call script on remove before member is actually removed from guild (and database)
2303 sScriptMgr->OnGuildRemoveMember(this, player, isDisbanding, isKicked);
2304
2305 m_members.erase(lowguid);
2306
2307 // If player not online data in data field will be loaded from guild tabs no need to update it !!
2308 if (player)
2309 {
2310 player->SetInGuild(0);
2311 player->SetRank(0);
2312 }
2313 else
2314 {
2315 sCharacterCache->UpdateCharacterGuildId(guid, 0);
2316 }
2317
2319 if (!isDisbanding)
2321}
@ GE_LEFT
Definition Guild.h:151
@ GE_LEADER_CHANGED
Definition Guild.h:154
void _SetLeaderGUID(Member &pLeader)
Definition Guild.cpp:2495
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:2262

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 IWorld.h:74
ObjectGuid GetLeaderGUID() const
Definition Guild.h:687
TeamId GetTeamId(bool original=false) const
Definition Player.h:2116

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

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:1837
bool ModifyMoney(int32 amount, bool sendError=true)
Definition Player.cpp:11576
bool HasEnoughMoney(uint32 amount) const
Definition Player.h:1618

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

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 = sConfigMgr->GetOption<uint32>("Guild.MemberLimit", 0);
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}
#define sConfigMgr
Definition Config.h:74
@ 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
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 ignore_guid) const
Definition SocialMgr.cpp:193
uint32 GetGuildIdInvited()
Definition Player.h:1910
Guild * GetGuild() const
Definition Player.cpp:16059
PlayerSocial * GetSocial()
Definition Player.h:1158
Definition GuildPackets.h:192
WorldPacket const * Write() override
Definition GuildPackets.cpp:95
std::string InviterName
Definition GuildPackets.h:198
std::string GuildName
Definition GuildPackets.h:199
Player * FindPlayerByName(std::string const &name, bool checkInWorld=true)
Definition ObjectAccessor.cpp:271

References _HasRankRight(), _LogEvent(), CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD, 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(), sConfigMgr, 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:253
bool _ModifyBankMoney(CharacterDatabaseTransaction trans, uint64 amount, bool add)
Definition Guild.cpp:2476
void _LogBankEvent(CharacterDatabaseTransaction trans, GuildBankEventLogTypes eventType, uint8 tabId, ObjectGuid playerGuid, uint32 itemOrMoney, uint16 itemStackCount=0, uint8 destTabId=0)
Definition Guild.cpp:2620
uint64 GetTotalBankMoney() const
Definition Guild.h:770
void SaveGoldToDB(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7127
uint8 GetLevel() const
Definition Unit.h:1033
uint32 GetAccountId() const
Definition WorldSession.h:375
std::string const & GetRemoteAddress()
Definition WorldSession.h:385
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)
1746{
1747 Player* player = session->GetPlayer();
1748 if (Member* member = GetMember(player->GetGUID()))
1749 {
1750 member->SetStats(player);
1751 member->UpdateLogoutTime();
1752 member->ResetFlags();
1753 }
1754 _BroadcastEvent(GE_SIGNED_OFF, player->GetGUID(), player->GetName());
1755}
@ 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 // Add money to player (if required)
1719 if (!repair)
1720 {
1721 if (!player->ModifyMoney(amount))
1722 return false;
1723
1724 player->SaveGoldToDB(trans);
1725 }
1726
1727 // Update remaining money amount
1728 member->UpdateBankWithdrawValue(trans, GUILD_BANK_MAX_TABS, amount);
1729 // Remove money from bank
1730 _ModifyBankMoney(trans, amount, false);
1731
1732 // Log guild bank event
1733 _LogBankEvent(trans, repair ? GUILD_BANK_LOG_REPAIR_MONEY : GUILD_BANK_LOG_WITHDRAW_MONEY, uint8(0), player->GetGUID(), amount);
1734 CharacterDatabase.CommitTransaction(trans);
1735
1736 if (amount > 10 * GOLD) // sender_acc = 0 (guild has no account), sender_guid = Guild id, sender_name = Guild name
1737 CharacterDatabase.Execute("INSERT INTO log_money VALUES({}, {}, \"{}\", \"{}\", {}, \"{}\", {}, \"(guild, members: {}, new amount: {}, leader guid low: {}, withdrawer level: {})\", NOW(), {})",
1738 0, GetId(), GetName(), session->GetRemoteAddress(), session->GetAccountId(), player->GetName(), amount, GetMemberCount(), GetTotalBankMoney(), GetLeaderGUID().GetCounter(), player->GetLevel(), 4);
1739
1740 std::string aux = Acore::Impl::ByteArrayToHexStr(reinterpret_cast<uint8*>(&m_bankMoney), 8, true);
1742 return true;
1743}
@ 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:935
int32 _GetMemberRemainingMoney(Member const &member) const
Definition Guild.cpp:2571

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  officer 
)
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:2512
void _SetRankBankMoneyPerDay(uint8 rankId, uint32 moneyPerDay)
Definition Guild.cpp:2506

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

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

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

◆ LoadBankRightFromDB()

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

References _SetRankBankTabRightsAndSlots().

◆ LoadBankTabFromDB()

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

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

◆ LoadEventLogFromDB()

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

References m_eventLog, and m_id.

◆ LoadFromDB()

bool Guild::LoadFromDB ( Field fields)
1904{
1905 m_id = fields[0].Get<uint32>();
1906 m_name = fields[1].Get<std::string>();
1907 m_leaderGuid = ObjectGuid::Create<HighGuid::Player>(fields[2].Get<uint32>());
1908 m_emblemInfo.LoadFromDB(fields);
1909 m_info = fields[8].Get<std::string>();
1910 m_motd = fields[9].Get<std::string>();
1911 m_createdDate = time_t(fields[10].Get<uint32>());
1912 m_bankMoney = fields[11].Get<uint64>();
1913
1914 uint8 purchasedTabs = uint8(fields[12].Get<uint64>());
1915 if (purchasedTabs > GUILD_BANK_MAX_TABS)
1916 purchasedTabs = GUILD_BANK_MAX_TABS;
1917
1918 m_bankTabs.clear();
1919 m_bankTabs.reserve(purchasedTabs);
1920 for (uint8 i = 0; i < purchasedTabs; ++i)
1921 m_bankTabs.emplace_back(m_id, i);
1922 return true;
1923}
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)
1935{
1936 ObjectGuid::LowType lowguid = fields[1].Get<uint32>();
1937 ObjectGuid playerGuid(HighGuid::Player, lowguid);
1938
1939 auto [memberIt, isNew] = m_members.try_emplace(lowguid, m_id, playerGuid, fields[2].Get<uint8>());
1940 if (!isNew)
1941 {
1942 LOG_ERROR("guild", "Tried to add {} to guild '{}'. Member already exists.", playerGuid.ToString(), m_name);
1943 return false;
1944 }
1945
1946 Member& member = memberIt->second;
1947 if (!member.LoadFromDB(fields))
1948 {
1949 _DeleteMemberFromDB(lowguid);
1950 m_members.erase(memberIt);
1951 return false;
1952 }
1953
1954 sCharacterCache->UpdateCharacterGuildId(playerGuid, GetId());
1955 return true;
1956}

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)
1926{
1927 RankInfo rankInfo(m_id);
1928
1929 rankInfo.LoadFromDB(fields);
1930
1931 m_ranks.push_back(rankInfo);
1932}

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

◆ MassInviteToEvent()

void Guild::MassInviteToEvent ( WorldSession session,
uint32  minLevel,
uint32  maxLevel,
uint32  minRank 
)
2146{
2147 uint32 count = 0;
2148
2150 data << uint32(count); // count placeholder
2151
2152 for (auto const& [guid, member] : m_members)
2153 {
2154 // not sure if needed, maybe client checks it as well
2155 if (count >= CALENDAR_MAX_INVITES)
2156 {
2157 if (Player* player = session->GetPlayer())
2158 sCalendarMgr->SendCalendarCommandResult(player->GetGUID(), CALENDAR_ERROR_INVITES_EXCEEDED);
2159 return;
2160 }
2161
2162 uint32 level = sCharacterCache->GetCharacterLevelByGuid(member.GetGUID());
2163
2164 if (member.GetGUID() != session->GetPlayer()->GetGUID() && level >= minLevel && level <= maxLevel && member.IsRankNotLower(minRank))
2165 {
2166 data.appendPackGUID(member.GetGUID().GetRawValue());
2167 data << uint8(0); // unk
2168 ++count;
2169 }
2170 }
2171
2172 data.put<uint32>(0, count);
2173
2174 session->SendPacket(&data);
2175}
@ 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 ( )
2933{
2934 for (auto& [guid, member] : m_members)
2935 member.ResetValues();
2936
2938}
@ 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
1796{
1797 // GUILD_BANK_MAX_TABS send by client for money log
1798 if (tabId < _GetPurchasedTabsSize() || tabId == GUILD_BANK_MAX_TABS)
1799 {
1800 std::list<BankEventLogEntry> const& bankEventLog = m_bankEventLog[tabId].GetGuildLog();
1801
1803 packet.Tab = tabId;
1804
1805 packet.Entry.reserve(bankEventLog.size());
1806 for (BankEventLogEntry const& entry : bankEventLog)
1807 entry.WritePacket(packet);
1808
1809 session->SendPacket(packet.Write());
1810 LOG_DEBUG("guild", "MSG_GUILD_BANK_LOG_QUERY [{}]", session->GetPlayerInfo());
1811 }
1812}
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
1815{
1816 if (tabId < _GetPurchasedTabsSize())
1817 _SendBankContent(session, tabId, sendAllSlots);
1818}
void _SendBankContent(WorldSession *session, uint8 tabId, bool sendAllSlots) const
Definition Guild.cpp:2751

References _GetPurchasedTabsSize(), and _SendBankContent().

◆ SendBankTabsInfo()

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

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

Referenced by WorldSession::HandleGuildBankerActivate().

◆ SendBankTabText()

void Guild::SendBankTabText ( WorldSession session,
uint8  tabId 
) const
1832{
1833 if (BankTab const* tab = GetBankTab(tabId))
1834 tab->SendText(this, session);
1835}

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
1782{
1783 std::list<EventLogEntry> const& eventLog = m_eventLog.GetGuildLog();
1784
1786 packet.Entry.reserve(eventLog.size());
1787
1788 for (EventLogEntry const& entry : eventLog)
1789 entry.WritePacket(packet);
1790
1791 session->SendPacket(packet.Write());
1792 LOG_DEBUG("guild", "MSG_GUILD_EVENT_LOG_QUERY [{}]", session->GetPlayerInfo());
1793}
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)
1882{
1884 motd.Type = GE_MOTD;
1885 motd.Params.emplace_back(m_motd);
1886 session->SendPacket(motd.Write());
1887
1888 LOG_DEBUG("guild", "SMSG_GUILD_EVENT [{}] MOTD", session->GetPlayerInfo());
1889
1890 Player* player = session->GetPlayer();
1891
1892 HandleRoster(session);
1893 _BroadcastEvent(GE_SIGNED_ON, player->GetGUID(), player->GetName());
1894
1895 if (Member* member = GetMember(player->GetGUID()))
1896 {
1897 member->SetStats(player);
1898 member->AddFlag(GUILDMEMBER_STATUS_ONLINE);
1899 }
1900}
@ 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
1867{
1868 Member const* member = GetMember(session->GetPlayer()->GetGUID());
1869 if (!member)
1870 return;
1871
1872 int32 amount = _GetMemberRemainingMoney(*member);
1873
1875 packet.RemainingWithdrawMoney = amount;
1876 session->SendPacket(packet.Write());
1877
1878 LOG_DEBUG("guild", "MSG_GUILD_BANK_MONEY_WITHDRAWN [{}] Money: {}", session->GetPlayerInfo(), amount);
1879}
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)
1838{
1839 Member* member = GetMember(session->GetPlayer()->GetGUID());
1840 if (!member)
1841 return;
1842
1843 // We are unsubscribing here since it is the only reliable way to handle /reload from player as
1844 // GuildPermissionsQuery is sent on each reload, and we don't want to send partial changes while client
1845 // doesn't know the full state
1846 member->UnsubscribeFromGuildBankUpdatePackets();
1847
1848 uint8 rankId = member->GetRankId();
1849
1851 queryResult.RankID = rankId;
1852 queryResult.WithdrawGoldLimit = _GetRankBankMoneyPerDay(rankId);
1853 queryResult.Flags = _GetRankRights(rankId);
1854 queryResult.NumTabs = _GetPurchasedTabsSize();
1855
1856 for (uint8 tabId = 0; tabId < GUILD_BANK_MAX_TABS; ++tabId)
1857 {
1858 queryResult.Tab[tabId].Flags = _GetRankBankTabRights(rankId, tabId);
1859 queryResult.Tab[tabId].WithdrawItemLimit = _GetMemberRemainingSlots(*member, tabId);
1860 }
1861
1862 session->SendPacket(queryResult.Write());
1863 LOG_DEBUG("guild", "MSG_GUILD_PERMISSIONS [{}] Rank: {}", session->GetPlayerInfo(), rankId);
1864}
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 
)
2375{
2376 if (BankTab* pTab = GetBankTab(tabId))
2377 {
2378 pTab->SetText(text);
2379 pTab->SendText(this, nullptr);
2380 }
2381}

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

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

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

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: