[FilterScript] Глобальный поиск игроков по серверам + глобальный БАН
#1

ПОИСК ИГРОКОВ ПО НИКУ, НА ВСЕХ СЕРВЕРАХ


Выглядит это следующим образом:

На команды
/find Wore1
/find swatt
/find DniX

будет получен следующий ответ:




ГЛОБАЛЬНЫЙ БАН ИГРОКОВ


Этот же скрипт позволяет забанить злостного читера так, чтобы он не смог зайти ни на один сервер (на котором установлен данный скрипт, разумеется)

Работает это так:

Допустим, на одном из серверов SA:MP выполняется команда
/gbanip 12.34.56.78
Тогда читер с ip-адресом 12.34.56.78 не зайдёт ни на один сервер с данным скриптом

Все команды глобального бана:
/gban [id]
/gbanip [ip]
/gunban [id]
/gunbanip [ip]


В скором времени добавлю бан по маске подсети и по нику, а также временный бан.

Смысл:

Отрезает читеров и спамеров, кочующих от сервака к серваку.


Всю работу выполняет удалённый сервер, т.ч. скрипт практически не занимает ресурсов.

Code:
//1.1b SA:MP GPS - Global Player Search by Bombo

#include <a_samp>
#include <a_http>

#include "../include/gl_common.inc"


forward FindPlayer(index, code, data[]);
forward CheckIP(index, code, data[]);

new UName[]="test";
new Pass[]="test";

public OnFilterScriptInit()
{
	print("\n--------------------------------------");
	print(" Global Player Search by Bombo");
	print("--------------------------------------\n");

	SendClientMessageToAll(9424500, "\n--------------------------------------");
	SendClientMessageToAll(9424500, "Поиск игроков от Bombo");
	SendClientMessageToAll(9424500, "--------------------------------------\n");
	return 1;
}

public OnGameModeInit()
{
	// Don't use these lines if it's a filterscript
	SetGameModeText("Blank Script");
	AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
	return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
	SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
	SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
	SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
	return 1;
}

public OnPlayerConnect(playerid)
{
	new PlayerIP[16];
	new PlayerName[48];
	new http_msg[256];
	new str_id[8];

	GetPlayerIp(playerid, PlayerIP, sizeof(PlayerIP));

	http_msg = "Playerid=";
	valstr(str_id, playerid);
	strcat(http_msg, str_id);
	strcat(http_msg, "&CheckIP=");
	strcat(http_msg, PlayerIP);
	strcat(http_msg, "&Uname=");
	strcat(http_msg, UName);
	strcat(http_msg, "&Pwd=");
	strcat(http_msg, Pass);
	strcat(http_msg, "&PlayerName=");
	GetPlayerName(playerid, PlayerName, sizeof(PlayerName));
	strcat(http_msg, PlayerName);

    HTTP(0, HTTP_POST, "botinform.com:9797", http_msg, "CheckIP"); //проверка на БАН

	SendClientMessage(playerid, 9324500, "Для поиска игрока на всех серверах SAMP наберите: /find ник_игрока");
	return 1;
}

