Находится ли конкретный steam id сейчас на сервере?

iamdss

Участник
Сообщения
126
Реакции
12
Составляю массив steam id пользователей для использования в следующем раунде. Массив определённым образом пополняется. Необходимо в определённый момент времени удалять из массива идентификаторы отключенных игроков. Храню 64-битные идентификаторы в виде строк. Как выполнить задачу?
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #2
iamdss, какой массив используешь?
Юзай atd array, просто и удобно
 

iamdss

Участник
Сообщения
126
Реакции
12
Его и использую. Но не в массиве дело. Суть такова. При переходе юзера в спектаторы заталкиваю в массив steam id пользователя, а при старте раунда - нахожу соответствие, перевожу юзера обратно в спектаторы, элемент из массива вынимаю. Но, если юзер вышел до начала следующего раунда, его идентификатор остаётся висеть в массиве и его необходимо оттуда удалить. Делать цикл по массиву - невыгодно, но только что пришла идея поставить флаг в OnMapEnd и если OnClientDisconnect случается после вызова OnMapEnd, то проблема решена. Если нет, то актуальна. Где посмотреть порядок вызова этих событий сурсмодом, я не в курсе.

Добавлено через 1 минуту
сли юзер вышел до начала следующего раунда

То есть, и так и эдак OnClientDisconnect вызывается и я не могу отследить, когда игрок добровольно вышел, а когда его выкинуло сменой карты. Вот так.

Добавлено через 4 минуты
Вот, только что смотрел описания эвентов в файлах HL2DM, попробую опереться на
C-подобный:
"player_team"				// player change his team
	{
		"userid"	"short"		// user ID on server
		"team"		"byte"		// team id
		"oldteam" "byte"		// old team id
		"disconnect" "bool"	// team change because player disconnects
		"autoteam" "bool"		// true if the player was auto assigned to the team
		"silent" "bool"			// if true wont print the team join messages
		"name"	"string"		// player's name
	}
Если, конечно, игроку присваивается team id что-то вроде нуля перед выходом, но опять же, не знаю, будет ли вызываться player_team при добровольном выходе и на смене карты. В общем, одни вопросы.
 
Последнее редактирование:

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
событие "player_disconnect" вызывается при выходе из сервера и не вызывается при смене карты, в отличии от форварда OnClientDisconnect
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
если OnClientDisconnect случается после вызова OnMapEnd
Сначала вызывается отключение игрока, а потом уже конец карты (когда все игроки уже отключены).
будет ли вызываться player_team при добровольном выходе и на смене карты
При смене карты не вызывается. OnClientDisconnect(client) или OnClientDisconnect_Post(client) для этих целей.
событие "player_disconnect"
Тут можно узнать и причину выхода, как степень "добровольности".
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #7
FindStringInArray
 

iamdss

Участник
Сообщения
126
Реакции
12
Сначала вызывается отключение игрока, а потом уже конец карты (когда все игроки уже отключены)

Уже выяснил опытным путём. Вывел в лог, так и получилось.


Тут можно узнать и причину выхода, как степень "добровольности".

Спасибо, player_disconnect действительно не вызывается при смене карты, только в случае бана/кика/дисконнекта, чем и воспользовался.


В смысле?

И всё ж, друзья, вопрос меня тот самый по прежнему интересует, правда, уже вне контекста данной задачи, но на будущее. А как всё таки можно определить:

1. на сервере ли пользователь
2. имя пользователя или другую информацию о нём

имея на руках только его steamid 64 в рамках только сурсмода? Вариант запросов через steam web api не рассматриваем, нужно всё сделать внутри игрового сервера.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #9
iamdss, ну смотри.
Если просто проверить на сервере ли он -> юзаешь массив и через:
PHP:
if(FindStringInArray(g_hAuthArray, sAuth) != -1)
{
	// Стим есть в массиве
}

