TrinityCore
Loading...
Searching...
No Matches
GuildHandler.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "WorldSession.h"
19#include "Common.h"
20#include "Guild.h"
21#include "GuildMgr.h"
22#include "GuildPackets.h"
23#include "Log.h"
24#include "ObjectMgr.h"
25#include "Player.h"
26#include "WorldPacket.h"
27
29{
30 TC_LOG_DEBUG("guild", "CMSG_GUILD_QUERY [{}]: Guild: {}", GetPlayerInfo(), query.GuildId);
31 if (!query.GuildId)
32 return;
33
34 if (Guild* guild = sGuildMgr->GetGuildById(query.GuildId))
35 guild->HandleQuery(this);
36}
37
39{
40 TC_LOG_ERROR("entities.player.cheat", "CMSG_GUILD_CREATE: Possible hacking-attempt: {} tried to create a guild [Name: {}] using cheats", GetPlayerInfo(), packet.GuildName);
41}
42
44{
45 TC_LOG_DEBUG("guild", "CMSG_GUILD_INVITE [{}]: Invited: {}", GetPlayerInfo(), std::string_view(packet.Name));
46 if (normalizePlayerName(packet.Name))
47 if (Guild* guild = GetPlayer()->GetGuild())
48 guild->HandleInviteMember(this, packet.Name);
49}
50
52{
53 TC_LOG_DEBUG("guild", "CMSG_GUILD_REMOVE [{}]: Target: {}", GetPlayerInfo(), packet.Removee);
54
55 if (normalizePlayerName(packet.Removee))
56 if (Guild* guild = GetPlayer()->GetGuild())
57 guild->HandleRemoveMember(this, packet.Removee);
58}
59
61{
62 TC_LOG_DEBUG("guild", "CMSG_GUILD_ACCEPT [{}]", GetPlayer()->GetName());
63
64 if (!GetPlayer()->GetGuildId())
65 if (Guild* guild = sGuildMgr->GetGuildById(GetPlayer()->GetGuildIdInvited()))
66 guild->HandleAcceptMember(this);
67}
68
70{
71 TC_LOG_DEBUG("guild", "CMSG_GUILD_DECLINE [{}]", GetPlayerInfo());
72 if (GetPlayer()->GetGuildId())
73 return;
74
76}
77
79{
80 TC_LOG_DEBUG("guild", "CMSG_GUILD_INFO [{}]", GetPlayerInfo());
81
82 if (Guild* guild = GetPlayer()->GetGuild())
83 guild->SendInfo(this);
84}
85
87{
88 TC_LOG_DEBUG("guild", "CMSG_GUILD_ROSTER [{}]", GetPlayerInfo());
89
90 if (Guild* guild = GetPlayer()->GetGuild())
91 guild->HandleRoster(this);
92 else
94}
95
97{
98 TC_LOG_DEBUG("guild", "CMSG_GUILD_PROMOTE [{}]: Target: {}", GetPlayerInfo(), promote.Promotee);
99
100 if (normalizePlayerName(promote.Promotee))
101 if (Guild* guild = GetPlayer()->GetGuild())
102 guild->HandleUpdateMemberRank(this, promote.Promotee, false);
103}
104
106{
107 TC_LOG_DEBUG("guild", "CMSG_GUILD_DEMOTE [{}]: Target: {}", GetPlayerInfo(), demote.Demotee);
108
109 if (normalizePlayerName(demote.Demotee))
110 if (Guild* guild = GetPlayer()->GetGuild())
111 guild->HandleUpdateMemberRank(this, demote.Demotee, true);
112}
113
115{
116 TC_LOG_DEBUG("guild", "CMSG_GUILD_LEAVE [{}]", GetPlayerInfo());
117
118 if (Guild* guild = GetPlayer()->GetGuild())
119 guild->HandleLeaveMember(this);
120}
121
123{
124 TC_LOG_DEBUG("guild", "CMSG_GUILD_DISBAND [{}]", GetPlayerInfo());
125
126 if (Guild* guild = GetPlayer()->GetGuild())
127 guild->HandleDisband(this);
128}
129
131{
132 TC_LOG_DEBUG("guild", "CMSG_GUILD_MOTD [{}]: MOTD: {}", GetPlayerInfo(), std::string_view(packet.MotdText));
133
134 if (Guild* guild = GetPlayer()->GetGuild())
135 guild->HandleSetMOTD(this, packet.MotdText);
136}
137
139{
140 TC_LOG_DEBUG("guild", "CMSG_GUILD_SET_PUBLIC_NOTE [{}]: Target: {}, Note: {}",
141 GetPlayerInfo(), packet.NoteeName, std::string_view(packet.Note));
142
143 if (normalizePlayerName(packet.NoteeName))
144 if (Guild* guild = GetPlayer()->GetGuild())
145 guild->HandleSetMemberNote(this, packet.Note, packet.NoteeName, true);
146}
147
149{
150 TC_LOG_DEBUG("guild", "CMSG_GUILD_SET_OFFICER_NOTE [{}]: Target: {}, Note: {}",
151 GetPlayerInfo(), std::string_view(packet.NoteeName), std::string_view(packet.Note));
152
153 if (normalizePlayerName(packet.NoteeName))
154 if (Guild* guild = GetPlayer()->GetGuild())
155 guild->HandleSetMemberNote(this, packet.Note, packet.NoteeName, false);
156}
157
159{
160 Guild* guild = GetPlayer()->GetGuild();
161 if (!guild)
162 return;
163
164 std::array<GuildBankRightsAndSlots, GUILD_BANK_MAX_TABS> rightsAndSlots;
165 for (uint8 tabId = 0; tabId < GUILD_BANK_MAX_TABS; ++tabId)
166 rightsAndSlots[tabId] = GuildBankRightsAndSlots(tabId, uint8(packet.TabFlags[tabId]), uint32(packet.TabWithdrawItemLimit[tabId]));
167
168 TC_LOG_DEBUG("guild", "CMSG_GUILD_RANK [{}]: Rank: {} ({})", GetPlayerInfo(), std::string_view(packet.RankName), packet.RankID);
169
170 guild->HandleSetRankInfo(this, packet.RankID, packet.RankName, packet.Flags, packet.WithdrawGoldLimit, rightsAndSlots);
171}
172
174{
175 TC_LOG_DEBUG("guild", "CMSG_GUILD_ADD_RANK [{}]: Rank: {}", GetPlayerInfo(), std::string_view(packet.Name));
176
177 if (Guild* guild = GetPlayer()->GetGuild())
178 guild->HandleAddNewRank(this, packet.Name);
179}
180
182{
183 TC_LOG_DEBUG("guild", "CMSG_GUILD_DEL_RANK [{}]", GetPlayerInfo());
184
185 if (Guild* guild = GetPlayer()->GetGuild())
186 guild->HandleRemoveLowestRank(this);
187}
188
190{
191 TC_LOG_DEBUG("guild", "CMSG_GUILD_INFO_TEXT [{}]: {}", GetPlayerInfo(), std::string_view(packet.InfoText));
192
193 if (Guild* guild = GetPlayer()->GetGuild())
194 guild->HandleSetInfo(this, packet.InfoText);
195}
196
198{
199 EmblemInfo emblemInfo;
200 emblemInfo.ReadPacket(packet);
201
202 TC_LOG_DEBUG("guild", "MSG_SAVE_GUILD_EMBLEM [{}]: Guid: [{}] Style: {}, Color: {}, BorderStyle: {}, BorderColor: {}, BackgroundColor: {}"
203 , GetPlayerInfo(), packet.Vendor.ToString(), emblemInfo.GetStyle()
204 , emblemInfo.GetColor(), emblemInfo.GetBorderStyle()
205 , emblemInfo.GetBorderColor(), emblemInfo.GetBackgroundColor());
206
207 if (GetPlayer()->GetNPCIfCanInteractWith(packet.Vendor, UNIT_NPC_FLAG_TABARDDESIGNER))
208 {
209 // Remove fake death
210 if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
212
213 if (Guild* guild = GetPlayer()->GetGuild())
214 guild->HandleSetEmblem(this, emblemInfo);
215 else
216 Guild::SendSaveEmblemResult(this, ERR_GUILDEMBLEM_NOGUILD); // "You are not part of a guild!";
217 }
218 else
219 Guild::SendSaveEmblemResult(this, ERR_GUILDEMBLEM_INVALIDVENDOR); // "That's not an emblem vendor!"
220}
221
223{
224 TC_LOG_DEBUG("guild", "MSG_GUILD_EVENT_LOG_QUERY [{}]", GetPlayerInfo());
225
226 if (Guild* guild = GetPlayer()->GetGuild())
227 guild->SendEventLog(this);
228}
229
231{
232 if (Guild* guild = GetPlayer()->GetGuild())
233 guild->SendMoneyInfo(this);
234}
235
237{
238 if (Guild* guild = GetPlayer()->GetGuild())
239 guild->SendPermissions(this);
240}
241
242// Called when clicking on Guild bank gameobject
244{
245 TC_LOG_DEBUG("guild", "CMSG_GUILD_BANKER_ACTIVATE [{}]: [{}] AllSlots: {}"
246 , GetPlayerInfo(), packet.Banker.ToString(), packet.FullUpdate);
247
249 if (!go)
250 return;
251
252 Guild* const guild = GetPlayer()->GetGuild();
253 if (!guild)
254 {
256 return;
257 }
258
259 guild->SendBankList(this, 0, packet.FullUpdate);
260}
261
262// Called when opening guild bank tab only (first one)
264{
265 TC_LOG_DEBUG("guild", "CMSG_GUILD_BANK_QUERY_TAB [{}]: {}, TabId: {}, ShowTabs: {}"
266 , GetPlayerInfo(), packet.Banker.ToString(), packet.Tab, packet.FullUpdate);
267
268 if (GetPlayer()->GetGameObjectIfCanInteractWith(packet.Banker, GAMEOBJECT_TYPE_GUILD_BANK))
269 if (Guild* guild = GetPlayer()->GetGuild())
270 guild->SendBankList(this, packet.Tab, true /*packet.FullUpdate*/);
271 // HACK: client doesn't query entire tab content if it had received SMSG_GUILD_BANK_LIST in this session
272 // but we broadcast bank updates to entire guild when *ANYONE* changes anything, incorrectly initializing clients
273 // tab content with only data for that change
274}
275
277{
278 TC_LOG_DEBUG("guild", "CMSG_GUILD_BANK_DEPOSIT_MONEY [{}]: [{}], money: {}",
279 GetPlayerInfo(), packet.Banker.ToString(), packet.Money);
280
281 if (GetPlayer()->GetGameObjectIfCanInteractWith(packet.Banker, GAMEOBJECT_TYPE_GUILD_BANK))
282 if (packet.Money && GetPlayer()->HasEnoughMoney(packet.Money))
283 if (Guild* guild = GetPlayer()->GetGuild())
284 guild->HandleMemberDepositMoney(this, packet.Money);
285}
286
288{
289 TC_LOG_DEBUG("guild", "CMSG_GUILD_BANK_WITHDRAW_MONEY [{}]: [{}], money: {}",
290 GetPlayerInfo(), packet.Banker.ToString(), packet.Money);
291
292 if (packet.Money && GetPlayer()->GetGameObjectIfCanInteractWith(packet.Banker, GAMEOBJECT_TYPE_GUILD_BANK))
293 if (Guild* guild = GetPlayer()->GetGuild())
294 guild->HandleMemberWithdrawMoney(this, packet.Money);
295}
296
298{
299 if (!GetPlayer()->GetGameObjectIfCanInteractWith(packet.Banker, GAMEOBJECT_TYPE_GUILD_BANK))
300 return;
301
302 Guild* guild = GetPlayer()->GetGuild();
303 if (!guild)
304 return;
305
306 if (packet.BankOnly)
307 guild->SwapItems(GetPlayer(), packet.BankTab1, packet.BankSlot1, packet.BankTab, packet.BankSlot, packet.BankItemCount);
308 else
309 {
310 uint8 playerBag = NULL_BAG;
311 uint8 playerSlotId = NULL_SLOT;
312 uint8 toChar = 1;
313 uint32 splitedAmount = 0;
314
315 if (!packet.AutoStore)
316 {
317 playerBag = packet.ContainerSlot;
318 playerSlotId = packet.ContainerItemSlot;
319 toChar = packet.ToSlot;
320 splitedAmount = packet.StackCount;
321 }
322
323 // Player <-> Bank
324 // Allow to work with inventory only
325 if (!Player::IsInventoryPos(playerBag, playerSlotId) && !(playerBag == NULL_BAG && playerSlotId == NULL_SLOT))
327 else
328 guild->SwapItemsWithInventory(GetPlayer(), toChar != 0, packet.BankTab, packet.BankSlot, playerBag, playerSlotId, splitedAmount);
329 }
330}
331
333{
334 TC_LOG_DEBUG("guild", "CMSG_GUILD_BANK_BUY_TAB [{}]: [{}[, TabId: {}", GetPlayerInfo(), packet.Banker .ToString(), packet.BankTab);
335
336 if (GetPlayer()->GetGameObjectIfCanInteractWith(packet.Banker, GAMEOBJECT_TYPE_GUILD_BANK))
337 if (Guild* guild = GetPlayer()->GetGuild())
338 guild->HandleBuyBankTab(this, packet.BankTab);
339}
340
342{
343 TC_LOG_DEBUG("guild", "CMSG_GUILD_BANK_UPDATE_TAB [{}]: [{}], TabId: {}, Name: {}, Icon: {}"
344 , GetPlayerInfo(), packet.Banker.ToString(), packet.BankTab, std::string_view(packet.Name), std::string_view(packet.Icon));
345
346 if (!packet.Name.empty() && !packet.Icon.empty())
347 if (GetPlayer()->GetGameObjectIfCanInteractWith(packet.Banker, GAMEOBJECT_TYPE_GUILD_BANK))
348 if (Guild* guild = GetPlayer()->GetGuild())
349 guild->HandleSetBankTabInfo(this, packet.BankTab, packet.Name, packet.Icon);
350}
351
353{
354 TC_LOG_DEBUG("guild", "MSG_GUILD_BANK_LOG_QUERY [{}]: TabId: {}", GetPlayerInfo(), packet.Tab);
355
356 if (Guild* guild = GetPlayer()->GetGuild())
357 guild->SendBankLog(this, packet.Tab);
358}
359
361{
362 TC_LOG_DEBUG("guild", "MSG_QUERY_GUILD_BANK_TEXT [{}]: TabId: {}", GetPlayerInfo(), packet.Tab);
363
364 if (Guild* guild = GetPlayer()->GetGuild())
365 guild->SendBankTabText(this, packet.Tab);
366}
367
369{
370 TC_LOG_DEBUG("guild", "CMSG_SET_GUILD_BANK_TEXT [{}]: TabId: {}, Text: {}", GetPlayerInfo(), packet.Tab, std::string_view(packet.TabText));
371
372 if (Guild* guild = GetPlayer()->GetGuild())
373 guild->SetBankTabText(packet.Tab, packet.TabText);
374}
375
377{
378 TC_LOG_DEBUG("guild", "CMSG_GUILD_LEADER [{}]: Target: {}", GetPlayerInfo(), packet.NewMasterName);
379
381 if (Guild* guild = GetPlayer()->GetGuild())
382 guild->HandleSetNewGuildMaster(this, packet.NewMasterName);
383}
uint8_t uint8
Definition Define.h:135
uint32_t uint32
Definition Define.h:133
#define sGuildMgr
Definition GuildMgr.h:59
@ GUILD_BANK_MAX_TABS
Definition Guild.h:50
@ GUILD_COMMAND_VIEW_TAB
Definition Guild.h:120
@ GUILD_COMMAND_ROSTER
Definition Guild.h:110
@ ERR_GUILD_PLAYER_NOT_IN_GUILD
Definition Guild.h:137
@ ERR_GUILDEMBLEM_INVALIDVENDOR
Definition Guild.h:217
@ ERR_GUILDEMBLEM_NOGUILD
Definition Guild.h:214
@ EQUIP_ERR_INTERNAL_BAG_ERROR
Definition ItemDefines.h:66
#define TC_LOG_DEBUG(filterType__,...)
Definition Log.h:156
#define TC_LOG_ERROR(filterType__,...)
Definition Log.h:165
bool normalizePlayerName(std::string &name)
@ GAMEOBJECT_TYPE_GUILD_BANK
@ SPELL_AURA_FEIGN_DEATH
@ UNIT_NPC_FLAG_TABARDDESIGNER
@ UNIT_STATE_DIED
Definition Unit.h:220
@ NULL_BAG
Definition Unit.h:61
@ NULL_SLOT
Definition Unit.h:62
uint32 GetStyle() const
Definition Guild.h:239
uint32 GetColor() const
Definition Guild.h:240
uint32 GetBackgroundColor() const
Definition Guild.h:243
uint32 GetBorderStyle() const
Definition Guild.h:241
void ReadPacket(WorldPackets::Guild::SaveGuildEmblem &packet)
Definition Guild.cpp:704
uint32 GetBorderColor() const
Definition Guild.h:242
Definition Guild.h:284
void SwapItemsWithInventory(Player *player, bool toChar, uint8 tabId, uint8 slotId, uint8 playerBag, uint8 playerSlotId, uint32 splitedAmount)
Definition Guild.cpp:2376
void SwapItems(Player *player, uint8 tabId, uint8 slotId, uint8 destTabId, uint8 destSlotId, uint32 splitedAmount)
Definition Guild.cpp:2362
void HandleSetRankInfo(WorldSession *session, uint8 rankId, std::string_view name, uint32 rights, uint32 moneyPerDay, std::array< GuildBankRightsAndSlots, GUILD_BANK_MAX_TABS > const &rightsAndSlots)
Definition Guild.cpp:1423
void SendBankList(WorldSession *session=nullptr, uint8 tabId=0, bool fullUpdate=false, SlotIds *slots=nullptr) const
Definition Guild.cpp:2858
static void SendCommandResult(WorldSession *session, GuildCommandType type, GuildCommandError errCode, std::string_view param="")
Definition Guild.cpp:106
static void SendSaveEmblemResult(WorldSession *session, GuildEmblemError errCode)
Definition Guild.cpp:118
std::string ToString() const
GameObject * GetGameObjectIfCanInteractWith(ObjectGuid const &guid) const
Definition Player.cpp:2138
Guild * GetGuild()
Definition Player.cpp:26263
static bool IsInventoryPos(uint16 pos)
Definition Player.h:1115
void SendEquipError(InventoryResult msg, Item *pItem, Item *pItem2=nullptr, uint32 itemid=0) const
Definition Player.cpp:13075
void SetGuildIdInvited(ObjectGuid::LowType GuildId)
Definition Player.h:1619
void RemoveAurasByType(AuraType auraType, std::function< bool(AuraApplication const *)> const &check, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3765
String< 15, Strings::NoHyperlinks > Name
String< 500, Strings::NoHyperlinks > TabText
String< 16, Strings::NoHyperlinks > Name
String< 31, Strings::NoHyperlinks > Note
String< 15, Strings::NoHyperlinks > RankName
uint32 TabWithdrawItemLimit[GUILD_BANK_MAX_TABS]
String< 500, Strings::NoHyperlinks > InfoText
String< 128, Strings::NoHyperlinks > MotdText
void HandleGuildInviteOpcode(WorldPackets::Guild::GuildInviteByName &packet)
void HandleGuildBankLogQuery(WorldPackets::Guild::GuildBankLogQuery &packet)
void HandleGuildBankSetTabText(WorldPackets::Guild::GuildBankSetTabText &packet)
void HandleGuildBankTextQuery(WorldPackets::Guild::GuildBankTextQuery &packet)
void HandleGuildUpdateMotdText(WorldPackets::Guild::GuildUpdateMotdText &packet)
void HandleGuildAddRankOpcode(WorldPackets::Guild::GuildAddRank &packet)
void HandleGuildBankWithdrawMoney(WorldPackets::Guild::GuildBankWithdrawMoney &packet)
void HandleSaveGuildEmblemOpcode(WorldPackets::Guild::SaveGuildEmblem &packet)
void HandleGuildSetGuildMaster(WorldPackets::Guild::GuildSetGuildMaster &packet)
void HandleGuildUpdateInfoText(WorldPackets::Guild::GuildUpdateInfoText &packet)
void HandleGuildDeleteRank(WorldPackets::Guild::GuildDeleteRank &packet)
void HandleGuildDemoteOpcode(WorldPackets::Guild::GuildDemoteMember &demote)
void HandleGuildBankActivate(WorldPackets::Guild::GuildBankActivate &packet)
void HandleGuildInfoOpcode(WorldPackets::Guild::GuildGetInfo &packet)
std::string GetPlayerInfo() const
Player * GetPlayer() const
void HandleGuildDelete(WorldPackets::Guild::GuildDelete &packet)
void HandleGuildBankUpdateTab(WorldPackets::Guild::GuildBankUpdateTab &packet)
void HandleGuildLeaveOpcode(WorldPackets::Guild::GuildLeave &leave)
void HandleGuildBankQueryTab(WorldPackets::Guild::GuildBankQueryTab &packet)
void HandleGuildBankDepositMoney(WorldPackets::Guild::GuildBankDepositMoney &packet)
void HandleGuildBankBuyTab(WorldPackets::Guild::GuildBankBuyTab &packet)
void HandleGuildRemoveOpcode(WorldPackets::Guild::GuildOfficerRemoveMember &packet)
void HandleGuildSetPublicNoteOpcode(WorldPackets::Guild::GuildSetMemberNote &packet)
void HandleGuildQueryOpcode(WorldPackets::Guild::QueryGuildInfo &query)
void HandleGuildBankMoneyWithdrawn(WorldPackets::Guild::GuildBankRemainingWithdrawMoneyQuery &packet)
void HandleGuildBankSwapItems(WorldPackets::Guild::GuildBankSwapItems &packet)
void HandleGuildCreateOpcode(WorldPackets::Guild::GuildCreate &packet)
void HandleGuildSetOfficerNoteOpcode(WorldPackets::Guild::GuildSetMemberNote &packet)
void HandleGuildPromoteOpcode(WorldPackets::Guild::GuildPromoteMember &promote)
void HandleGuildDeclineOpcode(WorldPackets::Guild::GuildDeclineInvitation &decline)
void HandleGuildSetRankPermissions(WorldPackets::Guild::GuildSetRankPermissions &packet)
void HandleGuildAcceptOpcode(WorldPackets::Guild::AcceptGuildInvite &invite)
void HandleGuildEventLogQueryOpcode(WorldPackets::Guild::GuildEventLogQuery &packet)
void HandleGuildPermissionsQuery(WorldPackets::Guild::GuildPermissionsQuery &packet)
void HandleGuildRosterOpcode(WorldPackets::Guild::GuildGetRoster &packet)