public OnPlayerSpawn(playerid)
{
    SendClientMessage(playerid, 9324500, "Для поиска игрока на всех серверах SAMP наберите: /find ник_игрока");
	return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    new cmd[256+1];
    new idx;

    cmd = strtok(cmdtext, idx);

    //if(!IsPlayerAdmin(playerid)) return 0; // this is an admin only script

	//Команда "/help"
    if(strcmp(cmd, "/help", true) == 0)
    {
        SendClientMessage(playerid, 9324500, "/find [ник_игрока] - поиск по всем серверам!");
  	    if(IsPlayerAdmin(playerid))
  	    {
	        SendClientMessage(playerid, 9324500, "/gban [id] - бан по всем серверам с данным модом");
            SendClientMessage(playerid, 9324500, "/gbanip [ip] - бан по ip на все сервера с данным модом");
            SendClientMessage(playerid, 9324500, "/gunban [id] - разбан по всем серверам с данным модом");
            SendClientMessage(playerid, 9324500, "/gunbanip [ip] - разбан по всем серверам с данным модом");
 	    }
	    return 1;
    }

    //команда /find [ник]
    if(strcmp(cmd, "/find", true) == 0)
    {
		new tmp[256];
		new http_msg[512];
		new str_id[8];

		tmp = strtok(cmdtext,idx);
		http_msg = "Playerid=";
		valstr(str_id, playerid);
		strcat(http_msg, str_id);
		strcat(http_msg, "&Uname=");
		strcat(http_msg, UName);
		strcat(http_msg, "&Pwd=");
		strcat(http_msg, Pass);
		strcat(http_msg, "&Search=");
		strcat(http_msg, tmp);

        SendClientMessage(playerid, 9324500, "Searching...");
        HTTP(0, HTTP_POST, "botinform.com:9797", http_msg, "FindPlayer");
        return 1;
    }

    //команда "/gunban [player id]"
    if(IsPlayerAdmin(playerid))
    if(strcmp(cmd, "/gunban", true) == 0)
    {
	new tmp[256];
	new nPlayerId;
	new strPlayerIp[16];
	new http_msg[512];
  	new str_id[8];

	tmp = strtok(cmdtext,idx);
	nPlayerId = strval(tmp);
	GetPlayerIp(nPlayerId, strPlayerIp, sizeof(strPlayerIp));
	http_msg = "Playerid=";
	valstr(str_id, playerid);
	strcat(http_msg, str_id);
	strcat(http_msg, "&Uname=");
	strcat(http_msg, UName);
	strcat(http_msg, "&Pwd=");
	strcat(http_msg, Pass);
	strcat(http_msg, "&GUnban=");
	strcat(http_msg, strPlayerIp);

    SendClientMessage(playerid, 9324500, "Banning...");
	HTTP(0, HTTP_POST, "botinform.com:9797", http_msg, "FindPlayer");
	return 1;
    }

    //команда "/gunbanip [ip]"
    if(IsPlayerAdmin(playerid))
    if(strcmp(cmd, "/gunbanip", true) == 0)
    {
		new tmp[256];
	  	new http_msg[512];
	  	new str_id[8];

		tmp = strtok(cmdtext,idx);
		http_msg = "Playerid=";
		valstr(str_id, playerid);
		strcat(http_msg, str_id);
		strcat(http_msg, "&Uname=");
		strcat(http_msg, UName);
		strcat(http_msg, "&Pwd=");
		strcat(http_msg, Pass);
		strcat(http_msg, "&GUnban=");
		strcat(http_msg, tmp);

        SendClientMessage(playerid, 9324500, "Unbanning...");
		HTTP(0, HTTP_POST, "botinform.com:9797", http_msg, "FindPlayer");
		return 1;
    }

    //команда "/gbanip [ip] [ник]"
    if(IsPlayerAdmin(playerid))
    if(strcmp(cmd, "/gbanip", true) == 0)
    {
		new tmp[256];
	  	new http_msg[512];
	  	new str_id[8];
	  	new strPlayerIp[16];
	  	new strPlayerName[24];
	  	new strAdminName[24];

		tmp = strtok(cmdtext,idx);
		http_msg = "Playerid=";
		valstr(str_id, playerid);
		strcat(http_msg, str_id);
		strcat(http_msg, "&Uname=");
		strcat(http_msg, UName);
		strcat(http_msg, "&Pwd=");
		strcat(http_msg, Pass);
		strcat(http_msg, "&GBan=");
		strcat(http_msg, tmp);
		strcat(http_msg, "&AdminIP=");
		GetPlayerIp(playerid, strPlayerIp, sizeof(strPlayerIp));
		strcat(http_msg, strPlayerIp);
		strcat(http_msg, "&PlayerName=");
		strPlayerName = strtok(cmdtext,idx);
		strcat(http_msg, strPlayerName);
		strcat(http_msg, "&Admin=");
		GetPlayerName(playerid, strAdminName, sizeof(strAdminName));
		strcat(http_msg, strAdminName);

        SendClientMessage(playerid, 9324500, "Banning...");
		HTTP(0, HTTP_POST, "botinform.com:9797", http_msg, "FindPlayer");
		return 1;
    }

    //команда "/gban [player id]"
    if(IsPlayerAdmin(playerid))
    if(strcmp(cmd, "/gban", true) == 0)
    {
		new tmp[256];
		new nPlayerId;
		new strPlayerIp[16];
	  	new http_msg[512];
  		new str_id[8];
	  	new strPlayerName[24];
	  	new strAdminName[24];

		tmp = strtok(cmdtext,idx);
		nPlayerId = strval(tmp);
		http_msg = "Playerid=";
		valstr(str_id, playerid);
		strcat(http_msg, str_id);
		strcat(http_msg, "&Uname=");
		strcat(http_msg, UName);
		strcat(http_msg, "&Pwd=");
		strcat(http_msg, Pass);
		strcat(http_msg, "&GBan=");
		GetPlayerIp(nPlayerId, strPlayerIp, sizeof(strPlayerIp));
		strcat(http_msg, strPlayerIp);
		strcat(http_msg, "&AdminIP=");
		GetPlayerIp(playerid, strPlayerIp, sizeof(strPlayerIp));
		strcat(http_msg, strPlayerIp);
		strcat(http_msg, "&Admin=");
		GetPlayerName(playerid, strAdminName, sizeof(strAdminName));
		strcat(http_msg, strAdminName);
		strcat(http_msg, "&PlayerName=");
		GetPlayerName(nPlayerId, strPlayerName, sizeof(strPlayerName));
		strcat(http_msg, strPlayerName);

        SendClientMessage(playerid, 9324500, "Banning...");
		HTTP(0, HTTP_POST, "botinform.com:9797", http_msg, "FindPlayer");
		return 1;
    }

    return 0;
}

