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 ( )
1030 :
1031 m_id(0),
1032 m_createdDate(0),
1034 m_bankMoney(0)
1035{
1036}
uint64 m_bankMoney
Definition: Guild.h:795
uint32 m_id
Definition: Guild.h:786
uint32 m_accountsNumber
Definition: Guild.h:794
time_t m_createdDate
Definition: Guild.h:791

◆ ~Guild()

Guild::~Guild ( )
1039{
1040 CharacterDatabaseTransaction temp(nullptr);
1041 _DeleteBankItems(temp);
1042}
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition: DatabaseEnvFwd.h:70
void _DeleteBankItems(CharacterDatabaseTransaction trans, bool removeItemsFromDB=false)
Definition: Guild.cpp:2457

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
2794{
2796 event.Type = guildEvent;
2797 if (param1)
2798 event.Params.push_back(*param1);
2799
2800 if (param2)
2801 {
2802 event.Params.resize(2);
2803 event.Params[1] = *param2;
2804 }
2805
2806 if (param3)
2807 {
2808 event.Params.resize(3);
2809 event.Params[2] = *param3;
2810 }
2811 event.Guid = guid;
2812 BroadcastPacket(event.Write());
2813 LOG_DEBUG("guild", "SMSG_GUILD_EVENT [Broadcast] Event: {}", guildEvent);
2814}
#define LOG_DEBUG(filterType__,...)
Definition: Log.h:169
void BroadcastPacket(WorldPacket const *packet) const
Definition: Guild.cpp:2128
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
2399{
2401 stmt->SetData(0, m_id);
2402 CharacterDatabase.Execute(stmt);
2403
2404 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_RIGHTS);
2405 stmt->SetData(0, m_id);
2406 CharacterDatabase.Execute(stmt);
2407
2408 _CreateRank(sObjectMgr->GetAcoreString(LANG_GUILD_MASTER, loc), GR_RIGHT_ALL);
2409 _CreateRank(sObjectMgr->GetAcoreString(LANG_GUILD_OFFICER, loc), GR_RIGHT_ALL);
2413}
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition: DatabaseEnv.cpp:21
@ CHAR_DEL_GUILD_BANK_RIGHTS
Definition: CharacterDatabase.h:157
@ CHAR_DEL_GUILD_RANKS
Definition: CharacterDatabase.h:148
#define sObjectMgr
Definition: ObjectMgr.h:1640
@ GR_RIGHT_GCHATSPEAK
Definition: Guild.h:81
@ GR_RIGHT_ALL
Definition: Guild.h:97
@ GR_RIGHT_GCHATLISTEN
Definition: Guild.h:80
@ LANG_GUILD_MASTER
Definition: Language.h:731
@ LANG_GUILD_VETERAN
Definition: Language.h:733
@ LANG_GUILD_OFFICER
Definition: Language.h:732
@ LANG_GUILD_INITIATE
Definition: Language.h:735
@ LANG_GUILD_MEMBER
Definition: Language.h:734
Definition: PreparedStatement.h:158
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition: PreparedStatement.h:78
bool _CreateRank(std::string_view name, uint32 rights)
Definition: Guild.cpp:2415

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
2375{
2376 uint8 tabId = _GetPurchasedTabsSize(); // Next free id
2377 m_bankTabs.emplace_back(m_id, tabId);
2378
2379 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2380
2382 stmt->SetData(0, m_id);
2383 stmt->SetData (1, tabId);
2384 trans->Append(stmt);
2385
2386 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GUILD_BANK_TAB);
2387 stmt->SetData(0, m_id);
2388 stmt->SetData (1, tabId);
2389 trans->Append(stmt);
2390
2391 ++tabId;
2392 for (auto& m_rank : m_ranks)
2393 m_rank.CreateMissingTabsIfNeeded(tabId, trans, false);
2394
2395 CharacterDatabase.CommitTransaction(trans);
2396}
std::uint8_t uint8
Definition: Define.h:110
@ CHAR_INS_GUILD_BANK_TAB
Definition: CharacterDatabase.h:150
@ CHAR_DEL_GUILD_BANK_TAB
Definition: CharacterDatabase.h:151
std::vector< BankTab > m_bankTabs
Definition: Guild.h:799
uint8 _GetPurchasedTabsSize() const
Definition: Guild.h:819
std::vector< RankInfo > m_ranks
Definition: Guild.h:797

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
2416{
2417 uint8 newRankId = _GetRanksSize();
2418 if (newRankId >= GUILD_RANKS_MAX_COUNT)
2419 return false;
2420
2421 // Ranks represent sequence 0, 1, 2, ... where 0 means guildmaster
2422 RankInfo info(m_id, newRankId, name, rights, 0);
2423 m_ranks.push_back(info);
2424
2425 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2426 info.CreateMissingTabsIfNeeded(_GetPurchasedTabsSize(), trans);
2427 info.SaveToDB(trans);
2428 CharacterDatabase.CommitTransaction(trans);
2429
2430 return true;
2431}
@ GUILD_RANKS_MAX_COUNT
Definition: Guild.h:49
uint8 _GetRanksSize() const
Definition: Guild.h:806

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
2458{
2459 for (uint8 tabId = 0; tabId < _GetPurchasedTabsSize(); ++tabId)
2460 {
2461 m_bankTabs[tabId].Delete(trans, removeItemsFromDB);
2462 }
2463 m_bankTabs.clear();
2464}

References _GetPurchasedTabsSize(), and m_bankTabs.

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

◆ _DeleteMemberFromDB()

void Guild::_DeleteMemberFromDB ( ObjectGuid::LowType  lowguid) const
inlineprivate
824 {
826 stmt->SetData(0, lowguid);
827 CharacterDatabase.Execute(stmt);
828 }
@ 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
2698{
2699 Item* pDestItem = pDest->GetItem();
2700 bool swap = (pDestItem != nullptr);
2701
2702 Item* pSrcItem = pSrc->GetItem(splitedAmount);
2703 // 1. Can store source item in destination
2704 if (!pDest->CanStore(pSrcItem, swap, sendError))
2705 return false;
2706
2707 // 2. Can store destination item in source
2708 if (swap)
2709 if (!pSrc->CanStore(pDestItem, true, true))
2710 return false;
2711
2712 // GM LOG (TODO: move to scripts)
2713 pDest->LogAction(pSrc);
2714 if (swap)
2715 pSrc->LogAction(pDest);
2716
2717 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2718 // 3. Log bank events
2719 pDest->LogBankEvent(trans, pSrc, pSrcItem->GetCount());
2720 if (swap)
2721 pSrc->LogBankEvent(trans, pDest, pDestItem->GetCount());
2722
2723 // 4. Remove item from source
2724 pSrc->RemoveItem(trans, pDest, splitedAmount);
2725
2726 // 5. Remove item from destination
2727 if (swap)
2728 pDest->RemoveItem(trans, pSrc);
2729
2730 // 6. Store item in destination
2731 pDest->StoreItem(trans, pSrcItem);
2732
2733 // 7. Store item in source
2734 if (swap)
2735 pSrc->StoreItem(trans, pDestItem);
2736
2737 CharacterDatabase.CommitTransaction(trans);
2738 return true;
2739}
Definition: Item.h:214
uint32 GetCount() const
Definition: Item.h:263

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
2632{
2633 if (const BankTab* tab = GetBankTab(tabId))
2634 return tab->GetItem(slotId);
2635 return nullptr;
2636}
BankTab * GetBankTab(uint8 tabId)
Definition: Guild.h:820

References GetBankTab().

◆ _GetLowestRankId()

