Здравствуйте, эта тема создана для того, чтобы защитить игровой чат от лишних идиотов. Что будет добавлено:
- Игрок сможет написать сообщение повторно только через 5 секунд.
- Игрок получит бан чата на 1 минуту, если попытается написать одно сообщение более, чем 3 раза в течении 5 секунд.
- В файл "blockspamlist.lst" можно написать слова, которые не можно будет писать в чате, если игрок напишет слово из этого файла, он получит бан чата на 5 минут (время можно изменить).
- В файл "bannspamlist.lst" можно написать слова, которые не можно будет писать в чате, если игрок напишет слово из этого файла, он получит
бан чата на длительный период.(время можно изменить).
_________________________________________
Открываем game/input_main.cpp и ищем: Код
if (ch->IncreaseChatCounter() >= 10)
После этого добавляем:
Код
if (!strcmp(ch->LastPlayerMessage, buf) && (thecore_pulse() < (ch->LastMessageAt +
SPAM_WAIT_SEC * 25)) && !ch->SpamAllowBuf(buf) &&
ch->GetGMLevel() < GM_LOW_WIZARD)
{
if (ch->BlockChatAfter < 2)
{
ch->ChatPacket(CHAT_TYPE_INFO, ("Повторить свое сообщение можно только через 5 секунд. "));
ch->BlockChatAfter++;
return iExtraLen;
}
else
{
ch->BlockChatAfter = 0;
ch->PlayerPunish(false, SPAM_CHAT_BAN_TIME);
return iExtraLen;
}
}
else
{
if (!ch->BannListCheck(buf) && ch->GetGMLevel() < GM_LOW_WIZARD)
{
ch->PlayerPunish(true, SPAM_BAN_TIME);
return iExtraLen;
}
if (!ch->SpamListCheck(buf) && ch->GetGMLevel() < GM_LOW_WIZARD)
{
ch->ChatPacket(CHAT_TYPE_INFO, ("В вашем тексте запрещенные слова!"));
ch->PlayerPunish(false, SPAM_CHAT_BAN_TIME);
return iExtraLen;
}
}
После этого ищем:
Код
ch->GetMapIndex(), strlen(ch->GetName())));
и добавляем после него:
Код
strcpy(ch->LastPlayerMessage, buf);
ch->LastMessageAt = thecore_pulse();
ch->BlockChatAfter = 0;
Открываем game/char.h и ищем:
Код
BYTE GetChatCounter() const;
и добавляем после него:
Код
int LastMessageAt;
int BlockChatAfter;
char LastPlayerMessage[CHAT_MAX_LEN + 1];
void PlayerPunish(bool PowerPunish, int Duration);
bool SpamListCheck(const char *Message);
bool BannListCheck(const char *Message);
bool SpamAllowBuf(const char *Message);
Открываем game/char.cpp и добавляем:
Код
void CHARACTER::PlayerPunish(bool PowerPunish, int Duration)
{
if (!PowerPunish)
{
AddAffect(AFFECT_BLOCK_CHAT, POINT_NONE, 0, AFF_NONE, Duration, 0, true);
sys_log(0, "%s[%d] has been chatbanned because of spamming/writing words which are in the spamlist.txt", GetName(), GetPlayerID());
}
else
{
std::auto_ptr<SQLMsg> msg(DBManager::instance().DirectQuery("UPDATE account.account SET availDt = FROM_UNIXTIME(UNIX_TIMESTAMP(CURRENT_TIMESTAMP()) + %i) WHERE id = %d", Duration, GetAID()));
sys_log(0, "%s[%d] has been banned because of saying blacklisted word", GetName(), GetPlayerID());
GetDesc()->DelayedDisconnect(5);
}
}
bool CHARACTER::SpamAllowBuf(const char *Message)
{
if (!strcmp(Message, "(Ȳ´ç)") || !strcmp(Message, "(µ·)") || !strcmp(Message, "(±â»Ý)") || !strcmp(Message, "(ÁÁľĆ)") || !strcmp(Message, "(»ç¶ű)") || !strcmp(Message, "(şĐłë)") || !strcmp(Message, "(ľĆÇĎ)") || !strcmp(Message, "(żěżď)") || !strcmp(Message, "(ÁËĽŰ)"))
{
return true;
}
return false;
}
bool CHARACTER::SpamListCheck(const char *Message)
{
for (int i = 0; i < SpamBlockListArray.size(); i++)
{
if (!strcmp(Message, SpamBlockListArray[i].c_str()))
{
return false;
}
}
return true;
}
bool CHARACTER::BannListCheck(const char *Message)
{
for (int i = 0; i < SpamBannListArray.size(); i++)
{
if (!strcmp(Message, SpamBannListArray[i].c_str()))
{
return false;
}
}
return true;
}
Создаем 2 файла- spamblock.cpp
- spamblock.h
Открываем spamblock.cpp и в него вставляем:
Код
#include "fstream"
#include "string"
#include "sstream"
#include "stdafx.h"
#include "../../common/length.h"
std::vector<std::string> SpamBlockListArray;
std::vector<std::string> SpamBannListArray;
void LoadBlockSpamList()
{
std::string TempBlockList;
std::ifstream File("chat/blockspamlist.lst");
if (!File.is_open())
{
sys_log(0, "WARNING: cannot open chat/blockspamlist.lst");
return;
}
SpamBlockListArray.clear();
while (!File.eof())
{
File >> TempBlockList;
SpamBlockListArray.push_back(TempBlockList);
}
File.close();
}
void LoadBannSpamList()
{
std::string TempBannList;
std::ifstream File("chat/bannspamlist.lst");
if (!File.is_open())
{
sys_log(0, "WARNING: cannot open chat/bannspamlist.lst");
return;
}
SpamBannListArray.clear();
while (!File.eof())
{
File >> TempBannList;
SpamBannListArray.push_back(TempBannList);
}
File.close();
}
Открываем spamblock.h и в него вставляем:
Код
#include "string"
#include "../../common/length.h"
extern void LoadBlockSpamList();
extern void LoadBannSpamList();
extern std::vector<std::string> SpamBlockListArray;
extern std::vector<std::string> SpamBannListArray;
Добавляем это в game/char.cpp:
Код
#include "spamblock.h"
Добавляем это в game/main.cpp:
Код
#include "spamblock.h"
Ищем это в game/main.cpp:
После этого добавляем:
Код
LoadBlockSpamList();
LoadBannSpamList();
Открываем common/length.h и добавляем это:
Код
SPAM_WAIT_SEC = 5,
SPAM_CHAT_BAN_TIME = 60,
SPAM_BAN_TIME = 3600,
Открываем game/cmd_gm.cpp и ищем:
Добавляем это после "switch" функции:
Код
case 'b':
ch->ChatPacket(CHAT_TYPE_INFO, "Reloading bann/spam list infomations.");
LoadBlockSpamList();
LoadBannSpamList();
sys_log(0, "Reloading bann/spam list infomations.");
break;
В этом же файле добавляем в самый верх:
Код
#include "spamblock.h"
_________________
Послед. шаги:
1) Переверяем, все ли правильно.
2) В каждой папке канала создаем новую папку - chat.
3) В этой папке создаем 2 файла - blockspamlist.lst и bannspamlist.lst.
4) Добавить слова в эти файлы.
5) Перезагрузите сервер.
blockspamlist.lst пример:
Код
obsceneword1
obsceneword2
obsceneword3
obsceneword4
bannspamlist.lst пример:
Код
WWW.CHEAP-FARM-SERVICE.COM
WWW.CHEAP-GOLD.COM
WWW.EASY-HACKS.COM
WWW.FREE-YANG.COM
Гайд создан Sanchez'ом, переведен мною специально для olbaid.ru