Half-Life и Adrenaline Gamer форум

Всё об игре в Халф-Лайф и АГ
Текущее время: 28 мар 2024, 21:57

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 13 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: 20 июл 2017, 21:26 
Не в сети
Зарегистрирован:
18 янв 2016, 20:31
Последнее посещение:
27 ноя 2018, 03:24
Сообщения: 41
Откуда: Yoshkar-Ola
Нужен плагин на AMXX (1.8.2), который через сокеты будет делать запрос на сервер и хранить список игроков на серверах (список серверов в файле, чтобы не компилировать каждый раз) с периодичностью QUERY_INTERVAL. При входе игрока на сервер с данным плагином, будет проверяться наличие его SteamID на других серверах, и при наличии он будет кикаться.

В чем заключается работа плагина:
1. После старта карты делать запрос до серверов из списка с периодичностью QUERY_INTERVAL.
2. Хранить данные о игроках на серверах в массиве с индексом для каждого сервера).
3. При подключении игрока на сервер получить его STEAM_ID.
4. Сделать проверку по массиву на наличие идентичного STEAM_ID на других серверах.
5. При абсолютном совпадении (reunion + одинаковая соль) - кикать игрока с сервера (причина настраиваемая).

Желательна асинхронность в запросах, чтобы при опросе сервер не вставал в ступор. На данный момент количество опрашиваемых серверов не превышает 2 шт.


Вернуться к началу
 Профиль 
  
СообщениеДобавлено: 20 июл 2017, 22:57 
Не в сети
Site Admin
Зарегистрирован:
01 июн 2010, 01:27
Последнее посещение:
26 мар 2024, 21:42
Сообщения: 6864
STEAM_ID не узнать через Server Query, только через rcon status.
Пример в аттаче. Надо только распарсить ответ и проверять по нему игроков. При большой лени, можно даже не парсить, а прямо по всему тексту искать STEAM_ID, но так можно через ник немного попортить малину.
Сокеты не асинхронные. Но на них в ступор впадает только на socket_open, если имя компа не разрешается в ИП.


Вложения:
Скачать плагин или Скачать исходник [socktest.sma - 5.54 КБ]
Скачиваний: 350
Вернуться к началу
 Профиль 
  
СообщениеДобавлено: 20 июл 2017, 23:17 
Не в сети
Зарегистрирован:
18 янв 2016, 20:31
Последнее посещение:
27 ноя 2018, 03:24
Сообщения: 41
Откуда: Yoshkar-Ola
Благодарю, сейчас глянем что да как.
А то нас одни товарищи данного плана (что заходят через пиратку на 2 сервера одновременно) уже достали =)


Вернуться к началу
 Профиль 
  
СообщениеДобавлено: 07 авг 2017, 14:19 
Не в сети
Аватара пользователя
Зарегистрирован:
12 июн 2016, 01:22
Последнее посещение:
14 июн 2019, 12:52
Сообщения: 345
Откуда: Родом из Халфляндии
Возможно это можно сделать с помощью базы?

_________________
Изображение

Изображение

Изображение


Вернуться к началу
 Профиль 
  
СообщениеДобавлено: 22 авг 2017, 16:35 
Не в сети
Зарегистрирован:
18 янв 2016, 20:31
Последнее посещение:
27 ноя 2018, 03:24
Сообщения: 41
Откуда: Yoshkar-Ola
Базы?

Lev, подскажи пожалуйста, как более всего рационально парсить этот вывод от команды?

Я понимаю что его надо загонять в parse, но как разделять на строки?

 что имеется на данный момент


Вернуться к началу
 Профиль 
  
СообщениеДобавлено: 22 авг 2017, 19:54 
Не в сети
Site Admin
Зарегистрирован:
01 июн 2010, 01:27
Последнее посещение:
26 мар 2024, 21:42
Сообщения: 6864
MXPLRS|Kirill писал(а):
Базы?
Ну, можно MySQL поднять, при коннекте смотреть есть или нет и добавлять в список, если нету, при выходе удалять. Не особо надежно, но возможно.

MXPLRS|Kirill писал(а):
Я понимаю что его надо загонять в parse, но как разделять на строки?
Можно и в parse, наверное, если тебе все эти номера и ники нужны тоже. Если нет, то можно руками по строке бежать и искать.
Что искать? "\n#", или в амхх стиле "^n#", а для if лучше так:
Код:
if (response[i] == '^n' && response[i + 1] == '#')


Вернуться к началу
 Профиль 
  
СообщениеДобавлено: 22 авг 2017, 20:28 
Не в сети
Зарегистрирован:
18 янв 2016, 20:31
Последнее посещение:
27 ноя 2018, 03:24
Сообщения: 41
Откуда: Yoshkar-Ola
С базой проблем много будет: надо будет отслеживать падения сервера (которые тоже не исключение), ведь иначе при наличии записи вообще никуда не пустит :D (но это не точно: если корректно расписать таблицу, и сохранять в неё IP + PORT сервера, и STEAMID игрока. А при запуске карты вычищать таблицу отсеивая по IP+PORT).

А как сие
Код:
if (response[i] == '^n' && response[i + 1] == '#')
прикрутить к while циклу, чтобы весь буфер по нормальному распарсился (всё таки да, надо сделать по нормальному проверку именно поля STEAMID, а то как вы сказали - возможны тролли сидящие со STEAM в никах)?


Вернуться к началу
 Профиль 
  
СообщениеДобавлено: 22 авг 2017, 23:29 
Не в сети
Site Admin
Зарегистрирован:
01 июн 2010, 01:27
Последнее посещение:
26 мар 2024, 21:42
Сообщения: 6864
Код:
int i = 0;
while(response[i])
{
  if (response[i] == '^n' && response[i + 1] == '#')
  {
   // начало строки
  }
  i++;
}


Вернуться к началу
 Профиль 
  
СообщениеДобавлено: 04 сен 2017, 13:22 
Не в сети
Зарегистрирован:
18 янв 2016, 20:31
Последнее посещение:
27 ноя 2018, 03:24
Сообщения: 41
Откуда: Yoshkar-Ola
Я правильно понимаю, что можно парсить даже частично (т.е. например только 4 поля)?

 code
В parse надо отправлять response[i]?


Последний раз редактировалось MXPLRS|Kirill 04 сен 2017, 14:22, всего редактировалось 1 раз.

Вернуться к началу
 Профиль 
  
СообщениеДобавлено: 04 сен 2017, 14:21 
Не в сети
Site Admin
Зарегистрирован:
01 июн 2010, 01:27
Последнее посещение:
26 мар 2024, 21:42
Сообщения: 6864
Да, только после первого parse тебе надо i увеличить. Но, имхо, проще распарсить ненужный аргумент, чем возиться с этим.
И хорошо бы после всяких
Код:
i += 2;
i++;
делать проверку, что response[i] ещё не 0.


Вернуться к началу
 Профиль 
  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB