aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp11
-rwxr-xr-xsrc/server/game/Entities/Player/Player.h2
-rwxr-xr-xsrc/server/game/Groups/Group.cpp15
-rwxr-xr-xsrc/server/game/Groups/Group.h3
-rw-r--r--src/server/game/Guilds/Guild.cpp5
-rw-r--r--src/server/game/Handlers/ChatHandler.cpp46
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp4
-rw-r--r--src/server/game/Server/WorldSession.cpp17
-rwxr-xr-xsrc/server/game/Server/WorldSession.h18
9 files changed, 99 insertions, 22 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index c12c3d60184..0c5ccd85a09 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -19986,16 +19986,17 @@ void Player::TextEmote(const std::string& text)
SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), true, !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT));
}
-void Player::WhisperAddon(const std::string& text, const std::string& prefix, uint64 receiver)
+void Player::WhisperAddon(const std::string& text, const std::string& prefix, Player* receiver)
{
- Player* rPlayer = ObjectAccessor::FindPlayer(receiver);
-
std::string _text(text);
- sScriptMgr->OnPlayerChat(this, CHAT_MSG_WHISPER, LANG_UNIVERSAL, _text, rPlayer);
+ sScriptMgr->OnPlayerChat(this, CHAT_MSG_WHISPER, LANG_UNIVERSAL, _text, receiver);
+
+ if (!receiver->GetSession()->IsAddonRegistered(prefix))
+ return;
WorldPacket data(SMSG_MESSAGECHAT, 200);
BuildPlayerChat(&data, CHAT_MSG_WHISPER, _text, LANG_UNIVERSAL, prefix.c_str());
- rPlayer->GetSession()->SendPacket(&data);
+ receiver->GetSession()->SendPacket(&data);
}
void Player::Whisper(const std::string& text, uint32 language, uint64 receiver)
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index ccdea8654e8..d32b9e5b23f 100755
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1237,7 +1237,7 @@ class Player : public Unit, public GridObject<Player>
void Yell(const std::string& text, const uint32 language);
void TextEmote(const std::string& text);
void Whisper(const std::string& text, const uint32 language, uint64 receiver);
- void WhisperAddon(const std::string& text, const std::string& prefix, uint64 receiver);
+ void WhisperAddon(const std::string& text, const std::string& prefix, Player* receiver);
void BuildPlayerChat(WorldPacket* data, uint8 msgtype, const std::string& text, uint32 language, const char* addonPrefix = NULL) const;
/*********************************************************/
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index 34fa9f300ab..a6b63ac37da 100755
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -1581,6 +1581,21 @@ void Group::UpdatePlayerOutOfRange(Player* player)
}
}
+void Group::BroadcastAddonMessagePacket(WorldPacket* packet, const std::string& prefix, bool ignorePlayersInBGRaid, int group, uint64 ignore)
+{
+ for (GroupReference* itr = GetFirstMember(); itr != NULL; itr = itr->next())
+ {
+ Player* player = itr->getSource();
+ if (!player || (ignore != 0 && player->GetGUID() == ignore) || (ignorePlayersInBGRaid && player->GetGroup() != this))
+ continue;
+
+ if (WorldSession* session = player->GetSession())
+ if (session && (group == -1 || itr->getSubGroup() == group))
+ if (session->IsAddonRegistered(prefix))
+ session->SendPacket(packet);
+ }
+}
+
void Group::BroadcastPacket(WorldPacket* packet, bool ignorePlayersInBGRaid, int group, uint64 ignore)
{
for (GroupReference* itr = GetFirstMember(); itr != NULL; itr = itr->next())
diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h
index f909b755829..8676f2d81b1 100755
--- a/src/server/game/Groups/Group.h
+++ b/src/server/game/Groups/Group.h
@@ -268,7 +268,8 @@ class Group
void SendUpdateToPlayer(uint64 playerGUID, MemberSlot* slot = NULL);
void UpdatePlayerOutOfRange(Player* player);
// 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);
+ void BroadcastAddonMessagePacket(WorldPacket* packet, const std::string& prefix, bool ignorePlayersInBGRaid, int group, uint64 ignore);
void BroadcastReadyCheck(WorldPacket* packet);
void OfflineReadyCheck();
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index 66e0c968d2c..6e74180ae13 100644
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -2234,8 +2234,9 @@ void Guild::BroadcastAddonToGuild(WorldSession* session, bool officerOnly, const
for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
if (Player* player = itr->second->FindPlayer())
if (player->GetSession() && _HasRankRight(player, officerOnly ? GR_RIGHT_OFFCHATLISTEN : GR_RIGHT_GCHATLISTEN) &&
- !player->GetSocial()->HasIgnore(session->GetPlayer()->GetGUIDLow()))
- player->GetSession()->SendPacket(&data);
+ !player->GetSocial()->HasIgnore(session->GetPlayer()->GetGUIDLow()) &&
+ player->GetSession()->IsAddonRegistered(prefix))
+ player->GetSession()->SendPacket(&data);
}
}
diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp
index 8b994c2fedc..2b6f7b89b02 100644
--- a/src/server/game/Handlers/ChatHandler.cpp
+++ b/src/server/game/Handlers/ChatHandler.cpp
@@ -509,6 +509,46 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
}
}
+void WorldSession::HandleUnregisterAddonPrefixesOpcode(WorldPacket& /*recvPacket*/) // empty packet
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_UNREGISTER_ALL_ADDON_PREFIXES");
+
+ _registeredAddonPrefixes.clear();
+}
+
+void WorldSession::HandleAddonRegisteredPrefixesOpcode(WorldPacket& recvPacket)
+{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_ADDON_REGISTERED_PREFIXES");
+
+ // This is always sent after CMSG_UNREGISTER_ALL_ADDON_PREFIXES
+
+ uint32 count = recvPacket.ReadBits(25);
+
+ if (count > REGISTERED_ADDON_PREFIX_SOFTCAP)
+ {
+ // if we have hit the softcap (64) nothing should be filtered
+ _filterAddonMessages = false;
+ recvPacket.rfinish();
+ return;
+ }
+
+ std::vector<uint8> lengths(count);
+ for (uint32 i = 0; i < count; ++i)
+ lengths.push_back(recvPacket.ReadBits(5));
+
+ std::vector<std::string> prefixes(count);
+ for (uint32 i = 0; i < count; ++i)
+ _registeredAddonPrefixes.push_back(recvPacket.ReadString(lengths[i]));
+
+ if (_registeredAddonPrefixes.size() > REGISTERED_ADDON_PREFIX_SOFTCAP) // shouldn't happen
+ {
+ _filterAddonMessages = false;
+ return;
+ }
+
+ _filterAddonMessages = true;
+}
+
void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData)
{
Player* sender = GetPlayer();
@@ -601,7 +641,7 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData)
WorldPacket data;
ChatHandler::FillMessageData(&data, this, type, LANG_ADDON, "", 0, message.c_str(), NULL);
- group->BroadcastPacket(&data, false);
+ group->BroadcastAddonMessagePacket(&data, prefix, false);
break;
}
case CHAT_MSG_GUILD:
@@ -620,7 +660,7 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData)
if (!receiver)
break;
- sender->WhisperAddon(message, prefix, receiver->GetGUID());
+ sender->WhisperAddon(message, prefix, receiver);
break;
}
// Messages sent to "RAID" while in a party will get delivered to "PARTY"
@@ -634,7 +674,7 @@ void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData)
WorldPacket data;
ChatHandler::FillMessageData(&data, this, type, LANG_ADDON, "", 0, message.c_str(), NULL, prefix.c_str());
- group->BroadcastPacket(&data, true, -1, group->GetMemberGroup(sender->GetGUID()));
+ group->BroadcastAddonMessagePacket(&data, true, prefix, -1, group->GetMemberGroup(sender->GetGUID()));
break;
}
default:
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 89177ff269a..ff4f093463e 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -46,7 +46,7 @@ void InitOpcodes()
DEFINE_OPCODE_HANDLER(CMSG_ACCEPT_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAcceptTradeOpcode );
DEFINE_OPCODE_HANDLER(CMSG_ACTIVATETAXI, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleActivateTaxiOpcode );
DEFINE_OPCODE_HANDLER(CMSG_ACTIVATETAXIEXPRESS, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleActivateTaxiExpressOpcode );
- //DEFINE_OPCODE_HANDLER(CMSG_ADDON_REGISTERED_PREFIXES, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER(CMSG_ADDON_REGISTERED_PREFIXES, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::HandleAddonRegisteredPrefixesOpcode);
DEFINE_OPCODE_HANDLER(CMSG_ADD_FRIEND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAddFriendOpcode );
DEFINE_OPCODE_HANDLER(CMSG_ADD_IGNORE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAddIgnoreOpcode );
//DEFINE_OPCODE_HANDLER(CMSG_ADD_VOICE_IGNORE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -522,7 +522,7 @@ void InitOpcodes()
DEFINE_OPCODE_HANDLER(CMSG_UNACCEPT_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUnacceptTradeOpcode );
//DEFINE_OPCODE_HANDLER(CMSG_UNLEARN_SKILL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUnlearnSkillOpcode );
//DEFINE_OPCODE_HANDLER(CMSG_UNLEARN_SPECIALIZATION, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- //DEFINE_OPCODE_HANDLER(CMSG_UNREGISTER_ALL_ADDON_PREFIXES, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER(CMSG_UNREGISTER_ALL_ADDON_PREFIXES, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::HandleUnregisterAddonPrefixesOpcode);
DEFINE_OPCODE_HANDLER(CMSG_UPDATE_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateAccountData );
//DEFINE_OPCODE_HANDLER(CMSG_UPDATE_MISSILE_TRAJECTORY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateMissileTrajectory );
//DEFINE_OPCODE_HANDLER(CMSG_UPDATE_PROJECTILE_POSITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateProjectilePosition );
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index 87cd026c244..40726e0ab92 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -45,6 +45,9 @@
#include "Transport.h"
#include "WardenWin.h"
#include "WardenMac.h"
+#include <algorithm>
+#include <vector>
+#include <string>
bool MapSessionFilter::Process(WorldPacket* packet)
{
@@ -102,6 +105,7 @@ m_latency(0), m_TutorialsChanged(false), recruiterId(recruiter),
isRecruiter(isARecruiter), timeLastWhoCommand(0)
{
_warden = NULL;
+ _filterAddonMessages = false;
if (sock)
{
@@ -961,6 +965,19 @@ void WorldSession::SendAddonsInfo()
SendPacket(&data);
}
+bool WorldSession::IsAddonRegistered(const std::string& prefix) const
+{
+ if (!_filterAddonMessages) // if we have hit the softcap (64) nothing should be filtered
+ return true;
+
+ if (_registeredAddonPrefixes.empty())
+ return false;
+
+ std::vector<std::string>::iterator itr = std::find(_registeredAddonPrefixes.begin(), _registeredAddonPrefixes.end(), prefix);
+ return itr != _registeredAddonPrefixes.end();
+}
+
+
void WorldSession::SetPlayer(Player* player)
{
_player = player;
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 58ad4287ee8..96e7d4918d6 100755
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -77,6 +77,8 @@ enum AccountDataType
#define GLOBAL_CACHE_MASK 0x15
#define PER_CHARACTER_CACHE_MASK 0xEA
+#define REGISTERED_ADDON_PREFIX_SOFTCAP 64
+
struct AccountData
{
AccountData() : Time(0), Data("") {}
@@ -232,6 +234,7 @@ class WorldSession
void ReadAddonsInfo(WorldPacket& data);
void SendAddonsInfo();
+ bool IsAddonRegistered(const std::string& prefix) const;
void ReadMovementInfo(WorldPacket& data, MovementInfo* mi);
void WriteMovementInfo(WorldPacket &data, MovementInfo* mi);
@@ -385,14 +388,8 @@ class WorldSession
else
m_timeOutTime -= diff;
}
- void ResetTimeOutTime()
- {
- m_timeOutTime = sWorld->getIntConfig(CONFIG_SOCKET_TIMEOUTTIME);
- }
- bool IsConnectionIdle() const
- {
- return (m_timeOutTime <= 0 && !m_inQueue);
- }
+ void ResetTimeOutTime() { m_timeOutTime = sWorld->getIntConfig(CONFIG_SOCKET_TIMEOUTTIME); }
+ bool IsConnectionIdle() const { return (m_timeOutTime <= 0 && !m_inQueue); }
// Recruit-A-Friend Handling
uint32 GetRecruiterId() const { return recruiterId; }
@@ -712,6 +709,9 @@ class WorldSession
void HandleTextEmoteOpcode(WorldPacket& recvPacket);
void HandleChatIgnoredOpcode(WorldPacket& recvPacket);
+ void HandleUnregisterAddonPrefixesOpcode(WorldPacket& recvPacket);
+ void HandleAddonRegisteredPrefixesOpcode(WorldPacket& recvPacket);
+
void HandleReclaimCorpseOpcode(WorldPacket& recvPacket);
void HandleCorpseQueryOpcode(WorldPacket& recvPacket);
void HandleCorpseMapPositionQuery(WorldPacket& recvPacket);
@@ -1008,6 +1008,8 @@ class WorldSession
uint32 m_Tutorials[MAX_ACCOUNT_TUTORIAL_VALUES];
bool m_TutorialsChanged;
AddonsList m_addonsList;
+ std::vector<std::string> _registeredAddonPrefixes;
+ bool _filterAddonMessages;
uint32 recruiterId;
bool isRecruiter;
ACE_Based::LockedQueue<WorldPacket*, ACE_Thread_Mutex> _recvQueue;