Перейти к содержимому


Фотография

Резервирование слотов


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 18

#1 Goldfish

Goldfish

    Пользователь

  • Пользователь
  • PipPipPip
  • 388 сообщений

Отправлено 30 Март 2020 - 21:26

Здравствуйте, решил переписать sm'овский  reservedslots

 

суть вопроса

 

можно как-то  узнать является ли клиент админом при подключении если все слоты сервера забиты

или нужно хотябы 1 слот держать свободным?

 

до форварда OnClientPostAdminCheck клиент по всей видимости не успевает дойти, чтобы проверить его флаг


Сообщение отредактировал Goldfish: 30 Март 2020 - 21:27


#2 Goldfish

Goldfish

    Пользователь

  • Пользователь
  • PipPipPip
  • 388 сообщений

Отправлено 30 Март 2020 - 23:34

И еще не могу понять как работает эта резервация, если установить sv_visiblemaxplayers на 1 меньше чем в реале, то в лефте сервер всеравно видит максимум слотов, а со стима в браузере серверов отображается как положено на 1 меньше, вообще эта тема с резервированием слотов актуальна нет?


Сообщение отредактировал Goldfish: 30 Март 2020 - 23:34


#3 adacer

adacer

    Новичок

  • Пользователь
  • Pip
  • 44 сообщений

Отправлено 31 Март 2020 - 0:24

ну ты все правильно понял. узнать флаги раньше не получится. лучшее что можно сделать (насколько я знаю) использовать

public bool:OnClientConnect(client, String:rejectmsg[], maxlen)

на этой стадии можно достать айпи клиента, сравнить со своим (соответственно придется список составлять вручную) и выполнить что-то типа

	Format(rejectmsg, maxlen, "Сервер полон");
	return false; 

для тех кто не в этом списке



#4 dragokas

dragokas

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 792 сообщений

Отправлено 01 Апрель 2020 - 21:48

Goldfish, я тоже писал свой плаг на резервный слот.

 

Но делал иначе, на моем сервере всегда свободны дополнительные 2 слота (которые вообще никогда и никем не занимаются более чем на 1 сек.),

 

Как только заходит игрок, считается кол-во игроков на сервере, и если зашедший занимает один из доп. слотов, начинается проверка через форвард OnClientPostAdminCheck,

откуда уже вся инфа об авторизации гарантированно доступна.

 

Дальше уже идёт логика, является ли игрок админом, нубом, випом, игроком с минимальным числом очков в стате (и так циклом по всем игрокам с сортировкой), и исходя из этого принимается одно из решений:

 

1) кикнуть одного из игроков на сервере

2) кикнуть зашедшего игрока

 

с оповещением о причине.



#5 adacer

adacer

    Новичок

  • Пользователь
  • Pip
  • 44 сообщений

Отправлено 02 Апрель 2020 - 1:59

На момент OnClientPostAdminCheck игрок уже полностью загрузился, я бы так делать не рекомендовал, это оч неприятно.



#6 dragokas

dragokas

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 792 сообщений

Отправлено 02 Апрель 2020 - 2:02

Быть полностью загруженным и затем кикнутым?



#7 adacer

adacer

    Новичок

  • Пользователь
  • Pip
  • 44 сообщений

Отправлено 02 Апрель 2020 - 2:04

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


  • RyanAnderson, dragokas и Goldfish это нравится

#8 dragokas

dragokas

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 792 сообщений

Отправлено 02 Апрель 2020 - 2:33

В целом с вами согласен, хотя в моем случае чтобы такое реализовать придется лезть в исходники ещё 3 зависимых плагинов, при чём 1 не мой, т.к. от них инфа инициализируется на стадии уже после полного захода.

Но как TODO, приму на заметку.



#9 Goldfish

Goldfish

    Пользователь

  • Пользователь
  • PipPipPip
  • 388 сообщений

Отправлено 02 Апрель 2020 - 14:33

