Kitzunu
2023-11-26 20:34:45 +01:00
committed by GitHub
parent 911f07c906
commit f440a7479f
3 changed files with 51 additions and 48 deletions
+5 -3
View File
@@ -2298,7 +2298,6 @@ bool Player::IsInSameGroupWith(Player const* p) const
} }
///- If the player is invited, remove him. If the group if then only 1 person, disband the group. ///- If the player is invited, remove him. If the group if then only 1 person, disband the group.
/// \todo Shouldn't we also check if there is no other invitees before disbanding the group?
void Player::UninviteFromGroup() void Player::UninviteFromGroup()
{ {
Group* group = GetGroupInvite(); Group* group = GetGroupInvite();
@@ -2307,14 +2306,17 @@ void Player::UninviteFromGroup()
group->RemoveInvite(this); group->RemoveInvite(this);
if (group->GetMembersCount() <= 1) // group has just 1 member => disband
{
if (group->IsCreated()) if (group->IsCreated())
{
if (group->GetMembersCount() <= 1) // group has just 1 member => disband
{ {
group->Disband(true); group->Disband(true);
group = nullptr; // gets deleted in disband group = nullptr; // gets deleted in disband
} }
}
else else
{
if (group->GetInviteeCount() <= 1)
{ {
group->RemoveAllInvites(); group->RemoveAllInvites();
delete group; delete group;
+1
View File
@@ -243,6 +243,7 @@ public:
GroupReference* GetFirstMember() { return m_memberMgr.getFirst(); } GroupReference* GetFirstMember() { return m_memberMgr.getFirst(); }
GroupReference const* GetFirstMember() const { return m_memberMgr.getFirst(); } GroupReference const* GetFirstMember() const { return m_memberMgr.getFirst(); }
uint32 GetMembersCount() const { return m_memberSlots.size(); } uint32 GetMembersCount() const { return m_memberSlots.size(); }
uint32 GetInviteeCount() const { return m_invitees.size(); }
uint8 GetMemberGroup(ObjectGuid guid) const; uint8 GetMemberGroup(ObjectGuid guid) const;
+42 -42
View File
@@ -73,81 +73,73 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData)
return; return;
} }
Player* player = ObjectAccessor::FindPlayerByName(membername, false); Player* invitingPlayer = GetPlayer();
Player* invitedPlayer = ObjectAccessor::FindPlayerByName(membername, false);
// no player or cheat self-invite // no player or cheat self-invite
if (!player || player == GetPlayer()) if (!invitedPlayer || invitedPlayer == invitingPlayer)
{ {
SendPartyResult(PARTY_OP_INVITE, membername, ERR_BAD_PLAYER_NAME_S); SendPartyResult(PARTY_OP_INVITE, membername, ERR_BAD_PLAYER_NAME_S);
return; return;
} }
if (!sScriptMgr->CanGroupInvite(GetPlayer(), membername)) if (!sScriptMgr->CanGroupInvite(invitingPlayer, membername))
return; return;
if (GetPlayer()->IsSpectator() || player->IsSpectator()) if (invitingPlayer->IsSpectator() || invitedPlayer->IsSpectator())
{ {
SendPartyResult(PARTY_OP_INVITE, membername, ERR_INVITE_RESTRICTED); SendPartyResult(PARTY_OP_INVITE, membername, ERR_INVITE_RESTRICTED);
return; return;
} }
// restrict invite to GMs // restrict invite to GMs
if (!sWorld->getBoolConfig(CONFIG_ALLOW_GM_GROUP) && !GetPlayer()->IsGameMaster() && player->IsGameMaster()) if (!sWorld->getBoolConfig(CONFIG_ALLOW_GM_GROUP) && !invitingPlayer->IsGameMaster() && invitedPlayer->IsGameMaster())
{ {
SendPartyResult(PARTY_OP_INVITE, membername, ERR_BAD_PLAYER_NAME_S); SendPartyResult(PARTY_OP_INVITE, membername, ERR_BAD_PLAYER_NAME_S);
return; return;
} }
// can't group with // can't group with
if (!GetPlayer()->IsGameMaster() && !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && GetPlayer()->GetTeamId() != player->GetTeamId()) if (!invitingPlayer->IsGameMaster() && !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && invitingPlayer->GetTeamId() != invitedPlayer->GetTeamId())
{ {
SendPartyResult(PARTY_OP_INVITE, membername, ERR_PLAYER_WRONG_FACTION); SendPartyResult(PARTY_OP_INVITE, membername, ERR_PLAYER_WRONG_FACTION);
return; return;
} }
if (GetPlayer()->GetInstanceId() != 0 && player->GetInstanceId() != 0 && GetPlayer()->GetInstanceId() != player->GetInstanceId() && GetPlayer()->GetMapId() == player->GetMapId()) if (invitingPlayer->GetInstanceId() != 0 && invitedPlayer->GetInstanceId() != 0 && invitingPlayer->GetInstanceId() != invitedPlayer->GetInstanceId() && invitingPlayer->GetMapId() == invitedPlayer->GetMapId())
{ {
SendPartyResult(PARTY_OP_INVITE, membername, ERR_TARGET_NOT_IN_INSTANCE_S); SendPartyResult(PARTY_OP_INVITE, membername, ERR_TARGET_NOT_IN_INSTANCE_S);
return; return;
} }
// just ignore us // just ignore us
if (player->GetInstanceId() != 0 && player->GetDungeonDifficulty() != GetPlayer()->GetDungeonDifficulty()) if (invitedPlayer->GetInstanceId() != 0 && invitedPlayer->GetDungeonDifficulty() != invitingPlayer->GetDungeonDifficulty())
{ {
SendPartyResult(PARTY_OP_INVITE, membername, ERR_IGNORING_YOU_S); SendPartyResult(PARTY_OP_INVITE, membername, ERR_IGNORING_YOU_S);
return; return;
} }
if (player->GetSocial()->HasIgnore(GetPlayer()->GetGUID())) if (invitedPlayer->GetSocial()->HasIgnore(invitingPlayer->GetGUID()))
{ {
SendPartyResult(PARTY_OP_INVITE, membername, ERR_IGNORING_YOU_S); SendPartyResult(PARTY_OP_INVITE, membername, ERR_IGNORING_YOU_S);
return; return;
} }
if (!player->GetSocial()->HasFriend(GetPlayer()->GetGUID()) && GetPlayer()->GetLevel() < sWorld->getIntConfig(CONFIG_PARTY_LEVEL_REQ)) if (!invitedPlayer->GetSocial()->HasFriend(invitingPlayer->GetGUID()) && invitingPlayer->GetLevel() < sWorld->getIntConfig(CONFIG_PARTY_LEVEL_REQ))
{ {
SendPartyResult(PARTY_OP_INVITE, player->GetName(), ERR_INVITE_RESTRICTED); SendPartyResult(PARTY_OP_INVITE, invitedPlayer->GetName(), ERR_INVITE_RESTRICTED);
return; return;
} }
Group* group = GetPlayer()->GetGroup(); Group* group = invitingPlayer->GetGroup();
if (group) if (group && group->isBGGroup())
{ group = invitingPlayer->GetOriginalGroup();
if (group->isLFGGroup() && group->IsLfgRandomInstance()) if (!group)
{ group = invitingPlayer->GetGroupInvite();
SendPartyResult(PARTY_OP_INVITE, membername, ERR_TARGET_NOT_IN_INSTANCE_S);
return;
}
if (group->isBGGroup() || group->isBFGroup()) Group* group2 = invitedPlayer->GetGroup();
{ if (group2 && group2->isBGGroup())
group = GetPlayer()->GetOriginalGroup(); group2 = invitedPlayer->GetOriginalGroup();
}
}
Group* group2 = player->GetGroup();
if (group2 && (group2->isBGGroup() || group2->isBFGroup()))
group2 = player->GetOriginalGroup();
// player already in another group or invited // player already in another group or invited
if (group2 || player->GetGroupInvite()) if (group2 || invitedPlayer->GetGroupInvite())
{ {
SendPartyResult(PARTY_OP_INVITE, membername, ERR_ALREADY_IN_GROUP_S); SendPartyResult(PARTY_OP_INVITE, membername, ERR_ALREADY_IN_GROUP_S);
@@ -156,11 +148,11 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData)
// tell the player that they were invited but it failed as they were already in a group // tell the player that they were invited but it failed as they were already in a group
WorldPacket data(SMSG_GROUP_INVITE, 25); // guess size WorldPacket data(SMSG_GROUP_INVITE, 25); // guess size
data << uint8(0); // invited/already in group flag data << uint8(0); // invited/already in group flag
data << GetPlayer()->GetName(); // max len 48 data << invitingPlayer->GetName(); // max len 48
data << uint32(0); // unk data << uint32(0); // unk
data << uint8(0); // count data << uint8(0); // count
data << uint32(0); // unk data << uint32(0); // unk
player->GetSession()->SendPacket(&data); invitedPlayer->GetSession()->SendPacket(&data);
} }
return; return;
@@ -169,7 +161,7 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData)
if (group) if (group)
{ {
// not have permissions for invite // not have permissions for invite
if (!group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID())) if (!group->IsLeader(invitingPlayer->GetGUID()) && !group->IsAssistant(invitingPlayer->GetGUID()))
{ {
SendPartyResult(PARTY_OP_INVITE, "", ERR_NOT_LEADER); SendPartyResult(PARTY_OP_INVITE, "", ERR_NOT_LEADER);
return; return;
@@ -183,22 +175,22 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData)
} }
// xinef: if player has no group, check group invite // xinef: if player has no group, check group invite
if (!group && GetPlayer()->GetGroupInvite() && GetPlayer()->GetGroupInvite()->GetLeaderGUID() == GetPlayer()->GetGUID()) if (!group && invitingPlayer->GetGroupInvite() && invitingPlayer->GetGroupInvite()->GetLeaderGUID() == invitingPlayer->GetGUID())
group = GetPlayer()->GetGroupInvite(); group = invitingPlayer->GetGroupInvite();
// ok, but group not exist, start a new group // ok, but group not exist, start a new group
// but don't create and save the group to the DB until // but don't create and save the group to the DB until
// at least one person joins // at least one person joins
if (!group) if (!group)
{ {
group = new Group; group = new Group();
// new group: if can't add then delete // new group: if can't add then delete
if (!group->AddLeaderInvite(GetPlayer())) if (!group->AddLeaderInvite(invitingPlayer))
{ {
delete group; delete group;
return; return;
} }
if (!group->AddInvite(player)) if (!group->AddInvite(invitedPlayer))
{ {
delete group; delete group;
return; return;
@@ -207,7 +199,7 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData)
else else
{ {
// already existed group: if can't add then just leave // already existed group: if can't add then just leave
if (!group->AddInvite(player)) if (!group->AddInvite(invitedPlayer))
{ {
return; return;
} }
@@ -216,11 +208,11 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData)
// ok, we do it // ok, we do it
WorldPacket data(SMSG_GROUP_INVITE, 10); // guess size WorldPacket data(SMSG_GROUP_INVITE, 10); // guess size
data << uint8(1); // invited/already in group flag data << uint8(1); // invited/already in group flag
data << GetPlayer()->GetName(); // max len 48 data << invitingPlayer->GetName(); // max len 48
data << uint32(0); // unk data << uint32(0); // unk
data << uint8(0); // count data << uint8(0); // count
data << uint32(0); // unk data << uint32(0); // unk
player->GetSession()->SendPacket(&data); invitedPlayer->GetSession()->SendPacket(&data);
SendPartyResult(PARTY_OP_INVITE, membername, ERR_PARTY_RESULT_OK); SendPartyResult(PARTY_OP_INVITE, membername, ERR_PARTY_RESULT_OK);
} }
@@ -446,7 +438,8 @@ void WorldSession::HandleGroupSetLeaderOpcode(WorldPacket& recvData)
void WorldSession::HandleGroupDisbandOpcode(WorldPacket& /*recvData*/) void WorldSession::HandleGroupDisbandOpcode(WorldPacket& /*recvData*/)
{ {
Group* grp = GetPlayer()->GetGroup(); Group* grp = GetPlayer()->GetGroup();
if (!grp) Group* grpInvite = GetPlayer()->GetGroupInvite();
if (!grp && !grpInvite)
return; return;
if (_player->InBattleground()) if (_player->InBattleground())
@@ -459,10 +452,17 @@ void WorldSession::HandleGroupDisbandOpcode(WorldPacket& /*recvData*/)
/********************/ /********************/
// everything's fine, do it // everything's fine, do it
if (grp)
{
SendPartyResult(PARTY_OP_LEAVE, GetPlayer()->GetName(), ERR_PARTY_RESULT_OK); SendPartyResult(PARTY_OP_LEAVE, GetPlayer()->GetName(), ERR_PARTY_RESULT_OK);
GetPlayer()->RemoveFromGroup(GROUP_REMOVEMETHOD_LEAVE); GetPlayer()->RemoveFromGroup(GROUP_REMOVEMETHOD_LEAVE);
} }
else if (grpInvite && grpInvite->GetLeaderGUID() == GetPlayer()->GetGUID())
{ // pending group creation being cancelled
SendPartyResult(PARTY_OP_LEAVE, GetPlayer()->GetName(), ERR_PARTY_RESULT_OK);
grpInvite->Disband();
}
}
void WorldSession::HandleLootMethodOpcode(WorldPacket& recvData) void WorldSession::HandleLootMethodOpcode(WorldPacket& recvData)
{ {