[SM] Afk Informer

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

  1. diller110

    diller110

    Сообщения:
    138
    Симпатии:
    48
    Добрый день/вечер. Нужно решить одну задачку. Если человек стоит без движения некоторое время, написать в чат что: %player стоит уже %time без движения на %place.
    (Игра CSGO)
    Звучит легко, но под %place, я подразумеваю название места на котором стоит игрок, которое выводится так же сверху миникарты. Например: Спавн Т, Зигзак, Длина, Плэнт Б.

    И вот вопрос: Возможно ли как-нибудь получить эти названия? Из vot etoy темы, ясно что все названия находятся в nav-файлах соответствующих карт. Так же можно найти консольную команду:
    nav_place_list - Данная консольная команда позволяет вам вывести список и количество используемых навигационных местностей в текущей карте.
    Но мне её у себя проверить не удалось, возможно из за этого:
    Переменная nav_edit (с которой все и будет начинаться) имеет консольный флаг CHEAT, поэтому для ей включения требуется sv_cheats, а также nav_edit работает только на локальном сервере. Проверю это завтра, а пока есть ли какие нибудь предложения?

    Да, можно написать для каждой карты свои координаты и к ним названия, но зачем так трудно, когда вроде бы до решения рукой подать...
     
  2. R1KO

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

    Сообщения:
    5.994
    Симпатии:
    2.990
    PHP:
    new g_iOffsLastPlaceName = -1;

    public 
    OnPluginStart()
    {
            
    g_iOffsLastPlaceName FindSendPropOffs("CBasePlayer""m_szLastPlaceName");
    }

    //Когда нужно получить место 

    decl String:place[24];
    GetEntDataString(clientg_iOffsLastPlaceNameplacesizeof(place));
    // В place будет место
    P.S. Писал с телефона, могут быть ошибки и опечатки
     
    diller110 нравится это.
  3. diller110

    diller110

    Сообщения:
    138
    Симпатии:
    48
    Спасибо! Принцип понял. Боялся на самом деле что это будет невозможно. Завтра отпишусь и скину плагин. (Для кого-нибудь=) )
     
  4. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    diller110, как-то нецелесообразно искать АФКшника по расположения в секторе карты. Чем вариант с получением координаты игрока и его направлением взгляда не устраивает?
    Ведь есть карты, где одна команда должна как правило на одном месте быть, тогда и получится, что все АФКшники.
     
  5. diller110

    diller110

    Сообщения:
    138
    Симпатии:
    48
    Именно так и задумывалось.

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

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Ну так смотри, то, что кинул Рико и есть показ места. Игрок может долго быть в одном секторе, то бишь БАЗА Т, но при этом двигаться, делать какие-либо действия. Т.е. возможны ложные срабатывания.
     
  7. R1KO

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

    Сообщения:
    5.994
    Симпатии:
    2.990
    TolikCorp, прочитай что он написал. А потом ответил на твой вопрос diller110`у.

    Получать он будет позицию игрока и углы, по ним проверять афк ли игрок. А имена мест ему нужны для вывода положения афк игрока.
     
    Последнее редактирование: 8 фев 2015
    TolikCorp нравится это.
  8. AlmazON

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

    Сообщения:
    4.541
    Симпатии:
    1.984
    Оффтоп
     
  9. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Да, перечитал еще раз и теперь разобрался с его идеей :)
     
  10. R1KO

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

    Сообщения:
    5.994
    Симпатии:
    2.990
    Оффтоп
     
  11. diller110

    diller110

    Сообщения:
    138
    Симпатии:
    48
    Взял за основу плагин Sammy's Afk Kicker, вырезал все ненужные на мой взгляд проверки, типо Иммунитет админу, Иммунитет опр. игроку. С
    new Float:EngineTime = GetEngineTime();
    new Float:TimeNeeded = GetConVarFloat(MaxAfkTime);
    if(EngineTime - LastMovementTime[index] >= TimeNeeded)
    нафиг запутался, поэтому подобные проверки тоже удалил. Создание таймера перенес на начало раунда, в сам таймер вписал условие живости игрока.
    Вообщем вроде получилось максимально просто, но чего-то работать не хочет. Предполагаемые ошибки: Неправильное оформление таймера, из-за чего он не повторяется.
    Неправильный вызов таймера (незнаю нужно ли его вызывать отдельно для каждого игрока и подобные тонкости).
    Если не лень проверьте пожалуйста:
    Посмотреть вложение afkinformer.sp

    И еще добавил для саморазвития команду, которая выводит координаты и углы обзора игрока. С координатами проблем нет. А с углами обзора периодически angle[0], и всегда angle[2] выдают в чат 0.0. С чем это связано?
     
  12. R1KO

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

    Сообщения:
    5.994
    Симпатии:
    2.990
    diller110 нравится это.