• 0
Sign in to follow this  
Followers 0
NO2037

[закрыто] Добавления надписи при выходе с AFK через функцию SetPlayerChatBubble

Question

Здравствуйте. Есть система 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;
}

 

Share this post


Link to post

14 answers to this question

  • 0

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

 

Спойлер

new gSecondTimer[MAX_PLAYERS] = {-1};

public OnPlayerConnect(playerid) {
    gSecondTimer[playerid] = SetTimerEx("@SecondTimer"1 * 1000true"i", playerid); // создаем индивидуальный таймер
}

public OnPlayerDisconnect(playerid) {
    if (gSecondTimer[playerid] != -1) {
        KillTimer(gSecondTimer[playerid]); // удаляем индивидуальный таймер
        gSecondTimer[playerid] = -1// сбрасываем значение переменной
    }
}

@SecondTimer(playerid);
@SecondTimer(playerid) {
    // этот таймер будет вызываться только для тех игроков, которые подключены (~1 раз в секунду)
    // и теперь здесь не нужны циклы

    // пока игрока нет на карте, возможно, OnPlayerUpdate вызывается крайне редко
    // поэтому проверим, чтобы игрок был на карте, и только в этом случае будем считать AFK секунды
    new playerState = GetPlayerState(playerid);
    switch (playerState) {
        case PLAYER_STATE_ONFOOT, PLAYER_STATE_DRIVER, PLAYER_STATE_PASSENGER, PLAYER_STATE_SPAWNED: {
            PlayerAFK[playerid]++;
            
            // на всякий случай пока что 2 секунды AFK - это минимум
            if (PlayerAFK[playerid] >= 2) {
                // отображаем текст над головой
            }
        }
    }
}

public OnPlayerUpdate(playerid) {
    if (PlayerAFK[playerid] >= 2) {
        // отображаем текст "Вышел из АФК"
        PlayerAFK[playerid] = 0;
    }
}

 

 

Edited by Cawfee

Share this post


Link to post
  • 0

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

public OnPlayerUpdate(playerid) {

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

 

Share this post


Link to post
  • 0

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

Share this post


Link to post
  • 0

@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

Edited by NO2037

Share this post


Link to post
  • 0

@NO2037, спецификатор забыли добавить.

printf("PlayerAFK[playerid] = %d", PlayerAFK[playerid]);

 

Share this post


Link to post
  • 0

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

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

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

 

Share this post


Link to post
  • 0

@Cawfee Вот так теперь просто чередуется https://imgur.com/a/6iMn48A

 

Видимо очень сложно наверное такое реализовать)

Share this post


Link to post
  • 0

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

Share this post


Link to post
  • 0

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

Edited by NO2037

Share this post


Link to post
  • 0

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

Share this post


Link to post
  • 0

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

Share this post


Link to post
Guest
This topic is now closed to further replies.
Sign in to follow this  
Followers 0
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • Kasper0
      By Kasper0
      Продажа мода KAIF CRMP// Готовый кроссплатформленный мод (можно играть одновременно с ПК и телефонов)
       
      Характеристики мода:
       
      Процессор: PAWN.CMD
      Кол-во строк в моде: 60+k
      Режим: RolePlay
      Автор и разработчик: Максим Зуев

      Посла оплаты обратитесь в ЛС,для предоставления игровой сборки и помощи в установке мода.

      Системы в моде:
       
      — Полная адаптация под телефоны;
      — Абсолютно новая система светофоров (Штрафы за проезд на красный);
      — Биржа обмена;
      — Красивые интерьеры;
      — Уникальня система репорта;
      — Система ТОП ДОНАТЕРОВ;
      — Подарки за пополнение счета (Донат);
      — Возможность создавать маппинг прямо из игры;
      — Система тюнинга (Обвесы и т.д);
      — Мероприятие "Мясорубка";
      — Система ГОНКИ;
      — Бойцовский клуб;
      — Баня для отдыха;
      — BATTLE ROYALE;
      — Дуэли;
      — Прыжки с парашютом;
      — Система Контейнеров;
      — Система Автоугонщиков;
      — Работа мусорщиком;
      — Валюта EURO;
      — Система VIP'ок (Ruby, Sapphire, Emerald, Diamond);
      — Система штрафстоянок;
      — Работа ХИТМАНОМ (Заказные убийства);
      — Система Гос.Волны (/editgov);
      — Система рефералок (/referals);
      — Система друзей (/friends);
      — Система Ивентов, итоги в конце недели (Лучший Гос.служащий,Лучший убийца, Лучший тащер, Лучший армеец);
      — Система аксессуаров;
       
      Видеообзоры (YT,VK):

      https://www.youtube.com/watch?v=Gzzl2UN2i48

      https://www.youtube.com/watch?v=lZv-TRRFa1U

      https://www.youtube.com/watch?v=od1KDSHitu8
    • Kasper0
      By Kasper0


      Скачать файл CRMP MOBILE | KAIF RP | PC+MOBILE
      Продажа мода KAIF CRMP// Готовый кроссплатформленный мод (можно играть одновременно с ПК и телефонов)
       
      Характеристики мода:
       
      Процессор: PAWN.CMD
      Кол-во строк в моде: 60+k
      Режим: RolePlay
      Автор и разработчик: Максим Зуев

      Посла оплаты обратитесь в ЛС,для предоставления игровой сборки и помощи в установке мода.

      Системы в моде:
       
      — Полная адаптация под телефоны;
      — Абсолютно новая система светофоров (Штрафы за проезд на красный);
      — Биржа обмена;
      — Красивые интерьеры;
      — Уникальня система репорта;
      — Система ТОП ДОНАТЕРОВ;
      — Подарки за пополнение счета (Донат);
      — Возможность создавать маппинг прямо из игры;
      — Система тюнинга (Обвесы и т.д);
      — Мероприятие "Мясорубка";
      — Система ГОНКИ;
      — Бойцовский клуб;
      — Баня для отдыха;
      — BATTLE ROYALE;
      — Дуэли;
      — Прыжки с парашютом;
      — Система Контейнеров;
      — Система Автоугонщиков;
      — Работа мусорщиком;
      — Валюта EURO;
      — Система VIP'ок (Ruby, Sapphire, Emerald, Diamond);
      — Система штрафстоянок;
      — Работа ХИТМАНОМ (Заказные убийства);
      — Система Гос.Волны (/editgov);
      — Система рефералок (/referals);
      — Система друзей (/friends);
      — Система Ивентов, итоги в конце недели (Лучший Гос.служащий,Лучший убийца, Лучший тащер, Лучший армеец);
      — Система аксессуаров;
       
      Видеообзоры (YT,VK):

      https://www.youtube.com/watch?v=Gzzl2UN2i48

      https://www.youtube.com/watch?v=lZv-TRRFa1U

      https://www.youtube.com/watch?v=od1KDSHitu8
      Добавил Kasper0 Добавлено 08.12.2023 Категория Моды Автор devJust  
    • nnnumber1
      By nnnumber1
      Доброго времени суток, совсем недавно начал свой путь разработчика в САМП/КРМП, ищу интересный проект для взаимовыгодного сотрудничества.
      Хочется "набивать руку" и повышать свой уровень в реальных условиях!

      Пишите в ЛС на форуме.
    • Makkos
      By Makkos
      Ищу человека которий может сделать лаунчер мобайл для самп проекта
      Оплата в - грн
      Жду предложений в телеграм - https://t.me/creator700