aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorleak <leakzx@googlemail.com>2011-08-13 15:10:45 +0200
committerleak <leakzx@googlemail.com>2011-08-13 15:10:45 +0200
commitaf040fc18d500c0aa16e65efb76d00e4b1e5ea42 (patch)
tree7f37783999119498e95d55ca2699285de20076c9 /src
parent6db242473ea83313e143d45153b8a097f25acc97 (diff)
Core/Players: Allow players to answer gamemaster whispers even if whispers are disabled. Whitelist can be reset by .whispers off
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Chat/Commands/Level1.cpp2
-rwxr-xr-xsrc/server/game/Entities/Player/Player.cpp10
-rwxr-xr-xsrc/server/game/Entities/Player/Player.h8
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/ChatHandler.cpp56
4 files changed, 52 insertions, 24 deletions
diff --git a/src/server/game/Chat/Commands/Level1.cpp b/src/server/game/Chat/Commands/Level1.cpp
index 74300e5d02f..7a742765b0f 100755
--- a/src/server/game/Chat/Commands/Level1.cpp
+++ b/src/server/game/Chat/Commands/Level1.cpp
@@ -610,6 +610,8 @@ bool ChatHandler::HandleWhispersCommand(const char* args)
// whisper off
if (argstr == "off")
{
+ // Remove all players from the Gamemaster's whisper whitelist
+ m_session->GetPlayer()->ClearWhisperWhiteList();
m_session->GetPlayer()->SetAcceptWhispers(false);
SendSysMessage(LANG_COMMAND_WHISPEROFF);
return true;
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 37515be5685..9d1b93f27e9 100755
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -24663,3 +24663,13 @@ void Player::_SaveInstanceTimeRestrictions(SQLTransaction& trans)
trans->Append(stmt);
}
}
+
+bool Player::IsInWhipserWhiteList(uint64 guid)
+{
+ for (WhisperListContainer::const_iterator itr = WhisperList.begin(); itr != WhisperList.end(); ++itr)
+ {
+ if (*itr == guid)
+ return true;
+ }
+ return false;
+}
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 881aade9b9f..9f58f0022e9 100755
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -128,6 +128,8 @@ typedef UNORDERED_MAP<uint32, PlayerTalent*> PlayerTalentMap;
typedef UNORDERED_MAP<uint32, PlayerSpell*> PlayerSpellMap;
typedef std::list<SpellModifier*> SpellModList;
+typedef std::list<uint64> WhisperListContainer;
+
struct SpellCooldown
{
time_t end;
@@ -2467,7 +2469,13 @@ class Player : public Unit, public GridObject<Player>
float GetAverageItemLevel();
bool isDebugAreaTriggers;
+ void ClearWhisperWhiteList() { WhisperList.clear(); }
+ void AddWhisperWhiteList(uint64 guid) { WhisperList.push_back(guid); }
+ bool IsInWhipserWhiteList(uint64 guid);
+
protected:
+ // Gamemaster whisper whitelist
+ WhisperListContainer WhisperList;
uint32 m_regenTimerCount;
float m_powerFraction[MAX_POWERS];
uint32 m_contestedPvPTimer;
diff --git a/src/server/game/Server/Protocol/Handlers/ChatHandler.cpp b/src/server/game/Server/Protocol/Handlers/ChatHandler.cpp
index eb238d4b9f4..c7e6c7b1320 100755
--- a/src/server/game/Server/Protocol/Handlers/ChatHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/ChatHandler.cpp
@@ -76,6 +76,8 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data)
return;
}
+ Player* sender = GetPlayer();
+
//sLog->outDebug("CHAT: packet received. type %u, lang %u", type, lang);
// prevent talking at unknown language (cheating)
@@ -85,10 +87,10 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data)
SendNotification(LANG_UNKNOWN_LANGUAGE);
return;
}
- if (langDesc->skill_id != 0 && !_player->HasSkill(langDesc->skill_id))
+ if (langDesc->skill_id != 0 && !sender->HasSkill(langDesc->skill_id))
{
// also check SPELL_AURA_COMPREHEND_LANGUAGE (client offers option to speak in that language)
- Unit::AuraEffectList const& langAuras = _player->GetAuraEffectsByType(SPELL_AURA_COMPREHEND_LANGUAGE);
+ Unit::AuraEffectList const& langAuras = sender->GetAuraEffectsByType(SPELL_AURA_COMPREHEND_LANGUAGE);
bool foundAura = false;
for (Unit::AuraEffectList::const_iterator i = langAuras.begin(); i != langAuras.end(); ++i)
{
@@ -115,7 +117,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data)
if (msg.empty())
return;
- sScriptMgr->OnPlayerChat(GetPlayer(), uint32(CHAT_MSG_ADDON), lang, msg);
+ sScriptMgr->OnPlayerChat(sender, uint32(CHAT_MSG_ADDON), lang, msg);
}
// Disabled addon channel?
@@ -126,7 +128,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data)
else
{
// send in universal language if player in .gmon mode (ignore spell effects)
- if (_player->isGameMaster())
+ if (sender->isGameMaster())
lang = LANG_UNIVERSAL;
else
{
@@ -156,12 +158,12 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data)
}
// but overwrite it by SPELL_AURA_MOD_LANGUAGE auras (only single case used)
- Unit::AuraEffectList const& ModLangAuras = _player->GetAuraEffectsByType(SPELL_AURA_MOD_LANGUAGE);
+ Unit::AuraEffectList const& ModLangAuras = sender->GetAuraEffectsByType(SPELL_AURA_MOD_LANGUAGE);
if (!ModLangAuras.empty())
lang = ModLangAuras.front()->GetMiscValue();
}
- if (!_player->CanSpeak())
+ if (!sender->CanSpeak())
{
std::string timeStr = secsToTimeString(m_muteTime - time(NULL));
SendNotification(GetTrinityString(LANG_WAIT_BEFORE_SPEAKING), timeStr.c_str());
@@ -169,15 +171,15 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data)
}
if (type != CHAT_MSG_AFK && type != CHAT_MSG_DND)
- GetPlayer()->UpdateSpeakTime();
+ sender->UpdateSpeakTime();
}
- if (GetPlayer()->HasAura(1852) && type != CHAT_MSG_WHISPER)
+ if (sender->HasAura(1852) && type != CHAT_MSG_WHISPER)
{
std::string msg="";
recv_data >> msg;
- SendNotification(GetTrinityString(LANG_GM_SILENCE), GetPlayer()->GetName());
+ SendNotification(GetTrinityString(LANG_GM_SILENCE), sender->GetName());
return;
}
@@ -235,22 +237,22 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data)
case CHAT_MSG_EMOTE:
case CHAT_MSG_YELL:
{
- if (_player->getLevel() < sWorld->getIntConfig(CONFIG_CHAT_SAY_LEVEL_REQ))
+ if (sender->getLevel() < sWorld->getIntConfig(CONFIG_CHAT_SAY_LEVEL_REQ))
{
SendNotification(GetTrinityString(LANG_SAY_REQ), sWorld->getIntConfig(CONFIG_CHAT_SAY_LEVEL_REQ));
return;
}
if (type == CHAT_MSG_SAY)
- GetPlayer()->Say(msg, lang);
+ sender->Say(msg, lang);
else if (type == CHAT_MSG_EMOTE)
- GetPlayer()->TextEmote(msg);
+ sender->TextEmote(msg);
else if (type == CHAT_MSG_YELL)
- GetPlayer()->Yell(msg, lang);
+ sender->Yell(msg, lang);
} break;
case CHAT_MSG_WHISPER:
{
- if (_player->getLevel() < sWorld->getIntConfig(CONFIG_CHAT_WHISPER_LEVEL_REQ))
+ if (sender->getLevel() < sWorld->getIntConfig(CONFIG_CHAT_WHISPER_LEVEL_REQ))
{
SendNotification(GetTrinityString(LANG_WHISPER_REQ), sWorld->getIntConfig(CONFIG_CHAT_WHISPER_LEVEL_REQ));
return;
@@ -262,33 +264,39 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data)
break;
}
- Player* player = sObjectAccessor->FindPlayerByName(to.c_str());
- uint32 tSecurity = GetSecurity();
- uint32 pSecurity = player ? player->GetSession()->GetSecurity() : SEC_PLAYER;
- if (!player || (tSecurity == SEC_PLAYER && pSecurity > SEC_PLAYER && !player->isAcceptWhispers()))
+ Player* receiver = sObjectAccessor->FindPlayerByName(to.c_str());
+ uint32 senderSecurity = GetSecurity();
+ uint32 receiverSecurity = receiver ? receiver->GetSession()->GetSecurity() : SEC_PLAYER;
+ if (!receiver || (senderSecurity == SEC_PLAYER && receiverSecurity > SEC_PLAYER && !receiver->isAcceptWhispers() && !receiver->IsInWhipserWhiteList(sender->GetGUID())))
{
SendPlayerNotFoundNotice(to);
return;
}
- if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT) && tSecurity == SEC_PLAYER && pSecurity == SEC_PLAYER)
+ if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT) && senderSecurity == SEC_PLAYER && receiverSecurity == SEC_PLAYER)
{
- uint32 sidea = GetPlayer()->GetTeam();
- uint32 sideb = player->GetTeam();
- if (sidea != sideb)
+ uint32 senderFaction = GetPlayer()->GetTeam();
+ uint32 receiverFaction = receiver->GetTeam();
+ if (senderFaction != receiverFaction)
{
SendWrongFactionNotice();
return;
}
}
- if (GetPlayer()->HasAura(1852) && !player->isGameMaster())
+ if (GetPlayer()->HasAura(1852) && !receiver->isGameMaster())
{
SendNotification(GetTrinityString(LANG_GM_SILENCE), GetPlayer()->GetName());
return;
}
- GetPlayer()->Whisper(msg, lang, player->GetGUID());
+ // If player is a Gamemaster and doesn't accept whisper, we auto-whitelist every player that the Gamemaster is talking to
+ if (sender->GetSession()->GetSecurity() > SEC_PLAYER && !sender->isAcceptWhispers() && !sender->IsInWhipserWhiteList(receiver->GetGUID()))
+ {
+ sender->AddWhisperWhiteList(receiver->GetGUID());
+ }
+
+ GetPlayer()->Whisper(msg, lang, receiver->GetGUID());
} break;
case CHAT_MSG_PARTY:
case CHAT_MSG_PARTY_LEADER: