Гайд Работа со временем

Основное: Привет, надоело смотреть на код и видеть там лютый говнокод для расчёта онлайна или афк. Особенно бесит расчёты через wait(). Мои способы могут быть не идеальными, опытные можете оставить свои поправки.
Для начала можно почитать эту тему. Примеры там же
Код:
1) Получение афк

Lua:
function main()
    afk = os.clock() - gameClock()
    while true do
        wait(0)
        print(getafk())
    end
end

function getafk()
    return math.modf((os.clock() - afk) - gameClock())
end
2) Получение онлайна
Тут очень просто, можно использовать 2 функции.
os.clock() Возвращает общее время запуска игры (в АФК будет обновляться)
или
gameClock() Возвращает общее время в игре (в АФК не обновляется)

P.S. Пишите что можно ещё разобрать.
 
Последнее редактирование:

Cosmo

Дели на 0!
Проверенный
528
1,355
Особенно бесит расчёты через wait()
а чем они хуже чем os.clock() и gameClock()?
Результат то один и тот же. (или нет?)

Нормальное получение текущего времени, например в МСК. Т.к. os.time() работает от твоего часового пояса и os.time(os.date("!*t")) будет у всех отличаться
искать API с временем в интернете и по нему работать, ну или юзеру вручную указывать свой часовой пояс и дальше плясать уже от него
 
Последнее редактирование:
  • Нравится
Реакции: daniello1337

Tema05

Известный
1,218
281
На сервере по любому есть /time по нему можно чекать.
 
  • Нравится
Реакции: Cosmo

ronnyevans

ева 00 ева 01 ева 02 я непобедим евангелион нана
Проверенный
870
628
Нормальное получение текущего времени, например в МСК. Т.к. os.time() работает от твоего часового пояса и os.time(os.date("!*t")) будет у всех отличаться
 

The Spark

Известный
337
168
Ещё раз говорю, попробуй сменить часовой пояс на Красноярск например. Время будет отличаться от МСК
 

ronnyevans

ева 00 ева 01 ева 02 я непобедим евангелион нана
Проверенный
870
628
Ещё раз говорю, попробуй сменить часовой пояс на Красноярск например. Время будет отличаться от МСК
Тут берется не с часового пояса а с unix времени, к нему добавляется 3 часа
Ты вообще пробовал?
 
  • Нравится
  • Злость
Реакции: Vintik, The Spark и imring

eaton

Участник
137
8
Lua:
afk = os.clock() - gameClock()
function getafk()
    return math.modf((os.clock() - afk) - gameClock())
end
if getafk == 10 then
    sampAddChatMessage('text', color)
end
поч не работает?
 

Vintik

#PORSCHE
Модератор
1,193
513
а чем они хуже чем os.clock() и gameClock()?
Результат то один и тот же. (или нет?)


искать API с временем в интернете и по нему работать, ну или юзеру вручную указывать свой часовой пояс и дальше плясать уже от него
Тем, что после wait() и перед следующим wait() (перед следующей итерации цикла) идут какие-то действия.
Lua:
while true do
    wait(1000)
    -- какие-то действия, хотя бы обновление переменной
end
Эти действия занимают время, хоть и очень-очень маленькое, но время. За час может секунда накапать лишняя. os.clock работает независимо от скрипта и правильно считает время, не сбиваясь. Поэтому с ним хоть миллион лет играй, никакой секунды не накапает.

А самое основное – то, что скрипт через wait() реализован с помощью потоков (отдельно main() и отдельно imgui.onDrawFrame()). Глупо использовать многопоточность там, где можно её избежать (по простому: костыли). Если говорит о C++, то:
Разработчики, только перешедшие с клео\луа на C++ негодуют из-за необходимости использовать разного рода таймеры и лапшу из GetTickCount'ов вместо полюбившихся функций wait. Но особо ярых фанатов клео это не устраивает, отчего они начинают использовать потоки ради функций вроде Sleep для того чтобы не блокировать цикл игры. Однако это не безопасно. Функции ни GTA ни SAMP'а абсолютно не предназначены для использования в разных потоках и их использование может привести к рандомным крашам.
То есть если бы рисовать пришлось бы в main(), а не в imgui.onDrawFrame() (а в C++ именно так будет), то выход бы был только один – многопоточность.
 
  • Нравится
Реакции: Cosmo

Corrygаn

Участник
225
5
Как можно поставить таймер к примеру до 19:00 по МСК и когда настаёт это время в чат пишет сообщение?