Введение:
Приветствую всех! В этом уроке мы разберем, как защитить чат вашего сервера от рекламы сторонних проектов. Мы напишем легкий алгоритм на чистом Pawn, который распознает паттерны IP-адресов (цифры, разделенные точками или пробелами), не создавая лишней нагрузки на сервер.
Шаг 1: Создаем функцию-детектор
Эту функцию лучше всего разместить в конце вашего мода или в блоке stocks. Она анализирует текст и ищет совпадения по количеству цифр и разделителей.
stock IsStringAd(const text[])
{
new digit_count = 0;
new dot_count = 0;
for(new i = 0; text[i] != '\0'; i++)
{
// Проверяем, является ли символ цифрой
if(text[i] >= '0' && text[i] <= '9')
{
digit_count++;
}
// Считаем точки, двоеточия, пробелы (разделители в IP)
else if(text[i] == '.' || text[i] == ':' || text[i] == ' ')
{
dot_count++;
}
else // Если пошли другие символы, сбрасываем счетчики
{
digit_count = 0;
dot_count = 0;
}
// Если нашли 4+ цифры и минимум 3 разделителя — это реклама
if(digit_count >= 4 && dot_count >= 3) return 1;
}
return 0;
}
Шаг 2: Внедряем в OnPlayerText
Теперь перехватим сообщение игрока. Если наша функция найдет рекламу, мы заблокируем отправку сообщения через return 0.
public OnPlayerText(playerid, text[])
{
if(IsStringAd(text))
{
SendClientMessage(playerid, 0xFF6347FF, "[Ошибка] {FFFFFF}Реклама на сервере запрещена!");
// Оповещение администрации (пример)
new adminMsg[128], pName[MAX_PLAYER_NAME];
GetPlayerName(playerid, pName, sizeof(pName));
format(adminMsg, sizeof(adminMsg), "[A] %s [%d] подозревается в рекламе: %s", pName, playerid, text);
// SendAdminMessage(0xFFFF00FF, adminMsg);
return 0; // Сообщение НЕ будет отправлено в общий чат
}
return 1; // Пропускаем сообщение, если всё чисто
}
Важные примечания:
- Ложные срабатывания: Система может реагировать на даты или версии файлов. Рекомендую сначала протестировать её "тихо", отправляя варнинги только админам.
- Обход через пробелы: В данной версии я добавил проверку пробелов, так что варианты "127 0 0 1" теперь тоже блокируются.
Цитата
От автора:
Это мой первый гайд на форуме, поэтому я заранее извиняюсь, если что-то сделал не так или допустил мелкие ошибки. Я только учусь и буду очень благодарен за конструктивную критику и советы от опытных разработчиков в комментариях!
Это мой первый гайд на форуме, поэтому я заранее извиняюсь, если что-то сделал не так или допустил мелкие ошибки. Я только учусь и буду очень благодарен за конструктивную критику и советы от опытных разработчиков в комментариях!
Надеюсь, этот материал будет полезен для ваших проектов!
Сообщение отредактировал Kandinsky: 03 марта 2026 - 20:16
Вход
Регистрация
Помощь













