Вопросы

Как проверить, что игрок стоит в AFK? Где-то читал что в OnPlayerUpdate, но не до конца понял как именно. Спасибо.

Поделиться сообщением


Ссылка на сообщение

3 ответа на этот вопрос

  • 0

паблик OnPlayerUpdate не вызывается когда игрок стоит в АФК, чтобы отслеживать афк ли игрок, нужно создать таймер

 

SetTimer("SecondTimer"1000true);

в таймеры вызываем метод SecondTimer(), который будет срабатывать каждую секунду, в нем мы будем увеличивать перменную отвечающую за кол-во секунд проведенных в АФК, например вот так :

for(new i = 0; i != MAX_PLAYERS; i++)
{
    if(IsPlayerConnected(i)) SetPVarInt(i, "IsPlayerAFK", GetPVarInt(i, "IsPlayerAFK") + 1);
}
return 1;

таким образом каждую секунду значение в его личной pvar переменной "IsPlayerAFK" значение будет увеличиваться на 1.

а в паблике OnPlayerUpdate() мы это значение будем сбрасывать(т.к. этот паблик работает только когда игрок не АФК)

например вот так :

if(GetPVarInt(playerid, "IsPlayerAFK") > 1)  //это сработает если число секунд которое игрок был в афк(переменная IsPlayerAFK больше 1
{
    new string[30];
    format(string, sizeof(string), "Вы были АФК %d секунд(ы).", GetPVarInt(playerid,"IsPlayerAFK"));
    SCM(playerid, COLOR_LIGHT_BLUE, string);
}
SetPVarInt(playerid, "IsPlayerAFK"0); // иначе мы устанавливаем это значение в 0

 

Отредактировано пользователем Cawfee

Заметка от Cawfee , создано

Все же стоит код заключать в соответствующий тег "Код", чтобы была и табуляция, и подсветка.

Поделиться сообщением


Ссылка на сообщение
  • 0

@Anton_Urchenko, коль уж вы себя позиционируете как человека, желающего чему-то научиться, влезу в диалог.

 

1. Не повторяйте ошибки неучей: все, что вы можете объявить, - это функцию и переменную. И функция, и переменная могут быть объявлены с маркерами, определяющими особенности размещения в памяти и использования. И маркер public может быть применен не только к функциям, но и переменным, ровно как и stock, и stock. Ниже примеры.

 

Спойлер

/*
    глобальная переменная
    область видимости ограничена одним файлом
    (доступ к переменной возможен только из этого файла)
*/

static var = 0;
static const var = 0// аналогично, но нельзя изменить значение

static stock var = 0// если переменная не используется, компилятор ее выбросит
static const stock var = 0// аналогично

/*
    глобальная переменная
    доступ к переменной возможен из любой точки ниже объявления данной переменной
    в примерах ниже показано, что new можно опускать
*/

new var = 0;
new stock var = 0// если переменная не используется, компилятор ее выбросит
stock var = 0// то же самое

new const var = 0// аналогично, но нельзя изменить значение
const var = 0// то же самое
const stock var = 0// то же самое

/*
    глобальная публичная переменная
    обратиться к переменной можно из фильтрскриптов
*/

new public var = 0;
new public stock var = 0// если переменная не используется, компилятор ее выбросит
new public const var = 0// переменную нельзя изменить
new public const stock var = 0;

public var = 0// ключевое слово new можно упускать
public const var = 0;
public const stock var = 0;

/*
    статические функции
*/

static someFunc() {
    // доступ к функции возможен только из этого файла
}

static stock someFunc() {
    // доступ к функции возможен только из этого файла
    // если функция не используется, компилятор ее выбросит
}

/*
    глобальные функции
*/

someFunc() {
    // и не нужен никакой stock
    // это самая обычная функция
}

stock someFunc() {
    // а это обычная функция
    // но если она не используется, компилятор ее выкинет
}

/*
    глобальные публичные функции
*/

forward someFunc();
public someFunc() {
    // доступ к функции возможен из фильтрскриптов
}

@someFunc();
@someFunc() {
    // это то же самое, что и forward + public
    // главное, чтобы первый символ был @
    // тогда ключевые слова forward и public писать не нужно
}

 

 

2. Практика показывает, что лучше создавать не один таймер, в котором осуществлять перебор всех игроков для обработки ежесекундных действий, а создавать для каждого игрока персональные таймеры (SetTimerEx). Возможно, конечно, вы не использовали это, чтобы не усложнять представленную вами логику. Тем не менее лишний раз акцентирую на этом внимание.

3. Сама по себе идея перебора всех игроков из диапазона [0; MAX_PLAYERS] с проверкой, подключен ли рассматриваемый игрок, также неудачна: используйте итераторы foreach. Опять же, возможно, вы не прибегали к этому, чтобы не усложнять пример.

Поделиться сообщением


Ссылка на сообщение
  • 0

хз как удалить сообщение

Отредактировано пользователем Anton_Urchenko

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • Sten Developer
      От Sten Developer
      Объясню всю ситуацию, пишу систему смерти игрока но она не работает. Решил по приколу написать туда обычный вывод текста SCM(playerid, COLOR_RED, "Вы умерли");
      Но однако после смерти текст не выводиться. Не работает абсолютно все. Кто знает как решить эту проблему?