aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorForesterDev <11771800+ForesterDev@users.noreply.github.com>2019-04-15 17:25:08 +0400
committerGiacomo Pozzoni <giacomopoz@gmail.com>2019-04-15 15:25:08 +0200
commit2a6eef76e24bcc266050237df0bf296e4cce4bae (patch)
treecd881c22a5212d7702c6bf73657151c50421da01 /src
parent145f7d6a74c4f845dbe3c0ac333a0d5fe53c0c19 (diff)
Core/Social: Separated checks for friend and ignored limits (#23181)
* Core/Conditions: implement CONDITION_GAMEMASTER * Core/Social: Separated checks for friend and ignored limits * Prevent duplication of contacts * Limit values should be included in counters * Codestyle and comments
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/SocialMgr.cpp48
1 files changed, 29 insertions, 19 deletions
diff --git a/src/server/game/Entities/Player/SocialMgr.cpp b/src/server/game/Entities/Player/SocialMgr.cpp
index a9f7d0c8f56..59d9be98a54 100644
--- a/src/server/game/Entities/Player/SocialMgr.cpp
+++ b/src/server/game/Entities/Player/SocialMgr.cpp
@@ -126,40 +126,50 @@ void PlayerSocial::SendSocialList(Player* player, uint32 flags)
{
ASSERT(player);
- uint32 count = 0;
+ uint32 friendsCount = 0;
+ uint32 ignoredCount = 0;
+ uint32 totalCount = 0;
+
WorldPacket data(SMSG_CONTACT_LIST, (4 + 4 + _playerSocialMap.size() * 25)); // just can guess size
- data << uint32(flags); // 0x1 = Friendlist update. 0x2 = Ignorelist update. 0x4 = Mutelist update.
+ data << uint32(flags); // 0x1 = Friendlist update. 0x2 = Ignorelist update. 0x4 = Mutelist update.
size_t countPos = data.wpos();
- data << uint32(count); // friends count placeholder
+ data << uint32(0); // contacts count placeholder
for (auto& v : _playerSocialMap)
{
- if (!(v.second.Flags & flags))
+ uint8 contactFlags = v.second.Flags;
+ if (!(contactFlags & flags))
continue;
- ++count;
+ // Check client limit for friends list
+ if (contactFlags & SOCIAL_FLAG_FRIEND)
+ if (++friendsCount > SOCIALMGR_FRIEND_LIMIT)
+ continue;
+
+ // Check client limit for ignore list
+ if (contactFlags & SOCIAL_FLAG_IGNORED)
+ if (++ignoredCount > SOCIALMGR_IGNORE_LIMIT)
+ continue;
+
+ ++totalCount;
sSocialMgr->GetFriendInfo(player, v.first, v.second);
- data << uint64(v.first); // player guid
- data << uint32(v.second.Flags); // player flag (0x1 = Friend, 0x2 = Ignored, 0x4 = Muted)
- data << v.second.Note; // string note
- if (v.second.Flags & SOCIAL_FLAG_FRIEND) // if IsFriend()
+ data << uint64(v.first); // player guid
+ data << uint32(contactFlags); // player flag (0x1 = Friend, 0x2 = Ignored, 0x4 = Muted)
+ data << v.second.Note; // string note
+ if (contactFlags & SOCIAL_FLAG_FRIEND) // if IsFriend()
{
- data << uint8(v.second.Status); // online/offline/etc?
- if (v.second.Status) // if online
+ data << uint8(v.second.Status); // online/offline/etc?
+ if (v.second.Status) // if online
{
- data << uint32(v.second.Area); // player area
- data << uint32(v.second.Level); // player level
- data << uint32(v.second.Class); // player class
+ data << uint32(v.second.Area); // player area
+ data << uint32(v.second.Level); // player level
+ data << uint32(v.second.Class); // player class
}
}
-
- // client's friends list and ignore list limit
- if (count >= (((flags & SOCIAL_FLAG_FRIEND) != 0) ? SOCIALMGR_FRIEND_LIMIT : SOCIALMGR_IGNORE_LIMIT))
- break;
}
- data.put<uint32>(countPos, count);
+ data.put<uint32>(countPos, totalCount);
player->SendDirectMessage(&data);
}