public FindPlayer(index, code, data[])
{
  new tmp[256];
  new len,i,j,k;
  new playerid;
  new num[8];

//  printf("%s", data);

  for(i = 0; i < sizeof(num); ++i)
	num[i] = '\0';

  k = 0;
  while(data[k] != ' ') //забираем playerid из начала сообщения
  {
	num[k] = data[k];
	k++;
  }

  playerid = strval(num);

  len = strlen(data);
  for(i = k+1, j = 0; i < len; ++i)
  {
	tmp[j] = data[i];
	if(tmp[j] == '\n' || tmp[j] == '\0')
	{
	  tmp[j] = '\0';
	  if(tmp[j-1] == '\r')
		tmp[j-1] = '\0';
      SendClientMessage(playerid, 11240000, tmp); //пересылаем ответ от сервера в чат
      j = 0;
      continue;
	}
	j++;
  }
}

public CheckIP(index, code, data[])
{
  new tmp[1024];
  new len,i,j,k;
  new playerid;
  new num[8];
  new banned;

//  printf("%s", data);

  for(i = 0; i < sizeof(num); ++i)
	num[i] = '\0';

  k = 0;
  while(data[k] != ' ') //забираем playerid из начала сообщения
  {
	num[k] = data[k];
	k++;
  }

  playerid = strval(num);

  for(i = k+1, j = 0; i < 6; ++i)
  {
	tmp[j] = data[i];
  }

  if(strcmp(tmp, "banned",true,6) == 0)
	banned = true;
  else
	banned = false;

  len = strlen(data);
  for(i = k+1, j = 0; i < len; ++i)
  {
	tmp[j] = data[i];
	if(tmp[j] == '\n' || tmp[j] == '\0')
	{
	  tmp[j] = '\0';
      SendClientMessage(playerid, 11240000, tmp); //пересылаем ответ от сервера в чат
      j = 0;
      continue;
    }
	j++;
  }

  // если игрок глобально забанен, ему кик:
  if(banned)
    Kick(playerid);
}
Это beta-версия, но вполне рабочая, требующая только дополнений. Trial-период - десять запросов на поиск.
Желающие потестить в полном объёме обратитесь ко мне за логином и паролем, в личку (поля UName[] и Pass[] в самом начале скрипта, если кто не просёк). Эта мера вынужденная, дабы не захламили/не повесили мне сервак.

Да, кстати, аренда сервера денюшку стоит, т.ч.:
R211309231066
Z841169965648,
E226595298971
буду весьма признателен

Опробовать поиск можно здесь: botinform.com:7797, либо так:

HTML Code:
<html>
<head>
<title>Поиск игроков</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
</head>
<body>
<div align=center>
<h2>ПОИСК ПО НИКУ</h2>
<FORM action="http://botinform.com:9797" method="post">
    <P>
    Введите ник: <INPUT type="text" name="Search">
    <INPUT type="submit" value="Поиск">
    <INPUT type="hidden" name="Browser">
    <INPUT type="hidden" name="Uname" value="test">
    <INPUT type="hidden" name="Pwd" value="test">
    </P>
 </FORM>
</div>
</body>
</html>
Добавлена поддержка русской кодировки.
Reply
#2

Bombo, идея хорошая, кто-то что-то подобное выкладывал тут.
Но вопрос остаётся такой-же как и к нему: Что мне мешает попросить у тебя пароль и потом циклом забанить подсеть 0.0.0.0/0 ?
Reply
#3

PunkBuster, называлась эта хрень, которая не получила популярности.
Reply
#4

OKStyle, не вспомнил, там плагин был, а исходник автор выкладывать отказался. Но суть не меняется.
Идея имеет смысл, при жёстком контроле всех участников данной системы. Иначе 100% будут банить не читеров а из-за личной неприязни\выгоды или вообще по приколу.
Reply
#5

Тогда почему-бы не сделать добавление серверов принадлежащих одному владельцу (или по договоренности), с подтверждением.

Те пользователь добавляет все свои сервера, устанавливая на них этот скрипт, и используя логин для серверов.
Reply
#6

jhonyxakep, но это не мешает мне забанить всех.
Reply
#7

На своих серверах. Не дальше.
Reply
#8

jhonyxakep, ну а тогда смысл этого FS вообще? Это разрушает основной смысл данной системы.
Reply
#9

В системе не продуманно многое:
  1. Зачем в системе банов информация о том где сейчас играет игрок с определенным ником?
  2. Как выше было озвучено:
    Quote:
    Originally Posted by -Stranger-
    Что мне мешает циклом забанить подсеть *.*.*.*?
    При этом забанить каждый IP отдельно и в маске, и повторить все 500 раз. Разбанивать потом замучаетесь!
  3. Кто мешает читерам завести свой сервер и через него разбаниваться?
  4. Мастер сервер не надежен, видно уже из первого поста:
    Quote:
    Originally Posted by Bombo
    Эта мера вынужденная, дабы не захламили/не повесили мне сервак.
  5. Система не жизнеспособна без уникального идентификатора пользователя. Напоминаю что в PunkBuster требуется установка клиентской части которая идентифицирует пользователя по железу!
Reply
#10

Система намного серьёзней, чем может показаться на первый взгляд.

Quote:

Зачем в системе банов информация о том где сейчас играет игрок с определенным ником?

Во-первых, всегда можно посмотреть откуда пришёл игрок, как часто меняет сервера. Во-вторых, сразу видно, если такой ник ни разу не использовался, т.к. система поиска выдаёт прежние посещения игрока. Ну, и в-третьих - просто удобная штука, если кого-то надо разыскать (кто свалил с сервака).

Quote:

Что мне мешает циклом забанить подсеть *.*.*.*?
При этом забанить каждый IP отдельно и в маске, и повторить все 500 раз. Разбанивать потом замучаетесь!

Циклом забанить подсеть мешает ограничение на количество банов в день (накладывается на каждого пользователя системы в отдельности, = 20). Причём, этот лимит уменьшается с каждым днём, если активность забаниваний слишком высока.
Ещё один механизм, пока находящийся в разработке - это система предупреждений. Т.е. читер сначала банится только на одном сервере, а остальные серваки получают предупреждение (мол, это нехороший чел), когда он к ним заглянет. А вот после второго раза этот гад банится по-полной!
И ещё момент: команда "/gbanip [ip]" будет доступна только проверенным серверам. Остальные же будут банить по id, т.е. только тех читеров, которые непосредственно сидят на сервере.

Quote:

Кто мешает читерам завести свой сервер и через него разбаниваться?

Самый щекотливый вопрос, который, однако, решается предельно просто - разбанить можно только с того сервера, который забанил. Найти банщика можно будет по спискам на сайте, либо наступит автоматический разбан через недельку-другую (месяц, год, ...).

Quote:

Мастер сервер не надежен, видно уже из первого поста:
Quote:

Сообщение от Bombo
Эта мера вынужденная, дабы не захламили/не повесили мне сервак.

Вот и сделал регистрацию, чтобы мастер-сервер был тип-топ. Без неё реально можно было захламить, насчёт повесить сам не уверен (в см. повесить его оччень непросто!).

Quote:

Система не жизнеспособна без уникального идентификатора пользователя. Напоминаю что в PunkBuster требуется установка клиентской части которая идентифицирует пользователя по железу!

