int CInputMain::Chat(LPCHARACTER ch, const char * data, size_t uiBytes) { const TPacketCGChat* pinfo = reinterpret_cast(data); if (uiBytes < pinfo->size) return -1; const int iExtraLen = pinfo->size - sizeof(TPacketCGChat); if (iExtraLen < 0) { sys_err("invalid packet length (len %d size %u buffer %u)", iExtraLen, pinfo->size, uiBytes); ch->GetDesc()->SetPhase(PHASE_CLOSE); return -1; } char buf[CHAT_MAX_LEN - (CHARACTER_NAME_MAX_LEN + 3) + 1]; strlcpy(buf, data + sizeof(TPacketCGChat), MIN(iExtraLen + 1, sizeof(buf))); const size_t buflen = strlen(buf); if((!strstr(buf, "|Hitem:") && strstr(buf, "|c")) || strstr(buf, "|Hitem:1:1:6")) { return iExtraLen; } if (ch->GetMapIndex() == OXEVENT_MAP_INDEX && !ch->IsGM()) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("In this map you can not do that.")); return iExtraLen; } if (buflen > 1 && *buf == '/') { interpret_command(ch, buf + 1, buflen - 1); return iExtraLen; } if (ch->IncreaseChatCounter() >= 10) { if (ch->GetChatCounter() == 10) { sys_log(0, "CHAT_HACK: %s", ch->GetName()); ch->GetDesc()->DelayedDisconnect(5); } return iExtraLen; } // äÆà ±ÝÁö Affect ó¸® const CAffect* pAffect = ch->FindAffect(AFFECT_BLOCK_CHAT); if (pAffect != NULL) { SendBlockChatInfo(ch, pAffect->lDuration); return iExtraLen; } if (true == SpamBlockCheck(ch, buf, buflen)) { return iExtraLen; } char chatbuf[CHAT_MAX_LEN + 1]; int len = snprintf(chatbuf, sizeof(chatbuf), "%s : %s", ch->GetName(), buf); // EXTENDED_SHOUT if (pinfo->type == CHAT_TYPE_SHOUT) { switch (ch->GetEmpire()) { case 1: { // Shinsoo len = snprintf(chatbuf, sizeof(chatbuf), "%s %s%s%s%s%s : %s", "|cFFFF0000|H|h[S]|cFFA7FFD4|H|h", "|cFFA7FFD4|HMakePM:", ch->GetName(), "|h", ch->GetName(), "|h|r", buf); break; } case 2: { // Chunjo len = snprintf(chatbuf, sizeof(chatbuf), "%s %s%s%s%s%s : %s", "|cFFFFFF00|H|h[C]|cFFA7FFD4|H|h", "|cFFA7FFD4|HMakePM:", ch->GetName(), "|h", ch->GetName(), "|h|r", buf); break; } case 3: { // Jinno len = snprintf(chatbuf, sizeof(chatbuf), "%s %s%s%s%s%s : %s", "|cFF0080FF|H|h[J]|cFFA7FFD4|H|h", "|cFFA7FFD4|HMakePM:", ch->GetName(), "|h", ch->GetName(), "|h|r", buf); break; } default: break; } } // END_OF_EXTENDED_SHOUT if (CHAT_TYPE_SHOUT == pinfo->type) { LogManager::instance().ShoutLog(g_bChannel, ch->GetEmpire(), chatbuf); } CBanwordManager::instance().ConvertString(buf, buflen); if (len < 0 || len >= (int) sizeof(chatbuf)) len = sizeof(chatbuf) - 1; int processReturn = ProcessTextTag(ch, chatbuf, len); if (0!=processReturn) { const TItemTable* pTable = ITEM_MANAGER::instance().GetTable(ITEM_PRISM); if (NULL != pTable) { if (3==processReturn) //±³È¯Áß ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´Ù¸¥ °Å·¡Áß(â°í,±³È¯,»óÁ¡)¿¡´Â °³ÀλóÁ¡À» »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù."), pTable->szLocaleName); else ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%sÀÌ ÇÊ¿äÇÕ´Ï´Ù."), pTable->szLocaleName); } return iExtraLen; } if (pinfo->type == CHAT_TYPE_SHOUT) { const int SHOUT_LIMIT_LEVEL = g_iUseLocale ? 15 : 3; if (ch->GetLevel() < SHOUT_LIMIT_LEVEL) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¿ÜÄ¡±â´Â ·¹º§ %d ÀÌ»ó¸¸ »ç¿ë °¡´É ÇÕ´Ï´Ù."), SHOUT_LIMIT_LEVEL); return (iExtraLen); } if (thecore_heart->pulse - (int) ch->GetLastShoutPulse() < passes_per_sec * 15) return (iExtraLen); ch->SetLastShoutPulse(thecore_heart->pulse); TPacketGGShout p; p.bHeader = HEADER_GG_SHOUT; p.bEmpire = ch->GetEmpire(); strlcpy(p.szText, chatbuf, sizeof(p.szText)); P2P_MANAGER::instance().Send(&p, sizeof(TPacketGGShout)); SendShout(chatbuf, ch->GetEmpire()); return (iExtraLen); } TPacketGCChat pack_chat; pack_chat.header = HEADER_GC_CHAT; pack_chat.size = sizeof(TPacketGCChat) + len; pack_chat.type = pinfo->type; pack_chat.id = ch->GetVID(); switch (pinfo->type) { case CHAT_TYPE_TALKING: { const DESC_MANAGER::DESC_SET & c_ref_set = DESC_MANAGER::instance().GetClientSet(); std::for_each(c_ref_set.begin(), c_ref_set.end(), FEmpireChatPacket(pack_chat, chatbuf, len, ch->GetMapIndex(), strlen(ch->GetName()))); } break; case CHAT_TYPE_PARTY: { if (!ch->GetParty()) ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÆÄƼ ÁßÀÌ ¾Æ´Õ´Ï´Ù.")); else { TEMP_BUFFER tbuf; tbuf.write(&pack_chat, sizeof(pack_chat)); tbuf.write(chatbuf, len); RawPacketToCharacterFunc f(tbuf.read_peek(), tbuf.size()); ch->GetParty()->ForEachOnlineMember(f); } } break; case CHAT_TYPE_GUILD: { if (!ch->GetGuild()) ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±æµå¿¡ °¡ÀÔÇÏÁö ¾Ê¾Ò½À´Ï´Ù.")); else ch->GetGuild()->Chat(chatbuf); } break; default: sys_err("Unknown chat type %d", pinfo->type); break; } return (iExtraLen); }