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 enum GuildDefaultRanks
33 //GR_VETERAN = 2, -- not used anywhere and possible incorrect in modified rank list
35 //GR_INITIATE = 4, -- use Guild::GetLowestRank() instead for lowest rank
40 GR_RIGHT_EMPTY
= 0x00000040,
41 GR_RIGHT_GCHATLISTEN
= 0x00000041,
42 GR_RIGHT_GCHATSPEAK
= 0x00000042,
43 GR_RIGHT_OFFCHATLISTEN
= 0x00000044,
44 GR_RIGHT_OFFCHATSPEAK
= 0x00000048,
45 GR_RIGHT_PROMOTE
= 0x000000C0,
46 GR_RIGHT_DEMOTE
= 0x00000140,
47 GR_RIGHT_INVITE
= 0x00000050,
48 GR_RIGHT_REMOVE
= 0x00000060,
49 GR_RIGHT_SETMOTD
= 0x00001040,
50 GR_RIGHT_EPNOTE
= 0x00002040,
51 GR_RIGHT_VIEWOFFNOTE
= 0x00004040,
52 GR_RIGHT_EOFFNOTE
= 0x00008040,
53 GR_RIGHT_MODIFY_GUILD_INFO
= 0x00010040,
54 GR_RIGHT_WITHDRAW_GOLD_LOCK
= 0x00020000, // remove money withdraw capacity
55 GR_RIGHT_WITHDRAW_REPAIR
= 0x00040000, // withdraw for repair
56 GR_RIGHT_WITHDRAW_GOLD
= 0x00080000, // withdraw gold
57 GR_RIGHT_CREATE_GUILD_EVENT
= 0x00100000, // wotlk
58 GR_RIGHT_ALL
= 0x001DF1FF
63 GUILD_CREATE_S
= 0x00,
64 GUILD_INVITE_S
= 0x01,
66 GUILD_FOUNDER_S
= 0x0E,
74 GUILD_PLAYER_NO_MORE_IN_GUILD
= 0x00,
75 GUILD_INTERNAL
= 0x01,
76 GUILD_ALREADY_IN_GUILD
= 0x02,
77 ALREADY_IN_GUILD
= 0x03,
78 INVITED_TO_GUILD
= 0x04,
79 ALREADY_INVITED_TO_GUILD
= 0x05,
80 GUILD_NAME_INVALID
= 0x06,
81 GUILD_NAME_EXISTS
= 0x07,
82 GUILD_LEADER_LEAVE
= 0x08,
83 GUILD_PERMISSIONS
= 0x08,
84 GUILD_PLAYER_NOT_IN_GUILD
= 0x09,
85 GUILD_PLAYER_NOT_IN_GUILD_S
= 0x0A,
86 GUILD_PLAYER_NOT_FOUND
= 0x0B,
87 GUILD_NOT_ALLIED
= 0x0C,
88 GUILD_RANK_TOO_HIGH_S
= 0x0D,
89 GUILD_ALREADY_LOWEST_RANK_S
= 0x0E,
90 GUILD_TEMP_ERROR
= 0x11,
91 GUILD_RANK_IN_USE
= 0x12,
93 GUILD_ERR_UNK1
= 0x17,
94 GUILD_WITHDRAW_TOO_MUCH
= 0x18,
95 GUILD_BANK_NO_MONEY
= 0x19,
96 GUILD_BANK_TAB_IS_FULL
= 0x1B,
97 GUILD_BANK_ITEM_NOT_FOUND
= 0x1C
109 GE_LEADER_CHANGED
= 0x07,
111 GE_TABARDCHANGE
= 0x09,
112 GE_UNK1
= 0x0A, // string, string
115 GE_SIGNED_OFF
= 0x0D,
117 GE_BANKTAB_PURCHASED
= 0x0F,
119 GE_UNK6
= 0x11, // string 0000000000002710 is 1 gold
125 PETITION_TURN_OK
= 0,
126 PETITION_TURN_ALREADY_IN_GUILD
= 2,
127 PETITION_TURN_NEED_MORE_SIGNATURES
= 4,
132 PETITION_SIGN_OK
= 0,
133 PETITION_SIGN_ALREADY_SIGNED
= 1,
134 PETITION_SIGN_ALREADY_IN_GUILD
= 2,
135 PETITION_SIGN_CANT_SIGN_OWN
= 3,
136 PETITION_SIGN_NOT_SERVER
= 4,
141 GUILD_BANK_RIGHT_VIEW_TAB
= 0x01,
142 GUILD_BANK_RIGHT_PUT_ITEM
= 0x02,
143 GUILD_BANK_RIGHT_UPDATE_TEXT
= 0x04,
145 GUILD_BANK_RIGHT_DEPOSIT_ITEM
= GUILD_BANK_RIGHT_VIEW_TAB
| GUILD_BANK_RIGHT_PUT_ITEM
,
146 GUILD_BANK_RIGHT_FULL
= 0xFF,
149 enum GuildBankLogEntries
151 GUILD_BANK_LOG_DEPOSIT_ITEM
= 1,
152 GUILD_BANK_LOG_WITHDRAW_ITEM
= 2,
153 GUILD_BANK_LOG_MOVE_ITEM
= 3,
154 GUILD_BANK_LOG_DEPOSIT_MONEY
= 4,
155 GUILD_BANK_LOG_WITHDRAW_MONEY
= 5,
156 GUILD_BANK_LOG_REPAIR_MONEY
= 6,
157 GUILD_BANK_LOG_MOVE_ITEM2
= 7,
158 GUILD_BANK_LOG_UNK1
= 8,
159 GUILD_BANK_LOG_UNK2
= 9,
162 enum GuildEventLogEntryTypes
164 GUILD_EVENT_LOG_INVITE_PLAYER
= 1,
165 GUILD_EVENT_LOG_JOIN_GUILD
= 2,
166 GUILD_EVENT_LOG_PROMOTE_PLAYER
= 3,
167 GUILD_EVENT_LOG_DEMOTE_PLAYER
= 4,
168 GUILD_EVENT_LOG_UNINVITE_PLAYER
= 5,
169 GUILD_EVENT_LOG_LEAVE_GUILD
= 6,
172 struct GuildEventlogEntry
184 ERR_GUILDEMBLEM_SUCCESS
= 0,
185 ERR_GUILDEMBLEM_INVALID_TABARD_COLORS
= 1,
186 ERR_GUILDEMBLEM_NOGUILD
= 2,
187 ERR_GUILDEMBLEM_NOTGUILDMASTER
= 3,
188 ERR_GUILDEMBLEM_NOTENOUGHMONEY
= 4,
189 ERR_GUILDEMBLEM_INVALIDVENDOR
= 5
192 inline uint32
GetGuildBankTabPrice(uint8 Index
)
208 struct GuildBankEvent
215 uint8 ItemStackCount
;
219 bool isMoneyEvent() const
221 return LogEntry
== GUILD_BANK_LOG_DEPOSIT_MONEY
||
222 LogEntry
== GUILD_BANK_LOG_WITHDRAW_MONEY
||
223 LogEntry
== GUILD_BANK_LOG_REPAIR_MONEY
;
229 Item
* Slots
[GUILD_BANK_MAX_SLOTS
];
235 struct GuildItemPosCount
237 GuildItemPosCount(uint8 _slot
, uint32 _count
) : slot(_slot
), count(_count
) {}
239 bool isContainedIn(std::vector
<GuildItemPosCount
> const& vec
) const;
244 typedef std::vector
<GuildItemPosCount
> GuildItemPosCountVec
;
256 uint32 BankResetTimeMoney
;
258 uint32 BankResetTimeTab
[GUILD_BANK_MAX_TABS
];
259 uint32 BankRemSlotsTab
[GUILD_BANK_MAX_TABS
];
264 RankInfo(const std::string
& _name
, uint32 _rights
, uint32 _money
) : name(_name
), rights(_rights
), BankMoneyPerDay(_money
)
266 for(uint8 i
= 0; i
< GUILD_BANK_MAX_TABS
; ++i
)
269 TabSlotPerDay
[i
] = 0;
275 uint32 BankMoneyPerDay
;
276 uint32 TabRight
[GUILD_BANK_MAX_TABS
];
277 uint32 TabSlotPerDay
[GUILD_BANK_MAX_TABS
];
286 bool create(Player
* leader
, std::string gname
);
289 typedef std::map
<uint32
, MemberSlot
> MemberList
;
290 typedef std::vector
<RankInfo
> RankList
;
292 uint32
GetId(){ return Id
; }
293 const uint64
& GetLeader(){ return leaderGuid
; }
294 std::string
GetName(){ return name
; }
295 std::string
GetMOTD(){ return MOTD
; }
296 std::string
GetGINFO(){ return GINFO
; }
298 uint32
GetCreatedYear(){ return CreatedYear
; }
299 uint32
GetCreatedMonth(){ return CreatedMonth
; }
300 uint32
GetCreatedDay(){ return CreatedDay
; }
302 uint32
GetEmblemStyle(){ return EmblemStyle
; }
303 uint32
GetEmblemColor(){ return EmblemColor
; }
304 uint32
GetBorderStyle(){ return BorderStyle
; }
305 uint32
GetBorderColor(){ return BorderColor
; }
306 uint32
GetBackgroundColor(){ return BackgroundColor
; }
308 void SetLeader(uint64 guid
);
309 bool AddMember(uint64 plGuid
, uint32 plRank
);
310 void ChangeRank(uint64 guid
, uint32 newRank
);
311 void DelMember(uint64 guid
, bool isDisbanding
=false);
312 uint32
GetLowestRank() const { return GetNrRanks()-1; }
314 void SetMOTD(std::string motd
);
315 void SetGINFO(std::string ginfo
);
316 void SetPNOTE(uint64 guid
,std::string pnote
);
317 void SetOFFNOTE(uint64 guid
,std::string offnote
);
318 void SetEmblem(uint32 emblemStyle
, uint32 emblemColor
, uint32 borderStyle
, uint32 borderColor
, uint32 backgroundColor
);
320 uint32
GetMemberSize() const { return members
.size(); }
322 bool LoadGuildFromDB(uint32 GuildId
);
323 bool LoadRanksFromDB(uint32 GuildId
);
324 bool LoadMembersFromDB(uint32 GuildId
);
326 bool FillPlayerData(uint64 guid
, MemberSlot
* memslot
);
327 void LoadPlayerStatsByGuid(uint64 guid
);
329 void BroadcastToGuild(WorldSession
*session
, const std::string
& msg
, uint32 language
= LANG_UNIVERSAL
);
330 void BroadcastToOfficers(WorldSession
*session
, const std::string
& msg
, uint32 language
= LANG_UNIVERSAL
);
331 void BroadcastPacketToRank(WorldPacket
*packet
, uint32 rankId
);
332 void BroadcastPacket(WorldPacket
*packet
);
335 void BroadcastWorker(Do
& _do
, Player
* except
= NULL
)
337 for(MemberList::iterator itr
= members
.begin(); itr
!= members
.end(); ++itr
)
338 if(Player
*player
= ObjectAccessor::FindPlayer(MAKE_NEW_GUID(itr
->first
, 0, HIGHGUID_PLAYER
)))
343 void CreateRank(std::string name
,uint32 rights
);
345 std::string
GetRankName(uint32 rankId
);
346 uint32
GetRankRights(uint32 rankId
);
347 uint32
GetNrRanks() const { return m_ranks
.size(); }
349 void SetRankName(uint32 rankId
, std::string name
);
350 void SetRankRights(uint32 rankId
, uint32 rights
);
351 bool HasRankRight(uint32 rankId
, uint32 right
)
353 return ((GetRankRights(rankId
) & right
) != GR_RIGHT_EMPTY
) ? true : false;
355 int32
GetRank(uint32 LowGuid
);
356 bool IsMember(uint32 LowGuid
)
358 return (members
.find(LowGuid
) != members
.end());
360 MemberSlot
* GetMemberSlot(const std::string
& name
, uint64
& guid
)
362 for(MemberList::iterator itr
= members
.begin(); itr
!= members
.end(); ++itr
)
364 if(itr
->second
.name
== name
)
373 void Roster(WorldSession
*session
);
374 void Query(WorldSession
*session
);
376 void UpdateLogoutTime(uint64 guid
);
378 void LoadGuildEventLogFromDB();
379 void UnloadGuildEventlog();
380 void DisplayGuildEventlog(WorldSession
*session
);
381 void LogGuildEvent(uint8 EventType
, uint32 PlayerGuid1
, uint32 PlayerGuid2
, uint8 NewRank
);
382 void RenumGuildEventlog();
385 // Content & item deposit/withdraw
386 void DisplayGuildBankContent(WorldSession
*session
, uint8 TabId
);
387 void DisplayGuildBankContentUpdate(uint8 TabId
, int32 slot1
, int32 slot2
= -1);
388 void DisplayGuildBankContentUpdate(uint8 TabId
, GuildItemPosCountVec
const& slots
);
389 void DisplayGuildBankMoneyUpdate();
391 Item
* GetItem(uint8 TabId
, uint8 SlotId
);
392 uint8
CanStoreItem( uint8 tab
, uint8 slot
, GuildItemPosCountVec
& dest
, uint32 count
, Item
*pItem
, bool swap
= false) const;
393 Item
* StoreItem( uint8 tab
, GuildItemPosCountVec
const& pos
, Item
*pItem
);
394 void RemoveItem(uint8 tab
, uint8 slot
);
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 void CreateBankRightForTab(uint32 rankid
, uint8 TabId
);
403 const GuildBankTab
*GetBankTab(uint8 index
) { if(index
>= m_TabListMap
.size()) return NULL
; return m_TabListMap
[index
]; }
404 uint8
GetPurchasedTabs() const { return purchased_tabs
; }
405 uint32
GetBankRights(uint32 rankId
, uint8 TabId
) const;
406 bool IsMemberHaveRights(uint32 LowGuid
, uint8 TabId
,uint32 rights
) const;
407 bool CanMemberViewTab(uint32 LowGuid
, uint8 TabId
) const;
409 void LoadGuildBankFromDB();
410 void UnloadGuildBank();
411 void IncOnlineMemberCount() { ++m_onlinemembers
; }
412 // Money deposit/withdraw
413 void SendMoneyInfo(WorldSession
*session
, uint32 LowGuid
);
414 bool MemberMoneyWithdraw(uint32 amount
, uint32 LowGuid
);
415 uint64
GetGuildBankMoney() { return guildbank_money
; }
416 void SetBankMoney(int64 money
);
418 bool MemberItemWithdraw(uint8 TabId
, uint32 LowGuid
);
419 uint32
GetMemberSlotWithdrawRem(uint32 LowGuid
, uint8 TabId
);
420 uint32
GetMemberMoneyWithdrawRem(uint32 LowGuid
);
421 void SetBankMoneyPerDay(uint32 rankId
, uint32 money
);
422 void SetBankRightsAndSlots(uint32 rankId
, uint8 TabId
, uint32 right
, uint32 SlotPerDay
, bool db
);
423 uint32
GetBankMoneyPerDay(uint32 rankId
);
424 uint32
GetBankSlotPerDay(uint32 rankId
, uint8 TabId
);
426 void LoadBankRightsFromDB(uint32 GuildId
);
428 void LoadGuildBankEventLogFromDB();
429 void UnloadGuildBankEventLog();
430 void DisplayGuildBankLogs(WorldSession
*session
, uint8 TabId
);
431 void LogBankEvent(uint8 LogEntry
, uint8 TabId
, uint32 PlayerGuidLow
, uint32 ItemOrMoney
, uint8 ItemStackCount
=0, uint8 DestTabId
=0);
432 void RenumBankLogs();
433 bool AddGBankItemToDB(uint32 GuildId
, uint32 BankTab
, uint32 BankTabSlot
, uint32 GUIDLow
, uint32 Entry
);
436 void AddRank(const std::string
& name
,uint32 rights
,uint32 money
);
451 uint32 BackgroundColor
;
457 typedef std::vector
<GuildBankTab
*> TabListMap
;
458 TabListMap m_TabListMap
;
460 /** These are actually ordered lists. The first element is the oldest entry.*/
461 typedef std::list
<GuildEventlogEntry
*> GuildEventlog
;
462 typedef std::list
<GuildBankEvent
*> GuildBankEventLog
;
463 GuildEventlog m_GuildEventlog
;
464 GuildBankEventLog m_GuildBankEventLog_Money
;
465 GuildBankEventLog m_GuildBankEventLog_Item
[GUILD_BANK_MAX_TABS
];
468 bool m_eventlogloaded
;
469 uint32 m_onlinemembers
;
470 uint64 guildbank_money
;
471 uint8 purchased_tabs
;
474 uint32 GuildEventlogMaxGuid
;
476 // internal common parts for CanStore/StoreItem functions
477 void AppendDisplayGuildBankSlot( WorldPacket
& data
, GuildBankTab
const *tab
, int32 slot
);
478 uint8
_CanStoreItem_InSpecificSlot( uint8 tab
, uint8 slot
, GuildItemPosCountVec
& dest
, uint32
& count
, bool swap
, Item
*pSrcItem
) const;
479 uint8
_CanStoreItem_InTab( uint8 tab
, GuildItemPosCountVec
& dest
, uint32
& count
, bool merge
, Item
*pSrcItem
, uint8 skip_slot
) const;
480 Item
* _StoreItem( uint8 tab
, uint8 slot
, Item
*pItem
, uint32 count
, bool clone
);