aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/GuildHandler.cpp
diff options
context:
space:
mode:
authorSpp <spp@jorge.gr>2012-01-26 10:54:53 +0100
committerSpp <spp@jorge.gr>2012-01-26 10:54:53 +0100
commitc9762b0e385243ec383672e5785b1f45b16bb93b (patch)
tree9f583c6cbc7479bfef40cf0373c4fbffa3e24c42 /src/server/game/Handlers/GuildHandler.cpp
parentf4b7414dc0e1039a8a2cdf8d3c44e4daa470adc1 (diff)
Core: Change Handlers location
Diffstat (limited to 'src/server/game/Handlers/GuildHandler.cpp')
-rwxr-xr-xsrc/server/game/Handlers/GuildHandler.cpp570
1 files changed, 570 insertions, 0 deletions
diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp
new file mode 100755
index 00000000000..d2a5f8014b8
--- /dev/null
+++ b/src/server/game/Handlers/GuildHandler.cpp
@@ -0,0 +1,570 @@
+/*
+ * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/>
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "Common.h"
+#include "WorldPacket.h"
+#include "WorldSession.h"
+#include "World.h"
+#include "ObjectMgr.h"
+#include "GuildMgr.h"
+#include "Log.h"
+#include "Opcodes.h"
+#include "Guild.h"
+#include "GossipDef.h"
+#include "SocialMgr.h"
+
+// Helper for getting guild object of session's player.
+// If guild does not exist, sends error (if necessary).
+inline Guild* _GetPlayerGuild(WorldSession* session, bool sendError = false)
+{
+ if (uint32 guildId = session->GetPlayer()->GetGuildId()) // If guild id = 0, player is not in guild
+ if (Guild* guild = sGuildMgr->GetGuildById(guildId)) // Find guild by id
+ return guild;
+ if (sendError)
+ Guild::SendCommandResult(session, GUILD_CREATE_S, ERR_GUILD_PLAYER_NOT_IN_GUILD);
+ return NULL;
+}
+
+void WorldSession::HandleGuildQueryOpcode(WorldPacket& recvPacket)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_QUERY");
+
+ uint32 guildId;
+ recvPacket >> guildId;
+ // Use received guild id to access guild method (not player's guild id)
+ if (Guild* guild = sGuildMgr->GetGuildById(guildId))
+ guild->HandleQuery(this);
+ else
+ Guild::SendCommandResult(this, GUILD_CREATE_S, ERR_GUILD_PLAYER_NOT_IN_GUILD);
+}
+
+void WorldSession::HandleGuildCreateOpcode(WorldPacket& recvPacket)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_CREATE");
+
+ std::string name;
+ recvPacket >> name;
+
+ if (!GetPlayer()->GetGuildId()) // Player cannot be in guild
+ {
+ Guild* guild = new Guild();
+ if (guild->Create(GetPlayer(), name))
+ sGuildMgr->AddGuild(guild);
+ else
+ delete guild;
+ }
+}
+
+void WorldSession::HandleGuildInviteOpcode(WorldPacket& recvPacket)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_INVITE");
+
+ std::string invitedName;
+ recvPacket >> invitedName;
+
+ if (normalizePlayerName(invitedName))
+ if (Guild* guild = _GetPlayerGuild(this, true))
+ guild->HandleInviteMember(this, invitedName);
+}
+
+void WorldSession::HandleGuildRemoveOpcode(WorldPacket& recvPacket)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_REMOVE");
+
+ std::string playerName;
+ recvPacket >> playerName;
+
+ if (normalizePlayerName(playerName))
+ if (Guild* guild = _GetPlayerGuild(this, true))
+ guild->HandleRemoveMember(this, playerName);
+}
+
+void WorldSession::HandleGuildAcceptOpcode(WorldPacket& /*recvPacket*/)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_ACCEPT");
+ // Player cannot be in guild
+ if (!GetPlayer()->GetGuildId())
+ // Guild where player was invited must exist
+ if (Guild* guild = sGuildMgr->GetGuildById(GetPlayer()->GetGuildIdInvited()))
+ guild->HandleAcceptMember(this);
+}
+
+void WorldSession::HandleGuildDeclineOpcode(WorldPacket& /*recvPacket*/)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_DECLINE");
+
+ GetPlayer()->SetGuildIdInvited(0);
+ GetPlayer()->SetInGuild(0);
+}
+
+void WorldSession::HandleGuildInfoOpcode(WorldPacket& /*recvPacket*/)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_INFO");
+
+ if (Guild* guild = _GetPlayerGuild(this, true))
+ guild->SendInfo(this);
+}
+
+void WorldSession::HandleGuildRosterOpcode(WorldPacket& /*recvPacket*/)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_ROSTER");
+
+ if (Guild* guild = _GetPlayerGuild(this))
+ guild->HandleRoster(this);
+}
+
+void WorldSession::HandleGuildPromoteOpcode(WorldPacket& recvPacket)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_PROMOTE");
+
+ std::string playerName;
+ recvPacket >> playerName;
+
+ if (normalizePlayerName(playerName))
+ if (Guild* guild = _GetPlayerGuild(this, true))
+ guild->HandleUpdateMemberRank(this, playerName, false);
+}
+
+void WorldSession::HandleGuildDemoteOpcode(WorldPacket& recvPacket)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_DEMOTE");
+
+ std::string playerName;
+ recvPacket >> playerName;
+
+ if (normalizePlayerName(playerName))
+ if (Guild* guild = _GetPlayerGuild(this, true))
+ guild->HandleUpdateMemberRank(this, playerName, true);
+}
+
+void WorldSession::HandleGuildLeaveOpcode(WorldPacket& /*recvPacket*/)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_LEAVE");
+
+ if (Guild* guild = _GetPlayerGuild(this, true))
+ guild->HandleLeaveMember(this);
+}
+
+void WorldSession::HandleGuildDisbandOpcode(WorldPacket& /*recvPacket*/)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_DISBAND");
+
+ if (Guild* guild = _GetPlayerGuild(this, true))
+ guild->HandleDisband(this);
+}
+
+void WorldSession::HandleGuildLeaderOpcode(WorldPacket& recvPacket)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_LEADER");
+
+ std::string name;
+ recvPacket >> name;
+
+ if (normalizePlayerName(name))
+ if (Guild* guild = _GetPlayerGuild(this, true))
+ guild->HandleSetLeader(this, name);
+}
+
+void WorldSession::HandleGuildMOTDOpcode(WorldPacket& recvPacket)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_MOTD");
+
+ std::string motd; // Empty by default
+ if (!recvPacket.empty())
+ recvPacket >> motd;
+
+ if (Guild* guild = _GetPlayerGuild(this, true))
+ guild->HandleSetMOTD(this, motd);
+}
+
+void WorldSession::HandleGuildSetPublicNoteOpcode(WorldPacket& recvPacket)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_SET_PUBLIC_NOTE");
+
+ std::string playerName;
+ recvPacket >> playerName;
+
+ std::string publicNote;
+ recvPacket >> publicNote;
+
+ if (normalizePlayerName(playerName))
+ if (Guild* guild = _GetPlayerGuild(this, true))
+ guild->HandleSetMemberNote(this, playerName, publicNote, false);
+}
+
+void WorldSession::HandleGuildSetOfficerNoteOpcode(WorldPacket& recvPacket)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_SET_OFFICER_NOTE");
+
+ std::string playerName;
+ recvPacket >> playerName;
+
+ std::string officerNote;
+ recvPacket >> officerNote;
+
+ if (normalizePlayerName(playerName))
+ if (Guild* guild = _GetPlayerGuild(this, true))
+ guild->HandleSetMemberNote(this, playerName, officerNote, true);
+}
+
+void WorldSession::HandleGuildRankOpcode(WorldPacket& recvPacket)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_RANK");
+
+ Guild* guild = _GetPlayerGuild(this, true);
+ if (!guild)
+ {
+ recvPacket.rpos(recvPacket.wpos());
+ return;
+ }
+
+ uint32 rankId;
+ recvPacket >> rankId;
+
+ uint32 rights;
+ recvPacket >> rights;
+
+ std::string rankName;
+ recvPacket >> rankName;
+
+ uint32 money;
+ recvPacket >> money;
+
+ GuildBankRightsAndSlotsVec rightsAndSlots(GUILD_BANK_MAX_TABS);
+ for (uint8 tabId = 0; tabId < GUILD_BANK_MAX_TABS; ++tabId)
+ {
+ uint32 bankRights;
+ uint32 slots;
+
+ recvPacket >> bankRights;
+ recvPacket >> slots;
+
+ rightsAndSlots[tabId] = GuildBankRightsAndSlots(uint8(bankRights), slots);
+ }
+
+ guild->HandleSetRankInfo(this, rankId, rankName, rights, money, rightsAndSlots);
+}
+
+void WorldSession::HandleGuildAddRankOpcode(WorldPacket& recvPacket)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_ADD_RANK");
+
+ std::string rankName;
+ recvPacket >> rankName;
+
+ if (Guild* guild = _GetPlayerGuild(this, true))
+ guild->HandleAddNewRank(this, rankName);
+}
+
+void WorldSession::HandleGuildDelRankOpcode(WorldPacket& /*recvPacket*/)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_DEL_RANK");
+
+ if (Guild* guild = _GetPlayerGuild(this, true))
+ guild->HandleRemoveLowestRank(this);
+}
+
+void WorldSession::HandleGuildChangeInfoTextOpcode(WorldPacket& recvPacket)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_INFO_TEXT");
+
+ std::string info;
+ recvPacket >> info;
+
+ if (Guild* guild = _GetPlayerGuild(this, true))
+ guild->HandleSetInfo(this, info);
+}
+
+void WorldSession::HandleSaveGuildEmblemOpcode(WorldPacket& recvPacket)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received MSG_SAVE_GUILD_EMBLEM");
+
+ uint64 vendorGuid;
+ recvPacket >> vendorGuid;
+
+ EmblemInfo emblemInfo;
+ emblemInfo.ReadPacket(recvPacket);
+
+ if (GetPlayer()->GetNPCIfCanInteractWith(vendorGuid, UNIT_NPC_FLAG_TABARDDESIGNER))
+ {
+ // Remove fake death
+ if (GetPlayer()->HasUnitState(UNIT_STAT_DIED))
+ GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
+
+ if (Guild* guild = _GetPlayerGuild(this))
+ guild->HandleSetEmblem(this, emblemInfo);
+ else
+ // "You are not part of a guild!";
+ Guild::SendSaveEmblemResult(this, ERR_GUILDEMBLEM_NOGUILD);
+ }
+ else
+ {
+ // "That's not an emblem vendor!"
+ Guild::SendSaveEmblemResult(this, ERR_GUILDEMBLEM_INVALIDVENDOR);
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleSaveGuildEmblemOpcode - Unit (GUID: %u) not found or you can't interact with him.", GUID_LOPART(vendorGuid));
+ }
+}
+
+void WorldSession::HandleGuildEventLogQueryOpcode(WorldPacket& /* recvPacket */)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received (MSG_GUILD_EVENT_LOG_QUERY)");
+
+ if (Guild* guild = _GetPlayerGuild(this))
+ guild->SendEventLog(this);
+}
+
+void WorldSession::HandleGuildBankMoneyWithdrawn(WorldPacket & /* recv_data */)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received (MSG_GUILD_BANK_MONEY_WITHDRAWN)");
+
+ if (Guild* guild = _GetPlayerGuild(this))
+ guild->SendMoneyInfo(this);
+}
+
+void WorldSession::HandleGuildPermissions(WorldPacket& /* recv_data */)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received (MSG_GUILD_PERMISSIONS)");
+
+ if (Guild* guild = _GetPlayerGuild(this))
+ guild->SendPermissions(this);
+}
+
+// Called when clicking on Guild bank gameobject
+void WorldSession::HandleGuildBankerActivate(WorldPacket & recv_data)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received (CMSG_GUILD_BANKER_ACTIVATE)");
+
+ uint64 GoGuid;
+ recv_data >> GoGuid;
+
+ uint8 unk;
+ recv_data >> unk;
+
+ if (GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid, GAMEOBJECT_TYPE_GUILD_BANK))
+ {
+ if (Guild* guild = _GetPlayerGuild(this))
+ guild->SendBankTabsInfo(this);
+ else
+ Guild::SendCommandResult(this, GUILD_UNK1, ERR_GUILD_PLAYER_NOT_IN_GUILD);
+ }
+}
+
+// Called when opening guild bank tab only (first one)
+void WorldSession::HandleGuildBankQueryTab(WorldPacket & recv_data)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received (CMSG_GUILD_BANK_QUERY_TAB)");
+
+ uint64 GoGuid;
+ recv_data >> GoGuid;
+
+ uint8 tabId;
+ recv_data >> tabId;
+
+ uint8 unk1;
+ recv_data >> unk1;
+
+ if (GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid, GAMEOBJECT_TYPE_GUILD_BANK))
+ if (Guild* guild = _GetPlayerGuild(this))
+ guild->SendBankTabData(this, tabId);
+}
+
+void WorldSession::HandleGuildBankDepositMoney(WorldPacket & recv_data)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received (CMSG_GUILD_BANK_DEPOSIT_MONEY)");
+
+ uint64 GoGuid;
+ recv_data >> GoGuid;
+
+ uint32 money;
+ recv_data >> money;
+
+ if (GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid, GAMEOBJECT_TYPE_GUILD_BANK))
+ if (money && GetPlayer()->HasEnoughMoney(money))
+ if (Guild* guild = _GetPlayerGuild(this))
+ guild->HandleMemberDepositMoney(this, money);
+}
+
+void WorldSession::HandleGuildBankWithdrawMoney(WorldPacket & recv_data)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received (CMSG_GUILD_BANK_WITHDRAW_MONEY)");
+
+ uint64 GoGuid;
+ recv_data >> GoGuid;
+
+ uint32 money;
+ recv_data >> money;
+
+ if (money)
+ if (GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid, GAMEOBJECT_TYPE_GUILD_BANK))
+ if (Guild* guild = _GetPlayerGuild(this))
+ guild->HandleMemberWithdrawMoney(this, money);
+}
+
+void WorldSession::HandleGuildBankSwapItems(WorldPacket & recv_data)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received (CMSG_GUILD_BANK_SWAP_ITEMS)");
+
+ uint64 GoGuid;
+ recv_data >> GoGuid;
+
+ if (!GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid, GAMEOBJECT_TYPE_GUILD_BANK))
+ {
+ recv_data.rfinish(); // Prevent additional spam at rejected packet
+ return;
+ }
+
+ Guild* guild = _GetPlayerGuild(this);
+ if (!guild)
+ {
+ recv_data.rfinish(); // Prevent additional spam at rejected packet
+ return;
+ }
+
+ uint8 bankToBank;
+ recv_data >> bankToBank;
+
+ uint8 tabId;
+ uint8 slotId;
+ uint32 itemEntry;
+ uint32 splitedAmount = 0;
+
+ if (bankToBank)
+ {
+ uint8 destTabId;
+ recv_data >> destTabId;
+
+ uint8 destSlotId;
+ recv_data >> destSlotId;
+ recv_data.read_skip<uint32>(); // Always 0
+
+ recv_data >> tabId;
+ recv_data >> slotId;
+ recv_data >> itemEntry;
+ recv_data.read_skip<uint8>(); // Always 0
+
+ recv_data >> splitedAmount;
+
+ guild->SwapItems(GetPlayer(), tabId, slotId, destTabId, destSlotId, splitedAmount);
+ }
+ else
+ {
+ uint8 playerBag = NULL_BAG;
+ uint8 playerSlotId = NULL_SLOT;
+ uint8 toChar = 1;
+
+ recv_data >> tabId;
+ recv_data >> slotId;
+ recv_data >> itemEntry;
+
+ uint8 autoStore;
+ recv_data >> autoStore;
+ if (autoStore)
+ {
+ recv_data.read_skip<uint32>(); // autoStoreCount
+ recv_data.read_skip<uint8>(); // ToChar (?), always and expected to be 1 (autostore only triggered in Bank -> Char)
+ recv_data.read_skip<uint32>(); // Always 0
+ }
+ else
+ {
+ recv_data >> playerBag;
+ recv_data >> playerSlotId;
+ recv_data >> toChar;
+ recv_data >> splitedAmount;
+ }
+
+ // Player <-> Bank
+ // Allow to work with inventory only
+ if (!Player::IsInventoryPos(playerBag, playerSlotId) && !(playerBag == NULL_BAG && playerSlotId == NULL_SLOT))
+ GetPlayer()->SendEquipError(EQUIP_ERR_NONE, NULL);
+ else
+ guild->SwapItemsWithInventory(GetPlayer(), toChar, tabId, slotId, playerBag, playerSlotId, splitedAmount);
+ }
+}
+
+void WorldSession::HandleGuildBankBuyTab(WorldPacket & recv_data)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received (CMSG_GUILD_BANK_BUY_TAB)");
+
+ uint64 GoGuid;
+ recv_data >> GoGuid;
+
+ uint8 tabId;
+ recv_data >> tabId;
+
+ if (GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid, GAMEOBJECT_TYPE_GUILD_BANK))
+ if (Guild* guild = _GetPlayerGuild(this))
+ guild->HandleBuyBankTab(this, tabId);
+}
+
+void WorldSession::HandleGuildBankUpdateTab(WorldPacket & recv_data)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received (CMSG_GUILD_BANK_UPDATE_TAB)");
+
+ uint64 GoGuid;
+ recv_data >> GoGuid;
+
+ uint8 tabId;
+ recv_data >> tabId;
+
+ std::string name;
+ recv_data >> name;
+
+ std::string icon;
+ recv_data >> icon;
+
+ if (!name.empty() && !icon.empty())
+ if (GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid, GAMEOBJECT_TYPE_GUILD_BANK))
+ if (Guild* guild = _GetPlayerGuild(this))
+ guild->HandleSetBankTabInfo(this, tabId, name, icon);
+}
+
+void WorldSession::HandleGuildBankLogQuery(WorldPacket & recv_data)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received (MSG_GUILD_BANK_LOG_QUERY)");
+
+ uint8 tabId;
+ recv_data >> tabId;
+
+ if (Guild* guild = _GetPlayerGuild(this))
+ guild->SendBankLog(this, tabId);
+}
+
+void WorldSession::HandleQueryGuildBankTabText(WorldPacket &recv_data)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received MSG_QUERY_GUILD_BANK_TEXT");
+
+ uint8 tabId;
+ recv_data >> tabId;
+
+ if (Guild* guild = _GetPlayerGuild(this))
+ guild->SendBankTabText(this, tabId);
+}
+
+void WorldSession::HandleSetGuildBankTabText(WorldPacket &recv_data)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_SET_GUILD_BANK_TEXT");
+
+ uint8 tabId;
+ recv_data >> tabId;
+
+ std::string text;
+ recv_data >> text;
+
+ if (Guild* guild = _GetPlayerGuild(this))
+ guild->SetBankTabText(tabId, text);
+}