Files
TCPlayerbotCore/src/game/GuildHandler.cpp
T

1271 lines
36 KiB
C++
Raw Normal View History

2008-10-02 16:23:55 -05:00
/*
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
2008-10-14 11:57:03 -05:00
*
2010-01-16 20:19:18 +03:00
* Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
2008-10-02 16:23:55 -05:00
*
* 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
2008-10-14 11:57:03 -05:00
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2008-10-02 16:23:55 -05:00
* 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, write to the Free Software
2008-10-14 11:57:03 -05:00
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2008-10-02 16:23:55 -05:00
*/
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
#include "Common.h"
#include "WorldPacket.h"
#include "WorldSession.h"
#include "World.h"
#include "ObjectMgr.h"
#include "Log.h"
#include "Opcodes.h"
#include "Guild.h"
#include "GossipDef.h"
#include "SocialMgr.h"
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void WorldSession::HandleGuildQueryOpcode(WorldPacket& recvPacket)
{
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Received CMSG_GUILD_QUERY");
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
uint32 guildId;
2008-10-02 16:23:55 -05:00
recvPacket >> guildId;
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
if(Guild *guild = objmgr.GetGuildById(guildId))
2008-10-02 16:23:55 -05:00
{
2009-12-17 11:14:55 +01:00
guild->Query(this);
2008-10-02 16:23:55 -05:00
return;
}
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void WorldSession::HandleGuildCreateOpcode(WorldPacket& recvPacket)
{
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Received CMSG_GUILD_CREATE");
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
std::string gname;
2008-10-02 16:23:55 -05:00
recvPacket >> gname;
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
if(GetPlayer()->GetGuildId()) // already in guild
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
Guild *guild = new Guild;
2009-12-17 11:14:55 +01:00
if(!guild->Create(GetPlayer(), gname))
2008-10-02 16:23:55 -05:00
{
delete guild;
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
objmgr.AddGuild(guild);
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void WorldSession::HandleGuildInviteOpcode(WorldPacket& recvPacket)
{
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Received CMSG_GUILD_INVITE");
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
std::string Invitedname, plname;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
Player * player = NULL;
recvPacket >> Invitedname;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if(normalizePlayerName(Invitedname))
player = ObjectAccessor::Instance().FindPlayerByName(Invitedname.c_str());
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if(!player)
{
SendGuildCommandResult(GUILD_INVITE_S, Invitedname, GUILD_PLAYER_NOT_FOUND);
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
Guild *guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
if(!guild)
{
SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// OK result but not send invite
if(player->GetSocial()->HasIgnore(GetPlayer()->GetGUIDLow()))
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// not let enemies sign guild charter
if (!sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && player->GetTeam() != GetPlayer()->GetTeam())
{
SendGuildCommandResult(GUILD_INVITE_S, Invitedname, GUILD_NOT_ALLIED);
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if(player->GetGuildId())
{
plname = player->GetName();
SendGuildCommandResult(GUILD_INVITE_S, plname, ALREADY_IN_GUILD);
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if(player->GetGuildIdInvited())
{
plname = player->GetName();
SendGuildCommandResult(GUILD_INVITE_S, plname, ALREADY_INVITED_TO_GUILD);
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if(!guild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_INVITE))
{
SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
sLog.outDebug("Player %s Invited %s to Join his Guild", GetPlayer()->GetName(), Invitedname.c_str());
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
player->SetGuildIdInvited(GetPlayer()->GetGuildId());
// Put record into guildlog
guild->LogGuildEvent(GUILD_EVENT_LOG_INVITE_PLAYER, GetPlayer()->GetGUIDLow(), player->GetGUIDLow(), 0);
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
WorldPacket data(SMSG_GUILD_INVITE, (8+10)); // guess size
data << GetPlayer()->GetName();
data << guild->GetName();
player->GetSession()->SendPacket(&data);
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Sent (SMSG_GUILD_INVITE)");
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void WorldSession::HandleGuildRemoveOpcode(WorldPacket& recvPacket)
{
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Received CMSG_GUILD_REMOVE");
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
std::string plName;
2008-10-02 16:23:55 -05:00
recvPacket >> plName;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if(!normalizePlayerName(plName))
return;
2009-10-17 15:51:44 -07:00
Guild* guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
if(!guild)
{
SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
return;
}
2009-10-17 15:51:44 -07:00
if(!guild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_REMOVE))
{
SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
return;
}
2009-10-17 15:51:44 -07:00
2008-11-14 16:28:45 -06:00
uint64 plGuid;
MemberSlot* slot = guild->GetMemberSlot(plName, plGuid);
if(!slot)
2008-10-02 16:23:55 -05:00
{
2008-11-14 16:28:45 -06:00
SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_IN_GUILD_S);
2008-10-02 16:23:55 -05:00
return;
}
2009-10-17 15:51:44 -07:00
2008-11-14 16:28:45 -06:00
if(slot->RankId == GR_GUILDMASTER)
2008-10-02 16:23:55 -05:00
{
SendGuildCommandResult(GUILD_QUIT_S, "", GUILD_LEADER_LEAVE);
return;
}
2009-10-17 15:51:44 -07:00
//do not allow to kick player with same or higher rights
if(GetPlayer()->GetRank() >= slot->RankId)
{
SendGuildCommandResult(GUILD_QUIT_S, plName, GUILD_RANK_TOO_HIGH_S);
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
guild->DelMember(plGuid);
// Put record into guildlog
guild->LogGuildEvent(GUILD_EVENT_LOG_UNINVITE_PLAYER, GetPlayer()->GetGUIDLow(), GUID_LOPART(plGuid), 0);
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
WorldPacket data(SMSG_GUILD_EVENT, (2+20)); // guess size
data << (uint8)GE_REMOVED;
data << (uint8)2; // strings count
data << plName;
data << GetPlayer()->GetName();
guild->BroadcastPacket(&data);
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void WorldSession::HandleGuildAcceptOpcode(WorldPacket& /*recvPacket*/)
{
Guild *guild;
Player *player = GetPlayer();
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Received CMSG_GUILD_ACCEPT");
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
guild = objmgr.GetGuildById(player->GetGuildIdInvited());
if(!guild || player->GetGuildId())
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// not let enemies sign guild charter
if (!sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && player->GetTeam() != objmgr.GetPlayerTeamByGUID(guild->GetLeader()))
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if(!guild->AddMember(GetPlayer()->GetGUID(),guild->GetLowestRank()))
return;
// Put record into guildlog
guild->LogGuildEvent(GUILD_EVENT_LOG_JOIN_GUILD, GetPlayer()->GetGUIDLow(), 0, 0);
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
WorldPacket data(SMSG_GUILD_EVENT, (2+10)); // guess size
data << (uint8)GE_JOINED;
data << (uint8)1; // strings count
2008-10-02 16:23:55 -05:00
data << player->GetName();
guild->BroadcastPacket(&data);
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Sent (SMSG_GUILD_EVENT)");
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void WorldSession::HandleGuildDeclineOpcode(WorldPacket& /*recvPacket*/)
{
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Received CMSG_GUILD_DECLINE");
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
GetPlayer()->SetGuildIdInvited(0);
GetPlayer()->SetInGuild(0);
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void WorldSession::HandleGuildInfoOpcode(WorldPacket& /*recvPacket*/)
{
Guild *guild;
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Received CMSG_GUILD_INFO");
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
if(!guild)
{
SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
WorldPacket data(SMSG_GUILD_INFO, (5*4 + guild->GetName().size() + 1));
data << guild->GetName();
data << guild->GetCreatedDay();
data << guild->GetCreatedMonth();
data << guild->GetCreatedYear();
data << guild->GetMemberSize();
data << guild->GetMemberSize();
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
SendPacket(&data);
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void WorldSession::HandleGuildRosterOpcode(WorldPacket& /*recvPacket*/)
{
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Received CMSG_GUILD_ROSTER");
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
if(Guild* guild = objmgr.GetGuildById(_player->GetGuildId()))
guild->Roster(this);
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void WorldSession::HandleGuildPromoteOpcode(WorldPacket& recvPacket)
{
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Received CMSG_GUILD_PROMOTE");
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
std::string plName;
2008-10-02 16:23:55 -05:00
recvPacket >> plName;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if(!normalizePlayerName(plName))
return;
2009-10-17 15:51:44 -07:00
Guild* guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
2008-10-02 16:23:55 -05:00
if(!guild)
{
SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
return;
}
2009-12-17 11:14:55 +01:00
if(!guild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_PROMOTE))
{
SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
return;
}
2009-10-17 15:51:44 -07:00
2008-11-14 16:28:45 -06:00
uint64 plGuid;
MemberSlot* slot = guild->GetMemberSlot(plName, plGuid);
2009-10-17 15:51:44 -07:00
2008-11-14 16:28:45 -06:00
if(!slot)
2008-10-02 16:23:55 -05:00
{
2008-11-14 16:28:45 -06:00
SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_IN_GUILD_S);
2008-10-02 16:23:55 -05:00
return;
}
2009-10-17 15:51:44 -07:00
2008-11-14 16:28:45 -06:00
if(plGuid == GetPlayer()->GetGUID())
2008-10-02 16:23:55 -05:00
{
SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_NAME_INVALID);
return;
}
2009-10-17 15:51:44 -07:00
//allow to promote only to lower rank than member's rank
//guildmaster's rank = 0
//GetPlayer()->GetRank() + 1 is highest rank that current player can promote to
if(GetPlayer()->GetRank() + 1 >= slot->RankId)
{
SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_RANK_TOO_HIGH_S);
2008-10-02 16:23:55 -05:00
return;
}
2009-10-17 15:51:44 -07:00
uint32 newRankId = slot->RankId - 1; //when promoting player, rank is decreased
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
WorldPacket data(SMSG_GUILD_EVENT, (2+30)); // guess size
data << (uint8)GE_PROMOTION;
data << (uint8)3; // strings count
2008-10-02 16:23:55 -05:00
data << GetPlayer()->GetName();
data << plName;
data << guild->GetRankName(newRankId);
guild->BroadcastPacket(&data);
2009-10-17 16:20:24 -07:00
guild->ChangeRank(plGuid, newRankId);
// Put record into guildlog
guild->LogGuildEvent(GUILD_EVENT_LOG_PROMOTE_PLAYER, GetPlayer()->GetGUIDLow(), GUID_LOPART(plGuid), newRankId);
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void WorldSession::HandleGuildDemoteOpcode(WorldPacket& recvPacket)
{
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Received CMSG_GUILD_DEMOTE");
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
std::string plName;
2008-10-02 16:23:55 -05:00
recvPacket >> plName;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if(!normalizePlayerName(plName))
return;
2009-10-17 15:51:44 -07:00
Guild* guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if(!guild)
{
SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
return;
}
2009-10-17 15:51:44 -07:00
if(!guild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_DEMOTE))
{
SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
return;
}
2009-10-17 15:51:44 -07:00
2008-11-14 16:28:45 -06:00
uint64 plGuid;
MemberSlot* slot = guild->GetMemberSlot(plName, plGuid);
2009-10-17 15:51:44 -07:00
2008-11-14 16:28:45 -06:00
if (!slot)
2008-10-02 16:23:55 -05:00
{
2008-11-14 16:28:45 -06:00
SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_IN_GUILD_S);
2008-10-02 16:23:55 -05:00
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if(plGuid == GetPlayer()->GetGUID())
{
SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_NAME_INVALID);
return;
}
2009-10-17 15:51:44 -07:00
//do not allow to demote same or higher rank
if(GetPlayer()->GetRank() >= slot->RankId)
{
SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_RANK_TOO_HIGH_S);
2008-10-02 16:23:55 -05:00
return;
}
2009-10-17 15:51:44 -07:00
//do not allow to demote lowest rank
if(slot->RankId >= guild->GetLowestRank())
{
SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_ALREADY_LOWEST_RANK_S);
return;
}
2009-10-17 15:51:44 -07:00
uint32 newRankId = slot->RankId + 1; //when demoting player, rank is increased
2009-10-17 15:51:44 -07:00
guild->ChangeRank(plGuid, newRankId);
2008-10-02 16:23:55 -05:00
// Put record into guildlog
guild->LogGuildEvent(GUILD_EVENT_LOG_DEMOTE_PLAYER, GetPlayer()->GetGUIDLow(), GUID_LOPART(plGuid), newRankId);
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
WorldPacket data(SMSG_GUILD_EVENT, (2+30)); // guess size
data << (uint8)GE_DEMOTION;
data << (uint8)3; // strings count
2008-10-02 16:23:55 -05:00
data << GetPlayer()->GetName();
data << plName;
2008-12-28 16:39:59 -06:00
data << guild->GetRankName(slot->RankId);
2008-10-02 16:23:55 -05:00
guild->BroadcastPacket(&data);
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void WorldSession::HandleGuildLeaveOpcode(WorldPacket& /*recvPacket*/)
{
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Received CMSG_GUILD_LEAVE");
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
Guild *guild = objmgr.GetGuildById(_player->GetGuildId());
2008-10-02 16:23:55 -05:00
if(!guild)
{
SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
return;
}
2009-12-17 11:14:55 +01:00
2008-10-02 16:23:55 -05:00
if(_player->GetGUID() == guild->GetLeader() && guild->GetMemberSize() > 1)
{
SendGuildCommandResult(GUILD_QUIT_S, "", GUILD_LEADER_LEAVE);
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if(_player->GetGUID() == guild->GetLeader())
{
guild->Disband();
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
guild->DelMember(_player->GetGUID());
// Put record into guildlog
guild->LogGuildEvent(GUILD_EVENT_LOG_LEAVE_GUILD, _player->GetGUIDLow(), 0, 0);
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
WorldPacket data(SMSG_GUILD_EVENT, (2+10)); // guess size
data << (uint8)GE_LEFT;
data << (uint8)1; // strings count
2009-12-17 11:14:55 +01:00
data << _player->GetName();
2008-10-02 16:23:55 -05:00
guild->BroadcastPacket(&data);
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Sent (SMSG_GUILD_EVENT)");
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
SendGuildCommandResult(GUILD_QUIT_S, guild->GetName(), GUILD_PLAYER_NO_MORE_IN_GUILD);
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void WorldSession::HandleGuildDisbandOpcode(WorldPacket& /*recvPacket*/)
{
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Received CMSG_GUILD_DISBAND");
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
Guild *guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
2008-10-02 16:23:55 -05:00
if(!guild)
{
SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
return;
}
2009-12-17 11:14:55 +01:00
2008-10-02 16:23:55 -05:00
if(GetPlayer()->GetGUID() != guild->GetLeader())
{
SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
guild->Disband();
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Guild Successfully Disbanded");
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void WorldSession::HandleGuildLeaderOpcode(WorldPacket& recvPacket)
{
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Received CMSG_GUILD_LEADER");
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
std::string name;
2008-10-02 16:23:55 -05:00
recvPacket >> name;
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
Player *oldLeader = GetPlayer();
2008-10-02 16:23:55 -05:00
if(!normalizePlayerName(name))
return;
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
Guild *guild = objmgr.GetGuildById(oldLeader->GetGuildId());
2009-10-17 15:51:44 -07:00
if (!guild)
{
SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
return;
}
2009-10-17 15:51:44 -07:00
if( oldLeader->GetGUID() != guild->GetLeader())
{
SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
return;
}
2009-10-17 15:51:44 -07:00
2008-11-14 16:28:45 -06:00
uint64 newLeaderGUID;
MemberSlot* slot = guild->GetMemberSlot(name, newLeaderGUID);
2009-10-17 15:51:44 -07:00
2008-11-14 16:28:45 -06:00
if (!slot)
2008-10-02 16:23:55 -05:00
{
SendGuildCommandResult(GUILD_INVITE_S, name, GUILD_PLAYER_NOT_IN_GUILD_S);
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
guild->SetLeader(newLeaderGUID);
guild->ChangeRank(oldLeader->GetGUID(), GR_OFFICER);
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
WorldPacket data(SMSG_GUILD_EVENT, (2+20)); // guess size
data << (uint8)GE_LEADER_CHANGED;
data << (uint8)2; // strings count
2008-10-02 16:23:55 -05:00
data << oldLeader->GetName();
data << name.c_str();
guild->BroadcastPacket(&data);
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
//sLog.outDebug("WORLD: Sent (SMSG_GUILD_EVENT)");
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void WorldSession::HandleGuildMOTDOpcode(WorldPacket& recvPacket)
{
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Received CMSG_GUILD_MOTD");
2008-10-02 16:23:55 -05:00
std::string MOTD;
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
if(!recvPacket.empty())
recvPacket >> MOTD;
else
MOTD = "";
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
Guild *guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
2008-10-02 16:23:55 -05:00
if(!guild)
{
SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
return;
}
2009-12-17 11:14:55 +01:00
2008-10-02 16:23:55 -05:00
if(!guild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_SETMOTD))
{
SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
guild->SetMOTD(MOTD);
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
WorldPacket data(SMSG_GUILD_EVENT, (2+MOTD.size()+1));
data << (uint8)GE_MOTD;
data << (uint8)1; // strings count
2008-10-02 16:23:55 -05:00
data << MOTD;
guild->BroadcastPacket(&data);
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Sent (SMSG_GUILD_EVENT)");
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void WorldSession::HandleGuildSetPublicNoteOpcode(WorldPacket& recvPacket)
{
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Received CMSG_GUILD_SET_PUBLIC_NOTE");
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
std::string name,PNOTE;
2008-10-02 16:23:55 -05:00
recvPacket >> name;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if(!normalizePlayerName(name))
return;
2009-10-17 15:51:44 -07:00
Guild* guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
if (!guild)
{
SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
return;
}
2009-10-17 15:51:44 -07:00
if (!guild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_EPNOTE))
{
SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
return;
}
2009-10-17 15:51:44 -07:00
2008-11-14 16:28:45 -06:00
uint64 plGuid;
MemberSlot* slot = guild->GetMemberSlot(name, plGuid);
2009-10-17 15:51:44 -07:00
2008-11-14 16:28:45 -06:00
if (!slot)
2008-10-02 16:23:55 -05:00
{
SendGuildCommandResult(GUILD_INVITE_S, name, GUILD_PLAYER_NOT_IN_GUILD_S);
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
recvPacket >> PNOTE;
guild->SetPNOTE(plGuid, PNOTE);
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
guild->Roster(this);
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void WorldSession::HandleGuildSetOfficerNoteOpcode(WorldPacket& recvPacket)
{
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Received CMSG_GUILD_SET_OFFICER_NOTE");
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
std::string plName, OFFNOTE;
2008-10-02 16:23:55 -05:00
recvPacket >> plName;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if(!normalizePlayerName(plName))
return;
2009-10-17 15:51:44 -07:00
Guild* guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
if (!guild)
{
SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
return;
}
2009-12-17 11:14:55 +01:00
if (!guild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_EOFFNOTE))
{
SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
return;
}
2009-10-17 15:51:44 -07:00
2008-11-14 16:28:45 -06:00
uint64 plGuid;
MemberSlot* slot = guild->GetMemberSlot(plName, plGuid);
2009-10-17 15:51:44 -07:00
2008-11-14 16:28:45 -06:00
if (!slot)
2008-10-02 16:23:55 -05:00
{
SendGuildCommandResult(GUILD_INVITE_S, plName, GUILD_PLAYER_NOT_IN_GUILD_S);
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
recvPacket >> OFFNOTE;
guild->SetOFFNOTE(plGuid, OFFNOTE);
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
guild->Roster(this);
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void WorldSession::HandleGuildRankOpcode(WorldPacket& recvPacket)
{
std::string rankname;
uint32 rankId;
uint32 rights, MoneyPerDay;
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Received CMSG_GUILD_RANK");
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
Guild *guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
2008-10-02 16:23:55 -05:00
if(!guild)
{
recvPacket.rpos(recvPacket.wpos()); // set to end to avoid warnings spam
2008-10-02 16:23:55 -05:00
SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
return;
}
else if(GetPlayer()->GetGUID() != guild->GetLeader())
{
recvPacket.rpos(recvPacket.wpos()); // set to end to avoid warnings spam
2008-10-02 16:23:55 -05:00
SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
recvPacket >> rankId;
recvPacket >> rights;
recvPacket >> rankname;
recvPacket >> MoneyPerDay;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
for (int i = 0; i < GUILD_BANK_MAX_TABS; ++i)
{
uint32 BankRights;
uint32 BankSlotPerDay;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
recvPacket >> BankRights;
recvPacket >> BankSlotPerDay;
guild->SetBankRightsAndSlots(rankId, uint8(i), uint16(BankRights & 0xFF), uint16(BankSlotPerDay), true);
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
sLog.outDebug("WORLD: Changed RankName to %s , Rights to 0x%.4X", rankname.c_str(), rights);
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
guild->SetBankMoneyPerDay(rankId, MoneyPerDay);
guild->SetRankName(rankId, rankname);
2009-10-17 15:51:44 -07:00
if (rankId == GR_GUILDMASTER) // prevent loss leader rights
rights = GR_RIGHT_ALL;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
guild->SetRankRights(rankId, rights);
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
guild->Query(this);
guild->Roster(); // broadcast for tab rights update
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void WorldSession::HandleGuildAddRankOpcode(WorldPacket& recvPacket)
{
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Received CMSG_GUILD_ADD_RANK");
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
std::string rankname;
recvPacket >> rankname;
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
Guild *guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
2008-10-02 16:23:55 -05:00
if(!guild)
{
SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if(GetPlayer()->GetGUID() != guild->GetLeader())
{
SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
return;
}
2009-10-17 15:51:44 -07:00
if(guild->GetRanksSize() >= GUILD_RANKS_MAX_COUNT) // client not let create more 10 than ranks
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
guild->CreateRank(rankname, GR_RIGHT_GCHATLISTEN | GR_RIGHT_GCHATSPEAK);
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
guild->Query(this);
guild->Roster(); // broadcast for tab rights update
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void WorldSession::HandleGuildDelRankOpcode(WorldPacket& /*recvPacket*/)
{
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Received CMSG_GUILD_DEL_RANK");
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
Guild *guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
2008-10-02 16:23:55 -05:00
if(!guild)
{
SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
return;
}
else if(GetPlayer()->GetGUID() != guild->GetLeader())
{
SendGuildCommandResult(GUILD_INVITE_S, "", GUILD_PERMISSIONS);
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
guild->DelRank();
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
guild->Query(this);
guild->Roster(); // broadcast for tab rights update
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2008-12-12 11:21:28 -06:00
void WorldSession::SendGuildCommandResult(uint32 typecmd, const std::string& str,uint32 cmdresult)
2008-10-02 16:23:55 -05:00
{
WorldPacket data(SMSG_GUILD_COMMAND_RESULT, (8+str.size()+1));
data << typecmd;
data << str;
data << cmdresult;
SendPacket(&data);
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Sent (SMSG_GUILD_COMMAND_RESULT)");
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2009-05-31 15:56:51 -05:00
void WorldSession::HandleGuildChangeInfoTextOpcode(WorldPacket& recvPacket)
2008-10-02 16:23:55 -05:00
{
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Received CMSG_GUILD_INFO_TEXT");
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
std::string GINFO;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
recvPacket >> GINFO;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
Guild *guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
if(!guild)
{
SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PLAYER_NOT_IN_GUILD);
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if(!guild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_MODIFY_GUILD_INFO))
{
SendGuildCommandResult(GUILD_CREATE_S, "", GUILD_PERMISSIONS);
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
guild->SetGINFO(GINFO);
}
2009-10-17 15:51:44 -07:00
2009-05-31 15:56:51 -05:00
void WorldSession::HandleSaveGuildEmblemOpcode(WorldPacket& recvPacket)
2008-10-02 16:23:55 -05:00
{
2009-12-17 11:14:55 +01:00
sLog.outDebug("WORLD: Received MSG_SAVE_GUILD_EMBLEM");
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
uint64 vendorGuid;
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
uint32 EmblemStyle, EmblemColor, BorderStyle, BorderColor, BackgroundColor;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
recvPacket >> vendorGuid;
2009-12-17 11:14:55 +01:00
recvPacket >> EmblemStyle >> EmblemColor >> BorderStyle >> BorderColor >> BackgroundColor;
2009-10-17 15:51:44 -07:00
Creature *pCreature = GetPlayer()->GetNPCIfCanInteractWith(vendorGuid,UNIT_NPC_FLAG_TABARDDESIGNER);
2008-10-02 16:23:55 -05:00
if (!pCreature)
{
//"That's not an emblem vendor!"
SendSaveGuildEmblem(ERR_GUILDEMBLEM_INVALIDVENDOR);
2009-05-31 15:56:51 -05:00
sLog.outDebug("WORLD: HandleSaveGuildEmblemOpcode - Unit (GUID: %u) not found or you can't interact with him.", GUID_LOPART(vendorGuid));
2008-10-02 16:23:55 -05:00
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// remove fake death
if(GetPlayer()->hasUnitState(UNIT_STAT_DIED))
2009-04-06 13:31:14 +02:00
GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
Guild *guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
if(!guild)
{
//"You are not part of a guild!";
SendSaveGuildEmblem(ERR_GUILDEMBLEM_NOGUILD);
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if (guild->GetLeader() != GetPlayer()->GetGUID())
{
//"Only guild leaders can create emblems."
SendSaveGuildEmblem(ERR_GUILDEMBLEM_NOTGUILDMASTER);
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if(GetPlayer()->GetMoney() < 10*GOLD)
{
//"You can't afford to do that."
SendSaveGuildEmblem(ERR_GUILDEMBLEM_NOTENOUGHMONEY);
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
GetPlayer()->ModifyMoney(-10*GOLD);
guild->SetEmblem(EmblemStyle, EmblemColor, BorderStyle, BorderColor, BackgroundColor);
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
//"Guild Emblem saved."
SendSaveGuildEmblem(ERR_GUILDEMBLEM_SUCCESS);
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
guild->Query(this);
}
2009-10-17 15:51:44 -07:00
2009-05-31 15:56:51 -05:00
void WorldSession::HandleGuildEventLogQueryOpcode(WorldPacket& /* recvPacket */)
2008-10-02 16:23:55 -05:00
{
// empty
sLog.outDebug("WORLD: Received (MSG_GUILD_EVENT_LOG_QUERY)");
2009-12-17 11:14:55 +01:00
if(uint32 GuildId = GetPlayer()->GetGuildId())
if(Guild *pGuild = objmgr.GetGuildById(GuildId))
pGuild->DisplayGuildEventLog(this);
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
/****** GUILD BANK *******/
2009-10-17 15:51:44 -07:00
2009-05-31 15:56:51 -05:00
void WorldSession::HandleGuildBankMoneyWithdrawn( WorldPacket & /* recv_data */ )
2008-10-02 16:23:55 -05:00
{
sLog.outDebug("WORLD: Received (MSG_GUILD_BANK_MONEY_WITHDRAWN)");
2009-12-17 11:14:55 +01:00
if(uint32 GuildId = GetPlayer()->GetGuildId())
if(Guild *pGuild = objmgr.GetGuildById(GuildId))
pGuild->SendMoneyInfo(this, GetPlayer()->GetGUIDLow());
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2009-05-31 15:56:51 -05:00
void WorldSession::HandleGuildPermissions( WorldPacket& /* recv_data */ )
2008-10-02 16:23:55 -05:00
{
sLog.outDebug("WORLD: Received (MSG_GUILD_PERMISSIONS)");
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
if(uint32 GuildId = GetPlayer()->GetGuildId())
2008-10-02 16:23:55 -05:00
{
2009-12-17 11:14:55 +01:00
if(Guild *pGuild = objmgr.GetGuildById(GuildId))
{
uint32 rankId = GetPlayer()->GetRank();
WorldPacket data(MSG_GUILD_PERMISSIONS, 4*15+1);
data << uint32(rankId); // guild rank id
data << uint32(pGuild->GetRankRights(rankId)); // rank rights
// money per day left
data << uint32(pGuild->GetMemberMoneyWithdrawRem(GetPlayer()->GetGUIDLow()));
data << uint8(pGuild->GetPurchasedTabs()); // tabs count
// why sending all info when not all tabs are purchased???
for (int i = 0; i < GUILD_BANK_MAX_TABS; ++i)
{
data << uint32(pGuild->GetBankRights(rankId, uint8(i)));
data << uint32(pGuild->GetMemberSlotWithdrawRem(GetPlayer()->GetGUIDLow(), uint8(i)));
}
SendPacket(&data);
sLog.outDebug("WORLD: Sent (MSG_GUILD_PERMISSIONS)");
}
2008-10-02 16:23:55 -05:00
}
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
/* Called when clicking on Guild bank gameobject */
2009-05-31 15:56:51 -05:00
void WorldSession::HandleGuildBankerActivate( WorldPacket & recv_data )
2008-10-02 16:23:55 -05:00
{
sLog.outDebug("WORLD: Received (CMSG_GUILD_BANKER_ACTIVATE)");
2009-12-17 11:14:55 +01:00
2008-10-02 16:23:55 -05:00
uint64 GoGuid;
uint8 unk;
recv_data >> GoGuid >> unk;
2009-10-17 15:51:44 -07:00
if (!GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid, GAMEOBJECT_TYPE_GUILD_BANK))
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if (uint32 GuildId = GetPlayer()->GetGuildId())
{
if(Guild *pGuild = objmgr.GetGuildById(GuildId))
{
2009-12-17 11:14:55 +01:00
pGuild->DisplayGuildBankTabsInfo(this); // this also will load guild bank if not yet
2008-10-02 16:23:55 -05:00
return;
}
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
SendGuildCommandResult(GUILD_BANK_S, "", GUILD_PLAYER_NOT_IN_GUILD);
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
/* Called when opening guild bank tab only (first one) */
2009-05-31 15:56:51 -05:00
void WorldSession::HandleGuildBankQueryTab( WorldPacket & recv_data )
2008-10-02 16:23:55 -05:00
{
sLog.outDebug("WORLD: Received (CMSG_GUILD_BANK_QUERY_TAB)");
2009-12-17 11:14:55 +01:00
2008-10-02 16:23:55 -05:00
uint64 GoGuid;
2009-12-17 11:14:55 +01:00
uint8 TabId, unk1;
2008-10-02 16:23:55 -05:00
recv_data >> GoGuid >> TabId >> unk1;
2009-10-17 15:51:44 -07:00
if (!GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid, GAMEOBJECT_TYPE_GUILD_BANK))
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
uint32 GuildId = GetPlayer()->GetGuildId();
2009-12-17 11:14:55 +01:00
if (!GuildId)
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
Guild *pGuild = objmgr.GetGuildById(GuildId);
2009-12-17 11:14:55 +01:00
if (!pGuild)
return;
if (!pGuild->IsGuildBankLoaded() || TabId >= pGuild->GetPurchasedTabs())
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// Let's update the amount of gold the player can withdraw before displaying the content
2009-12-17 11:14:55 +01:00
// This is useful if money withdraw right has changed
2008-10-02 16:23:55 -05:00
pGuild->SendMoneyInfo(this, GetPlayer()->GetGUIDLow());
pGuild->DisplayGuildBankContent(this, TabId);
}
2009-10-17 15:51:44 -07:00
2009-05-31 15:56:51 -05:00
void WorldSession::HandleGuildBankDepositMoney( WorldPacket & recv_data )
2008-10-02 16:23:55 -05:00
{
sLog.outDebug("WORLD: Received (CMSG_GUILD_BANK_DEPOSIT_MONEY)");
2009-12-17 11:14:55 +01:00
2008-10-02 16:23:55 -05:00
uint64 GoGuid;
uint32 money;
recv_data >> GoGuid >> money;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if (!money)
return;
2009-10-17 15:51:44 -07:00
if (!GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid, GAMEOBJECT_TYPE_GUILD_BANK))
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
if (GetPlayer()->GetMoney() < money)
return;
2008-10-02 16:23:55 -05:00
uint32 GuildId = GetPlayer()->GetGuildId();
2009-12-17 11:14:55 +01:00
if (!GuildId)
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
Guild *pGuild = objmgr.GetGuildById(GuildId);
2009-12-17 11:14:55 +01:00
if (!pGuild)
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
if (!pGuild->IsGuildBankLoaded() || !pGuild->GetPurchasedTabs())
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
CharacterDatabase.BeginTransaction();
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
pGuild->SetBankMoney(pGuild->GetGuildBankMoney()+money);
GetPlayer()->ModifyMoney(-int(money));
2009-06-27 17:39:51 -05:00
GetPlayer()->SaveGoldToDB();
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
CharacterDatabase.CommitTransaction();
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// logging money
if(_player->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE))
{
2008-11-25 16:36:50 -06:00
sLog.outCommand(_player->GetSession()->GetAccountId(),"GM %s (Account: %u) deposit money (Amount: %u) to guild bank (Guild ID %u)",
2008-10-02 16:23:55 -05:00
_player->GetName(),_player->GetSession()->GetAccountId(),money,GuildId);
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// log
pGuild->LogBankEvent(GUILD_BANK_LOG_DEPOSIT_MONEY, uint8(0), GetPlayer()->GetGUIDLow(), money);
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
pGuild->DisplayGuildBankTabsInfo(this);
pGuild->DisplayGuildBankContent(this, 0);
2009-12-17 11:14:55 +01:00
pGuild->DisplayGuildBankMoneyUpdate();
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2009-05-31 15:56:51 -05:00
void WorldSession::HandleGuildBankWithdrawMoney( WorldPacket & recv_data )
2008-10-02 16:23:55 -05:00
{
sLog.outDebug("WORLD: Received (CMSG_GUILD_BANK_WITHDRAW_MONEY)");
2009-12-17 11:14:55 +01:00
2008-10-02 16:23:55 -05:00
uint64 GoGuid;
uint32 money;
recv_data >> GoGuid >> money;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if (!money)
return;
2009-10-17 15:51:44 -07:00
if (!GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid, GAMEOBJECT_TYPE_GUILD_BANK))
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
uint32 GuildId = GetPlayer()->GetGuildId();
if (GuildId == 0)
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
Guild *pGuild = objmgr.GetGuildById(GuildId);
if(!pGuild)
return;
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
if (!pGuild->IsGuildBankLoaded() || !pGuild->GetPurchasedTabs())
return;
2008-10-02 16:23:55 -05:00
if (pGuild->GetGuildBankMoney()<money) // not enough money in bank
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if (!pGuild->HasRankRight(GetPlayer()->GetRank(), GR_RIGHT_WITHDRAW_GOLD))
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
CharacterDatabase.BeginTransaction();
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if (!pGuild->MemberMoneyWithdraw(money, GetPlayer()->GetGUIDLow()))
{
CharacterDatabase.RollbackTransaction();
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
GetPlayer()->ModifyMoney(money);
2009-06-27 17:39:51 -05:00
GetPlayer()->SaveGoldToDB();
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
CharacterDatabase.CommitTransaction();
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// Log
pGuild->LogBankEvent(GUILD_BANK_LOG_WITHDRAW_MONEY, uint8(0), GetPlayer()->GetGUIDLow(), money);
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
pGuild->SendMoneyInfo(this, GetPlayer()->GetGUIDLow());
pGuild->DisplayGuildBankTabsInfo(this);
pGuild->DisplayGuildBankContent(this,0);
2009-12-17 11:14:55 +01:00
pGuild->DisplayGuildBankMoneyUpdate();
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2009-05-31 15:56:51 -05:00
void WorldSession::HandleGuildBankSwapItems( WorldPacket & recv_data )
2008-10-02 16:23:55 -05:00
{
sLog.outDebug("WORLD: Received (CMSG_GUILD_BANK_SWAP_ITEMS)");
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
uint64 GoGuid;
uint8 BankToBank;
2009-10-17 15:51:44 -07:00
uint8 BankTab, BankTabSlot, AutoStore;
uint8 PlayerSlot = NULL_SLOT;
uint8 PlayerBag = NULL_BAG;
uint8 BankTabDst, BankTabSlotDst, unk2;
uint8 ToChar = 1;
2008-10-02 16:23:55 -05:00
uint32 ItemEntry, unk1;
uint32 AutoStoreCount = 0;
uint32 SplitedAmount = 0;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
recv_data >> GoGuid >> BankToBank;
2009-12-17 11:14:55 +01:00
uint32 GuildId = GetPlayer()->GetGuildId();
if (!GuildId)
{
recv_data.rpos(recv_data.wpos()); // prevent additional spam at rejected packet
return;
}
Guild *pGuild = objmgr.GetGuildById(GuildId);
if (!pGuild || !pGuild->IsGuildBankLoaded())
{
recv_data.rpos(recv_data.wpos()); // prevent additional spam at rejected packet
return;
}
2008-10-02 16:23:55 -05:00
if (BankToBank)
{
recv_data >> BankTabDst;
recv_data >> BankTabSlotDst;
recv_data >> unk1; // always 0
recv_data >> BankTab;
recv_data >> BankTabSlot;
recv_data >> ItemEntry;
recv_data >> unk2; // always 0
recv_data >> SplitedAmount;
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
if (BankTabSlotDst >= GUILD_BANK_MAX_SLOTS ||
(BankTabDst == BankTab && BankTabSlotDst == BankTabSlot) ||
BankTab >= pGuild->GetPurchasedTabs() ||
BankTabDst >= pGuild->GetPurchasedTabs())
{
recv_data.rpos(recv_data.wpos()); // prevent additional spam at rejected packet
2008-10-02 16:23:55 -05:00
return;
}
2008-10-02 16:23:55 -05:00
}
else
{
recv_data >> BankTab;
recv_data >> BankTabSlot;
recv_data >> ItemEntry;
recv_data >> AutoStore;
if (AutoStore)
{
recv_data >> AutoStoreCount;
recv_data.read_skip<uint8>(); // ToChar (?), always and expected to be 1 (autostore only triggered in guild->ToChar)
recv_data.read_skip<uint32>(); // unknown, always 0
2008-10-02 16:23:55 -05:00
}
else
2008-10-02 16:23:55 -05:00
{
recv_data >> PlayerBag;
recv_data >> PlayerSlot;
2008-10-02 16:23:55 -05:00
recv_data >> ToChar;
recv_data >> SplitedAmount;
}
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
if (BankTabSlot >= GUILD_BANK_MAX_SLOTS && BankTabSlot != 0xFF ||
BankTab >= pGuild->GetPurchasedTabs())
{
recv_data.rpos(recv_data.wpos()); // prevent additional spam at rejected packet
2008-10-02 16:23:55 -05:00
return;
}
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
if (!GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid, GAMEOBJECT_TYPE_GUILD_BANK))
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
if (BankTab >= pGuild->GetPurchasedTabs())
return;
2008-10-02 16:23:55 -05:00
// Bank <-> Bank
if (BankToBank)
{
2009-12-17 11:14:55 +01:00
pGuild->SwapItems(_player, BankTab, BankTabSlot, BankTabDst, BankTabSlotDst, SplitedAmount);
2008-10-02 16:23:55 -05:00
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// Player <-> Bank
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// allow work with inventory only
2009-12-17 11:14:55 +01:00
if(!Player::IsInventoryPos(PlayerBag, PlayerSlot) && !(PlayerBag == NULL_BAG && PlayerSlot == NULL_SLOT) )
2008-10-02 16:23:55 -05:00
{
_player->SendEquipError( EQUIP_ERR_NONE, NULL, NULL );
return;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// BankToChar swap or char to bank remaining
if (ToChar) // Bank -> Char cases
2009-12-17 11:14:55 +01:00
pGuild->MoveFromBankToChar(_player, BankTab, BankTabSlot, PlayerBag, PlayerSlot, SplitedAmount);
else // Char -> Bank cases
2009-12-17 11:14:55 +01:00
pGuild->MoveFromCharToBank(_player, PlayerBag, PlayerSlot, BankTab, BankTabSlot, SplitedAmount);
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void WorldSession::HandleGuildBankBuyTab( WorldPacket & recv_data )
{
sLog.outDebug("WORLD: Received (CMSG_GUILD_BANK_BUY_TAB)");
2009-12-17 11:14:55 +01:00
2008-10-02 16:23:55 -05:00
uint64 GoGuid;
uint8 TabId;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
recv_data >> GoGuid;
recv_data >> TabId;
2009-10-17 15:51:44 -07:00
if (!GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid, GAMEOBJECT_TYPE_GUILD_BANK))
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
uint32 GuildId = GetPlayer()->GetGuildId();
2009-12-17 11:14:55 +01:00
if (!GuildId)
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
Guild *pGuild = objmgr.GetGuildById(GuildId);
if(!pGuild)
return;
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
// m_PurchasedTabs = 0 when buying Tab 0, that is why this check can be made
if (!pGuild->IsGuildBankLoaded() || TabId != pGuild->GetPurchasedTabs())
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
uint32 TabCost = GetGuildBankTabPrice(TabId) * GOLD;
if (!TabCost)
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if (GetPlayer()->GetMoney() < TabCost) // Should not happen, this is checked by client
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// Go on with creating tab
pGuild->CreateNewBankTab();
GetPlayer()->ModifyMoney(-int(TabCost));
pGuild->SetBankMoneyPerDay(GetPlayer()->GetRank(), WITHDRAW_MONEY_UNLIMITED);
pGuild->SetBankRightsAndSlots(GetPlayer()->GetRank(), TabId, GUILD_BANK_RIGHT_FULL, WITHDRAW_SLOT_UNLIMITED, true);
pGuild->Roster(); // broadcast for tab rights update
2008-10-02 16:23:55 -05:00
pGuild->DisplayGuildBankTabsInfo(this);
}
2009-10-17 15:51:44 -07:00
2009-05-31 15:56:51 -05:00
void WorldSession::HandleGuildBankUpdateTab( WorldPacket & recv_data )
2008-10-02 16:23:55 -05:00
{
sLog.outDebug("WORLD: Received (CMSG_GUILD_BANK_UPDATE_TAB)");
2009-12-17 11:14:55 +01:00
2008-10-02 16:23:55 -05:00
uint64 GoGuid;
uint8 TabId;
std::string Name;
std::string IconIndex;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
recv_data >> GoGuid;
recv_data >> TabId;
recv_data >> Name;
recv_data >> IconIndex;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if(Name.empty())
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if(IconIndex.empty())
return;
2009-10-17 15:51:44 -07:00
if (!GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid, GAMEOBJECT_TYPE_GUILD_BANK))
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
uint32 GuildId = GetPlayer()->GetGuildId();
2009-12-17 11:14:55 +01:00
if (!GuildId)
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
Guild *pGuild = objmgr.GetGuildById(GuildId);
2009-12-17 11:14:55 +01:00
if (!pGuild)
return;
if (!pGuild->IsGuildBankLoaded() || TabId >= pGuild->GetPurchasedTabs())
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
pGuild->SetGuildBankTabInfo(TabId, Name, IconIndex);
pGuild->DisplayGuildBankTabsInfo(this);
pGuild->DisplayGuildBankContent(this, TabId);
}
2009-10-17 15:51:44 -07:00
2009-05-31 15:56:51 -05:00
void WorldSession::HandleGuildBankLogQuery( WorldPacket & recv_data )
2008-10-02 16:23:55 -05:00
{
sLog.outDebug("WORLD: Received (MSG_GUILD_BANK_LOG_QUERY)");
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
uint8 TabId;
recv_data >> TabId;
2008-10-02 16:23:55 -05:00
uint32 GuildId = GetPlayer()->GetGuildId();
2009-12-17 11:14:55 +01:00
if (!GuildId)
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
Guild *pGuild = objmgr.GetGuildById(GuildId);
2009-12-17 11:14:55 +01:00
if (!pGuild)
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
if (!pGuild->IsGuildBankLoaded())
return;
// GUILD_BANK_MAX_TABS send by client for money log
if (TabId >= pGuild->GetPurchasedTabs() && TabId != GUILD_BANK_MAX_TABS)
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
pGuild->DisplayGuildBankLogs(this, TabId);
}
2009-10-17 15:51:44 -07:00
2009-05-31 15:56:51 -05:00
void WorldSession::HandleQueryGuildBankTabText(WorldPacket &recv_data)
2008-10-02 16:23:55 -05:00
{
sLog.outDebug("WORLD: Received MSG_QUERY_GUILD_BANK_TEXT");
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
uint8 TabId;
recv_data >> TabId;
2008-10-02 16:23:55 -05:00
uint32 GuildId = GetPlayer()->GetGuildId();
2009-12-17 11:14:55 +01:00
if (!GuildId)
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
Guild *pGuild = objmgr.GetGuildById(GuildId);
2009-12-17 11:14:55 +01:00
if (!pGuild)
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
if (!pGuild->IsGuildBankLoaded() || TabId >= pGuild->GetPurchasedTabs())
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
pGuild->SendGuildBankTabText(this, TabId);
}
2009-10-17 15:51:44 -07:00
2009-05-31 15:56:51 -05:00
void WorldSession::HandleSetGuildBankTabText(WorldPacket &recv_data)
2008-10-02 16:23:55 -05:00
{
sLog.outDebug("WORLD: Received CMSG_SET_GUILD_BANK_TEXT");
2009-12-17 11:14:55 +01:00
uint8 TabId;
std::string Text;
recv_data >> TabId;
recv_data >> Text;
2008-10-02 16:23:55 -05:00
uint32 GuildId = GetPlayer()->GetGuildId();
2009-12-17 11:14:55 +01:00
if (!GuildId)
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
Guild *pGuild = objmgr.GetGuildById(GuildId);
2009-12-17 11:14:55 +01:00
if (!pGuild)
2008-10-02 16:23:55 -05:00
return;
2009-10-17 15:51:44 -07:00
2009-12-17 11:14:55 +01:00
if (!pGuild->IsGuildBankLoaded() || TabId >= pGuild->GetPurchasedTabs())
return;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
pGuild->SetGuildBankTabText(TabId, Text);
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
void WorldSession::SendSaveGuildEmblem( uint32 msg )
{
WorldPacket data(MSG_SAVE_GUILD_EMBLEM, 4);
data << uint32(msg); // not part of guild
SendPacket( &data );
}