diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/DungeonFinding/LFGMgr.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Groups/Group.cpp | 34 | ||||
-rw-r--r-- | src/server/game/Groups/Group.h | 31 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Handlers/GroupHandler.cpp | 8 |
4 files changed, 66 insertions, 11 deletions
diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 909faddc6ee..0e21afd5c9d 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -311,6 +311,7 @@ void LFGMgr::Leave(Player *plr, Group *grp /* = NULL*/) // Remove from Role Checks if (grp) { + grp->SetLfgQueued(false); LfgRoleCheckMap::const_iterator itRoleCheck = m_RoleChecks.find(GUID_LOPART(guid)); if (itRoleCheck != m_RoleChecks.end()) { @@ -526,7 +527,10 @@ void LFGMgr::UpdateRoleCheck(Group *grp, Player *plr /* = NULL*/) } if (pRoleCheck->result == LFG_ROLECHECK_FINISHED) + { + grp->SetLfgQueued(true); AddToQueue(grp->GetGUID(), &pRoleCheck->roles, &pRoleCheck->dungeons); + } if (pRoleCheck->result != LFG_ROLECHECK_INITIALITING) { diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 6fda33ee124..5c2c8b84c1e 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -48,6 +48,9 @@ Group::Group() m_guid = 0; m_counter = 0; m_maxEnchantingLevel= 0; + m_LfgQueued = false; + m_LfgStatus = 1; + m_LfgDungeonEntry = 0; for (uint8 i = 0; i < TARGETICONCOUNT; ++i) m_targetIcons[i] = 0; @@ -199,6 +202,7 @@ bool Group::LoadMemberFromDB(uint32 guidLow, uint8 memberFlags, uint8 subgroup) member.group = subgroup; member.flags = memberFlags; + member.roles = 0; m_memberSlots.push_back(member); @@ -207,6 +211,15 @@ bool Group::LoadMemberFromDB(uint32 guidLow, uint8 memberFlags, uint8 subgroup) return true; } +void Group::ConvertToLFG() +{ + m_groupType = GroupType(m_groupType | GROUPTYPE_LFG | GROUPTYPE_UNK1); + m_lootMethod = NEED_BEFORE_GREED; + if (!isBGGroup()) + CharacterDatabase.PExecute("UPDATE groups SET groupType='%u' WHERE guid='%u'", uint8(m_groupType), GUID_LOPART(m_guid)); + SendUpdate(); +} + void Group::ConvertToRaid() { m_groupType = GroupType(m_groupType | GROUPTYPE_RAID); @@ -290,8 +303,12 @@ Player* Group::GetInvited(const std::string& name) const bool Group::AddMember(const uint64 &guid, const char* name) { + if (isLfgQueued()) + sLFGMgr.Leave(NULL, this); + if (!_addMember(guid, name)) return false; + SendUpdate(); Player *player = sObjectMgr.GetPlayer(guid); @@ -336,7 +353,7 @@ uint32 Group::RemoveMember(const uint64 &guid, const uint8 &method) { BroadcastGroupUpdate(); - if (!isBGGroup()) + if (isLfgQueued()) sLFGMgr.Leave(NULL, this); // remove member and change leader (if need) only if strong more 2 members _before_ member remove @@ -1081,12 +1098,16 @@ void Group::SendUpdate() data << uint8(m_groupType); // group type (flags in 3.3) data << uint8(citr->group); data << uint8(citr->flags); - data << uint8(isBGGroup() ? 1 : 0); // 2.0.x, isBattlegroundGroup? - if (m_groupType & GROUPTYPE_LFD) + if (isLFGGroup()) { - data << uint8(0); - data << uint32(0); + uint32 lowguid = GetLowGUID(); + data << uint8(1); + data << uint8(m_LfgStatus); + data << uint32(m_LfgDungeonEntry); } + else + data << uint8(isBGGroup() ? 1 : 0); // 2.0.x, isBattlegroundGroup? + data << uint64(m_guid); data << uint32(m_counter++); // 3.3, value increases every time this packet gets sent data << uint32(GetMembersCount()-1); @@ -1104,7 +1125,7 @@ void Group::SendUpdate() data << uint8(onlineState); // online-state data << uint8(citr2->group); // groupid data << uint8(citr2->flags); // See enum GroupMemberFlags - data << uint8(0); // 3.3 + data << uint8(citr2->roles); // Lfg Roles } data << uint64(m_leaderGuid); // leader guid if (GetMembersCount()-1) @@ -1214,6 +1235,7 @@ bool Group::_addMember(const uint64 &guid, const char* name, uint8 group) member.name = name; member.group = group; member.flags = 0; + member.roles = 0; m_memberSlots.push_back(member); SubGroupCounterIncrease(group); diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h index 9715779ced6..75ed94a46ff 100644 --- a/src/server/game/Groups/Group.h +++ b/src/server/game/Groups/Group.h @@ -72,8 +72,8 @@ enum GroupType GROUPTYPE_BG = 0x01, GROUPTYPE_RAID = 0x02, GROUPTYPE_BGRAID = GROUPTYPE_BG | GROUPTYPE_RAID, // mask - // 0x04? - GROUPTYPE_LFD = 0x08, + GROUPTYPE_UNK1 = 0x04, + GROUPTYPE_LFG = 0x08, // 0x10, leave/change group?, I saw this flag when leaving group and after leaving BG while in group }; @@ -158,6 +158,7 @@ class Group std::string name; uint8 group; uint8 flags; + uint8 roles; }; typedef std::list<MemberSlot> MemberSlotList; typedef MemberSlotList::const_iterator member_citerator; @@ -191,8 +192,30 @@ class Group void SetLootThreshold(ItemQualities threshold) { m_lootThreshold = threshold; } void Disband(bool hideDestroy=false); + void SetLfgQueued(bool queued) { m_LfgQueued = queued; } + bool isLfgQueued() { return m_LfgQueued; } + void SetLfgStatus(uint8 status) { m_LfgStatus = status; } + uint8 GetLfgStatus() { return m_LfgStatus; } + void SetLfgDungeonEntry(uint32 dungeonEntry) { m_LfgDungeonEntry = dungeonEntry; } + uint32 GetLfgDungeonEntry(bool id = true) + { + if (id) + return (m_LfgDungeonEntry & 0x00FFFFFF); + else + return m_LfgDungeonEntry; + } + void SetLfgRoles(uint64 guid, const uint8 roles) + { + member_witerator slot = _getMemberWSlot(guid); + if (slot == m_memberSlots.end()) + return; + + slot->roles = roles; + SendUpdate(); + } // properties accessories bool IsFull() const { return (m_groupType == GROUPTYPE_NORMAL) ? (m_memberSlots.size() >= MAXGROUPSIZE) : (m_memberSlots.size() >= MAXRAIDSIZE); } + bool isLFGGroup() const { return m_groupType & GROUPTYPE_LFG; } bool isRaidGroup() const { return m_groupType & GROUPTYPE_RAID; } bool isBGGroup() const { return m_bgGroup != NULL; } bool IsCreated() const { return GetMembersCount() > 0; } @@ -267,6 +290,7 @@ class Group return mslot->group; } + void ConvertToLFG(); // some additional raid methods void ConvertToRaid(); @@ -460,5 +484,8 @@ class Group uint64 m_guid; uint32 m_counter; // used only in SMSG_GROUP_LIST uint32 m_maxEnchantingLevel; + bool m_LfgQueued; + uint8 m_LfgStatus; + uint32 m_LfgDungeonEntry; }; #endif diff --git a/src/server/game/Server/Protocol/Handlers/GroupHandler.cpp b/src/server/game/Server/Protocol/Handlers/GroupHandler.cpp index 26f7d81a596..8c93e11eb20 100644 --- a/src/server/game/Server/Protocol/Handlers/GroupHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/GroupHandler.cpp @@ -32,7 +32,7 @@ #include "Util.h" #include "SpellAuras.h" #include "Vehicle.h" -#include "LFG.h" +#include "LFGMgr.h" class Aura; @@ -266,8 +266,9 @@ void WorldSession::HandleGroupDeclineOpcode(WorldPacket & /*recv_data*/) void WorldSession::HandleGroupUninviteGuidOpcode(WorldPacket & recv_data) { uint64 guid; + std::string reason; recv_data >> guid; - recv_data.read_skip<std::string>(); // reason + recv_data >> reason; //can't uninvite yourself if (guid == GetPlayer()->GetGUID()) @@ -366,7 +367,8 @@ void WorldSession::HandleGroupSetLeaderOpcode(WorldPacket & recv_data) void WorldSession::HandleGroupDisbandOpcode(WorldPacket & /*recv_data*/) { - if (!GetPlayer()->GetGroup()) + Group *grp = GetPlayer()->GetGroup(); + if (!grp) return; if (_player->InBattleground()) |