mirror of
https://github.com/mangosfour/server.git
synced 2025-12-29 16:37:04 +00:00
[c12642] Fix client crash on guild bank display
This commit is contained in:
parent
5c21144f6b
commit
c3eccda44d
3 changed files with 539 additions and 277 deletions
185
src/game/Guild.h
185
src/game/Guild.h
|
|
@ -19,7 +19,7 @@
|
|||
#ifndef MANGOSSERVER_GUILD_H
|
||||
#define MANGOSSERVER_GUILD_H
|
||||
|
||||
#define WITHDRAW_MONEY_UNLIMITED 0xFFFFFFFF
|
||||
#define WITHDRAW_MONEY_UNLIMITED UI64LIT(0xFFFFFFFFFFFFFFFF)
|
||||
#define WITHDRAW_SLOT_UNLIMITED 0xFFFFFFFF
|
||||
|
||||
#include "Common.h"
|
||||
|
|
@ -29,9 +29,6 @@
|
|||
|
||||
class Item;
|
||||
|
||||
#define GUILD_RANKS_MIN_COUNT 5
|
||||
#define GUILD_RANKS_MAX_COUNT 10
|
||||
|
||||
enum GuildDefaultRanks
|
||||
{
|
||||
// these ranks can be modified, but they cannot be deleted
|
||||
|
|
@ -46,25 +43,28 @@ enum GuildDefaultRanks
|
|||
|
||||
enum GuildRankRights
|
||||
{
|
||||
GR_RIGHT_EMPTY = 0x00000040,
|
||||
GR_RIGHT_GCHATLISTEN = 0x00000041,
|
||||
GR_RIGHT_GCHATSPEAK = 0x00000042,
|
||||
GR_RIGHT_OFFCHATLISTEN = 0x00000044,
|
||||
GR_RIGHT_OFFCHATSPEAK = 0x00000048,
|
||||
GR_RIGHT_PROMOTE = 0x000000C0,
|
||||
GR_RIGHT_DEMOTE = 0x00000140,
|
||||
GR_RIGHT_INVITE = 0x00000050,
|
||||
GR_RIGHT_REMOVE = 0x00000060,
|
||||
GR_RIGHT_SETMOTD = 0x00001040,
|
||||
GR_RIGHT_EPNOTE = 0x00002040,
|
||||
GR_RIGHT_VIEWOFFNOTE = 0x00004040,
|
||||
GR_RIGHT_EOFFNOTE = 0x00008040,
|
||||
GR_RIGHT_MODIFY_GUILD_INFO = 0x00010040,
|
||||
GR_RIGHT_WITHDRAW_GOLD_LOCK = 0x00020000, // remove money withdraw capacity
|
||||
GR_RIGHT_WITHDRAW_REPAIR = 0x00040000, // withdraw for repair
|
||||
GR_RIGHT_WITHDRAW_GOLD = 0x00080000, // withdraw gold
|
||||
GR_RIGHT_CREATE_GUILD_EVENT = 0x00100000, // wotlk
|
||||
GR_RIGHT_ALL = 0x001DF1FF
|
||||
GR_RIGHT_EMPTY = 0x00000040,
|
||||
GR_RIGHT_GCHATLISTEN = 0x00000041,
|
||||
GR_RIGHT_GCHATSPEAK = 0x00000042,
|
||||
GR_RIGHT_OFFCHATLISTEN = 0x00000044,
|
||||
GR_RIGHT_OFFCHATSPEAK = 0x00000048,
|
||||
GR_RIGHT_PROMOTE = 0x000000C0,
|
||||
GR_RIGHT_DEMOTE = 0x00000140,
|
||||
GR_RIGHT_INVITE = 0x00000050,
|
||||
GR_RIGHT_REMOVE = 0x00000060,
|
||||
GR_RIGHT_SETMOTD = 0x00001040,
|
||||
GR_RIGHT_EPNOTE = 0x00002040,
|
||||
GR_RIGHT_VIEWOFFNOTE = 0x00004040,
|
||||
GR_RIGHT_EOFFNOTE = 0x00008040,
|
||||
GR_RIGHT_MODIFY_GUILD_INFO = 0x00010040,
|
||||
GR_RIGHT_WITHDRAW_GOLD_LOCK = 0x00020000, // remove money withdraw capacity
|
||||
GR_RIGHT_WITHDRAW_REPAIR = 0x00040000, // withdraw for repair
|
||||
GR_RIGHT_WITHDRAW_GOLD = 0x00080000, // withdraw gold
|
||||
GR_RIGHT_CREATE_GUILD_EVENT = 0x00100000, // wotlk
|
||||
GR_RIGHT_REQUIRES_AUTHENTICATOR = 0x00200000,
|
||||
GR_RIGHT_MODIFY_BANK_TABS = 0x00400000, // cata?
|
||||
GR_RIGHT_REMOVE_GUILD_EVENT = 0x00800000, // wotlk
|
||||
GR_RIGHT_ALL = 0x00DDF1FF,
|
||||
};
|
||||
|
||||
enum Typecommand
|
||||
|
|
@ -74,36 +74,44 @@ enum Typecommand
|
|||
GUILD_QUIT_S = 0x03,
|
||||
// 0x05?
|
||||
GUILD_FOUNDER_S = 0x0E,
|
||||
GUILD_UNK1 = 0x13,
|
||||
GUILD_UNK2 = 0x14
|
||||
GUILD_UNK1 = 0x14,
|
||||
GUILD_UNK2 = 0x15,
|
||||
};
|
||||
|
||||
enum CommandErrors
|
||||
{
|
||||
ERR_PLAYER_NO_MORE_IN_GUILD = 0x00,
|
||||
ERR_GUILD_INTERNAL = 0x01,
|
||||
ERR_ALREADY_IN_GUILD = 0x02,
|
||||
ERR_ALREADY_IN_GUILD_S = 0x03,
|
||||
ERR_INVITED_TO_GUILD = 0x04,
|
||||
ERR_ALREADY_INVITED_TO_GUILD_S = 0x05,
|
||||
ERR_GUILD_NAME_INVALID = 0x06,
|
||||
ERR_GUILD_NAME_EXISTS_S = 0x07,
|
||||
ERR_GUILD_LEADER_LEAVE = 0x08,
|
||||
ERR_GUILD_PERMISSIONS = 0x08,
|
||||
ERR_GUILD_PLAYER_NOT_IN_GUILD = 0x09,
|
||||
ERR_GUILD_PLAYER_NOT_IN_GUILD_S = 0x0A,
|
||||
ERR_GUILD_PLAYER_NOT_FOUND_S = 0x0B,
|
||||
ERR_GUILD_NOT_ALLIED = 0x0C,
|
||||
ERR_GUILD_RANK_TOO_HIGH_S = 0x0D,
|
||||
ERR_GUILD_RANK_TOO_LOW_S = 0x0E,
|
||||
ERR_GUILD_RANKS_LOCKED = 0x11,
|
||||
ERR_GUILD_RANK_IN_USE = 0x12,
|
||||
ERR_GUILD_IGNORING_YOU_S = 0x13,
|
||||
ERR_GUILD_UNK1 = 0x14,
|
||||
ERR_GUILD_WITHDRAW_LIMIT = 0x19,
|
||||
ERR_GUILD_NOT_ENOUGH_MONEY = 0x1A,
|
||||
ERR_GUILD_BANK_FULL = 0x1C,
|
||||
ERR_GUILD_ITEM_NOT_FOUND = 0x1D
|
||||
ERR_PLAYER_NO_MORE_IN_GUILD = 0x00,
|
||||
ERR_GUILD_INTERNAL = 0x01,
|
||||
ERR_ALREADY_IN_GUILD = 0x02,
|
||||
ERR_ALREADY_IN_GUILD_S = 0x03,
|
||||
ERR_INVITED_TO_GUILD = 0x04,
|
||||
ERR_ALREADY_INVITED_TO_GUILD_S = 0x05,
|
||||
ERR_GUILD_NAME_INVALID = 0x06,
|
||||
ERR_GUILD_NAME_EXISTS_S = 0x07,
|
||||
ERR_GUILD_LEADER_LEAVE = 0x08,
|
||||
ERR_GUILD_PERMISSIONS = 0x08,
|
||||
ERR_GUILD_PLAYER_NOT_IN_GUILD = 0x09,
|
||||
ERR_GUILD_PLAYER_NOT_IN_GUILD_S = 0x0A,
|
||||
ERR_GUILD_PLAYER_NOT_FOUND_S = 0x0B,
|
||||
ERR_GUILD_NOT_ALLIED = 0x0C,
|
||||
ERR_GUILD_RANK_TOO_HIGH_S = 0x0D,
|
||||
ERR_GUILD_RANK_TOO_LOW_S = 0x0E,
|
||||
ERR_GUILD_RANKS_LOCKED = 0x11,
|
||||
ERR_GUILD_RANK_IN_USE = 0x12,
|
||||
ERR_GUILD_IGNORING_YOU_S = 0x13,
|
||||
ERR_GUILD_UNK1 = 0x14,
|
||||
ERR_GUILD_WITHDRAW_LIMIT = 0x19,
|
||||
ERR_GUILD_NOT_ENOUGH_MONEY = 0x1A,
|
||||
ERR_GUILD_BANK_FULL = 0x1C,
|
||||
ERR_GUILD_ITEM_NOT_FOUND = 0x1D,
|
||||
ERR_GUILD_TOO_MUCH_MONEY = 0x1F,
|
||||
ERR_GUILD_BANK_WRONG_TAB = 0x20,
|
||||
ERR_RANK_REQUIRES_AUTHENTICATOR = 0x22,
|
||||
ERR_GUILD_BANK_VOUCHER_FAILED = 0x23,
|
||||
ERR_GUILD_TRIAL_ACCOUNT = 0x24,
|
||||
ERR_GUILD_UNDELETABLE_DUE_TO_LEVEL = 0x25,
|
||||
ERR_GUILD_MOVE_STARTING = 0x26,
|
||||
ERR_GUILD_REP_TOO_LOW = 0x27,
|
||||
};
|
||||
|
||||
enum GuildEvents
|
||||
|
|
@ -117,7 +125,7 @@ enum GuildEvents
|
|||
GE_LEADER_IS = 0x07,
|
||||
GE_LEADER_CHANGED = 0x08,
|
||||
GE_DISBANDED = 0x09,
|
||||
GE_TABARDCHANGE = 0x0A,
|
||||
//GE_TABARDCHANGE = 0x0A, // not exists in 4.3.4
|
||||
GE_UPDATE_RANK = 0x0B, // string, string EVENT_GUILD_ROSTER_UPDATE tab content change?
|
||||
GE_CREATE_RANK = 0x0C, // EVENT_GUILD_ROSTER_UPDATE
|
||||
GE_DELETE_RANK = 0x0D,
|
||||
|
|
@ -129,7 +137,7 @@ enum GuildEvents
|
|||
GE_BANKTAB_PURCHASED = 0x13, // EVENT_GUILDBANK_UPDATE_TABS
|
||||
GE_BANKTAB_UPDATED = 0x14, // EVENT_GUILDBANK_UPDATE_TABS
|
||||
GE_GUILDBANK_UPDATE_MONEY = 0x15, // EVENT_GUILDBANK_UPDATE_MONEY, string 0000000000002710 is 1 gold
|
||||
GE_GUILD_BANK_MONEY_WITHDRAWN = 0x16, // MSG_GUILD_BANK_MONEY_WITHDRAWN
|
||||
//GE_GUILD_BANK_MONEY_WITHDRAWN = 0x16, // not exists in 4.3.4
|
||||
GE_GUILDBANK_TEXT_CHANGED = 0x17 // EVENT_GUILDBANK_TEXT_CHANGED
|
||||
};
|
||||
|
||||
|
|
@ -138,15 +146,20 @@ enum PetitionTurns
|
|||
PETITION_TURN_OK = 0,
|
||||
PETITION_TURN_ALREADY_IN_GUILD = 2,
|
||||
PETITION_TURN_NEED_MORE_SIGNATURES = 4,
|
||||
PETITION_TURN_GUILD_PERMISSIONS = 11,
|
||||
PETITION_TURN_GUILD_NAME_INVALID = 12,
|
||||
};
|
||||
|
||||
enum PetitionSigns
|
||||
{
|
||||
PETITION_SIGN_OK = 0,
|
||||
PETITION_SIGN_ALREADY_SIGNED = 1,
|
||||
PETITION_SIGN_ALREADY_IN_GUILD = 2,
|
||||
PETITION_SIGN_CANT_SIGN_OWN = 3,
|
||||
PETITION_SIGN_NOT_SERVER = 4,
|
||||
PETITION_SIGN_OK = 0,
|
||||
PETITION_SIGN_ALREADY_SIGNED = 1,
|
||||
PETITION_SIGN_ALREADY_IN_GUILD = 2,
|
||||
PETITION_SIGN_CANT_SIGN_OWN = 3,
|
||||
PETITION_SIGN_NOT_SAME_SERVER = 5,
|
||||
PETITION_SIGN_PETITION_FULL = 8,
|
||||
PETITION_SIGN_ALREADY_SIGNED_OTHER = 10,
|
||||
PETITION_SIGN_RESTRICTED_ACCOUNT = 11,
|
||||
};
|
||||
|
||||
enum GuildBankRights
|
||||
|
|
@ -161,15 +174,16 @@ enum GuildBankRights
|
|||
|
||||
enum GuildBankEventLogTypes
|
||||
{
|
||||
GUILD_BANK_LOG_DEPOSIT_ITEM = 1,
|
||||
GUILD_BANK_LOG_WITHDRAW_ITEM = 2,
|
||||
GUILD_BANK_LOG_MOVE_ITEM = 3,
|
||||
GUILD_BANK_LOG_DEPOSIT_MONEY = 4,
|
||||
GUILD_BANK_LOG_WITHDRAW_MONEY = 5,
|
||||
GUILD_BANK_LOG_REPAIR_MONEY = 6,
|
||||
GUILD_BANK_LOG_MOVE_ITEM2 = 7,
|
||||
GUILD_BANK_LOG_UNK1 = 8,
|
||||
GUILD_BANK_LOG_UNK2 = 9,
|
||||
GUILD_BANK_LOG_DEPOSIT_ITEM = 1,
|
||||
GUILD_BANK_LOG_WITHDRAW_ITEM = 2,
|
||||
GUILD_BANK_LOG_MOVE_ITEM = 3,
|
||||
GUILD_BANK_LOG_DEPOSIT_MONEY = 4,
|
||||
GUILD_BANK_LOG_WITHDRAW_MONEY = 5,
|
||||
GUILD_BANK_LOG_REPAIR_MONEY = 6,
|
||||
GUILD_BANK_LOG_MOVE_ITEM2 = 7,
|
||||
GUILD_BANK_LOG_UNK1 = 8,
|
||||
GUILD_BANK_LOG_BUY_SLOT = 9,
|
||||
GUILD_BANK_LOG_CASH_FLOW_DEPOSIT = 10,
|
||||
};
|
||||
|
||||
enum GuildEventLogTypes
|
||||
|
|
@ -192,7 +206,16 @@ enum GuildEmblem
|
|||
ERR_GUILDEMBLEM_INVALIDVENDOR = 5
|
||||
};
|
||||
|
||||
inline uint32 GetGuildBankTabPrice(uint8 Index)
|
||||
enum GuildMemberFlags
|
||||
{
|
||||
GUILDMEMBER_STATUS_NONE = 0x0000,
|
||||
GUILDMEMBER_STATUS_ONLINE = 0x0001,
|
||||
GUILDMEMBER_STATUS_AFK = 0x0002,
|
||||
GUILDMEMBER_STATUS_DND = 0x0004,
|
||||
GUILDMEMBER_STATUS_MOBILE = 0x0008,
|
||||
};
|
||||
|
||||
inline uint64 GetGuildBankTabPrice(uint8 Index)
|
||||
{
|
||||
switch (Index)
|
||||
{
|
||||
|
|
@ -214,6 +237,8 @@ struct GuildEventLogEntry
|
|||
uint32 PlayerGuid2;
|
||||
uint8 NewRank;
|
||||
uint64 TimeStamp;
|
||||
|
||||
void WriteData(WorldPacket& data, ByteBuffer& buffer);
|
||||
};
|
||||
|
||||
struct GuildBankEventLogEntry
|
||||
|
|
@ -231,6 +256,8 @@ struct GuildBankEventLogEntry
|
|||
EventType == GUILD_BANK_LOG_WITHDRAW_MONEY ||
|
||||
EventType == GUILD_BANK_LOG_REPAIR_MONEY;
|
||||
}
|
||||
|
||||
void WriteData(WorldPacket& data, ByteBuffer& buffer);
|
||||
};
|
||||
|
||||
struct GuildBankTab
|
||||
|
|
@ -310,7 +337,9 @@ class Guild
|
|||
typedef UNORDERED_MAP<uint32, MemberSlot> MemberList;
|
||||
typedef std::vector<RankInfo> RankList;
|
||||
|
||||
uint32 GetId() { return m_Id; }
|
||||
uint32 GetId() const { return m_Id; }
|
||||
uint32 GetLevel() const { return m_Level; }
|
||||
ObjectGuid GetObjectGuid() const { return ObjectGuid(HIGHGUID_GUILD, 0, m_Id); }
|
||||
ObjectGuid GetLeaderGuid() const { return m_LeaderGuid; }
|
||||
std::string const& GetName() const { return m_Name; }
|
||||
std::string const& GetMOTD() const { return MOTD; }
|
||||
|
|
@ -348,6 +377,8 @@ class Guild
|
|||
void BroadcastAddonToOfficers(WorldSession* session, const std::string& msg, const std::string& prefix);
|
||||
void BroadcastPacketToRank(WorldPacket* packet, uint32 rankId);
|
||||
void BroadcastPacket(WorldPacket* packet);
|
||||
// for calendar
|
||||
void MassInviteToEvent(WorldSession* session, uint32 minLevel, uint32 maxLevel, uint32 minRank);
|
||||
|
||||
void BroadcastEvent(GuildEvents event, ObjectGuid guid, char const* str1 = NULL, char const* str2 = NULL, char const* str3 = NULL);
|
||||
void BroadcastEvent(GuildEvents event, char const* str1 = NULL, char const* str2 = NULL, char const* str3 = NULL)
|
||||
|
|
@ -365,7 +396,8 @@ class Guild
|
|||
}
|
||||
|
||||
void CreateRank(std::string name, uint32 rights);
|
||||
void DelRank();
|
||||
void DelRank(uint32 rankId);
|
||||
void SwitchRank(uint32 rankId, bool up);
|
||||
std::string GetRankName(uint32 rankId);
|
||||
uint32 GetRankRights(uint32 rankId);
|
||||
uint32 GetRanksSize() const { return m_Ranks.size(); }
|
||||
|
|
@ -377,6 +409,15 @@ class Guild
|
|||
return ((GetRankRights(rankId) & right) != GR_RIGHT_EMPTY) ? true : false;
|
||||
}
|
||||
|
||||
bool HasMembersWithRank(uint32 rankId) const
|
||||
{
|
||||
for (MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
|
||||
if (itr->second.RankId == rankId)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
int32 GetRank(ObjectGuid guid)
|
||||
{
|
||||
MemberSlot* slot = GetMemberSlot(guid);
|
||||
|
|
@ -400,6 +441,7 @@ class Guild
|
|||
|
||||
void Roster(WorldSession* session = NULL); // NULL = broadcast
|
||||
void Query(WorldSession* session);
|
||||
void QueryRanks(WorldSession* session);
|
||||
|
||||
// Guild EventLog
|
||||
void LoadGuildEventLogFromDB();
|
||||
|
|
@ -429,13 +471,13 @@ class Guild
|
|||
void LoadGuildBankFromDB();
|
||||
// Money deposit/withdraw
|
||||
void SendMoneyInfo(WorldSession* session, uint32 LowGuid);
|
||||
bool MemberMoneyWithdraw(uint32 amount, uint32 LowGuid);
|
||||
bool MemberMoneyWithdraw(uint64 amount, uint32 LowGuid);
|
||||
uint64 GetGuildBankMoney() { return m_GuildBankMoney; }
|
||||
void SetBankMoney(int64 money);
|
||||
// per days
|
||||
bool MemberItemWithdraw(uint8 TabId, uint32 LowGuid);
|
||||
uint32 GetMemberSlotWithdrawRem(uint32 LowGuid, uint8 TabId);
|
||||
uint32 GetMemberMoneyWithdrawRem(uint32 LowGuid);
|
||||
uint64 GetMemberMoneyWithdrawRem(uint32 LowGuid);
|
||||
void SetBankMoneyPerDay(uint32 rankId, uint32 money);
|
||||
void SetBankRightsAndSlots(uint32 rankId, uint8 TabId, uint32 right, uint32 SlotPerDay, bool db);
|
||||
uint32 GetBankMoneyPerDay(uint32 rankId);
|
||||
|
|
@ -452,6 +494,7 @@ class Guild
|
|||
void AddRank(const std::string& name, uint32 rights, uint32 money);
|
||||
|
||||
uint32 m_Id;
|
||||
uint32 m_Level;
|
||||
std::string m_Name;
|
||||
ObjectGuid m_LeaderGuid;
|
||||
std::string MOTD;
|
||||
|
|
@ -498,7 +541,7 @@ class Guild
|
|||
void DisplayGuildBankContentUpdate(uint8 TabId, GuildItemPosCountVec const& slots);
|
||||
|
||||
// internal common parts for CanStore/StoreItem functions
|
||||
void AppendDisplayGuildBankSlot(WorldPacket& data, GuildBankTab const* tab, int32 slot);
|
||||
void AppendDisplayGuildBankSlot(WorldPacket& data, ByteBuffer& buffer, GuildBankTab const* tab, int32 slot);
|
||||
InventoryResult _CanStoreItem_InSpecificSlot(uint8 tab, uint8 slot, GuildItemPosCountVec& dest, uint32& count, bool swap, Item* pSrcItem) const;
|
||||
InventoryResult _CanStoreItem_InTab(uint8 tab, GuildItemPosCountVec& dest, uint32& count, bool merge, Item* pSrcItem, uint8 skip_slot) const;
|
||||
Item* _StoreItem(uint8 tab, uint8 slot, Item* pItem, uint32 count, bool clone);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue