mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-02-11 04:28:41 +01:00
Core/Chat: Disallow sending CMSG_MESSAGECHAT with CHAT_MSG_SAY, CHAT_MSG_EMOTE or CHAT_MSG_YELL while the sender is not alive.
Also replaced all WorldSession::_player calls by 'sender' By @TakenBacon
This commit is contained in:
@@ -67,6 +67,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
|
||||
recvData.rfinish();
|
||||
return;
|
||||
}
|
||||
|
||||
if (langDesc->skill_id != 0 && !sender->HasSkill(langDesc->skill_id))
|
||||
{
|
||||
// also check SPELL_AURA_COMPREHEND_LANGUAGE (client offers option to speak in that language)
|
||||
@@ -242,6 +243,10 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
|
||||
case CHAT_MSG_EMOTE:
|
||||
case CHAT_MSG_YELL:
|
||||
{
|
||||
// Prevent cheating
|
||||
if (!sender->IsAlive())
|
||||
return;
|
||||
|
||||
if (sender->getLevel() < sWorld->getIntConfig(CONFIG_CHAT_SAY_LEVEL_REQ))
|
||||
{
|
||||
SendNotification(GetTrinityString(LANG_SAY_REQ), sWorld->getIntConfig(CONFIG_CHAT_SAY_LEVEL_REQ));
|
||||
@@ -302,18 +307,18 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
|
||||
Group* group = GetPlayer()->GetOriginalGroup();
|
||||
if (!group)
|
||||
{
|
||||
group = _player->GetGroup();
|
||||
group = sender->GetGroup();
|
||||
if (!group || group->isBGGroup())
|
||||
return;
|
||||
}
|
||||
|
||||
if (type == CHAT_MSG_PARTY_LEADER && !group->IsLeader(_player->GetGUID()))
|
||||
if (type == CHAT_MSG_PARTY_LEADER && !group->IsLeader(sender->GetGUID()))
|
||||
return;
|
||||
|
||||
sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
|
||||
|
||||
WorldPacket data;
|
||||
ChatHandler::BuildChatPacket(data, ChatMsg(type), Language(lang), _player, NULL, msg);
|
||||
ChatHandler::BuildChatPacket(data, ChatMsg(type), Language(lang), sender, NULL, msg);
|
||||
group->BroadcastPacket(&data, false, group->GetMemberGroup(GetPlayer()->GetGUID()));
|
||||
} break;
|
||||
case CHAT_MSG_GUILD:
|
||||
@@ -354,7 +359,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
|
||||
sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
|
||||
|
||||
WorldPacket data;
|
||||
ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID, Language(lang), _player, NULL, msg);
|
||||
ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID, Language(lang), sender, NULL, msg);
|
||||
group->BroadcastPacket(&data, false);
|
||||
} break;
|
||||
case CHAT_MSG_RAID_LEADER:
|
||||
@@ -364,14 +369,14 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
|
||||
if (!group)
|
||||
{
|
||||
group = GetPlayer()->GetGroup();
|
||||
if (!group || group->isBGGroup() || !group->isRaidGroup() || !group->IsLeader(_player->GetGUID()))
|
||||
if (!group || group->isBGGroup() || !group->isRaidGroup() || !group->IsLeader(sender->GetGUID()))
|
||||
return;
|
||||
}
|
||||
|
||||
sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
|
||||
|
||||
WorldPacket data;
|
||||
ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID_LEADER, Language(lang), _player, NULL, msg);
|
||||
ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID_LEADER, Language(lang), sender, NULL, msg);
|
||||
group->BroadcastPacket(&data, false);
|
||||
} break;
|
||||
case CHAT_MSG_RAID_WARNING:
|
||||
@@ -384,7 +389,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
|
||||
|
||||
WorldPacket data;
|
||||
//in battleground, raid warning is sent only to players in battleground - code is ok
|
||||
ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID_WARNING, Language(lang), _player, NULL, msg);
|
||||
ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID_WARNING, Language(lang), sender, NULL, msg);
|
||||
group->BroadcastPacket(&data, false);
|
||||
} break;
|
||||
case CHAT_MSG_BATTLEGROUND:
|
||||
@@ -397,7 +402,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
|
||||
sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
|
||||
|
||||
WorldPacket data;
|
||||
ChatHandler::BuildChatPacket(data, CHAT_MSG_BATTLEGROUND, Language(lang), _player, NULL, msg);
|
||||
ChatHandler::BuildChatPacket(data, CHAT_MSG_BATTLEGROUND, Language(lang), sender, NULL, msg);
|
||||
group->BroadcastPacket(&data, false);
|
||||
} break;
|
||||
case CHAT_MSG_BATTLEGROUND_LEADER:
|
||||
@@ -410,74 +415,74 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
|
||||
sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
|
||||
|
||||
WorldPacket data;
|
||||
ChatHandler::BuildChatPacket(data, CHAT_MSG_BATTLEGROUND_LEADER, Language(lang), _player, NULL, msg);;
|
||||
ChatHandler::BuildChatPacket(data, CHAT_MSG_BATTLEGROUND_LEADER, Language(lang), sender, NULL, msg);;
|
||||
group->BroadcastPacket(&data, false);
|
||||
} break;
|
||||
case CHAT_MSG_CHANNEL:
|
||||
{
|
||||
if (!HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHAT_CHANNEL_REQ))
|
||||
{
|
||||
if (_player->getLevel() < sWorld->getIntConfig(CONFIG_CHAT_CHANNEL_LEVEL_REQ))
|
||||
if (sender->getLevel() < sWorld->getIntConfig(CONFIG_CHAT_CHANNEL_LEVEL_REQ))
|
||||
{
|
||||
SendNotification(GetTrinityString(LANG_CHANNEL_REQ), sWorld->getIntConfig(CONFIG_CHAT_CHANNEL_LEVEL_REQ));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (ChannelMgr* cMgr = ChannelMgr::forTeam(_player->GetTeam()))
|
||||
if (ChannelMgr* cMgr = ChannelMgr::forTeam(sender->GetTeam()))
|
||||
{
|
||||
if (Channel* chn = cMgr->GetChannel(channel, _player))
|
||||
if (Channel* chn = cMgr->GetChannel(channel, sender))
|
||||
{
|
||||
sScriptMgr->OnPlayerChat(_player, type, lang, msg, chn);
|
||||
chn->Say(_player->GetGUID(), msg.c_str(), lang);
|
||||
sScriptMgr->OnPlayerChat(sender, type, lang, msg, chn);
|
||||
chn->Say(sender->GetGUID(), msg.c_str(), lang);
|
||||
}
|
||||
}
|
||||
} break;
|
||||
case CHAT_MSG_AFK:
|
||||
{
|
||||
if (!_player->IsInCombat())
|
||||
if (!sender->IsInCombat())
|
||||
{
|
||||
if (_player->isAFK()) // Already AFK
|
||||
if (sender->isAFK()) // Already AFK
|
||||
{
|
||||
if (msg.empty())
|
||||
_player->ToggleAFK(); // Remove AFK
|
||||
sender->ToggleAFK(); // Remove AFK
|
||||
else
|
||||
_player->autoReplyMsg = msg; // Update message
|
||||
sender->autoReplyMsg = msg; // Update message
|
||||
}
|
||||
else // New AFK mode
|
||||
{
|
||||
_player->autoReplyMsg = msg.empty() ? GetTrinityString(LANG_PLAYER_AFK_DEFAULT) : msg;
|
||||
sender->autoReplyMsg = msg.empty() ? GetTrinityString(LANG_PLAYER_AFK_DEFAULT) : msg;
|
||||
|
||||
if (_player->isDND())
|
||||
_player->ToggleDND();
|
||||
if (sender->isDND())
|
||||
sender->ToggleDND();
|
||||
|
||||
_player->ToggleAFK();
|
||||
sender->ToggleAFK();
|
||||
}
|
||||
|
||||
sScriptMgr->OnPlayerChat(_player, type, lang, msg);
|
||||
sScriptMgr->OnPlayerChat(sender, type, lang, msg);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case CHAT_MSG_DND:
|
||||
{
|
||||
if (_player->isDND()) // Already DND
|
||||
if (sender->isDND()) // Already DND
|
||||
{
|
||||
if (msg.empty())
|
||||
_player->ToggleDND(); // Remove DND
|
||||
sender->ToggleDND(); // Remove DND
|
||||
else
|
||||
_player->autoReplyMsg = msg; // Update message
|
||||
sender->autoReplyMsg = msg; // Update message
|
||||
}
|
||||
else // New DND mode
|
||||
{
|
||||
_player->autoReplyMsg = msg.empty() ? GetTrinityString(LANG_PLAYER_DND_DEFAULT) : msg;
|
||||
sender->autoReplyMsg = msg.empty() ? GetTrinityString(LANG_PLAYER_DND_DEFAULT) : msg;
|
||||
|
||||
if (_player->isAFK())
|
||||
_player->ToggleAFK();
|
||||
if (sender->isAFK())
|
||||
sender->ToggleAFK();
|
||||
|
||||
_player->ToggleDND();
|
||||
sender->ToggleDND();
|
||||
}
|
||||
|
||||
sScriptMgr->OnPlayerChat(_player, type, lang, msg);
|
||||
sScriptMgr->OnPlayerChat(sender, type, lang, msg);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
||||
Reference in New Issue
Block a user