aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSpp <spp@jorge.gr>2010-08-11 15:20:20 +0200
committerSpp <spp@jorge.gr>2010-08-11 15:20:20 +0200
commitf9468e7e5d13071d170b4e10a4f20689e2ae7dc3 (patch)
tree0459f57ec0e2350b28f0a5ef89ba4fdb7f1ceb95 /src
parent23c4b1be25797f73e477ecf4d238f6e360b50b5b (diff)
Dungeon Finder: Add LFG support to groups
--HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.cpp4
-rw-r--r--src/server/game/Groups/Group.cpp34
-rw-r--r--src/server/game/Groups/Group.h31
-rw-r--r--src/server/game/Server/Protocol/Handlers/GroupHandler.cpp8
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())