/*
* Ascent MMORPG Server
* Copyright (C) 2005-2007 Ascent Team
*
* 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 3 of the License, or
* 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 .
*
*/
#include "StdAfx.h"
//////////////////////////////////////////////////////////////
/// This function handles CMSG_GROUP_INVITE
//////////////////////////////////////////////////////////////
void WorldSession::HandleGroupInviteOpcode( WorldPacket & recv_data )
{
if(!_player->IsInWorld()) return;
CHECK_PACKET_SIZE(recv_data, 1);
WorldPacket data(100);
std::string membername;
Player * player = NULL;
Group *group = NULL;
recv_data >> membername;
if(_player->HasBeenInvited())return;
player = objmgr.GetPlayer(membername.c_str(), false);
if ( player == NULL)
{
SendPartyCommandResult(_player, 0, membername, ERR_PARTY_CANNOT_FIND);
return;
}
if (player == _player)
{
return;
}
if ( _player->InGroup() && !_player->IsGroupLeader() )
{
SendPartyCommandResult(_player, 0, "", ERR_PARTY_YOU_ARE_NOT_LEADER);
return;
}
group = _player->GetGroup();
if ( group != NULL )
{
if (group->IsFull())
{
SendPartyCommandResult(_player, 0, "", ERR_PARTY_IS_FULL);
return;
}
}
if ( player->InGroup() )
{
SendPartyCommandResult(_player, player->GetGroup()->GetGroupType(), membername, ERR_PARTY_ALREADY_IN_GROUP);
return;
}
if(player->GetTeam()!=_player->GetTeam() && _player->GetSession()->GetPermissionCount() == 0)
{
SendPartyCommandResult(_player, 0, membername, ERR_PARTY_WRONG_FACTION);
return;
}
if ( player->HasBeenInvited() )
{
SendPartyCommandResult(_player, 0, membername, ERR_PARTY_ALREADY_IN_GROUP);
return;
}
if(sSocialMgr.HasIgnore(player, _player))
{
SendPartyCommandResult(_player, 0, membername, ERR_PARTY_IS_IGNORING_YOU);
return;
}
// 16/08/06 - change to guid to prevent very unlikely event of a crash in deny, etc
_player->SetInviter(_player->GetGUID());//bugfix if player invtied 2 people-> he can be in 2 parties
data.SetOpcode(SMSG_GROUP_INVITE);
data << GetPlayer()->GetName();
player->GetSession()->SendPacket(&data);
uint32 gtype = 0;
if(group)
gtype = group->GetGroupType();
SendPartyCommandResult(_player, gtype, membername, ERR_PARTY_NO_ERROR);
// 16/08/06 - change to guid to prevent very unlikely event of a crash in deny, etc
player->SetInviter(_player->GetGUID());
}
///////////////////////////////////////////////////////////////
///This function handles CMSG_GROUP_CANCEL:
///////////////////////////////////////////////////////////////
void WorldSession::HandleGroupCancelOpcode( WorldPacket & recv_data )
{
if(!_player->IsInWorld()) return;
sLog.outDebug( "WORLD: got CMSG_GROUP_CANCEL." );
}
////////////////////////////////////////////////////////////////
///This function handles CMSG_GROUP_ACCEPT:
////////////////////////////////////////////////////////////////
void WorldSession::HandleGroupAcceptOpcode( WorldPacket & recv_data )
{
if(!_player->IsInWorld()) return;
Player *player = objmgr.GetPlayer(_player->GetInviter());
if ( !player )
return;
player->SetInviter(0);
_player->SetInviter(0);
Group *grp = player->GetGroup();
if(grp)
{
grp->AddMember(_player->m_playerInfo, _player);
_player->iInstanceType = grp->GetLeader()->iInstanceType;
_player->GetSession()->OutPacket(CMSG_DUNGEON_DIFFICULTY, 4, &grp->GetLeader()->iInstanceType);
sInstanceSavingManager.ResetSavedInstancesForPlayer(_player);
return;
}
// If we're this far, it means we have no existing group, and have to make one.
grp = new Group;
grp->AddMember(player->m_playerInfo, player); // add the inviter first, therefore he is the leader
grp->AddMember(_player->m_playerInfo, _player); // add us.
_player->iInstanceType = player->iInstanceType;
_player->GetSession()->OutPacket(CMSG_DUNGEON_DIFFICULTY, 4, &player->iInstanceType);
sInstanceSavingManager.ResetSavedInstancesForPlayer(_player);
// Currentgroup and all that shit are set by addmember.
}
///////////////////////////////////////////////////////////////////////////////////////
///This function handles CMSG_GROUP_DECLINE:
//////////////////////////////////////////////////////////////////////////////////////
void WorldSession::HandleGroupDeclineOpcode( WorldPacket & recv_data )
{
if(!_player->IsInWorld()) return;
WorldPacket data(SMSG_GROUP_DECLINE, 100);
Player *player = objmgr.GetPlayer(_player->GetInviter());
if(!player) return;
data << GetPlayer()->GetName();
player->GetSession()->SendPacket( &data );
player->SetInviter(0);
_player->SetInviter(0);
}
//////////////////////////////////////////////////////////////////////////////////////////
///This function handles CMSG_GROUP_UNINVITE:
//////////////////////////////////////////////////////////////////////////////////////////
void WorldSession::HandleGroupUninviteOpcode( WorldPacket & recv_data )
{
if(!_player->IsInWorld()) return;
CHECK_PACKET_SIZE(recv_data, 1);
std::string membername;
Group *group;
Player * player;
PlayerInfo * info;
recv_data >> membername;
player = objmgr.GetPlayer(membername.c_str(), false);
info = objmgr.GetPlayerInfoByName(membername);
if ( player == NULL && info == NULL )
{
SendPartyCommandResult(_player, 0, membername, ERR_PARTY_CANNOT_FIND);
return;
}
if ( !_player->InGroup() || info->m_Group != _player->GetGroup() )
{
SendPartyCommandResult(_player, 0, membername, ERR_PARTY_IS_NOT_IN_YOUR_PARTY);
return;
}
if ( !_player->IsGroupLeader() )
{
if(_player != player)
{
SendPartyCommandResult(_player, 0, "", ERR_PARTY_YOU_ARE_NOT_LEADER);
return;
}
}
group = _player->GetGroup();
if(group)
group->RemovePlayer(info, player, true);
}
//////////////////////////////////////////////////////////////////////////////////////////
///This function handles CMSG_GROUP_UNINVITE_GUID:
//////////////////////////////////////////////////////////////////////////////////////////
void WorldSession::HandleGroupUninviteGuildOpcode( WorldPacket & recv_data )
{
sLog.outDebug( "WORLD: got CMSG_GROUP_UNINVITE_GUID." );
}
//////////////////////////////////////////////////////////////////////////////////////////
///This function handles CMSG_GROUP_SET_LEADER:
//////////////////////////////////////////////////////////////////////////////////////////
void WorldSession::HandleGroupSetLeaderOpcode( WorldPacket & recv_data )
{
if(!_player->IsInWorld()) return;
// important note _player->GetName() can be wrong.
CHECK_PACKET_SIZE(recv_data, 1);
WorldPacket data;
uint64 MemberGuid;
Player * player;
recv_data >> MemberGuid;
player = objmgr.GetPlayer(MemberGuid);
if ( player == NULL )
{
//SendPartyCommandResult(_player, 0, membername, ERR_PARTY_CANNOT_FIND);
SendPartyCommandResult(_player, 0, _player->GetName(), ERR_PARTY_CANNOT_FIND);
return;
}
if(!_player->IsGroupLeader())
{
SendPartyCommandResult(_player, 0, "", ERR_PARTY_YOU_ARE_NOT_LEADER);
return;
}
if(player->GetGroup() != _player->GetGroup())
{
//SendPartyCommandResult(_player, 0, membername, ERR_PARTY_IS_NOT_IN_YOUR_PARTY);
SendPartyCommandResult(_player, 0, _player->GetName(), ERR_PARTY_IS_NOT_IN_YOUR_PARTY);
return;
}
Group *pGroup = _player->GetGroup();
if(pGroup)
pGroup->SetLeader(player,false);
}
//////////////////////////////////////////////////////////////////////////////////////////
///This function handles CMSG_GROUP_DISBAND:
//////////////////////////////////////////////////////////////////////////////////////////
void WorldSession::HandleGroupDisbandOpcode( WorldPacket & recv_data )
{
if(!_player->IsInWorld()) return;
Group* pGroup = _player->GetGroup();
if(!pGroup) return;
pGroup->RemovePlayer(_player->m_playerInfo, _player, true);
}
//////////////////////////////////////////////////////////////////////////////////////////
///This function handles CMSG_LOOT_METHOD:
//////////////////////////////////////////////////////////////////////////////////////////
void WorldSession::HandleLootMethodOpcode( WorldPacket & recv_data )
{
if(!_player->IsInWorld()) return;
CHECK_PACKET_SIZE(recv_data, 16);
uint32 lootMethod;
uint64 lootMaster;
uint32 threshold;
recv_data >> lootMethod >> lootMaster >>threshold;
if(!_player->IsGroupLeader())
{
SendPartyCommandResult(_player, 0, "", ERR_PARTY_YOU_ARE_NOT_LEADER);
return;
}
Player *plyr = objmgr.GetPlayer(lootMaster);
//if(!plyr)return;
Group *pGroup = _player->GetGroup();
if(pGroup)
pGroup->SetLooter(plyr, lootMethod, threshold);
}
void WorldSession::HandleMinimapPingOpcode( WorldPacket & recv_data )
{
if(!_player->IsInWorld()) return;
CHECK_PACKET_SIZE(recv_data, 8);
if(!_player->InGroup())
return;
Group * party= _player->GetGroup();
if(!party)return;
float x,y;
recv_data >> x >>y;
WorldPacket data;
data.SetOpcode(MSG_MINIMAP_PING);
data << _player->GetGUID();
data << x << y;
party->SendPacketToAllButOne(&data, _player);
}
void WorldSession::HandleSetPlayerIconOpcode(WorldPacket& recv_data)
{
uint64 guid;
uint8 icon;
Group * pGroup = _player->GetGroup();
if(!_player->IsInWorld() || !pGroup) return;
recv_data >> icon;
if(icon == 0xFF)
{
// client request
WorldPacket data(MSG_GROUP_SET_PLAYER_ICON, 73);
data << uint8(1);
for(uint8 i = 0; i < 8; ++i)
data << i << pGroup->m_targetIcons[i];
SendPacket(&data);
}
else if(_player->IsGroupLeader())
{
recv_data >> guid;
if(icon > 7)
return; // whhopes,buffer overflow :p
// setting icon
WorldPacket data(MSG_GROUP_SET_PLAYER_ICON, 10);
data << uint8(0) << icon << guid;
pGroup->SendPacketToAll(&data);
pGroup->m_targetIcons[icon] = guid;
}
}
void WorldSession::SendPartyCommandResult(Player *pPlayer, uint32 p1, std::string name, uint32 err)
{
if(!_player->IsInWorld()) return;
// if error message do not work, please sniff it and leave me a message
if(pPlayer)
{
WorldPacket data;
data.Initialize(SMSG_PARTY_COMMAND_RESULT);
data << p1;
if(!name.length())
data << uint8(0);
else
data << name.c_str();
data << err;
pPlayer->GetSession()->SendPacket(&data);
}
}