18#ifndef TRINITYCORE_GUILD_H
19#define TRINITYCORE_GUILD_H
30#include <unordered_map>
263#define GUILD_CHALLENGES_TYPES 6
273 EmblemInfo() : m_style(0), m_color(0), m_borderStyle(0), m_borderColor(0), m_backgroundColor(0) { }
275 bool LoadFromDB(
Field* fields);
280 return ValidateEmblemColors(m_style, m_color, m_borderStyle, m_borderColor, m_backgroundColor);
337 void SetStats(
Player* player);
339 bool CheckStats()
const;
341 void SetPublicNote(std::string_view publicNote);
342 void SetOfficerNote(std::string_view officerNote);
351 bool LoadFromDB(
Field* fields);
355 std::string
const&
GetName()
const {
return m_name; }
359 float GetInactiveDays()
const;
381 inline void UpdateLogoutTime();
389 void ResetValues(
bool weekly =
false);
448 LogEntry(guildId, guid), m_eventType(eventType), m_playerGuid1(playerGuid1), m_playerGuid2(playerGuid2), m_newRank(newRank) { }
451 LogEntry(guildId, guid, timestamp), m_eventType(eventType), m_playerGuid1(playerGuid1), m_playerGuid2(playerGuid2), m_newRank(newRank) { }
480 return IsMoneyEvent(m_eventType);
484 LogEntry(guildId, guid), m_eventType(eventType), m_bankTabId(tabId), m_playerGuid(playerGuid),
485 m_itemOrMoney(itemOrMoney), m_itemStackCount(itemStackCount), m_destTabId(destTabId) { }
488 LogEntry(guildId, guid, timestamp), m_eventType(eventType), m_bankTabId(tabId), m_playerGuid(playerGuid),
489 m_itemOrMoney(itemOrMoney), m_itemStackCount(itemStackCount), m_destTabId(destTabId) { }
510 LogEntry(guildId, guid), m_type(type), m_playerGuid(playerGuid), m_flags(
flags), m_value(value) { }
513 LogEntry(guildId, guid, timestamp), m_type(type), m_playerGuid(playerGuid), m_flags(
flags), m_value(value) { }
540 template <
typename Entry>
547 bool CanInsert()
const {
return m_log.size() < m_maxRecords; }
550 template <
typename... Ts>
551 void LoadEvent(Ts&&... args);
554 template <
typename... Ts>
574 m_guildId(guildId), m_rankId(rankId), m_rankOrder(rankOrder), m_name(name), m_rights(rights), m_bankMoneyPerDay(money) { }
576 void LoadFromDB(
Field* fields);
584 std::string
const&
GetName()
const {
return m_name; }
585 void SetName(std::string_view name);
588 void SetRights(
uint32 rights);
595 void SetBankMoneyPerDay(
uint32 money);
617 std::array<GuildBankRightsAndSlots, GUILD_BANK_MAX_TABS> m_bankTabRightsAndSlots = {};
625 void LoadFromDB(
Field* fields);
626 bool LoadItemFromDB(
Field* fields);
629 void SetInfo(std::string_view name, std::string_view icon);
630 void SetText(std::string_view text);
633 std::string
const&
GetName()
const {
return m_name; }
634 std::string
const&
GetIcon()
const {
return m_icon; }
635 std::string
const&
GetText()
const {
return m_text; }
644 std::array<Item*, GUILD_BANK_MAX_SLOTS> m_items = {};
661 virtual bool CheckItem(
uint32& splitedAmount);
669 bool CloneItem(
uint32 count);
679 void CopySlots(
SlotIds& ids)
const;
683 Item*
GetItem(
bool isCloned =
false)
const {
return isCloned ? m_pClonedItem : m_pItem; }
705 bool IsBank()
const override {
return false; }
706 bool InitItem()
override;
721 bool IsBank()
const override {
return true; }
722 bool InitItem()
override;
723 bool HasStoreRights(
MoveItemData* pOther)
const override;
724 bool HasWithdrawRights(
MoveItemData* pOther)
const override;
736 void CanStoreItemInTab(
Item* pItem,
uint8 skipSlotId,
bool merge,
uint32& count);
755 std::string
const&
GetName()
const {
return m_name; }
756 std::string
const&
GetMOTD()
const {
return m_motd; }
757 std::string
const&
GetInfo()
const {
return m_info; }
761 bool SetName(std::string_view name);
766 void HandleSetAchievementTracking(
WorldSession* session,
uint32 const* achievementIdsBegin,
uint32 const* achievementIdsEnd);
768 void HandleSetMOTD(
WorldSession* session, std::string_view motd);
769 void HandleSetInfo(
WorldSession* session, std::string_view info);
771 void HandleSetNewGuildMaster(
WorldSession* session, std::string_view name,
bool isSelfPromote);
772 void HandleSetBankTabInfo(
WorldSession* session,
uint8 tabId, std::string_view name, std::string_view icon);
774 void HandleSetRankInfo(
WorldSession* session,
GuildRankId rankId, std::string_view name,
uint32 rights,
uint32 moneyPerDay, std::array<GuildBankRightsAndSlots, GUILD_BANK_MAX_TABS>
const& rightsAndSlots);
776 void HandleInviteMember(
WorldSession* session, std::string_view name);
782 void HandleAddNewRank(
WorldSession* session, std::string_view name);
785 void HandleMemberDepositMoney(
WorldSession* session,
uint64 amount,
bool cashFlow =
false);
786 bool HandleMemberWithdrawMoney(
WorldSession* session,
uint64 amount,
bool repair =
false);
789 void HandleGuildPartyRequest(
WorldSession* session)
const;
791 void HandleGuildRequestChallengeUpdate(
WorldSession* session)
const;
794 void OnPlayerStatusChange(
Player* player,
uint32 flag,
bool state);
808 void SendEventAwayChanged(
ObjectGuid const& memberGuid,
bool afk,
bool dnd);
809 void SendEventBankMoneyChanged()
const;
810 void SendEventMOTD(
WorldSession* session,
bool broadcast =
false)
const;
811 void SendEventNewLeader(
Member* newLeader,
Member* oldLeader,
bool isSelfPromoted =
false)
const;
812 void SendEventPlayerLeft(
Member* leaver,
Member* remover =
nullptr,
bool isRemoved =
false)
const;
813 void SendEventPresenceChanged(
WorldSession* session,
bool loggedOn,
bool broadcast =
false)
const;
816 bool LoadFromDB(
Field* fields);
817 void LoadGuildNewsLogFromDB(
Field* fields);
818 void LoadRankFromDB(
Field* fields);
819 bool LoadMemberFromDB(
Field* fields);
820 bool LoadEventLogFromDB(
Field* fields);
821 void LoadBankRightFromDB(
Field* fields);
822 void LoadBankTabFromDB(
Field* fields);
823 bool LoadBankEventLogFromDB(
Field* fields);
824 bool LoadBankItemFromDB(
Field* fields);
829 void BroadcastAddonToGuild(
WorldSession* session,
bool officerOnly, std::string_view msg, std::string_view prefix,
bool isLogged)
const;
831 void BroadcastPacket(
WorldPacket const* packet)
const;
838 for (
auto const& [_, member] : m_members)
839 if (
Player* player = member.FindConnectedPlayer())
840 if (player != except)
851 std::unordered_map<ObjectGuid, Member>
const&
GetMembers()
const {
return m_members; }
853 std::vector<Player*> GetMembersTrackingCriteria(
uint32 criteriaId)
const;
860 void SetBankTabText(
uint8 tabId, std::string_view text);
871 void ResetTimes(
bool weekly);
873 bool HasAchieved(
uint32 achievementId)
const;
905 RankInfo
const* GetRankInfo(
GuildRankId rankId)
const;
909 bool _HasRankRight(
Player const* player,
uint32 right)
const;
923 auto itr = m_members.find(guid);
924 return (itr != m_members.end()) ? &itr->second :
nullptr;
930 auto itr = m_members.find(guid);
931 return (itr != m_members.end()) ? &itr->second :
nullptr;
936 for (
auto itr = m_members.begin(); itr != m_members.end(); ++itr)
937 if (itr->second.GetName() == name)
946 void _CreateNewBankTab();
952 void _UpdateAccountsNumber();
953 bool _IsLeader(
Player* player)
const;
964 std::string _GetRankName(
GuildRankId rankId)
const;
967 int64 _GetMemberRemainingMoney(
Member const& member)
const;
976 void _MoveItems(MoveItemData* pSrc, MoveItemData* pDest,
uint32 splitedAmount)
const;
977 static InventoryResult _DoItemsMove(MoveItemData* pSrc, MoveItemData* pDest,
bool sendError,
uint32 splitedAmount = 0);
979 void _SendBankContentUpdate(MoveItemData* pSrc, MoveItemData* pDest)
const;
980 void _SendBankContentUpdate(
uint8 tabId,
SlotIds slots)
const;
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
@ GUILD_EVENT_LOG_GUID_UNDEFINED
@ GUILD_WITHDRAW_SLOT_UNLIMITED
@ GUILD_BANK_MONEY_LOGS_TAB
@ GUILD_WITHDRAW_MONEY_UNLIMITED
@ GUILD_MASTER_DETHRONE_INACTIVE_DAYS
@ GUILDMEMBER_STATUS_NONE
@ GUILDMEMBER_STATUS_MOBILE
@ GUILDMEMBER_STATUS_ONLINE
@ GUILD_BANK_RIGHT_PUT_ITEM
@ GUILD_BANK_RIGHT_VIEW_TAB
@ GUILD_BANK_RIGHT_DEPOSIT_ITEM
@ GUILD_BANK_RIGHT_UPDATE_TEXT
constexpr uint64 GUILD_BANK_MONEY_LIMIT
#define GUILD_CHALLENGES_TYPES
@ GUILD_COMMAND_GUILD_CHAT
@ GUILD_COMMAND_PROMOTE_PLAYER
@ GUILD_COMMAND_CHANGE_LEADER
@ GUILD_COMMAND_DEMOTE_PLAYER
@ GUILD_COMMAND_LEAVE_GUILD
@ GUILD_COMMAND_REMOVE_PLAYER
@ GUILD_COMMAND_EDIT_PUBLIC_NOTE
@ GUILD_COMMAND_MOVE_ITEM
@ GUILD_COMMAND_GET_ROSTER
@ GUILD_COMMAND_CREATE_GUILD
@ GUILD_COMMAND_CHANGE_RANK
@ GUILD_COMMAND_INVITE_PLAYER
@ GUILD_COMMAND_EDIT_MOTD
const uint32 GuildChallengeMaxLevelGoldReward[GUILD_CHALLENGES_TYPES]
@ ERR_GUILD_BANK_WRONG_TAB
@ ERR_GUILD_UNDELETABLE_DUE_TO_LEVEL
@ ERR_GUILD_WITHDRAW_LIMIT
@ ERR_GUILD_PLAYER_NOT_IN_GUILD
@ ERR_GUILD_PLAYER_NOT_IN_GUILD_S
@ ERR_GUILD_TOO_MUCH_MONEY
@ ERR_GUILD_COMMAND_SUCCESS
@ ERR_GUILD_TRIAL_ACCOUNT
@ ERR_GUILD_MOVE_STARTING
@ ERR_RANK_REQUIRES_AUTHENTICATOR
@ ERR_GUILD_NOT_ENOUGH_MONEY
@ ERR_GUILD_PLAYER_NOT_FOUND_S
@ ERR_GUILD_RANK_TOO_LOW_S
@ ERR_GUILD_IGNORING_YOU_S
@ ERR_GUILD_NAME_EXISTS_S
@ ERR_GUILD_RANK_TOO_HIGH_S
@ ERR_ALREADY_INVITED_TO_GUILD_S
@ ERR_GUILD_ITEM_NOT_FOUND
@ ERR_GUILD_BANK_VOUCHER_FAILED
const uint32 GuildChallengeGoldReward[GUILD_CHALLENGES_TYPES]
const uint32 GuildChallengesMaxCount[GUILD_CHALLENGES_TYPES]
std::set< uint8 > SlotIds
uint32 const MinNewsItemLevel
@ GUILD_NEWS_ITEM_CRAFTED
@ GUILD_NEWS_GUILD_ACHIEVEMENT
@ GUILD_NEWS_ITEM_PURCHASED
@ GUILD_NEWS_DUNGEON_ENCOUNTER
@ GUILD_NEWS_PLAYER_ACHIEVEMENT
@ 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_CASH_FLOW_DEPOSIT
@ GUILD_BANK_LOG_REPAIR_MONEY
@ GUILD_BANK_LOG_MOVE_ITEM2
@ GUILD_BANK_LOG_BUY_SLOT
@ GR_RIGHT_WITHDRAW_GOLD_LOCK
@ GR_RIGHT_CREATE_GUILD_EVENT
@ GR_RIGHT_MODIFY_GUILD_INFO
@ GR_RIGHT_WITHDRAW_REPAIR
@ GR_RIGHT_EDIT_PUBLIC_NOTE
@ GUILD_MEMBER_DATA_LEVEL
@ GUILD_MEMBER_DATA_ACHIEVEMENT_POINTS
@ GUILD_MEMBER_DATA_ZONEID
@ ERR_GUILDEMBLEM_NOTGUILDMASTER
@ ERR_GUILDEMBLEM_INVALIDVENDOR
@ ERR_GUILDEMBLEM_INVALID_TABARD_COLORS
@ ERR_GUILDEMBLEM_NOTENOUGHMONEY
@ ERR_GUILDEMBLEM_SUCCESS
@ ERR_GUILDEMBLEM_NOGUILD
@ 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
std::optional< T > Optional
Optional helper class to wrap optional values within.
static void SaveToDB(QuestPool const &pool, CharacterDatabaseTransaction trans)
bool ValidateEmblemColors() const
uint32 GetBackgroundColor() const
uint32 GetBorderStyle() const
uint32 GetBorderColor() const
Class used to access individual fields of database query result.
void SetGuildMasterValues()
GuildBankRightsAndSlots(uint8 _tabId, int8 _rights, int32 _slots)
void SetTabId(uint8 _tabId)
GuildBankRightsAndSlots()
void SetSlots(int32 _slots)
GuildBankRightsAndSlots(uint8 _tabId)
void SetRights(int8 _rights)
BankEventLogEntry(ObjectGuid::LowType guildId, uint32 guid, GuildBankEventLogTypes eventType, uint8 tabId, ObjectGuid::LowType playerGuid, uint64 itemOrMoney, uint16 itemStackCount, uint8 destTabId)
GuildBankEventLogTypes m_eventType
BankEventLogEntry(ObjectGuid::LowType guildId, uint32 guid, time_t timestamp, uint8 tabId, GuildBankEventLogTypes eventType, ObjectGuid::LowType playerGuid, uint64 itemOrMoney, uint16 itemStackCount, uint8 destTabId)
ObjectGuid::LowType m_playerGuid
static bool IsMoneyEvent(GuildBankEventLogTypes eventType)
bool IsMoneyEvent() const
bool IsBank() const override
BankMoveItemData(Guild *guild, Player *player, uint8 container, uint8 slotId)
std::string const & GetName() const
std::string const & GetIcon() const
Item * GetItem(uint8 slotId) const
std::string const & GetText() const
ObjectGuid::LowType m_guildId
GuildEventLogTypes m_eventType
ObjectGuid::LowType m_playerGuid2
EventLogEntry(ObjectGuid::LowType guildId, uint32 guid, time_t timestamp, GuildEventLogTypes eventType, ObjectGuid::LowType playerGuid1, ObjectGuid::LowType playerGuid2, uint8 newRank)
EventLogEntry(ObjectGuid::LowType guildId, uint32 guid, GuildEventLogTypes eventType, ObjectGuid::LowType playerGuid1, ObjectGuid::LowType playerGuid2, uint8 newRank)
ObjectGuid::LowType m_playerGuid1
virtual void SaveToDB(CharacterDatabaseTransaction trans) const =0
LogEntry(ObjectGuid::LowType guildId, uint32 guid, time_t timestamp)
ObjectGuid::LowType m_guildId
time_t GetTimestamp() const
std::list< Entry > & GetGuildLog()
uint32 const m_maxRecords
std::list< Entry > const & GetGuildLog() const
std::string GetOfficerNote() const
std::string const & GetName() const
uint64 m_bankWithdrawMoney
GuildRankId GetRankId() const
bool IsSamePlayer(ObjectGuid guid) const
void SetZoneId(uint32 id)
uint32 GetTotalReputation() const
uint32 GetAccountId() const
std::string GetPublicNote() const
uint32 GetBankTabWithdrawValue(uint8 tabId) const
uint32 m_achievementPoints
uint64 GetWeekActivity() const
bool IsRank(GuildRankId rankId) const
uint64 GetBankMoneyWithdrawValue() const
uint64 GetTotalActivity() const
bool IsTrackingCriteriaId(uint32 criteriaId) const
void SetTrackedCriteriaIds(std::set< uint32 > criteriaIds)
Optional< std::set< uint32 > > m_trackedCriteriaIds
void SetAchievementPoints(uint32 val)
ObjectGuid::LowType m_guildId
std::array< uint32, GUILD_BANK_MAX_TABS > m_bankWithdraw
std::string m_officerNote
uint32 GetWeekReputation() const
uint32 GetAchievementPoints() const
uint64 GetLogoutTime() const
ObjectGuid const & GetGUID() const
std::vector< ItemPosCount > m_vec
virtual Item * StoreItem(CharacterDatabaseTransaction trans, Item *pItem)=0
virtual InventoryResult CanStore(Item *pItem, bool swap)=0
Item * GetItem(bool isCloned=false) const
virtual void LogBankEvent(CharacterDatabaseTransaction trans, MoveItemData *pFrom, uint32 count) const =0
uint8 GetContainer() const
virtual bool HasWithdrawRights(MoveItemData *) const
virtual bool HasStoreRights(MoveItemData *) const
virtual bool IsBank() const =0
virtual bool InitItem()=0
virtual void RemoveItem(CharacterDatabaseTransaction trans, MoveItemData *pOther, uint32 splitedAmount=0)=0
GuildNews GetType() const
NewsLogEntry(ObjectGuid::LowType guildId, uint32 guid, time_t timestamp, GuildNews type, ObjectGuid playerGuid, uint32 flags, uint32 value)
void SetSticky(bool sticky)
ObjectGuid GetPlayerGuid() const
NewsLogEntry(ObjectGuid::LowType guildId, uint32 guid, GuildNews type, ObjectGuid playerGuid, uint32 flags, uint32 value)
PlayerMoveItemData(Guild *guild, Player *player, uint8 container, uint8 slotId)
bool IsBank() const override
void SetOrder(GuildRankOrder rankOrder)
GuildRankOrder m_rankOrder
std::string const & GetName() const
int8 GetBankTabRights(uint8 tabId) const
uint32 GetBankMoneyPerDay() const
int32 GetBankTabSlotsPerDay(uint8 tabId) const
RankInfo(ObjectGuid::LowType guildId)
GuildRankOrder GetOrder() const
GuildRankId GetId() const
ObjectGuid::LowType m_guildId
RankInfo(ObjectGuid::LowType guildId, GuildRankId rankId, GuildRankOrder rankOrder, std::string_view name, uint32 rights, uint32 money)
GuildRankId _GetLowestRankId() const
uint64 GetBankMoney() const
void SetWeakPtr(Trinity::unique_weak_ptr< Guild > weakRef)
ObjectGuid GetLeaderGUID() const
std::vector< BankTab > m_bankTabs
std::unique_ptr< GuildAchievementMgr > m_achievementMgr
ObjectGuid::LowType GetId() const
Member * GetMember(std::string_view name)
uint8 _GetPurchasedTabsSize() const
Member * GetMember(ObjectGuid const &guid)
std::vector< RankInfo > m_ranks
std::unordered_map< ObjectGuid, Member > m_members
std::string const & GetName() const
void BroadcastWorker(Do &&_do, Player const *except=nullptr) const
LogHolder< EventLogEntry > m_eventLog
std::unordered_map< ObjectGuid, Member > const & GetMembers() const
time_t GetCreatedDate() const
LogHolder< NewsLogEntry > m_newsLog
std::string const & GetInfo() const
EmblemInfo const & GetEmblemInfo() const
GuildAchievementMgr & GetAchievementMgr()
GuildAchievementMgr const & GetAchievementMgr() const
uint8 _GetRanksSize() const
BankTab * GetBankTab(uint8 tabId)
std::string const & GetMOTD() const
Member const * GetMember(ObjectGuid const &guid) const
Trinity::unique_weak_ptr< Guild > m_weakRef
uint32 GetMembersCount() const
ObjectGuid GetGUID() const
Trinity::unique_weak_ptr< Guild > GetWeakPtr() const
BankTab const * GetBankTab(uint8 tabId) const
Player session in the World.
TC_GAME_API Player * FindPlayer(ObjectGuid const &)
TC_GAME_API Player * FindConnectedPlayer(ObjectGuid const &)
std::unique_ptr< VignetteData > Create(VignetteEntry const *vignetteData, WorldObject const *owner)
Trinity::RaceMask< uint64 > RaceMask
std::vector< uint32 > AchievementsRequired