uint8 Guild::_GetLowestRankId ( ) const
inlineprivate
817{ 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
2562{
2563 uint8 rankId = member.GetRankId();
2564 if (rankId == GR_GUILDMASTER)
2565 return static_cast<int32>(GUILD_WITHDRAW_MONEY_UNLIMITED);
2566
2568 {
2569 int32 remaining = _GetRankBankMoneyPerDay(rankId) - member.GetBankWithdrawValue(GUILD_BANK_MAX_TABS);
2570 if (remaining > 0)
2571 return remaining;
2572 }
2573 return 0;
2574}
std::int32_t int32
Definition: Define.h:104
@ GUILD_WITHDRAW_MONEY_UNLIMITED
Definition: Guild.h:51
@ GUILD_BANK_MAX_TABS
Definition: Guild.h:45
@ GR_GUILDMASTER
Definition: Guild.h:68
@ GR_RIGHT_WITHDRAW_REPAIR
Definition: Guild.h:94
@ GR_RIGHT_WITHDRAW_GOLD
Definition: Guild.h:95
uint32 _GetRankRights(uint8 rankId) const
Definition: Guild.cpp:2518
int32 _GetRankBankMoneyPerDay(uint8 rankId) const
Definition: Guild.cpp:2525

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
2548{
2549 uint8 rankId = member.GetRankId();
2550 if (rankId == GR_GUILDMASTER)
2551 return static_cast<int32>(GUILD_WITHDRAW_SLOT_UNLIMITED);
2552 if ((_GetRankBankTabRights(rankId, tabId) & GUILD_BANK_RIGHT_VIEW_TAB) != 0)
2553 {
2554 int32 remaining = _GetRankBankTabSlotsPerDay(rankId, tabId) - member.GetBankWithdrawValue(tabId);
2555 if (remaining > 0)
2556 return remaining;
2557 }
2558 return 0;
2559}
@ GUILD_WITHDRAW_SLOT_UNLIMITED
Definition: Guild.h:52
@ GUILD_BANK_RIGHT_VIEW_TAB
Definition: Guild.h:190
int8 _GetRankBankTabRights(uint8 rankId, uint8 tabId) const
Definition: Guild.cpp:2540
int32 _GetRankBankTabSlotsPerDay(uint8 rankId, uint8 tabId) const
Definition: Guild.cpp:2532

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
2526{
2527 if (const RankInfo* rankInfo = GetRankInfo(rankId))
2528 return rankInfo->GetBankMoneyPerDay();
2529 return 0;
2530}
const RankInfo * GetRankInfo(uint8 rankId) const
Definition: Guild.h:807

References GetRankInfo().

Referenced by _GetMemberRemainingMoney(), and SendPermissions().

◆ _GetRankBankTabRights()

int8 Guild::_GetRankBankTabRights ( uint8  rankId,
uint8  tabId 
) const
inlineprivate
2541{
2542 if (const RankInfo* rankInfo = GetRankInfo(rankId))
2543 return rankInfo->GetBankTabRights(tabId);
2544 return 0;
2545}

References GetRankInfo().

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

◆ _GetRankBankTabSlotsPerDay()

int32 Guild::_GetRankBankTabSlotsPerDay ( uint8  rankId,
uint8  tabId 
) const
inlineprivate
2533{
2534 if (tabId < _GetPurchasedTabsSize())
2535 if (const RankInfo* rankInfo = GetRankInfo(rankId))
2536 return rankInfo->GetBankTabSlotsPerDay(tabId);
2537 return 0;
2538}

References _GetPurchasedTabsSize(), and GetRankInfo().

Referenced by _GetMemberRemainingSlots(), and _UpdateMemberWithdrawSlots().

◆ _GetRankName()

std::string Guild::_GetRankName ( uint8  rankId) const
inlineprivate
2512{
2513 if (const RankInfo* rankInfo = GetRankInfo(rankId))
2514 return rankInfo->GetName();
2515 return "<unknown>";
2516}

References GetRankInfo().

Referenced by HandleUpdateMemberRank().

◆ _GetRankRights()

uint32 Guild::_GetRankRights ( uint8  rankId) const
inlineprivate
2519{
2520 if (const RankInfo* rankInfo = GetRankInfo(rankId))
2521 return rankInfo->GetRights();
2522 return 0;
2523}

References GetRankInfo().

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

◆ _GetRanksSize()

uint8 Guild::_GetRanksSize ( ) const
inlineprivate

◆ _HasRankRight()

bool Guild::_HasRankRight ( Player player,
uint32  right 
) const
inlineprivate
810 {
811 if (player)
812 if (Member const* member = GetMember(player->GetGUID()))
813 return (_GetRankRights(member->GetRankId()) & right) != GR_RIGHT_EMPTY;
814 return false;
815 }
@ GR_RIGHT_EMPTY
Definition: Guild.h:79
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:106
const Member * GetMember(ObjectGuid guid) const
Definition: Guild.h:384

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
2449{
2450 if (player->GetGUID() == m_leaderGuid)
2451 return true;
2452 if (const Member* member = GetMember(player->GetGUID()))
2453 return member->IsRank(GR_GUILDMASTER);
2454 return false;
2455}
ObjectGuid m_leaderGuid
Definition: Guild.h:788

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
2611{
2612 if (tabId > GUILD_BANK_MAX_TABS)
2613 return;
2614
2615 // not logging moves within the same tab
2616 if (eventType == GUILD_BANK_LOG_MOVE_ITEM && tabId == destTabId)
2617 return;
2618
2619 uint8 dbTabId = tabId;
2620 if (BankEventLogEntry::IsMoneyEvent(eventType))
2621 {
2622 tabId = GUILD_BANK_MAX_TABS;
2623 dbTabId = GUILD_BANK_MONEY_LOGS_TAB;
2624 }
2625 LogHolder<BankEventLogEntry>& pLog = m_bankEventLog[tabId];
2626 pLog.AddEvent(trans, m_id, pLog.GetNextGUID(), eventType, dbTabId, guid, itemOrMoney, itemStackCount, destTabId);
2627
2628 sScriptMgr->OnGuildBankEvent(this, uint8(eventType), tabId, guid.GetCounter(), itemOrMoney, itemStackCount, destTabId);
2629}
@ GUILD_BANK_MONEY_LOGS_TAB
Definition: Guild.h:47
@ GUILD_BANK_LOG_MOVE_ITEM
Definition: Guild.h:202
#define sScriptMgr
Definition: ScriptMgr.h:698
std::array< LogHolder< BankEventLogEntry >, GUILD_BANK_MAX_TABS+1 > m_bankEventLog
Definition: Guild.h:803
bool IsMoneyEvent() const
Definition: Guild.h:457

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
2601{
2602 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2603 m_eventLog.AddEvent(trans, m_id, m_eventLog.GetNextGUID(), eventType, playerGuid1, playerGuid2, newRank);
2604 CharacterDatabase.CommitTransaction(trans);
2605
2606 sScriptMgr->OnGuildEvent(this, uint8(eventType), playerGuid1.GetCounter(), playerGuid2.GetCounter(), newRank);
2607}
LowType GetCounter() const
Definition: ObjectGuid.h:147
LogHolder< EventLogEntry > m_eventLog
Definition: Guild.h:802

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
2588{
2589 if (const Member* member = GetMember(guid))
2590 {
2591 // Leader always has full rights
2592 if (member->IsRank(GR_GUILDMASTER) || m_leaderGuid == guid)
2593 return true;
2594 return (_GetRankBankTabRights(member->GetRankId(), tabId) & rights) == rights;
2595 }
2596 return false;
2597}

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

Referenced by _SendBankContent(), and _SendBankList().

◆ _ModifyBankMoney()

bool Guild::_ModifyBankMoney ( CharacterDatabaseTransaction  trans,
uint64  amount,
bool  add 
)
private
2467{
2468 if (add)
2469 m_bankMoney += amount;
2470 else
2471 {
2472 // Check if there is enough money in bank.
2473 if (m_bankMoney < amount)
2474 return false;
2475 m_bankMoney -= amount;
2476 }
2477
2479 stmt->SetData(0, m_bankMoney);
2480 stmt->SetData(1, m_id);
2481 trans->Append(stmt);
2482 return true;
2483}
@ 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
2645{
2646 // 1. Initialize source item
2647 if (!pSrc->InitItem())
2648 return; // No source item
2649
2650 // 2. Check source item
2651 if (!pSrc->CheckItem(splitedAmount))
2652 return; // Source item or splited amount is invalid
2653
2654 // 3. Check destination rights
2655 if (!pDest->HasStoreRights(pSrc))
2656 return; // Player has no rights to store item in destination
2657
2658 // 4. Check source withdraw rights
2659 if (!pSrc->HasWithdrawRights(pDest))
2660 return; // Player has no rights to withdraw items from source
2661
2662 // 5. Check split
2663 if (splitedAmount)
2664 {
2665 // 5.1. Clone source item
2666 if (!pSrc->CloneItem(splitedAmount))
2667 return; // Item could not be cloned
2668
2669 // 5.2. Move splited item to destination
2670 _DoItemsMove(pSrc, pDest, true, splitedAmount);
2671 }
2672 else // 6. No split
2673 {
2674 // 6.1. Try to merge items in destination (pDest->GetItem() == nullptr)
2675 if (!_DoItemsMove(pSrc, pDest, false)) // Item could not be merged
2676 {
2677 // 6.2. Try to swap items
2678 // 6.2.1. Initialize destination item
2679 if (!pDest->InitItem())
2680 return;
2681
2682 // 6.2.2. Check rights to store item in source (opposite direction)
2683 if (!pSrc->HasStoreRights(pDest))
2684 return; // Player has no rights to store item in source (opposite direction)
2685
2686 if (!pDest->HasWithdrawRights(pSrc))
2687 return; // Player has no rights to withdraw item from destination (opposite direction)
2688
2689 // 6.2.3. Swap items (pDest->GetItem() != nullptr)
2690 _DoItemsMove(pSrc, pDest, true);
2691 }
2692 }
2693 // 7. Send changes
2694 _SendBankContentUpdate(pSrc, pDest);
2695}
bool _DoItemsMove(MoveItemData *pSrc, MoveItemData *pDest, bool sendError, uint32 splitedAmount=0)
Definition: Guild.cpp:2697
void _SendBankContentUpdate(MoveItemData *pSrc, MoveItemData *pDest) const
Definition: Guild.cpp:2755

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
2639{
2640 if (BankTab* pTab = GetBankTab(tabId))
2641 pTab->SetItem(trans, slotId, nullptr);
2642}

References GetBankTab().

◆ _SendBankContent()

void Guild::_SendBankContent ( WorldSession session,
uint8  tabId,
bool  sendAllSlots 
) const
private
2742{
2743 ObjectGuid guid = session->GetPlayer()->GetGUID();
2745 return;
2746
2747 _SendBankList(session, tabId, sendAllSlots);
2748}
Definition: ObjectGuid.h:120
void _SendBankList(WorldSession *session=nullptr, uint8 tabId=0, bool sendFullSlots=false, SlotIds *slots=nullptr) const
Definition: Guild.cpp:2816
bool _MemberHasTabRights(ObjectGuid guid, uint8 tabId, uint32 rights) const
Definition: Guild.cpp:2587
Player * GetPlayer() const
Definition: WorldSession.h:364

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
2756{
2757 ASSERT(pSrc->IsBank() || pDest->IsBank());
2758
2759 uint8 tabId = 0;
2760 SlotIds slots;
2761 if (pSrc->IsBank()) // B ->
2762 {
2763 tabId = pSrc->GetContainer();
2764 slots.insert(pSrc->GetSlotId());
2765 if (pDest->IsBank()) // B -> B
2766 {
2767 // Same tab - add destination slots to collection
2768 if (pDest->GetContainer() == pSrc->GetContainer())
2769 pDest->CopySlots(slots);
2770 else // Different tabs - send second message
2771 {
2772 SlotIds destSlots;
2773 pDest->CopySlots(destSlots);
2774 _SendBankContentUpdate(pDest->GetContainer(), destSlots);
2775 }
2776 }
2777 }
2778 else if (pDest->IsBank()) // C -> B
2779 {
2780 tabId = pDest->GetContainer();
2781 pDest->CopySlots(slots);
2782 }
2783
2784 _SendBankContentUpdate(tabId, slots);
2785}
#define ASSERT
Definition: Errors.h:68
std::set< uint8 > SlotIds
Definition: Guild.h:292

References _SendBankContentUpdate(), ASSERT, Guild::MoveItemData::CopySlots(), Guild::MoveItemData::GetContainer(), Guild::MoveItemData::GetSlotId(), and Guild::MoveItemData::IsBank().

Referenced by _MoveItems(), and _SendBankContentUpdate().

◆ _SendBankContentUpdate() [2/2]

void Guild::_SendBankContentUpdate ( uint8  tabId,
SlotIds  slots 
) const
private
2788{
2789 _SendBankList(nullptr, tabId, false, &slots);
2790}

References _SendBankList().

◆ _SendBankList()

void Guild::_SendBankList ( WorldSession session = nullptr,
uint8  tabId = 0,
bool  sendFullSlots = false,
SlotIds slots = nullptr 
) const
private
2817{
2818 if (!sScriptMgr->CanGuildSendBankList(this, session, tabId, sendAllSlots))
2819 return;
2820
2822
2823 packet.Money = m_bankMoney;
2824 packet.Tab = int32(tabId);
2825 packet.FullUpdate = sendAllSlots;
2826
2827 if (sendAllSlots && !tabId)
2828 {
2829 packet.TabInfo.reserve(_GetPurchasedTabsSize());
2830 for (uint8 i = 0; i < _GetPurchasedTabsSize(); ++i)
2831 {
2833 tabInfo.Name = m_bankTabs[i].GetName();
2834 tabInfo.Icon = m_bankTabs[i].GetIcon();
2835 packet.TabInfo.push_back(tabInfo);
2836 }
2837 }
2838
2839 if (BankTab const* tab = GetBankTab(tabId))
2840 {
2841 auto fillItems = [&](auto begin, auto end, bool skipEmpty)
2842 {
2843 for (auto itr = begin; itr != end; ++itr)
2844 {
2845 if (Item* tabItem = tab->GetItem(*itr))
2846 {
2848
2849 itemInfo.Slot = *itr;
2850 itemInfo.ItemID = tabItem->GetEntry();
2851 itemInfo.Count = int32(tabItem->GetCount());
2852 itemInfo.Charges = int32(std::abs(tabItem->GetSpellCharges()));
2853 itemInfo.EnchantmentID = int32(tabItem->GetEnchantmentId(PERM_ENCHANTMENT_SLOT));
2854 itemInfo.Flags = tabItem->GetInt32Value(ITEM_FIELD_FLAGS);
2855 itemInfo.RandomPropertiesID = tabItem->GetItemRandomPropertyId();
2856 itemInfo.RandomPropertiesSeed = int32(tabItem->GetItemSuffixFactor());
2857
2858 for (uint32 socketSlot = 0; socketSlot < MAX_GEM_SOCKETS; ++socketSlot)
2859 {
2860 if (uint32 enchId = tabItem->GetEnchantmentId(EnchantmentSlot(SOCK_ENCHANTMENT_SLOT + socketSlot)))
2861 {
2863 gem.SocketIndex = socketSlot;
2864 gem.SocketEnchantID = int32(enchId);
2865 itemInfo.SocketEnchant.push_back(gem);
2866 }
2867 }
2868
2869 packet.ItemInfo.push_back(itemInfo);
2870 }
2871 else if (!skipEmpty)
2872 {
2874
2875 itemInfo.Slot = *itr;
2876 itemInfo.ItemID = 0;
2877
2878 packet.ItemInfo.push_back(itemInfo);
2879 }
2880 }
2881
2882 };
2883
2884 if (sendAllSlots)
2885 fillItems(boost::make_counting_iterator(uint8(0)), boost::make_counting_iterator(uint8(GUILD_BANK_MAX_SLOTS)), true);
2886 else if (slots && !slots->empty())
2887 fillItems(slots->begin(), slots->end(), false);
2888 }
2889
2890 if (session)
2891 {
2892 if (Member const* member = GetMember(session->GetPlayer()->GetGUID()))
2893 packet.WithdrawalsRemaining = _GetMemberRemainingSlots(*member, tabId);
2894
2895 session->SendPacket(packet.Write());
2896 LOG_DEBUG("guild", "SMSG_GUILD_BANK_LIST [{}]: TabId: {}, FullSlots: {}, slots: {}",
2897 session->GetPlayerInfo(), tabId, sendAllSlots, packet.WithdrawalsRemaining);
2898 }
2899 else
2900 {
2901 packet.Write();
2902 for (auto const& [guid, member] : m_members)
2903 {
2904 if (!member.ShouldReceiveBankPartialUpdatePackets())
2905 continue;
2906
2907 if (!_MemberHasTabRights(member.GetGUID(), tabId, GUILD_BANK_RIGHT_VIEW_TAB))
2908 continue;
2909
2910 Player* player = member.FindPlayer();
2911 if (!player)
2912 continue;
2913
2915 player->SendDirectMessage(packet.GetRawPacket());
2916 LOG_DEBUG("guild", "SMSG_GUILD_BANK_LIST [{}]: TabId: {}, FullSlots: {}, slots: {}"
2917 , player->GetName(), tabId, sendAllSlots, packet.WithdrawalsRemaining);
2918 }
2919 }
2920}
std::uint32_t uint32
Definition: Define.h:108
#define MAX_GEM_SOCKETS
Definition: Item.h:182
EnchantmentSlot
Definition: Item.h:162
@ PERM_ENCHANTMENT_SLOT
Definition: Item.h:163
@ SOCK_ENCHANTMENT_SLOT
Definition: Item.h:165
@ ITEM_FIELD_FLAGS
Definition: UpdateFields.h:42
@ GUILD_BANK_MAX_SLOTS
Definition: Guild.h:46
std::string const & GetName() const
Definition: Object.h:446
Definition: Player.h:1056
void SendDirectMessage(WorldPacket const *data) const
Definition: Player.cpp:5607
int32 _GetMemberRemainingSlots(Member const &member, uint8 tabId) const
Definition: Guild.cpp:2547
std::unordered_map< uint32, Member > m_members
Definition: Guild.h:798
WorldPacket const * GetRawPacket() const
Definition: Packet.h:38
Definition: GuildPackets.h:457
uint8 SocketIndex
Definition: GuildPackets.h:458
int32 SocketEnchantID
Definition: GuildPackets.h:459
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:476
std::string Name
Definition: GuildPackets.h:477
std::string Icon
Definition: GuildPackets.h:478
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
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition: WorldSession.cpp:212
std::string GetPlayerInfo() const
Definition: WorldSession.cpp:189

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
2751{
2752 _SendBankList(session);
2753}

References _SendBankList().

◆ _SetLeaderGUID()

void Guild::_SetLeaderGUID ( Member pLeader)
private
2486{
2487 m_leaderGuid = pLeader.GetGUID();
2488 pLeader.ChangeRank(GR_GUILDMASTER);
2489
2491 stmt->SetData(0, m_leaderGuid.GetCounter());
2492 stmt->SetData(1, m_id);
2493 CharacterDatabase.Execute(stmt);
2494}
@ 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
2497{
2498 if (RankInfo* rankInfo = GetRankInfo(rankId))
2499 rankInfo->SetBankMoneyPerDay(moneyPerDay);
2500}

References GetRankInfo().

Referenced by HandleSetRankInfo().

◆ _SetRankBankTabRightsAndSlots()

void Guild::_SetRankBankTabRightsAndSlots ( uint8  rankId,
GuildBankRightsAndSlots  rightsAndSlots,
bool  saveToDB = true 
)
private
2503{
2504 if (rightsAndSlots.GetTabId() >= _GetPurchasedTabsSize())
2505 return;
2506
2507 if (RankInfo* rankInfo = GetRankInfo(rankId))
2508 rankInfo->SetBankTabSlotsAndRights(rightsAndSlots, saveToDB);
2509}
uint8 GetTabId() const
Definition: Guild.h:282

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

Referenced by HandleSetRankInfo(), and LoadBankRightFromDB().

◆ _UpdateAccountsNumber()

void Guild::_UpdateAccountsNumber ( )
private
2436{
2437 // We use a set to be sure each element will be unique
2438 std::unordered_set<uint32> accountsIdSet;
2439 for (auto const& [guid, member] : m_members)
2440 accountsIdSet.insert(member.GetAccountId());
2441
2442 m_accountsNumber = accountsIdSet.size();
2443}

References m_accountsNumber, and m_members.

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

◆ _UpdateMemberWithdrawSlots()

void Guild::_UpdateMemberWithdrawSlots ( CharacterDatabaseTransaction  trans,
ObjectGuid  guid,
uint8  tabId 
)
inlineprivate
2577{
2578 if (Member* member = GetMember(guid))
2579 {
2580 uint8 rankId = member->GetRankId();
2581 if (rankId != GR_GUILDMASTER
2582 && member->GetBankWithdrawValue(tabId) < _GetRankBankTabSlotsPerDay(rankId, tabId))
2583 member->UpdateBankWithdrawValue(trans, tabId, 1);
2584 }
2585}

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

◆ AddMember()

bool Guild::AddMember ( ObjectGuid  guid,
uint8  rankId = GUILD_RANK_NONE 
)
2169{
2171 // Player cannot be in guild
2172 if (player)
2173 {
2174 if (player->GetGuildId() != 0)
2175 return false;
2176 }
2177 else if (sCharacterCache->GetCharacterGuildIdByGuid(guid) != 0)
2178 return false;
2179
2180 // Remove all player signs from another petitions
2181 // This will be prevent attempt to join many guilds and corrupt guild data integrity
2183
2184 ObjectGuid::LowType lowguid = guid.GetCounter();
2185
2186 // If rank was not passed, assign lowest possible rank
2187 if (rankId == GUILD_RANK_NONE)
2188 rankId = _GetLowestRankId();
2189
2190 auto [memberIt, isNew] = m_members.try_emplace(lowguid, m_id, guid, rankId);
2191 if (!isNew)
2192 {
2193 LOG_ERROR("guild", "Tried to add {} to guild '{}'. Member already exists.", guid.ToString(), m_name);
2194 return false;
2195 }
2196
2197 Member& member = memberIt->second;
2198 std::string name;
2199 if (player)
2200 {
2201 player->SetInGuild(m_id);
2202 player->SetGuildIdInvited(0);
2203 player->SetRank(rankId);
2204 member.SetStats(player);
2205 SendLoginInfo(player->GetSession());
2206 name = player->GetName();
2207 }
2208 else
2209 {
2210 member.ResetFlags();
2211
2212 bool ok = false;
2213 // xinef: sync query
2214 // Player must exist
2216 stmt->SetData(0, guid.GetCounter());
2217 if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
2218 {
2219 Field* fields = result->Fetch();
2220 name = fields[0].Get<std::string>();
2221 member.SetStats(
2222 name,
2223 fields[1].Get<uint8>(),
2224 fields[2].Get<uint8>(),
2225 fields[3].Get<uint8>(),
2226 fields[4].Get<uint16>(),
2227 fields[5].Get<uint32>());
2228
2229 ok = member.CheckStats();
2230 }
2231 if (!ok)
2232 {
2233 m_members.erase(memberIt);
2234 return false;
2235 }
2236 sCharacterCache->UpdateCharacterGuildId(guid, m_id);
2237 }
2238
2239 CharacterDatabaseTransaction trans(nullptr);
2240 member.SaveToDB(trans);
2241
2244 _BroadcastEvent(GE_JOINED, guid, name);
2245
2246 // Call scripts if member was succesfully added (and stored to database)
2247 sScriptMgr->OnGuildAddMember(this, player, rankId);
2248
2249 return true;
2250}
std::uint16_t uint16
Definition: Define.h:109
#define LOG_ERROR(filterType__,...)
Definition: Log.h:157
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition: DatabaseEnvFwd.h:46
@ CHAR_SEL_CHAR_DATA_FOR_GUILD
Definition: CharacterDatabase.h:181
#define sCharacterCache
Definition: CharacterCache.h:83
@ GE_JOINED
Definition: Guild.h:153
@ GUILD_RANK_NONE
Definition: Guild.h:50
@ GUILD_EVENT_LOG_JOIN_GUILD
Definition: Guild.h:214
@ GUILD_CHARTER_TYPE
Definition: WorldSession.h:222
Player * FindConnectedPlayer(ObjectGuid const guid)
Definition: ObjectAccessor.cpp:260
Class used to access individual fields of database query result.
Definition: Field.h:99
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition: Field.h:113
std::string ToString() const
Definition: ObjectGuid.cpp:47
uint32 LowType
Definition: ObjectGuid.h:124
void SetGuildIdInvited(uint32 GuildId)
Definition: Player.h:1863
uint32 GetGuildId() const
Definition: Player.h:1864
WorldSession * GetSession() const
Definition: Player.h:1961
void SetInGuild(uint32 GuildId)
Definition: Player.h:1855
void SetRank(uint8 rankId)
Definition: Player.h:1861
static void RemovePetitionsAndSigns(ObjectGuid guid, uint32 type)
Definition: Player.cpp:10027
void SendLoginInfo(WorldSession *session)
Definition: Guild.cpp:1871
std::string m_name
Definition: Guild.h:787
void _UpdateAccountsNumber()
Definition: Guild.cpp:2435
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:2792
void _LogEvent(GuildEventLogTypes eventType, ObjectGuid playerGuid1, ObjectGuid playerGuid2=ObjectGuid::Empty, uint8 newRank=0)
Definition: Guild.cpp:2600
uint8 _GetLowestRankId() const
Definition: Guild.h:817

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
2129{
2130 for (auto const& [guid, member] : m_members)
2131 if (Player* player = member.FindPlayer())
2132 player->GetSession()->SendPacket(packet);
2133}

References m_members.

Referenced by _BroadcastEvent(), and Guild::BankTab::SendText().

◆ BroadcastPacketToRank()

void Guild::BroadcastPacketToRank ( WorldPacket const *  packet,
uint8  rankId 
) const
2121{
2122 for (auto const& [guid, member] : m_members)
2123 if (member.IsRank(rankId))
2124 if (Player* player = member.FindPlayer())
2125 player->GetSession()->SendPacket(packet);
2126}

References m_members.

◆ BroadcastToGuild()

void Guild::BroadcastToGuild ( WorldSession session,
bool  officerOnly,
std::string_view  msg,
uint32  language = LANG_UNIVERSAL 
) const
2108{
2109 if (session && session->GetPlayer() && _HasRankRight(session->GetPlayer(), officerOnly ? GR_RIGHT_OFFCHATSPEAK : GR_RIGHT_GCHATSPEAK))
2110 {
2111 WorldPacket data;
2112 ChatHandler::BuildChatPacket(data, officerOnly ? CHAT_MSG_OFFICER : CHAT_MSG_GUILD, Language(language), session->GetPlayer(), nullptr, msg);
2113 for (auto const& [guid, member] : m_members)
2114 if (Player* player = member.FindPlayer())
2115 if (_HasRankRight(player, officerOnly ? GR_RIGHT_OFFCHATLISTEN : GR_RIGHT_GCHATLISTEN) && !player->GetSocial()->HasIgnore(session->GetPlayer()->GetGUID()))
2116 player->GetSession()->SendPacket(&data);
2117 }
2118}
@ GR_RIGHT_OFFCHATSPEAK
Definition: Guild.h:83
@ GR_RIGHT_OFFCHATLISTEN
Definition: Guild.h:82
@ CHAT_MSG_GUILD
Definition: SharedDefines.h:3156
@ CHAT_MSG_OFFICER
Definition: SharedDefines.h:3157
Language
Definition: SharedDefines.h:734
static 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:201
bool _HasRankRight(Player *player, uint32 right) const
Definition: Guild.h:809
Definition: WorldPacket.h:27

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
755 {
756 for (auto const& m_member : m_members)
757 if (Player* player = m_member.second.FindPlayer())
758 if (player != except)
759 _do(player);
760 }

References m_members.

Referenced by AchievementMgr::SendAchievementEarned().

◆ ChangeMemberRank()

bool Guild::ChangeMemberRank ( ObjectGuid  guid,
uint8  newRank 
)
2314{
2315 if (newRank <= _GetLowestRankId()) // Validate rank (allow only existing ranks)
2316 if (Member* member = GetMember(guid))
2317 {
2318 member->ChangeRank(newRank);
2319
2320 if (newRank == GR_GUILDMASTER)
2321 {
2322 m_leaderGuid = guid;
2323
2325 stmt->SetData(0, m_leaderGuid.GetCounter());
2326 stmt->SetData(1, m_id);
2327 CharacterDatabase.Execute(stmt);
2328 }
2329
2330 return true;
2331 }
2332 return false;
2333}

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 
)
1046{
1047 // Check if guild with such name already exists
1048 if (sGuildMgr->GetGuildByName(name))
1049 return false;
1050
1051 WorldSession* pLeaderSession = pLeader->GetSession();
1052 if (!pLeaderSession)
1053 return false;
1054
1055 m_id = sGuildMgr->GenerateGuildId();
1056 m_leaderGuid = pLeader->GetGUID();
1057 m_name = name;
1058 m_info = "";
1059 m_motd = "No message set.";
1060 m_bankMoney = 0;
1062
1063 LOG_DEBUG("guild", "GUILD: creating guild [{}] for leader {} ({})",
1064 m_name, pLeader->GetName(), m_leaderGuid.ToString());
1065
1066 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1067
1069 stmt->SetData(0, m_id);
1070 trans->Append(stmt);
1071
1072 uint8 index = 0;
1073 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GUILD);
1074 stmt->SetData( index, m_id);
1075 stmt->SetData(++index, m_name);
1076 stmt->SetData(++index, m_leaderGuid.GetCounter());
1077 stmt->SetData(++index, m_info);
1078 stmt->SetData(++index, m_motd);
1079 stmt->SetData(++index, uint32(m_createdDate));
1080 stmt->SetData(++index, m_emblemInfo.GetStyle());
1081 stmt->SetData(++index, m_emblemInfo.GetColor());
1082 stmt->SetData(++index, m_emblemInfo.GetBorderStyle());
1083 stmt->SetData(++index, m_emblemInfo.GetBorderColor());
1084 stmt->SetData(++index, m_emblemInfo.GetBackgroundColor());
1085 stmt->SetData(++index, m_bankMoney);
1086 trans->Append(stmt);
1087
1088 CharacterDatabase.CommitTransaction(trans);
1089 _CreateDefaultGuildRanks(pLeaderSession->GetSessionDbLocaleIndex()); // Create default ranks
1090 bool ret = AddMember(m_leaderGuid, GR_GUILDMASTER); // Add guildmaster
1091
1092 for (short i = 0; i < static_cast<short>(sWorld->getIntConfig(CONFIG_GUILD_BANK_INITIAL_TABS)); i++)
1093 {
1095 }
1096
1097 if (ret)
1098 sScriptMgr->OnGuildCreate(this, pLeader, m_name);
1099
1100 return ret;
1101}
@ 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:402
#define sWorld
Definition: World.h:447
Seconds GetGameTime()
Definition: GameTime.cpp:38
uint32 GetStyle() const
Definition: Guild.h:250
uint32 GetColor() const
Definition: Guild.h:251
uint32 GetBackgroundColor() const
Definition: Guild.h:254
uint32 GetBorderStyle() const
Definition: Guild.h:252
uint32 GetBorderColor() const
Definition: Guild.h:253
void _CreateNewBankTab()
Definition: Guild.cpp:2374
bool AddMember(ObjectGuid guid, uint8 rankId=GUILD_RANK_NONE)
Definition: Guild.cpp:2168
std::string m_motd
Definition: Guild.h:789
EmblemInfo m_emblemInfo
Definition: Guild.h:793
std::string m_info
Definition: Guild.h:790
void _CreateDefaultGuildRanks(LocaleConstant loc)
Definition: Guild.cpp:2398
Player session in the World.
Definition: WorldSession.h:330
LocaleConstant GetSessionDbLocaleIndex() const
Definition: WorldSession.h:500

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 
)
2253{
2254 ObjectGuid::LowType lowguid = guid.GetCounter();
2256
2257 // Guild master can be deleted when loading guild and guid doesn't exist in characters table
2258 // or when he is removed from guild by gm command
2259 if (m_leaderGuid == guid && !isDisbanding)
2260 {
2261 Member* oldLeader = nullptr;
2262 Member* newLeader = nullptr;
2263 for (auto& [guid, member] : m_members)
2264 {
2265 if (guid == lowguid)
2266 oldLeader = &member;
2267 else if (!newLeader || newLeader->GetRankId() > member.GetRankId())
2268 newLeader = &member;
2269 }
2270
2271 if (!newLeader)
2272 {
2273 Disband();
2274 if (canDeleteGuild)
2275 delete this;
2276 return;
2277 }
2278
2279 _SetLeaderGUID(*newLeader);
2280
2281 // If player not online data in data field will be loaded from guild tabs no need to update it !!
2282 if (Player* newLeaderPlayer = newLeader->FindPlayer())
2283 newLeaderPlayer->SetRank(GR_GUILDMASTER);
2284
2285 // If leader does not exist (at guild loading with deleted leader) do not send broadcasts
2286 if (oldLeader)
2287 {
2288 _BroadcastEvent(GE_LEADER_CHANGED, ObjectGuid::Empty, oldLeader->GetName(), newLeader->GetName());
2289 _BroadcastEvent(GE_LEFT, guid, oldLeader->GetName());
2290 }
2291 }
2292 // Call script on remove before member is actually removed from guild (and database)
2293 sScriptMgr->OnGuildRemoveMember(this, player, isDisbanding, isKicked);
2294
2295 m_members.erase(lowguid);
2296
2297 // If player not online data in data field will be loaded from guild tabs no need to update it !!
2298 if (player)
2299 {
2300 player->SetInGuild(0);
2301 player->SetRank(0);
2302 }
2303 else
2304 {
2305 sCharacterCache->UpdateCharacterGuildId(guid, 0);
2306 }
2307
2309 if (!isDisbanding)
2311}
@ GE_LEFT
Definition: Guild.h:154
@ GE_LEADER_CHANGED
Definition: Guild.h:157
static ObjectGuid const Empty
Definition: ObjectGuid.h:122
void _SetLeaderGUID(Member &pLeader)
Definition: Guild.cpp:2485
void Disband()
Definition: Guild.cpp:1104
void _DeleteMemberFromDB(ObjectGuid::LowType lowguid) const
Definition: Guild.h:823

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 ( )
1105{
1106 // Call scripts before guild data removed from database
1107 sScriptMgr->OnGuildDisband(this);
1108
1110 // Remove all members
1111 while (!m_members.empty())
1112 {
1113 auto itr = m_members.begin();
1114 DeleteMember(itr->second.GetGUID(), true);
1115 }
1116
1117 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1118
1120 stmt->SetData(0, m_id);
1121 trans->Append(stmt);
1122
1123 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_RANKS);
1124 stmt->SetData(0, m_id);
1125 trans->Append(stmt);
1126
1127 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_TABS);
1128 stmt->SetData(0, m_id);
1129 trans->Append(stmt);
1130
1131 // Free bank tab used memory and delete items stored in them
1132 _DeleteBankItems(trans, true);
1133
1134 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_ITEMS);
1135 stmt->SetData(0, m_id);
1136 trans->Append(stmt);
1137
1138 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_RIGHTS);
1139 stmt->SetData(0, m_id);
1140 trans->Append(stmt);
1141
1142 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_EVENTLOGS);
1143 stmt->SetData(0, m_id);
1144 trans->Append(stmt);
1145
1146 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_EVENTLOGS);
1147 stmt->SetData(0, m_id);
1148 trans->Append(stmt);
1149
1150 CharacterDatabase.CommitTransaction(trans);
1151 sGuildMgr->RemoveGuild(m_id);
1152}
@ 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:158
void DeleteMember(ObjectGuid guid, bool isDisbanding=false, bool isKicked=false, bool canDeleteGuild=false)
Definition: Guild.cpp:2252

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
820{ 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
821{ return tabId < m_bankTabs.size() ? &m_bankTabs[tabId] : nullptr; }

References m_bankTabs.

◆ GetCreatedDate()

time_t Guild::GetCreatedDate ( ) const
inline

◆ GetId()

◆ GetInfo()

std::string const & Guild::GetInfo ( ) const
inline
693{ return m_info; }

References m_info.

Referenced by guild_commandscript::HandleGuildInfoCommand().

◆ GetLeaderGUID()

◆ GetMember() [1/3]

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

References ObjectGuid::GetCounter(), and m_members.

◆ GetMember() [2/3]

◆ GetMember() [3/3]

Member * Guild::GetMember ( std::string_view  name)
inline
395 {
396 for (auto& m_member : m_members)
397 if (m_member.second.GetName() == name)
398 return &m_member.second;
399
400 return nullptr;
401 }

References m_members.

◆ GetMemberCount()

uint32 Guild::GetMemberCount ( ) const
inline

◆ GetMemberSize()

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

References m_members.

◆ GetMOTD()

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

References m_motd.

Referenced by guild_commandscript::HandleGuildInfoCommand().

◆ GetName()

◆ GetRankInfo() [1/2]

RankInfo * Guild::GetRankInfo ( uint8  rankId)
inlineprivate
808{ 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)
1492{
1493 Player* player = session->GetPlayer();
1494 if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && player->GetTeamId() != sCharacterCache->GetCharacterTeamByGuid(GetLeaderGUID()))
1495 {
1496 return;
1497 }
1498
1499 AddMember(player->GetGUID());
1500}
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD
Definition: IWorld.h:81
TeamId GetTeamId(bool original=false) const
Definition: Player.h:2072
ObjectGuid GetLeaderGUID() const
Definition: Guild.h:690

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 
)
1618{
1619 uint8 size = _GetRanksSize();
1620 if (size >= GUILD_RANKS_MAX_COUNT)
1621 return;
1622
1623 // Only leader can add new rank
1624 if (_IsLeader(session->GetPlayer()))
1626 _BroadcastEvent(GE_RANK_UPDATED, ObjectGuid::Empty, std::to_string(size), name, std::to_string(m_ranks.size()));
1627}
@ GE_RANK_UPDATED
Definition: Guild.h:160
bool _IsLeader(Player *player) const
Definition: Guild.cpp:2448

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

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

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)
1748{
1749 // Only leader can disband guild
1750 if (_IsLeader(session->GetPlayer()))
1751 {
1752 Disband();
1753 LOG_DEBUG("guild", "Guild Successfully Disbanded");
1754 delete this;
1755 }
1756}

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

