diff options
Diffstat (limited to 'src/game/GroupHandler.cpp')
-rw-r--r-- | src/game/GroupHandler.cpp | 88 |
1 files changed, 42 insertions, 46 deletions
diff --git a/src/game/GroupHandler.cpp b/src/game/GroupHandler.cpp index 5f384aa1d8d..3890a9f77a6 100644 --- a/src/game/GroupHandler.cpp +++ b/src/game/GroupHandler.cpp @@ -44,7 +44,7 @@ -FIX sending PartyMemberStats */ -void WorldSession::SendPartyResult(PartyOperation operation, std::string member, PartyResult res) +void WorldSession::SendPartyResult(PartyOperation operation, const std::string& member, PartyResult res) { WorldPacket data(SMSG_PARTY_COMMAND_RESULT, (8+member.size()+1)); data << (uint32)operation; @@ -254,85 +254,81 @@ void WorldSession::HandleGroupUninviteGuidOpcode(WorldPacket & recv_data) uint64 guid; recv_data >> guid; - if(_player->InBattleGround()) + //can't uninvite yourself + if(guid == GetPlayer()->GetGUID()) { - SendPartyResult(PARTY_OP_INVITE, "", PARTY_RESULT_INVITE_RESTRICTED); + sLog.outError("WorldSession::HandleGroupUninviteGuidOpcode: leader %s(%d) tried to uninvite himself from the group.", GetPlayer()->GetName(), GetPlayer()->GetGUIDLow()); return; } - std::string membername; - if(!objmgr.GetPlayerNameByGUID(guid, membername)) - return; // not found - - HandleGroupUninvite(guid, membername); -} - -void WorldSession::HandleGroupUninviteNameOpcode(WorldPacket & recv_data) -{ - CHECK_PACKET_SIZE(recv_data,1); - - std::string membername; - recv_data >> membername; - - if(_player->InBattleGround()) + PartyResult res = GetPlayer()->CanUninviteFromGroup(); + if(res != PARTY_RESULT_OK) { - SendPartyResult(PARTY_OP_INVITE, membername, PARTY_RESULT_INVITE_RESTRICTED); + SendPartyResult(PARTY_OP_LEAVE, "", res); return; } - // player not found - if(!normalizePlayerName(membername)) + Group* grp = GetPlayer()->GetGroup(); + if(!grp) return; - uint64 guid = objmgr.GetPlayerGUIDByName(membername); + if(grp->IsMember(guid)) + { + Player::RemoveFromGroup(grp,guid); + return; + } - // player not found - if(!guid) + if(Player* plr = grp->GetInvited(guid)) + { + plr->UninviteFromGroup(); return; + } - HandleGroupUninvite(guid, membername); + SendPartyResult(PARTY_OP_LEAVE, "", PARTY_RESULT_NOT_IN_YOUR_PARTY); } -void WorldSession::HandleGroupUninvite(uint64 guid, std::string name) +void WorldSession::HandleGroupUninviteNameOpcode(WorldPacket & recv_data) { - Group *group = GetPlayer()->GetGroup(); - if(!group) + CHECK_PACKET_SIZE(recv_data,1); + + std::string membername; + recv_data >> membername; + + // player not found + if(!normalizePlayerName(membername)) return; - if(_player->InBattleGround()) + // can't uninvite yourself + if(GetPlayer()->GetName() == membername) { - SendPartyResult(PARTY_OP_INVITE, "", PARTY_RESULT_INVITE_RESTRICTED); + sLog.outError("WorldSession::HandleGroupUninviteNameOpcode: leader %s(%d) tried to uninvite himself from the group.", GetPlayer()->GetName(), GetPlayer()->GetGUIDLow()); return; } - Player *player = objmgr.GetPlayer(guid); - - /** error handling **/ - if(!group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID())) + PartyResult res = GetPlayer()->CanUninviteFromGroup(); + if(res != PARTY_RESULT_OK) { - SendPartyResult(PARTY_OP_LEAVE, "", PARTY_RESULT_YOU_NOT_LEADER); + SendPartyResult(PARTY_OP_LEAVE, "", res); return; } - if(!group->IsMember(guid) && (player && player->GetGroupInvite() != group)) + Group* grp = GetPlayer()->GetGroup(); + if(!grp) + return; + + if(uint64 guid = grp->GetMemberGUID(membername)) { - SendPartyResult(PARTY_OP_LEAVE, name, PARTY_RESULT_NOT_IN_YOUR_PARTY); + Player::RemoveFromGroup(grp,guid); return; } - if(guid == GetPlayer()->GetGUID()) + if(Player* plr = grp->GetInvited(membername)) { - sLog.outError("WorldSession::HandleGroupUninvite: leader %s(%d) tried to uninvite himself from the group.", GetPlayer()->GetName(), GetPlayer()->GetGUIDLow()); + plr->UninviteFromGroup(); return; } - /********************/ - - // everything's fine, do it - if(player && player->GetGroupInvite()) // uninvite invitee - player->UninviteFromGroup(); - else // uninvite member - Player::RemoveFromGroup(group,guid); + SendPartyResult(PARTY_OP_LEAVE, membername, PARTY_RESULT_NOT_IN_YOUR_PARTY); } void WorldSession::HandleGroupSetLeaderOpcode( WorldPacket & recv_data ) |