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

Тема в разделе "Программирование / Скриптинг", создана пользователем iamdss, 29 авг 2015.

  1. iamdss

    iamdss

    Сообщения:
    117
    Симпатии:
    0
    Составляю массив steam id пользователей для использования в следующем раунде. Массив определённым образом пополняется. Необходимо в определённый момент времени удалять из массива идентификаторы отключенных игроков. Храню 64-битные идентификаторы в виде строк. Как выполнить задачу?
     
  2. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.988
    Симпатии:
    2.986
    iamdss, какой массив используешь?
    Юзай atd array, просто и удобно
     
  3. iamdss

    iamdss

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

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

    Добавлено через 4 минуты
    Вот, только что смотрел описания эвентов в файлах HL2DM, попробую опереться на
    Код:
    "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 при добровольном выходе и на смене карты. В общем, одни вопросы.
     
    Последнее редактирование: 29 авг 2015
  4. gibs

    gibs Фитиль народного волненья

    Сообщения:
    538
    Симпатии:
    137
    событие "player_disconnect" вызывается при выходе из сервера и не вызывается при смене карты, в отличии от форварда OnClientDisconnect
     
  5. iamdss

    iamdss

    Сообщения:
    117
    Симпатии:
    0
    Понял, опробую, спасибо.
     
  6. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.524
    Симпатии:
    1.973
    Сначала вызывается отключение игрока, а потом уже конец карты (когда все игроки уже отключены).
    При смене карты не вызывается. OnClientDisconnect(client) или OnClientDisconnect_Post(client) для этих целей.
    Тут можно узнать и причину выхода, как степень "добровольности".
     
  7. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.988
    Симпатии:
    2.986
    FindStringInArray
     
  8. iamdss

    iamdss

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


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

    В смысле?

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

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

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

    R1KO Супер-модератор

    Сообщения:
    5.988
    Симпатии:
    2.986
    iamdss, ну смотри.
    Если просто проверить на сервере ли он -> юзаешь массив и через:
    PHP:
    if(FindStringInArray(g_hAuthArraysAuth) != -1)
    {
        
    // Стим есть в массиве
    }
    А вот если тебе нужно получать его индекс то тут 2 варианта:
    1. Юзать еще 1 массив. Только в нем хранить индекс игрока. Массивы должны быть синхронизированы между собой.
    Тоесть вошел игрок в массив 1 пишем стим, в массив 2 - индекс/юзер ид.
    Вышел игрок - так же удаляем из обоих.
    Чтобы получить индекс:
    PHP:
    new index FindStringInArray(g_hAuthArraysAuth);
    if(
    index != -1)
    {
        
    // Стим есть в массиве
        
    new iClient GetArrayCell(g_hIndexArrayindex);
        
    // вот твой индекс
    }
    2. Юзать atd trie.
    При входе:
    PHP:
    SetTrieValue(g_hAuthTriesAuthiClient);
    При входе:
    PHP:
    RemoveFromTrie(g_hAuthTriesAuth);
    Чтобы получить индекс:
    PHP:
    decl iClient;
    if(
    GetTrieValue(g_hAuthTriesAuthiClient))
    {
        
    // вот твой индекс
    }
     
  10. iamdss

    iamdss

    Сообщения:
    117
    Симпатии:
    0
    Спасибо, я пользуюсь массивами, trie использовал однажды, но не уверен насчёт скорости.

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

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

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

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.524
    Симпатии:
    1.973
    Всегда можно, не задумываясь о нагрузке, сверять SteamID с теми, кто зашёл. Дальше получим любые данные.
    Это, если исходить лишь из одного конкретного SteamID.
    Двумя числами. Как начало и конец. :-D
     
  12. gibs

    gibs Фитиль народного волненья

    Сообщения:
    538
    Симпатии:
    137
    Я бы смотрел в сторону sqlite. Только при очищении таблицы не забывай делать вакуум.
     
  13. iamdss

    iamdss

    Сообщения:
    117
    Симпатии:
    0
    А работать с ними как? Строку раскладывать что ли? Как-то неправильно=)

    Уже была мысль, но хочется проще и быстрее.
     
  14. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.524
    Симпатии:
    1.973
    Оффтоп
     
  15. iamdss

    iamdss

    Сообщения:
    117
    Симпатии:
    0
    AlmazON, =)

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

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