Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ UO Pilot _ Timer

Автор: NoName212 5.2.2019, 11:27

Беда! Таймер не даёт работать! Включаю таймер и он обрывает процесс(два клика подряд надо делать чтобы прервать процесс). Без таймера всё работает нормально ohmy.gif (только не ест, не пьёт, не спит, в общем не жилец).

таймер
Код
set #handleWin findwindow 1574140
set workwindow #handleWin

set #time 5000
while 1 = 1
    if timer > #time
    set #waterZero findimage (406, 29 551, 31 (C:\DAYR\DAY_R_IMAGE\chat.bmp) %arr 2 15 1 7)
    wait 1000
        //msg #waterZero
        if #waterZero > 0
           stop_script allEx
           left 750, 360 //стоп крафт
           wait 100
           left 750, 360
           call foodsleepfood #true #false
        end_if
        set timer #time + 5000
        start_script 13
    end_if
end_while

proc foodsleepfood #true #false
//едим, пьем, спим, едим
set #true 1
set #false 0
if #true > #false
    call okno #a #b
    wait 300
    left 757, 512 //локация
    wait 300
    call okno #a #b
    left 352, 423 //пьём
    wait 300
    call okno #a #b
    left 447, 424 //жрем
    wait 300
    call okno #a #b
    left 894, 403 //спим
    wait 9000
    call okno #a #b
    left 690, 794   //жрем
    wait 300
    call okno #a #b
    wait 300
end_if
end_proc

//всплывающие окна погода/землятресения и т.д.
proc okno #a #b
    set #a 0
    set #b findimage (1523, 334 1589, 393  (C:\DAYR\DAY_R_IMAGE\pogoda.bmp) %arr 2 80 1 5)
    if #b > #a
        wait 300
        left %arr [1 1] %arr [1 2]
        wait 300
    end_if
    wait 300
end_proc


Что можно сделать? Раньше были в коде скрипта эти проверки, решил их сделать по уму в отдельном скрипте, но не выходит...


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: sutra 5.2.2019, 13:02

Не вижу первоначальной инициализации таймера до начала цикла set timer - это раз.

Цитата
set timer #time + 5000

Таймер всегда будет больше переменной контроля, надо сделать просто
Цитата
set timer


Автор: DarkMaster 5.2.2019, 16:37

Цитата
set timer

Так лучше не делать, т.к. на таймер могут быть навешаны несколько условий. Даже если сейчас оно только одно, время идет и потом можно получить нежданчик: вы будете обнулять таймер для котроля одного цикла, а сыпаться будет попутно другой.
Цитата
set #time 5000
while 1 = 1
if timer > #time

Меняем первую строку на:
set #time timer + 5000
радуемся жизни =)
Заметьте при таком подходе у вас может существовать неограниченное количество независимых таймеров и вы их не прихлопнете случайно обнулив системный timer

Автор: sutra 5.2.2019, 17:22

Цитата
Заметьте при таком подходе у вас может существовать неограниченное количество независимых таймеров и вы их не прихлопнете случайно обнулив системный timer
Дарк, как всегда - мыслишь на перспективу. Я то просто мельком глянул, а ты прямо сэнсей.

Автор: DarkMaster 5.2.2019, 17:24

Цитата
Дарк, как всегда - мыслишь на перспективу.

Скорее наоборот. Мыслю на зад. Свой собственный, пострадавший по этому поводу пару раз)

Автор: xolost 28.2.2019, 13:32

Цитата(DarkMaster @ 5.2.2019, 17:24) *

Скорее наоборот. Мыслю на зад. Свой собственный, пострадавший по этому поводу пару раз)

А ты вспомни сколько я на этом срадал) ещё лет 7 назад ты мне объяснял этот момент, как его правильно делать)
А у меня-то вообще было около сотни циклов перед которыми я его обнулял.

Впрочем, чуть позже я нашел ещё одно классное решение, которое решает проблему обнуления системного таймера.

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

Код
load_array %timers c:\path\timers.txt
set #timeNow min + hour * 60 + day * 24 * 60

for #t 1 size(%timers)
   if %timers[#t 1] = 1
      set #timePassed #timeNow - %timers[#t 3]
      if #timePassed  >= %timers[#t 2] or #timePassed < 0
         msg Время пришло!
         // что-то поделали и в конце записываем время текущее время для таймера в файл
         set #timeNow min + hour * 60 + day * 24 * 60
         set %timers[#t 3] #timeNow
         save_array %timers c:\path\timers.txt
      end_if
   end_if
end_for


Подсасываем файл с таймерами.
разные строки в файле - разные объекты со своими таймерами.
1 столб - вкл\выкл данная строка
2 столб - время в минутах, по истечению которого проверка будет пройдена
3 столб - текущее время

Если надо секундами измерять, соответственно меняем немного формулу

Автор: Levo222 1.3.2019, 10:12

Цитата(NoName212 @ 5.2.2019, 15:27) *

Беда! Таймер не даёт работать! Включаю таймер и он обрывает процесс(два клика подряд надо делать чтобы прервать процесс). Без таймера всё работает нормально ohmy.gif (только не ест, не пьёт, не спит, в общем не жилец).

таймер
Код
set #handleWin findwindow 1574140
set workwindow #handleWin

set #time 5000
while 1 = 1
    if timer > #time
    set #waterZero findimage (406, 29 551, 31 (C:\DAYR\DAY_R_IMAGE\chat.bmp) %arr 2 15 1 7)
    wait 1000
        //msg #waterZero
        if #waterZero > 0
           stop_script allEx
           left 750, 360 //стоп крафт
           wait 100
           left 750, 360
           call foodsleepfood #true #false
        end_if
        set timer #time + 5000
        start_script 13
    end_if
end_while

proc foodsleepfood #true #false
//едим, пьем, спим, едим
set #true 1
set #false 0
if #true > #false
    call okno #a #b
    wait 300
    left 757, 512 //локация
    wait 300
    call okno #a #b
    left 352, 423 //пьём
    wait 300
    call okno #a #b
    left 447, 424 //жрем
    wait 300
    call okno #a #b
    left 894, 403 //спим
    wait 9000
    call okno #a #b
    left 690, 794   //жрем
    wait 300
    call okno #a #b
    wait 300
end_if
end_proc

//всплывающие окна погода/землятресения и т.д.
proc okno #a #b
    set #a 0
    set #b findimage (1523, 334 1589, 393  (C:\DAYR\DAY_R_IMAGE\pogoda.bmp) %arr 2 80 1 5)
    if #b > #a
        wait 300
        left %arr [1 1] %arr [1 2]
        wait 300
    end_if
    wait 300
end_proc


Что можно сделать? Раньше были в коде скрипта эти проверки, решил их сделать по уму в отдельном скрипте, но не выходит...

Вроде же есть мод на отключение жажды голода и пр, в кр случае можно через cheet engine хакнуть

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)