В целом с вами согласен, хотя в моем случае чтобы такое реализовать придется лезть в исходники ещё 3 зависимых плагинов, при чём 1 не мой, т.к. от них инфа инициализируется на стадии уже после полного захода.

Но как TODO, приму на заметку.

хорошо, а спрятать резервные слоты нельзя? Чтобы и в меню игры в списке сервов групп стим и в сервербраузере не отображались



#10 dr_lex

dr_lex

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 1 053 сообщений

Отправлено 02 Апрель 2020 - 17:43

хорошо, а спрятать резервные слоты нельзя? Чтобы и в меню игры в списке сервов групп стим и в сервербраузере не отображались

В стандартном sourcemod.cfg есть настройки
 

// Specifies how the reserved slots plugin operates. Valid values are:
// 0 : Public slots are used in preference to reserved slots. Reserved slots are freed before public slots.
// 1 : If someone with reserve access joins into a reserved slot, the player with the highest latency and 
// no reserved slot access (spectator players are selected first) is kicked to make room. Thus, the reserved
// slots always remains free. The only situation where the reserved slot(s) can become properly occupied is 
// if the server is full with reserve slot access clients.
// 2 : The same as sm_reserve_type 1 except once a certain number of admins have been reached, the reserve slot
// stops kicking people and anyone can join to fill the server. You can use this to simulate having a large
// number of reserved slots with sm_reserve_type 0 but with only need to have 1 slot unavailable when there are
// less admins connected.
// --
// Requires: reservedslots.smx
// Default: 0
sm_reserve_type 0
// Specifies the number of reserved player slots.  Users with the reservation
// admin flag set will be able to join the server when there are no public slots
// remaining. If someone does not have this flag, they will be kicked.
// (Public slots are defined as: maxplayers - number of reserved slots)
// --
// Requires: reservedslots.smx
// Default: 0
sm_reserved_slots 0
// Specifies whether or not reserved slots will be hidden (subtracted from max
// slot count). Valid values are 0 (Visible) or 1 (Hidden).
// --
// Requires: reservedslots.smx
// Default: 0
sm_hide_slots 0


#11 dragokas

dragokas

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 792 сообщений

Отправлено 02 Апрель 2020 - 20:24

Оставлю здесь инфу "для себя" - пригодится при реализации идеи от adacer, т.к. придётся приостанавливать процесс подключения клиента в связи с асинхронным запросом к БД. 
 

 

можно как то принудить клиента ожидать принятия решения?
И как это реализовано в том же sourcebans?


В форварде OnClientPreAdminCheck() вернуть Plugin_Stop, вроде. В доку глянуть не могу (с телефона), но там написано, что вернуть для блокировки Post-форварда.
Потом, когда сделаете что нужно, вызываете NotifyPostAdminCheck(). Название тоже не точное, в доке найдете.

 


  • Goldfish и adacer это нравится

#12 Goldfish

Goldfish

    Пользователь

  • Пользователь
  • PipPipPip
  • 388 сообщений

Отправлено 02 Апрель 2020 - 21:29

 

В стандартном sourcemod.cfg есть настройки
 

// Specifies how the reserved slots plugin operates. Valid values are:
// 0 : Public slots are used in preference to reserved slots. Reserved slots are freed before public slots.
// 1 : If someone with reserve access joins into a reserved slot, the player with the highest latency and 
// no reserved slot access (spectator players are selected first) is kicked to make room. Thus, the reserved
// slots always remains free. The only situation where the reserved slot(s) can become properly occupied is 
// if the server is full with reserve slot access clients.
// 2 : The same as sm_reserve_type 1 except once a certain number of admins have been reached, the reserve slot
// stops kicking people and anyone can join to fill the server. You can use this to simulate having a large
// number of reserved slots with sm_reserve_type 0 but with only need to have 1 slot unavailable when there are
// less admins connected.
// --
// Requires: reservedslots.smx
// Default: 0
sm_reserve_type 0
// Specifies the number of reserved player slots.  Users with the reservation
// admin flag set will be able to join the server when there are no public slots
// remaining. If someone does not have this flag, they will be kicked.
// (Public slots are defined as: maxplayers - number of reserved slots)
// --
// Requires: reservedslots.smx
// Default: 0
sm_reserved_slots 0
// Specifies whether or not reserved slots will be hidden (subtracted from max
// slot count). Valid values are 0 (Visible) or 1 (Hidden).
// --
// Requires: reservedslots.smx
// Default: 0
sm_hide_slots 0

 

