diff options
author | Spp <spp@jorge.gr> | 2012-01-26 10:54:53 +0100 |
---|---|---|
committer | Spp <spp@jorge.gr> | 2012-01-26 10:54:53 +0100 |
commit | c9762b0e385243ec383672e5785b1f45b16bb93b (patch) | |
tree | 9f583c6cbc7479bfef40cf0373c4fbffa3e24c42 /src/server/game/Handlers/GuildHandler.cpp | |
parent | f4b7414dc0e1039a8a2cdf8d3c44e4daa470adc1 (diff) |
Core: Change Handlers location
Diffstat (limited to 'src/server/game/Handlers/GuildHandler.cpp')
-rwxr-xr-x | src/server/game/Handlers/GuildHandler.cpp | 570 |
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); +} |