А вот если тебе нужно получать его индекс то тут 2 варианта:
1. Юзать еще 1 массив. Только в нем хранить индекс игрока. Массивы должны быть синхронизированы между собой.
Тоесть вошел игрок в массив 1 пишем стим, в массив 2 - индекс/юзер ид.
Вышел игрок - так же удаляем из обоих.
Чтобы получить индекс:
PHP:
new index = FindStringInArray(g_hAuthArray, sAuth);
if(index != -1)
{
	// Стим есть в массиве
	new iClient = GetArrayCell(g_hIndexArray, index);
	// вот твой индекс
}
2. Юзать atd trie.
При входе:
PHP:
SetTrieValue(g_hAuthTrie, sAuth, iClient);

При входе:
PHP:
RemoveFromTrie(g_hAuthTrie, sAuth);

Чтобы получить индекс:
PHP:
decl iClient;
if(GetTrieValue(g_hAuthTrie, sAuth, iClient))
{
	// вот твой индекс
}
 

iamdss

Участник
Сообщения
126
Реакции
12
Спасибо, я пользуюсь массивами, trie использовал однажды, но не уверен насчёт скорости.

А вот если тебе нужно получать его индекс

Думаю, да. Вот тут я тоже не нашёл оптимального решения.

Тоесть вошел игрок в массив 1 пишем стим, в массив 2 - индекс/юзер ид.
Вышел игрок - так же удаляем из обоих.

Это имеет смысл, если я не храню историю зашедших steam id. А представим, что мне нужно сохранять все id, которые были на сервере за определённый промежуток времени. Таким образом, ничего лучше линейного поиска по массиву я придумать не могу. В сурсмоде не нашёл никаких функций, чтобы получать инфо о пользователе по его steam id, можно только плясать от индекса. Видимо, тут сурсмод ограничен. Да, в принципе, и пусть, пока такая задача не стоит остро.

И ещё один вопрос по идентификаторам. Есть вот у нас 64-битный идентификатор клиента в стиме. Это почти 2^64 значений. Сейчас я храню их как строки, но хотелось бы оптимизировать использование памяти и хранить в виде чисел. Как это сделать? В сурсмоде, если я не ошибаюсь, размер переменных фиксирован 4-мя байтами, а надо 8.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
получать инфо о пользователе по его steam id
Всегда можно, не задумываясь о нагрузке, сверять SteamID с теми, кто зашёл. Дальше получим любые данные.
Это, если исходить лишь из одного конкретного SteamID.
Как это сделать?
Двумя числами. Как начало и конец. :-D
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Спасибо, я пользуюсь массивами, trie использовал однажды, но не уверен насчёт скорости.



Думаю, да. Вот тут я тоже не нашёл оптимального решения.



Это имеет смысл, если я не храню историю зашедших steam id. А представим, что мне нужно сохранять все id, которые были на сервере за определённый промежуток времени. Таким образом, ничего лучше линейного поиска по массиву я придумать не могу. В сурсмоде не нашёл никаких функций, чтобы получать инфо о пользователе по его steam id, можно только плясать от индекса. Видимо, тут сурсмод ограничен. Да, в принципе, и пусть, пока такая задача не стоит остро.

И ещё один вопрос по идентификаторам. Есть вот у нас 64-битный идентификатор клиента в стиме. Это почти 2^64 значений. Сейчас я храню их как строки, но хотелось бы оптимизировать использование памяти и хранить в виде чисел. Как это сделать? В сурсмоде, если я не ошибаюсь, размер переменных фиксирован 4-мя байтами, а надо 8.

Я бы смотрел в сторону sqlite. Только при очищении таблицы не забывай делать вакуум.
 

iamdss

Участник
Сообщения
126
Реакции
12

iamdss

Участник
Сообщения
126
Реакции
12
AlmazON, =)

Всё ясно. Ладно, будем обходиться тем, что есть.

Добавлено через 1 минуту
Куда делась кнопка "Спасибо"?
 
Последнее редактирование:
Сверху Снизу