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 HandleChatMessage(chatMessage.SlashCmd, chatMessage.Language, std::move(chatMessage.Text), std::move(chatMessage.Target));
59}
60
61void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string msg, std::string target)
62{
63 if (type >= MAX_CHAT_MSG_TYPE)
64 {
65 TC_LOG_ERROR("network", "CHAT: Wrong message type received: {}", type);
66 return;
67 }
68
69 if (lang == LANG_UNIVERSAL && type != CHAT_MSG_AFK && type != CHAT_MSG_DND)
70 {
71 TC_LOG_ERROR("entities.player.cheat", "CMSG_MESSAGECHAT: Possible hacking-attempt: {} tried to send a message in universal language", GetPlayerInfo());
73 return;
74 }
75
76 Player* sender = GetPlayer();
77
78 //TC_LOG_DEBUG("CHAT: packet received. type {}, lang {}", type, lang);
79
80 // prevent talking at unknown language (cheating)
81 LanguageDesc const* langDesc = GetLanguageDescByID(lang);
82 if (!langDesc)
83 {
85 return;
86 }
87
88 if (langDesc->skill_id != 0 && !sender->HasSkill(langDesc->skill_id))
89 {
90 // also check SPELL_AURA_COMPREHEND_LANGUAGE (client offers option to speak in that language)
92 bool foundAura = false;
93 for (Unit::AuraEffectList::const_iterator i = langAuras.begin(); i != langAuras.end(); ++i)
94 {
95 if ((*i)->GetMiscValue() == int32(lang))
96 {
97 foundAura = true;
98 break;
99 }
100 }
101 if (!foundAura)
102 {
104 return;
105 }
106 }
107
108 if (lang == LANG_ADDON)
109 {
110 // LANG_ADDON is only valid for the following message types
111 switch (type)
112 {
113 case CHAT_MSG_PARTY:
114 case CHAT_MSG_RAID:
115 case CHAT_MSG_GUILD:
117 case CHAT_MSG_WHISPER:
118 // check if addon messages are disabled
119 if (!sWorld->getBoolConfig(CONFIG_ADDON_CHANNEL))
120 return;
121 break;
122 default:
123 TC_LOG_ERROR("network", "Player {} {} sent a chatmessage with an invalid language/message type combination",
124 GetPlayer()->GetName(), GetPlayer()->GetGUID().ToString());
125 return;
126 }
127 }
128 else
129 {
130 // send in universal language if player in .gm on mode (ignore spell effects)
131 if (sender->IsGameMaster())
132 lang = LANG_UNIVERSAL;
133 else
134 {
136 if (!ModLangAuras.empty())
137 lang = Language(ModLangAuras.front()->GetMiscValue());
139 lang = LANG_UNIVERSAL;
140 else
141 {
142 switch (type)
143 {
144 case CHAT_MSG_PARTY:
146 case CHAT_MSG_RAID:
149 // allow two side chat at group channel if two side group allowed
151 lang = LANG_UNIVERSAL;
152 break;
153 case CHAT_MSG_GUILD:
154 case CHAT_MSG_OFFICER:
155 // allow two side chat at guild channel if two side guild allowed
157 lang = LANG_UNIVERSAL;
158 break;
159 default:
160 break;
161 }
162 }
163 }
164 }
165
166 if (!CanSpeak())
167 {
168 std::string timeStr = secsToTimeString(m_muteTime - GameTime::GetGameTime());
170 return;
171 }
172
173 if (type != CHAT_MSG_AFK && type != CHAT_MSG_DND)
175
176 if (sender->HasAura(GM_SILENCE_AURA) && type != CHAT_MSG_WHISPER)
177 {
179 return;
180 }
181
182 if (msg.size() > 255)
183 return;
184
185 // Our Warden module also uses SendAddonMessage as a way to communicate Lua check results to the server, see if this is that
186 if ((type == CHAT_MSG_GUILD) && (lang == LANG_ADDON))
187 {
188 if (_warden && _warden->ProcessLuaCheckResponse(msg))
189 return;
190 }
191
192 // no chat commands in AFK/DND autoreply, and it can be empty
193 if (!(type == CHAT_MSG_AFK || type == CHAT_MSG_DND))
194 {
195 if (msg.empty())
196 return;
197 if (lang == LANG_ADDON)
198 {
199 if (AddonChannelCommandHandler(this).ParseCommands(msg.c_str()))
200 return;
201 }
202 else
203 {
204 if (ChatHandler(this).ParseCommands(msg.c_str()))
205 return;
206 }
207 }
208
209 // do message validity checks
210 if (lang != LANG_ADDON)
211 {
212 // cut at the first newline or carriage return
213 std::string::size_type pos = msg.find_first_of("\n\r");
214 if (pos == 0)
215 return;
216 else if (pos != std::string::npos)
217 msg.erase(pos);
218
219 // abort on any sort of nasty character
220 for (uint8 c : msg)
221 if (isNasty(c))
222 {
223 TC_LOG_ERROR("network", "Player {} {} sent a message containing invalid character {} - blocked", GetPlayer()->GetName(),
224 GetPlayer()->GetGUID().ToString(), uint8(c));
225 return;
226 }
227
228 // collapse multiple spaces into one
230 {
231 auto end = std::unique(msg.begin(), msg.end(), [](char c1, char c2) { return (c1 == ' ') && (c2 == ' '); });
232 msg.erase(end, msg.end());
233 }
234
235 // validate hyperlinks
237 return;
238 }
239
240 switch (type)
241 {
242 case CHAT_MSG_SAY:
243 {
244 // Prevent cheating
245 if (!sender->IsAlive())
246 return;
247
248 if (sender->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_SAY_LEVEL_REQ))
249 {
251 return;
252 }
253
254 sender->Say(msg, Language(lang));
255 break;
256 }
257 case CHAT_MSG_EMOTE:
258 {
259 // Prevent cheating
260 if (!sender->IsAlive())
261 return;
262
263 if (sender->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_EMOTE_LEVEL_REQ))
264 {
266 return;
267 }
268
269 sender->TextEmote(msg);
270 break;
271 }
272 case CHAT_MSG_YELL:
273 {
274 // Prevent cheating
275 if (!sender->IsAlive())
276 return;
277
278 if (sender->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_YELL_LEVEL_REQ))
279 {
281 return;
282 }
283
284 sender->Yell(msg, Language(lang));
285 break;
286 }
287 case CHAT_MSG_WHISPER:
288 {
289 if (!normalizePlayerName(target))
290 {
292 break;
293 }
294
296 if (!receiver || (lang != LANG_ADDON && !receiver->isAcceptWhispers() && receiver->GetSession()->HasPermission(rbac::RBAC_PERM_CAN_FILTER_WHISPERS) && !receiver->IsInWhisperWhiteList(sender->GetGUID())))
297 {
299 return;
300 }
301
302 // Apply checks only if receiver is not already in whitelist and if receiver is not a GM with ".whisper on"
303 if (!receiver->IsInWhisperWhiteList(sender->GetGUID()) && !receiver->IsGameMasterAcceptingWhispers())
304 {
305 if (!sender->IsGameMaster() && sender->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_WHISPER_LEVEL_REQ))
306 {
308 return;
309 }
310
312 {
314 return;
315 }
316 }
317
318 if (GetPlayer()->HasAura(GM_SILENCE_AURA) && !receiver->IsGameMaster())
319 {
321 return;
322 }
323
324 // If player is a Gamemaster and doesn't accept whisper, we auto-whitelist every player that the Gamemaster is talking to
325 // We also do that if a player is under the required level for whispers.
326 if (receiver->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_WHISPER_LEVEL_REQ) ||
328 sender->AddWhisperWhiteList(receiver->GetGUID());
329
330 if (lang == LANG_ADDON)
331 GetPlayer()->WhisperAddon(msg, receiver);
332 else
333 GetPlayer()->Whisper(msg, Language(lang), receiver);
334 break;
335 }
336 case CHAT_MSG_PARTY:
338 {
339 // if player is in battleground, he cannot say to battleground members by /p
340 Group* group = GetPlayer()->GetOriginalGroup();
341 if (!group)
342 {
343 group = sender->GetGroup();
344 if (!group || group->isBGGroup())
345 return;
346 }
347
348 // control LEADER messages on the server
349 // in a scenario where player has both Group and OriginalGroup,
350 // client will incorrectly send LEADER type when sending message to OriginalGroup while being a leader in regular group
351 type = group->IsLeader(sender->GetGUID()) ? CHAT_MSG_PARTY_LEADER : CHAT_MSG_PARTY;
352
353 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
354
356 packet.Initialize(ChatMsg(type), Language(lang), sender, nullptr, msg);
357 group->BroadcastPacket(packet.Write(), false, group->GetMemberGroup(GetPlayer()->GetGUID()));
358 break;
359 }
360 case CHAT_MSG_GUILD:
361 {
362 if (GetPlayer()->GetGuildId())
363 {
364 if (Guild* guild = sGuildMgr->GetGuildById(GetPlayer()->GetGuildId()))
365 {
366 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, guild);
367
368 guild->BroadcastToGuild(this, false, msg, lang == LANG_ADDON ? LANG_ADDON : LANG_UNIVERSAL);
369 }
370 }
371 break;
372 }
373 case CHAT_MSG_OFFICER:
374 {
375 if (GetPlayer()->GetGuildId())
376 {
377 if (Guild* guild = sGuildMgr->GetGuildById(GetPlayer()->GetGuildId()))
378 {
379 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, guild);
380
381 guild->BroadcastToGuild(this, true, msg, lang == LANG_ADDON ? LANG_ADDON : LANG_UNIVERSAL);
382 }
383 }
384 break;
385 }
386 case CHAT_MSG_RAID:
387 {
388 // if player is in battleground, he cannot say to battleground members by /ra
389 Group* group = GetPlayer()->GetOriginalGroup();
390 if (!group)
391 {
392 group = GetPlayer()->GetGroup();
393 if (!group || group->isBGGroup() || !group->isRaidGroup())
394 return;
395 }
396
397 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
398
400 packet.Initialize(CHAT_MSG_RAID, Language(lang), sender, nullptr, msg);
401 group->BroadcastPacket(packet.Write(), false);
402 break;
403 }
405 {
406 // if player is in battleground, he cannot say to battleground members by /ra
407 Group* group = GetPlayer()->GetOriginalGroup();
408 if (!group)
409 {
410 group = GetPlayer()->GetGroup();
411 if (!group || group->isBGGroup() || !group->isRaidGroup() || !group->IsLeader(sender->GetGUID()))
412 return;
413 }
414
415 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
416
418 packet.Initialize(CHAT_MSG_RAID_LEADER, Language(lang), sender, nullptr, msg);
419 group->BroadcastPacket(packet.Write(), false);
420 break;
421 }
423 {
424 Group* group = GetPlayer()->GetGroup();
425 if (!group || !(group->isRaidGroup() || sWorld->getBoolConfig(CONFIG_CHAT_PARTY_RAID_WARNINGS)) || !(group->IsLeader(GetPlayer()->GetGUID()) || group->IsAssistant(GetPlayer()->GetGUID())) || group->isBGGroup())
426 return;
427
428 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
429
431 //in battleground, raid warning is sent only to players in battleground - code is ok
432 packet.Initialize(CHAT_MSG_RAID_WARNING, Language(lang), sender, nullptr, msg);
433 group->BroadcastPacket(packet.Write(), false);
434 break;
435 }
437 {
438 //battleground raid is always in Player->GetGroup(), never in GetOriginalGroup()
439 Group* group = GetPlayer()->GetGroup();
440 if (!group || !group->isBGGroup())
441 return;
442
443 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
444
446 packet.Initialize(CHAT_MSG_BATTLEGROUND, Language(lang), sender, nullptr, msg);
447 group->BroadcastPacket(packet.Write(), false);
448 break;
449 }
451 {
452 // battleground raid is always in Player->GetGroup(), never in GetOriginalGroup()
453 Group* group = GetPlayer()->GetGroup();
454 if (!group || !group->isBGGroup() || !group->IsLeader(GetPlayer()->GetGUID()))
455 return;
456
457 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
458
460 packet.Initialize(CHAT_MSG_BATTLEGROUND_LEADER, Language(lang), sender, nullptr, msg);;
461 group->BroadcastPacket(packet.Write(), false);
462 break;
463 }
464 case CHAT_MSG_CHANNEL:
465 {
467 {
468 if (sender->GetLevel() < sWorld->getIntConfig(CONFIG_CHAT_CHANNEL_LEVEL_REQ))
469 {
471 return;
472 }
473 }
474
475 if (Channel* chn = ChannelMgr::GetChannelForPlayerByNamePart(target, sender))
476 {
477 sScriptMgr->OnPlayerChat(sender, type, lang, msg, chn);
478 chn->Say(sender->GetGUID(), msg, lang);
479 }
480 break;
481 }
482 case CHAT_MSG_AFK:
483 {
484 if (!sender->IsInCombat())
485 {
486 if (sender->isAFK()) // Already AFK
487 {
488 if (msg.empty())
489 sender->ToggleAFK(); // Remove AFK
490 else
491 sender->autoReplyMsg = msg; // Update message
492 }
493 else // New AFK mode
494 {
495 sender->autoReplyMsg = msg.empty() ? GetTrinityString(LANG_PLAYER_AFK_DEFAULT) : msg;
496
497 if (sender->isDND())
498 sender->ToggleDND();
499
500 sender->ToggleAFK();
501 }
502
503 sScriptMgr->OnPlayerChat(sender, type, lang, msg);
504 }
505 break;
506 }
507 case CHAT_MSG_DND:
508 {
509 if (sender->isDND()) // Already DND
510 {
511 if (msg.empty())
512 sender->ToggleDND(); // Remove DND
513 else
514 sender->autoReplyMsg = msg; // Update message
515 }
516 else // New DND mode
517 {
518 sender->autoReplyMsg = msg.empty() ? GetTrinityString(LANG_PLAYER_DND_DEFAULT) : msg;
519
520 if (sender->isAFK())
521 sender->ToggleAFK();
522
523 sender->ToggleDND();
524 }
525
526 sScriptMgr->OnPlayerChat(sender, type, lang, msg);
527 break;
528 }
529 default:
530 TC_LOG_ERROR("network", "CHAT: unknown message type {}, lang: {}", type, lang);
531 break;
532 }
533}
534
536{
537 Emote emoteId = static_cast<Emote>(packet.EmoteID);
538
539 // restrict to the only emotes hardcoded in client
540 if (emoteId != EMOTE_ONESHOT_NONE && emoteId != EMOTE_ONESHOT_WAVE)
541 return;
542
544 return;
545
546 sScriptMgr->OnPlayerEmote(_player, emoteId);
547 _player->HandleEmoteCommand(emoteId);
548}
549
550namespace Trinity
551{
553 {
554 public:
555 EmoteChatBuilder(Player const& player, int32 text_emote, int32 emote_num, Unit const* target)
556 : i_player(player), i_text_emote(text_emote), i_emote_num(emote_num), i_target(target) { }
557
558 void operator()(WorldPacket& data, LocaleConstant loc_idx) const
559 {
560 using namespace std::string_view_literals;
561
563 packet.SourceGUID = i_player.GetGUID();
564 packet.TargetName = i_target ? i_target->GetNameForLocaleIdx(loc_idx) : ""sv;
565 packet.EmoteID = i_text_emote;
566 packet.SoundIndex = i_emote_num;
567 packet.Write();
568
569 data = packet.Move();
570 }
571
572 private:
577 };
578}
579
581{
582 if (!_player->IsAlive())
583 return;
584
585 if (!CanSpeak())
586 {
587 std::string timeStr = secsToTimeString(m_muteTime - GameTime::GetGameTime());
589 return;
590 }
591
592 sScriptMgr->OnPlayerTextEmote(_player, packet.EmoteID, packet.SoundIndex, packet.Target);
593
594 EmotesTextEntry const* em = sEmotesTextStore.LookupEntry(packet.EmoteID);
595 if (!em)
596 return;
597
598 Emote emote = static_cast<Emote>(em->EmoteID);
599
600 switch (emote)
601 {
603 case EMOTE_STATE_SIT:
606 break;
608 _player->SetEmoteState(emote);
609 break;
610 default:
611 // Only allow text-emotes for "dead" entities (feign death included)
613 break;
615 break;
616 }
617
618 Unit* unit = ObjectAccessor::GetUnit(*_player, packet.Target);
619
620 Trinity::EmoteChatBuilder emote_builder(*_player, packet.EmoteID, packet.SoundIndex, unit);
621 Trinity::LocalizedPacketDo emote_do(emote_builder);
622 Trinity::PlayerDistWorker emote_worker(_player, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), emote_do);
624
626
627 //Send scripted event call
628 if (Creature* creature = Object::ToCreature(unit))
629 creature->AI()->ReceiveEmote(_player, packet.EmoteID);
630}
631
633{
634 ObjectGuid iguid;
635 uint8 unk;
636 //TC_LOG_DEBUG("network", "WORLD: Received CMSG_CHAT_IGNORED");
637
638 recvData >> iguid;
639 recvData >> unk; // probably related to spam reporting
640
642 if (!player || !player->GetSession())
643 return;
644
647 player->SendDirectMessage(packet.Write());
648}
649
650void WorldSession::SendPlayerNotFoundNotice(std::string const& name)
651{
652 WorldPacket data(SMSG_CHAT_PLAYER_NOT_FOUND, name.size()+1);
653 data << name;
654 SendPacket(&data);
655}
656
657void WorldSession::SendPlayerAmbiguousNotice(std::string const& name)
658{
659 WorldPacket data(SMSG_CHAT_PLAYER_AMBIGUOUS, name.size()+1);
660 data << name;
661 SendPacket(&data);
662}
663
669
671{
673 data << uint8(restriction);
674 SendPacket(&data);
675}
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
#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_ERROR(filterType__,...)
Definition Log.h:165
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
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
@ MAX_CHAT_MSG_TYPE
@ CHAT_MSG_AFK
@ CHAT_MSG_BATTLEGROUND
@ CHAT_MSG_BATTLEGROUND_LEADER
@ CHAT_MSG_CHANNEL
#define GM_SILENCE_AURA
@ SPELL_AURA_COMPREHEND_LANGUAGE
@ SPELL_AURA_MOD_LANGUAGE
@ UNIT_STATE_DIED
Definition Unit.h:234
std::string secsToTimeString(uint64 timeInSecs, TimeFormat timeFormat, bool hoursOnly)
Definition Util.cpp:115
static Channel * GetChannelForPlayerByNamePart(std::string const &namePart, Player *playerSearcher)
Definition Group.h:165
uint8 GetMemberGroup(ObjectGuid guid) const
Definition Group.cpp:2506
bool IsAssistant(ObjectGuid guid) const
Definition Group.h:233
bool IsLeader(ObjectGuid guid) const
Definition Group.cpp:2464
bool isBGGroup() const
Definition Group.cpp:2407
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignoredPlayer=ObjectGuid::Empty)
Definition Group.cpp:1788
bool isRaidGroup() const
Definition Group.cpp:2402
Definition Guild.h:284
Creature * ToCreature()
Definition Object.h:191
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
uint32 GetTeam() const
Definition Player.h:1818
void WhisperAddon(std::string const &text, Player *receiver)
Definition Player.cpp:20501
bool IsGameMasterAcceptingWhispers() const
Definition Player.h:977
bool IsInWhisperWhiteList(ObjectGuid guid)
Definition Player.cpp:26170
std::string autoReplyMsg
Definition Player.h:956
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:6163
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, WorldObject *ref=nullptr)
Definition Player.cpp:24914
Group * GetOriginalGroup() const
Definition Player.h:2174
WorldSession * GetSession() const
Definition Player.h:1705
bool HasSkill(uint32 skill) const
Definition Player.cpp:5885
ObjectGuid::LowType GetGuildId() const
Definition Player.h:1605
Group * GetGroup()
Definition Player.h:2159
bool IsGameMaster() const
Definition Player.h:976
void ToggleAFK()
Definition Player.cpp:1509
bool isDND() const
Definition Player.h:954
void UpdateSpeakTime(ChatFloodThrottle::Index index)
Definition Player.cpp:19998
void AddWhisperWhiteList(ObjectGuid guid)
Definition Player.h:2237
bool isAFK() const
Definition Player.h:953
bool isAcceptWhispers() const
Definition Player.h:974
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:20476
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:20461
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:20491
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:20516
void ToggleDND()
Definition Player.cpp:1518
EmoteChatBuilder(Player const &player, int32 text_emote, int32 emote_num, Unit const *target)
void operator()(WorldPacket &data, LocaleConstant loc_idx) const
Definition Unit.h:783
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition Unit.h:1397
bool IsAlive() const
Definition Unit.h:1247
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:4558
void SetEmoteState(Emote emote)
Definition Unit.h:981
bool HasUnitState(const uint32 f) const
Definition Unit.h:890
void HandleEmoteCommand(Emote emoteId)
Definition Unit.cpp:1579
std::list< AuraEffect * > AuraEffectList
Definition Unit.h:801
uint8 GetLevel() const
Definition Unit.h:903
bool IsInCombat() const
Definition Unit.h:1158
std::string const & GetNameForLocaleIdx(LocaleConstant) const override
Definition Object.h:387
std::string const & GetName() const
Definition Object.h:384
std::string Target
Whisper target or channel name.
Definition ChatPackets.h:42
void Initialize(ChatMsg chatType, Language language, WorldObject const *sender, WorldObject const *receiver, std::string_view message, uint32 achievementId=0, std::string_view channelName="", LocaleConstant locale=DEFAULT_LOCALE, std::string_view addonPrefix="")
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket && Move()
Definition Packet.h:53
char const * GetTrinityString(uint32 entry) const
void HandleChatMessage(ChatMsg type, Language lang, std::string msg, std::string target)
void HandleChatIgnoredOpcode(WorldPacket &recvPacket)
void SendPlayerNotFoundNotice(std::string const &name)
void SendNotification(char const *format,...) ATTR_PRINTF(2
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
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 HandleTextEmoteOpcode(WorldPackets::Chat::CTextEmote &packet)
void SendWrongFactionNotice()
void SendChatRestrictedNotice(ChatRestrictionType restriction)
Player * _player
void HandleChatMessageOpcode(WorldPackets::Chat::ChatMessage &chatMessage)
time_t m_muteTime
std::unique_ptr< Warden > _warden
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_CHAT_RESTRICTED
Definition Opcodes.h:794
@ SMSG_CHAT_PLAYER_AMBIGUOUS
Definition Opcodes.h:842
#define sWorld
Definition World.h:901
@ CONFIG_CHAT_CHANNEL_LEVEL_REQ
Definition World.h:296
@ CONFIG_CHAT_YELL_LEVEL_REQ
Definition World.h:300
@ CONFIG_CHAT_WHISPER_LEVEL_REQ
Definition World.h:297
@ CONFIG_CHAT_EMOTE_LEVEL_REQ
Definition World.h:298
@ CONFIG_CHAT_SAY_LEVEL_REQ
Definition World.h:299
@ CONFIG_LISTEN_RANGE_TEXTEMOTE
Definition World.h:191
@ 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 &)
@ 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
static void VisitWorldObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition CellImpl.h:180
uint32 skill_id
Definition ObjectMgr.h:882