Система банит также, как и любой отдельный SA:MP сервер, чего вполне хватает.
Reply
#11

Quote:
Originally Posted by Bombo
View Post
Циклом забанить подсеть мешает ограничение на количество банов в день (накладывается на каждого пользователя системы в отдельности, = 20). Причём, этот лимит уменьшается с каждым днём, если активность забаниваний слишком высока.
А если атака читерского клана или динамический IP? Я не смогу забанить всех.

Quote:
Originally Posted by Bombo
View Post
Самый щекотливый вопрос, который, однако, решается предельно просто - разбанить можно только с того сервера, который забанил.
Глупо. Особенно, если банят просто так.
Reply
#12

Из описанного ясно одно: системе далеко до глобальной и даже до полезно-рабочей.

А топикстартеру советую глубоко ознакомится с глобальными системами бана: PunkBuster, Steam, AMXBan.
Ваша проблема тут в одном:
Quote:
Originally Posted by Bombo
View Post
Система банит также, как и любой отдельный SA:MP сервер, чего вполне хватает.
этого явно не хватает. Я с вами не знаком, но такое впечатление что с проблемой бана читеров вы знакомы по наслышке.
Reply
#13

Quote:
Originally Posted by OKStyle
View Post
Глупо. Особенно, если банят просто так.
Согласен. Если на то пошло, то делать нужно следующим образом:
Есть игрок забанен на сервер A, то войти он не может на любой сервер где стоит эта бан-система, НО если его разбанят на сервер D, то он сможет на нём играть без каких-либо проблем.

Конечно тоже бред, но уже можно хоть и руками, но защититься от беспредельного бана.
Reply
#14

Quote:
Originally Posted by OKStyle
View Post
А если атака читерского клана или динамический IP? Я не смогу забанить всех.
20 - это для начала, проверенные надёжные сервера получат намного больше. Динамический ip лечится баном подсети (скажем, на несколько часов или дней). Кстати, система поиска способна определить, кто ещё сидит в данной подсети и установить для них иммунитет. И потом, стандартный samp-овский бан никто не отменял.

Quote:
Originally Posted by OKStyle
View Post
Глупо. Особенно, если банят просто так.
Система предупреждений требует для бана, чтобы несколько разных серверов выполнили команду /gban для конкретного ip-адреса. В таком случае, "просто так" забанить должны будут с нескольких серверов, а это уже называется НЕВЕЗЁТ.

Stepashka, весь смысл этой системы в решении проблемы сверху, от сервера к игроку, дабы не прибегнуть к регистрации всех поголовно.

-Stranger-, собственно, почти так всё и работает - сервер сможет в настройках скрипта установить бан-контроль, т.е. количество банов, которые получил игрок от разных серверов.
Reply
#15

Quote:
Originally Posted by Bombo
View Post
20 - это для начала, проверенные надёжные сервера получат намного больше.
Каковы критерии выборки таких серверов?

Quote:
Originally Posted by Bombo
View Post
И потом, стандартный samp-овский бан никто не отменял.
Само-собой, но нафиг тогда вообще эта система нужна мне?

Quote:
Originally Posted by Bombo
View Post
Система предупреждений требует для бана, чтобы несколько разных серверов выполнили команду /gban для конкретного ip-адреса. В таком случае, "просто так" забанить должны будут с нескольких серверов, а это уже называется НЕВЕЗЁТ.
Скорее это называется "мудачество". Приведу пример: есть пара читеров, которые мне помогли в своё время, но их банили на всех подряд серверах, едва завидев. Или другой: я в былые времена выносил и 10-численную команду соперника в ТДМ, после чего был забанен на паре серверов за читерство, которое, естественно, не имело место быть. Ну а там сарафанное радио... Я даже на свой родной сервер когда зашёл после годичного отдыха, мой клан назвали читерским, хотя он прямо противоположен им, и проверяли меня на наличие читов. Нонсенс, но это было.

Так что нельзя идиотам давать такой инструмент, от которого могут пострадать нормальные люди.
Reply
#16

Ну конечно, давайте перечислять все минусы, а на плюсы мы внимания не обращаем.

Bombo, я думаю у вас подход немного не тот. Вам надо было делать не FS, а Include - API для своего мастер сервера. В результате разработчик может получить много инфы об игроке, и сам решить, будет он его банить, кикать, или так оставит.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)