◆ HandleInviteMember()

void Guild::HandleInviteMember ( WorldSession session,
std::string const &  name 
)
1430{
1431 Player* pInvitee = ObjectAccessor::FindPlayerByName(name, false);
1432 if (!pInvitee)
1433 {
1435 return;
1436 }
1437
1438 Player* player = session->GetPlayer();
1439 // Do not show invitations from ignored players
1440 if (pInvitee->GetSocial()->HasIgnore(player->GetGUID()))
1441 return;
1442
1443 uint32 memberLimit = sConfigMgr->GetOption<uint32>("Guild.MemberLimit", 0);
1444 if (memberLimit > 0 && player->GetGuild()->GetMemberCount() >= memberLimit)
1445 {
1446 ChatHandler(player->GetSession()).PSendSysMessage("Your guild has reached the maximum amount of members (%u). You cannot send another invite until the guild member count is lower.", memberLimit);
1448 return;
1449 }
1450
1451 if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && pInvitee->GetTeamId(true) != player->GetTeamId(true))
1452 {
1454 return;
1455 }
1456 // Invited player cannot be in another guild
1457 if (pInvitee->GetGuildId())
1458 {
1460 return;
1461 }
1462 // Invited player cannot be invited
1463 if (pInvitee->GetGuildIdInvited())
1464 {
1466 return;
1467 }
1468 // Inviting player must have rights to invite
1469 if (!_HasRankRight(player, GR_RIGHT_INVITE))
1470 {
1472 return;
1473 }
1474
1476
1477 LOG_DEBUG("guild", "Player {} invited {} to join his Guild", player->GetName(), pInvitee->GetName());
1478
1479 pInvitee->SetGuildIdInvited(m_id);
1480 _LogEvent(GUILD_EVENT_LOG_INVITE_PLAYER, player->GetGUID(), pInvitee->GetGUID());
1481
1483
1484 invite.InviterName = player->GetName();
1485 invite.GuildName = GetName();
1486
1487 pInvitee->SendDirectMessage(invite.Write());
1488 LOG_DEBUG("guild", "SMSG_GUILD_INVITE [{}]", pInvitee->GetName());
1489}
#define sConfigMgr
Definition: Config.h:95
@ GUILD_COMMAND_INVITE
Definition: Guild.h:103
@ ERR_GUILD_PERMISSIONS
Definition: Guild.h:131
@ ERR_ALREADY_IN_GUILD_S
Definition: Guild.h:125
@ ERR_GUILD_COMMAND_SUCCESS
Definition: Guild.h:122
@ ERR_GUILD_NOT_ALLIED
Definition: Guild.h:135
@ ERR_GUILD_INTERNAL
Definition: Guild.h:123
@ ERR_GUILD_PLAYER_NOT_FOUND_S
Definition: Guild.h:134
@ ERR_ALREADY_INVITED_TO_GUILD_S
Definition: Guild.h:127
@ GR_RIGHT_INVITE
Definition: Guild.h:84
@ GUILD_EVENT_LOG_INVITE_PLAYER
Definition: Guild.h:213
Player * FindPlayerByName(std::string const &name, bool checkInWorld=true)
Definition: ObjectAccessor.cpp:274
Definition: Chat.h:38
void PSendSysMessage(char const *fmt, Args &&... args)
Definition: Chat.h:60
uint32 GetGuildIdInvited()
Definition: Player.h:1866
Guild * GetGuild() const
Definition: Player.cpp:15923
PlayerSocial * GetSocial()
Definition: Player.h:1131
bool HasIgnore(ObjectGuid ignore_guid) const
Definition: SocialMgr.cpp:193
uint32 GetMemberCount() const
Definition: Guild.h:774
std::string const & GetName() const
Definition: Guild.h:691
static void SendCommandResult(WorldSession *session, GuildCommandType type, GuildCommandError errCode, std::string_view param={})
Definition: Guild.cpp:114
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

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)
1503{
1504 Player* player = session->GetPlayer();
1505 bool disband = false;
1506
1507 // If leader is leaving
1508 if (_IsLeader(player))
1509 {
1510 if (m_members.size() > 1)
1511 // Leader cannot leave if he is not the last member
1513 else
1514 {
1515 // Guild is disbanded if leader leaves.
1516 Disband();
1517 disband = true;
1518 }
1519 }
1520 else
1521 {
1522 DeleteMember(player->GetGUID(), false, false);
1523
1525 _BroadcastEvent(GE_LEFT, player->GetGUID(), player->GetName());
1526
1528 }
1529
1530 sCalendarMgr->RemovePlayerGuildEventsAndSignups(player->GetGUID(), GetId());
1531
1532 if (disband)
1533 delete this;
1534}
#define sCalendarMgr
Definition: CalendarMgr.h:344
@ GUILD_COMMAND_QUIT
Definition: Guild.h:104
@ ERR_GUILD_LEADER_LEAVE
Definition: Guild.h:130
@ GUILD_EVENT_LOG_LEAVE_GUILD
Definition: Guild.h:218
uint32 GetId() const
Definition: Guild.h:689

References _BroadcastEvent(), _IsLeader(), _LogEvent(), DeleteMember(), Disband(), ERR_GUILD_COMMAND_SUCCESS, ERR_GUILD_LEADER_LEAVE, GE_LEFT, Object::GetGUID(), GetId(), WorldObject::GetName(), WorldSession::GetPlayer(), GUILD_COMMAND_QUIT, GUILD_EVENT_LOG_LEAVE_GUILD, m_members, m_name, sCalendarMgr, and SendCommandResult().

◆ HandleMemberDepositMoney()

void Guild::HandleMemberDepositMoney ( WorldSession session,
uint32  amount 
)
1658{
1659 Player* player = session->GetPlayer();
1660
1661 // Call script after validation and before money transfer.
1662 sScriptMgr->OnGuildMemberDepositMoney(this, player, amount);
1663
1664 if (m_bankMoney > GUILD_BANK_MONEY_LIMIT - amount)
1665 {
1667 return;
1668 }
1669
1670 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1671 _ModifyBankMoney(trans, amount, true);
1672
1673 player->ModifyMoney(-int32(amount));
1674 player->SaveGoldToDB(trans);
1675 _LogBankEvent(trans, GUILD_BANK_LOG_DEPOSIT_MONEY, uint8(0), player->GetGUID(), amount);
1676
1677 CharacterDatabase.CommitTransaction(trans);
1678
1679 std::string aux = Acore::Impl::ByteArrayToHexStr(reinterpret_cast<uint8*>(&m_bankMoney), 8, true);
1681
1682 if (amount > 10 * GOLD) // receiver_acc = Guild id, receiver_name = Guild name
1683 CharacterDatabase.Execute("INSERT INTO log_money VALUES({}, {}, \"{}\", \"{}\", {}, \"{}\", {}, \"(guild members: {}, new amount: {}, leader guid low: {}, sender level: {})\", NOW(), {})",
1684 session->GetAccountId(), player->GetGUID().GetCounter(), player->GetName(), session->GetRemoteAddress(), GetId(), GetName(), amount, GetMemberCount(), GetTotalBankMoney(), GetLeaderGUID().GetCounter(), player->GetLevel(), 3);
1685}
@ GE_BANK_MONEY_SET
Definition: Guild.h:167
constexpr uint64 GUILD_BANK_MONEY_LIMIT
Definition: Guild.h:57
@ GUILD_COMMAND_MOVE_ITEM
Definition: Guild.h:116
@ ERR_GUILD_BANK_FULL
Definition: Guild.h:144
@ GUILD_BANK_LOG_DEPOSIT_MONEY
Definition: Guild.h:203
@ GOLD
Definition: SharedDefines.h:253
AC_COMMON_API std::string ByteArrayToHexStr(uint8 const *bytes, size_t length, bool reverse=false)
Definition: Util.cpp:540
void SaveGoldToDB(CharacterDatabaseTransaction trans)
Definition: PlayerStorage.cpp:7150
uint8 GetLevel() const
Definition: Unit.h:1432
bool _ModifyBankMoney(CharacterDatabaseTransaction trans, uint64 amount, bool add)
Definition: Guild.cpp:2466
void _LogBankEvent(CharacterDatabaseTransaction trans, GuildBankEventLogTypes eventType, uint8 tabId, ObjectGuid playerGuid, uint32 itemOrMoney, uint16 itemStackCount=0, uint8 destTabId=0)
Definition: Guild.cpp:2610
uint64 GetTotalBankMoney() const
Definition: Guild.h:773
uint32 GetAccountId() const
Definition: WorldSession.h:363
std::string const & GetRemoteAddress()
Definition: WorldSession.h:373

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)
1736{
1737 Player* player = session->GetPlayer();
1738 if (Member* member = GetMember(player->GetGUID()))
1739 {
1740 member->SetStats(player);
1741 member->UpdateLogoutTime();
1742 member->ResetFlags();
1743 }
1744 _BroadcastEvent(GE_SIGNED_OFF, player->GetGUID(), player->GetName());
1745}
@ GE_SIGNED_OFF
Definition: Guild.h:163

References _BroadcastEvent(), GE_SIGNED_OFF, Object::GetGUID(), GetMember(), WorldObject::GetName(), and WorldSession::GetPlayer().

◆ HandleMemberWithdrawMoney()

bool Guild::HandleMemberWithdrawMoney ( WorldSession session,
uint32  amount,
bool  repair = false 
)
1688{
1689 //clamp amount to MAX_MONEY_AMOUNT, Players can't hold more than that anyway
1690 amount = std::min(amount, uint32(MAX_MONEY_AMOUNT));
1691
1692 if (m_bankMoney < amount) // Not enough money in bank
1693 return false;
1694
1695 Player* player = session->GetPlayer();
1696
1697 Member* member = GetMember(player->GetGUID());
1698 if (!member)
1699 return false;
1700
1701 if (uint32(_GetMemberRemainingMoney(*member)) < amount) // Check if we have enough slot/money today
1702 return false;
1703
1704 // Call script after validation and before money transfer.
1705 sScriptMgr->OnGuildMemberWitdrawMoney(this, player, amount, repair);
1706
1707 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1708 // Add money to player (if required)
1709 if (!repair)
1710 {
1711 if (!player->ModifyMoney(amount))
1712 return false;
1713
1714 player->SaveGoldToDB(trans);
1715 }
1716
1717 // Update remaining money amount
1718 member->UpdateBankWithdrawValue(trans, GUILD_BANK_MAX_TABS, amount);
1719 // Remove money from bank
1720 _ModifyBankMoney(trans, amount, false);
1721
1722 // Log guild bank event
1724 CharacterDatabase.CommitTransaction(trans);
1725
1726 if (amount > 10 * GOLD) // sender_acc = 0 (guild has no account), sender_guid = Guild id, sender_name = Guild name
1727 CharacterDatabase.Execute("INSERT INTO log_money VALUES({}, {}, \"{}\", \"{}\", {}, \"{}\", {}, \"(guild, members: {}, new amount: {}, leader guid low: {}, withdrawer level: {})\", NOW(), {})",
1728 0, GetId(), GetName(), session->GetRemoteAddress(), session->GetAccountId(), player->GetName(), amount, GetMemberCount(), GetTotalBankMoney(), GetLeaderGUID().GetCounter(), player->GetLevel(), 4);
1729
1730 std::string aux = Acore::Impl::ByteArrayToHexStr(reinterpret_cast<uint8*>(&m_bankMoney), 8, true);
1732 return true;
1733}
#define MAX_MONEY_AMOUNT
Definition: Player.h:922
@ GUILD_BANK_LOG_WITHDRAW_MONEY
Definition: Guild.h:204
@ GUILD_BANK_LOG_REPAIR_MONEY
Definition: Guild.h:205
int32 _GetMemberRemainingMoney(Member const &member) const
Definition: Guild.cpp:2561

References _BroadcastEvent(), _GetMemberRemainingMoney(), _LogBankEvent(), _ModifyBankMoney(), Acore::Impl::ByteArrayToHexStr(), CharacterDatabase, ObjectGuid::Empty, GE_BANK_MONEY_SET, WorldSession::GetAccountId(), Object::GetGUID(), GetId(), GetLeaderGUID(), Unit::GetLevel(), GetMember(), GetMemberCount(), WorldObject::GetName(), GetName(), WorldSession::GetPlayer(), WorldSession::GetRemoteAddress(), GetTotalBankMoney(), GOLD, 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)
1247{
1249 response.GuildId = m_id;
1250
1256
1257 for (uint8 i = 0; i < _GetRanksSize(); ++i)
1258 response.Info.Ranks[i] = m_ranks[i].GetName();
1259
1260 response.Info.RankCount = _GetRanksSize();
1261
1262 response.Info.GuildName = m_name;
1263
1264 session->SendPacket(response.Write());
1265 LOG_DEBUG("guild", "SMSG_GUILD_QUERY_RESPONSE [{}]", session->GetPlayerInfo());
1266}
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
Definition: GuildPackets.h:56
uint32 GuildId
Definition: GuildPackets.h:62
GuildInfo Info
Definition: GuildPackets.h:63
WorldPacket const * Write() override
Definition: GuildPackets.cpp:28

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

References _GetLowestRankId(), and HandleRemoveRank().

◆ HandleRemoveMember()

void Guild::HandleRemoveMember ( WorldSession session,
std::string_view  name 
)
1537{
1538 Player* player = session->GetPlayer();
1539 // Player must have rights to remove members
1540 if (!_HasRankRight(player, GR_RIGHT_REMOVE))
1542 else if (Member* member = GetMember(name))
1543 {
1544 // Guild masters cannot be removed
1545 if (member->IsRank(GR_GUILDMASTER))
1547 // Do not allow to remove player with the same rank or higher
1548 else
1549 {
1550 Member const* memberMe = GetMember(player->GetGUID());
1551 if (!memberMe || member->IsRankNotLower(memberMe->GetRankId()))
1553 else
1554 {
1555 ObjectGuid guid = member->GetGUID();
1556 // After call to DeleteMember pointer to member becomes invalid
1557 DeleteMember(guid, false, true);
1559 _BroadcastEvent(GE_REMOVED, ObjectGuid::Empty, member->GetName(), player->GetName());
1560 }
1561 }
1562 }
1563}
@ GE_REMOVED
Definition: Guild.h:155
@ GUILD_COMMAND_REMOVE
Definition: Guild.h:108
@ ERR_GUILD_RANK_TOO_HIGH_S
Definition: Guild.h:136
@ GR_RIGHT_REMOVE
Definition: Guild.h:85
@ GUILD_EVENT_LOG_UNINVITE_PLAYER
Definition: Guild.h:217

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 
)
1635{
1636 // Cannot remove rank if total count is minimum allowed by the client or is not leader
1637 if (_GetRanksSize() <= GUILD_RANKS_MIN_COUNT || rankId >= _GetRanksSize() || !_IsLeader(session->GetPlayer()))
1638 return;
1639
1640 // Delete bank rights for rank
1642 stmt->SetData(0, m_id);
1643 stmt->SetData(1, rankId);
1644 CharacterDatabase.Execute(stmt);
1645 // Delete rank
1646 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_LOWEST_RANK);
1647 stmt->SetData(0, m_id);
1648 stmt->SetData(1, rankId);
1649 CharacterDatabase.Execute(stmt);
1650
1651 // match what the sql statement does
1652 m_ranks.erase(m_ranks.begin() + rankId, m_ranks.end());
1653
1654 _BroadcastEvent(GE_RANK_DELETED, ObjectGuid::Empty, std::to_string(m_ranks.size()));
1655}
@ 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:161
@ GUILD_RANKS_MIN_COUNT
Definition: Guild.h:48

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)
1200{
1202
1203 roster.RankData.reserve(m_ranks.size());
1204 for (RankInfo const& rank : m_ranks)
1205 {
1206 WorldPackets::Guild::GuildRankData& rankData = roster.RankData.emplace_back();
1207
1208 rankData.Flags = rank.GetRights();
1209 rankData.WithdrawGoldLimit = rank.GetBankMoneyPerDay();
1210 for (uint8 i = 0; i < GUILD_BANK_MAX_TABS; ++i)
1211 {
1212 rankData.TabFlags[i] = rank.GetBankTabRights(i);
1213 rankData.TabWithdrawItemLimit[i] = rank.GetBankTabSlotsPerDay(i);
1214 }
1215 }
1216
1217 bool sendOfficerNote = _HasRankRight(session->GetPlayer(), GR_RIGHT_VIEWOFFNOTE);
1218 roster.MemberData.reserve(m_members.size());
1219 for (auto const& [guid, member] : m_members)
1220 {
1221 WorldPackets::Guild::GuildRosterMemberData& memberData = roster.MemberData.emplace_back();
1222
1223 memberData.Guid = member.GetGUID();
1224 memberData.RankID = int32(member.GetRankId());
1225 memberData.AreaID = int32(member.GetZoneId());
1226 memberData.LastSave = float(float(GameTime::GetGameTime().count() - member.GetLogoutTime()) / DAY);
1227
1228 memberData.Status = member.GetFlags();
1229 memberData.Level = member.GetLevel();
1230 memberData.ClassID = member.GetClass();
1231 memberData.Gender = member.GetGender();
1232
1233 memberData.Name = member.GetName();
1234 memberData.Note = member.GetPublicNote();
1235 if (sendOfficerNote)
1236 memberData.OfficerNote = member.GetOfficerNote();
1237 }
1238
1239 roster.WelcomeText = m_motd;
1240 roster.InfoText = m_info;
1241
1242 LOG_DEBUG("guild", "SMSG_GUILD_ROSTER [{}]", session->GetPlayerInfo());
1243 session->SendPacket(roster.Write());
1244}
constexpr auto DAY
Definition: Common.h:51
@ GR_RIGHT_VIEWOFFNOTE
Definition: Guild.h:90
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
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: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

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 
)
1350{
1351 BankTab* tab = GetBankTab(tabId);
1352 if (!tab)
1353 {
1354 LOG_ERROR("guild", "Guild::HandleSetBankTabInfo: Player {} trying to change bank tab info from unexisting tab {}.",
1355 session->GetPlayerInfo(), tabId);
1356 return;
1357 }
1358
1359 tab->SetInfo(name, icon);
1360 _BroadcastEvent(GE_BANK_TAB_UPDATED, ObjectGuid::Empty, std::to_string(tabId), tab->GetName(), tab->GetIcon());
1361}
@ GE_BANK_TAB_UPDATED
Definition: Guild.h:166

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 
)
1311{
1312 Player* player = session->GetPlayer();
1313 if (!_IsLeader(player))
1314 SendSaveEmblemResult(session, ERR_GUILDEMBLEM_NOTGUILDMASTER); // "Only guild leaders can create emblems."
1315 else if (!player->HasEnoughMoney(EMBLEM_PRICE))
1316 SendSaveEmblemResult(session, ERR_GUILDEMBLEM_NOTENOUGHMONEY); // "You can't afford to do that."
1317 else
1318 {
1319 player->ModifyMoney(-int32(EMBLEM_PRICE));
1320
1321 m_emblemInfo = emblemInfo;
1323
1324 SendSaveEmblemResult(session, ERR_GUILDEMBLEM_SUCCESS); // "Guild Emblem saved."
1325
1326 HandleQuery(session);
1327 }
1328}
#define EMBLEM_PRICE
Definition: Guild.cpp:41
@ ERR_GUILDEMBLEM_NOTGUILDMASTER
Definition: Guild.h:226
@ ERR_GUILDEMBLEM_NOTENOUGHMONEY
Definition: Guild.h:227
@ ERR_GUILDEMBLEM_SUCCESS
Definition: Guild.h:223
void SaveToDB(uint32 guildId) const
Definition: Guild.cpp:701
void HandleQuery(WorldSession *session)
Definition: Guild.cpp:1246
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 
)
1292{
1293 if (m_info == info)
1294 return;
1295
1296 // Player must have rights to set guild's info
1298 {
1299 m_info = info;
1300
1301 sScriptMgr->OnGuildInfoChanged(this, m_info);
1302
1304 stmt->SetData(0, m_info);
1305 stmt->SetData(1, m_id);
1306 CharacterDatabase.Execute(stmt);
1307 }
1308}
@ CHAR_UPD_GUILD_INFO
Definition: CharacterDatabase.h:169
@ GR_RIGHT_MODIFY_GUILD_INFO
Definition: Guild.h:92

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 
)
1331{
1332 Player* player = session->GetPlayer();
1333 // Only leader can assign new leader
1334 if (!_IsLeader(player))
1336 // Old leader must be a member of guild
1337 else if (Member* pOldLeader = GetMember(player->GetGUID()))
1338 {
1339 // New leader must be a member of guild
1340 if (Member* pNewLeader = GetMember(name))
1341 {
1342 _SetLeaderGUID(*pNewLeader);
1343 pOldLeader->ChangeRank(GR_OFFICER);
1344 _BroadcastEvent(GE_LEADER_CHANGED, ObjectGuid::Empty, player->GetName(), pNewLeader->GetName());
1345 }
1346 }
1347}
@ GUILD_COMMAND_CHANGE_LEADER
Definition: Guild.h:109
@ GR_OFFICER
Definition: Guild.h:69

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 
)
1364{
1365 // Player must have rights to set public/officer note
1366 if (!_HasRankRight(session->GetPlayer(), isPublic ? GR_RIGHT_EPNOTE : GR_RIGHT_EOFFNOTE))
1368 else if (Member* member = GetMember(name))
1369 {
1370 if (isPublic)
1371 member->SetPublicNote(note);
1372 else
1373 member->SetOfficerNote(note);
1374
1375 HandleRoster(session);
1376 }
1377}
@ GUILD_COMMAND_PUBLIC_NOTE
Definition: Guild.h:114
@ GR_RIGHT_EOFFNOTE
Definition: Guild.h:91
@ GR_RIGHT_EPNOTE
Definition: Guild.h:89
void HandleRoster(WorldSession *session)
Definition: Guild.cpp:1199

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 
)
1269{
1270 if (m_motd == motd)
1271 return;
1272
1273 // Player must have rights to set MOTD
1274 if (!_HasRankRight(session->GetPlayer(), GR_RIGHT_SETMOTD))
1276 else
1277 {
1278 m_motd = motd;
1279
1280 sScriptMgr->OnGuildMOTDChanged(this, m_motd);
1281
1283 stmt->SetData(0, m_motd);
1284 stmt->SetData(1, m_id);
1285 CharacterDatabase.Execute(stmt);
1286
1288 }
1289}
@ CHAR_UPD_GUILD_MOTD
Definition: CharacterDatabase.h:168
@ GE_MOTD
Definition: Guild.h:152
@ GUILD_COMMAND_EDIT_MOTD
Definition: Guild.h:110
@ GR_RIGHT_SETMOTD
Definition: Guild.h:88

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 
)
1380{
1381 // Only leader can modify ranks
1382 if (!_IsLeader(session->GetPlayer()))
1384 else if (RankInfo* rankInfo = GetRankInfo(rankId))
1385 {
1386 rankInfo->SetName(name);
1387 rankInfo->SetRights(rights);
1388 _SetRankBankMoneyPerDay(rankId, moneyPerDay);
1389
1390 for (auto& rightsAndSlot : rightsAndSlots)
1391 _SetRankBankTabRightsAndSlots(rankId, rightsAndSlot);
1392
1393 _BroadcastEvent(GE_RANK_UPDATED, ObjectGuid::Empty, std::to_string(rankId), rankInfo->GetName(), std::to_string(m_ranks.size()));
1394
1395 LOG_DEBUG("guild", "Changed RankName to '{}', rights to 0x{:08X}", rankInfo->GetName(), rights);
1396 }
1397}
@ GUILD_COMMAND_CHANGE_RANK
Definition: Guild.h:113
void _SetRankBankTabRightsAndSlots(uint8 rankId, GuildBankRightsAndSlots rightsAndSlots, bool saveToDB=true)
Definition: Guild.cpp:2502
void _SetRankBankMoneyPerDay(uint8 rankId, uint32 moneyPerDay)
Definition: Guild.cpp:2496

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 
)
1566{
1567 Player* player = session->GetPlayer();
1569 // Player must have rights to promote
1570 if (!_HasRankRight(player, demote ? GR_RIGHT_DEMOTE : GR_RIGHT_PROMOTE))
1572 // Promoted player must be a member of guild
1573 else if (Member* member = GetMember(name))
1574 {
1575 // Player cannot promote himself
1576 if (member->IsSamePlayer(player->GetGUID()))
1577 {
1579 return;
1580 }
1581
1582 Member const* memberMe = GetMember(player->GetGUID());
1583 uint8 rankId = memberMe->GetRankId();
1584 if (demote)
1585 {
1586 // Player can demote only lower rank members
1587 if (member->IsRankNotLower(rankId))
1588 {
1589 SendCommandResult(session, type, ERR_GUILD_RANK_TOO_HIGH_S, name);
1590 return;
1591 }
1592 // Lowest rank cannot be demoted
1593 if (member->GetRankId() >= _GetLowestRankId())
1594 {
1595 SendCommandResult(session, type, ERR_GUILD_RANK_TOO_LOW_S, name);
1596 return;
1597 }
1598 }
1599 else
1600 {
1601 // Allow to promote only to lower rank than member's rank
1602 // member->GetRankId() + 1 is the highest rank that current player can promote to
1603 if (member->IsRankNotLower(rankId + 1))
1604 {
1605 SendCommandResult(session, type, ERR_GUILD_RANK_TOO_HIGH_S, name);
1606 return;
1607 }
1608 }
1609
1610 uint32 newRankId = member->GetRankId() + (demote ? 1 : -1);
1611 member->ChangeRank(newRankId);
1612 _LogEvent(demote ? GUILD_EVENT_LOG_DEMOTE_PLAYER : GUILD_EVENT_LOG_PROMOTE_PLAYER, player->GetGUID(), member->GetGUID(), newRankId);
1613 _BroadcastEvent(demote ? GE_DEMOTION : GE_PROMOTION, ObjectGuid::Empty, player->GetName(), member->GetName(), _GetRankName(newRankId));
1614 }
1615}
@ GE_PROMOTION
Definition: Guild.h:150
@ GE_DEMOTION
Definition: Guild.h:151
GuildCommandType
Definition: Guild.h:101
@ GUILD_COMMAND_PROMOTE
Definition: Guild.h:106
@ GUILD_COMMAND_DEMOTE
Definition: Guild.h:107
@ ERR_GUILD_RANK_TOO_LOW_S
Definition: Guild.h:137
@ ERR_GUILD_NAME_INVALID
Definition: Guild.h:128
@ GR_RIGHT_DEMOTE
Definition: Guild.h:87
@ GR_RIGHT_PROMOTE
Definition: Guild.h:86
@ GUILD_EVENT_LOG_PROMOTE_PLAYER
Definition: Guild.h:215
@ GUILD_EVENT_LOG_DEMOTE_PLAYER
Definition: Guild.h:216
std::string _GetRankName(uint8 rankId) const
Definition: Guild.cpp:2511

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)
1974{
1975 uint8 dbTabId = fields[1].Get<uint8>();
1976 bool isMoneyTab = (dbTabId == GUILD_BANK_MONEY_LOGS_TAB);
1977 if (dbTabId < _GetPurchasedTabsSize() || isMoneyTab)
1978 {
1979 uint8 tabId = isMoneyTab ? uint8(GUILD_BANK_MAX_TABS) : dbTabId;
1980 LogHolder<BankEventLogEntry>& bankLog = m_bankEventLog[tabId];
1981 if (bankLog.CanInsert())
1982 {
1983 ObjectGuid::LowType guid = fields[2].Get<uint32>();
1984 GuildBankEventLogTypes eventType = GuildBankEventLogTypes(fields[3].Get<uint8>());
1985 if (BankEventLogEntry::IsMoneyEvent(eventType))
1986 {
1987 if (!isMoneyTab)
1988 {
1989 LOG_ERROR("guild", "GuildBankEventLog ERROR: MoneyEvent(LogGuid: {}, Guild: {}) does not belong to money tab ({}), ignoring...", guid, m_id, dbTabId);
1990 return false;
1991 }
1992 }
1993 else if (isMoneyTab)
1994 {
1995 LOG_ERROR("guild", "GuildBankEventLog ERROR: non-money event (LogGuid: {}, Guild: {}) belongs to money tab, ignoring...", guid, m_id);
1996 return false;
1997 }
1998 bankLog.LoadEvent(
1999 m_id, // guild id
2000 guid, // guid
2001 time_t(fields[8].Get<uint32>()), // timestamp
2002 dbTabId, // tab id
2003 eventType, // event type
2004 ObjectGuid::Create<HighGuid::Player>(fields[4].Get<uint32>()), // player guid
2005 fields[5].Get<uint32>(), // item or money
2006 fields[6].Get<uint16>(), // itam stack count
2007 fields[7].Get<uint8>()); // dest tab id
2008 }
2009 }
2010 return true;
2011}
GuildBankEventLogTypes
Definition: Guild.h:199

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)
2023{
2024 uint8 tabId = fields[12].Get<uint8>();
2025 if (tabId >= _GetPurchasedTabsSize())
2026 {
2027 LOG_ERROR("guild", "Invalid tab for item (GUID: {}, id: #{}) in guild bank, skipped.",
2028 fields[14].Get<uint32>(), fields[15].Get<uint32>());
2029 return false;
2030 }
2031 return m_bankTabs[tabId].LoadItemFromDB(fields);
2032}

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

◆ LoadBankRightFromDB()

void Guild::LoadBankRightFromDB ( Field fields)
1949{
1950 // tabId rights slots
1951 GuildBankRightsAndSlots rightsAndSlots(fields[1].Get<uint8>(), fields[3].Get<uint8>(), fields[4].Get<uint32>());
1952 // rankId
1953 _SetRankBankTabRightsAndSlots(fields[2].Get<uint8>(), rightsAndSlots, false);
1954}
Definition: Guild.h:266

References _SetRankBankTabRightsAndSlots().

◆ LoadBankTabFromDB()

void Guild::LoadBankTabFromDB ( Field fields)
2014{
2015 uint8 tabId = fields[1].Get<uint8>();
2016 if (tabId >= _GetPurchasedTabsSize())
2017 LOG_ERROR("guild", "Invalid tab (tabId: {}) in guild bank, skipped.", tabId);
2018 else
2019 m_bankTabs[tabId].LoadFromDB(fields);
2020}

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

◆ LoadEventLogFromDB()

bool Guild::LoadEventLogFromDB ( Field fields)
1957{
1958 if (m_eventLog.CanInsert())
1959 {
1960 m_eventLog.LoadEvent(
1961 m_id, // guild id
1962 fields[1].Get<uint32>(), // guid
1963 time_t(fields[6].Get<uint32>()), // timestamp
1964 GuildEventLogTypes(fields[2].Get<uint8>()), // event type
1965 ObjectGuid::Create<HighGuid::Player>(fields[3].Get<uint32>()), // player guid 1
1966 ObjectGuid::Create<HighGuid::Player>(fields[4].Get<uint32>()), // player guid 2
1967 fields[5].Get<uint8>()); // rank
1968 return true;
1969 }
1970 return false;
1971}
GuildEventLogTypes
Definition: Guild.h:212

References m_eventLog, and m_id.

◆ LoadFromDB()

bool Guild::LoadFromDB ( Field fields)
1894{
1895 m_id = fields[0].Get<uint32>();
1896 m_name = fields[1].Get<std::string>();
1897 m_leaderGuid = ObjectGuid::Create<HighGuid::Player>(fields[2].Get<uint32>());
1898 m_emblemInfo.LoadFromDB(fields);
1899 m_info = fields[8].Get<std::string>();
1900 m_motd = fields[9].Get<std::string>();
1901 m_createdDate = time_t(fields[10].Get<uint32>());
1902 m_bankMoney = fields[11].Get<uint64>();
1903
1904 uint8 purchasedTabs = uint8(fields[12].Get<uint64>());
1905 if (purchasedTabs > GUILD_BANK_MAX_TABS)
1906 purchasedTabs = GUILD_BANK_MAX_TABS;
1907
1908 m_bankTabs.clear();
1909 m_bankTabs.reserve(purchasedTabs);
1910 for (uint8 i = 0; i < purchasedTabs; ++i)
1911 m_bankTabs.emplace_back(m_id, i);
1912 return true;
1913}
std::uint64_t uint64
Definition: Define.h:107
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)
1925{
1926 ObjectGuid::LowType lowguid = fields[1].Get<uint32>();
1927 ObjectGuid playerGuid(HighGuid::Player, lowguid);
1928
1929 auto [memberIt, isNew] = m_members.try_emplace(lowguid, m_id, playerGuid, fields[2].Get<uint8>());
1930 if (!isNew)
1931 {
1932 LOG_ERROR("guild", "Tried to add {} to guild '{}'. Member already exists.", playerGuid.ToString(), m_name);
1933 return false;
1934 }
1935
1936 Member& member = memberIt->second;
1937 if (!member.LoadFromDB(fields))
1938 {
1939 _DeleteMemberFromDB(lowguid);
1940 m_members.erase(memberIt);
1941 return false;
1942 }
1943
1944 sCharacterCache->UpdateCharacterGuildId(playerGuid, GetId());
1945 return true;
1946}

References _DeleteMemberFromDB(), Field::Get(), GetId(), Guild::Member::LoadFromDB(), LOG_ERROR, m_id, m_members, m_name, and sCharacterCache.

◆ LoadRankFromDB()

void Guild::LoadRankFromDB ( Field fields)
1916{
1917 RankInfo rankInfo(m_id);
1918
1919 rankInfo.LoadFromDB(fields);
1920
1921 m_ranks.push_back(rankInfo);
1922}

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

◆ MassInviteToEvent()

void Guild::MassInviteToEvent ( WorldSession session,
uint32  minLevel,
uint32  maxLevel,
uint32  minRank 
)
2136{
2137 uint32 count = 0;
2138
2140 data << uint32(count); // count placeholder
2141
2142 for (auto const& [guid, member] : m_members)
2143 {
2144 // not sure if needed, maybe client checks it as well
2145 if (count >= CALENDAR_MAX_INVITES)
2146 {
2147 if (Player* player = session->GetPlayer())
2148 sCalendarMgr->SendCalendarCommandResult(player->GetGUID(), CALENDAR_ERROR_INVITES_EXCEEDED);
2149 return;
2150 }
2151
2152 uint32 level = sCharacterCache->GetCharacterLevelByGuid(member.GetGUID());
2153
2154 if (member.GetGUID() != session->GetPlayer()->GetGUID() && level >= minLevel && level <= maxLevel && member.IsRankNotLower(minRank))
2155 {
2156 data.appendPackGUID(member.GetGUID().GetRawValue());
2157 data << uint8(0); // unk
2158 ++count;
2159 }
2160 }
2161
2162 data.put<uint32>(0, count);
2163
2164 session->SendPacket(&data);
2165}
@ 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
782{ return _ModifyBankMoney(trans, amount, add); }

References _ModifyBankMoney().

◆ OnPlayerStatusChange()

void Guild::OnPlayerStatusChange ( Player player,
uint32  flag,
bool  state 
)
1175{
1176 if (Member* member = GetMember(player->GetGUID()))
1177 {
1178 if (state)
1179 member->AddFlag(flag);
1180 else member->RemFlag(flag);
1181 }
1182}

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

◆ ResetTimes()

void Guild::ResetTimes ( )
2923{
2924 for (auto& [guid, member] : m_members)
2925 member.ResetValues();
2926
2928}
@ GE_BANK_TAB_AND_MONEY_UPDATED
Definition: Guild.h:168

References _BroadcastEvent(), ObjectGuid::Empty, GE_BANK_TAB_AND_MONEY_UPDATED, and m_members.

◆ SendBankLog()

void Guild::SendBankLog ( WorldSession session,
uint8  tabId 
) const
1786{
1787 // GUILD_BANK_MAX_TABS send by client for money log
1788 if (tabId < _GetPurchasedTabsSize() || tabId == GUILD_BANK_MAX_TABS)
1789 {
1790 std::list<BankEventLogEntry> const& bankEventLog = m_bankEventLog[tabId].GetGuildLog();
1791
1793 packet.Tab = tabId;
1794
1795 packet.Entry.reserve(bankEventLog.size());
1796 for (BankEventLogEntry const& entry : bankEventLog)
1797 entry.WritePacket(packet);
1798
1799 session->SendPacket(packet.Write());
1800 LOG_DEBUG("guild", "MSG_GUILD_BANK_LOG_QUERY [{}]", session->GetPlayerInfo());
1801 }
1802}
Definition: GuildPackets.h:546
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
1805{
1806 if (tabId < _GetPurchasedTabsSize())
1807 _SendBankContent(session, tabId, sendAllSlots);
1808}
void _SendBankContent(WorldSession *session, uint8 tabId, bool sendAllSlots) const
Definition: Guild.cpp:2741

References _GetPurchasedTabsSize(), and _SendBankContent().

◆ SendBankTabsInfo()

void Guild::SendBankTabsInfo ( WorldSession session,
bool  showTabs = false 
)
1811{
1812 Member* member = GetMember(session->GetPlayer()->GetGUID());
1813 if (!member)
1814 return;
1815
1816 member->SubscribeToGuildBankUpdatePackets();
1817
1818 _SendBankList(session, 0, sendAllSlots);
1819}

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

Referenced by WorldSession::HandleGuildBankerActivate().

◆ SendBankTabText()

void Guild::SendBankTabText ( WorldSession session,
uint8  tabId 
) const
1822{
1823 if (BankTab const* tab = GetBankTab(tabId))
1824 tab->SendText(this, session);
1825}

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
1772{
1773 std::list<EventLogEntry> const& eventLog = m_eventLog.GetGuildLog();
1774
1776 packet.Entry.reserve(eventLog.size());
1777
1778 for (EventLogEntry const& entry : eventLog)
1779 entry.WritePacket(packet);
1780
1781 session->SendPacket(packet.Write());
1782 LOG_DEBUG("guild", "MSG_GUILD_EVENT_LOG_QUERY [{}]", session->GetPlayerInfo());
1783}
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
1760{
1762 guildInfo.GuildName = m_name;
1763 guildInfo.CreateDate = m_createdDate;
1764 guildInfo.NumMembers = int32(m_members.size());
1765 guildInfo.NumAccounts = m_accountsNumber;
1766
1767 session->SendPacket(guildInfo.Write());
1768 LOG_DEBUG("guild", "SMSG_GUILD_INFO [{}]", session->GetPlayerInfo());
1769}
Definition: GuildPackets.h:85
time_t CreateDate
Definition: GuildPackets.h:92
int32 NumAccounts
Definition: GuildPackets.h:94
WorldPacket const * Write() override
Definition: GuildPackets.cpp:50
int32 NumMembers
Definition: GuildPackets.h:93
std::string GuildName
Definition: GuildPackets.h:91

References WorldPackets::Guild::GuildInfoResponse::CreateDate, WorldSession::GetPlayerInfo(), WorldPackets::Guild::GuildInfoResponse::GuildName, LOG_DEBUG, m_accountsNumber, m_createdDate, m_members, m_name, WorldPackets::Guild::GuildInfoResponse::NumAccounts, WorldPackets::Guild::GuildInfoResponse::NumMembers, WorldSession::SendPacket(), and WorldPackets::Guild::GuildInfoResponse::Write().

◆ SendLoginInfo()

void Guild::SendLoginInfo ( WorldSession session)
1872{
1874 motd.Type = GE_MOTD;
1875 motd.Params.emplace_back(m_motd);
1876 session->SendPacket(motd.Write());
1877
1878 LOG_DEBUG("guild", "SMSG_GUILD_EVENT [{}] MOTD", session->GetPlayerInfo());
1879
1880 Player* player = session->GetPlayer();
1881
1882 HandleRoster(session);
1883 _BroadcastEvent(GE_SIGNED_ON, player->GetGUID(), player->GetName());
1884
1885 if (Member* member = GetMember(player->GetGUID()))
1886 {
1887 member->SetStats(player);
1888 member->AddFlag(GUILDMEMBER_STATUS_ONLINE);
1889 }
1890}
@ GE_SIGNED_ON
Definition: Guild.h:162
@ GUILDMEMBER_STATUS_ONLINE
Definition: Guild.h:234
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
1857{
1858 Member const* member = GetMember(session->GetPlayer()->GetGUID());
1859 if (!member)
1860 return;
1861
1862 int32 amount = _GetMemberRemainingMoney(*member);
1863
1865 packet.RemainingWithdrawMoney = amount;
1866 session->SendPacket(packet.Write());
1867
1868 LOG_DEBUG("guild", "MSG_GUILD_BANK_MONEY_WITHDRAWN [{}] Money: {}", session->GetPlayerInfo(), amount);
1869}
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)
1828{
1829 Member* member = GetMember(session->GetPlayer()->GetGUID());
1830 if (!member)
1831 return;
1832
1833 // We are unsubscribing here since it is the only reliable way to handle /reload from player as
1834 // GuildPermissionsQuery is sent on each reload, and we don't want to send partial changes while client
1835 // doesn't know the full state
1836 member->UnsubscribeFromGuildBankUpdatePackets();
1837
1838 uint8 rankId = member->GetRankId();
1839
1841 queryResult.RankID = rankId;
1842 queryResult.WithdrawGoldLimit = _GetRankBankMoneyPerDay(rankId);
1843 queryResult.Flags = _GetRankRights(rankId);
1844 queryResult.NumTabs = _GetPurchasedTabsSize();
1845
1846 for (uint8 tabId = 0; tabId < GUILD_BANK_MAX_TABS; ++tabId)
1847 {
1848 queryResult.Tab[tabId].Flags = _GetRankBankTabRights(rankId, tabId);
1849 queryResult.Tab[tabId].WithdrawItemLimit = _GetMemberRemainingSlots(*member, tabId);
1850 }
1851
1852 session->SendPacket(queryResult.Write());
1853 LOG_DEBUG("guild", "MSG_GUILD_PERMISSIONS [{}] Rank: {}", session->GetPlayerInfo(), rankId);
1854}
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 
)
2365{
2366 if (BankTab* pTab = GetBankTab(tabId))
2367 {
2368 pTab->SetText(text);
2369 pTab->SendText(this, nullptr);
2370 }
2371}

References GetBankTab().

◆ SetName()

bool Guild::SetName ( std::string_view const &  name)
1185{
1186 if (m_name == name || name.empty() || name.length() > 24 || sObjectMgr->IsReservedName(name) || sObjectMgr->IsProfanityName(name) || !ObjectMgr::IsValidCharterName(name))
1187 {
1188 return false;
1189 }
1190
1191 m_name = name;
1193 stmt->SetData(0, m_name);
1194 stmt->SetData(1, GetId());
1195 CharacterDatabase.Execute(stmt);
1196 return true;
1197}
@ CHAR_UPD_GUILD_NAME
Definition: CharacterDatabase.h:142
static bool IsValidCharterName(std::string_view name)
Definition: ObjectMgr.cpp:8422

References CHAR_UPD_GUILD_NAME, CharacterDatabase, GetId(), ObjectMgr::IsValidCharterName(), m_name, PreparedStatementBase::SetData(), and sObjectMgr.

Referenced by guild_commandscript::HandleGuildRenameCommand().

◆ SwapItems()

void Guild::SwapItems ( Player player,
uint8  tabId,
uint8  slotId,
uint8  destTabId,
uint8  destSlotId,
uint32  splitedAmount 
)
2337{
2338 if (tabId >= _GetPurchasedTabsSize() || slotId >= GUILD_BANK_MAX_SLOTS ||
2339 destTabId >= _GetPurchasedTabsSize() || destSlotId >= GUILD_BANK_MAX_SLOTS)
2340 return;
2341
2342 if (tabId == destTabId && slotId == destSlotId)
2343 return;
2344
2345 BankMoveItemData from(this, player, tabId, slotId);
2346 BankMoveItemData to(this, player, destTabId, destSlotId);
2347 _MoveItems(&from, &to, splitedAmount);
2348}
void _MoveItems(MoveItemData *pSrc, MoveItemData *pDest, uint32 splitedAmount)
Definition: Guild.cpp:2644

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 
)
2351{
2352 if ((slotId >= GUILD_BANK_MAX_SLOTS && slotId != NULL_SLOT) || tabId >= _GetPurchasedTabsSize())
2353 return;
2354
2355 BankMoveItemData bankData(this, player, tabId, slotId);
2356 PlayerMoveItemData charData(this, player, playerBag, playerSlotId);
2357 if (toChar)
2358 _MoveItems(&bankData, &charData, splitedAmount);
2359 else
2360 _MoveItems(&charData, &bankData, splitedAmount);
2361}
@ NULL_SLOT
Definition: Unit.h:211

References _GetPurchasedTabsSize(), _MoveItems(), GUILD_BANK_MAX_SLOTS, and NULL_SLOT.

Referenced by WorldSession::HandleGuildBankSwapItems().

◆ UpdateMemberData()

void Guild::UpdateMemberData ( Player player,
uint8  dataid,
uint32  value 
)
1155{
1156 if (Member* member = GetMember(player->GetGUID()))
1157 {
1158 switch (dataid)
1159 {
1161 member->SetZoneID(value);
1162 break;
1164 member->SetLevel(value);
1165 break;
1166 default:
1167 LOG_ERROR("guild", "Guild::UpdateMemberData: Called with incorrect DATAID {} (value {})", dataid, value);
1168 return;
1169 }
1170 //HandleRoster();
1171 }
1172}
@ GUILD_MEMBER_DATA_LEVEL
Definition: Guild.h:62
@ GUILD_MEMBER_DATA_ZONEID
Definition: Guild.h:61

References Object::GetGUID(), GetMember(), GUILD_MEMBER_DATA_LEVEL, GUILD_MEMBER_DATA_ZONEID, and LOG_ERROR.

◆ Validate()

bool Guild::Validate ( )
2036{
2037 // Validate ranks data
2038 // GUILD RANKS represent a sequence starting from 0 = GUILD_MASTER (ALL PRIVILEGES) to max 9 (lowest privileges).
2039 // The lower rank id is considered higher rank - so promotion does rank-- and demotion does rank++
2040 // Between ranks in sequence cannot be gaps - so 0, 1, 2, 4 is impossible
2041 // Min ranks count is 5 and max is 10.
2042 bool broken_ranks = false;
2043 uint8 ranks = _GetRanksSize();
2044 if (ranks < GUILD_RANKS_MIN_COUNT || ranks > GUILD_RANKS_MAX_COUNT)
2045 {
2046 LOG_ERROR("guild", "Guild {} has invalid number of ranks, creating new...", m_id);
2047 broken_ranks = true;
2048 }
2049 else
2050 {
2051 for (uint8 rankId = 0; rankId < ranks; ++rankId)
2052 {
2053 RankInfo* rankInfo = GetRankInfo(rankId);
2054 if (rankInfo->GetId() != rankId)
2055 {
2056 LOG_ERROR("guild", "Guild {} has broken rank id {}, creating default set of ranks...", m_id, rankId);
2057 broken_ranks = true;
2058 }
2059 else
2060 {
2061 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2062 rankInfo->CreateMissingTabsIfNeeded(_GetPurchasedTabsSize(), trans, true);
2063 CharacterDatabase.CommitTransaction(trans);
2064 }
2065 }
2066 }
2067
2068 if (broken_ranks)
2069 {
2070 m_ranks.clear();
2072 }
2073
2074 // Validate members' data
2075 for (auto& [guid, member] : m_members)
2076 if (member.GetRankId() > _GetRanksSize())
2077 member.ChangeRank(_GetLowestRankId());
2078
2079 // Repair the structure of the guild.
2080 // If the guildmaster doesn't exist or isn't member of the guild
2081 // attempt to promote another member.
2082 Member* pLeader = GetMember(m_leaderGuid);
2083 if (!pLeader)
2084 {
2086 // If no more members left, disband guild
2087 if (m_members.empty())
2088 {
2089 Disband();
2090 return false;
2091 }
2092 }
2093 else if (!pLeader->IsRank(GR_GUILDMASTER))
2094 _SetLeaderGUID(*pLeader);
2095
2096 // Check config if multiple guildmasters are allowed
2097 if (!sConfigMgr->GetOption<bool>("Guild.AllowMultipleGuildMaster", 0))
2098 for (auto& [guid, member] : m_members)
2099 if ((member.GetRankId() == GR_GUILDMASTER) && !member.IsSamePlayer(m_leaderGuid))
2100 member.ChangeRank(GR_OFFICER);
2101
2103 return true;
2104}
#define DEFAULT_LOCALE
Definition: Common.h:81

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