Вопросы

NO2037
Активный

Здравствуйте. Есть система AFK. При нажатии ESC выводит текст над головой [AFK: n секунд] через функцию SetPlayerChatBubble. Когда выйдет допустим с afk, как ему показать текст [Вышел с AFK]? Пробовал в OnPlayerUpdate че то делать, то надпись просто зависала, то еще чего... Пол дня сижу и не могу додумать как реализовать).

new PlayerAFK[MAX_PLAYERS];

public OnGameModeInit()
{
    SetTimer("second_timer"1000true);

    return 1;
}

public OnPlayerUpdate(playerid)
{
    PlayerAFK[playerid] = 0;
    
    return 1;
}

callback: second_timer()
{
    foreach(new i : logged_players)
    {
        PlayerAFK[i]++;
        if(PlayerAFK[i] > 1)
        {
            new afk_text[100];
            format(afk_text, sizeof(afk_text), "[AFK: %d секунд]", PlayerAFK[i]);
            SetPlayerChatBubble(i, afk_text, -150.01200);
        }
    }

    return 1;
}

 

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


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

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

  • 0
Cawfee
Великий Гуру

@NO2037, для начала рассмотрим возможность перехода на индивидуальные секундные таймеры. Как вы понимаете, если будет большое количество игроков и весьма "тяжелый" код в second_timer, таймер может не успевать обрабатывать все за секунду, откуда будут расти проблемы. В этом плане эффективнее на каждого игрока создавать собственный таймер. К тому же, возможно, проблема растет из того, что ваш глобальный таймер для игрока начинает вызываться раньше, чем игрок успел появиться на карте, в результате чего время его авторизации/регистрации может идти в секунды AFK (ибо, насколько я помню, в режиме наблюдения OnPlayerUpdate вызывается крайне редко). В любом случае попробуйте, а там будет видно.

 

  открыть спойлер

 

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

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


Ссылка на сообщение
  • 0
Cawfee
Великий Гуру

@NO2037, а что-нибудь такое?

public OnPlayerUpdate(playerid) {

    if (PlayerAFK[playerid] != 0) {
        SetPlayerChatBubble(i, "[Вышел из AFK]", -150.01200);
        PlayerAFK[playerid] = 0;
    }
    
    return 1;
}

 

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


Ссылка на сообщение
  • 0
Cawfee
Великий Гуру

@NO2037, а если добавить вывод переменной PlayerAFK[playerid] в OnPlayerUpdate в логи сервера? В эту ветку вообще не должно было быть попадание, поэтому появляются сомнения, что PlayerAFK принимает корректное значение.

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


Ссылка на сообщение
  • 0
NO2037
Активный

@Cawfee 

public OnPlayerUpdate(playerid)
{
    if(PlayerAFK[playerid] != 0)
    {
        SetPlayerChatBubble(playerid, "[Выход с AFK]", -150.01200);
        PlayerAFK[playerid] = 0;
    }
    
    printf("PlayerAFK[playerid] = ", PlayerAFK[playerid]);
    
    return 1;
}

https://imgur.com/a/G8g6ZOW

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

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


Ссылка на сообщение
  • 0
Cawfee
Великий Гуру

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

public OnPlayerUpdate(playerid)
{
    if(PlayerAFK[playerid] != 0) {
        printf("PlayerAFK = ", PlayerAFK[playerid]);

        SetPlayerChatBubble(playerid, "[Выход с AFK]", -150.01200);
        PlayerAFK[playerid] = 0;
    }
    
    return 1;
}

 

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


Ссылка на сообщение
  • 0
Cawfee
Великий Гуру

@NO2037, сама реализация корректная. Остается лишь пробовать увеличивать минимальное время для отображения текста про AFK над головой (скажем, не 1-2 секунды, 3).

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


Ссылка на сообщение
  • 0
NO2037
Активный

@Cawfee Пробую увеличивать, но все равно как-то не так по моему работает. Все равно, даже если игрок не в АФК, высвечивается надпись [AFK: n секунд], проходит 2 сек [Вышел с AFK] и так чередуется. Не могу понять с чем связано. Просто сейчас такая же ситуация была как и с моей реализацией, только иначе...

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

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


Ссылка на сообщение
  • 0
NO2037
Активный

Все заработало. Чутка правда пришлось переделать, спасибо за помощь.

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


Ссылка на сообщение
  • 0
Cawfee
Великий Гуру

@NO2037, было бы здорово, если бы поделились решением – возможно, кому-нибудь будет полезно.

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


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

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

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

    • ANIME_TOP12YLTRA
      От ANIME_TOP12YLTRA
      Помогите пожалуйста у меня еррор при компиляции
      C:\RED RUSSIA GAMES - МОД\pawno\include\customtune.inc(179) : error 001: expected token: ";", but found "["
      C:\RED RUSSIA GAMES - МОД\pawno\include\customtune.inc(179) : error 029: invalid expression, assumed zero
      C:\RED RUSSIA GAMES - МОД\pawno\include\customtune.inc(179) : warning 221: label name "E_HANDLING_PARAMS" shadows tag name
      C:\RED RUSSIA GAMES - МОД\pawno\include\customtune.inc(179) : error 001: expected token: ";", but found "]"
      C:\RED RUSSIA GAMES - МОД\pawno\include\customtune.inc(179) : fatal error 107: too many error messages on one line
      Compilation aborted.
      Pawn compiler 3.2.3664              Copyright (c) 1997-2016, ITB CompuPhase

      4 Errors.
       
      код - g_VehHandlingInfo[veh][E_HANDLING_PARAMS:j] = 0.0;