он работает все с тем же кваром sv_visiblemaxplayers , а он не везде скрывает слоты, так в меню игры остались отображаться все слоты



#13 PawnLomaster

PawnLomaster

    Участник

  • Пользователь
  • PipPip
  • 116 сообщений

Отправлено 08 Май 2020 - 22:20

Оставлю здесь инфу "для себя" - пригодится при реализации идеи от adacer, т.к. придётся приостанавливать процесс подключения клиента в связи с асинхронным запросом к БД. 
 

А все ли запросы в sourcemod асинхронны?

DBResultSet SQL_Query(Handle database, const char[] query, int len)

Нет колбек функции, возвращает handle-ответ. Не похоже на асинхрон. По идее задержит поток до прихода ответа. Что-то не так пошло? INVALID_HANDLE! Есть много причин, почему асинхронно - лучше, но если прям срочно надо, то так.



#14 dragokas

dragokas

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 792 сообщений

Отправлено 09 Май 2020 - 12:08

Из тех, что обращаются непосредственно БД, на сколько мне известно асинхронные только:

 

SQL_TConnect
SQL_TQuery
 
+ их аналоги из методмапа Database, которые на самом деле зовут те же функции под оберткой.
+ транзакции из того же Database, реализация которых опять же сделана в виде обертки на стороне серверного SourceMod, и зовёт те же функции.
 
Также некоторые из функций работают с кешированными данными, здесь детальнее: https://forums.allie...32&postcount=37


#15 PawnLomaster

PawnLomaster

    Участник

  • Пользователь
  • PipPip
  • 116 сообщений

Отправлено 09 Май 2020 - 14:35

На сколько я понимаю из документации методмап Database содержит только асинхронные запросы к базе. Execute и Query выполняются отдельным потоком и имеют колбек. Больше там нет методов обращения к базе (ну, кроме Connect, что тоже асинхронный).



#16 dragokas

dragokas

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 792 сообщений

Отправлено 09 Май 2020 - 17:44

На сколько я понимаю из документации методмап Database содержит только асинхронные запросы к базе.

 

Где вы такое вычитали?

Даже если и написано, посмотрите еще раз пост на AM, я давал ссылки на исходный код, там например, под оберткой Database.SetCharset вызывается старая синхронная функция.



#17 PawnLomaster

PawnLomaster

    Участник

  • Пользователь
  • PipPip
  • 116 сообщений

Отправлено 09 Май 2020 - 20:01

Где вы такое вычитали?
Даже если и написано, посмотрите еще раз пост на AM, я давал ссылки на исходный код, там например, под оберткой Database.SetCharset вызывается старая синхронная функция.

Это не запрос к базе https://github.com/a...abase.cpp#L1509

UPD: Дизинфа


Сообщение отредактировал PawnLomaster: 09 Май 2020 - 22:18


#18 dragokas

dragokas

    Постоянный пользователь

  • Пользователь
  • PipPipPipPipPip
  • 792 сообщений

Отправлено 09 Май 2020 - 21:49

https://dev.mysql.co...racter-set.html



#19 PawnLomaster

PawnLomaster

    Участник

  • Пользователь
  • PipPip
  • 116 сообщений

Отправлено 09 Май 2020 - 22:19

Вопросов нет. Даже копнул до драйвера и mysql_set_character_set()




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных