40#include <boost/iterator/counting_iterator.hpp>
52 return "Member promotion";
54 return "Member demotion";
58 return "Member joined";
62 return "Member removed";
66 return "Leader changed";
68 return "Guild disbanded";
70 return "Tabard change";
72 return "Rank updated";
74 return "Rank deleted";
76 return "Member signed on";
78 return "Member signed off";
80 return "Bank bag slots changed";
82 return "Bank tab purchased";
84 return "Bank tab updated";
86 return "Bank money set";
88 return "Bank and money updated";
90 return "Bank tab text changed";
103 return tabPrices[tabId];
110 resultPacket.
Result = errCode;
111 resultPacket.
Name = param;
114 TC_LOG_DEBUG(
"guild",
"SMSG_GUILD_COMMAND_RESULT [{}]: Type: {}, code: {}, param: {}"
128template <
typename Entry>
133template <
typename Entry>
template <
typename... Ts>
136 Entry const& newEntry = m_log.emplace_front(std::forward<Ts>(args)...);
138 m_nextGUID = newEntry.GetGUID();
141template <
typename Entry>
template <
typename... Ts>
149 Entry const& entry = m_log.emplace_back(std::forward<Ts>(args)...);
151 entry.SaveToDB(trans);
154template <
typename Entry>
162 m_nextGUID = (m_nextGUID + 1) % m_maxRecords;
183 stmt->
setUInt8 (++index, m_newRank);
190 ObjectGuid playerGUID = ObjectGuid::Create<HighGuid::Player>(m_playerGuid1);
191 ObjectGuid otherGUID = ObjectGuid::Create<HighGuid::Player>(m_playerGuid2);
199 packet.
Entry.push_back(eventEntry);
210 stmt->
setUInt8 (++index, m_bankTabId);
217 stmt->
setUInt8 (++index, m_bankTabId);
221 stmt->
setUInt16(++index, m_itemStackCount);
222 stmt->
setUInt8 (++index, m_destTabId);
230 bankLogEntry.
PlayerGUID = ObjectGuid::Create<HighGuid::Player>(m_playerGuid);
252 packet.
Entry.push_back(bankLogEntry);
261 m_bankMoneyPerDay = fields[4].
GetUInt32();
279 for (
uint8 i = 0; i < tabs; ++i)
290 TC_LOG_ERROR(
"guild",
"Guild {} has broken Tab {} for rank {}. Created default tab.", m_guildId, i, m_rankId);
321 if (m_rights == rights)
338 if (m_bankMoneyPerDay == money)
341 m_bankMoneyPerDay = money;
356 guildBR = rightsAndSlots;
388 TC_LOG_ERROR(
"guild",
"Invalid slot for item (GUID: {}, id: {}) in guild bank, skipped.", itemGuid, itemEntry);
395 TC_LOG_ERROR(
"guild",
"Unknown item (GUID: {}, id: {}) in guild bank, skipped.", itemGuid, itemEntry);
402 TC_LOG_ERROR(
"guild",
"Item (GUID {}, id: {}) not found in item_instance, deleting from guild bank!", itemGuid, itemEntry);
415 m_items[slotId] = pItem;
424 if (
Item* pItem = m_items[slotId])
427 if (removeItemsFromDB)
428 pItem->DeleteFromDB(trans);
437 if ((
m_name == name) && (m_icon == icon))
473 m_items[slotId] = item;
502 textQuery.
Tab = m_tabId;
503 textQuery.
Text = m_text;
507 TC_LOG_DEBUG(
"guild",
"MSG_QUERY_GUILD_BANK_TEXT [{}]: Tabid: {}, Text: {}"
513 TC_LOG_DEBUG(
"guild",
"MSG_QUERY_GUILD_BANK_TEXT [Broadcast]: Tabid: {}, Text: {}", m_tabId, m_text);
527 m_logoutTime(
GameTime::GetGameTime()),
549 m_accountId = accountId;
554 if (m_publicNote == publicNote)
557 m_publicNote = publicNote;
567 if (m_officerNote == officerNote)
570 m_officerNote = officerNote;
583 if (
Player* player = FindConnectedPlayer())
584 player->SetGuildRank(newRank);
617 m_bankWithdraw[i] = fields[5 + i].GetUInt32();
619 SetStats(fields[12].GetString(),
620 fields[13].GetUInt8(),
621 fields[14].GetUInt8(),
622 fields[15].GetUInt8(),
623 fields[16].GetUInt16(),
624 fields[17].GetUInt32());
632 TC_LOG_DEBUG(
"guild",
"{} has broken zone-data", m_guid.ToString());
645 TC_LOG_ERROR(
"guild",
"{} has a broken data in field `characters`.`level`, deleting him from guild!", m_guid.ToString());
649 if (m_class < CLASS_WARRIOR || m_class >=
MAX_CLASSES)
651 TC_LOG_ERROR(
"guild",
"{} has a broken data in field `characters`.`class`, deleting him from guild!", m_guid.ToString());
672 m_bankWithdraw[tabId] += amount;
678 uint32 withdraw = m_bankWithdraw[i++];
688 m_bankWithdraw[tabId] = 0;
700 return m_bankWithdraw[tabId];
708 m_borderStyle = packet.
BStyle;
709 m_borderColor = packet.
BColor;
710 m_backgroundColor = packet.
Bg;
717 m_borderStyle = fields[5].
GetUInt8();
718 m_borderColor = fields[6].
GetUInt8();
719 m_backgroundColor = fields[7].
GetUInt8();
736m_container(container), m_slotId(slotId), m_pItem(nullptr), m_pClonedItem(nullptr)
747 if (splitedAmount > m_pItem->GetCount())
749 if (splitedAmount == m_pItem->GetCount())
759 m_pPlayer->SendEquipError(msg, pItem);
766 m_pClonedItem = m_pItem->CloneItem(count);
781 IsBank(), GetContainer(), GetSlotId());
786 for (
auto itr = m_vec.begin(); itr != m_vec.end(); ++itr)
787 ids.insert(
uint8(itr->pos));
793 m_pItem = m_pPlayer->GetItemByPos(m_container, m_slotId);
797 if (m_pItem->IsNotEmptyBag())
803 else if (!m_pItem->CanBeTraded())
809 return (m_pItem !=
nullptr);
816 m_pItem->SetCount(m_pItem->GetCount() - splitedAmount);
818 m_pPlayer->SaveInventoryAndGoldToDB(trans);
822 m_pPlayer->MoveItemFromInventory(m_container, m_slotId,
true);
823 m_pItem->DeleteFromInventoryDB(trans);
831 m_pPlayer->MoveItemToInventory(m_vec, pItem,
true);
832 m_pPlayer->SaveInventoryAndGoldToDB(trans);
846 return m_pPlayer->CanStoreItem(m_container, m_slotId, m_vec, pItem, swap);
852 m_pItem = m_pGuild->_GetItem(m_container, m_slotId);
853 return (m_pItem !=
nullptr);
873 if (
Member const* member = m_pGuild->GetMember(m_pPlayer->GetGUID()))
874 slots = m_pGuild->_GetMemberRemainingSlots(*member, m_container);
884 m_pItem->SetCount(m_pItem->GetCount() - splitedAmount);
886 m_pItem->SaveToDB(trans);
890 m_pGuild->_RemoveItem(trans, m_container, m_slotId);
895 m_pGuild->_UpdateMemberWithdrawSlots(trans, m_pPlayer->GetGUID(), m_container);
903 BankTab* pTab = m_pGuild->GetBankTab(m_container);
907 Item* pLastItem = pItem;
908 for (
auto itr = m_vec.begin(); itr != m_vec.end(); )
915 TC_LOG_DEBUG(
"guild",
"GUILD STORAGE: StoreItem tab = {}, slot = {}, item = {}, count = {}",
917 pLastItem = _StoreItem(trans, pTab, pItem, pos, itr != m_vec.end());
940 sLog->OutCommand(m_pPlayer->GetSession()->GetAccountId(),
941 "GM {} ({}) (Account: {}) deposit item: {} (Entry: {} Count: {}) to guild bank named: {} (Guild ID: {})",
942 m_pPlayer->GetName(), m_pPlayer->GetGUID().ToString(), m_pPlayer->GetSession()->GetAccountId(),
944 m_pGuild->GetName(), m_pGuild->GetId());
954 pItemDest->SetCount(pItemDest->GetCount() + count);
956 pItemDest->SaveToDB(trans);
971 if (pItem && pTab->
SetItem(trans, slotId, pItem))
989 requiredSpace -= pItemDest->
GetCount();
992 requiredSpace = std::min(requiredSpace, count);
998 m_vec.push_back(pos);
999 count -= requiredSpace;
1009 if (slotId == skipSlotId)
1012 Item* pItemDest = m_pGuild->_GetItem(m_container, slotId);
1013 if (pItemDest == pItem)
1014 pItemDest =
nullptr;
1017 if ((pItemDest !=
nullptr) != merge)
1020 _ReserveSpace(slotId, pItem, pItemDest, count);
1026 TC_LOG_DEBUG(
"guild",
"GUILD STORAGE: CanStore() tab = {}, slot = {}, item = {}, count = {}",
1035 if (m_container >= m_pGuild->_GetPurchasedTabsSize())
1041 Item* pItemDest = m_pGuild->_GetItem(m_container, m_slotId);
1043 if ((pItemDest == pItem) || swap)
1044 pItemDest =
nullptr;
1046 if (!_ReserveSpace(m_slotId, pItem, pItemDest, count))
1057 CanStoreItemInTab(pItem, m_slotId,
true, count);
1063 CanStoreItemInTab(pItem, m_slotId,
false, count);
1094 if (!pLeaderSession)
1101 m_motd =
"No message set.";
1105 TC_LOG_DEBUG(
"guild",
"GUILD: creating guild [{}] for leader {} {}",
1112 trans->Append(stmt);
1128 trans->Append(stmt);
1159 trans->Append(stmt);
1163 trans->Append(stmt);
1167 trans->Append(stmt);
1174 trans->Append(stmt);
1178 trans->Append(stmt);
1182 trans->Append(stmt);
1186 trans->Append(stmt);
1199 member->SetZoneID(value);
1202 member->SetLevel(value);
1205 TC_LOG_ERROR(
"guild",
"Guild::UpdateMemberData: Called with incorrect DATAID {} (value {})", dataid, value);
1217 member->AddFlag(flag);
1218 else member->RemFlag(flag);
1244 rankData.
Flags = rank.GetRights();
1248 rankData.
TabFlags[i] = rank.GetBankTabRights(i);
1255 for (
auto const& [guid, member] :
m_members)
1259 memberData.
Guid = member.GetGUID();
1264 memberData.
Status = member.GetFlags();
1265 memberData.
Level = member.GetLevel();
1266 memberData.
ClassID = member.GetClass();
1267 memberData.
Gender = member.GetGender();
1269 memberData.
Name = member.GetName();
1270 memberData.
Note = member.GetPublicNote();
1271 if (sendOfficerNote)
1380 if (!newGuildMaster)
1398 TC_LOG_ERROR(
"guild",
"Guild::HandleSetBankTabInfo: Player {} trying to change bank tab info from unexisting tab {}.",
1415 member->SetPublicNote(note);
1417 member->SetOfficerNote(note);
1430 rankInfo->SetName(name);
1431 rankInfo->SetRights(rights);
1434 for (
auto itr = rightsAndSlots.begin(); itr != rightsAndSlots.end(); ++itr)
1439 TC_LOG_DEBUG(
"guild",
"Changed RankName to '{}', rights to 0x{:08X}", rankInfo->GetName(), rights);
1610 if (member->IsSamePlayer(player->
GetGUID()))
1622 if (member->IsRankNotLower(rankId))
1638 if (member->IsRankNotLower(rankId + 1))
1645 uint32 newRankId = member->GetRankId() + (demote ? 1 : -1);
1647 member->ChangeRank(trans, newRankId);
1701 sScriptMgr->OnGuildMemberDepositMoney(
this, player, amount);
1723 "GM {} (Account: {}) deposit money (Amount: {}) to guild bank (Guild ID {})",
1746 sScriptMgr->OnGuildMemberWitdrawMoney(
this, player, amount, repair);
1776 member->SetStats(player);
1777 member->UpdateLogoutTime();
1778 member->ResetFlags();
1809 std::list<EventLogEntry>
const& eventLog =
m_eventLog.GetGuildLog();
1812 packet.
Entry.reserve(eventLog.size());
1815 entry.WritePacket(packet);
1826 std::list<BankEventLogEntry>
const& bankEventLog =
m_bankEventLog[tabId].GetGuildLog();
1831 packet.
Entry.reserve(bankEventLog.size());
1833 entry.WritePacket(packet);
1850 tab->SendText(
this, session);
1862 queryResult.
RankID = rankId;
1910 member->SetStats(player);
1920 m_leaderGuid = ObjectGuid::Create<HighGuid::Player>(fields[2].GetUInt32());
1927 uint8 purchasedTabs =
uint8(fields[12].GetUInt64());
1933 for (
uint8 i = 0; i < purchasedTabs; ++i)
1950 ObjectGuid playerGuid(ObjectGuid::Create<HighGuid::Player>(lowguid));
1952 auto [memberIt, isNew] =
m_members.try_emplace(playerGuid,
m_id, playerGuid, fields[2].GetUInt8());
1959 Member& member = memberIt->second;
1986 fields[1].GetUInt32(),
1987 time_t(fields[6].GetUInt32()),
1989 fields[3].GetUInt32(),
1990 fields[4].GetUInt32(),
1991 fields[5].GetUInt8());
2013 TC_LOG_ERROR(
"guild",
"GuildBankEventLog ERROR: MoneyEvent(LogGuid: {}, Guild: {}) does not belong to money tab ({}), ignoring...", guid,
m_id, dbTabId);
2017 else if (isMoneyTab)
2019 TC_LOG_ERROR(
"guild",
"GuildBankEventLog ERROR: non-money event (LogGuid: {}, Guild: {}) belongs to money tab, ignoring...", guid,
m_id);
2025 time_t(fields[8].GetUInt32()),
2028 fields[4].GetUInt32(),
2029 fields[5].GetUInt32(),
2030 fields[6].GetUInt16(),
2031 fields[7].GetUInt8());
2041 TC_LOG_ERROR(
"guild",
"Invalid tab (tabId: {}) in guild bank, skipped.", tabId);
2051 TC_LOG_ERROR(
"guild",
"Invalid tab for item (GUID: {}, id: #{}) in guild bank, skipped.",
2052 fields[14].GetUInt32(), fields[15].GetUInt32());
2055 return m_bankTabs[tabId].LoadItemFromDB(fields);
2066 bool broken_ranks =
false;
2072 TC_LOG_ERROR(
"guild",
"Guild {} has invalid number of ranks, creating new...",
m_id);
2073 broken_ranks =
true;
2077 for (
uint8 rankId = 0; rankId < ranks; ++rankId)
2080 if (rankInfo->
GetId() != rankId)
2082 TC_LOG_ERROR(
"guild",
"Guild {} has broken rank id {}, creating default set of ranks...",
m_id, rankId);
2083 broken_ranks =
true;
2115 if (!
sConfigMgr->GetBoolDefault(
"Guild.AllowMultipleGuildMaster",
false))
2120 if (trans->GetSize() > 0)
2133 for (
auto const& [guid, member] :
m_members)
2134 if (
Player* player = member.FindConnectedPlayer())
2137 player->SendDirectMessage(&data);
2143 for (
auto const& [guid, member] :
m_members)
2144 if (member.IsRank(rankId))
2145 if (
Player* player = member.FindConnectedPlayer())
2146 player->SendDirectMessage(packet);
2151 for (
auto const& [guid, member] :
m_members)
2152 if (
Player* player = member.FindConnectedPlayer())
2153 player->SendDirectMessage(packet);
2160 for (
auto const& [guid, member] :
m_members)
2174 if (level < minLevel || level > maxLevel)
2177 if (!member.IsRankNotLower(minRank))
2180 packet.
Invites.emplace_back(member.GetGUID(), level);
2209 auto [memberIt, isNew] =
m_members.try_emplace(guid,
m_id, guid, rankId);
2216 Member& member = memberIt->second;
2237 Field* fields = result->Fetch();
2241 fields[1].GetUInt8(),
2242 fields[2].GetUInt8(),
2243 fields[3].GetUInt8(),
2244 fields[4].GetUInt16(),
2245 fields[5].GetUInt32());
2264 sScriptMgr->OnGuildAddMember(
this, player, rankId);
2277 Member* oldLeader =
nullptr;
2278 Member* newLeader =
nullptr;
2279 for (
auto& [memberGuid, member] :
m_members)
2281 if (memberGuid == guid)
2282 oldLeader = &member;
2283 else if (!newLeader || newLeader->
GetRankId() > member.GetRankId())
2284 newLeader = &member;
2307 sScriptMgr->OnGuildRemoveMember(
this, player, isDisbanding, isKicked);
2339 member->ChangeRank(trans, newRank);
2368 if (tabId == destTabId && slotId == destSlotId)
2384 _MoveItems(&bankData, &charData, splitedAmount);
2386 _MoveItems(&charData, &bankData, splitedAmount);
2394 pTab->SetText(text);
2395 pTab->SendText(
this,
nullptr);
2425 trans->Append(stmt);
2430 trans->Append(stmt);
2434 (*itr).CreateMissingTabsIfNeeded(tabId, trans,
false);
2445 trans->Append(stmt);
2449 trans->Append(stmt);
2468 bool const isInTransaction = bool(trans);
2469 if (!isInTransaction)
2475 if (!isInTransaction)
2486 std::unordered_set<uint32> accountsIdSet;
2487 for (
auto const& [guid, member] :
m_members)
2488 accountsIdSet.insert(member.GetAccountId());
2508 m_bankTabs[tabId].Delete(trans, removeItemsFromDB);
2528 trans->Append(stmt);
2534 bool isInTransaction = bool(trans);
2535 if (!isInTransaction)
2544 trans->Append(stmt);
2546 if (!isInTransaction)
2553 rankInfo->SetBankMoneyPerDay(moneyPerDay);
2562 rankInfo->SetBankTabSlotsAndRights(rightsAndSlots, saveToDB);
2568 return rankInfo->GetName();
2575 return rankInfo->GetRights();
2582 return rankInfo->GetBankMoneyPerDay();
2590 return rankInfo->GetBankTabSlotsPerDay(tabId);
2597 return rankInfo->GetBankTabRights(tabId);
2634 uint8 rankId = member->GetRankId();
2637 member->UpdateBankWithdrawValue(trans, tabId, 1);
2660 sScriptMgr->OnGuildEvent(
this,
uint8(eventType), playerGuid1, playerGuid2, newRank);
2673 uint8 dbTabId = tabId;
2680 pLog.
AddEvent(trans,
m_id, pLog.
GetNextGUID(), eventType, dbTabId, lowguid, itemOrMoney, itemStackCount, destTabId);
2682 sScriptMgr->OnGuildBankEvent(
this,
uint8(eventType), tabId, lowguid, itemOrMoney, itemStackCount, destTabId);
2688 return tab->GetItem(slotId);
2695 pTab->SetItem(trans, slotId,
nullptr);
2754 bool swap = (pDestItem !=
nullptr);
2756 Item* pSrcItem = pSrc->
GetItem(splitedAmount != 0);
2758 if (!pDest->
CanStore(pSrcItem, swap, sendError))
2763 if (!pSrc->
CanStore(pDestItem,
true,
true))
2778 pSrc->
RemoveItem(trans, pDest, splitedAmount);
2818 else if (pDest->
IsBank())
2836 event.
Type = guildEvent;
2838 event.Params.push_back(*param1);
2842 event.Params.resize(2);
2843 event.Params[1] = *param2;
2848 event.Params.resize(3);
2849 event.Params[2] = *param3;
2866 if (fullUpdate && !tabId)
2874 packet.
TabInfo.push_back(tabInfo);
2882 auto fillItems = [&](
auto begin,
auto end,
bool skipEmpty)
2884 for (
auto itr = begin; itr != end; ++itr)
2886 if (
Item* tabItem = tab->GetItem(*itr))
2890 itemInfo.
Slot = *itr;
2891 itemInfo.
ItemID = tabItem->GetEntry();
2895 itemInfo.
Charges =
int32(abs(tabItem->GetSpellCharges()));
2910 packet.
ItemInfo.push_back(itemInfo);
2912 else if (!skipEmpty)
2916 itemInfo.
Slot = *itr;
2919 packet.
ItemInfo.push_back(itemInfo);
2927 else if (slots && !slots->empty())
2928 fillItems(slots->begin(), slots->end(),
false);
2938 TC_LOG_DEBUG(
"guild",
"SMSG_GUILD_BANK_LIST [{}]: TabId: {}, FullSlots: {}, slots: {}",
2944 for (
auto const& [guid, member] :
m_members)
2948 Player* player = member.FindPlayer();
2954 TC_LOG_DEBUG(
"guild",
"SMSG_GUILD_BANK_LIST [{}]: TabId: {}, FullSlots: {}, slots: {}"
2963 member.ResetValues();
Item * NewItemOrBag(ItemTemplate const *proto)
@ CALENDAR_ERROR_INVITES_EXCEEDED
@ CHAR_DEL_GUILD_BANK_TABS
@ CHAR_UPD_GUILD_BANK_TAB_TEXT
@ CHAR_DEL_GUILD_BANK_RIGHTS
@ CHAR_UPD_GUILD_RANK_NAME
@ CHAR_INS_GUILD_EVENTLOG
@ CHAR_UPD_GUILD_EMBLEM_INFO
@ CHAR_DEL_GUILD_BANK_EVENTLOGS
@ CHAR_DEL_GUILD_BANK_RIGHTS_FOR_RANK
@ CHAR_DEL_NONEXISTENT_GUILD_BANK_ITEM
@ CHAR_UPD_GUILD_MEMBER_RANK
@ CHAR_UPD_GUILD_RANK_BANK_MONEY
@ CHAR_UPD_GUILD_RANK_RIGHTS
@ CHAR_UPD_GUILD_MEMBER_PNOTE
@ CHAR_INS_GUILD_BANK_TAB
@ CHAR_SEL_CHAR_DATA_FOR_GUILD
@ CHAR_UPD_GUILD_BANK_MONEY
@ CHAR_DEL_GUILD_BANK_TAB
@ CHAR_UPD_GUILD_MEMBER_OFFNOTE
@ CHAR_DEL_GUILD_BANK_EVENTLOG
@ CHAR_DEL_GUILD_BANK_ITEMS
@ CHAR_DEL_GUILD_BANK_ITEM
@ CHAR_DEL_GUILD_EVENTLOG
@ CHAR_DEL_GUILD_EVENTLOGS
@ CHAR_INS_GUILD_BANK_EVENTLOG
@ CHAR_INS_GUILD_BANK_ITEM
@ CHAR_UPD_GUILD_BANK_TAB_INFO
@ CHAR_INS_GUILD_MEMBER_WITHDRAW
@ CHAR_INS_GUILD_BANK_RIGHT
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
std::shared_ptr< PreparedResultSet > PreparedQueryResult
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
uint32 GetGuildBankTabPrice(uint8 tabId)
uint32 const EMBLEM_PRICE
size_t const MAX_GUILD_BANK_TAB_TEXT_LEN
char const * GetGuildEventString(GuildEvents event)
@ GE_GUILDBANKBAGSLOTS_CHANGED
@ GE_BANK_TAB_PURCHASED
TODO: Sent when items are moved in gbank - all players with bank open will send tab query.
@ GE_BANK_TAB_AND_MONEY_UPDATED
@ GUILD_EVENT_LOG_GUID_UNDEFINED
@ GUILD_WITHDRAW_SLOT_UNLIMITED
@ GUILD_BANK_MONEY_LOGS_TAB
@ GUILD_WITHDRAW_MONEY_UNLIMITED
@ GUILDMEMBER_STATUS_NONE
@ GUILDMEMBER_STATUS_ONLINE
@ GUILD_BANK_RIGHT_VIEW_TAB
@ GUILD_BANK_RIGHT_DEPOSIT_ITEM
constexpr uint64 GUILD_BANK_MONEY_LIMIT
@ GUILD_COMMAND_CHANGE_LEADER
@ GUILD_COMMAND_MOVE_ITEM
@ GUILD_COMMAND_PUBLIC_NOTE
@ GUILD_COMMAND_CHANGE_RANK
@ GUILD_COMMAND_EDIT_MOTD
@ ERR_GUILD_COMMAND_SUCCESS
@ ERR_GUILD_PLAYER_NOT_FOUND_S
@ ERR_GUILD_RANK_TOO_LOW_S
@ ERR_GUILD_RANK_TOO_HIGH_S
@ ERR_ALREADY_INVITED_TO_GUILD_S
std::set< uint8 > SlotIds
@ GUILD_BANK_LOG_MOVE_ITEM
@ GUILD_BANK_LOG_WITHDRAW_ITEM
@ GUILD_BANK_LOG_DEPOSIT_MONEY
@ GUILD_BANK_LOG_DEPOSIT_ITEM
@ GUILD_BANK_LOG_WITHDRAW_MONEY
@ GUILD_BANK_LOG_REPAIR_MONEY
@ GUILD_BANK_LOG_MOVE_ITEM2
@ GR_RIGHT_MODIFY_GUILD_INFO
@ GR_RIGHT_WITHDRAW_REPAIR
@ GUILD_MEMBER_DATA_LEVEL
@ GUILD_MEMBER_DATA_ZONEID
@ ERR_GUILDEMBLEM_NOTGUILDMASTER
@ ERR_GUILDEMBLEM_NOTENOUGHMONEY
@ ERR_GUILDEMBLEM_SUCCESS
@ GUILD_EVENT_LOG_LEAVE_GUILD
@ GUILD_EVENT_LOG_PROMOTE_PLAYER
@ GUILD_EVENT_LOG_UNINVITE_PLAYER
@ GUILD_EVENT_LOG_INVITE_PLAYER
@ GUILD_EVENT_LOG_DEMOTE_PLAYER
@ GUILD_EVENT_LOG_JOIN_GUILD
@ EQUIP_ERR_DESTROY_NONEMPTY_BAG
@ EQUIP_ERR_WRONG_BAG_TYPE
@ EQUIP_ERR_DROP_BOUND_ITEM
@ EQUIP_ERR_ITEM_NOT_FOUND
#define TC_LOG_DEBUG(filterType__,...)
#define TC_LOG_ERROR(filterType__,...)
std::optional< T > Optional
Optional helper class to wrap optional values within.
uint32 const MAX_MONEY_AMOUNT
void utf8truncate(std::string &utf8str, size_t len)
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="")
void SaveToDB(ObjectGuid::LowType guildId) const
void LoadFromDB(Field *fields)
uint32 GetBackgroundColor() const
uint32 GetBorderStyle() const
void ReadPacket(WorldPackets::Guild::SaveGuildEmblem &packet)
uint32 GetBorderColor() const
Class used to access individual fields of database query result.
std::string GetString() const
void SetGuildMasterValues()
void SetTabId(uint8 _tabId)
void SaveToDB(CharacterDatabaseTransaction trans) const override
void WritePacket(WorldPackets::Guild::GuildBankLogQueryResults &packet) const
bool IsMoneyEvent() const
void LogBankEvent(CharacterDatabaseTransaction trans, MoveItemData *pFrom, uint32 count) const override
bool _ReserveSpace(uint8 slotId, Item *pItem, Item *pItemDest, uint32 &count)
void LogAction(MoveItemData *pFrom) const override
void CanStoreItemInTab(Item *pItem, uint8 skipSlotId, bool merge, uint32 &count)
Item * StoreItem(CharacterDatabaseTransaction trans, Item *pItem) override
Item * _StoreItem(CharacterDatabaseTransaction trans, BankTab *pTab, Item *pItem, ItemPosCount &pos, bool clone) const
void RemoveItem(CharacterDatabaseTransaction trans, MoveItemData *pOther, uint32 splitedAmount) override
bool HasStoreRights(MoveItemData *pOther) const override
InventoryResult CanStore(Item *pItem, bool swap) override
bool HasWithdrawRights(MoveItemData *pOther) const override
void LoadFromDB(Field *fields)
std::string const & GetName() const
std::string const & GetIcon() const
bool SetItem(CharacterDatabaseTransaction trans, uint8 slotId, Item *pItem)
void SetText(std::string_view text)
void Delete(CharacterDatabaseTransaction trans, bool removeItemsFromDB=false)
Item * GetItem(uint8 slotId) const
bool LoadItemFromDB(Field *fields)
BankTab(ObjectGuid::LowType guildId, uint8 tabId)
void SendText(Guild const *guild, WorldSession *session) const
void SetInfo(std::string_view name, std::string_view icon)
void SaveToDB(CharacterDatabaseTransaction trans) const override
void WritePacket(WorldPackets::Guild::GuildEventLogQueryResults &packet) const
LogEntry(ObjectGuid::LowType guildId, uint32 guid)
void LoadEvent(Ts &&... args)
void AddEvent(CharacterDatabaseTransaction trans, Ts &&... args)
std::string const & GetName() const
void UpdateBankWithdrawValue(CharacterDatabaseTransaction trans, uint8 tabId, uint32 amount)
bool IsRankNotLower(uint8 rankId) const
Player * FindConnectedPlayer() const
void ChangeRank(CharacterDatabaseTransaction trans, uint8 newRank)
bool IsRank(uint8 rankId) const
void SetPublicNote(std::string_view publicNote)
int32 GetBankWithdrawValue(uint8 tabId) const
void SetOfficerNote(std::string_view officerNote)
bool LoadFromDB(Field *fields)
Member(ObjectGuid::LowType guildId, ObjectGuid guid, uint8 rankId)
ObjectGuid GetGUID() const
void SaveToDB(CharacterDatabaseTransaction trans) const
Player * FindPlayer() const
void SetStats(Player *player)
MoveItemData(Guild *guild, Player *player, uint8 container, uint8 slotId)
virtual void LogAction(MoveItemData *pFrom) const
virtual Item * StoreItem(CharacterDatabaseTransaction trans, Item *pItem)=0
Item * GetItem(bool isCloned=false) const
virtual void LogBankEvent(CharacterDatabaseTransaction trans, MoveItemData *pFrom, uint32 count) const =0
uint8 GetContainer() const
virtual bool CheckItem(uint32 &splitedAmount)
virtual bool HasWithdrawRights(MoveItemData *) const
virtual bool HasStoreRights(MoveItemData *) const
void CopySlots(SlotIds &ids) const
virtual bool IsBank() const =0
bool CloneItem(uint32 count)
virtual bool InitItem()=0
virtual void RemoveItem(CharacterDatabaseTransaction trans, MoveItemData *pOther, uint32 splitedAmount=0)=0
bool CanStore(Item *pItem, bool swap, bool sendError)
InventoryResult CanStore(Item *pItem, bool swap) override
Item * StoreItem(CharacterDatabaseTransaction trans, Item *pItem) override
void LogBankEvent(CharacterDatabaseTransaction trans, MoveItemData *pFrom, uint32 count) const override
void RemoveItem(CharacterDatabaseTransaction trans, MoveItemData *pOther, uint32 splitedAmount=0) override
void CreateMissingTabsIfNeeded(uint8 ranks, CharacterDatabaseTransaction trans, bool logOnCreate=false)
void SetBankMoneyPerDay(uint32 money)
void SetName(std::string_view name)
void SetRights(uint32 rights)
void SetBankTabSlotsAndRights(GuildBankRightsAndSlots rightsAndSlots, bool saveToDB)
void SaveToDB(CharacterDatabaseTransaction trans) const
void LoadFromDB(Field *fields)
void HandleSetNewGuildMaster(WorldSession *session, std::string_view name)
void HandleSetInfo(WorldSession *session, std::string_view info)
std::string _GetRankName(uint8 rankId) const
int8 _GetRankBankTabRights(uint8 rankId, uint8 tabId) const
void SwapItemsWithInventory(Player *player, bool toChar, uint8 tabId, uint8 slotId, uint8 playerBag, uint8 playerSlotId, uint32 splitedAmount)
void HandleRemoveMember(WorldSession *session, std::string_view name)
void _SetRankBankTabRightsAndSlots(uint8 rankId, GuildBankRightsAndSlots rightsAndSlots, bool saveToDB=true)
bool ChangeMemberRank(CharacterDatabaseTransaction trans, ObjectGuid guid, uint8 newRank)
void BroadcastPacket(WorldPacket const *packet) const
int32 _GetRankBankTabSlotsPerDay(uint8 rankId, uint8 tabId) const
int32 _GetMemberRemainingMoney(Member const &member) const
void HandleSetMOTD(WorldSession *session, std::string_view motd)
void _SetRankBankMoneyPerDay(uint8 rankId, uint32 moneyPerDay)
void LoadBankRightFromDB(Field *fields)
static void _DeleteMemberFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType lowguid)
ObjectGuid GetLeaderGUID() const
bool AddMember(CharacterDatabaseTransaction trans, ObjectGuid guid, uint8 rankId=GUILD_RANK_NONE)
uint32 _GetRankRights(uint8 rankId) const
void SwapItems(Player *player, uint8 tabId, uint8 slotId, uint8 destTabId, uint8 destSlotId, uint32 splitedAmount)
void _DeleteBankItems(CharacterDatabaseTransaction trans, bool removeItemsFromDB=false)
void _BroadcastEvent(GuildEvents guildEvent, ObjectGuid guid, Optional< std::string_view > param1={}, Optional< std::string_view > param2={}, Optional< std::string_view > param3={}) const
bool LoadMemberFromDB(Field *fields)
std::vector< BankTab > m_bankTabs
void OnPlayerStatusChange(Player *player, uint32 flag, bool state)
void HandleLeaveMember(WorldSession *session)
void HandleRemoveRank(WorldSession *session, uint8 rankId)
ObjectGuid::LowType GetId() const
void SendPermissions(WorldSession *session) const
void UpdateMemberData(Player *player, uint8 dataid, uint32 value)
void HandleQuery(WorldSession *session)
void BroadcastPacketToRank(WorldPacket const *packet, uint8 rankId) const
void HandleSetRankInfo(WorldSession *session, uint8 rankId, std::string_view name, uint32 rights, uint32 moneyPerDay, std::array< GuildBankRightsAndSlots, GUILD_BANK_MAX_TABS > const &rightsAndSlots)
int32 _GetMemberRemainingSlots(Member const &member, uint8 tabId) const
void SendEventLog(WorldSession *session) const
void SendBankList(WorldSession *session=nullptr, uint8 tabId=0, bool fullUpdate=false, SlotIds *slots=nullptr) const
uint8 _GetPurchasedTabsSize() const
bool LoadBankItemFromDB(Field *fields)
void BroadcastToGuild(WorldSession *session, bool officerOnly, std::string_view msg, uint32 language=LANG_UNIVERSAL) const
void _LogBankEvent(CharacterDatabaseTransaction trans, GuildBankEventLogTypes eventType, uint8 tabId, ObjectGuid::LowType playerGuid, uint32 itemOrMoney, uint16 itemStackCount=0, uint8 destTabId=0)
std::array< LogHolder< BankEventLogEntry >, GUILD_BANK_MAX_TABS+1 > m_bankEventLog
bool LoadFromDB(Field *fields)
std::vector< RankInfo > m_ranks
static void SendCommandResult(WorldSession *session, GuildCommandType type, GuildCommandError errCode, std::string_view param="")
void HandleInviteMember(WorldSession *session, std::string_view name)
void SendLoginInfo(WorldSession *session)
RankInfo const * GetRankInfo(uint8 rankId) const
std::unordered_map< ObjectGuid, Member > m_members
std::string const & GetName() const
void SetBankTabText(uint8 tabId, std::string_view text)
int32 _GetRankBankMoneyPerDay(uint8 rankId) const
void HandleUpdateMemberRank(WorldSession *session, std::string_view name, bool demote)
bool HandleMemberWithdrawMoney(WorldSession *session, uint32 amount, bool repair=false)
bool SetName(std::string_view name)
void _UpdateAccountsNumber()
LogHolder< EventLogEntry > m_eventLog
Member const * GetMember(ObjectGuid guid) const
bool Create(Player *pLeader, std::string_view name)
bool DeleteMember(CharacterDatabaseTransaction trans, ObjectGuid guid, bool isDisbanding=false, bool isKicked=false)
bool LoadEventLogFromDB(Field *fields)
void HandleAddNewRank(WorldSession *session, std::string_view name)
void HandleSetBankTabInfo(WorldSession *session, uint8 tabId, std::string_view name, std::string_view icon)
void HandleMemberLogout(WorldSession *session)
bool IsMember(ObjectGuid guid) const
bool _MemberHasTabRights(ObjectGuid guid, uint8 tabId, uint32 rights) const
void _RemoveItem(CharacterDatabaseTransaction trans, uint8 tabId, uint8 slotId)
bool _IsLeader(Player *player) const
bool LoadBankEventLogFromDB(Field *fields)
void _LogEvent(GuildEventLogTypes eventType, ObjectGuid::LowType playerGuid1, ObjectGuid::LowType playerGuid2=0, uint8 newRank=0)
void HandleDisband(WorldSession *session)
static void SendSaveEmblemResult(WorldSession *session, GuildEmblemError errCode)
void SendBankTabText(WorldSession *session, uint8 tabId) const
uint8 _GetRanksSize() const
void HandleSetEmblem(WorldSession *session, EmblemInfo const &emblemInfo)
BankTab * GetBankTab(uint8 tabId)
bool _ModifyBankMoney(CharacterDatabaseTransaction trans, uint64 amount, bool add)
void SendBankTabData(WorldSession *session, uint8 tabId, bool sendAllSlots) const
bool _DoItemsMove(MoveItemData *pSrc, MoveItemData *pDest, bool sendError, uint32 splitedAmount=0)
bool _CreateRank(CharacterDatabaseTransaction trans, std::string_view name, uint32 rights)
void SendInfo(WorldSession *session) const
void _SendBankContentUpdate(MoveItemData *pSrc, MoveItemData *pDest) const
void _SetLeader(CharacterDatabaseTransaction trans, Member &leader)
uint64 GetMemberAvailableMoneyForRepairItems(ObjectGuid guid) const
bool _HasRankRight(Player *player, uint32 right) const
void HandleSetMemberNote(WorldSession *session, std::string_view note, std::string_view name, bool isPublic)
void HandleMemberDepositMoney(WorldSession *session, uint32 amount)
void _CreateDefaultGuildRanks(CharacterDatabaseTransaction trans, LocaleConstant loc)
void HandleAcceptMember(WorldSession *session)
void MassInviteToEvent(WorldSession *session, uint32 minLevel, uint32 maxLevel, uint32 minRank)
Item * _GetItem(uint8 tabId, uint8 slotId) const
void SendMoneyInfo(WorldSession *session) const
void SendBankLog(WorldSession *session, uint8 tabId) const
void LoadBankTabFromDB(Field *fields)
void HandleRoster(WorldSession *session)
uint8 _GetLowestRankId() const
void _MoveItems(MoveItemData *pSrc, MoveItemData *pDest, uint32 splitedAmount)
void HandleBuyBankTab(WorldSession *session, uint8 tabId)
void _UpdateMemberWithdrawSlots(CharacterDatabaseTransaction trans, ObjectGuid guid, uint8 tabId)
void HandleRemoveLowestRank(WorldSession *session)
void LoadRankFromDB(Field *fields)
virtual bool LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field *fields, uint32 entry)
virtual void SaveToDB(CharacterDatabaseTransaction trans)
Item * CloneItem(uint32 count, Player const *player=nullptr) const
void SetCount(uint32 value)
ItemTemplate const * GetTemplate() const
void FSetState(ItemUpdateState state)
void SetOwnerGUID(ObjectGuid guid)
uint32 GetMaxStackCount() const
static void DeleteFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
LowType GetCounter() const
static ObjectGuid const Empty
std::string ToString() const
static bool IsValidCharterName(std::string_view name)
void SetGuidValue(uint16 index, ObjectGuid value)
virtual void AddToWorld()
virtual void RemoveFromWorld()
static ObjectGuid GetGUID(Object const *o)
bool HasIgnore(ObjectGuid const &ignoreGuid)
void SaveGoldToDB(CharacterDatabaseTransaction trans) const
static uint32 GetZoneIdFromDB(ObjectGuid guid)
Gender GetNativeGender() const override
void SendDirectMessage(WorldPacket const *data) const
bool ModifyMoney(int32 amount, bool sendError=true)
WorldSession * GetSession() const
bool HasEnoughMoney(uint32 amount) const
void SetInGuild(ObjectGuid::LowType guildId)
ObjectGuid::LowType GetGuildId() const
void SetGuildRank(uint8 rankId)
ObjectGuid::LowType GetGuildIdInvited() const
PlayerSocial * GetSocial()
void SetGuildIdInvited(ObjectGuid::LowType GuildId)
static void RemovePetitionsAndSigns(ObjectGuid guid, CharterTypes type)
void setUInt16(uint8 index, uint16 value)
void setUInt32(uint8 index, uint32 value)
void setUInt64(uint8 index, uint64 value)
void setUInt8(uint8 index, uint8 value)
void setString(uint8 index, std::string const &value)
std::string const & GetName() const
T & emplace_back(Args &&... args)
WorldPacket const * Write() override
std::vector< CalendarEventInitialInviteInfo > Invites
std::vector< GuildBankLogEntry > Entry
WorldPacket const * Write() override
int32 WithdrawalsRemaining
WorldPacket const * Write() override
void SetWithdrawalsRemaining(int32 withdrawalsRemaining)
std::vector< GuildBankTabInfo > TabInfo
std::vector< GuildBankItemInfo > ItemInfo
int32 RemainingWithdrawMoney
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
std::vector< GuildEventEntry > Entry
WorldPacket const * Write() override
Array< std::string_view, 3 > Params
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
std::array< GuildRankTabPermissions, GUILD_BANK_MAX_TABS > Tab
WorldPacket const * Write() override
std::vector< GuildRankData > RankData
std::vector< GuildRosterMemberData > MemberData
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * GetRawPacket() const
Player session in the World.
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
LocaleConstant GetSessionDbLocaleIndex() const
Minutes GetTimezoneOffset() const
std::string GetPlayerInfo() const
Player * GetPlayer() const
bool HasPermission(uint32 permissionId)
uint32 GetAccountId() const
void SetUtcTimeFromUnixTime(std::time_t unixTime)
@ CONFIG_GUILD_EVENT_LOG_COUNT
@ CONFIG_GUILD_BANK_EVENT_LOG_COUNT
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD
TC_GAME_API Player * FindPlayerByName(std::string_view name)
TC_GAME_API Player * FindPlayer(ObjectGuid const &)
TC_GAME_API Player * FindConnectedPlayer(ObjectGuid const &)
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
Default TC string format function.
bool isContainedIn(std::vector< ItemPosCount > const &vec) const
std::vector< GuildBankSocketEnchant > SocketEnchant
int32 RandomPropertiesSeed
std::array< std::string, GUILD_RANKS_MAX_COUNT > Ranks
uint32 TabWithdrawItemLimit[GUILD_BANK_MAX_TABS]
uint32 TabFlags[GUILD_BANK_MAX_TABS]