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

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

    Как правильно настроить таймер, чтобы команда срабатывал каждый час?

    Привет всем!
    У меня настроен таймер, который запущен на ежесекундное обновление. В нем есть условие, при которое должно срабатывать в том случае если старое время меньше нового и минуты равны нулю, если это так должна запуститься функция PayDay(). Но он работает некорректно. В том случае если я нахожусь на сервере (не АФК), то он срабатывает, а если при этом у меня свернута игра (в АФК), то при выходи из АФК например на 30 минуте, то timestamp показывает что сработал несколько секунд назад. Как исправить эту проблему?
    Вот собственно код:
    PHP код:
    new g_hourg_minuteg_second;
    new 
    g_yearg_monthg_day;

    forward SecondUpdater();

    SetTimer("SecondUpdater"1000true);
    public 
    SecondUpdater() {
      foreach(new 
    Player) {
        if(
    pInfo[i][pLoggedIn] == false) return 1;
        
    CommonTime(i);
      }
      return 
    1;
    }

    stock CommonTime(playerid) {
      new 
    nhournminutensecond;
      
    gettime(nhournminutensecond);
      if((
    nhour g_hour) || (nhour == && g_hour == 23)) {
        
    g_hour nhour;
        
    SetWorldTime(nhour);
        
    format(stringsizeof(string), "Time %d:00 hours"nhour);
        
    SendClientMessage(playeridCOLOR_WHITEstring);
        
    SendClientMessage(playeridCOLOR_WHITE"Payday run!");
      }

      if(
    nminute == 10 && nsecond == || nminute == 40 && nsecond == 0) {
        
    SendClientMessageToAll(COLOR_WHITE"Реклама на сервере.");
      }
      return 
    1;

    PS: Что можете сказать вообще о коде? Стоит ли делать foreach? Или хватит простого playerid?

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

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Баг со временем в timestamp это баг клиента, поэтому не как.

    PHP код:
    (nhour g_hour)
    //ИМХО, это лишняя часть кода в условии
    if((nhour g_hour) || (nhour == && g_hour == 23)) 
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

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

    Статус
    Оффлайн
    Регистрация
    11.12.2016
    Сообщений
    27
    Репутация:
    0 ±
    То есть, если на сервере будет хоть один игрок то все сработает правильно?

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

    Статус
    Оффлайн
    Регистрация
    13.06.2016
    Адрес
    Одесса, Украина
    Сообщений
    281
    Репутация:
    51 ±
    Цитата Сообщение от vladivanovx Посмотреть сообщение
    То есть, если на сервере будет хоть один игрок то все сработает правильно?
    Независимо от кол-ва игроков - данный скрипт будет срабатывать точно по времени. Так как эти действия происходят на сервере, а не на стороне клиента, а тот баг - скорее всего просто криво показывает время после АФК(честно никогда с таким не сталкивался или просто не обращал внимания)

  5. #5
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от vladivanovx Посмотреть сообщение
    то timestamp показывает что сработал несколько секунд назад.
    То бишь, тебе не нравится, что если стоять в афк в момент отправки сервером сообщения, а после выйти из афк, то сообщение приходит не тогда, когда сервер его отправил, а когда ты вышел из афк?
    Если да, то всё логично. Ведь пока игрок в афк, синхронизация с ним не происходит вообще. И все сообщения "выстраиваются" в очередь, чтоб в момент, когда игрок вышел из афк, отобразить их ему.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  6. #6
    Аватар для vladivanovx
    Пользователь

    Статус
    Оффлайн
    Регистрация
    11.12.2016
    Сообщений
    27
    Репутация:
    0 ±
    Всем спасибо, теперь все понял. Благодарю.

    PS: Вот что еще, нормально ли использовать цикл (там где foreach в таймере), или добавить таймеру playerid, и убрать цикл?
    Последний раз редактировалось vladivanovx; 12.12.2016 в 22:32.

  7. #7
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Тогда уж проще сразу вызывать CommonTime таймером
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    11.12.2016
    Сообщений
    27
    Репутация:
    0 ±
    Хорошо, спасибо. Оставлю как есть, так как там еще есть несколько функций и условий.

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

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Я раньше как то не понимал почему тема с индивидуальным таймером являлась оптимизатором, и только месяц назад где то логически понял что такие переборы при большом или среднем онлайне будут работать один раз и для всех сразу без пауз всяких(что есть капля лагов), а в индивидуме создаётся свой таймер со своим отсчетом и получается что у каждого игрока своё начало апдейта, тем самым сервер не впадает в эту долгую нагрузку.
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  10. #10
    Аватар для Nexius_Tailer
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    Я раньше как то не понимал почему тема с индивидуальным таймером являлась оптимизатором, и только месяц назад где то логически понял что такие переборы при большом или среднем онлайне будут работать один раз и для всех сразу без пауз всяких(что есть капля лагов), а в индивидуме создаётся свой таймер со своим отсчетом и получается что у каждого игрока своё начало апдейта, тем самым сервер не впадает в эту долгую нагрузку.
    Более того, этот вариант по эффективности, по-сути, наравне с foreach в цикле, т.к. мало того, что задержки происходят не единовременно, так ещё и только для тех, кто на сервере, вне зависимости от идов игроков (имея, к примеру, максимальный ид онлайн игрока 25, это не будет тратить время на перебор вышедших идов между 0 и максимальным).
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

 

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

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

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

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

Ваши права

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