TrinityCore
Loading...
Searching...
No Matches
ChatHandler.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "WorldSession.h"
19#include "AccountMgr.h"
20#include "CellImpl.h"
21#include "Common.h"
22#include "Channel.h"
23#include "ChannelMgr.h"
24#include "Chat.h"
25#include "ChatPackets.h"
26#include "DatabaseEnv.h"
27#include "DBCStores.h"
28#include "GameTime.h"
29#include "GridNotifiersImpl.h"
30#include "Group.h"
31#include "Guild.h"
32#include "GuildMgr.h"
33#include "Language.h"
34#include "Log.h"
35#include "ObjectAccessor.h"
36#include "ObjectMgr.h"
37#include "Opcodes.h"
38#include "Player.h"
39#include "ScriptMgr.h"
40#include "SpellAuraEffects.h"
41#include "Util.h"
42#include "Warden.h"
43#include "World.h"
44#include "WorldPacket.h"
45#include <algorithm>
46
47inline bool isNasty(uint8 c)
48{
49 if (c == '\t')
50 return false;
51 if (c <= '\037') // ASCII control block
52 return true;
53 return false;
54}
55
57{
58 uint32 type;
59 uint32 lang;
60
61 recvData >> type;
62 recvData >> lang;
63
64 if (type >= MAX_CHAT_MSG_TYPE)
65 {
66 TC_LOG_ERROR("network", "CHAT: Wrong message type received: {}", type);
67 recvData.rfinish();
68 return;
69 }
70
71 if (lang == LANG_UNIVERSAL && type != CHAT_MSG_AFK && type != CHAT_MSG_DND)
72 {
73 TC_LOG_ERROR("entities.player.cheat", "CMSG_MESSAGECHAT: Possible hacking-attempt: {} tried to send a message in universal language", GetPlayerInfo());
75 recvData.rfinish();
76 return;
77 }
78
79 Player* sender = GetPlayer();
80
81 //TC_LOG_DEBUG("CHAT: packet received. type {}, lang {}", type, lang);
82
83 // prevent talking at unknown language (cheating)
84 LanguageDesc const* langDesc = GetLanguageDescByID(lang);
85 if (!langDesc)
86 {
88 recvData.rfinish();
89 return;
90 }
91
92 if (langDesc->skill_id != 0 && !sender->HasSkill(langDesc->skill_id))
93 {
94 // also check SPELL_AURA_COMPREHEND_LANGUAGE (client offers option to speak in that language)
96 bool foundAura = false;
97 for (Unit::AuraEffectList::const_iterator i = langAuras.begin(); i != langAuras.end(); ++i)
98 {
99 if ((*i)->GetMiscValue() == int32(lang))
100 {
101 foundAura = true;
102 break;
103 }
104 }
105 if (!foundAura)
106 {
108 recvData.rfinish();
109 return;
110 }
111 }
112
113 if (lang == LANG_ADDON)
114 {
115 // LANG_ADDON is only valid for the following message types
116 switch (type)
117 {
118 case CHAT_MSG_PARTY:
119 case CHAT_MSG_RAID:
120 case CHAT_MSG_GUILD:
122 case CHAT_MSG_WHISPER:
123 // check if addon messages are disabled
124 if (!sWorld->getBoolConfig(CONFIG_ADDON_CHANNEL))
125 {
126 recvData.rfinish();
127 return;
128 }
129 break;
130 default:
131 TC_LOG_ERROR("network", "Player {} {} sent a chatmessage with an invalid language/message type combination",
132 GetPlayer()->GetName(), GetPlayer()->GetGUID().ToString());
133
134 recvData.rfinish();
135 return;
136 }
137 }
138 else
139 {
140 // send in universal language if player in .gm on mode (ignore spell effects)
141 if (sender->IsGameMaster())
142 lang = LANG_UNIVERSAL;
143 else
144 {
146 if (!ModLangAuras.empty())
147 lang = ModLangAuras.front()->GetMiscValue();
149 lang = LANG_UNIVERSAL;
150 else
151 {
152 switch (type)
153 {
154 case CHAT_MSG_PARTY:
156 case CHAT_MSG_RAID:
159 // allow two side chat at group channel if two side group allowed
161 lang = LANG_UNIVERSAL;
162 break;
163 case CHAT_MSG_GUILD:
164 case CHAT_MSG_OFFICER:
165 // allow two side chat at guild channel if two side guild allowed
167 lang = LANG_UNIVERSAL;
168 break;
169 }
170 }
171 }
172 }
173
174 if (!CanSpeak())
175 {
176 std::string timeStr = secsToTimeString(m_muteTime - GameTime::GetGameTime());
178 recvData.rfinish(); // Prevent warnings
179 return;
180 }
181
182 if (type != CHAT_MSG_AFK && type != CHAT_MSG_DND)
184
185 if (sender->HasAura(1852) && type != CHAT_MSG_WHISPER)
186 {
188 recvData.rfinish();
189 return;
190 }
191
192 std::string to, channel, msg;
193 switch (type)
194 {
195 case CHAT_MSG_SAY:
196 case CHAT_MSG_EMOTE:
197 case CHAT_MSG_YELL:
198 case CHAT_MSG_PARTY:
200 case CHAT_MSG_GUILD:
201 case CHAT_MSG_OFFICER:
202 case CHAT_MSG_RAID:
207 case CHAT_MSG_AFK:
208 case CHAT_MSG_DND:
209 msg = recvData.ReadCString(lang != LANG_ADDON);
210 break;
211 case CHAT_MSG_WHISPER:
212 recvData >> to;
213 msg = recvData.ReadCString(lang != LANG_ADDON);
214 break;
215 case CHAT_MSG_CHANNEL:
216 recvData >> channel;
217 msg = recvData.ReadCString(lang != LANG_ADDON);
218 break;
219 }
220
221 if (msg.size() > 255)
222 return;
223
224 // Our Warden module also uses SendAddonMessage as a way to communicate Lua check results to the server, see if this is that
225 if ((type == CHAT_MSG_GUILD) && (lang == LANG_ADDON))
226 {
227 if (_warden && _warden->ProcessLuaCheckResponse(msg))
228 return;
229 }
230
231 // no chat commands in AFK/DND autoreply, and it can be empty
232 if (!(type == CHAT_MSG_AFK || type == CHAT_MSG_DND))
233 {
234 if (msg.empty())
235 return;
236 if (lang == LANG_ADDON)
237 {
238 if (AddonChannelCommandHandler(this).ParseCommands(msg.c_str()))
239 return;
240 }
241 else
242 {
243 if (ChatHandler(this).ParseCommands(msg.c_str()))
244 return;
245 }
246 }
247
248 // do message validity checks
249 if (lang != LANG_ADDON)
250 {
251 // cut at the first newline or carriage return
252 std::string::size_type pos = msg.find_first_of("\n\r");
253 if (pos == 0)
254 return;
255 else if (pos != std::string::npos)
256 msg.erase(pos);
257
258 // abort on any sort of nasty character
259 for (uint8 c : msg)
260 if (isNasty(c))
261 {
262 TC_LOG_ERROR("network", "Player {} {} sent a message containing invalid character {} - blocked", GetPlayer()->GetName(),
263 GetPlayer()->GetGUID().ToString(), uint8(c));
264 return;
265 }
266
267 // collapse multiple spaces into one
269 {
270 auto end = std::unique(msg.begin(), msg.end(), [](char c1, char c2) { return (c1 == ' ') && (c2 == ' '); });
271 msg.erase(end, msg.end());
272 }
273
274 // validate hyperlinks
276 return;
277 }
278
279 switch (type)
280 {
281 case CHAT_MSG_SAY:
282 {
283 // Prevent cheating
284 if (!sender->IsAlive())
285 return;
286
287 if (sender->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_SAY_LEVEL_REQ))
288 {
290 return;
291 }
292
293 sender->Say(msg, Language(lang));
294 break;
295 }
296 case CHAT_MSG_EMOTE:
297 {
298 // Prevent cheating
299 if (!sender->IsAlive())
300 return;
301
302 if (sender->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_EMOTE_LEVEL_REQ))
303 {
305 return;
306 }
307
308 sender->TextEmote(msg);
309 break;
310 }
311 case CHAT_MSG_YELL:
312 {
313 // Prevent cheating
314 if (!sender->IsAlive())
315 return;
316
317 if (sender->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_YELL_LEVEL_REQ))
318 {
320 return;
321 }
322
323 sender->Yell(msg, Language(lang));
324 break;
325 }
326 case CHAT_MSG_WHISPER:
327 {
328 if (!normalizePlayerName(to))
329 {
331 break;
332 }
333
335 if (!receiver || (lang != LANG_ADDON && !receiver->isAcceptWhispers() && receiver->GetSession()->HasPermission(rbac::RBAC_PERM_CAN_FILTER_WHISPERS) && !receiver->IsInWhisperWhiteList(sender->GetGUID())))
336 {
338 return;
339 }
340
341 // Apply checks only if receiver is not already in whitelist and if receiver is not a GM with ".whisper on"
342 if (!receiver->IsInWhisperWhiteList(sender->GetGUID()) && !receiver->IsGameMasterAcceptingWhispers())
343 {
344 if (!sender->IsGameMaster() && sender->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_WHISPER_LEVEL_REQ))
345 {
347 return;
348 }
349
351 {
353 return;
354 }
355 }
356
357 if (GetPlayer()->HasAura(1852) && !receiver->IsGameMaster())
358 {
360 return;
361 }
362
363 // If player is a Gamemaster and doesn't accept whisper, we auto-whitelist every player that the Gamemaster is talking to
364 // We also do that if a player is under the required level for whispers.
365 if (receiver->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_WHISPER_LEVEL_REQ) ||
367 sender->AddWhisperWhiteList(receiver->GetGUID());
368
369 if (lang == LANG_ADDON)
370 GetPlayer()->WhisperAddon(msg, receiver);
371 else
372 GetPlayer()->Whisper(msg, Language(lang), receiver);
373 break;
374 }
375 case CHAT_MSG_PARTY:
377 {
378 // if player is in battleground, he cannot say to battleground members by /p
379 Group* group = GetPlayer()->GetOriginalGroup();
380 if (!group)
381 {
382 group = sender->GetGroup();
383 if (!group || group->isBGGroup())
384 return;
385 }
386
387 // control LEADER messages on the server
388 // in a scenario where player has both Group and OriginalGroup,
389 // client will incorrectly send LEADER type when sending message to OriginalGroup while being a leader in regular group
390 type = group->IsLeader(sender->GetGUID()) ? CHAT_MSG_PARTY_LEADER : CHAT_MSG_PARTY;
391
392 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
393
394 WorldPacket data;
395 ChatHandler::BuildChatPacket(data, ChatMsg(type), Language(lang), sender, nullptr, msg);
396 group->BroadcastPacket(&data, false, group->GetMemberGroup(GetPlayer()->GetGUID()));
397 break;
398 }
399 case CHAT_MSG_GUILD:
400 {
401 if (GetPlayer()->GetGuildId())
402 {
403 if (Guild* guild = sGuildMgr->GetGuildById(GetPlayer()->GetGuildId()))
404 {
405 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, guild);
406
407 guild->BroadcastToGuild(this, false, msg, lang == LANG_ADDON ? LANG_ADDON : LANG_UNIVERSAL);
408 }
409 }
410 break;
411 }
412 case CHAT_MSG_OFFICER:
413 {
414 if (GetPlayer()->GetGuildId())
415 {
416 if (Guild* guild = sGuildMgr->GetGuildById(GetPlayer()->GetGuildId()))
417 {
418 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, guild);
419
420 guild->BroadcastToGuild(this, true, msg, lang == LANG_ADDON ? LANG_ADDON : LANG_UNIVERSAL);
421 }
422 }
423 break;
424 }
425 case CHAT_MSG_RAID:
426 {
427 // if player is in battleground, he cannot say to battleground members by /ra
428 Group* group = GetPlayer()->GetOriginalGroup();
429 if (!group)
430 {
431 group = GetPlayer()->GetGroup();
432 if (!group || group->isBGGroup() || !group->isRaidGroup())
433 return;
434 }
435
436 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
437
438 WorldPacket data;
439 ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID, Language(lang), sender, nullptr, msg);
440 group->BroadcastPacket(&data, false);
441 break;
442 }
444 {
445 // if player is in battleground, he cannot say to battleground members by /ra
446 Group* group = GetPlayer()->GetOriginalGroup();
447 if (!group)
448 {
449 group = GetPlayer()->GetGroup();
450 if (!group || group->isBGGroup() || !group->isRaidGroup() || !group->IsLeader(sender->GetGUID()))
451 return;
452 }
453
454 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
455
456 WorldPacket data;
457 ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID_LEADER, Language(lang), sender, nullptr, msg);
458 group->BroadcastPacket(&data, false);
459 break;
460 }
462 {
463 Group* group = GetPlayer()->GetGroup();
464 if (!group || !(group->isRaidGroup() || sWorld->getBoolConfig(CONFIG_CHAT_PARTY_RAID_WARNINGS)) || !(group->IsLeader(GetPlayer()->GetGUID()) || group->IsAssistant(GetPlayer()->GetGUID())) || group->isBGGroup())
465 return;
466
467 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
468
469 WorldPacket data;
470 //in battleground, raid warning is sent only to players in battleground - code is ok
471 ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID_WARNING, Language(lang), sender, nullptr, msg);
472 group->BroadcastPacket(&data, false);
473 break;
474 }
476 {
477 //battleground raid is always in Player->GetGroup(), never in GetOriginalGroup()
478 Group* group = GetPlayer()->GetGroup();
479 if (!group || !group->isBGGroup())
480 return;
481
482 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
483
484 WorldPacket data;
485 ChatHandler::BuildChatPacket(data, CHAT_MSG_BATTLEGROUND, Language(lang), sender, nullptr, msg);
486 group->BroadcastPacket(&data, false);
487 break;
488 }
490 {
491 // battleground raid is always in Player->GetGroup(), never in GetOriginalGroup()
492 Group* group = GetPlayer()->GetGroup();
493 if (!group || !group->isBGGroup() || !group->IsLeader(GetPlayer()->GetGUID()))
494 return;
495
496 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
497
498 WorldPacket data;
499 ChatHandler::BuildChatPacket(data, CHAT_MSG_BATTLEGROUND_LEADER, Language(lang), sender, nullptr, msg);;
500 group->BroadcastPacket(&data, false);
501 break;
502 }
503 case CHAT_MSG_CHANNEL:
504 {
506 {
507 if (sender->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_CHANNEL_LEVEL_REQ))
508 {
510 return;
511 }
512 }
513
514 if (Channel* chn = ChannelMgr::GetChannelForPlayerByNamePart(channel, sender))
515 {
516 sScriptMgr->OnPlayerChat(sender, type, lang, msg, chn);
517 chn->Say(sender->GetGUID(), msg, lang);
518 }
519 break;
520 }
521 case CHAT_MSG_AFK:
522 {
523 if (!sender->IsInCombat())
524 {
525 if (sender->isAFK()) // Already AFK
526 {
527 if (msg.empty())
528 sender->ToggleAFK(); // Remove AFK
529 else
530 sender->autoReplyMsg = msg; // Update message
531 }
532 else // New AFK mode
533 {
534 sender->autoReplyMsg = msg.empty() ? GetTrinityString(LANG_PLAYER_AFK_DEFAULT) : msg;
535
536 if (sender->isDND())
537 sender->ToggleDND();
538
539 sender->ToggleAFK();
540 }
541
542 sScriptMgr->OnPlayerChat(sender, type, lang, msg);
543 }
544 break;
545 }
546 case CHAT_MSG_DND:
547 {
548 if (sender->isDND()) // Already DND
549 {
550 if (msg.empty())
551 sender->ToggleDND(); // Remove DND
552 else
553 sender->autoReplyMsg = msg; // Update message
554 }
555 else // New DND mode
556 {
557 sender->autoReplyMsg = msg.empty() ? GetTrinityString(LANG_PLAYER_DND_DEFAULT) : msg;
558
559 if (sender->isAFK())
560 sender->ToggleAFK();
561
562 sender->ToggleDND();
563 }
564
565 sScriptMgr->OnPlayerChat(sender, type, lang, msg);
566 break;
567 }
568 default:
569 TC_LOG_ERROR("network", "CHAT: unknown message type {}, lang: {}", type, lang);
570 break;
571 }
572}
573
575{
576 Emote emoteId = static_cast<Emote>(packet.EmoteID);
577
578 // restrict to the only emotes hardcoded in client
579 if (emoteId != EMOTE_ONESHOT_NONE && emoteId != EMOTE_ONESHOT_WAVE)
580 return;
581
583 return;
584
585 sScriptMgr->OnPlayerEmote(_player, emoteId);
586 _player->HandleEmoteCommand(emoteId);
587}
588
589namespace Trinity
590{
592 {
593 public:
594 EmoteChatBuilder(Player const& player, uint32 text_emote, uint32 emote_num, Unit const* target)
595 : i_player(player), i_text_emote(text_emote), i_emote_num(emote_num), i_target(target) { }
596
598 {
599 std::string const name(i_target ? i_target->GetNameForLocaleIdx(loc_idx) : "");
600 uint32 namlen = name.size();
601
602 data.Initialize(SMSG_TEXT_EMOTE, 20 + namlen);
603 data << i_player.GetGUID();
604 data << uint32(i_text_emote);
605 data << uint32(i_emote_num);
606 data << uint32(namlen);
607 if (namlen > 1)
608 data << name;
609 else
610 data << uint8(0x00);
611 }
612
613 private:
618 };
619} // namespace Trinity
620
622{
623 if (!GetPlayer()->IsAlive())
624 return;
625
626 if (!CanSpeak())
627 {
628 std::string timeStr = secsToTimeString(m_muteTime - GameTime::GetGameTime());
630 return;
631 }
632
633 uint32 text_emote, emoteNum;
634 ObjectGuid guid;
635
636 recvData >> text_emote;
637 recvData >> emoteNum;
638 recvData >> guid;
639
640 sScriptMgr->OnPlayerTextEmote(GetPlayer(), text_emote, emoteNum, guid);
641
642 EmotesTextEntry const* em = sEmotesTextStore.LookupEntry(text_emote);
643 if (!em)
644 return;
645
646 Emote emote = static_cast<Emote>(em->EmoteID);
647
648 switch (emote)
649 {
651 case EMOTE_STATE_SIT:
654 break;
656 GetPlayer()->SetEmoteState(emote);
657 break;
658 default:
659 // Only allow text-emotes for "dead" entities (feign death included)
660 if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
661 break;
663 break;
664 }
665
666 Unit* unit = ObjectAccessor::GetUnit(*_player, guid);
667
668 CellCoord p = Trinity::ComputeCellCoord(GetPlayer()->GetPositionX(), GetPlayer()->GetPositionY());
669
670 Cell cell(p);
671 cell.SetNoCreate();
672
673 Trinity::EmoteChatBuilder emote_builder(*GetPlayer(), text_emote, emoteNum, unit);
677 cell.Visit(p, message, *GetPlayer()->GetMap(), *GetPlayer(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE));
678
680
681 //Send scripted event call
682 if (unit && unit->GetTypeId() == TYPEID_UNIT && ((Creature*)unit)->AI())
683 ((Creature*)unit)->AI()->ReceiveEmote(GetPlayer(), text_emote);
684}
685
687{
688 ObjectGuid iguid;
689 uint8 unk;
690 //TC_LOG_DEBUG("network", "WORLD: Received CMSG_CHAT_IGNORED");
691
692 recvData >> iguid;
693 recvData >> unk; // probably related to spam reporting
694
696 if (!player || !player->GetSession())
697 return;
698
699 WorldPacket data;
701 player->SendDirectMessage(&data);
702}
703
705{
706 TC_LOG_DEBUG("network", "Opcode {}", recvPacket.GetOpcode());
707}
708
709void WorldSession::SendPlayerNotFoundNotice(std::string const& name)
710{
711 WorldPacket data(SMSG_CHAT_PLAYER_NOT_FOUND, name.size()+1);
712 data << name;
713 SendPacket(&data);
714}
715
716void WorldSession::SendPlayerAmbiguousNotice(std::string const& name)
717{
718 WorldPacket data(SMSG_CHAT_PLAYER_AMBIGUOUS, name.size()+1);
719 data << name;
720 SendPacket(&data);
721}
722
728
730{
732 data << uint8(restriction);
733 SendPacket(&data);
734}
bool isNasty(uint8 c)
LocaleConstant
Definition Common.h:48
@ ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE
Definition DBCEnums.h:180
DBCStorage< EmotesTextEntry > sEmotesTextStore(EmotesTextEntryfmt)
uint8_t uint8
Definition Define.h:135
int32_t int32
Definition Define.h:129
uint32_t uint32
Definition Define.h:133
#define sGuildMgr
Definition GuildMgr.h:59
@ LANG_SAY_REQ
Definition Language.h:1161
@ LANG_GM_SILENCE
Definition Language.h:1176
@ LANG_UNKNOWN_LANGUAGE
Definition Language.h:760
@ LANG_NOT_LEARNED_LANGUAGE
Definition Language.h:761
@ LANG_WHISPER_REQ
Definition Language.h:1162
@ LANG_WAIT_BEFORE_SPEAKING
Definition Language.h:697
@ LANG_PLAYER_AFK_DEFAULT
Definition Language.h:702
@ LANG_PLAYER_DND_DEFAULT
Definition Language.h:701
@ LANG_CHANNEL_REQ
Definition Language.h:1163
#define TC_LOG_DEBUG(filterType__,...)
Definition Log.h:156
#define TC_LOG_ERROR(filterType__,...)
Definition Log.h:165
@ TYPEID_UNIT
Definition ObjectGuid.h:38
LanguageDesc const * GetLanguageDescByID(uint32 lang)
bool normalizePlayerName(std::string &name)
#define sScriptMgr
Definition ScriptMgr.h:1168
Language
@ LANG_UNIVERSAL
@ LANG_ADDON
@ EMOTE_STATE_SLEEP
@ EMOTE_STATE_SIT
@ EMOTE_STATE_KNEEL
@ EMOTE_STATE_DANCE
@ EMOTE_ONESHOT_NONE
@ EMOTE_ONESHOT_WAVE
#define MAX_CHAT_MSG_TYPE
ChatMsg
@ CHAT_MSG_RAID_WARNING
@ CHAT_MSG_IGNORED
@ CHAT_MSG_RAID
@ CHAT_MSG_SAY
@ CHAT_MSG_PARTY_LEADER
@ CHAT_MSG_RAID_LEADER
@ CHAT_MSG_DND
@ CHAT_MSG_YELL
@ CHAT_MSG_PARTY
@ CHAT_MSG_WHISPER
@ CHAT_MSG_EMOTE
@ CHAT_MSG_GUILD
@ CHAT_MSG_OFFICER
@ CHAT_MSG_AFK
@ CHAT_MSG_BATTLEGROUND
@ CHAT_MSG_BATTLEGROUND_LEADER
@ CHAT_MSG_CHANNEL
@ SPELL_AURA_COMPREHEND_LANGUAGE
@ SPELL_AURA_MOD_LANGUAGE
@ UNIT_STATE_DIED
Definition Unit.h:220
std::string secsToTimeString(uint64 timeInSecs, TimeFormat timeFormat, bool hoursOnly)
Definition Util.cpp:115
void rfinish()
Definition ByteBuffer.h:316
std::string ReadCString(bool requireValidUtf8=true)
static Channel * GetChannelForPlayerByNamePart(std::string const &namePart, Player *playerSearcher)
static size_t BuildChatPacket(WorldPacket &data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, std::string const &senderName="", std::string const &receiverName="", uint32 achievementId=0, bool gmMessage=false, std::string const &channelName="")
Definition Chat.cpp:193
Definition Group.h:165
uint8 GetMemberGroup(ObjectGuid guid) const
Definition Group.cpp:2552
bool IsAssistant(ObjectGuid guid) const
Definition Group.h:233
bool IsLeader(ObjectGuid guid) const
Definition Group.cpp:2510
bool isBGGroup() const
Definition Group.cpp:2453
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignoredPlayer=ObjectGuid::Empty)
Definition Group.cpp:1808
bool isRaidGroup() const
Definition Group.cpp:2448
Definition Guild.h:284
TypeID GetTypeId() const
Definition Object.h:93
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
uint32 GetTeam() const
Definition Player.h:1832
void WhisperAddon(std::string const &text, Player *receiver)
Definition Player.cpp:20503
bool IsGameMasterAcceptingWhispers() const
Definition Player.h:999
bool IsInWhisperWhiteList(ObjectGuid guid)
Definition Player.cpp:26215
std::string autoReplyMsg
Definition Player.h:978
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:6161
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, WorldObject *ref=nullptr)
Definition Player.cpp:24940
Group * GetOriginalGroup() const
Definition Player.h:2186
WorldSession * GetSession() const
Definition Player.h:1719
bool HasSkill(uint32 skill) const
Definition Player.cpp:5871
ObjectGuid::LowType GetGuildId() const
Definition Player.h:1620
Group * GetGroup()
Definition Player.h:2171
bool IsGameMaster() const
Definition Player.h:998
void ToggleAFK()
Definition Player.cpp:1494
bool isDND() const
Definition Player.h:976
void UpdateSpeakTime(ChatFloodThrottle::Index index)
Definition Player.cpp:19998
void AddWhisperWhiteList(ObjectGuid guid)
Definition Player.h:2249
bool isAFK() const
Definition Player.h:975
bool isAcceptWhispers() const
Definition Player.h:996
void Yell(std::string_view text, Language language, WorldObject const *=nullptr) override
Handles yelled message in regular chat based on declared language and in config pre-defined Range.
Definition Player.cpp:20478
void Say(std::string_view text, Language language, WorldObject const *=nullptr) override
Handles said message in regular chat based on declared language and in config pre-defined Range.
Definition Player.cpp:20463
void TextEmote(std::string_view text, WorldObject const *=nullptr, bool=false) override
Outputs an universal text which is supposed to be an action.
Definition Player.cpp:20493
void Whisper(std::string_view text, Language language, Player *receiver, bool=false) override
Handles whispers from Addons and players based on sender, receiver's guid and language.
Definition Player.cpp:20518
void ToggleDND()
Definition Player.cpp:1503
EmoteChatBuilder(Player const &player, uint32 text_emote, uint32 emote_num, Unit const *target)
void operator()(WorldPacket &data, LocaleConstant loc_idx)
Definition Unit.h:769
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition Unit.h:1384
bool IsAlive() const
Definition Unit.h:1234
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:4535
void SetEmoteState(Emote emote)
Definition Unit.h:967
bool HasUnitState(const uint32 f) const
Definition Unit.h:876
void HandleEmoteCommand(Emote emoteId)
Definition Unit.cpp:1568
std::list< AuraEffect * > AuraEffectList
Definition Unit.h:787
uint8 GetLevel() const
Definition Unit.h:889
bool IsInCombat() const
Definition Unit.h:1144
std::string const & GetName() const
Definition Object.h:382
virtual std::string const & GetNameForLocaleIdx(LocaleConstant) const
Definition Object.h:385
uint16 GetOpcode() const
Definition WorldPacket.h:80
void Initialize(uint16 opcode, size_t newres=200)
Definition WorldPacket.h:73
char const * GetTrinityString(uint32 entry) const
void HandleChatIgnoredOpcode(WorldPacket &recvPacket)
void SendPlayerNotFoundNotice(std::string const &name)
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
void SendNotification(const char *format,...) ATTR_PRINTF(2
void HandleTextEmoteOpcode(WorldPacket &recvPacket)
void HandleEmoteOpcode(WorldPackets::Chat::EmoteClient &packet)
std::string GetPlayerInfo() const
Player * GetPlayer() const
bool CanSpeak() const
void SendPlayerAmbiguousNotice(std::string const &name)
bool HasPermission(uint32 permissionId)
void SendWrongFactionNotice()
void SendChatRestrictedNotice(ChatRestrictionType restriction)
Player * _player
time_t m_muteTime
std::unique_ptr< Warden > _warden
void HandleMessagechatOpcode(WorldPacket &recvPacket)
void HandleChannelDeclineInvite(WorldPacket &recvPacket)
bool ValidateHyperlinksAndMaybeKick(std::string const &str)
ChatRestrictionType
@ SMSG_CHAT_WRONG_FACTION
Definition Opcodes.h:566
@ SMSG_CHAT_PLAYER_NOT_FOUND
Definition Opcodes.h:710
@ SMSG_TEXT_EMOTE
Definition Opcodes.h:290
@ SMSG_CHAT_RESTRICTED
Definition Opcodes.h:794
@ SMSG_CHAT_PLAYER_AMBIGUOUS
Definition Opcodes.h:842
#define sWorld
Definition World.h:900
@ CONFIG_CHAT_CHANNEL_LEVEL_REQ
Definition World.h:295
@ CONFIG_CHAT_YELL_LEVEL_REQ
Definition World.h:299
@ CONFIG_CHAT_WHISPER_LEVEL_REQ
Definition World.h:296
@ CONFIG_CHAT_EMOTE_LEVEL_REQ
Definition World.h:297
@ CONFIG_CHAT_SAY_LEVEL_REQ
Definition World.h:298
@ CONFIG_LISTEN_RANGE_TEXTEMOTE
Definition World.h:190
@ CONFIG_CHAT_PARTY_RAID_WARNINGS
Definition World.h:114
@ CONFIG_CHAT_FAKE_MESSAGE_PREVENTING
Definition World.h:117
@ CONFIG_ADDON_CHANNEL
Definition World.h:92
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition World.h:98
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD
Definition World.h:99
time_t GetGameTime()
Definition GameTime.cpp:42
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
TC_GAME_API Player * FindConnectedPlayerByName(std::string_view name)
TC_GAME_API Player * FindConnectedPlayer(ObjectGuid const &)
CellCoord ComputeCellCoord(float x, float y)
@ RBAC_PERM_TWO_SIDE_INTERACTION_CHAT
Definition RBAC.h:78
@ RBAC_PERM_CAN_FILTER_WHISPERS
Definition RBAC.h:89
@ RBAC_PERM_SKIP_CHECK_CHAT_CHANNEL_REQ
Definition RBAC.h:72
Definition Cell.h:47
void SetNoCreate()
Definition Cell.h:75
void Visit(CellCoord const &, TypeContainerVisitor< T, CONTAINER > &visitor, Map &, WorldObject const &obj, float radius) const
Definition CellImpl.h:50
uint32 skill_id
Definition ObjectMgr.h:888