Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 4 1 2 3 ... ПоследняяПоследняя
Показано с 1 по 10 из 32
  1. #1
    Аватар для James_Cruise
    Пользователь

    Статус
    Оффлайн
    Регистрация
    16.10.2014
    Сообщений
    11
    Репутация:
    0 ±

    Проверка на AFK(Свёрнуто ли окошко SA)

    После include
    PHP код:
    #define AFK_WINDOW_TIME 1200// 1200 мс - время последнего обновления статуса с сервером.
    new AFK_window[MAX_PLAYERS]; 
    В public OnPlayerUpdate(playerid)
    PHP код:
    AFK_window[playerid] = GetTickCount(); 
    И сама проверка
    PHP код:
    if(GetTickCount() - AFK_window[playerid] > AFK_WINDOW_TIME)
    {
        
    SendClientMessage(playerid, -1"AFK");


  2. #2
    Аватар для NewGreen
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.09.2014
    Сообщений
    61
    Репутация:
    44 ±
    Такой метод определения AFK имеет право на существование, но лучше все же не использовать функцию GetTickCount() это лишнее можно обойтись булевыми переменными, например:

    PHP код:
    new bool:checkToAFK[MAX_PLAYERS]; 
    OnPlayerUpdate(playerid)
    PHP код:
    checkToAFK[playerid] = false
    И проверку этого в сек таймер
    PHP код:
    if(checkToAFK[playerid]) {
        
    // Выполняем АФК функции
    }
    checkToAFK[playerid] = true
    Я не хочу наступать на горло вашей песни, но думаю что с булевыми переменными, код будет эффективней
    Последний раз редактировалось NewGreen; 16.10.2014 в 14:00.

  3. #3
    Аватар для James_Cruise
    Пользователь

    Статус
    Оффлайн
    Регистрация
    16.10.2014
    Сообщений
    11
    Репутация:
    0 ±
    В каком то плане ваш способ будет лучше.
    Не учитывая,что в вашем способе нужен таймер.
    Цитата Сообщение от NewGreen Посмотреть сообщение
    Такой метод определения AFK имеет право на существование, но лучше все же не использовать функцию GetTickCount() это лишнее можно обойтись булевыми переменными, например:

    PHP код:
    new bool:checkToAFK[MAX_PLAYERS]; 
    OnPlayerUpdate(playerid)
    PHP код:
    checkToAFK[playerid] = false
    И проверку этого в сек таймер
    PHP код:
    if(checkToAFK[playerid]) {
        
    // Выполняем АФК функции
    }
    checkToAFK[playerid] = true
    Я не хочу наступать на горло вашей песни, но думаю что с булевыми переменными, код будет эффективней

  4. #4
    Аватар для NewGreen
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.09.2014
    Сообщений
    61
    Репутация:
    44 ±
    Цитата Сообщение от James_Cruise Посмотреть сообщение
    В каком то плане ваш способ будет лучше.
    Не учитывая,что в вашем способе нужен таймер.
    Ну если учесть что в большинстве модов присутствует так или иначе, 1 сек таймер, думаю что под АФК не понадобиться заводить его отдельно, достаточно поставить проверку на АФК в функцию с этим таймером. Но даже если, и создать лишний таймер (если отсутствует общий 1 сек или налогичный ему) в этом нет ничего страшного.

  5. #5
    Аватар для James_Cruise
    Пользователь

    Статус
    Оффлайн
    Регистрация
    16.10.2014
    Сообщений
    11
    Репутация:
    0 ±
    Опять же, нужно создать таймер.
    А теперь представим,что у нас система которая не проходит через таймер,но нуждается в проверке АФК.
    В твоём случае мы проверяем таким образом:
    PHP код:
    if(!checkToAFK[playerid]) {
        
    // Игрок не АФК

    Значит для выполнения итерации переменная checkToAFK[playerid] должна ровняться false,учитывая,что OnPlayerUpdate может вызываться от 0 до 25 раз в секунду,допустим игрок стоит вызов будет от 0 до 5 раз в секунду,пускай в среднем будет каждые 200 мс,теперь у нас срабатывает таймер, checkToAFK[playerid] = true ,затем сработает проверка выше,а только тогда OnPlayerUpdate и в данном случае у нас баг.
    Цитата Сообщение от NewGreen Посмотреть сообщение
    Ну если учесть что в большинстве модов присутствует так или иначе, 1 сек таймер, думаю что под АФК не понадобиться заводить его отдельно, достаточно поставить проверку на АФК в функцию с этим таймером. Но даже если, и создать лишний таймер (если отсутствует общий 1 сек или налогичный ему) в этом нет ничего страшного.

  6. #6
    Аватар для wAx
    ¯\_(ツ)_/¯

    Статус
    Оффлайн
    Регистрация
    13.12.2013
    Сообщений
    377
    Репутация:
    146 ±
    PHP код:
    AFK_window[playerid] = GetTickCount(); 
    Всяко лучше каждый раз устанавливать значение afk = false, чем afk = GetTickCount()..
    Даже если система не проходит через основной таймер, все равно можно будет проверить статус игрока.

  7. #7
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от NewGreen Посмотреть сообщение
    думаю что с булевыми переменными, код будет эффективней
    Вы серьёзно? В Pawn все типы данных, кроме массивов, занимают по 4 байта.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  8. #8
    Аватар для James_Cruise
    Пользователь

    Статус
    Оффлайн
    Регистрация
    16.10.2014
    Сообщений
    11
    Репутация:
    0 ±
    Проверить то можно,но будут неточности,точнее баг.
    Цитата Сообщение от wAx Посмотреть сообщение
    PHP код:
    AFK_window[playerid] = GetTickCount(); 
    Всяко лучше каждый раз устанавливать значение afk = false, чем afk = GetTickCount()..
    Даже если система не проходит через основной таймер, все равно можно будет проверить статус игрока.
    Последний раз редактировалось James_Cruise; 17.10.2014 в 03:20.

  9. #9
    Аватар для NewGreen
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.09.2014
    Сообщений
    61
    Репутация:
    44 ±
    Цитата Сообщение от James_Cruise Посмотреть сообщение
    Опять же, нужно создать таймер.
    А теперь представим,что у нас система которая не проходит через таймер,но нуждается в проверке АФК.
    В твоём случае мы проверяем таким образом:
    PHP код:
    if(!checkToAFK[playerid]) {
        
    // Игрок не АФК

    Значит для выполнения итерации переменная checkToAFK[playerid] должна ровняться false,учитывая,что OnPlayerUpdate может вызываться от 0 до 25 раз в секунду,допустим игрок стоит вызов будет от 0 до 5 раз в секунду,пускай в среднем будет каждые 200 мс,теперь у нас срабатывает таймер, checkToAFK[playerid] = true ,затем сработает проверка выше,а только тогда OnPlayerUpdate и в данном случае у нас баг.
    Спасибо! Я понял что вы хотите сказать, что касается описания вами работы алгоритма, это нужно проверять, теоретически он работает, но также теоретически может возникнуть баг (хотя это багом назвать трудно). Учитывая что вы переписали первоначальную реализацию с
    PHP код:
    if(checkToAFK[playerid]) {
        
    // Выполняем АФК функции
    }
    checkToAFK[playerid] = true
    на
    PHP код:
    if(!checkToAFK[playerid]) {
        
    // Игрок не АФК

    я не могу вам гарантировать нормальную работу алгоритма.
    Немного теории:
    OnPlayerUpdate - обновляется очень быстро, и работает пока игрок не свернул игру, соответственно переменная checkToAFK[playerid] будет иметь значение false до тех пор пока игрок не свернет игру, как только он игрок свернул игру, система определяется что игрок АФК, именно благодаря этому коду в 1 сек таймере:
    PHP код:
    if(checkToAFK[playerid]) {
        
    // Выполняем АФК функции
    }
    checkToAFK[playerid] = true
    - - - Добавлено - - -

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Вы серьёзно? В Pawn все типы данных, кроме массивов, занимают по 4 байта.
    Ну что поделать, Pawn изначально создавался для неопытных программистов, наверное поэтому создатели были столь щедры))
    конечно, не очень рационально под boolean выделять 4 байта, но что поделаешь.
    Под эффективностью я имел ввиду, что присваивание значение переменной в конкретном случае, однозначно быстрее чем вызов функции и присваивание её значения той же переменной.

  10. #10
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от NewGreen Посмотреть сообщение
    Ну что поделать, Pawn изначально создавался для неопытных программистов, наверное поэтому создатели были столь щедры))
    конечно, не очень рационально под boolean выделять 4 байта, но что поделаешь.
    В Pawn обычно не используется такое понятие, как "байт", вместо этого используется понятие "ячейка". В версии Pawn для SA:MP ячейка равна 4 байтам, хотя в других версиях (например, для Vault-MP) она может состоять из 8 байт. На каждую переменную выделяется по 1 ячейке, поэтому нельзя сделать одиночные переменные размером всего в 1 байт.
    Впрочем, можно сделать массив из байтов:
    PHP код:
    new arr[12 char]; 
    Этим кодом создастся массив из 12 байт (12/4 = 3 ячейки).
    Затем присваиваем ячейке значение:
    PHP код:
    arr{playerid} = 1
    Обратите внимание: вместо квадратных скобок используются фигурные - они означают доступ вместо всей ячейки только к байту с указанным индексом.

    Цитата Сообщение от NewGreen Посмотреть сообщение
    Под эффективностью я имел ввиду, что присваивание значение переменной в конкретном случае, однозначно быстрее чем вызов функции и присваивание её значения той же переменной.
    Хорошенько подумайте, что будет, если в том же односекундном таймере добавить код с проверкой на AFK _после_ присвоения checkToAFK[playerid] = true.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

 

 
Страница 1 из 4 1 2 3 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

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