diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/game/Guilds/Guild.cpp | 34 | ||||
| -rw-r--r-- | src/server/game/Guilds/Guild.h | 1138 |
2 files changed, 585 insertions, 587 deletions
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index b95d2ed1981..49725a875eb 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -29,10 +29,13 @@ #include "SocialMgr.h" #include "Opcodes.h" -#define MAX_GUILD_BANK_TAB_TEXT_LEN 500 -#define EMBLEM_PRICE 10 * GOLD -std::string _GetGuildEventString(GuildEvents event) +size_t const MAX_GUILD_BANK_TAB_TEXT_LEN = 500; + +uint32 const EMBLEM_PRICE = 10 * GOLD; + +// only used in logs +char const* GetGuildEventString(GuildEvents event) { switch (event) { @@ -82,18 +85,13 @@ std::string _GetGuildEventString(GuildEvents event) return "<None>"; } -inline uint32 _GetGuildBankTabPrice(uint8 tabId) +inline uint32 GetGuildBankTabPrice(uint8 tabId) { - switch (tabId) - { - case 0: return 100; - case 1: return 250; - case 2: return 500; - case 3: return 1000; - case 4: return 2500; - case 5: return 5000; - default: return 0; - } + // these prices are in gold units, not copper + static uint32 const tabPrices[GUILD_BANK_MAX_TABS] = { 100, 250, 500, 1000, 2500, 5000 }; + ASSERT(tabId < GUILD_BANK_MAX_TABS); + + return tabPrices[tabId]; } void Guild::SendCommandResult(WorldSession* session, GuildCommandType type, GuildCommandError errCode, std::string const& param) @@ -121,7 +119,7 @@ void Guild::SendSaveEmblemResult(WorldSession* session, GuildEmblemError errCode Guild::LogHolder::~LogHolder() { // Cleanup - for (GuildLog::iterator itr = m_log.begin(); itr != m_log.end(); ++itr) + for (auto itr = m_log.begin(); itr != m_log.end(); ++itr) delete (*itr); } @@ -1497,10 +1495,10 @@ void Guild::HandleBuyBankTab(WorldSession* session, uint8 tabId) if (tabId != _GetPurchasedTabsSize()) return; - uint32 tabCost = _GetGuildBankTabPrice(tabId) * GOLD; - if (!tabCost) + if (tabId >= GUILD_BANK_MAX_TABS) return; + uint32 tabCost = GetGuildBankTabPrice(tabId) * GOLD; if (!player->HasEnoughMoney(tabCost)) // Should not happen, this is checked by client return; @@ -2855,7 +2853,7 @@ void Guild::_BroadcastEvent(GuildEvents guildEvent, ObjectGuid guid, const char* BroadcastPacket(&data); - TC_LOG_DEBUG("guild", "SMSG_GUILD_EVENT [Broadcast] Event: %s (%u)", _GetGuildEventString(guildEvent).c_str(), guildEvent); + TC_LOG_DEBUG("guild", "SMSG_GUILD_EVENT [Broadcast] Event: %s (%u)", GetGuildEventString(guildEvent), guildEvent); } void Guild::_SendBankList(WorldSession* session /* = NULL*/, uint8 tabId /*= 0*/, bool sendAllSlots /*= false*/, SlotIds *slots /*= NULL*/) const diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index e25a3201957..3ee0db4319c 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -225,54 +225,54 @@ enum GuildMemberFlags // Emblem info class TC_GAME_API EmblemInfo { -public: - EmblemInfo() : m_style(0), m_color(0), m_borderStyle(0), m_borderColor(0), m_backgroundColor(0) { } - - void LoadFromDB(Field* fields); - void SaveToDB(ObjectGuid::LowType guildId) const; - void ReadPacket(WorldPacket& recv); - void WritePacket(WorldPacket& data) const; - - uint32 GetStyle() const { return m_style; } - uint32 GetColor() const { return m_color; } - uint32 GetBorderStyle() const { return m_borderStyle; } - uint32 GetBorderColor() const { return m_borderColor; } - uint32 GetBackgroundColor() const { return m_backgroundColor; } - -private: - uint32 m_style; - uint32 m_color; - uint32 m_borderStyle; - uint32 m_borderColor; - uint32 m_backgroundColor; + public: + EmblemInfo() : m_style(0), m_color(0), m_borderStyle(0), m_borderColor(0), m_backgroundColor(0) { } + + void LoadFromDB(Field* fields); + void SaveToDB(ObjectGuid::LowType guildId) const; + void ReadPacket(WorldPacket& recv); + void WritePacket(WorldPacket& data) const; + + uint32 GetStyle() const { return m_style; } + uint32 GetColor() const { return m_color; } + uint32 GetBorderStyle() const { return m_borderStyle; } + uint32 GetBorderColor() const { return m_borderColor; } + uint32 GetBackgroundColor() const { return m_backgroundColor; } + + private: + uint32 m_style; + uint32 m_color; + uint32 m_borderStyle; + uint32 m_borderColor; + uint32 m_backgroundColor; }; // Structure for storing guild bank rights and remaining slots together. class GuildBankRightsAndSlots { -public: - GuildBankRightsAndSlots() : tabId(TAB_UNDEFINED), rights(0), slots(0) { } - GuildBankRightsAndSlots(uint8 _tabId) : tabId(_tabId), rights(0), slots(0) { } - GuildBankRightsAndSlots(uint8 _tabId, uint8 _rights, uint32 _slots) : tabId(_tabId), rights(_rights), slots(_slots) { } - - void SetGuildMasterValues() - { - rights = GUILD_BANK_RIGHT_FULL; - slots = uint32(GUILD_WITHDRAW_SLOT_UNLIMITED); - } - - void SetTabId(uint8 _tabId) { tabId = _tabId; } - void SetSlots(uint32 _slots) { slots = _slots; } - void SetRights(uint8 _rights) { rights = _rights; } - - int8 GetTabId() const { return tabId; } - int32 GetSlots() const { return slots; } - int8 GetRights() const { return rights; } - -private: - uint8 tabId; - uint8 rights; - uint32 slots; + public: + GuildBankRightsAndSlots() : tabId(TAB_UNDEFINED), rights(0), slots(0) { } + GuildBankRightsAndSlots(uint8 _tabId) : tabId(_tabId), rights(0), slots(0) { } + GuildBankRightsAndSlots(uint8 _tabId, uint8 _rights, uint32 _slots) : tabId(_tabId), rights(_rights), slots(_slots) { } + + void SetGuildMasterValues() + { + rights = GUILD_BANK_RIGHT_FULL; + slots = uint32(GUILD_WITHDRAW_SLOT_UNLIMITED); + } + + void SetTabId(uint8 _tabId) { tabId = _tabId; } + void SetSlots(uint32 _slots) { slots = _slots; } + void SetRights(uint8 _rights) { rights = _rights; } + + int8 GetTabId() const { return tabId; } + int32 GetSlots() const { return slots; } + int8 GetRights() const { return rights; } + + private: + uint8 tabId; + uint8 rights; + uint32 slots; }; typedef std::vector <GuildBankRightsAndSlots> GuildBankRightsAndSlotsVec; @@ -281,577 +281,577 @@ typedef std::set <uint8> SlotIds; class TC_GAME_API Guild { -private: - // Class representing guild member - class Member - { - public: - Member(ObjectGuid::LowType guildId, ObjectGuid guid, uint8 rankId) : - m_guildId(guildId), - m_guid(guid), - m_zoneId(0), - m_level(0), - m_class(0), - m_flags(GUILDMEMBER_STATUS_NONE), - m_logoutTime(::time(NULL)), - m_accountId(0), - m_rankId(rankId) + private: + // Class representing guild member + class Member { - memset(m_bankWithdraw, 0, (GUILD_BANK_MAX_TABS + 1) * sizeof(int32)); - } - - void SetStats(Player* player); - void SetStats(std::string const& name, uint8 level, uint8 _class, uint32 zoneId, uint32 accountId); - bool CheckStats() const; + public: + Member(ObjectGuid::LowType guildId, ObjectGuid guid, uint8 rankId) : + m_guildId(guildId), + m_guid(guid), + m_zoneId(0), + m_level(0), + m_class(0), + m_flags(GUILDMEMBER_STATUS_NONE), + m_logoutTime(::time(nullptr)), + m_accountId(0), + m_rankId(rankId) + { + memset(m_bankWithdraw, 0, (GUILD_BANK_MAX_TABS + 1) * sizeof(int32)); + } + + void SetStats(Player* player); + void SetStats(std::string const& name, uint8 level, uint8 _class, uint32 zoneId, uint32 accountId); + bool CheckStats() const; + + void SetPublicNote(std::string const& publicNote); + void SetOfficerNote(std::string const& officerNote); + void SetZoneID(uint32 id) { m_zoneId = id; } + void SetLevel(uint8 var) { m_level = var; } + + void AddFlag(uint8 var) { m_flags |= var; } + void RemFlag(uint8 var) { m_flags &= ~var; } + void ResetFlags() { m_flags = GUILDMEMBER_STATUS_NONE; } + + bool LoadFromDB(Field* fields); + void SaveToDB(SQLTransaction& trans) const; + void WritePacket(WorldPacket& data, bool sendOfficerNote) const; + + ObjectGuid GetGUID() const { return m_guid; } + std::string const& GetName() const { return m_name; } + uint32 GetAccountId() const { return m_accountId; } + uint8 GetRankId() const { return m_rankId; } + uint64 GetLogoutTime() const { return m_logoutTime; } + std::string GetPublicNote() const { return m_publicNote; } + std::string GetOfficerNote() const { return m_officerNote; } + uint8 GetClass() const { return m_class; } + uint8 GetLevel() const { return m_level; } + uint8 GetFlags() const { return m_flags; } + uint32 GetZoneId() const { return m_zoneId; } + bool IsOnline() const { return (m_flags & GUILDMEMBER_STATUS_ONLINE); } + + void ChangeRank(uint8 newRank); + + inline void UpdateLogoutTime() { m_logoutTime = ::time(nullptr); } + inline bool IsRank(uint8 rankId) const { return m_rankId == rankId; } + inline bool IsRankNotLower(uint8 rankId) const { return m_rankId <= rankId; } + inline bool IsSamePlayer(ObjectGuid guid) const { return m_guid == guid; } + + void UpdateBankWithdrawValue(SQLTransaction& trans, uint8 tabId, uint32 amount); + int32 GetBankWithdrawValue(uint8 tabId) const; + void ResetValues(); + + inline Player* FindPlayer() const { return ObjectAccessor::FindPlayer(m_guid); } + inline Player* FindConnectedPlayer() const { return ObjectAccessor::FindConnectedPlayer(m_guid); } + + private: + ObjectGuid::LowType m_guildId; + // Fields from characters table + ObjectGuid m_guid; + std::string m_name; + uint32 m_zoneId; + uint8 m_level; + uint8 m_class; + uint8 m_flags; + uint64 m_logoutTime; + uint32 m_accountId; + // Fields from guild_member table + uint8 m_rankId; + std::string m_publicNote; + std::string m_officerNote; + + int32 m_bankWithdraw[GUILD_BANK_MAX_TABS + 1]; + }; + + // Base class for event entries + class LogEntry + { + public: + LogEntry(ObjectGuid::LowType guildId, uint32 guid) : m_guildId(guildId), m_guid(guid), m_timestamp(::time(nullptr)) { } + LogEntry(ObjectGuid::LowType guildId, uint32 guid, time_t timestamp) : m_guildId(guildId), m_guid(guid), m_timestamp(timestamp) { } + virtual ~LogEntry() { } - void SetPublicNote(std::string const& publicNote); - void SetOfficerNote(std::string const& officerNote); - void SetZoneID(uint32 id) { m_zoneId = id; } - void SetLevel(uint8 var) { m_level = var; } + uint32 GetGUID() const { return m_guid; } + uint64 GetTimestamp() const { return m_timestamp; } - void AddFlag(uint8 var) { m_flags |= var; } - void RemFlag(uint8 var) { m_flags &= ~var; } - void ResetFlags() { m_flags = GUILDMEMBER_STATUS_NONE; } + virtual void SaveToDB(SQLTransaction& trans) const = 0; + virtual void WritePacket(WorldPacket& data) const = 0; - bool LoadFromDB(Field* fields); - void SaveToDB(SQLTransaction& trans) const; - void WritePacket(WorldPacket& data, bool sendOfficerNote) const; + protected: + ObjectGuid::LowType m_guildId; + uint32 m_guid; + uint64 m_timestamp; + }; - ObjectGuid GetGUID() const { return m_guid; } - std::string const& GetName() const { return m_name; } - uint32 GetAccountId() const { return m_accountId; } - uint8 GetRankId() const { return m_rankId; } - uint64 GetLogoutTime() const { return m_logoutTime; } - std::string GetPublicNote() const { return m_publicNote; } - std::string GetOfficerNote() const { return m_officerNote; } - uint8 GetClass() const { return m_class; } - uint8 GetLevel() const { return m_level; } - uint8 GetFlags() const { return m_flags; } - uint32 GetZoneId() const { return m_zoneId; } - bool IsOnline() const { return (m_flags & GUILDMEMBER_STATUS_ONLINE); } - - void ChangeRank(uint8 newRank); - - inline void UpdateLogoutTime() { m_logoutTime = ::time(NULL); } - inline bool IsRank(uint8 rankId) const { return m_rankId == rankId; } - inline bool IsRankNotLower(uint8 rankId) const { return m_rankId <= rankId; } - inline bool IsSamePlayer(ObjectGuid guid) const { return m_guid == guid; } - - void UpdateBankWithdrawValue(SQLTransaction& trans, uint8 tabId, uint32 amount); - int32 GetBankWithdrawValue(uint8 tabId) const; - void ResetValues(); - - inline Player* FindPlayer() const { return ObjectAccessor::FindPlayer(m_guid); } - inline Player* FindConnectedPlayer() const { return ObjectAccessor::FindConnectedPlayer(m_guid); } + // Event log entry + class EventLogEntry : public LogEntry + { + public: + EventLogEntry(ObjectGuid::LowType guildId, uint32 guid, GuildEventLogTypes eventType, ObjectGuid::LowType playerGuid1, ObjectGuid::LowType playerGuid2, uint8 newRank) : + LogEntry(guildId, guid), m_eventType(eventType), m_playerGuid1(playerGuid1), m_playerGuid2(playerGuid2), m_newRank(newRank) { } - private: - ObjectGuid::LowType m_guildId; - // Fields from characters table - ObjectGuid m_guid; - std::string m_name; - uint32 m_zoneId; - uint8 m_level; - uint8 m_class; - uint8 m_flags; - uint64 m_logoutTime; - uint32 m_accountId; - // Fields from guild_member table - uint8 m_rankId; - std::string m_publicNote; - std::string m_officerNote; - - int32 m_bankWithdraw[GUILD_BANK_MAX_TABS + 1]; - }; - - // Base class for event entries - class LogEntry - { - public: - LogEntry(ObjectGuid::LowType guildId, uint32 guid) : m_guildId(guildId), m_guid(guid), m_timestamp(::time(NULL)) { } - LogEntry(ObjectGuid::LowType guildId, uint32 guid, time_t timestamp) : m_guildId(guildId), m_guid(guid), m_timestamp(timestamp) { } - virtual ~LogEntry() { } + EventLogEntry(ObjectGuid::LowType guildId, uint32 guid, time_t timestamp, GuildEventLogTypes eventType, ObjectGuid::LowType playerGuid1, ObjectGuid::LowType playerGuid2, uint8 newRank) : + LogEntry(guildId, guid, timestamp), m_eventType(eventType), m_playerGuid1(playerGuid1), m_playerGuid2(playerGuid2), m_newRank(newRank) { } - uint32 GetGUID() const { return m_guid; } - uint64 GetTimestamp() const { return m_timestamp; } + ~EventLogEntry() { } - virtual void SaveToDB(SQLTransaction& trans) const = 0; - virtual void WritePacket(WorldPacket& data) const = 0; + void SaveToDB(SQLTransaction& trans) const override; + void WritePacket(WorldPacket& data) const override; - protected: - ObjectGuid::LowType m_guildId; - uint32 m_guid; - uint64 m_timestamp; - }; - - // Event log entry - class EventLogEntry : public LogEntry - { - public: - EventLogEntry(ObjectGuid::LowType guildId, uint32 guid, GuildEventLogTypes eventType, ObjectGuid::LowType playerGuid1, ObjectGuid::LowType playerGuid2, uint8 newRank) : - LogEntry(guildId, guid), m_eventType(eventType), m_playerGuid1(playerGuid1), m_playerGuid2(playerGuid2), m_newRank(newRank) { } + private: + GuildEventLogTypes m_eventType; + ObjectGuid::LowType m_playerGuid1; + ObjectGuid::LowType m_playerGuid2; + uint8 m_newRank; + }; - EventLogEntry(ObjectGuid::LowType guildId, uint32 guid, time_t timestamp, GuildEventLogTypes eventType, ObjectGuid::LowType playerGuid1, ObjectGuid::LowType playerGuid2, uint8 newRank) : - LogEntry(guildId, guid, timestamp), m_eventType(eventType), m_playerGuid1(playerGuid1), m_playerGuid2(playerGuid2), m_newRank(newRank) { } + // Bank event log entry + class BankEventLogEntry : public LogEntry + { + public: + static bool IsMoneyEvent(GuildBankEventLogTypes eventType) + { + return + eventType == GUILD_BANK_LOG_DEPOSIT_MONEY || + eventType == GUILD_BANK_LOG_WITHDRAW_MONEY || + eventType == GUILD_BANK_LOG_REPAIR_MONEY; + } + + BankEventLogEntry(ObjectGuid::LowType guildId, uint32 guid, GuildBankEventLogTypes eventType, uint8 tabId, ObjectGuid::LowType playerGuid, uint32 itemOrMoney, uint16 itemStackCount, uint8 destTabId) : + LogEntry(guildId, guid), m_eventType(eventType), m_bankTabId(tabId), m_playerGuid(playerGuid), + m_itemOrMoney(itemOrMoney), m_itemStackCount(itemStackCount), m_destTabId(destTabId) { } + + BankEventLogEntry(ObjectGuid::LowType guildId, uint32 guid, time_t timestamp, uint8 tabId, GuildBankEventLogTypes eventType, ObjectGuid::LowType playerGuid, uint32 itemOrMoney, uint16 itemStackCount, uint8 destTabId) : + LogEntry(guildId, guid, timestamp), m_eventType(eventType), m_bankTabId(tabId), m_playerGuid(playerGuid), + m_itemOrMoney(itemOrMoney), m_itemStackCount(itemStackCount), m_destTabId(destTabId) { } + + ~BankEventLogEntry() { } + + void SaveToDB(SQLTransaction& trans) const override; + void WritePacket(WorldPacket& data) const override; + + private: + GuildBankEventLogTypes m_eventType; + uint8 m_bankTabId; + ObjectGuid::LowType m_playerGuid; + uint32 m_itemOrMoney; + uint16 m_itemStackCount; + uint8 m_destTabId; + }; + + // Class encapsulating work with events collection + typedef std::list<LogEntry*> GuildLog; + + class LogHolder + { + public: + LogHolder(uint32 maxRecords) : m_maxRecords(maxRecords), m_nextGUID(uint32(GUILD_EVENT_LOG_GUID_UNDEFINED)) { } + ~LogHolder(); + + uint8 GetSize() const { return uint8(m_log.size()); } + // Checks if new log entry can be added to holder when loading from DB + inline bool CanInsert() const { return m_log.size() < m_maxRecords; } + // Adds event from DB to collection + void LoadEvent(LogEntry* entry); + // Adds new event to collection and saves it to DB + void AddEvent(SQLTransaction& trans, LogEntry* entry); + // Writes information about all events to packet + void WritePacket(WorldPacket& data) const; + uint32 GetNextGUID(); + + private: + GuildLog m_log; + uint32 m_maxRecords; + uint32 m_nextGUID; + }; + + // Class encapsulating guild rank data + class RankInfo + { + public: + RankInfo(): m_guildId(0), m_rankId(GUILD_RANK_NONE), m_rights(GR_RIGHT_EMPTY), m_bankMoneyPerDay(0) { } + RankInfo(ObjectGuid::LowType guildId) : m_guildId(guildId), m_rankId(GUILD_RANK_NONE), m_rights(GR_RIGHT_EMPTY), m_bankMoneyPerDay(0) { } + RankInfo(ObjectGuid::LowType guildId, uint8 rankId, std::string const& name, uint32 rights, uint32 money) : + m_guildId(guildId), m_rankId(rankId), m_name(name), m_rights(rights), + m_bankMoneyPerDay(rankId != GR_GUILDMASTER ? money : GUILD_WITHDRAW_MONEY_UNLIMITED) { } - ~EventLogEntry() { } + void LoadFromDB(Field* fields); + void SaveToDB(SQLTransaction& trans) const; + void WritePacket(WorldPacket& data) const; - void SaveToDB(SQLTransaction& trans) const override; - void WritePacket(WorldPacket& data) const override; + uint8 GetId() const { return m_rankId; } - private: - GuildEventLogTypes m_eventType; - ObjectGuid::LowType m_playerGuid1; - ObjectGuid::LowType m_playerGuid2; - uint8 m_newRank; - }; - - // Bank event log entry - class BankEventLogEntry : public LogEntry - { - public: - static bool IsMoneyEvent(GuildBankEventLogTypes eventType) - { - return - eventType == GUILD_BANK_LOG_DEPOSIT_MONEY || - eventType == GUILD_BANK_LOG_WITHDRAW_MONEY || - eventType == GUILD_BANK_LOG_REPAIR_MONEY; - } + std::string const& GetName() const { return m_name; } + void SetName(std::string const& name); - BankEventLogEntry(ObjectGuid::LowType guildId, uint32 guid, GuildBankEventLogTypes eventType, uint8 tabId, ObjectGuid::LowType playerGuid, uint32 itemOrMoney, uint16 itemStackCount, uint8 destTabId) : - LogEntry(guildId, guid), m_eventType(eventType), m_bankTabId(tabId), m_playerGuid(playerGuid), - m_itemOrMoney(itemOrMoney), m_itemStackCount(itemStackCount), m_destTabId(destTabId) { } + uint32 GetRights() const { return m_rights; } + void SetRights(uint32 rights); - BankEventLogEntry(ObjectGuid::LowType guildId, uint32 guid, time_t timestamp, uint8 tabId, GuildBankEventLogTypes eventType, ObjectGuid::LowType playerGuid, uint32 itemOrMoney, uint16 itemStackCount, uint8 destTabId) : - LogEntry(guildId, guid, timestamp), m_eventType(eventType), m_bankTabId(tabId), m_playerGuid(playerGuid), - m_itemOrMoney(itemOrMoney), m_itemStackCount(itemStackCount), m_destTabId(destTabId) { } + int32 GetBankMoneyPerDay() const { return m_bankMoneyPerDay; } - ~BankEventLogEntry() { } + void SetBankMoneyPerDay(uint32 money); - void SaveToDB(SQLTransaction& trans) const override; - void WritePacket(WorldPacket& data) const override; + inline int8 GetBankTabRights(uint8 tabId) const + { + return tabId < GUILD_BANK_MAX_TABS ? m_bankTabRightsAndSlots[tabId].GetRights() : 0; + } - private: - GuildBankEventLogTypes m_eventType; - uint8 m_bankTabId; - ObjectGuid::LowType m_playerGuid; - uint32 m_itemOrMoney; - uint16 m_itemStackCount; - uint8 m_destTabId; - }; - - // Class encapsulating work with events collection - typedef std::list<LogEntry*> GuildLog; - - class LogHolder - { - public: - LogHolder(uint32 maxRecords) : m_maxRecords(maxRecords), m_nextGUID(uint32(GUILD_EVENT_LOG_GUID_UNDEFINED)) { } - ~LogHolder(); - - uint8 GetSize() const { return uint8(m_log.size()); } - // Checks if new log entry can be added to holder when loading from DB - inline bool CanInsert() const { return m_log.size() < m_maxRecords; } - // Adds event from DB to collection - void LoadEvent(LogEntry* entry); - // Adds new event to collection and saves it to DB - void AddEvent(SQLTransaction& trans, LogEntry* entry); - // Writes information about all events to packet - void WritePacket(WorldPacket& data) const; - uint32 GetNextGUID(); + inline int32 GetBankTabSlotsPerDay(uint8 tabId) const + { + return tabId < GUILD_BANK_MAX_TABS ? m_bankTabRightsAndSlots[tabId].GetSlots() : 0; + } - private: - GuildLog m_log; - uint32 m_maxRecords; - uint32 m_nextGUID; - }; - - // Class encapsulating guild rank data - class RankInfo - { - public: - RankInfo(): m_guildId(0), m_rankId(GUILD_RANK_NONE), m_rights(GR_RIGHT_EMPTY), m_bankMoneyPerDay(0) { } - RankInfo(ObjectGuid::LowType guildId) : m_guildId(guildId), m_rankId(GUILD_RANK_NONE), m_rights(GR_RIGHT_EMPTY), m_bankMoneyPerDay(0) { } - RankInfo(ObjectGuid::LowType guildId, uint8 rankId, std::string const& name, uint32 rights, uint32 money) : - m_guildId(guildId), m_rankId(rankId), m_name(name), m_rights(rights), - m_bankMoneyPerDay(rankId != GR_GUILDMASTER ? money : GUILD_WITHDRAW_MONEY_UNLIMITED) { } + void SetBankTabSlotsAndRights(GuildBankRightsAndSlots rightsAndSlots, bool saveToDB); + void CreateMissingTabsIfNeeded(uint8 ranks, SQLTransaction& trans, bool logOnCreate = false); - void LoadFromDB(Field* fields); - void SaveToDB(SQLTransaction& trans) const; - void WritePacket(WorldPacket& data) const; + private: + ObjectGuid::LowType m_guildId; - uint8 GetId() const { return m_rankId; } + uint8 m_rankId; + std::string m_name; + uint32 m_rights; + uint32 m_bankMoneyPerDay; + GuildBankRightsAndSlots m_bankTabRightsAndSlots[GUILD_BANK_MAX_TABS]; + }; - std::string const& GetName() const { return m_name; } - void SetName(std::string const& name); + class BankTab + { + public: + BankTab(ObjectGuid::LowType guildId, uint8 tabId) : m_guildId(guildId), m_tabId(tabId) + { + memset(m_items, 0, GUILD_BANK_MAX_SLOTS * sizeof(Item*)); + } + + void LoadFromDB(Field* fields); + bool LoadItemFromDB(Field* fields); + void Delete(SQLTransaction& trans, bool removeItemsFromDB = false); + + void WritePacket(WorldPacket& data) const; + bool WriteSlotPacket(WorldPacket& data, uint8 slotId, bool ignoreEmpty = true) const; + void WriteInfoPacket(WorldPacket& data) const + { + data << m_name; + data << m_icon; + } + + void SetInfo(std::string const& name, std::string const& icon); + void SetText(std::string const& text); + void SendText(const Guild* guild, WorldSession* session) const; + + inline Item* GetItem(uint8 slotId) const { return slotId < GUILD_BANK_MAX_SLOTS ? m_items[slotId] : NULL; } + bool SetItem(SQLTransaction& trans, uint8 slotId, Item* pItem); + + private: + ObjectGuid::LowType m_guildId; + uint8 m_tabId; + + Item* m_items[GUILD_BANK_MAX_SLOTS]; + std::string m_name; + std::string m_icon; + std::string m_text; + }; + + // Movement data + class MoveItemData + { + public: + MoveItemData(Guild* guild, Player* player, uint8 container, uint8 slotId) : m_pGuild(guild), m_pPlayer(player), + m_container(container), m_slotId(slotId), m_pItem(NULL), m_pClonedItem(NULL) { } + virtual ~MoveItemData() { } + + virtual bool IsBank() const = 0; + // Initializes item pointer. Returns true, if item exists, false otherwise. + virtual bool InitItem() = 0; + // Checks splited amount against item. Splited amount cannot be more that number of items in stack. + virtual bool CheckItem(uint32& splitedAmount); + // Defines if player has rights to save item in container + virtual bool HasStoreRights(MoveItemData* /*pOther*/) const { return true; } + // Defines if player has rights to withdraw item from container + virtual bool HasWithdrawRights(MoveItemData* /*pOther*/) const { return true; } + // Checks if container can store specified item + bool CanStore(Item* pItem, bool swap, bool sendError); + // Clones stored item + bool CloneItem(uint32 count); + // Remove item from container (if splited update items fields) + virtual void RemoveItem(SQLTransaction& trans, MoveItemData* pOther, uint32 splitedAmount = 0) = 0; + // Saves item to container + virtual Item* StoreItem(SQLTransaction& trans, Item* pItem) = 0; + // Log bank event + virtual void LogBankEvent(SQLTransaction& trans, MoveItemData* pFrom, uint32 count) const = 0; + // Log GM action + virtual void LogAction(MoveItemData* pFrom) const; + // Copy slots id from position vector + void CopySlots(SlotIds& ids) const; + + Item* GetItem(bool isCloned = false) const { return isCloned ? m_pClonedItem : m_pItem; } + uint8 GetContainer() const { return m_container; } + uint8 GetSlotId() const { return m_slotId; } + + protected: + virtual InventoryResult CanStore(Item* pItem, bool swap) = 0; + + Guild* m_pGuild; + Player* m_pPlayer; + uint8 m_container; + uint8 m_slotId; + Item* m_pItem; + Item* m_pClonedItem; + ItemPosCountVec m_vec; + }; + + class PlayerMoveItemData : public MoveItemData + { + public: + PlayerMoveItemData(Guild* guild, Player* player, uint8 container, uint8 slotId) : + MoveItemData(guild, player, container, slotId) { } + + bool IsBank() const override { return false; } + bool InitItem() override; + void RemoveItem(SQLTransaction& trans, MoveItemData* pOther, uint32 splitedAmount = 0) override; + Item* StoreItem(SQLTransaction& trans, Item* pItem) override; + void LogBankEvent(SQLTransaction& trans, MoveItemData* pFrom, uint32 count) const override; + protected: + InventoryResult CanStore(Item* pItem, bool swap) override; + }; + + class BankMoveItemData : public MoveItemData + { + public: + BankMoveItemData(Guild* guild, Player* player, uint8 container, uint8 slotId) : + MoveItemData(guild, player, container, slotId) { } + + bool IsBank() const override { return true; } + bool InitItem() override; + bool HasStoreRights(MoveItemData* pOther) const override; + bool HasWithdrawRights(MoveItemData* pOther) const override; + void RemoveItem(SQLTransaction& trans, MoveItemData* pOther, uint32 splitedAmount) override; + Item* StoreItem(SQLTransaction& trans, Item* pItem) override; + void LogBankEvent(SQLTransaction& trans, MoveItemData* pFrom, uint32 count) const override; + void LogAction(MoveItemData* pFrom) const override; + + protected: + InventoryResult CanStore(Item* pItem, bool swap) override; + + private: + Item* _StoreItem(SQLTransaction& trans, BankTab* pTab, Item* pItem, ItemPosCount& pos, bool clone) const; + bool _ReserveSpace(uint8 slotId, Item* pItem, Item* pItemDest, uint32& count); + void CanStoreItemInTab(Item* pItem, uint8 skipSlotId, bool merge, uint32& count); + }; + + typedef std::unordered_map<uint32, Member*> Members; + typedef std::vector<RankInfo> Ranks; + typedef std::vector<BankTab*> BankTabs; - uint32 GetRights() const { return m_rights; } - void SetRights(uint32 rights); + public: + static void SendCommandResult(WorldSession* session, GuildCommandType type, GuildCommandError errCode, std::string const& param = ""); + static void SendSaveEmblemResult(WorldSession* session, GuildEmblemError errCode); - int32 GetBankMoneyPerDay() const { return m_bankMoneyPerDay; } + Guild(); + ~Guild(); - void SetBankMoneyPerDay(uint32 money); + bool Create(Player* pLeader, std::string const& name); + void Disband(); - inline int8 GetBankTabRights(uint8 tabId) const + // Getters + ObjectGuid::LowType GetId() const { return m_id; } + ObjectGuid GetLeaderGUID() const { return m_leaderGuid; } + std::string const& GetName() const { return m_name; } + std::string const& GetMOTD() const { return m_motd; } + std::string const& GetInfo() const { return m_info; } + uint32 GetMemberCount() const { return m_members.size(); } + time_t GetCreatedDate() const { return m_createdDate; } + uint64 GetBankMoney() const { return m_bankMoney; } + + bool SetName(std::string const& name); + + // Handle client commands + void HandleRoster(WorldSession* session); + void HandleQuery(WorldSession* session); + void HandleSetMOTD(WorldSession* session, std::string const& motd); + void HandleSetInfo(WorldSession* session, std::string const& info); + void HandleSetEmblem(WorldSession* session, const EmblemInfo& emblemInfo); + void HandleSetLeader(WorldSession* session, std::string const& name); + void HandleSetBankTabInfo(WorldSession* session, uint8 tabId, std::string const& name, std::string const& icon); + void HandleSetMemberNote(WorldSession* session, std::string const& name, std::string const& note, bool officer); + void HandleSetRankInfo(WorldSession* session, uint8 rankId, std::string const& name, uint32 rights, uint32 moneyPerDay, const GuildBankRightsAndSlotsVec& 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 const& name); + void HandleUpdateMemberRank(WorldSession* session, std::string const& name, bool demote); + void HandleAddNewRank(WorldSession* session, std::string const& 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); + + // Send info to client + void SendInfo(WorldSession* session) const; + void SendEventLog(WorldSession* session) const; + void SendBankLog(WorldSession* session, uint8 tabId) const; + void SendBankTabsInfo(WorldSession* session, bool showTabs = false) const; + void SendBankTabData(WorldSession* session, uint8 tabId) const; + void SendBankTabText(WorldSession* session, uint8 tabId) const; + void SendPermissions(WorldSession* session) const; + void SendMoneyInfo(WorldSession* session) const; + void SendLoginInfo(WorldSession* session); + + // Load from DB + 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(); + + // Broadcasts + void BroadcastToGuild(WorldSession* session, bool officerOnly, std::string const& msg, uint32 language = LANG_UNIVERSAL) const; + void BroadcastPacketToRank(WorldPacket* packet, uint8 rankId) const; + void BroadcastPacket(WorldPacket* packet) const; + + void MassInviteToEvent(WorldSession* session, uint32 minLevel, uint32 maxLevel, uint32 minRank); + + template<class Do> + void BroadcastWorker(Do& _do, Player* except = NULL) { - return tabId < GUILD_BANK_MAX_TABS ? m_bankTabRightsAndSlots[tabId].GetRights() : 0; + for (Members::iterator itr = m_members.begin(); itr != m_members.end(); ++itr) + if (Player* player = itr->second->FindConnectedPlayer()) + if (player != except) + _do(player); } - inline int32 GetBankTabSlotsPerDay(uint8 tabId) const - { - return tabId < GUILD_BANK_MAX_TABS ? m_bankTabRightsAndSlots[tabId].GetSlots() : 0; - } + // Members + // Adds member to guild. If rankId == GUILD_RANK_NONE, lowest rank is assigned. + 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 SetBankTabSlotsAndRights(GuildBankRightsAndSlots rightsAndSlots, bool saveToDB); - void CreateMissingTabsIfNeeded(uint8 ranks, SQLTransaction& trans, bool logOnCreate = false); + // Bank + 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); - private: - ObjectGuid::LowType m_guildId; + // Bank tabs + void SetBankTabText(uint8 tabId, std::string const& text); - uint8 m_rankId; + void ResetTimes(); + + protected: + ObjectGuid::LowType m_id; std::string m_name; - uint32 m_rights; - uint32 m_bankMoneyPerDay; - GuildBankRightsAndSlots m_bankTabRightsAndSlots[GUILD_BANK_MAX_TABS]; - }; + ObjectGuid m_leaderGuid; + std::string m_motd; + std::string m_info; + time_t m_createdDate; - class BankTab - { - public: - BankTab(ObjectGuid::LowType guildId, uint8 tabId) : m_guildId(guildId), m_tabId(tabId) - { - memset(m_items, 0, GUILD_BANK_MAX_SLOTS * sizeof(Item*)); - } + EmblemInfo m_emblemInfo; + uint32 m_accountsNumber; + uint64 m_bankMoney; - void LoadFromDB(Field* fields); - bool LoadItemFromDB(Field* fields); - void Delete(SQLTransaction& trans, bool removeItemsFromDB = false); + Ranks m_ranks; + Members m_members; + BankTabs m_bankTabs; - void WritePacket(WorldPacket& data) const; - bool WriteSlotPacket(WorldPacket& data, uint8 slotId, bool ignoreEmpty = true) const; - void WriteInfoPacket(WorldPacket& data) const + // These are actually ordered lists. The first element is the oldest entry. + LogHolder* m_eventLog; + LogHolder* m_bankEventLog[GUILD_BANK_MAX_TABS + 1]; + + private: + inline uint8 _GetRanksSize() const { return uint8(m_ranks.size()); } + inline const RankInfo* GetRankInfo(uint8 rankId) const { return rankId < _GetRanksSize() ? &m_ranks[rankId] : NULL; } + inline RankInfo* GetRankInfo(uint8 rankId) { return rankId < _GetRanksSize() ? &m_ranks[rankId] : NULL; } + inline bool _HasRankRight(Player* player, uint32 right) const { - data << m_name; - data << m_icon; + if (player) + if (Member const* member = GetMember(player->GetGUID())) + return (_GetRankRights(member->GetRankId()) & right) != GR_RIGHT_EMPTY; + return false; } - void SetInfo(std::string const& name, std::string const& icon); - void SetText(std::string const& text); - void SendText(const Guild* guild, WorldSession* session) const; + inline uint8 _GetLowestRankId() const { return uint8(m_ranks.size() - 1); } - inline Item* GetItem(uint8 slotId) const { return slotId < GUILD_BANK_MAX_SLOTS ? m_items[slotId] : NULL; } - bool SetItem(SQLTransaction& trans, uint8 slotId, Item* pItem); + inline uint8 _GetPurchasedTabsSize() const { return uint8(m_bankTabs.size()); } + inline BankTab* GetBankTab(uint8 tabId) { return tabId < m_bankTabs.size() ? m_bankTabs[tabId] : NULL; } + inline const BankTab* GetBankTab(uint8 tabId) const { return tabId < m_bankTabs.size() ? m_bankTabs[tabId] : NULL; } - private: - ObjectGuid::LowType m_guildId; - uint8 m_tabId; - - Item* m_items[GUILD_BANK_MAX_SLOTS]; - std::string m_name; - std::string m_icon; - std::string m_text; - }; + inline const Member* GetMember(ObjectGuid guid) const + { + Members::const_iterator itr = m_members.find(guid.GetCounter()); + return itr != m_members.end() ? itr->second : NULL; + } - // Movement data - class MoveItemData - { - public: - MoveItemData(Guild* guild, Player* player, uint8 container, uint8 slotId) : m_pGuild(guild), m_pPlayer(player), - m_container(container), m_slotId(slotId), m_pItem(NULL), m_pClonedItem(NULL) { } - virtual ~MoveItemData() { } - - virtual bool IsBank() const = 0; - // Initializes item pointer. Returns true, if item exists, false otherwise. - virtual bool InitItem() = 0; - // Checks splited amount against item. Splited amount cannot be more that number of items in stack. - virtual bool CheckItem(uint32& splitedAmount); - // Defines if player has rights to save item in container - virtual bool HasStoreRights(MoveItemData* /*pOther*/) const { return true; } - // Defines if player has rights to withdraw item from container - virtual bool HasWithdrawRights(MoveItemData* /*pOther*/) const { return true; } - // Checks if container can store specified item - bool CanStore(Item* pItem, bool swap, bool sendError); - // Clones stored item - bool CloneItem(uint32 count); - // Remove item from container (if splited update items fields) - virtual void RemoveItem(SQLTransaction& trans, MoveItemData* pOther, uint32 splitedAmount = 0) = 0; - // Saves item to container - virtual Item* StoreItem(SQLTransaction& trans, Item* pItem) = 0; - // Log bank event - virtual void LogBankEvent(SQLTransaction& trans, MoveItemData* pFrom, uint32 count) const = 0; - // Log GM action - virtual void LogAction(MoveItemData* pFrom) const; - // Copy slots id from position vector - void CopySlots(SlotIds& ids) const; - - Item* GetItem(bool isCloned = false) const { return isCloned ? m_pClonedItem : m_pItem; } - uint8 GetContainer() const { return m_container; } - uint8 GetSlotId() const { return m_slotId; } + inline Member* GetMember(ObjectGuid guid) + { + Members::iterator itr = m_members.find(guid.GetCounter()); + return itr != m_members.end() ? itr->second : NULL; + } - protected: - virtual InventoryResult CanStore(Item* pItem, bool swap) = 0; - - Guild* m_pGuild; - Player* m_pPlayer; - uint8 m_container; - uint8 m_slotId; - Item* m_pItem; - Item* m_pClonedItem; - ItemPosCountVec m_vec; - }; - - class PlayerMoveItemData : public MoveItemData - { - public: - PlayerMoveItemData(Guild* guild, Player* player, uint8 container, uint8 slotId) : - MoveItemData(guild, player, container, slotId) { } - - bool IsBank() const override { return false; } - bool InitItem() override; - void RemoveItem(SQLTransaction& trans, MoveItemData* pOther, uint32 splitedAmount = 0) override; - Item* StoreItem(SQLTransaction& trans, Item* pItem) override; - void LogBankEvent(SQLTransaction& trans, MoveItemData* pFrom, uint32 count) const override; - protected: - InventoryResult CanStore(Item* pItem, bool swap) override; - }; + inline Member* GetMember(std::string const& name) + { + for (Members::iterator itr = m_members.begin(); itr != m_members.end(); ++itr) + if (itr->second->GetName() == name) + return itr->second; - class BankMoveItemData : public MoveItemData - { - public: - BankMoveItemData(Guild* guild, Player* player, uint8 container, uint8 slotId) : - MoveItemData(guild, player, container, slotId) { } - - bool IsBank() const override { return true; } - bool InitItem() override; - bool HasStoreRights(MoveItemData* pOther) const override; - bool HasWithdrawRights(MoveItemData* pOther) const override; - void RemoveItem(SQLTransaction& trans, MoveItemData* pOther, uint32 splitedAmount) override; - Item* StoreItem(SQLTransaction& trans, Item* pItem) override; - void LogBankEvent(SQLTransaction& trans, MoveItemData* pFrom, uint32 count) const override; - void LogAction(MoveItemData* pFrom) const override; + return NULL; + } - protected: - InventoryResult CanStore(Item* pItem, bool swap) override; + inline void _DeleteMemberFromDB(ObjectGuid::LowType lowguid) const + { + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_MEMBER); + stmt->setUInt32(0, lowguid); + CharacterDatabase.Execute(stmt); + } - private: - Item* _StoreItem(SQLTransaction& trans, BankTab* pTab, Item* pItem, ItemPosCount& pos, bool clone) const; - bool _ReserveSpace(uint8 slotId, Item* pItem, Item* pItemDest, uint32& count); - void CanStoreItemInTab(Item* pItem, uint8 skipSlotId, bool merge, uint32& count); - }; - - typedef std::unordered_map<uint32, Member*> Members; - typedef std::vector<RankInfo> Ranks; - typedef std::vector<BankTab*> BankTabs; - -public: - static void SendCommandResult(WorldSession* session, GuildCommandType type, GuildCommandError errCode, std::string const& param = ""); - static void SendSaveEmblemResult(WorldSession* session, GuildEmblemError errCode); - - Guild(); - ~Guild(); - - bool Create(Player* pLeader, std::string const& name); - void Disband(); - - // Getters - ObjectGuid::LowType GetId() const { return m_id; } - ObjectGuid GetLeaderGUID() const { return m_leaderGuid; } - std::string const& GetName() const { return m_name; } - std::string const& GetMOTD() const { return m_motd; } - std::string const& GetInfo() const { return m_info; } - uint32 GetMemberCount() const { return m_members.size(); } - time_t GetCreatedDate() const { return m_createdDate; } - uint64 GetBankMoney() const { return m_bankMoney; } - - bool SetName(std::string const& name); - - // Handle client commands - void HandleRoster(WorldSession* session); - void HandleQuery(WorldSession* session); - void HandleSetMOTD(WorldSession* session, std::string const& motd); - void HandleSetInfo(WorldSession* session, std::string const& info); - void HandleSetEmblem(WorldSession* session, const EmblemInfo& emblemInfo); - void HandleSetLeader(WorldSession* session, std::string const& name); - void HandleSetBankTabInfo(WorldSession* session, uint8 tabId, std::string const& name, std::string const& icon); - void HandleSetMemberNote(WorldSession* session, std::string const& name, std::string const& note, bool officer); - void HandleSetRankInfo(WorldSession* session, uint8 rankId, std::string const& name, uint32 rights, uint32 moneyPerDay, const GuildBankRightsAndSlotsVec& 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 const& name); - void HandleUpdateMemberRank(WorldSession* session, std::string const& name, bool demote); - void HandleAddNewRank(WorldSession* session, std::string const& 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); - - // Send info to client - void SendInfo(WorldSession* session) const; - void SendEventLog(WorldSession* session) const; - void SendBankLog(WorldSession* session, uint8 tabId) const; - void SendBankTabsInfo(WorldSession* session, bool showTabs = false) const; - void SendBankTabData(WorldSession* session, uint8 tabId) const; - void SendBankTabText(WorldSession* session, uint8 tabId) const; - void SendPermissions(WorldSession* session) const; - void SendMoneyInfo(WorldSession* session) const; - void SendLoginInfo(WorldSession* session); - - // Load from DB - 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(); - - // Broadcasts - void BroadcastToGuild(WorldSession* session, bool officerOnly, std::string const& msg, uint32 language = LANG_UNIVERSAL) const; - void BroadcastPacketToRank(WorldPacket* packet, uint8 rankId) const; - void BroadcastPacket(WorldPacket* packet) const; - - void MassInviteToEvent(WorldSession* session, uint32 minLevel, uint32 maxLevel, uint32 minRank); - - template<class Do> - void BroadcastWorker(Do& _do, Player* except = NULL) - { - for (Members::iterator itr = m_members.begin(); itr != m_members.end(); ++itr) - if (Player* player = itr->second->FindConnectedPlayer()) - if (player != except) - _do(player); - } - - // Members - // Adds member to guild. If rankId == GUILD_RANK_NONE, lowest rank is assigned. - 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); - - // Bank - 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); - - // Bank tabs - void SetBankTabText(uint8 tabId, std::string const& text); - - void ResetTimes(); - -protected: - ObjectGuid::LowType 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; - - Ranks m_ranks; - Members m_members; - BankTabs m_bankTabs; - - // These are actually ordered lists. The first element is the oldest entry. - LogHolder* m_eventLog; - LogHolder* m_bankEventLog[GUILD_BANK_MAX_TABS + 1]; - -private: - inline uint8 _GetRanksSize() const { return uint8(m_ranks.size()); } - inline const RankInfo* GetRankInfo(uint8 rankId) const { return rankId < _GetRanksSize() ? &m_ranks[rankId] : NULL; } - inline RankInfo* GetRankInfo(uint8 rankId) { return rankId < _GetRanksSize() ? &m_ranks[rankId] : NULL; } - inline bool _HasRankRight(Player* player, uint32 right) const - { - if (player) - if (Member const* member = GetMember(player->GetGUID())) - return (_GetRankRights(member->GetRankId()) & right) != GR_RIGHT_EMPTY; - return false; - } - - inline uint8 _GetLowestRankId() const { return uint8(m_ranks.size() - 1); } - - inline uint8 _GetPurchasedTabsSize() const { return uint8(m_bankTabs.size()); } - inline BankTab* GetBankTab(uint8 tabId) { return tabId < m_bankTabs.size() ? m_bankTabs[tabId] : NULL; } - inline const BankTab* GetBankTab(uint8 tabId) const { return tabId < m_bankTabs.size() ? m_bankTabs[tabId] : NULL; } - - inline const Member* GetMember(ObjectGuid guid) const - { - Members::const_iterator itr = m_members.find(guid.GetCounter()); - return itr != m_members.end() ? itr->second : NULL; - } - - inline Member* GetMember(ObjectGuid guid) - { - Members::iterator itr = m_members.find(guid.GetCounter()); - return itr != m_members.end() ? itr->second : NULL; - } - - inline Member* GetMember(std::string const& name) - { - for (Members::iterator itr = m_members.begin(); itr != m_members.end(); ++itr) - if (itr->second->GetName() == name) - return itr->second; - - return NULL; - } - - inline void _DeleteMemberFromDB(ObjectGuid::LowType lowguid) const - { - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_MEMBER); - stmt->setUInt32(0, lowguid); - CharacterDatabase.Execute(stmt); - } - - // Creates log holders (either when loading or when creating guild) - void _CreateLogHolders(); - // Tries to create new bank tab - void _CreateNewBankTab(); - // Creates default guild ranks with names in given locale - void _CreateDefaultGuildRanks(LocaleConstant loc); - // Creates new rank - bool _CreateRank(std::string const& name, uint32 rights); - // Update account number when member added/removed from guild - void _UpdateAccountsNumber(); - bool _IsLeader(Player* player) const; - void _DeleteBankItems(SQLTransaction& trans, bool removeItemsFromDB = false); - bool _ModifyBankMoney(SQLTransaction& 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(SQLTransaction& trans, ObjectGuid guid, uint8 tabId); - bool _MemberHasTabRights(ObjectGuid guid, uint8 tabId, uint32 rights) const; - - void _LogEvent(GuildEventLogTypes eventType, ObjectGuid::LowType playerGuid1, ObjectGuid::LowType playerGuid2 = 0, uint8 newRank = 0); - void _LogBankEvent(SQLTransaction& trans, GuildBankEventLogTypes eventType, uint8 tabId, ObjectGuid::LowType playerGuid, uint32 itemOrMoney, uint16 itemStackCount = 0, uint8 destTabId = 0); - - Item* _GetItem(uint8 tabId, uint8 slotId) const; - void _RemoveItem(SQLTransaction& 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) const; - void _SendBankMoneyUpdate(WorldSession* session) const; - void _SendBankContentUpdate(MoveItemData* pSrc, MoveItemData* pDest) const; - void _SendBankContentUpdate(uint8 tabId, SlotIds slots) const; - void _SendBankList(WorldSession* session = NULL, uint8 tabId = 0, bool sendFullSlots = false, SlotIds *slots = NULL) const; - - void _BroadcastEvent(GuildEvents guildEvent, ObjectGuid guid, const char* param1 = NULL, const char* param2 = NULL, const char* param3 = NULL) const; + // Creates log holders (either when loading or when creating guild) + void _CreateLogHolders(); + // Tries to create new bank tab + void _CreateNewBankTab(); + // Creates default guild ranks with names in given locale + void _CreateDefaultGuildRanks(LocaleConstant loc); + // Creates new rank + bool _CreateRank(std::string const& name, uint32 rights); + // Update account number when member added/removed from guild + void _UpdateAccountsNumber(); + bool _IsLeader(Player* player) const; + void _DeleteBankItems(SQLTransaction& trans, bool removeItemsFromDB = false); + bool _ModifyBankMoney(SQLTransaction& 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(SQLTransaction& trans, ObjectGuid guid, uint8 tabId); + bool _MemberHasTabRights(ObjectGuid guid, uint8 tabId, uint32 rights) const; + + void _LogEvent(GuildEventLogTypes eventType, ObjectGuid::LowType playerGuid1, ObjectGuid::LowType playerGuid2 = 0, uint8 newRank = 0); + void _LogBankEvent(SQLTransaction& trans, GuildBankEventLogTypes eventType, uint8 tabId, ObjectGuid::LowType playerGuid, uint32 itemOrMoney, uint16 itemStackCount = 0, uint8 destTabId = 0); + + Item* _GetItem(uint8 tabId, uint8 slotId) const; + void _RemoveItem(SQLTransaction& 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) const; + void _SendBankMoneyUpdate(WorldSession* session) const; + void _SendBankContentUpdate(MoveItemData* pSrc, MoveItemData* pDest) const; + void _SendBankContentUpdate(uint8 tabId, SlotIds slots) const; + void _SendBankList(WorldSession* session = NULL, uint8 tabId = 0, bool sendFullSlots = false, SlotIds *slots = NULL) const; + + void _BroadcastEvent(GuildEvents guildEvent, ObjectGuid guid, const char* param1 = NULL, const char* param2 = NULL, const char* param3 = NULL) const; }; #endif |
