2 * Copyright (C) 2005-2009 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
29 #define GUILD_RANKS_MIN_COUNT 5
30 #define GUILD_RANKS_MAX_COUNT 10
32 enum GuildDefaultRanks
34 //these ranks can be modified, but they cannot be deleted
40 //When promoting member server does: rank--;!
41 //When demoting member server does: rank++;!
46 GR_RIGHT_EMPTY
= 0x00000040,
47 GR_RIGHT_GCHATLISTEN
= 0x00000041,
48 GR_RIGHT_GCHATSPEAK
= 0x00000042,
49 GR_RIGHT_OFFCHATLISTEN
= 0x00000044,
50 GR_RIGHT_OFFCHATSPEAK
= 0x00000048,
51 GR_RIGHT_PROMOTE
= 0x000000C0,
52 GR_RIGHT_DEMOTE
= 0x00000140,
53 GR_RIGHT_INVITE
= 0x00000050,
54 GR_RIGHT_REMOVE
= 0x00000060,
55 GR_RIGHT_SETMOTD
= 0x00001040,
56 GR_RIGHT_EPNOTE
= 0x00002040,
57 GR_RIGHT_VIEWOFFNOTE
= 0x00004040,
58 GR_RIGHT_EOFFNOTE
= 0x00008040,
59 GR_RIGHT_MODIFY_GUILD_INFO
= 0x00010040,
60 GR_RIGHT_WITHDRAW_GOLD_LOCK
= 0x00020000, // remove money withdraw capacity
61 GR_RIGHT_WITHDRAW_REPAIR
= 0x00040000, // withdraw for repair
62 GR_RIGHT_WITHDRAW_GOLD
= 0x00080000, // withdraw gold
63 GR_RIGHT_CREATE_GUILD_EVENT
= 0x00100000, // wotlk
64 GR_RIGHT_ALL
= 0x001DF1FF
69 GUILD_CREATE_S
= 0x00,
70 GUILD_INVITE_S
= 0x01,
72 GUILD_FOUNDER_S
= 0x0E,
80 GUILD_PLAYER_NO_MORE_IN_GUILD
= 0x00,
81 GUILD_INTERNAL
= 0x01,
82 GUILD_ALREADY_IN_GUILD
= 0x02,
83 ALREADY_IN_GUILD
= 0x03,
84 INVITED_TO_GUILD
= 0x04,
85 ALREADY_INVITED_TO_GUILD
= 0x05,
86 GUILD_NAME_INVALID
= 0x06,
87 GUILD_NAME_EXISTS
= 0x07,
88 GUILD_LEADER_LEAVE
= 0x08,
89 GUILD_PERMISSIONS
= 0x08,
90 GUILD_PLAYER_NOT_IN_GUILD
= 0x09,
91 GUILD_PLAYER_NOT_IN_GUILD_S
= 0x0A,
92 GUILD_PLAYER_NOT_FOUND
= 0x0B,
93 GUILD_NOT_ALLIED
= 0x0C,
94 GUILD_RANK_TOO_HIGH_S
= 0x0D,
95 GUILD_ALREADY_LOWEST_RANK_S
= 0x0E,
96 GUILD_TEMP_ERROR
= 0x11,
97 GUILD_RANK_IN_USE
= 0x12,
99 GUILD_ERR_UNK1
= 0x17,
100 GUILD_WITHDRAW_TOO_MUCH
= 0x18,
101 GUILD_BANK_NO_MONEY
= 0x19,
102 GUILD_BANK_TAB_IS_FULL
= 0x1B,
103 GUILD_BANK_ITEM_NOT_FOUND
= 0x1C
115 GE_LEADER_CHANGED
= 0x07,
117 GE_TABARDCHANGE
= 0x09,
118 GE_UNK1
= 0x0A, // string, string
121 GE_SIGNED_OFF
= 0x0D,
123 GE_BANKTAB_PURCHASED
= 0x0F,
125 GE_UNK6
= 0x11, // string 0000000000002710 is 1 gold
131 PETITION_TURN_OK
= 0,
132 PETITION_TURN_ALREADY_IN_GUILD
= 2,
133 PETITION_TURN_NEED_MORE_SIGNATURES
= 4,
138 PETITION_SIGN_OK
= 0,
139 PETITION_SIGN_ALREADY_SIGNED
= 1,
140 PETITION_SIGN_ALREADY_IN_GUILD
= 2,
141 PETITION_SIGN_CANT_SIGN_OWN
= 3,
142 PETITION_SIGN_NOT_SERVER
= 4,
147 GUILD_BANK_RIGHT_VIEW_TAB
= 0x01,
148 GUILD_BANK_RIGHT_PUT_ITEM
= 0x02,
149 GUILD_BANK_RIGHT_UPDATE_TEXT
= 0x04,
151 GUILD_BANK_RIGHT_DEPOSIT_ITEM
= GUILD_BANK_RIGHT_VIEW_TAB
| GUILD_BANK_RIGHT_PUT_ITEM
,
152 GUILD_BANK_RIGHT_FULL
= 0xFF,
155 enum GuildBankEventLogTypes
157 GUILD_BANK_LOG_DEPOSIT_ITEM
= 1,
158 GUILD_BANK_LOG_WITHDRAW_ITEM
= 2,
159 GUILD_BANK_LOG_MOVE_ITEM
= 3,
160 GUILD_BANK_LOG_DEPOSIT_MONEY
= 4,
161 GUILD_BANK_LOG_WITHDRAW_MONEY
= 5,
162 GUILD_BANK_LOG_REPAIR_MONEY
= 6,
163 GUILD_BANK_LOG_MOVE_ITEM2
= 7,
164 GUILD_BANK_LOG_UNK1
= 8,
165 GUILD_BANK_LOG_UNK2
= 9,
168 enum GuildEventLogTypes
170 GUILD_EVENT_LOG_INVITE_PLAYER
= 1,
171 GUILD_EVENT_LOG_JOIN_GUILD
= 2,
172 GUILD_EVENT_LOG_PROMOTE_PLAYER
= 3,
173 GUILD_EVENT_LOG_DEMOTE_PLAYER
= 4,
174 GUILD_EVENT_LOG_UNINVITE_PLAYER
= 5,
175 GUILD_EVENT_LOG_LEAVE_GUILD
= 6,
180 ERR_GUILDEMBLEM_SUCCESS
= 0,
181 ERR_GUILDEMBLEM_INVALID_TABARD_COLORS
= 1,
182 ERR_GUILDEMBLEM_NOGUILD
= 2,
183 ERR_GUILDEMBLEM_NOTGUILDMASTER
= 3,
184 ERR_GUILDEMBLEM_NOTENOUGHMONEY
= 4,
185 ERR_GUILDEMBLEM_INVALIDVENDOR
= 5
188 inline uint32
GetGuildBankTabPrice(uint8 Index
)
204 struct GuildEventLogEntry
213 struct GuildBankEventLogEntry
218 uint8 ItemStackCount
;
222 bool isMoneyEvent() const
224 return EventType
== GUILD_BANK_LOG_DEPOSIT_MONEY
||
225 EventType
== GUILD_BANK_LOG_WITHDRAW_MONEY
||
226 EventType
== GUILD_BANK_LOG_REPAIR_MONEY
;
232 Item
* Slots
[GUILD_BANK_MAX_SLOTS
];
238 struct GuildItemPosCount
240 GuildItemPosCount(uint8 _slot
, uint32 _count
) : Slot(_slot
), Count(_count
) {}
242 bool isContainedIn(std::vector
<GuildItemPosCount
> const& vec
) const;
247 typedef std::vector
<GuildItemPosCount
> GuildItemPosCountVec
;
259 uint32 BankResetTimeMoney
;
261 uint32 BankResetTimeTab
[GUILD_BANK_MAX_TABS
];
262 uint32 BankRemSlotsTab
[GUILD_BANK_MAX_TABS
];
267 RankInfo(const std::string
& _name
, uint32 _rights
, uint32 _money
) : Name(_name
), Rights(_rights
), BankMoneyPerDay(_money
)
269 for(uint8 i
= 0; i
< GUILD_BANK_MAX_TABS
; ++i
)
272 TabSlotPerDay
[i
] = 0;
278 uint32 BankMoneyPerDay
;
279 uint32 TabRight
[GUILD_BANK_MAX_TABS
];
280 uint32 TabSlotPerDay
[GUILD_BANK_MAX_TABS
];
289 bool Create(Player
* leader
, std::string gname
);
290 void CreateDefaultGuildRanks(int locale_idx
);
293 typedef std::map
<uint32
, MemberSlot
> MemberList
;
294 typedef std::vector
<RankInfo
> RankList
;
296 uint32
GetId(){ return m_Id
; }
297 const uint64
& GetLeader(){ return m_LeaderGuid
; }
298 std::string
const& GetName() const { return m_Name
; }
299 std::string
const& GetMOTD() const { return MOTD
; }
300 std::string
const& GetGINFO() const { return GINFO
; }
302 uint32
GetCreatedYear() const { return m_CreatedYear
; }
303 uint32
GetCreatedMonth() const { return m_CreatedMonth
; }
304 uint32
GetCreatedDay() const { return m_CreatedDay
; }
306 uint32
GetEmblemStyle() const { return m_EmblemStyle
; }
307 uint32
GetEmblemColor() const { return m_EmblemColor
; }
308 uint32
GetBorderStyle() const { return m_BorderStyle
; }
309 uint32
GetBorderColor() const { return m_BorderColor
; }
310 uint32
GetBackgroundColor() const { return m_BackgroundColor
; }
312 void SetLeader(uint64 guid
);
313 bool AddMember(uint64 plGuid
, uint32 plRank
);
314 void ChangeRank(uint64 guid
, uint32 newRank
);
315 void DelMember(uint64 guid
, bool isDisbanding
= false);
316 //lowest rank is the count of ranks - 1 (the highest rank_id in table)
317 uint32
GetLowestRank() const { return m_Ranks
.size() - 1; }
319 void SetMOTD(std::string motd
);
320 void SetGINFO(std::string ginfo
);
321 void SetPNOTE(uint64 guid
, std::string pnote
);
322 void SetOFFNOTE(uint64 guid
, std::string offnote
);
323 void SetEmblem(uint32 emblemStyle
, uint32 emblemColor
, uint32 borderStyle
, uint32 borderColor
, uint32 backgroundColor
);
325 uint32
GetMemberSize() const { return members
.size(); }
327 bool LoadGuildFromDB(uint32 GuildId
);
328 bool LoadRanksFromDB(uint32 GuildId
);
329 bool LoadMembersFromDB(uint32 GuildId
);
331 void SetMemberStats(uint64 guid
);
333 void BroadcastToGuild(WorldSession
*session
, const std::string
& msg
, uint32 language
= LANG_UNIVERSAL
);
334 void BroadcastToOfficers(WorldSession
*session
, const std::string
& msg
, uint32 language
= LANG_UNIVERSAL
);
335 void BroadcastPacketToRank(WorldPacket
*packet
, uint32 rankId
);
336 void BroadcastPacket(WorldPacket
*packet
);
339 void BroadcastWorker(Do
& _do
, Player
* except
= NULL
)
341 for(MemberList::iterator itr
= members
.begin(); itr
!= members
.end(); ++itr
)
342 if(Player
*player
= ObjectAccessor::FindPlayer(MAKE_NEW_GUID(itr
->first
, 0, HIGHGUID_PLAYER
)))
347 void CreateRank(std::string name
,uint32 rights
);
349 std::string
GetRankName(uint32 rankId
);
350 uint32
GetRankRights(uint32 rankId
);
351 uint32
GetRanksSize() const { return m_Ranks
.size(); }
353 void SetRankName(uint32 rankId
, std::string name
);
354 void SetRankRights(uint32 rankId
, uint32 rights
);
355 bool HasRankRight(uint32 rankId
, uint32 right
)
357 return ((GetRankRights(rankId
) & right
) != GR_RIGHT_EMPTY
) ? true : false;
359 int32
GetRank(uint32 LowGuid
);
360 bool IsMember(uint32 LowGuid
)
362 return (members
.find(LowGuid
) != members
.end());
364 MemberSlot
* GetMemberSlot(const std::string
& name
, uint64
& guid
)
366 for(MemberList::iterator itr
= members
.begin(); itr
!= members
.end(); ++itr
)
368 if(itr
->second
.Name
== name
)
377 void Roster(WorldSession
*session
= NULL
); // NULL = broadcast
378 void Query(WorldSession
*session
);
380 void UpdateLogoutTime(uint64 guid
);
382 void LoadGuildEventLogFromDB();
383 void UnloadGuildEventLog();
384 void DisplayGuildEventLog(WorldSession
*session
);
385 void LogGuildEvent(uint8 EventType
, uint32 PlayerGuid1
, uint32 PlayerGuid2
, uint8 NewRank
);
388 // Content & item deposit/withdraw
389 void DisplayGuildBankContent(WorldSession
*session
, uint8 TabId
);
390 void DisplayGuildBankMoneyUpdate();
392 void SwapItems( Player
* pl
, uint8 BankTab
, uint8 BankTabSlot
, uint8 BankTabDst
, uint8 BankTabSlotDst
, uint32 SplitedAmount
);
393 void MoveFromBankToChar( Player
* pl
, uint8 BankTab
, uint8 BankTabSlot
, uint8 PlayerBag
, uint8 PlayerSlot
, uint32 SplitedAmount
);
394 void MoveFromCharToBank( Player
* pl
, uint8 PlayerBag
, uint8 PlayerSlot
, uint8 BankTab
, uint8 BankTabSlot
, uint32 SplitedAmount
);
397 void DisplayGuildBankTabsInfo(WorldSession
*session
);
398 void CreateNewBankTab();
399 void SetGuildBankTabText(uint8 TabId
, std::string text
);
400 void SendGuildBankTabText(WorldSession
*session
, uint8 TabId
);
401 void SetGuildBankTabInfo(uint8 TabId
, std::string name
, std::string icon
);
402 const GuildBankTab
*GetBankTab(uint8 index
) { if(index
>= m_TabListMap
.size()) return NULL
; return m_TabListMap
[index
]; }
403 uint8
GetPurchasedTabs() const { return m_PurchasedTabs
; }
404 uint32
GetBankRights(uint32 rankId
, uint8 TabId
) const;
405 bool IsMemberHaveRights(uint32 LowGuid
, uint8 TabId
,uint32 rights
) const;
406 bool CanMemberViewTab(uint32 LowGuid
, uint8 TabId
) const;
408 void LoadGuildBankFromDB();
409 void UnloadGuildBank();
410 void IncOnlineMemberCount() { ++m_OnlineMembers
; }
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 void LoadBankRightsFromDB(uint32 GuildId
);
426 // Guild Bank Event Logs
427 void LoadGuildBankEventLogFromDB();
428 void UnloadGuildBankEventLog();
429 void DisplayGuildBankLogs(WorldSession
*session
, uint8 TabId
);
430 void LogBankEvent(uint8 EventType
, uint8 TabId
, uint32 PlayerGuidLow
, uint32 ItemOrMoney
, uint8 ItemStackCount
=0, uint8 DestTabId
=0);
431 bool AddGBankItemToDB(uint32 GuildId
, uint32 BankTab
, uint32 BankTabSlot
, uint32 GUIDLow
, uint32 Entry
);
434 void AddRank(const std::string
& name
,uint32 rights
,uint32 money
);
441 uint32 m_CreatedYear
;
442 uint32 m_CreatedMonth
;
445 uint32 m_EmblemStyle
;
446 uint32 m_EmblemColor
;
447 uint32 m_BorderStyle
;
448 uint32 m_BorderColor
;
449 uint32 m_BackgroundColor
;
455 typedef std::vector
<GuildBankTab
*> TabListMap
;
456 TabListMap m_TabListMap
;
458 /** These are actually ordered lists. The first element is the oldest entry.*/
459 typedef std::list
<GuildEventLogEntry
> GuildEventLog
;
460 typedef std::list
<GuildBankEventLogEntry
> GuildBankEventLog
;
461 GuildEventLog m_GuildEventLog
;
462 GuildBankEventLog m_GuildBankEventLog_Money
;
463 GuildBankEventLog m_GuildBankEventLog_Item
[GUILD_BANK_MAX_TABS
];
465 uint32 m_GuildEventLogNextGuid
;
466 uint32 m_GuildBankEventLogNextGuid_Money
;
467 uint32 m_GuildBankEventLogNextGuid_Item
[GUILD_BANK_MAX_TABS
];
469 bool m_GuildBankLoaded
;
470 bool m_EventLogLoaded
;
471 uint32 m_OnlineMembers
;
472 uint64 m_GuildBankMoney
;
473 uint8 m_PurchasedTabs
;
476 // used only from high level Swap/Move functions
477 Item
* GetItem(uint8 TabId
, uint8 SlotId
);
478 uint8
CanStoreItem( uint8 tab
, uint8 slot
, GuildItemPosCountVec
& dest
, uint32 count
, Item
*pItem
, bool swap
= false) const;
479 Item
* StoreItem( uint8 tab
, GuildItemPosCountVec
const& pos
, Item
*pItem
);
480 void RemoveItem(uint8 tab
, uint8 slot
);
481 void DisplayGuildBankContentUpdate(uint8 TabId
, int32 slot1
, int32 slot2
= -1);
482 void DisplayGuildBankContentUpdate(uint8 TabId
, GuildItemPosCountVec
const& slots
);
484 // internal common parts for CanStore/StoreItem functions
485 void AppendDisplayGuildBankSlot( WorldPacket
& data
, GuildBankTab
const *tab
, int32 slot
);
486 uint8
_CanStoreItem_InSpecificSlot( uint8 tab
, uint8 slot
, GuildItemPosCountVec
& dest
, uint32
& count
, bool swap
, Item
*pSrcItem
) const;
487 uint8
_CanStoreItem_InTab( uint8 tab
, GuildItemPosCountVec
& dest
, uint32
& count
, bool merge
, Item
*pSrcItem
, uint8 skip_slot
) const;
488 Item
* _StoreItem( uint8 tab
, uint8 slot
, Item
*pItem
, uint32 count
, bool clone
);