fix(Core/DungeonFinder): Premade groups should be treated as normal groups. (#8520)

Fixes #8339
This commit is contained in:
UltraNix
2021-10-20 10:29:24 +02:00
committed by GitHub
parent fba0797f6b
commit 1ec612e65b
6 changed files with 50 additions and 16 deletions
+28
View File
@@ -1568,7 +1568,28 @@ namespace lfg
LFGDungeonData const* dungeon = GetLFGDungeon(proposal.dungeonId); LFGDungeonData const* dungeon = GetLFGDungeon(proposal.dungeonId);
ASSERT(dungeon); ASSERT(dungeon);
bool isPremadeGroup = false;
Group* grp = proposal.group ? sGroupMgr->GetGroupByGUID(proposal.group.GetCounter()) : nullptr; Group* grp = proposal.group ? sGroupMgr->GetGroupByGUID(proposal.group.GetCounter()) : nullptr;
if (!grp)
{
ObjectGuid groupGUID;
for (ObjectGuid const& guid : players)
{
if (Player* player = ObjectAccessor::FindConnectedPlayer(guid))
{
Group* group = player->GetGroup();
if (!group || (groupGUID && groupGUID != group->GetGUID()))
{
isPremadeGroup = false;
break;
}
groupGUID = group->GetGUID();
isPremadeGroup = true;
}
}
}
ObjectGuid oldGroupGUID; ObjectGuid oldGroupGUID;
for (LfgGuidList::const_iterator it = players.begin(); it != players.end(); ++it) for (LfgGuidList::const_iterator it = players.begin(); it != players.end(); ++it)
{ {
@@ -1578,6 +1599,13 @@ namespace lfg
continue; continue;
Group* group = player->GetGroup(); Group* group = player->GetGroup();
if (isPremadeGroup && !grp)
{
oldGroupGUID = group->GetGUID();
grp = group;
grp->ConvertToLFG(false);
SetState(grp->GetGUID(), LFG_STATE_PROPOSAL);
}
// Xinef: Apply Random Buff // Xinef: Apply Random Buff
if (grp && !grp->IsLfgWithBuff()) if (grp && !grp->IsLfgWithBuff())
+1 -1
View File
@@ -12157,7 +12157,7 @@ PartyResult Player::CanUninviteFromGroup(ObjectGuid targetPlayerGUID) const
if (!grp) if (!grp)
return ERR_NOT_IN_GROUP; return ERR_NOT_IN_GROUP;
if (grp->isLFGGroup()) if (grp->isLFGGroup(true))
{ {
ObjectGuid gguid = grp->GetGUID(); ObjectGuid gguid = grp->GetGUID();
if (!sLFGMgr->GetKicksLeft(gguid)) if (!sLFGMgr->GetKicksLeft(gguid))
@@ -2370,7 +2370,7 @@ InventoryResult Player::CanUseItem(ItemTemplate const* proto) const
InventoryResult Player::CanRollForItemInLFG(ItemTemplate const* proto, WorldObject const* lootedObject) const InventoryResult Player::CanRollForItemInLFG(ItemTemplate const* proto, WorldObject const* lootedObject) const
{ {
if (!GetGroup() || !GetGroup()->isLFGGroup()) if (!GetGroup() || !GetGroup()->isLFGGroup(true))
return EQUIP_ERR_OK; // not in LFG group return EQUIP_ERR_OK; // not in LFG group
// check if looted object is inside the lfg dungeon // check if looted object is inside the lfg dungeon
+14 -8
View File
@@ -252,10 +252,15 @@ void Group::LoadMemberFromDB(ObjectGuid::LowType guidLow, uint8 memberFlags, uin
sLFGMgr->SetupGroupMember(member.guid, GetGUID()); sLFGMgr->SetupGroupMember(member.guid, GetGUID());
} }
void Group::ConvertToLFG() void Group::ConvertToLFG(bool restricted /*= true*/)
{ {
m_groupType = GroupType(m_groupType | GROUPTYPE_LFG | GROUPTYPE_LFG_RESTRICTED); m_groupType = GroupType(m_groupType | GROUPTYPE_LFG);
if (restricted)
{
m_groupType = GroupType(m_groupType | GROUPTYPE_LFG_RESTRICTED);
m_lootMethod = NEED_BEFORE_GREED; m_lootMethod = NEED_BEFORE_GREED;
}
if (!isBGGroup() && !isBFGroup()) if (!isBGGroup() && !isBFGroup())
{ {
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GROUP_TYPE); CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GROUP_TYPE);
@@ -525,14 +530,14 @@ bool Group::RemoveMember(ObjectGuid guid, const RemoveMethod& method /*= GROUP_R
BroadcastGroupUpdate(); BroadcastGroupUpdate();
// LFG group vote kick handled in scripts // LFG group vote kick handled in scripts
if (isLFGGroup() && method == GROUP_REMOVEMETHOD_KICK) if (isLFGGroup(true) && method == GROUP_REMOVEMETHOD_KICK)
{ {
sLFGMgr->InitBoot(GetGUID(), kicker, guid, std::string(reason ? reason : "")); sLFGMgr->InitBoot(GetGUID(), kicker, guid, std::string(reason ? reason : ""));
return m_memberSlots.size() > 0; return m_memberSlots.size() > 0;
} }
// remove member and change leader (if need) only if strong more 2 members _before_ member remove (BG/BF allow 1 member group) // remove member and change leader (if need) only if strong more 2 members _before_ member remove (BG/BF allow 1 member group)
if (GetMembersCount() > ((isBGGroup() || isLFGGroup() || isBFGroup()) ? 1u : 2u)) if (GetMembersCount() > ((isBGGroup() || isLFGGroup(true) || isBFGroup()) ? 1u : 2u))
{ {
Player* player = ObjectAccessor::FindConnectedPlayer(guid); Player* player = ObjectAccessor::FindConnectedPlayer(guid);
if (player) if (player)
@@ -654,7 +659,7 @@ bool Group::RemoveMember(ObjectGuid guid, const RemoveMethod& method /*= GROUP_R
//return false; //return false;
} }
if (isLFGGroup() && GetMembersCount() == 1) if (isLFGGroup(true) && GetMembersCount() == 1)
{ {
Player* leader = ObjectAccessor::FindConnectedPlayer(GetLeaderGUID()); Player* leader = ObjectAccessor::FindConnectedPlayer(GetLeaderGUID());
uint32 mapId = sLFGMgr->GetDungeonMapId(GetGUID()); uint32 mapId = sLFGMgr->GetDungeonMapId(GetGUID());
@@ -666,7 +671,7 @@ bool Group::RemoveMember(ObjectGuid guid, const RemoveMethod& method /*= GROUP_R
} }
} }
if (m_memberMgr.getSize() < ((isLFGGroup() || isBGGroup() || isBFGroup()) ? 1u : 2u)) if (m_memberMgr.getSize() < ((isLFGGroup(true) || isBGGroup() || isBFGroup()) ? 1u : 2u))
{ {
Disband(); Disband();
return false; return false;
@@ -2118,9 +2123,10 @@ bool Group::IsFull() const
return isRaidGroup() ? (m_memberSlots.size() >= MAXRAIDSIZE) : (m_memberSlots.size() >= MAXGROUPSIZE); return isRaidGroup() ? (m_memberSlots.size() >= MAXRAIDSIZE) : (m_memberSlots.size() >= MAXGROUPSIZE);
} }
bool Group::isLFGGroup() const bool Group::isLFGGroup(bool restricted /*= false*/) const
{ {
return m_groupType & GROUPTYPE_LFG; bool isLFG = m_groupType & GROUPTYPE_LFG;
return isLFG && (!restricted || (m_groupType & GROUPTYPE_LFG_RESTRICTED) != 0);
} }
bool Group::isRaidGroup() const bool Group::isRaidGroup() const
+2 -2
View File
@@ -208,7 +208,7 @@ public:
// properties accessories // properties accessories
bool IsFull() const; bool IsFull() const;
bool isLFGGroup() const; bool isLFGGroup(bool restricted = false) const;
bool isRaidGroup() const; bool isRaidGroup() const;
bool isBFGroup() const; bool isBFGroup() const;
bool isBGGroup() const; bool isBGGroup() const;
@@ -242,7 +242,7 @@ public:
uint8 GetMemberGroup(ObjectGuid guid) const; uint8 GetMemberGroup(ObjectGuid guid) const;
void ConvertToLFG(); void ConvertToLFG(bool restricted = true);
void ConvertToRaid(); void ConvertToRaid();
void SetBattlegroundGroup(Battleground* bg); void SetBattlegroundGroup(Battleground* bg);
+3 -3
View File
@@ -356,13 +356,13 @@ void WorldSession::HandleGroupUninviteGuidOpcode(WorldPacket& recvData)
return; return;
// Xinef: do not allow to kick with empty reason, this will resend packet with given reason // Xinef: do not allow to kick with empty reason, this will resend packet with given reason
if (grp->isLFGGroup() && reason.empty()) if (grp->isLFGGroup(true) && reason.empty())
{ {
SendPartyResult(PARTY_OP_UNINVITE, name, ERR_VOTE_KICK_REASON_NEEDED); SendPartyResult(PARTY_OP_UNINVITE, name, ERR_VOTE_KICK_REASON_NEEDED);
return; return;
} }
if (grp->IsLeader(guid) && !grp->isLFGGroup()) if (grp->IsLeader(guid) && !grp->isLFGGroup(true))
{ {
SendPartyResult(PARTY_OP_UNINVITE, name, ERR_NOT_LEADER); SendPartyResult(PARTY_OP_UNINVITE, name, ERR_NOT_LEADER);
return; return;
@@ -489,7 +489,7 @@ void WorldSession::HandleLootMethodOpcode(WorldPacket& recvData)
/** error handling **/ /** error handling **/
// Xinef: Check if group is LFG // Xinef: Check if group is LFG
if (!group->IsLeader(GetPlayer()->GetGUID()) || group->isLFGGroup()) if (!group->IsLeader(GetPlayer()->GetGUID()) || group->isLFGGroup(true))
return; return;
if (lootMethod > NEED_BEFORE_GREED) if (lootMethod > NEED_BEFORE_GREED)