mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-16 18:40:28 +00:00
fix(Core/Groups): Create the group at first invite (#17869)
* cherry-pick commit (132538db1d) * cherry-pick commit (250e8d998b) * part https://github.com/azerothcore/azerothcore-wotlk/issues/11070 Co-authored-by: Treeston <14020072+Treeston@users.noreply.github.com>
This commit is contained in:
@@ -73,81 +73,73 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData)
|
||||
return;
|
||||
}
|
||||
|
||||
Player* player = ObjectAccessor::FindPlayerByName(membername, false);
|
||||
Player* invitingPlayer = GetPlayer();
|
||||
Player* invitedPlayer = ObjectAccessor::FindPlayerByName(membername, false);
|
||||
|
||||
// no player or cheat self-invite
|
||||
if (!player || player == GetPlayer())
|
||||
if (!invitedPlayer || invitedPlayer == invitingPlayer)
|
||||
{
|
||||
SendPartyResult(PARTY_OP_INVITE, membername, ERR_BAD_PLAYER_NAME_S);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!sScriptMgr->CanGroupInvite(GetPlayer(), membername))
|
||||
if (!sScriptMgr->CanGroupInvite(invitingPlayer, membername))
|
||||
return;
|
||||
|
||||
if (GetPlayer()->IsSpectator() || player->IsSpectator())
|
||||
if (invitingPlayer->IsSpectator() || invitedPlayer->IsSpectator())
|
||||
{
|
||||
SendPartyResult(PARTY_OP_INVITE, membername, ERR_INVITE_RESTRICTED);
|
||||
return;
|
||||
}
|
||||
|
||||
// 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);
|
||||
return;
|
||||
}
|
||||
|
||||
// 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);
|
||||
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);
|
||||
return;
|
||||
}
|
||||
// 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);
|
||||
return;
|
||||
}
|
||||
|
||||
if (player->GetSocial()->HasIgnore(GetPlayer()->GetGUID()))
|
||||
if (invitedPlayer->GetSocial()->HasIgnore(invitingPlayer->GetGUID()))
|
||||
{
|
||||
SendPartyResult(PARTY_OP_INVITE, membername, ERR_IGNORING_YOU_S);
|
||||
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;
|
||||
}
|
||||
|
||||
Group* group = GetPlayer()->GetGroup();
|
||||
if (group)
|
||||
{
|
||||
if (group->isLFGGroup() && group->IsLfgRandomInstance())
|
||||
{
|
||||
SendPartyResult(PARTY_OP_INVITE, membername, ERR_TARGET_NOT_IN_INSTANCE_S);
|
||||
return;
|
||||
}
|
||||
Group* group = invitingPlayer->GetGroup();
|
||||
if (group && group->isBGGroup())
|
||||
group = invitingPlayer->GetOriginalGroup();
|
||||
if (!group)
|
||||
group = invitingPlayer->GetGroupInvite();
|
||||
|
||||
if (group->isBGGroup() || group->isBFGroup())
|
||||
{
|
||||
group = GetPlayer()->GetOriginalGroup();
|
||||
}
|
||||
}
|
||||
|
||||
Group* group2 = player->GetGroup();
|
||||
if (group2 && (group2->isBGGroup() || group2->isBFGroup()))
|
||||
group2 = player->GetOriginalGroup();
|
||||
Group* group2 = invitedPlayer->GetGroup();
|
||||
if (group2 && group2->isBGGroup())
|
||||
group2 = invitedPlayer->GetOriginalGroup();
|
||||
// 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);
|
||||
|
||||
@@ -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
|
||||
WorldPacket data(SMSG_GROUP_INVITE, 25); // guess size
|
||||
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 << uint8(0); // count
|
||||
data << uint32(0); // unk
|
||||
player->GetSession()->SendPacket(&data);
|
||||
invitedPlayer->GetSession()->SendPacket(&data);
|
||||
}
|
||||
|
||||
return;
|
||||
@@ -169,7 +161,7 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData)
|
||||
if (group)
|
||||
{
|
||||
// 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);
|
||||
return;
|
||||
@@ -183,22 +175,22 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData)
|
||||
}
|
||||
|
||||
// xinef: if player has no group, check group invite
|
||||
if (!group && GetPlayer()->GetGroupInvite() && GetPlayer()->GetGroupInvite()->GetLeaderGUID() == GetPlayer()->GetGUID())
|
||||
group = GetPlayer()->GetGroupInvite();
|
||||
if (!group && invitingPlayer->GetGroupInvite() && invitingPlayer->GetGroupInvite()->GetLeaderGUID() == invitingPlayer->GetGUID())
|
||||
group = invitingPlayer->GetGroupInvite();
|
||||
|
||||
// ok, but group not exist, start a new group
|
||||
// but don't create and save the group to the DB until
|
||||
// at least one person joins
|
||||
if (!group)
|
||||
{
|
||||
group = new Group;
|
||||
group = new Group();
|
||||
// new group: if can't add then delete
|
||||
if (!group->AddLeaderInvite(GetPlayer()))
|
||||
if (!group->AddLeaderInvite(invitingPlayer))
|
||||
{
|
||||
delete group;
|
||||
return;
|
||||
}
|
||||
if (!group->AddInvite(player))
|
||||
if (!group->AddInvite(invitedPlayer))
|
||||
{
|
||||
delete group;
|
||||
return;
|
||||
@@ -207,7 +199,7 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData)
|
||||
else
|
||||
{
|
||||
// already existed group: if can't add then just leave
|
||||
if (!group->AddInvite(player))
|
||||
if (!group->AddInvite(invitedPlayer))
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -216,11 +208,11 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData)
|
||||
// ok, we do it
|
||||
WorldPacket data(SMSG_GROUP_INVITE, 10); // guess size
|
||||
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 << uint8(0); // count
|
||||
data << uint32(0); // unk
|
||||
player->GetSession()->SendPacket(&data);
|
||||
invitedPlayer->GetSession()->SendPacket(&data);
|
||||
|
||||
SendPartyResult(PARTY_OP_INVITE, membername, ERR_PARTY_RESULT_OK);
|
||||
}
|
||||
@@ -446,7 +438,8 @@ void WorldSession::HandleGroupSetLeaderOpcode(WorldPacket& recvData)
|
||||
void WorldSession::HandleGroupDisbandOpcode(WorldPacket& /*recvData*/)
|
||||
{
|
||||
Group* grp = GetPlayer()->GetGroup();
|
||||
if (!grp)
|
||||
Group* grpInvite = GetPlayer()->GetGroupInvite();
|
||||
if (!grp && !grpInvite)
|
||||
return;
|
||||
|
||||
if (_player->InBattleground())
|
||||
@@ -459,9 +452,16 @@ void WorldSession::HandleGroupDisbandOpcode(WorldPacket& /*recvData*/)
|
||||
/********************/
|
||||
|
||||
// everything's fine, do it
|
||||
SendPartyResult(PARTY_OP_LEAVE, GetPlayer()->GetName(), ERR_PARTY_RESULT_OK);
|
||||
|
||||
GetPlayer()->RemoveFromGroup(GROUP_REMOVEMETHOD_LEAVE);
|
||||
if (grp)
|
||||
{
|
||||
SendPartyResult(PARTY_OP_LEAVE, GetPlayer()->GetName(), ERR_PARTY_RESULT_OK);
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user