Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
ChatHandler.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#include "AccountMgr.h"
7#include "CellImpl.h"
8#include "ChannelMgr.h"
9#include "Chat.h"
10#include "Common.h"
11#include "DatabaseEnv.h"
12#include "GridNotifiersImpl.h"
13#include "Group.h"
14#include "Guild.h"
15#include "GuildMgr.h"
16#include "Language.h"
17#include "Log.h"
18#include "ObjectAccessor.h"
19#include "ObjectMgr.h"
20#include "Opcodes.h"
21#include "Player.h"
22#include "ScriptMgr.h"
23#include "SpellAuraEffects.h"
24#include "SpellAuras.h"
25#include "Util.h"
26#include "World.h"
27#include "WorldPacket.h"
28#include "WorldSession.h"
29
31{
32 ChatMsg type;
33 Language lang;
34
35 switch (recvData.GetOpcode())
36 {
39 break;
42 break;
45 break;
48 break;
51 break;
54 break;
57 break;
60 break;
63 break;
66 break;
69 break;
72 break;
73 /*
74 case CMSG_MESSAGECHAT_BATTLEGROUND:
75 type = CHAT_MSG_BATTLEGROUND;
76 break;
77 */
78 default:
79 SF_LOG_ERROR("network", "HandleMessagechatOpcode : Unknown chat opcode (%u)", recvData.GetOpcode());
80 recvData.hexlike();
81 return;
82 }
83
84 if (type >= ChatMsg::MSG_NULL_ACTION)
85 {
86 SF_LOG_ERROR("network", "CHAT: Wrong message type received: %u", uint8(type));
87 recvData.rfinish();
88 return;
89 }
90
91 Player* sender = GetPlayer();
92
93 //SF_LOG_DEBUG("misc", "CHAT: packet received. type %u, lang %u", type, lang);
94
95 // no language sent with emote packet.
97 {
98 uint32 plang = 0;
99 recvData >> plang;
100 lang = Language(plang);
101
102 // prevent talking at unknown language (cheating)
103 LanguageDesc const* langDesc = GetLanguageDescByID(lang);
104 if (!langDesc)
105 {
107 recvData.rfinish();
108 return;
109 }
110 if (langDesc->skill_id != 0 && !sender->HasSkill(langDesc->skill_id))
111 {
112 // also check SPELL_AURA_COMPREHEND_LANGUAGE (client offers option to speak in that language)
114 bool foundAura = false;
115 for (Unit::AuraEffectList::const_iterator i = langAuras.begin(); i != langAuras.end(); ++i)
116 {
117 if ((*i)->GetMiscValue() == int32(lang))
118 {
119 foundAura = true;
120 break;
121 }
122 }
123 if (!foundAura)
124 {
126 recvData.rfinish();
127 return;
128 }
129 }
130
131 if (lang == Language::LANG_ADDON)
132 {
133 // LANG_ADDON is only valid for the following message types
134 switch (type)
135 {
142 {
143 std::string msg = "";
144 recvData >> msg;
145
146 if (msg.empty())
147 return;
148
149 sScriptMgr->OnPlayerChat(sender, ChatMsg::CHAT_MSG_ADDON, lang, msg);
150 }
151
152 // Disabled addon channel?
154 return;
155 break;
156 default:
157 SF_LOG_ERROR("network", "Player %s (GUID: %u) sent a chatmessage with an invalid language/message type combination",
158 GetPlayer()->GetName().c_str(), GetPlayer()->GetGUIDLow());
159
160 recvData.rfinish();
161 return;
162 }
163 }
164 // LANG_ADDON should not be changed nor be affected by flood control
165 else
166 {
167 // send in universal language if player in .gm on mode (ignore spell effects)
168 if (sender->IsGameMaster())
170 else
171 {
172 // send in universal language in two side iteration allowed mode
175 else
176 {
177 switch (type)
178 {
184 // allow two side chat at group channel if two side group allowed
187 break;
190 // allow two side chat at guild channel if two side guild allowed
193 break;
194 default:
195 break;
196 }
197 }
198
199 // but overwrite it by SPELL_AURA_MOD_LANGUAGE auras (only single case used)
201 if (!ModLangAuras.empty())
202 lang = Language(ModLangAuras.front()->GetMiscValue());
203 }
204
205 if (!sender->CanSpeak())
206 {
207 std::string timeStr = secsToTimeString(m_muteTime - time(NULL));
209 recvData.rfinish(); // Prevent warnings
210 return;
211 }
212 }
213 }
214 else
216
217 if (sender->HasAura(1852) && type != ChatMsg::CHAT_MSG_WHISPER)
218 {
220 recvData.rfinish();
221 return;
222 }
223
224 uint32 textLength = 0;
225 uint32 receiverLength = 0;
226 std::string to, channel, msg;
227 bool ignoreChecks = false;
228 switch (type)
229 {
239 textLength = recvData.ReadBits(8);
240 msg = recvData.ReadString(textLength);
241 break;
243 textLength = recvData.ReadBits(8);
244 receiverLength = recvData.ReadBits(9);
245 msg = recvData.ReadString(textLength);
246 to = recvData.ReadString(receiverLength);
247 break;
249 textLength = recvData.ReadBits(9);
250 receiverLength = recvData.ReadBits(8);
251 msg = recvData.ReadString(receiverLength);
252 channel = recvData.ReadString(textLength);
253 break;
256 textLength = recvData.ReadBits(8);
257 msg = recvData.ReadString(textLength);
258 ignoreChecks = true;
259 break;
260 default:
261 break;
262 }
263
264 if (!ignoreChecks)
265 {
266 if (msg.empty())
267 return;
268
269 if (ChatHandler(this).ParseCommands(msg.c_str()))
270 return;
271
272 if (lang != Language::LANG_ADDON)
273 {
274 // Strip invisible characters for non-addon messages
277
278 if (sWorld->getIntConfig(WorldIntConfigs::CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY) && !ChatHandler(this).isValidChatMessage(msg.c_str()))
279 {
280 SF_LOG_ERROR("network", "Player %s (GUID: %u) sent a chatmessage with an invalid link: %s", GetPlayer()->GetName().c_str(),
281 GetPlayer()->GetGUIDLow(), msg.c_str());
282
284 KickPlayer();
285
286 return;
287 }
288 }
289 }
290
291 switch (type)
292 {
296 {
297 if (sender->getLevel() < sWorld->getIntConfig(WorldIntConfigs::CONFIG_CHAT_SAY_LEVEL_REQ))
298 {
300 return;
301 }
302
303 if (type == ChatMsg::CHAT_MSG_SAY)
304 sender->Say(msg, lang);
305 else if (type == ChatMsg::CHAT_MSG_EMOTE)
306 sender->TextEmote(msg);
307 else if (type == ChatMsg::CHAT_MSG_YELL)
308 sender->Yell(msg, lang);
309 } break;
311 {
312 if (!normalizePlayerName(to))
313 {
315 break;
316 }
317
318 Player* receiver = sObjectAccessor->FindPlayerByName(to);
319 bool const senderBypassesWhisperFilter = sWorld->GetBoolConfig(WorldBoolConfigs::CONFIG_CHAT_GM_WHISPER_FILTER_BYPASS) &&
321 bool const receiverFiltersWhispers = receiver && !receiver->isAcceptWhispers() &&
322 !senderBypassesWhisperFilter &&
323 !receiver->IsInWhisperWhiteList(sender->GetGUID());
324 if (!receiver || !receiver->GetSession() || receiverFiltersWhispers)
325 {
327 return;
328 }
329 if (!sender->IsGameMaster() && sender->getLevel() < sWorld->getIntConfig(WorldIntConfigs::CONFIG_CHAT_WHISPER_LEVEL_REQ) && !receiver->IsInWhisperWhiteList(sender->GetGUID()))
330 {
332 return;
333 }
334
335 if (GetPlayer()->GetTeam() != receiver->GetTeam() && !HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHAT) && !receiver->IsInWhisperWhiteList(sender->GetGUID()))
336 {
338 return;
339 }
340
341 if (GetPlayer()->HasAura(1852) && !receiver->IsGameMaster())
342 {
344 return;
345 }
346
347 // If player is a Gamemaster and doesn't accept whisper, we auto-whitelist every player that the Gamemaster is talking to
348 // We also do that if a player is under the required level for whispers.
349 if (receiver->getLevel() < sWorld->getIntConfig(WorldIntConfigs::CONFIG_CHAT_WHISPER_LEVEL_REQ) ||
351 sender->AddWhisperWhiteList(receiver->GetGUID());
352
353 GetPlayer()->Whisper(msg, lang, receiver->GetGUID());
354 } break;
357 {
358 // if player is in battleground, he cannot say to battleground members by /p
359 Group* group = GetPlayer()->GetOriginalGroup();
360 if (!group)
361 {
362 group = _player->GetGroup();
363 if (!group || group->isBGGroup())
364 return;
365 }
366
367 if (group->IsLeader(GetPlayer()->GetGUID()))
369
370 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
371
372 WorldPacket data;
373 ChatHandler::BuildChatPacket(data, ChatMsg(type), Language(lang), _player, NULL, msg);
374 group->BroadcastPacket(&data, false, group->GetMemberGroup(GetPlayer()->GetGUID()));
375 } break;
377 {
378 if (GetPlayer()->GetGuildId())
379 {
380 if (Guild* guild = sGuildMgr->GetGuildById(GetPlayer()->GetGuildId()))
381 {
382 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, guild);
383
384 guild->BroadcastToGuild(this, false, msg, lang == Language::LANG_ADDON ? Language::LANG_ADDON : Language::LANG_UNIVERSAL);
385 }
386 }
387 } break;
389 {
390 if (GetPlayer()->GetGuildId())
391 {
392 if (Guild* guild = sGuildMgr->GetGuildById(GetPlayer()->GetGuildId()))
393 {
394 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, guild);
395
396 guild->BroadcastToGuild(this, true, msg, lang == Language::LANG_ADDON ? Language::LANG_ADDON : Language::LANG_UNIVERSAL);
397 }
398 }
399 } break;
402 {
403 // if player is in battleground, he cannot say to battleground members by /ra
404 Group* group = GetPlayer()->GetOriginalGroup();
405 if (!group)
406 {
407 group = GetPlayer()->GetGroup();
408 if (!group || group->isBGGroup() || !group->isRaidGroup())
409 return;
410 }
411
412 if (group->IsLeader(GetPlayer()->GetGUID()))
414
415 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
416
417 WorldPacket data;
418 ChatHandler::BuildChatPacket(data, ChatMsg(type), lang, _player, NULL, msg);
419 group->BroadcastPacket(&data, false);
420 } break;
422 {
423 Group* group = GetPlayer()->GetGroup();
424 if (!group || !group->isRaidGroup() || !(group->IsLeader(GetPlayer()->GetGUID()) || group->IsAssistant(GetPlayer()->GetGUID())) || group->isBGGroup())
425 return;
426
427 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
428
429 WorldPacket data;
430 //in battleground, raid warning is sent only to players in battleground - code is ok
432 group->BroadcastPacket(&data, false);
433 } break;
436 {
437 // battleground raid is always in Player->GetGroup(), never in GetOriginalGroup()
438 Group* group = GetPlayer()->GetGroup();
439 if (!group || !group->isBGGroup())
440 return;
441
442 if (group->IsLeader(GetPlayer()->GetGUID()))
444
445 sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
446
447 WorldPacket data;
448 ChatHandler::BuildChatPacket(data, (ChatMsg)type, Language(lang), _player, NULL, msg);
449 group->BroadcastPacket(&data, false);
450 } break;
452 {
454 {
455 if (_player->getLevel() < sWorld->getIntConfig(WorldIntConfigs::CONFIG_CHAT_CHANNEL_LEVEL_REQ))
456 {
458 return;
459 }
460 }
461
462 if (ChannelMgr* cMgr = ChannelMgr::forTeam(_player->GetTeam()))
463 {
464 if (Channel* chn = cMgr->GetChannel(channel, _player))
465 {
466 sScriptMgr->OnPlayerChat(_player, type, lang, msg, chn);
467 chn->Say(_player->GetGUID(), msg.c_str(), lang);
468 }
469 }
470 } break;
472 {
473 if (!_player->IsInCombat())
474 {
475 if (_player->isAFK()) // Already AFK
476 {
477 if (msg.empty())
478 _player->ToggleAFK(); // Remove AFK
479 else
480 _player->autoReplyMsg = msg; // Update message
481 }
482 else // New AFK mode
483 {
484 _player->autoReplyMsg = msg.empty() ? GetSkyFireString(LANG_PLAYER_AFK_DEFAULT) : msg;
485
486 if (_player->isDND())
487 _player->ToggleDND();
488
489 _player->ToggleAFK();
490 }
491
492 sScriptMgr->OnPlayerChat(_player, type, lang, msg);
493 }
494 break;
495 }
497 {
498 if (_player->isDND()) // Already DND
499 {
500 if (msg.empty())
501 _player->ToggleDND(); // Remove DND
502 else
503 _player->autoReplyMsg = msg; // Update message
504 }
505 else // New DND mode
506 {
507 _player->autoReplyMsg = msg.empty() ? GetSkyFireString(LANG_PLAYER_DND_DEFAULT) : msg;
508
509 if (_player->isAFK())
510 _player->ToggleAFK();
511
512 _player->ToggleDND();
513 }
514
515 sScriptMgr->OnPlayerChat(_player, type, lang, msg);
516 break;
517 }
518 default:
519 SF_LOG_ERROR("network", "CHAT: unknown message type %u, lang: %u", uint8(type), uint8(lang));
520 break;
521 }
522}
523
525{
526 Player* sender = GetPlayer();
527 ChatMsg type;
528
529 switch (recvData.GetOpcode())
530 {
533 break;
536 break;
539 break;
542 break;
545 break;
548 break;
549 default:
550 SF_LOG_ERROR("network", "HandleAddonMessagechatOpcode: Unknown addon chat opcode (%u)", recvData.GetOpcode());
551 recvData.hexlike();
552 return;
553 }
554
555 std::string message;
556 std::string prefix;
557 std::string targetName;
558
559 switch (type)
560 {
562 {
563 uint32 msgLen = recvData.ReadBits(9);
564 uint32 prefixLen = recvData.ReadBits(5);
565 uint32 targetLen = recvData.ReadBits(10);
566 message = recvData.ReadString(msgLen);
567 prefix = recvData.ReadString(prefixLen);
568 targetName = recvData.ReadString(targetLen);
569 break;
570 }
574 {
575 uint32 prefixLen = recvData.ReadBits(5);
576 uint32 msgLen = recvData.ReadBits(9);
577 prefix = recvData.ReadString(prefixLen);
578 message = recvData.ReadString(msgLen);
579 break;
580 }
583 {
584 uint32 msgLen = recvData.ReadBits(9);
585 uint32 prefixLen = recvData.ReadBits(5);
586 message = recvData.ReadString(msgLen);
587 prefix = recvData.ReadString(prefixLen);
588 break;
589 }
590 default:
591 break;
592 }
593
594 if (prefix.empty() || prefix.length() > 16)
595 return;
596
597 // Logging enabled?
599 {
600 if (message.empty())
601 return;
602
603 // Weird way to log stuff...
604 sScriptMgr->OnPlayerChat(sender, ChatMsg::CHAT_MSG_ADDON, Language::LANG_ADDON, message);
605 }
606
607 // Disabled addon channel?
609 return;
610
611 switch (type)
612 {
614 {
615 Group* group = sender->GetGroup();
616 if (!group || !group->isBGGroup())
617 return;
618
619 WorldPacket data;
620 ChatHandler::BuildChatPacket(data, type, Language::LANG_ADDON, sender, NULL, message, 0U, "", DEFAULT_LOCALE, prefix);
621 group->BroadcastAddonMessagePacket(&data, prefix, false);
622 break;
623 }
626 {
627 if (sender->GetGuildId())
628 if (Guild* guild = sGuildMgr->GetGuildById(sender->GetGuildId()))
629 guild->BroadcastAddonToGuild(this, type == ChatMsg::CHAT_MSG_OFFICER, message, prefix);
630 break;
631 }
633 {
634 if (!normalizePlayerName(targetName))
635 break;
636 Player* receiver = sObjectAccessor->FindPlayerByName(targetName.c_str());
637 if (!receiver)
638 break;
639
640 sender->WhisperAddon(message, prefix, receiver);
641 break;
642 }
643 // Messages sent to "RAID" while in a party will get delivered to "PARTY"
646 {
647 Group* group = sender->GetGroup();
648 if (!group || group->isBGGroup())
649 break;
650
651 WorldPacket data;
652 ChatHandler::BuildChatPacket(data, type, Language::LANG_ADDON, sender, NULL, message, 0U, "", DEFAULT_LOCALE, prefix);
653 group->BroadcastAddonMessagePacket(&data, prefix, true, -1, group->GetMemberGroup(sender->GetGUID()));
654 break;
655 }
656 default:
657 {
658 SF_LOG_ERROR("misc", "HandleAddonMessagechatOpcode: unknown addon message type %u", uint8(type));
659 break;
660 }
661 }
662}
663
665{
666 if (!GetPlayer()->IsAlive() || GetPlayer()->HasUnitState(UNIT_STATE_DIED))
667 return;
668
669 uint32 emote;
670 recvData >> emote;
671 sScriptMgr->OnPlayerEmote(GetPlayer(), emote);
673}
674
675namespace Skyfire
676{
678 {
679 public:
680 EmoteChatBuilder(Player const& player, uint32 text_emote, uint32 emote_num, Unit const* target)
681 : i_player(player), i_text_emote(text_emote), i_emote_num(emote_num), i_target(target) { }
682
684 {
685 ObjectGuid PlayerGuid = i_player.GetGUID();
686 ObjectGuid TargetGuid = i_target ? i_target->GetGUID() : 0;
687
688 data.Initialize(SMSG_TEXT_EMOTE, 2 * (8 + 1) + 4 + 4);
689
690 data.WriteBit(PlayerGuid[1]);
691 data.WriteBit(TargetGuid[7]);
692 data.WriteBit(PlayerGuid[6]);
693 data.WriteBit(TargetGuid[5]);
694 data.WriteBit(PlayerGuid[3]);
695 data.WriteBit(TargetGuid[6]);
696 data.WriteBit(TargetGuid[2]);
697 data.WriteBit(PlayerGuid[7]);
698 data.WriteBit(TargetGuid[0]);
699 data.WriteBit(TargetGuid[1]);
700 data.WriteBit(PlayerGuid[4]);
701 data.WriteBit(PlayerGuid[2]);
702 data.WriteBit(TargetGuid[3]);
703 data.WriteBit(TargetGuid[4]);
704 data.WriteBit(PlayerGuid[0]);
705 data.WriteBit(PlayerGuid[5]);
706
707 data.WriteByteSeq(TargetGuid[2]);
708 data.WriteByteSeq(TargetGuid[1]);
709 data.WriteByteSeq(PlayerGuid[7]);
710 data.WriteByteSeq(PlayerGuid[4]);
711 data.WriteByteSeq(TargetGuid[7]);
712 data.WriteByteSeq(PlayerGuid[5]);
713 data.WriteByteSeq(PlayerGuid[2]);
714
715 data << uint32(i_text_emote);
716
717 data.WriteByteSeq(PlayerGuid[6]);
718 data.WriteByteSeq(TargetGuid[0]);
719 data.WriteByteSeq(PlayerGuid[3]);
720 data.WriteByteSeq(PlayerGuid[1]);
721 data.WriteByteSeq(TargetGuid[6]);
722 data.WriteByteSeq(PlayerGuid[0]);
723 data.WriteByteSeq(TargetGuid[3]);
724 data.WriteByteSeq(TargetGuid[5]);
725 data.WriteByteSeq(TargetGuid[4]);
726
727 data << uint32(i_emote_num);
728 }
729
730 private:
735 };
736} // namespace Skyfire
737
739{
740 if (!GetPlayer()->IsAlive())
741 return;
742
743 if (!GetPlayer()->CanSpeak())
744 {
745 std::string timeStr = secsToTimeString(m_muteTime - time(NULL));
747 return;
748 }
749
750 ObjectGuid guid;
751 uint32 text_emote, emoteNum;
752
753 recvData >> text_emote;
754 recvData >> emoteNum;
755
756 recvData.ReadGuidMask(guid, 6, 7, 3, 2, 0, 5, 1, 4);
757 recvData.ReadGuidBytes(guid, 0, 5, 1, 4, 2, 3, 7, 6);
758
759 sScriptMgr->OnPlayerTextEmote(GetPlayer(), text_emote, emoteNum, guid);
760
761 EmotesTextEntry const* em = sEmotesTextStore.LookupEntry(text_emote);
762 if (!em)
763 return;
764
765 uint32 emote_anim = em->textid;
766
767 switch (emote_anim)
768 {
770 case EMOTE_STATE_SIT:
773 break;
774 default:
775 // Only allow text-emotes for "dead" entities (feign death included)
776 if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
777 break;
778 GetPlayer()->HandleEmoteCommand(emote_anim);
779 break;
780 }
781
782 Unit* unit = ObjectAccessor::GetUnit(*_player, guid);
783
784 CellCoord p = Skyfire::ComputeCellCoord(GetPlayer()->GetPositionX(), GetPlayer()->GetPositionY());
785
786 Cell cell(p);
787 cell.SetNoCreate();
788
789 Skyfire::EmoteChatBuilder emote_builder(*GetPlayer(), text_emote, emoteNum, unit);
793 cell.Visit(p, message, *GetPlayer()->GetMap(), *GetPlayer(), sWorld->GetFloatConfig(WorldFloatConfigs::CONFIG_LISTEN_RANGE_TEXTEMOTE));
794
796
797 //Send scripted event call
798 if (unit && unit->GetTypeId() == TypeID::TYPEID_UNIT && ((Creature*)unit)->AI())
799 ((Creature*)unit)->AI()->ReceiveEmote(GetPlayer(), text_emote);
800}
801
803{
804 ObjectGuid guid;
805 uint8 unk;
806 //SF_LOG_DEBUG("network", "WORLD: Received CMSG_CHAT_IGNORED");
807
808 recvData.ReadGuidMask(guid, 5);
809 recvData >> unk; // probably related to spam reporting
810 recvData.ReadGuidMask(guid, 0, 1, 3, 6, 7, 4, 2);
811
812 recvData.ReadGuidBytes(guid, 2, 0, 3, 4, 7, 6, 0, 5);
813
814 Player* player = ObjectAccessor::FindPlayer(guid);
815 if (!player || !player->GetSession())
816 return;
817
818 WorldPacket data;
820 player->GetSession()->SendPacket(&data);
821}
822
824{
825 SF_LOG_DEBUG("network", "Opcode %u", recvPacket.GetOpcode());
826}
827
828void WorldSession::SendPlayerNotFoundNotice(std::string const& name)
829{
830 WorldPacket data(SMSG_CHAT_PLAYER_NOT_FOUND, name.size() + 2);
831 data.WriteBits(name.size(), 9);
832 data.FlushBits();
833 data << name;
834 SendPacket(&data);
835}
836
837void WorldSession::SendPlayerAmbiguousNotice(std::string const& name)
838{
839 WorldPacket data(SMSG_CHAT_PLAYER_AMBIGUOUS, name.size() + 2);
840 data.WriteBits(name.size(), 9);
841 data.FlushBits();
842 data << name;
843 SendPacket(&data);
844}
845
851
853{
855 data << uint8(restriction);
856 SendPacket(&data);
857}
LocaleConstant
Definition Common.h:138
#define DEFAULT_LOCALE
Definition Common.h:154
@ ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE
Definition DBCEnums.h:219
DBCStorage< EmotesTextEntry > sEmotesTextStore(EmotesTextEntryfmt)
std::int32_t int32
Definition Define.h:73
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
TypeMapContainer< AllWorldObjectTypes > WorldTypeMapContainer
Definition GridDefines.h:72
CoordPair< TOTAL_NUMBER_OF_CELLS_PER_MAP > CellCoord
#define sGuildMgr
Definition GuildMgr.h:53
@ LANG_SAY_REQ
Definition Language.h:1110
@ LANG_GM_SILENCE
Definition Language.h:1125
@ LANG_UNKNOWN_LANGUAGE
Definition Language.h:750
@ LANG_NOT_LEARNED_LANGUAGE
Definition Language.h:751
@ LANG_WHISPER_REQ
Definition Language.h:1111
@ LANG_WAIT_BEFORE_SPEAKING
Definition Language.h:684
@ LANG_PLAYER_AFK_DEFAULT
Definition Language.h:689
@ LANG_PLAYER_DND_DEFAULT
Definition Language.h:688
@ LANG_CHANNEL_REQ
Definition Language.h:1112
#define SF_LOG_DEBUG(filterType__,...)
Definition Log.h:134
#define SF_LOG_ERROR(filterType__,...)
Definition Log.h:143
@ TYPEID_UNIT
Definition Object.h:54
#define sObjectAccessor
LanguageDesc const * GetLanguageDescByID(Language lang)
bool normalizePlayerName(std::string &name)
#define sScriptMgr
Definition ScriptMgr.h:764
@ EMOTE_STATE_SLEEP
@ EMOTE_STATE_SIT
@ EMOTE_STATE_KNEEL
@ EMOTE_ONESHOT_NONE
ChatMsg
@ CHAT_MSG_RAID_LEADER
@ CHAT_MSG_INSTANCE_LEADER
@ CHAT_MSG_PARTY_LEADER
@ CHAT_MSG_RAID_WARNING
Language
@ SPELL_AURA_COMPREHEND_LANGUAGE
@ SPELL_AURA_MOD_LANGUAGE
@ UNIT_STATE_DIED
Definition Unit.h:512
void stripLineInvisibleChars(std::string &str)
Definition Util.cpp:94
std::string secsToTimeString(uint64 timeInSecs, bool shortText, bool hoursOnly)
Definition Util.cpp:127
bool WriteBit(uint32 bit)
Definition ByteBuffer.h:164
uint32 ReadBits(size_t bits)
Definition ByteBuffer.h:198
void ReadGuidBytes(ObjectGuid &guid, Offsets... offsets)
Definition ByteBuffer.h:256
void hexlike() const
void rfinish()
Definition ByteBuffer.h:478
std::string ReadString(size_t length)
Definition ByteBuffer.h:565
void ReadGuidMask(ObjectGuid &guid, Offsets... offsets)
Definition ByteBuffer.h:240
void WriteBits(T value, size_t bits)
Definition ByteBuffer.h:192
void WriteByteSeq(uint8 b)
Definition ByteBuffer.h:227
void FlushBits()
Definition ByteBuffer.h:154
static ChannelMgr * forTeam(uint32 team)
static size_t BuildChatPacket(WorldPacket &data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string const &message, uint8 chatTag, std::string const &senderName="", std::string const &receiverName="", uint32 achievementId=0, bool gmMessage=false, std::string const &channelName="", std::string const &addonPrefix="")
Definition Chat.cpp:580
Definition Group.h:147
void BroadcastPacket(WorldPacket *packet, bool ignorePlayersInBGRaid, int group=-1, uint64 ignore=0)
Definition Group.cpp:1907
bool isBGGroup() const
Definition Group.cpp:2553
void BroadcastAddonMessagePacket(WorldPacket *packet, const std::string &prefix, bool ignorePlayersInBGRaid, int group=-1, uint64 ignore=0)
Definition Group.cpp:1892
uint8 GetMemberGroup(uint64 guid) const
Definition Group.cpp:2651
bool IsAssistant(uint64 guid) const
Definition Group.cpp:2621
bool IsLeader(uint64 guid) const
Definition Group.cpp:2608
bool isRaidGroup() const
Definition Group.cpp:2548
Definition Guild.h:324
static Unit * GetUnit(WorldObject const &, uint64 guid)
static Player * FindPlayer(uint64)
uint64 GetGUID() const
Definition Object.h:119
TypeID GetTypeId() const
Definition Object.h:131
bool CanSpeak() const
Definition Player.cpp:15397
void Yell(std::string const &text, const Language language)
Handles yelled message in regular chat based on declared language and in config pre-defined Range.
Definition Player.cpp:15807
uint32 GetTeam() const
Definition Player.h:2527
void Whisper(std::string const &text, const Language language, uint64 receiver)
Handles whispers from Addons and players based on sender, receiver's guid and language.
Definition Player.cpp:15840
void TextEmote(std::string const &text)
Outputs an universal text which is supposed to be an action.
Definition Player.cpp:15817
uint32 GetGuildId() const
Definition Player.h:2291
void WhisperAddon(std::string const &text, std::string const &prefix, Player *receiver)
Definition Player.cpp:15827
WorldSession * GetSession() const
Definition Player.h:2417
bool HasSkill(uint32 skill) const
Definition Player.cpp:6542
void Say(std::string const &text, const Language language)
Handles said message in regular chat based on declared language and in config pre-defined Range.
Definition Player.cpp:15797
Group * GetGroup()
Definition Player.h:2972
bool IsGameMaster() const
Definition Player.h:1369
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1=0, uint64 miscValue2=0, uint64 miscValue3=0, Unit *unit=NULL)
Definition Player.cpp:21033
bool isAcceptWhispers() const
Definition Player.h:1361
void AddWhisperWhiteList(uint64 guid)
Definition Player.h:3148
bool IsInWhisperWhiteList(uint64 guid)
Definition Player.cpp:22479
Group * GetOriginalGroup()
Definition Player.h:3015
void operator()(WorldPacket &data, LocaleConstant loc_idx)
EmoteChatBuilder(Player const &player, uint32 text_emote, uint32 emote_num, Unit const *target)
Definition Unit.h:1367
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition Unit.h:2243
bool HasAura(uint32 spellId, uint64 casterGUID=0, uint64 itemCasterGUID=0, uint32 reqEffMask=0) const
void HandleEmoteCommand(uint32 anim_id)
uint8 getLevel() const
Definition Unit.h:1528
std::list< AuraEffect * > AuraEffectList
Definition Unit.h:1383
std::string const & GetName() const
Definition Object.h:664
void Initialize(Opcodes opcode, size_t newres=200)
Definition WorldPacket.h:31
Opcodes GetOpcode() const
Definition WorldPacket.h:38
void KickPlayer()
Kick a player out of the World.
const char * GetSkyFireString(int32 entry) const
void HandleChatIgnoredOpcode(WorldPacket &recvPacket)
void SendPlayerNotFoundNotice(std::string const &name)
void SendNotification(const char *format,...) ATTR_PRINTF(2
AccountTypes GetSecurity() const
void HandleTextEmoteOpcode(WorldPacket &recvPacket)
Player * GetPlayer() const
void SendPlayerAmbiguousNotice(std::string const &name)
void HandleEmoteOpcode(WorldPacket &recvPacket)
bool HasPermission(uint32 permissionId)
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
void SendWrongFactionNotice()
void SendChatRestrictedNotice(ChatRestrictionType restriction)
void HandleAddonMessagechatOpcode(WorldPacket &recvPacket)
Player * _player
time_t m_muteTime
void HandleMessagechatOpcode(WorldPacket &recvPacket)
void HandleChannelDeclineInvite(WorldPacket &recvPacket)
ChatRestrictionType
@ CMSG_MESSAGECHAT_ADDON_GUILD
Definition Opcodes.h:270
@ SMSG_CHAT_WRONG_FACTION
Definition Opcodes.h:613
@ SMSG_CHAT_PLAYER_NOT_FOUND
Definition Opcodes.h:611
@ CMSG_MESSAGECHAT_YELL
Definition Opcodes.h:285
@ CMSG_MESSAGECHAT_CHANNEL
Definition Opcodes.h:275
@ CMSG_MESSAGECHAT_ADDON_WHISPER
Definition Opcodes.h:274
@ CMSG_MESSAGECHAT_RAID_WARNING
Definition Opcodes.h:282
@ CMSG_MESSAGECHAT_ADDON_BATTLEGROUND
Definition Opcodes.h:269
@ CMSG_MESSAGECHAT_ADDON_PARTY
Definition Opcodes.h:272
@ CMSG_MESSAGECHAT_DND
Definition Opcodes.h:276
@ CMSG_CHAT_MESSAGE_AFK
Definition Opcodes.h:132
@ CMSG_MESSAGECHAT_ADDON_OFFICER
Definition Opcodes.h:271
@ CMSG_MESSAGECHAT_SAY
Definition Opcodes.h:283
@ CMSG_MESSAGECHAT_RAID
Definition Opcodes.h:281
@ CMSG_MESSAGECHAT_WHISPER
Definition Opcodes.h:284
@ CMSG_MESSAGECHAT_ADDON_RAID
Definition Opcodes.h:273
@ CMSG_MESSAGECHAT_OFFICER
Definition Opcodes.h:279
@ CMSG_MESSAGECHAT_PARTY
Definition Opcodes.h:280
@ CMSG_MESSAGECHAT_GUILD
Definition Opcodes.h:278
@ SMSG_TEXT_EMOTE
Definition Opcodes.h:1025
@ CMSG_MESSAGECHAT_EMOTE
Definition Opcodes.h:277
@ SMSG_CHAT_RESTRICTED
Definition Opcodes.h:612
@ SMSG_CHAT_PLAYER_AMBIGUOUS
Definition Opcodes.h:610
#define sWorld
Definition World.h:910
@ CONFIG_CHAT_CHANNEL_LEVEL_REQ
Definition World.h:277
@ CONFIG_CHAT_SAY_LEVEL_REQ
Definition World.h:279
@ CONFIG_CHAT_WHISPER_LEVEL_REQ
Definition World.h:278
@ CONFIG_CHAT_STRICT_LINK_CHECKING_KICK
Definition World.h:276
@ CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY
Definition World.h:275
@ CONFIG_CHAT_GM_WHISPER_FILTER_BYPASS
Definition World.h:118
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD
Definition World.h:99
@ CONFIG_CHATLOG_ADDON
Definition World.h:149
@ CONFIG_CHAT_FAKE_MESSAGE_PREVENTING
Definition World.h:117
@ CONFIG_ADDON_CHANNEL
Definition World.h:91
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition World.h:98
@ CONFIG_LISTEN_RANGE_TEXTEMOTE
Definition World.h:184
CellCoord ComputeCellCoord(float x, float y)
@ RBAC_PERM_TWO_SIDE_INTERACTION_CHAT
Definition RBAC.h:65
@ RBAC_PERM_CAN_FILTER_WHISPERS
Definition RBAC.h:76
@ RBAC_PERM_SKIP_CHECK_CHAT_CHANNEL_REQ
Definition RBAC.h:59
Definition Cell.h:37
void SetNoCreate()
Definition Cell.h:66
void Visit(CellCoord const &, TypeContainerVisitor< T, CONTAINER > &visitor, Map &, WorldObject const &, float) const
Definition CellImpl.h:109
uint32 textid
uint32 skill_id
Definition ObjectMgr.h:631