2 * Copyright (C) 2005-2010 MaNGOS <http://getmangos.com/>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #ifndef MANGOSSERVER_GUILD_H
20 #define MANGOSSERVER_GUILD_H
22 #define WITHDRAW_MONEY_UNLIMITED 0xFFFFFFFF
23 #define WITHDRAW_SLOT_UNLIMITED 0xFFFFFFFF
27 #include "ObjectDefines.h"
31 #define GUILD_RANKS_MIN_COUNT 5
32 #define GUILD_RANKS_MAX_COUNT 10
34 enum GuildDefaultRanks
36 //these ranks can be modified, but they cannot be deleted
42 //When promoting member server does: rank--;!
43 //When demoting member server does: rank++;!
48 GR_RIGHT_EMPTY
= 0x00000040,
49 GR_RIGHT_GCHATLISTEN
= 0x00000041,
50 GR_RIGHT_GCHATSPEAK
= 0x00000042,
51 GR_RIGHT_OFFCHATLISTEN
= 0x00000044,
52 GR_RIGHT_OFFCHATSPEAK
= 0x00000048,
53 GR_RIGHT_PROMOTE
= 0x000000C0,
54 GR_RIGHT_DEMOTE
= 0x00000140,
55 GR_RIGHT_INVITE
= 0x00000050,
56 GR_RIGHT_REMOVE
= 0x00000060,
57 GR_RIGHT_SETMOTD
= 0x00001040,
58 GR_RIGHT_EPNOTE
= 0x00002040,
59 GR_RIGHT_VIEWOFFNOTE
= 0x00004040,
60 GR_RIGHT_EOFFNOTE
= 0x00008040,
61 GR_RIGHT_MODIFY_GUILD_INFO
= 0x00010040,
62 GR_RIGHT_WITHDRAW_GOLD_LOCK
= 0x00020000, // remove money withdraw capacity
63 GR_RIGHT_WITHDRAW_REPAIR
= 0x00040000, // withdraw for repair
64 GR_RIGHT_WITHDRAW_GOLD
= 0x00080000, // withdraw gold
65 GR_RIGHT_CREATE_GUILD_EVENT
= 0x00100000, // wotlk
66 GR_RIGHT_ALL
= 0x001DF1FF
71 GUILD_CREATE_S
= 0x00,
72 GUILD_INVITE_S
= 0x01,
74 GUILD_FOUNDER_S
= 0x0E,
82 GUILD_PLAYER_NO_MORE_IN_GUILD
= 0x00,
83 GUILD_INTERNAL
= 0x01,
84 GUILD_ALREADY_IN_GUILD
= 0x02,
85 ALREADY_IN_GUILD
= 0x03,
86 INVITED_TO_GUILD
= 0x04,
87 ALREADY_INVITED_TO_GUILD
= 0x05,
88 GUILD_NAME_INVALID
= 0x06,
89 GUILD_NAME_EXISTS
= 0x07,
90 GUILD_LEADER_LEAVE
= 0x08,
91 GUILD_PERMISSIONS
= 0x08,
92 GUILD_PLAYER_NOT_IN_GUILD
= 0x09,
93 GUILD_PLAYER_NOT_IN_GUILD_S
= 0x0A,
94 GUILD_PLAYER_NOT_FOUND
= 0x0B,
95 GUILD_NOT_ALLIED
= 0x0C,
96 GUILD_RANK_TOO_HIGH_S
= 0x0D,
97 GUILD_ALREADY_LOWEST_RANK_S
= 0x0E,
98 GUILD_TEMP_ERROR
= 0x11,
99 GUILD_RANK_IN_USE
= 0x12,
101 GUILD_ERR_UNK1
= 0x17,
102 GUILD_WITHDRAW_TOO_MUCH
= 0x18,
103 GUILD_BANK_NO_MONEY
= 0x19,
104 GUILD_BANK_TAB_IS_FULL
= 0x1B,
105 GUILD_BANK_ITEM_NOT_FOUND
= 0x1C
117 GE_LEADER_CHANGED
= 0x07,
119 GE_TABARDCHANGE
= 0x09,
120 GE_UNK1
= 0x0A, // string, string EVENT_GUILD_ROSTER_UPDATE
121 GE_UNK2
= 0x0B, // EVENT_GUILD_ROSTER_UPDATE
122 GE_SIGNED_ON
= 0x0C, // ERR_FRIEND_ONLINE_SS
123 GE_SIGNED_OFF
= 0x0D, // ERR_FRIEND_OFFLINE_S
124 GE_UNK3
= 0x0E, // EVENT_GUILDBANKBAGSLOTS_CHANGED
125 GE_BANKTAB_PURCHASED
= 0x0F, // EVENT_GUILDBANK_UPDATE_TABS
126 GE_UNK5
= 0x10, // EVENT_GUILDBANK_UPDATE_TABS
127 GE_UNK6
= 0x11, // EVENT_GUILDBANK_UPDATE_MONEY, string 0000000000002710 is 1 gold
128 GE_UNK7
= 0x12, // MSG_GUILD_BANK_MONEY_WITHDRAWN
129 GE_UNK8
= 0x13 // EVENT_GUILDBANK_TEXT_CHANGED
134 PETITION_TURN_OK
= 0,
135 PETITION_TURN_ALREADY_IN_GUILD
= 2,
136 PETITION_TURN_NEED_MORE_SIGNATURES
= 4,
141 PETITION_SIGN_OK
= 0,
142 PETITION_SIGN_ALREADY_SIGNED
= 1,
143 PETITION_SIGN_ALREADY_IN_GUILD
= 2,
144 PETITION_SIGN_CANT_SIGN_OWN
= 3,
145 PETITION_SIGN_NOT_SERVER
= 4,
150 GUILD_BANK_RIGHT_VIEW_TAB
= 0x01,
151 GUILD_BANK_RIGHT_PUT_ITEM
= 0x02,
152 GUILD_BANK_RIGHT_UPDATE_TEXT
= 0x04,
154 GUILD_BANK_RIGHT_DEPOSIT_ITEM
= GUILD_BANK_RIGHT_VIEW_TAB
| GUILD_BANK_RIGHT_PUT_ITEM
,
155 GUILD_BANK_RIGHT_FULL
= 0xFF,
158 enum GuildBankEventLogTypes
160 GUILD_BANK_LOG_DEPOSIT_ITEM
= 1,
161 GUILD_BANK_LOG_WITHDRAW_ITEM
= 2,
162 GUILD_BANK_LOG_MOVE_ITEM
= 3,
163 GUILD_BANK_LOG_DEPOSIT_MONEY
= 4,
164 GUILD_BANK_LOG_WITHDRAW_MONEY
= 5,
165 GUILD_BANK_LOG_REPAIR_MONEY
= 6,
166 GUILD_BANK_LOG_MOVE_ITEM2
= 7,
167 GUILD_BANK_LOG_UNK1
= 8,
168 GUILD_BANK_LOG_UNK2
= 9,
171 enum GuildEventLogTypes
173 GUILD_EVENT_LOG_INVITE_PLAYER
= 1,
174 GUILD_EVENT_LOG_JOIN_GUILD
= 2,
175 GUILD_EVENT_LOG_PROMOTE_PLAYER
= 3,
176 GUILD_EVENT_LOG_DEMOTE_PLAYER
= 4,
177 GUILD_EVENT_LOG_UNINVITE_PLAYER
= 5,
178 GUILD_EVENT_LOG_LEAVE_GUILD
= 6,
183 ERR_GUILDEMBLEM_SUCCESS
= 0,
184 ERR_GUILDEMBLEM_INVALID_TABARD_COLORS
= 1,
185 ERR_GUILDEMBLEM_NOGUILD
= 2,
186 ERR_GUILDEMBLEM_NOTGUILDMASTER
= 3,
187 ERR_GUILDEMBLEM_NOTENOUGHMONEY
= 4,
188 ERR_GUILDEMBLEM_INVALIDVENDOR
= 5
191 inline uint32
GetGuildBankTabPrice(uint8 Index
)
207 struct GuildEventLogEntry
216 struct GuildBankEventLogEntry
221 uint8 ItemStackCount
;
225 bool isMoneyEvent() const
227 return EventType
== GUILD_BANK_LOG_DEPOSIT_MONEY
||
228 EventType
== GUILD_BANK_LOG_WITHDRAW_MONEY
||
229 EventType
== GUILD_BANK_LOG_REPAIR_MONEY
;
235 Item
* Slots
[GUILD_BANK_MAX_SLOTS
];
241 struct GuildItemPosCount
243 GuildItemPosCount(uint8 _slot
, uint32 _count
) : Slot(_slot
), Count(_count
) {}
245 bool isContainedIn(std::vector
<GuildItemPosCount
> const& vec
) const;
250 typedef std::vector
<GuildItemPosCount
> GuildItemPosCountVec
;
262 uint32 BankResetTimeMoney
;
264 uint32 BankResetTimeTab
[GUILD_BANK_MAX_TABS
];
265 uint32 BankRemSlotsTab
[GUILD_BANK_MAX_TABS
];
270 RankInfo(const std::string
& _name
, uint32 _rights
, uint32 _money
) : Name(_name
), Rights(_rights
), BankMoneyPerDay(_money
)
272 for(uint8 i
= 0; i
< GUILD_BANK_MAX_TABS
; ++i
)
275 TabSlotPerDay
[i
] = 0;
281 uint32 BankMoneyPerDay
;
282 uint32 TabRight
[GUILD_BANK_MAX_TABS
];
283 uint32 TabSlotPerDay
[GUILD_BANK_MAX_TABS
];
292 bool Create(Player
* leader
, std::string gname
);
293 void CreateDefaultGuildRanks(int locale_idx
);
296 typedef std::map
<uint32
, MemberSlot
> MemberList
;
297 typedef std::vector
<RankInfo
> RankList
;
299 uint32
GetId(){ return m_Id
; }
300 const uint64
& GetLeader(){ return m_LeaderGuid
; }
301 std::string
const& GetName() const { return m_Name
; }
302 std::string
const& GetMOTD() const { return MOTD
; }
303 std::string
const& GetGINFO() const { return GINFO
; }
305 uint32
GetCreatedYear() const { return m_CreatedYear
; }
306 uint32
GetCreatedMonth() const { return m_CreatedMonth
; }
307 uint32
GetCreatedDay() const { return m_CreatedDay
; }
309 uint32
GetEmblemStyle() const { return m_EmblemStyle
; }
310 uint32
GetEmblemColor() const { return m_EmblemColor
; }
311 uint32
GetBorderStyle() const { return m_BorderStyle
; }
312 uint32
GetBorderColor() const { return m_BorderColor
; }
313 uint32
GetBackgroundColor() const { return m_BackgroundColor
; }
315 void SetLeader(uint64 guid
);
316 bool AddMember(uint64 plGuid
, uint32 plRank
);
317 void ChangeRank(uint64 guid
, uint32 newRank
);
318 void DelMember(uint64 guid
, bool isDisbanding
= false);
319 //lowest rank is the count of ranks - 1 (the highest rank_id in table)
320 uint32
GetLowestRank() const { return m_Ranks
.size() - 1; }
322 void SetMOTD(std::string motd
);
323 void SetGINFO(std::string ginfo
);
324 void SetPNOTE(uint64 guid
, std::string pnote
);
325 void SetOFFNOTE(uint64 guid
, std::string offnote
);
326 void SetEmblem(uint32 emblemStyle
, uint32 emblemColor
, uint32 borderStyle
, uint32 borderColor
, uint32 backgroundColor
);
328 uint32
GetMemberSize() const { return members
.size(); }
330 bool LoadGuildFromDB(QueryResult
*guildDataResult
);
331 bool CheckGuildStructure();
332 bool LoadRanksFromDB(QueryResult
*guildRanksResult
);
333 bool LoadMembersFromDB(QueryResult
*guildMembersResult
);
335 void SetMemberStats(uint64 guid
);
337 void BroadcastToGuild(WorldSession
*session
, const std::string
& msg
, uint32 language
= LANG_UNIVERSAL
);
338 void BroadcastToOfficers(WorldSession
*session
, const std::string
& msg
, uint32 language
= LANG_UNIVERSAL
);
339 void BroadcastPacketToRank(WorldPacket
*packet
, uint32 rankId
);
340 void BroadcastPacket(WorldPacket
*packet
);
343 void BroadcastWorker(Do
& _do
, Player
* except
= NULL
)
345 for(MemberList::iterator itr
= members
.begin(); itr
!= members
.end(); ++itr
)
346 if(Player
*player
= ObjectAccessor::FindPlayer(MAKE_NEW_GUID(itr
->first
, 0, HIGHGUID_PLAYER
)))
351 void CreateRank(std::string name
,uint32 rights
);
353 std::string
GetRankName(uint32 rankId
);
354 uint32
GetRankRights(uint32 rankId
);
355 uint32
GetRanksSize() const { return m_Ranks
.size(); }
357 void SetRankName(uint32 rankId
, std::string name
);
358 void SetRankRights(uint32 rankId
, uint32 rights
);
359 bool HasRankRight(uint32 rankId
, uint32 right
)
361 return ((GetRankRights(rankId
) & right
) != GR_RIGHT_EMPTY
) ? true : false;
363 int32
GetRank(uint32 LowGuid
);
364 bool IsMember(uint32 LowGuid
)
366 return (members
.find(LowGuid
) != members
.end());
368 MemberSlot
* GetMemberSlot(const std::string
& name
, uint64
& guid
)
370 for(MemberList::iterator itr
= members
.begin(); itr
!= members
.end(); ++itr
)
372 if(itr
->second
.Name
== name
)
381 void Roster(WorldSession
*session
= NULL
); // NULL = broadcast
382 void Query(WorldSession
*session
);
384 void UpdateLogoutTime(uint64 guid
);
386 void LoadGuildEventLogFromDB();
387 void DisplayGuildEventLog(WorldSession
*session
);
388 void LogGuildEvent(uint8 EventType
, uint32 PlayerGuid1
, uint32 PlayerGuid2
, uint8 NewRank
);
391 // Content & item deposit/withdraw
392 void DisplayGuildBankContent(WorldSession
*session
, uint8 TabId
);
393 void DisplayGuildBankMoneyUpdate(WorldSession
*session
);
395 void SwapItems( Player
* pl
, uint8 BankTab
, uint8 BankTabSlot
, uint8 BankTabDst
, uint8 BankTabSlotDst
, uint32 SplitedAmount
);
396 void MoveFromBankToChar( Player
* pl
, uint8 BankTab
, uint8 BankTabSlot
, uint8 PlayerBag
, uint8 PlayerSlot
, uint32 SplitedAmount
);
397 void MoveFromCharToBank( Player
* pl
, uint8 PlayerBag
, uint8 PlayerSlot
, uint8 BankTab
, uint8 BankTabSlot
, uint32 SplitedAmount
);
400 void DisplayGuildBankTabsInfo(WorldSession
*session
);
401 void CreateNewBankTab();
402 void SetGuildBankTabText(uint8 TabId
, std::string text
);
403 void SendGuildBankTabText(WorldSession
*session
, uint8 TabId
);
404 void SetGuildBankTabInfo(uint8 TabId
, std::string name
, std::string icon
);
405 uint8
GetPurchasedTabs() const { return m_PurchasedTabs
; }
406 uint32
GetBankRights(uint32 rankId
, uint8 TabId
) const;
407 bool IsMemberHaveRights(uint32 LowGuid
, uint8 TabId
,uint32 rights
) const;
408 bool CanMemberViewTab(uint32 LowGuid
, uint8 TabId
) const;
410 void LoadGuildBankFromDB();
411 // Money deposit/withdraw
412 void SendMoneyInfo(WorldSession
*session
, uint32 LowGuid
);
413 bool MemberMoneyWithdraw(uint32 amount
, uint32 LowGuid
);
414 uint64
GetGuildBankMoney() { return m_GuildBankMoney
; }
415 void SetBankMoney(int64 money
);
417 bool MemberItemWithdraw(uint8 TabId
, uint32 LowGuid
);
418 uint32
GetMemberSlotWithdrawRem(uint32 LowGuid
, uint8 TabId
);
419 uint32
GetMemberMoneyWithdrawRem(uint32 LowGuid
);
420 void SetBankMoneyPerDay(uint32 rankId
, uint32 money
);
421 void SetBankRightsAndSlots(uint32 rankId
, uint8 TabId
, uint32 right
, uint32 SlotPerDay
, bool db
);
422 uint32
GetBankMoneyPerDay(uint32 rankId
);
423 uint32
GetBankSlotPerDay(uint32 rankId
, uint8 TabId
);
425 bool LoadBankRightsFromDB(QueryResult
*guildBankTabRightsResult
);
426 // Guild Bank Event Logs
427 void LoadGuildBankEventLogFromDB();
428 void DisplayGuildBankLogs(WorldSession
*session
, uint8 TabId
);
429 void LogBankEvent(uint8 EventType
, uint8 TabId
, uint32 PlayerGuidLow
, uint32 ItemOrMoney
, uint8 ItemStackCount
=0, uint8 DestTabId
=0);
430 bool AddGBankItemToDB(uint32 GuildId
, uint32 BankTab
, uint32 BankTabSlot
, uint32 GUIDLow
, uint32 Entry
);
433 void AddRank(const std::string
& name
,uint32 rights
,uint32 money
);
440 uint32 m_CreatedYear
;
441 uint32 m_CreatedMonth
;
444 uint32 m_EmblemStyle
;
445 uint32 m_EmblemColor
;
446 uint32 m_BorderStyle
;
447 uint32 m_BorderColor
;
448 uint32 m_BackgroundColor
;
454 typedef std::vector
<GuildBankTab
*> TabListMap
;
455 TabListMap m_TabListMap
;
457 /** These are actually ordered lists. The first element is the oldest entry.*/
458 typedef std::list
<GuildEventLogEntry
> GuildEventLog
;
459 typedef std::list
<GuildBankEventLogEntry
> GuildBankEventLog
;
460 GuildEventLog m_GuildEventLog
;
461 GuildBankEventLog m_GuildBankEventLog_Money
;
462 GuildBankEventLog m_GuildBankEventLog_Item
[GUILD_BANK_MAX_TABS
];
464 uint32 m_GuildEventLogNextGuid
;
465 uint32 m_GuildBankEventLogNextGuid_Money
;
466 uint32 m_GuildBankEventLogNextGuid_Item
[GUILD_BANK_MAX_TABS
];
468 uint64 m_GuildBankMoney
;
469 uint8 m_PurchasedTabs
;
472 // used only from high level Swap/Move functions
473 Item
* GetItem(uint8 TabId
, uint8 SlotId
);
474 uint8
CanStoreItem( uint8 tab
, uint8 slot
, GuildItemPosCountVec
& dest
, uint32 count
, Item
*pItem
, bool swap
= false) const;
475 Item
* StoreItem( uint8 tab
, GuildItemPosCountVec
const& pos
, Item
*pItem
);
476 void RemoveItem(uint8 tab
, uint8 slot
);
477 void DisplayGuildBankContentUpdate(uint8 TabId
, int32 slot1
, int32 slot2
= -1);
478 void DisplayGuildBankContentUpdate(uint8 TabId
, GuildItemPosCountVec
const& slots
);
480 // internal common parts for CanStore/StoreItem functions
481 void AppendDisplayGuildBankSlot( WorldPacket
& data
, GuildBankTab
const *tab
, int32 slot
);
482 uint8
_CanStoreItem_InSpecificSlot( uint8 tab
, uint8 slot
, GuildItemPosCountVec
& dest
, uint32
& count
, bool swap
, Item
*pSrcItem
) const;
483 uint8
_CanStoreItem_InTab( uint8 tab
, GuildItemPosCountVec
& dest
, uint32
& count
, bool merge
, Item
*pSrcItem
, uint8 skip_slot
) const;
484 Item
* _StoreItem( uint8 tab
, uint8 slot
, Item
*pItem
, uint32 count
, bool clone
);