Advertisement
nevadies

Untitled

Jul 23rd, 2014
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 36.20 KB | None | 0 0
  1. /*
  2. * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
  3. * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of the GNU General Public License as published by the
  7. * Free Software Foundation; either version 2 of the License, or (at your
  8. * option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful, but WITHOUT
  11. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  13. * more details.
  14. *
  15. * You should have received a copy of the GNU General Public License along
  16. * with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18.  
  19. #include "Common.h"
  20. #include "ObjectAccessor.h"
  21. #include "ObjectMgr.h"
  22. #include "GuildMgr.h"
  23. #include "World.h"
  24. #include "WorldPacket.h"
  25. #include "WorldSession.h"
  26. #include "DatabaseEnv.h"
  27. #include "CellImpl.h"
  28. #include "Chat.h"
  29. #include "ChannelMgr.h"
  30. #include "GridNotifiersImpl.h"
  31. #include "Group.h"
  32. #include "Guild.h"
  33. #include "Language.h"
  34. #include "Log.h"
  35. #include "Opcodes.h"
  36. #include "Player.h"
  37. #include "SpellAuras.h"
  38. #include "SpellAuraEffects.h"
  39. #include "Util.h"
  40. #include "ScriptMgr.h"
  41. #include "AccountMgr.h"
  42.  
  43. void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
  44. {
  45. uint32 type = 0;
  46. uint32 lang;
  47.  
  48.  
  49. switch (recvData.GetOpcode())
  50. {
  51. case CMSG_MESSAGECHAT_SAY:
  52. type = CHAT_MSG_SAY;
  53. break;
  54. case CMSG_MESSAGECHAT_YELL:
  55. type = CHAT_MSG_YELL;
  56. break;
  57. case CMSG_MESSAGECHAT_CHANNEL:
  58. type = CHAT_MSG_CHANNEL;
  59. break;
  60. case CMSG_MESSAGECHAT_WHISPER:
  61. type = CHAT_MSG_WHISPER;
  62. break;
  63. case CMSG_MESSAGECHAT_GUILD:
  64. type = CHAT_MSG_GUILD;
  65. break;
  66. case CMSG_MESSAGECHAT_OFFICER:
  67. type = CHAT_MSG_OFFICER;
  68. break;
  69. case CMSG_MESSAGECHAT_AFK:
  70. type = CHAT_MSG_AFK;
  71. break;
  72. case CMSG_MESSAGECHAT_DND:
  73. type = CHAT_MSG_DND;
  74. break;
  75. case CMSG_MESSAGECHAT_EMOTE:
  76. type = CHAT_MSG_EMOTE;
  77. break;
  78. case CMSG_MESSAGECHAT_PARTY:
  79. type = CHAT_MSG_PARTY;
  80. break;
  81. case CMSG_MESSAGECHAT_RAID:
  82. type = CHAT_MSG_RAID;
  83. break;
  84. /*case CMSG_MESSAGECHAT_BATTLEGROUND:
  85. type = CHAT_MSG_BATTLEGROUND;
  86. break;*/
  87. case CMSG_MESSAGECHAT_RAID_WARNING:
  88. type = CHAT_MSG_RAID_WARNING;
  89. break;
  90. default:
  91. sLog->outError(LOG_FILTER_NETWORKIO, "HandleMessagechatOpcode : Unknown chat opcode (%u)", recvData.GetOpcode());
  92. recvData.hexlike();
  93. return;
  94. }
  95.  
  96. if (type >= MAX_CHAT_MSG_TYPE)
  97. {
  98. sLog->outError(LOG_FILTER_NETWORKIO, "CHAT: Wrong message type received: %u", type);
  99. recvData.rfinish();
  100. return;
  101. }
  102.  
  103. Player* sender = GetPlayer();
  104.  
  105. //sLog->outDebug(LOG_FILTER_GENERAL, "CHAT: packet received. type %u, lang %u", type, lang);
  106.  
  107. // no language sent with emote packet.
  108. if (type != CHAT_MSG_EMOTE && type != CHAT_MSG_AFK && type != CHAT_MSG_DND)
  109. {
  110. recvData >> lang;
  111.  
  112. // prevent talking at unknown language (cheating)
  113. LanguageDesc const* langDesc = GetLanguageDescByID(lang);
  114. if (!langDesc)
  115. {
  116. SendNotification(LANG_UNKNOWN_LANGUAGE);
  117. recvData.rfinish();
  118. return;
  119. }
  120. if (langDesc->skill_id != 0 && !sender->HasSkill(langDesc->skill_id))
  121. {
  122. // also check SPELL_AURA_COMPREHEND_LANGUAGE (client offers option to speak in that language)
  123. Unit::AuraEffectList const& langAuras = sender->GetAuraEffectsByType(SPELL_AURA_COMPREHEND_LANGUAGE);
  124. bool foundAura = false;
  125. for (Unit::AuraEffectList::const_iterator i = langAuras.begin(); i != langAuras.end(); ++i)
  126. {
  127. if ((*i)->GetMiscValue() == int32(lang))
  128. {
  129. foundAura = true;
  130. break;
  131. }
  132. }
  133. if (!foundAura)
  134. {
  135. SendNotification(LANG_NOT_LEARNED_LANGUAGE);
  136. recvData.rfinish();
  137. return;
  138. }
  139. }
  140.  
  141. if (lang == LANG_ADDON)
  142. {
  143. // LANG_ADDON is only valid for the following message types
  144. switch (type)
  145. {
  146. case CHAT_MSG_PARTY:
  147. case CHAT_MSG_RAID:
  148. case CHAT_MSG_GUILD:
  149. /*case CHAT_MSG_BATTLEGROUND:*/
  150. if (sWorld->getBoolConfig(CONFIG_CHATLOG_ADDON))
  151. {
  152. std::string msg = "";
  153. recvData >> msg;
  154.  
  155. if (msg.empty())
  156. return;
  157.  
  158. sScriptMgr->OnPlayerChat(sender, uint32(CHAT_MSG_ADDON), lang, msg);
  159. }
  160.  
  161. // Disabled addon channel?
  162. if (!sWorld->getBoolConfig(CONFIG_ADDON_CHANNEL))
  163. return;
  164. break;
  165. default:
  166. sLog->outError(LOG_FILTER_NETWORKIO, "Player %s (GUID: %u) sent a chatmessage with an invalid language/message type combination",
  167. GetPlayer()->GetName().c_str(), GetPlayer()->GetGUIDLow());
  168.  
  169. recvData.rfinish();
  170. return;
  171. }
  172. }
  173. // LANG_ADDON should not be changed nor be affected by flood control
  174. else
  175. {
  176. // send in universal language if player in .gm on mode (ignore spell effects)
  177. if (sender->isGameMaster())
  178. lang = LANG_UNIVERSAL;
  179. else
  180. {
  181. // send in universal language in two side iteration allowed mode
  182. if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT))
  183. lang = LANG_UNIVERSAL;
  184. else
  185. {
  186. switch (type)
  187. {
  188. case CHAT_MSG_PARTY:
  189. case CHAT_MSG_PARTY_LEADER:
  190. case CHAT_MSG_RAID:
  191. case CHAT_MSG_RAID_LEADER:
  192. case CHAT_MSG_RAID_WARNING:
  193. // allow two side chat at group channel if two side group allowed
  194. if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP))
  195. lang = LANG_UNIVERSAL;
  196. break;
  197. case CHAT_MSG_GUILD:
  198. case CHAT_MSG_OFFICER:
  199. // allow two side chat at guild channel if two side guild allowed
  200. if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD))
  201. lang = LANG_UNIVERSAL;
  202. break;
  203. }
  204. }
  205.  
  206. // but overwrite it by SPELL_AURA_MOD_LANGUAGE auras (only single case used)
  207. Unit::AuraEffectList const& ModLangAuras = sender->GetAuraEffectsByType(SPELL_AURA_MOD_LANGUAGE);
  208. if (!ModLangAuras.empty())
  209. lang = ModLangAuras.front()->GetMiscValue();
  210. }
  211.  
  212. if (!sender->CanSpeak())
  213. {
  214. std::string timeStr = secsToTimeString(m_muteTime - time(NULL));
  215. SendNotification(GetTrinityString(LANG_WAIT_BEFORE_SPEAKING), timeStr.c_str());
  216. recvData.rfinish(); // Prevent warnings
  217. return;
  218. }
  219. }
  220. }
  221. else
  222. lang = LANG_UNIVERSAL;
  223.  
  224. if (sender->HasAura(1852) && type != CHAT_MSG_WHISPER)
  225. {
  226. SendNotification(GetTrinityString(LANG_GM_SILENCE), sender->GetName().c_str());
  227. recvData.rfinish();
  228. return;
  229. }
  230.  
  231. uint32 textLength = 0;
  232. uint32 receiverLength = 0;
  233. std::string to, channel, msg;
  234. bool ignoreChecks = false;
  235. switch (type)
  236. {
  237. case CHAT_MSG_SAY:
  238. case CHAT_MSG_EMOTE:
  239. case CHAT_MSG_YELL:
  240. case CHAT_MSG_PARTY:
  241. case CHAT_MSG_GUILD:
  242. case CHAT_MSG_OFFICER:
  243. case CHAT_MSG_RAID:
  244. case CHAT_MSG_RAID_WARNING:
  245. case CHAT_MSG_INSTANCE_CHAT:
  246. case CHAT_MSG_INSTANCE_CHAT_LEADER:
  247. textLength = recvData.ReadBits(9);
  248. msg = recvData.ReadString(textLength);
  249. break;
  250. case CHAT_MSG_WHISPER:
  251. textLength = recvData.ReadBits(9);
  252. receiverLength = recvData.ReadBits(10);
  253. msg = recvData.ReadString(textLength);
  254. to = recvData.ReadString(receiverLength);
  255. break;
  256. case CHAT_MSG_CHANNEL:
  257. textLength = recvData.ReadBits(9);
  258. receiverLength = recvData.ReadBits(10);
  259. msg = recvData.ReadString(textLength);
  260. channel = recvData.ReadString(receiverLength);
  261. break;
  262. case CHAT_MSG_AFK:
  263. case CHAT_MSG_DND:
  264. textLength = recvData.ReadBits(9);
  265. msg = recvData.ReadString(textLength);
  266. ignoreChecks = true;
  267. break;
  268. }
  269.  
  270. if (!ignoreChecks)
  271. {
  272. if (msg.empty())
  273. return;
  274.  
  275. if (ChatHandler(this).ParseCommands(msg.c_str()))
  276. return;
  277.  
  278. if (lang != LANG_ADDON)
  279. {
  280. // Strip invisible characters for non-addon messages
  281. if (sWorld->getBoolConfig(CONFIG_CHAT_FAKE_MESSAGE_PREVENTING))
  282. stripLineInvisibleChars(msg);
  283.  
  284. if (sWorld->getIntConfig(CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY) && !ChatHandler(this).isValidChatMessage(msg.c_str()))
  285. {
  286. sLog->outError(LOG_FILTER_NETWORKIO, "Player %s (GUID: %u) sent a chatmessage with an invalid link: %s", GetPlayer()->GetName().c_str(),
  287. GetPlayer()->GetGUIDLow(), msg.c_str());
  288.  
  289. if (sWorld->getIntConfig(CONFIG_CHAT_STRICT_LINK_CHECKING_KICK))
  290. KickPlayer();
  291.  
  292. return;
  293. }
  294. }
  295. }
  296.  
  297. switch (type)
  298. {
  299. case CHAT_MSG_SAY:
  300. case CHAT_MSG_EMOTE:
  301. case CHAT_MSG_YELL:
  302. {
  303. if (sender->getLevel() < sWorld->getIntConfig(CONFIG_CHAT_SAY_LEVEL_REQ))
  304. {
  305. SendNotification(GetTrinityString(LANG_SAY_REQ), sWorld->getIntConfig(CONFIG_CHAT_SAY_LEVEL_REQ));
  306. return;
  307. }
  308.  
  309. if (type == CHAT_MSG_SAY)
  310. sender->Say(msg, lang);
  311. else if (type == CHAT_MSG_EMOTE)
  312. sender->TextEmote(msg);
  313. else if (type == CHAT_MSG_YELL)
  314. sender->Yell(msg, lang);
  315. } break;
  316. case CHAT_MSG_WHISPER:
  317. {
  318. if (sender->getLevel() < sWorld->getIntConfig(CONFIG_CHAT_WHISPER_LEVEL_REQ))
  319. {
  320. SendNotification(GetTrinityString(LANG_WHISPER_REQ), sWorld->getIntConfig(CONFIG_CHAT_WHISPER_LEVEL_REQ));
  321. return;
  322. }
  323.  
  324. if (!normalizePlayerName(to))
  325. {
  326. SendPlayerNotFoundNotice(to);
  327. break;
  328. }
  329.  
  330. Player* receiver = sObjectAccessor->FindPlayerByName(to);
  331. bool senderIsPlayer = AccountMgr::IsPlayerAccount(GetSecurity());
  332. bool receiverIsPlayer = AccountMgr::IsPlayerAccount(receiver ? receiver->GetSession()->GetSecurity() : SEC_PLAYER);
  333. if (!receiver || (senderIsPlayer && !receiverIsPlayer && !receiver->isAcceptWhispers() && !receiver->IsInWhisperWhiteList(sender->GetGUID())))
  334. {
  335. SendPlayerNotFoundNotice(to);
  336. return;
  337. }
  338.  
  339. if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_CHAT) && senderIsPlayer && receiverIsPlayer)
  340. if (GetPlayer()->GetTeam() != receiver->GetTeam())
  341. {
  342. SendWrongFactionNotice();
  343. return;
  344. }
  345.  
  346. if (GetPlayer()->HasAura(1852) && !receiver->isGameMaster())
  347. {
  348. SendNotification(GetTrinityString(LANG_GM_SILENCE), GetPlayer()->GetName().c_str());
  349. return;
  350. }
  351.  
  352. // If player is a Gamemaster and doesn't accept whisper, we auto-whitelist every player that the Gamemaster is talking to
  353. if (!senderIsPlayer && !sender->isAcceptWhispers() && !sender->IsInWhisperWhiteList(receiver->GetGUID()))
  354. sender->AddWhisperWhiteList(receiver->GetGUID());
  355.  
  356. GetPlayer()->Whisper(msg, lang, receiver->GetGUID());
  357. } break;
  358. case CHAT_MSG_PARTY:
  359. case CHAT_MSG_PARTY_LEADER:
  360. {
  361. // if player is in battleground, he cannot say to battleground members by /p
  362. Group* group = GetPlayer()->GetOriginalGroup();
  363. if (!group)
  364. {
  365. group = _player->GetGroup();
  366. if (!group || group->isBGGroup())
  367. return;
  368. }
  369.  
  370. if (group->IsLeader(GetPlayer()->GetGUID()))
  371. type = CHAT_MSG_PARTY_LEADER;
  372.  
  373. sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
  374.  
  375. WorldPacket data;
  376. ChatHandler::FillMessageData(&data, this, uint8(type), lang, NULL, 0, msg.c_str(), NULL);
  377. group->BroadcastPacket(&data, false, group->GetMemberGroup(GetPlayer()->GetGUID()));
  378. } break;
  379. case CHAT_MSG_GUILD:
  380. {
  381. if (GetPlayer()->GetGuildId())
  382. {
  383. if (Guild* guild = sGuildMgr->GetGuildById(GetPlayer()->GetGuildId()))
  384. {
  385. sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, guild);
  386.  
  387. guild->BroadcastToGuild(this, false, msg, lang == LANG_ADDON ? LANG_ADDON : LANG_UNIVERSAL);
  388. }
  389. }
  390. } break;
  391. case CHAT_MSG_OFFICER:
  392. {
  393. char message[1024];
  394. switch(GetPlayer()->GetSession()->GetSecurity())
  395. {
  396. case SEC_PLAYER: // normal player, non-vip
  397. if (GetPlayer()->GetTeam()==ALLIANCE) {
  398. snprintf(message, 1024, "|cff33CC00World |cffDC143C[Alliance]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  399. }
  400. if (GetPlayer()->GetTeam()==HORDE) {
  401. snprintf(message, 1024, "|cff33CC00World |cffFF0000[Horde]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  402. }
  403. break;
  404. case 1: // VIP
  405. snprintf(message, 1024, "|cff33CC00World |cff87CEEB[VIP 1]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  406. break;
  407.  
  408. case 2: // regular GM
  409. snprintf(message, 1024, "|cff6600AA{VIP 2]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  410. break;
  411.  
  412. case 3: // Head GM/SGM
  413. snprintf(message, 1024, "|cff6600AA[VIP 3]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  414. break;
  415.  
  416. case 4: // ADMIN
  417. snprintf(message, 1024, "|cff6600AA[VIP 4]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  418. break;
  419.  
  420. case 5: // ADMIN
  421. snprintf(message, 1024, "|cff6600AA[VIP 5]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  422. break;
  423.  
  424. case 6: // ADMIN
  425. snprintf(message, 1024, "|cff00ffff[VIP 6]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  426. break;
  427.  
  428. case 7: // ADMIN
  429. if (GetPlayer()->isGameMaster()==TRUE)
  430. {
  431. snprintf(message, 1024, "|cff33CC00World |TInterface\\ChatFrame\\UI-ChatIcon-Blizz.blp:0:2:0:-3|t |cfffa9900[Trial GM]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  432. }
  433. {
  434. if (GetPlayer()->isGameMaster()==FALSE)
  435. if (GetPlayer()->GetTeam()==HORDE)
  436. snprintf(message, 1024, "|cff33CC00World |cffFF0000[Horde]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  437. }
  438. {
  439. if (GetPlayer()->isGameMaster()==FALSE)
  440. if (GetPlayer()->GetTeam()==ALLIANCE)
  441. snprintf(message, 1024, "|cff33CC00World |cff0000FF[Alliance]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  442. }
  443. break;
  444.  
  445. case 9: // ADMIN
  446. if (GetPlayer()->isGameMaster()==TRUE)
  447. {
  448. snprintf(message, 1024, "|cff33CC00World |TInterface\\ChatFrame\\UI-ChatIcon-Blizz.blp:0:2:0:-3|t |cffff8a00[GM]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  449. }
  450. {
  451. if (GetPlayer()->isGameMaster()==FALSE)
  452. if (GetPlayer()->GetTeam()==HORDE)
  453. snprintf(message, 1024, "|cff33CC00World |cffFF0000[Horde]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  454. }
  455. {
  456. if (GetPlayer()->isGameMaster()==FALSE)
  457. if (GetPlayer()->GetTeam()==ALLIANCE)
  458. snprintf(message, 1024, "|cff33CC00World |cff0000FF[Alliance]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  459. }
  460. break;
  461.  
  462. case 10: // ADMIN
  463. if (GetPlayer()->isGameMaster()==TRUE)
  464. {
  465. snprintf(message, 1024, "|cff33CC00World |TInterface\\ChatFrame\\UI-ChatIcon-Blizz.blp:0:2:0:-3|t |cffff8a00[Bug Abuser & Developer]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  466. }
  467. {
  468. if (GetPlayer()->isGameMaster()==FALSE)
  469. if (GetPlayer()->GetTeam()==HORDE)
  470. snprintf(message, 1024, "|cff33CC00World |cffFF0000[Horde]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  471. }
  472. {
  473. if (GetPlayer()->isGameMaster()==FALSE)
  474. if (GetPlayer()->GetTeam()==ALLIANCE)
  475. snprintf(message, 1024, "|cff33CC00World |cff0000FF[Alliance]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  476. }
  477. break;
  478.  
  479. case 11: // ADMIN
  480. if (GetPlayer()->isGameMaster()==TRUE)
  481. {
  482. snprintf(message, 1024, "|cff33CC00World |TInterface\\ChatFrame\\UI-ChatIcon-Blizz.blp:0:2:0:-3|t |cffff8a00Developer]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  483. }
  484. {
  485. if (GetPlayer()->isGameMaster()==FALSE)
  486. if (GetPlayer()->GetTeam()==HORDE)
  487. snprintf(message, 1024, "|cff33CC00World |cffFF0000[Horde]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  488. }
  489. {
  490. if (GetPlayer()->isGameMaster()==FALSE)
  491. if (GetPlayer()->GetTeam()==ALLIANCE)
  492. snprintf(message, 1024, "|cff33CC00World |cff0000FF[Alliance]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  493. }
  494. break;
  495.  
  496. case 12: // ADMIN
  497. if (GetPlayer()->isGameMaster()==TRUE)
  498. {
  499. snprintf(message, 1024, "|cff33CC00World |TInterface\\ChatFrame\\UI-ChatIcon-Blizz.blp:0:2:0:-3|t |cff00FFF2[Head Developer]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  500. }
  501. {
  502. if (GetPlayer()->isGameMaster()==FALSE)
  503. if (GetPlayer()->GetTeam()==HORDE)
  504. snprintf(message, 1024, "|cff33CC00World |cffFF0000[Horde]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  505. }
  506. {
  507. if (GetPlayer()->isGameMaster()==FALSE)
  508. if (GetPlayer()->GetTeam()==ALLIANCE)
  509. snprintf(message, 1024, "|cff33CC00World |cff0000FF[Alliance]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  510. }
  511. break;
  512.  
  513. case 13: // ADMIN
  514. if (GetPlayer()->isGameMaster()==TRUE)
  515. {
  516. snprintf(message, 1024, "|cff33CC00World |TInterface\\ChatFrame\\UI-ChatIcon-Blizz.blp:0:2:0:-3|t |cffff8a00[Admin]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  517. }
  518. {
  519. if (GetPlayer()->isGameMaster()==FALSE)
  520. if (GetPlayer()->GetTeam()==HORDE)
  521. snprintf(message, 1024, "|cff33CC00World |cffFF0000[Horde]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  522. }
  523. {
  524. if (GetPlayer()->isGameMaster()==FALSE)
  525. if (GetPlayer()->GetTeam()==ALLIANCE)
  526. snprintf(message, 1024, "|cff33CC00World |cff0000FF[Alliance]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  527. }
  528. break;
  529.  
  530. case 14: // ADMIN
  531. if (GetPlayer()->isGameMaster()==TRUE)
  532. {
  533. snprintf(message, 1024, "|cff33CC00World |TInterface\\ChatFrame\\UI-ChatIcon-Blizz.blp:0:2:0:-3|t |cffff8a00[Head Admin]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  534. }
  535. {
  536. if (GetPlayer()->isGameMaster()==FALSE)
  537. if (GetPlayer()->GetTeam()==HORDE)
  538. snprintf(message, 1024, "|cff33CC00World |cffFF0000[Horde]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  539. }
  540. {
  541. if (GetPlayer()->isGameMaster()==FALSE)
  542. if (GetPlayer()->GetTeam()==ALLIANCE)
  543. snprintf(message, 1024, "|cff33CC00World |cff0000FF[Alliance]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  544. }
  545. break;
  546.  
  547. case 15: // ADMIN
  548. if (GetPlayer()->isGameMaster()==TRUE)
  549. {
  550. snprintf(message, 1024, "|cff33CC00World |TInterface\\ChatFrame\\UI-ChatIcon-Blizz.blp:0:2:0:-3|t |cffff8a00[Co-Owner & Developer]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  551. }
  552. {
  553. if (GetPlayer()->isGameMaster()==FALSE)
  554. if (GetPlayer()->GetTeam()==HORDE)
  555. snprintf(message, 1024, "|cff33CC00World |cffFF0000[Horde]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  556. }
  557. {
  558. if (GetPlayer()->isGameMaster()==FALSE)
  559. if (GetPlayer()->GetTeam()==ALLIANCE)
  560. snprintf(message, 1024, "|cff33CC00World |cff0000FF[Alliance]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  561. }
  562. break;
  563.  
  564. case 16: // ADMIN
  565. if (GetPlayer()->isGameMaster()==TRUE)
  566. {
  567. snprintf(message, 1024, "|cff33CC00World |TInterface\\ChatFrame\\UI-ChatIcon-Blizz.blp:0:2:0:-3|t |cff00FF04[Epidemic-WoW Owner]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  568. }
  569. {
  570. if (GetPlayer()->isGameMaster()==FALSE)
  571. if (GetPlayer()->GetTeam()==HORDE)
  572. snprintf(message, 1024, "|cff33CC00World |cffFF0000[Horde]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  573. }
  574. {
  575. if (GetPlayer()->isGameMaster()==FALSE)
  576. if (GetPlayer()->GetTeam()==ALLIANCE)
  577. snprintf(message, 1024, "|cff33CC00World |cff0000FF[Alliance]|cff00CCEE[%s]:|cffFFFF00 %s", GetPlayer()->GetName().c_str(), msg.c_str());
  578. }
  579. break;
  580.  
  581. }
  582. sWorld->SendGlobalText(message, NULL);
  583. } break;
  584. case CHAT_MSG_RAID:
  585. case CHAT_MSG_RAID_LEADER:
  586. {
  587. Group* group = GetPlayer()->GetOriginalGroup();
  588. if (!group)
  589. {
  590. group = GetPlayer()->GetGroup();
  591. if (!group || !group->isRaidGroup() && !group->isBGGroup())
  592. return;
  593. }
  594.  
  595. if (GetPlayer()->GetGroup()->isBGGroup())
  596. {
  597. if (GetPlayer()->GetGroup()->IsLeader(GetPlayer()->GetGUID()))
  598. type = CHAT_MSG_INSTANCE_CHAT_LEADER;
  599. else type = CHAT_MSG_INSTANCE_CHAT;
  600. }
  601.  
  602. else if (!GetPlayer()->GetGroup()->isBGGroup())
  603. {
  604. if (group->IsLeader(GetPlayer()->GetGUID()))
  605. type = CHAT_MSG_RAID_LEADER;
  606. else type = CHAT_MSG_RAID;
  607. }
  608.  
  609. sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
  610.  
  611. WorldPacket data;
  612. ChatHandler::FillMessageData(&data, this, uint8(type), lang, "", 0, msg.c_str(), NULL);
  613. group->BroadcastPacket(&data, false);
  614. } break;
  615. case CHAT_MSG_RAID_WARNING:
  616. {
  617. Group* group = GetPlayer()->GetGroup();
  618. if (!group || !group->isRaidGroup() || !(group->IsLeader(GetPlayer()->GetGUID()) || group->IsAssistant(GetPlayer()->GetGUID())) || group->isBGGroup())
  619. return;
  620.  
  621. sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
  622.  
  623. WorldPacket data;
  624. //in battleground, raid warning is sent only to players in battleground - code is ok
  625. ChatHandler::FillMessageData(&data, this, CHAT_MSG_RAID_WARNING, lang, "", 0, msg.c_str(), NULL);
  626. group->BroadcastPacket(&data, false);
  627. } break;
  628. case CHAT_MSG_INSTANCE_CHAT:
  629. case CHAT_MSG_INSTANCE_CHAT_LEADER:
  630. {
  631. Group* group = GetPlayer()->GetGroup();
  632. if (!group && !group->isLFGGroup() && !group->isBGGroup())
  633. return;
  634.  
  635. if (group->IsLeader(GetPlayer()->GetGUID()))
  636. type = CHAT_MSG_INSTANCE_CHAT_LEADER;
  637. else type = CHAT_MSG_INSTANCE_CHAT;
  638.  
  639. sScriptMgr->OnPlayerChat(GetPlayer(), type, lang, msg, group);
  640.  
  641. WorldPacket data;
  642. ChatHandler::FillMessageData(&data, this, uint8(type), lang, "", 0, msg.c_str(), NULL);
  643. group->BroadcastPacket(&data, false);
  644. } break;
  645. case CHAT_MSG_CHANNEL:
  646. {
  647. if (AccountMgr::IsPlayerAccount(GetSecurity()))
  648. {
  649. if (_player->getLevel() < sWorld->getIntConfig(CONFIG_CHAT_CHANNEL_LEVEL_REQ))
  650. {
  651. SendNotification(GetTrinityString(LANG_CHANNEL_REQ), sWorld->getIntConfig(CONFIG_CHAT_CHANNEL_LEVEL_REQ));
  652. return;
  653. }
  654. }
  655.  
  656. if (ChannelMgr* cMgr = ChannelMgr::forTeam(_player->GetTeam()))
  657. {
  658. if (Channel* chn = cMgr->GetChannel(channel, _player))
  659. {
  660. sScriptMgr->OnPlayerChat(_player, type, lang, msg, chn);
  661. chn->Say(_player->GetGUID(), msg.c_str(), lang);
  662. }
  663. }
  664. } break;
  665. case CHAT_MSG_AFK:
  666. {
  667. if (!_player->isInCombat())
  668. {
  669. if (_player->isAFK()) // Already AFK
  670. {
  671. if (msg.empty())
  672. _player->ToggleAFK(); // Remove AFK
  673. else
  674. _player->autoReplyMsg = msg; // Update message
  675. }
  676. else // New AFK mode
  677. {
  678. _player->autoReplyMsg = msg.empty() ? GetTrinityString(LANG_PLAYER_AFK_DEFAULT) : msg;
  679.  
  680. if (_player->isDND())
  681. _player->ToggleDND();
  682.  
  683. _player->ToggleAFK();
  684. }
  685.  
  686. sScriptMgr->OnPlayerChat(_player, type, lang, msg);
  687. }
  688. break;
  689. }
  690. case CHAT_MSG_DND:
  691. {
  692. if (_player->isDND()) // Already DND
  693. {
  694. if (msg.empty())
  695. _player->ToggleDND(); // Remove DND
  696. else
  697. _player->autoReplyMsg = msg; // Update message
  698. }
  699. else // New DND mode
  700. {
  701. _player->autoReplyMsg = msg.empty() ? GetTrinityString(LANG_PLAYER_DND_DEFAULT) : msg;
  702.  
  703. if (_player->isAFK())
  704. _player->ToggleAFK();
  705.  
  706. _player->ToggleDND();
  707. }
  708.  
  709. sScriptMgr->OnPlayerChat(_player, type, lang, msg);
  710. break;
  711. }
  712. default:
  713. sLog->outError(LOG_FILTER_NETWORKIO, "CHAT: unknown message type %u, lang: %u", type, lang);
  714. break;
  715. }
  716. }
  717.  
  718. void WorldSession::HandleAddonMessagechatOpcode(WorldPacket& recvData)
  719. {
  720. Player* sender = GetPlayer();
  721. ChatMsg type;
  722.  
  723. switch (recvData.GetOpcode())
  724. {
  725. /*case CMSG_MESSAGECHAT_ADDON_BATTLEGROUND:
  726. type = CHAT_MSG_BATTLEGROUND;
  727. break;*/
  728. case CMSG_MESSAGECHAT_ADDON_GUILD:
  729. type = CHAT_MSG_GUILD;
  730. break;
  731. case CMSG_MESSAGECHAT_ADDON_OFFICER:
  732. type = CHAT_MSG_OFFICER;
  733. break;
  734. case CMSG_MESSAGECHAT_ADDON_PARTY:
  735. type = CHAT_MSG_PARTY;
  736. break;
  737. case CMSG_MESSAGECHAT_ADDON_RAID:
  738. type = CHAT_MSG_RAID;
  739. break;
  740. case CMSG_MESSAGECHAT_ADDON_WHISPER:
  741. type = CHAT_MSG_WHISPER;
  742. break;
  743. default:
  744. sLog->outError(LOG_FILTER_NETWORKIO, "HandleAddonMessagechatOpcode: Unknown addon chat opcode (%u)", recvData.GetOpcode());
  745. recvData.hexlike();
  746. return;
  747. }
  748.  
  749. std::string message;
  750. std::string prefix;
  751. std::string targetName;
  752.  
  753. switch (type)
  754. {
  755. case CHAT_MSG_WHISPER:
  756. {
  757. uint32 msgLen = recvData.ReadBits(9);
  758. uint32 prefixLen = recvData.ReadBits(5);
  759. uint32 targetLen = recvData.ReadBits(10);
  760. message = recvData.ReadString(msgLen);
  761. prefix = recvData.ReadString(prefixLen);
  762. targetName = recvData.ReadString(targetLen);
  763. break;
  764. }
  765. case CHAT_MSG_PARTY:
  766. case CHAT_MSG_RAID:
  767. case CHAT_MSG_OFFICER:
  768. {
  769. uint32 prefixLen = recvData.ReadBits(5);
  770. uint32 msgLen = recvData.ReadBits(9);
  771. prefix = recvData.ReadString(prefixLen);
  772. message = recvData.ReadString(msgLen);
  773. break;
  774. }
  775. case CHAT_MSG_GUILD:
  776. /*case CHAT_MSG_BATTLEGROUND:
  777. {
  778. uint32 msgLen = recvData.ReadBits(9);
  779. uint32 prefixLen = recvData.ReadBits(5);
  780. message = recvData.ReadString(msgLen);
  781. prefix = recvData.ReadString(prefixLen);
  782. break;
  783. }*/
  784. default:
  785. break;
  786. }
  787.  
  788. // Logging enabled?
  789. if (sWorld->getBoolConfig(CONFIG_CHATLOG_ADDON))
  790. {
  791. if (message.empty())
  792. return;
  793.  
  794. // Weird way to log stuff...
  795. sScriptMgr->OnPlayerChat(sender, uint32(CHAT_MSG_ADDON), uint32(LANG_ADDON), message);
  796. }
  797.  
  798. // Disabled addon channel?
  799. if (!sWorld->getBoolConfig(CONFIG_ADDON_CHANNEL))
  800. return;
  801.  
  802. switch (type)
  803. {
  804. /*case CHAT_MSG_BATTLEGROUND:
  805. {
  806. Group* group = sender->GetGroup();
  807. if (!group || !group->isBGGroup())
  808. return;
  809.  
  810. WorldPacket data;
  811. ChatHandler::FillMessageData(&data, this, type, uint32(LANG_ADDON), "", 0, message.c_str(), NULL);
  812. group->BroadcastAddonMessagePacket(&data, prefix, false);
  813. break;
  814. }*/
  815. case CHAT_MSG_GUILD:
  816. case CHAT_MSG_OFFICER:
  817. {
  818. if (sender->GetGuildId())
  819. if (Guild* guild = sGuildMgr->GetGuildById(sender->GetGuildId()))
  820. guild->BroadcastAddonToGuild(this, type == CHAT_MSG_OFFICER, message, prefix);
  821. break;
  822. }
  823. case CHAT_MSG_WHISPER:
  824. {
  825. if (!normalizePlayerName(targetName))
  826. break;
  827. Player* receiver = sObjectAccessor->FindPlayerByName(targetName.c_str());
  828. if (!receiver)
  829. break;
  830.  
  831. sender->WhisperAddon(message, prefix, receiver);
  832. break;
  833. }
  834. // Messages sent to "RAID" while in a party will get delivered to "PARTY"
  835. case CHAT_MSG_PARTY:
  836. case CHAT_MSG_RAID:
  837. {
  838.  
  839. Group* group = sender->GetGroup();
  840. if (!group || group->isBGGroup())
  841. break;
  842.  
  843. WorldPacket data;
  844. ChatHandler::FillMessageData(&data, this, type, uint32(LANG_ADDON), "", 0, message.c_str(), NULL, prefix.c_str());
  845. group->BroadcastAddonMessagePacket(&data, prefix, true, -1, group->GetMemberGroup(sender->GetGUID()));
  846. break;
  847. }
  848. default:
  849. {
  850. sLog->outError(LOG_FILTER_GENERAL, "HandleAddonMessagechatOpcode: unknown addon message type %u", type);
  851. break;
  852. }
  853. }
  854. }
  855.  
  856. void WorldSession::HandleEmoteOpcode(WorldPacket& recvData)
  857. {
  858. if (!GetPlayer()->isAlive() || GetPlayer()->HasUnitState(UNIT_STATE_DIED))
  859. return;
  860.  
  861. uint32 emote;
  862. recvData >> emote;
  863. sScriptMgr->OnPlayerEmote(GetPlayer(), emote);
  864. GetPlayer()->HandleEmoteCommand(emote);
  865. }
  866.  
  867. namespace Trinity
  868. {
  869. class EmoteChatBuilder
  870. {
  871. public:
  872. EmoteChatBuilder(Player const& player, uint32 text_emote, uint32 emote_num, Unit const* target)
  873. : i_player(player), i_text_emote(text_emote), i_emote_num(emote_num), i_target(target) {}
  874.  
  875. void operator()(WorldPacket& data, LocaleConstant loc_idx)
  876. {
  877. std::string const name(i_target ? i_target->GetNameForLocaleIdx(loc_idx) : "");
  878. uint32 namlen = name.size();
  879.  
  880. data.Initialize(SMSG_TEXT_EMOTE, 20 + namlen);
  881. data << i_player.GetGUID();
  882. data << uint32(i_text_emote);
  883. data << uint32(i_emote_num);
  884. data << uint32(namlen);
  885. if (namlen > 1)
  886. data << name;
  887. else
  888. data << uint8(0x00);
  889. }
  890.  
  891. private:
  892. Player const& i_player;
  893. uint32 i_text_emote;
  894. uint32 i_emote_num;
  895. Unit const* i_target;
  896. };
  897. } // namespace Trinity
  898.  
  899. void WorldSession::HandleTextEmoteOpcode(WorldPacket& recvData)
  900. {
  901. if (!GetPlayer()->isAlive())
  902. return;
  903.  
  904. if (!GetPlayer()->CanSpeak())
  905. {
  906. std::string timeStr = secsToTimeString(m_muteTime - time(NULL));
  907. SendNotification(GetTrinityString(LANG_WAIT_BEFORE_SPEAKING), timeStr.c_str());
  908. return;
  909. }
  910.  
  911. uint32 text_emote, emoteNum;
  912. uint64 guid;
  913.  
  914. recvData >> text_emote;
  915. recvData >> emoteNum;
  916. recvData >> guid;
  917.  
  918. sScriptMgr->OnPlayerTextEmote(GetPlayer(), text_emote, emoteNum, guid);
  919.  
  920. EmotesTextEntry const* em = sEmotesTextStore.LookupEntry(text_emote);
  921. if (!em)
  922. return;
  923.  
  924. uint32 emote_anim = em->textid;
  925.  
  926. switch (emote_anim)
  927. {
  928. case EMOTE_STATE_SLEEP:
  929. case EMOTE_STATE_SIT:
  930. case EMOTE_STATE_KNEEL:
  931. case EMOTE_ONESHOT_NONE:
  932. break;
  933. default:
  934. // Only allow text-emotes for "dead" entities (feign death included)
  935. if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
  936. break;
  937. GetPlayer()->HandleEmoteCommand(emote_anim);
  938. break;
  939. }
  940.  
  941. Unit* unit = ObjectAccessor::GetUnit(*_player, guid);
  942.  
  943. CellCoord p = Trinity::ComputeCellCoord(GetPlayer()->GetPositionX(), GetPlayer()->GetPositionY());
  944.  
  945. Cell cell(p);
  946. cell.SetNoCreate();
  947.  
  948. Trinity::EmoteChatBuilder emote_builder(*GetPlayer(), text_emote, emoteNum, unit);
  949. Trinity::LocalizedPacketDo<Trinity::EmoteChatBuilder > emote_do(emote_builder);
  950. Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::EmoteChatBuilder > > emote_worker(GetPlayer(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), emote_do);
  951. TypeContainerVisitor<Trinity::PlayerDistWorker<Trinity::LocalizedPacketDo<Trinity::EmoteChatBuilder> >, WorldTypeMapContainer> message(emote_worker);
  952. cell.Visit(p, message, *GetPlayer()->GetMap(), *GetPlayer(), sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE));
  953.  
  954. GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE, text_emote, 0, 0, unit);
  955.  
  956. //Send scripted event call
  957. if (unit && unit->GetTypeId() == TYPEID_UNIT && ((Creature*)unit)->AI())
  958. ((Creature*)unit)->AI()->ReceiveEmote(GetPlayer(), text_emote);
  959. }
  960.  
  961. void WorldSession::HandleChatIgnoredOpcode(WorldPacket& recvData)
  962. {
  963. ObjectGuid guid;
  964. uint8 unk;
  965. //sLog->outDebug(LOG_FILTER_PACKETIO, "WORLD: Received CMSG_CHAT_IGNORED");
  966.  
  967. recvData >> unk; // probably related to spam reporting
  968. guid[5] = recvData.ReadBit();
  969. guid[2] = recvData.ReadBit();
  970. guid[6] = recvData.ReadBit();
  971. guid[4] = recvData.ReadBit();
  972. guid[7] = recvData.ReadBit();
  973. guid[0] = recvData.ReadBit();
  974. guid[1] = recvData.ReadBit();
  975. guid[3] = recvData.ReadBit();
  976.  
  977. recvData.ReadByteSeq(guid[0]);
  978. recvData.ReadByteSeq(guid[6]);
  979. recvData.ReadByteSeq(guid[5]);
  980. recvData.ReadByteSeq(guid[1]);
  981. recvData.ReadByteSeq(guid[4]);
  982. recvData.ReadByteSeq(guid[3]);
  983. recvData.ReadByteSeq(guid[7]);
  984. recvData.ReadByteSeq(guid[2]);
  985.  
  986. Player* player = ObjectAccessor::FindPlayer(guid);
  987. if (!player || !player->GetSession())
  988. return;
  989.  
  990. WorldPacket data;
  991. ChatHandler::FillMessageData(&data, this, CHAT_MSG_IGNORED, LANG_UNIVERSAL, NULL, GetPlayer()->GetGUID(), GetPlayer()->GetName().c_str(), NULL);
  992. player->GetSession()->SendPacket(&data);
  993. }
  994.  
  995. void WorldSession::HandleChannelDeclineInvite(WorldPacket &recvPacket)
  996. {
  997. sLog->outDebug(LOG_FILTER_NETWORKIO, "Opcode %u", recvPacket.GetOpcode());
  998. }
  999.  
  1000. void WorldSession::SendPlayerNotFoundNotice(std::string const& name)
  1001. {
  1002. WorldPacket data(SMSG_CHAT_PLAYER_NOT_FOUND, name.size()+1);
  1003. data << name;
  1004. SendPacket(&data);
  1005. }
  1006.  
  1007. void WorldSession::SendPlayerAmbiguousNotice(std::string const& name)
  1008. {
  1009. WorldPacket data(SMSG_CHAT_PLAYER_AMBIGUOUS, name.size()+1);
  1010. data << name;
  1011. SendPacket(&data);
  1012. }
  1013.  
  1014. void WorldSession::SendWrongFactionNotice()
  1015. {
  1016. WorldPacket data(SMSG_CHAT_WRONG_FACTION, 0);
  1017. SendPacket(&data);
  1018. }
  1019.  
  1020. void WorldSession::SendChatRestrictedNotice(ChatRestrictionType restriction)
  1021. {
  1022. WorldPacket data(SMSG_CHAT_RESTRICTED, 1);
  1023. data << uint8(restriction);
  1024. SendPacket(&data);
  1025. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement