Core/Groups: Refactored sending of update packets.

Now it is possible to send update packet to single player.
This commit is contained in:
LihO
2011-09-17 20:17:41 +02:00
parent 8c2e58d036
commit db8b02690b
2 changed files with 63 additions and 46 deletions
+32 -16
View File
@@ -1184,18 +1184,35 @@ void Group::SendTargetIconList(WorldSession* session)
void Group::SendUpdate() void Group::SendUpdate()
{ {
Player* player; for (member_witerator witr = m_memberSlots.begin(); witr != m_memberSlots.end(); ++witr)
for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
{ {
player = ObjectAccessor::FindPlayer(citr->guid); SendUpdateToPlayer(witr->guid, &(*witr));
}
}
void Group::SendUpdateToPlayer(uint64 playerGUID, MemberSlot* slot)
{
Player* player = ObjectAccessor::FindPlayer(playerGUID);
if (!player || !player->GetSession() || player->GetGroup() != this) if (!player || !player->GetSession() || player->GetGroup() != this)
continue; return;
// if MemberSlot wasn't provided
if (!slot)
{
member_witerator witr = _getMemberWSlot(playerGUID);
if (witr == m_memberSlots.end()) // if there is no MemberSlot for such a player
return;
slot = &(*witr);
}
WorldPacket data(SMSG_GROUP_LIST, (1+1+1+1+1+4+8+4+4+(GetMembersCount()-1)*(13+8+1+1+1+1)+8+1+8+1+1+1+1)); WorldPacket data(SMSG_GROUP_LIST, (1+1+1+1+1+4+8+4+4+(GetMembersCount()-1)*(13+8+1+1+1+1)+8+1+8+1+1+1+1));
data << uint8(m_groupType); // group type (flags in 3.3) data << uint8(m_groupType); // group type (flags in 3.3)
data << uint8(citr->group); data << uint8(slot->group);
data << uint8(citr->flags); data << uint8(slot->flags);
data << uint8(citr->roles); data << uint8(slot->roles);
if (isLFGGroup()) if (isLFGGroup())
{ {
data << uint8(sLFGMgr->GetState(m_guid) == LFG_STATE_FINISHED_DUNGEON ? 2 : 0); // FIXME - Dungeon save status? 2 = done data << uint8(sLFGMgr->GetState(m_guid) == LFG_STATE_FINISHED_DUNGEON ? 2 : 0); // FIXME - Dungeon save status? 2 = done
@@ -1205,22 +1222,22 @@ void Group::SendUpdate()
data << uint64(m_guid); data << uint64(m_guid);
data << uint32(m_counter++); // 3.3, value increases every time this packet gets sent data << uint32(m_counter++); // 3.3, value increases every time this packet gets sent
data << uint32(GetMembersCount()-1); data << uint32(GetMembersCount()-1);
for (member_citerator citr2 = m_memberSlots.begin(); citr2 != m_memberSlots.end(); ++citr2) for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
{ {
if (citr->guid == citr2->guid) if (slot->guid == citr->guid)
continue; continue;
Player* member = ObjectAccessor::FindPlayer(citr2->guid); Player* member = ObjectAccessor::FindPlayer(citr->guid);
uint8 onlineState = (member) ? MEMBER_STATUS_ONLINE : MEMBER_STATUS_OFFLINE; uint8 onlineState = (member) ? MEMBER_STATUS_ONLINE : MEMBER_STATUS_OFFLINE;
onlineState = onlineState | ((isBGGroup()) ? MEMBER_STATUS_PVP : 0); onlineState = onlineState | ((isBGGroup()) ? MEMBER_STATUS_PVP : 0);
data << citr2->name; data << citr->name;
data << uint64(citr2->guid); // guid data << uint64(citr->guid); // guid
data << uint8(onlineState); // online-state data << uint8(onlineState); // online-state
data << uint8(citr2->group); // groupid data << uint8(citr->group); // groupid
data << uint8(citr2->flags); // See enum GroupMemberFlags data << uint8(citr->flags); // See enum GroupMemberFlags
data << uint8(citr2->roles); // Lfg Roles data << uint8(citr->roles); // Lfg Roles
} }
data << uint64(m_leaderGuid); // leader guid data << uint64(m_leaderGuid); // leader guid
@@ -1237,7 +1254,6 @@ void Group::SendUpdate()
player->GetSession()->SendPacket(&data); player->GetSession()->SendPacket(&data);
} }
}
void Group::UpdatePlayerOutOfRange(Player* pPlayer) void Group::UpdatePlayerOutOfRange(Player* pPlayer)
{ {
+1
View File
@@ -260,6 +260,7 @@ class Group
//void SendInit(WorldSession* session); //void SendInit(WorldSession* session);
void SendTargetIconList(WorldSession* session); void SendTargetIconList(WorldSession* session);
void SendUpdate(); void SendUpdate();
void SendUpdateToPlayer(uint64 playerGUID, MemberSlot* slot = NULL);
void UpdatePlayerOutOfRange(Player* pPlayer); void UpdatePlayerOutOfRange(Player* pPlayer);
// ignore: GUID of player that will be ignored // ignore: GUID of player that will be ignored
void BroadcastPacket(WorldPacket* packet, bool ignorePlayersInBGRaid, int group=-1, uint64 ignore=0); void BroadcastPacket(WorldPacket* packet, bool ignorePlayersInBGRaid, int group=-1, uint64 ignore=0);