PDA

Просмотр полной версии : [Вопрос] Интервал между переподключением



Иван Бубнов
07.02.2016, 17:02
Здравствуйте. Как можно сделать так, чтобы после выхода игрока с сервера, перезайти мог через 15 секунд?

Пытался сделать так:
Перед выходом:

GetPlayerIp(playerid, LostIp, sizeof(LostIp));
LostConnect = gettime()+15;

Connect:
if(LostConnect > gettime())
{
strcmp LostIp newip == 0 Kick

Не работает.

Profyan
07.02.2016, 17:35
Записывать в таблицу с акками время отключения от сервера.При подключении проверять с gettime()

Иван Бубнов
07.02.2016, 18:17
Записывать в таблицу с акками время отключения от сервера.При подключении проверять с gettime()

Записывать в таблицу с акками время отключения от сервера? Да не, бред какой-то.

Апчх: Аргументы: А что если он собейтом сменил ник?

Profyan
07.02.2016, 18:52
Записывать в таблицу с акками время отключения от сервера? Да не, бред какой-то.

Апчх: Аргументы: А что если он собейтом сменил ник?

Ты же всегда записываешь данные игрока в массив,а потом в БД\файл.А имя он меняет лишь в игре,значения в массиве игрока не поменяются.

Daniel_Cortez
07.02.2016, 19:21
Ты же всегда записываешь данные игрока в массив,а потом в БД\файл.А имя он меняет лишь в игре,значения в массиве игрока не поменяются.
Если собейтом изменить ник, то по идее при реконнекте можно подключиться с новым ником.



Записывать в таблицу с акками время отключения от сервера? Да не, бред какой-то.
Можете попробовать сделать таблицу на 20-40 слотов. При коннекте в таблице ищется первый свободный слот (а он должен найтись, вряд ли одновременно будет отключаться более 40 игроков) и в этот слот будут заноситься никнейм, IP-адрес и хеш, возвращаемый функцией gpci. Но прежде чем записать эти данные в таблицу, они должны проверяться с данными, полученными от других игроков. Если найдёте совпадение с данными от другого игрока, то это либо читер, который воспользовался реконнектом, либо мультиаккаунт. Также при дисконнекте ставьте таймер на очистку слота с данными через 15 секунд и во время проверке при коннекте не следует забывать пропускать пустые слоты.

Только не просите написать за вас код для всего этого. Не можете справиться сами - заказывайте работу у кого-нибудь, алгоритм уже приведён.

Desulaid
07.02.2016, 19:27
А как на счет minconnectiontime (https://wiki.sa-mp.com/wiki/Server.cfg)?

Profyan
07.02.2016, 19:38
А как на счет minconnectiontime (https://wiki.sa-mp.com/wiki/Server.cfg)?

Это будет же для любого игрока,а не только для того,кто перезаходит?!

Desulaid
07.02.2016, 19:50
Это будет же для любого игрока,а не только для того,кто перезаходит?!

Зато геморроя меньше :D

Sp1ke
07.02.2016, 21:21
Здравствуйте. Как можно сделать так, чтобы после выхода игрока с сервера, перезайти мог через 15 секунд?

Пытался сделать так:
Перед выходом:

GetPlayerIp(playerid, LostIp, sizeof(LostIp));
LostConnect = gettime()+15;

Connect:
if(LostConnect > gettime())
{
strcmp LostIp newip == 0 Kick

Не работает.

Скинь свой скайп в лс, помогу и подробно объясню.

Desulaid
07.02.2016, 22:01
Скинь свой скайп в лс, помогу и подробно объясню.

Нам тоже интересно :sorry: :sad:

Иван Бубнов
07.02.2016, 22:11
Решено. Перед выходом забанил IP адрес, перезагрузил бан-лист и поставил таймер на 15 сек. для разбана IP.



public OnPlayerDisconnect(playerid, reason)
{
if(reason == 0) return 1;
new string[16+9], getip[16];
GetPlayerIp(playerid, getip);
format(string, sizeof(string), "banip %s", getip);
SendRconCommand(string);
SetTimerEx("DiscUnban", 15000, false, "s", getip);
return 1;
}

forward DiscUnban(ip[]);
public DiscUnban(ip)
{
new string[32];
format(string, sizeof(string), "unbanip %s", ip);
SendRconCommand(string);
}


Решение оставил в надежде что это кому нибудь понадобится.

Иван Бубнов
07.02.2016, 22:54
Close.

Sp1ke
08.02.2016, 00:21
Решено. Перед выходом забанил IP адрес, перезагрузил бан-лист и поставил таймер на 15 сек. для разбана IP.



public OnPlayerDisconnect(playerid, reason)
{
if(reason == 0) return 1;
new string[16+9], getip[16];
GetPlayerIp(playerid, getip);
format(string, sizeof(string), "banip %s", getip);
SendRconCommand(string);
SetTimerEx("DiscUnban", 15000, false, "s", getip);
return 1;
}

forward DiscUnban(ip[]);
public DiscUnban(ip)
{
new string[32];
format(string, sizeof(string), "unbanip %s", ip);
SendRconCommand(string);
}


Решение оставил в надежде что это кому нибудь понадобится.

А если игрок подумает, что заблокирован? Лучше было бы записывать айпи в переменную и при заходе сверить, как я хотел тебе предложить.

$continue$
08.02.2016, 00:37
Решено. Перед выходом забанил IP адрес, перезагрузил бан-лист и поставил таймер на 15 сек. для разбана IP.



public OnPlayerDisconnect(playerid, reason)
{
if(reason == 0) return 1;
new string[16+9], getip[16];
GetPlayerIp(playerid, getip);
format(string, sizeof(string), "banip %s", getip);
SendRconCommand(string);
SetTimerEx("DiscUnban", 15000, false, "s", getip);
return 1;
}

forward DiscUnban(ip[]);
public DiscUnban(ip)
{
new string[32];
format(string, sizeof(string), "unbanip %s", ip);
SendRconCommand(string);
}


Решение оставил в надежде что это кому нибудь понадобится.

http://img0.joyreactor.cc/pics/comment/%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BE%D1%81%D1%82%D1%8B%D0%BB%D1%8C-%D0%B1%D0%B0%D0%B3%D0%B8-%D0%B2%D0%B5%D0%BB%D0%BE%D1%81%D0%B8%D0%BF%D0%B5%D0%B4-1827848.jpeg
Цитатка DeimoS:
https://pp.vk.me/c633920/v633920787/e2e5/e2N2vC0jL-Q.jpg

VVWVV
08.02.2016, 00:54
Действительно, костыль. Можно воспользоваться пабликом OnIncomingConnection, в котором будет функция блокировки IP (на время; BlockIpAddress).

vovandolg
08.02.2016, 00:58
Когда юзеры видят надпись что то вроде ...closed. или ...banned. перезаходят,
вроде все привыкли с этим недугом, а написав этот костыль создали возможную проблему от которой будет то ложный бан, то какой нибудь разбан..
p.s. это я про этот кусок кода, если над ним поработать то может и норм идея)

[ForD]
08.02.2016, 09:02
Когда юзеры видят надпись что то вроде ...closed. или ...banned. перезаходят,
вроде все привыкли с этим недугом, а написав этот костыль создали возможную проблему от которой будет то ложный бан, то какой нибудь разбан..
p.s. это я про этот кусок кода, если над ним поработать то может и норм идея)

Действтельно мля?! Перезаходят?! Ну мля серьезно?
Предположим "группу сервера в ВК",заходят игроки,перезаходят(ну или че там).. далее:...banned.
проходит минута,ну пару максимум,звук взлетающих пуканов можно услышать за окном,и все твоя группа засрана тем типа: защта миня?!!,мамку хот-догом угощал,гафно твой серв,ну и там все в таком роде..
Ну это одно дело..

Далее я почти уверен что можно реализовать лучше,хоть пока даже и не думал как,необходимости в этом не увидел =\
Но а что на счет того что ну так к примеру разблокирует там читера какогонибудь,который в бане должен быть?(Предположение)
Ну или не разблокирует кого случайно? В общем странный как-бэ способ -_-