Ну и для закрепления.
Мы написали скрипт, выложили его в паблик и нам пишет ну допустим "Несообразительный пользователь".
"Несообразительный пользователь" - "Я включил скрипт, а время не как в игре. Сделайте пожалуйста как в игре.
Из сообщения мы понимаем, что пользователь хочет, чтобы таймер был поделён на минуты и секунды.
И тут вмешиваетесь Вы, так как уже написали скрипт
2. Обнуление таймера при достижении определённого значения
пример скрипт "Timer Mission v. Adding a limit to the timer":
Вы - "Это просто, добавим ещё один таймер и каждые 60 секунд будем обнулять секундомер, а минутный таймер увеличивать на 1."
Немного подумав, Я - "И это всё? Вы точно всё учли?"
И через паузу - "А если "Несообразительный пользователь" активирует скрипт не вначале миссии, когда таймер равен 0, а в середине, например после 10 минут?
В этом случае нам нужно разово сделать пересчёт секунд в минуты и остаток записать в секундомер."
Итак с первым заданием разобрались.
Но "Несообразительный пользователь" не унимается - "Я поставил уровень сложности "Кошмар", а там интерфейса нет, как в Hitman: Absolution и таймера не видно, сделайте мне пожалуйста, чтобы скрипт хотя бы каждую минуту сообщал мне об этом."
Итак со вторым заданием тоже всё ясно - нужно добавить какой-нибудь звуковой сигнал и чтобы он звучал каждую минуту. Для этого уже ассемблера СЕ нам не хватит, придётся использовать вставки на LUA.
И снова "Несообразительный пользователь" - "И сделайте пожалуйста, чтобы таймер обнулился на 12 минутах, а потом каждые 2 минуты. (время подобрано, чтобы не удлинять видео)
Ну вот и третье задание.
Сам скрипт на этот раз комментировать не буду. После скрипта опишу некоторые новые опкоды и немного LUA.
4. Скрипт по заданию
"Timer Mission v. Sound"
Новое на ассемблер:
1. fild dword ptr [timer2] - копируем значение в [timer2] в st(0), сдвигая стек, одновременно переводя значение из Integer во Float.
2. fistp dword ptr [timer2] - выталкиваем из st(0) в [timer2], восстанавливая стек, одновременно переводя значение из Float в Integer, но fistp при этом делает либо усечение (в нашем случае если остаток меньше 30 секунд), либо округление (если больше 30 секунд). На самом деле есть более подходящий для нас опкод fisttp (который отбрасывает дробную часть), но он почему то не компилируется СЕ, поэтому пришлось добавить дополнительные 6 строчек в код:
jb @f //1
sub eax,ecx
mov [timer3],eax
jmp code2
@@: //2
sub [timer2],1 //3
add eax,#60 //4
sub eax,ecx //5
mov [timer3],eax //6
Про вставку на LUA.
{$LUA} - выполнить LUA код.
{$ASM} - выполнить код на ассемблер СЕ.
timer = createTimer(true) - активируем таймер, обратите внимание на это, обязательно деактивируйте таймер при выключении скрипта:
[DISABLE]
{$LUA}
timer:setEnabled(false)
timer:setInterval(5) - устанавливаем интервал
timer.OnTimer = function() - функция таймера, т.е. что нужно проверять и делать.
getAddressList() - функция получающая данные с Вашей таблицы
getAddressList().getMemoryRecordByID("63").Value == "59" - проверяет равно ли, значение записи в таблице с ID=63, 59. (в нашем случае это Second Timer).
как узнать ID записи в таблице -> посмотрите эту тему - Как посмотреть название, ID и индекс записи в табличке СЕ. Используется LUA-скрипт от MasterGH.
PlaySound(findTableFile([[Activate]])) - проигрывание встроенного звука активации скриптов в СЕ, если Вы хотите какой-нибудь другой звук, то посмотрите мой видео урок
sleep "1000" - нужен для того, чтобы сигнал прозвучал один раз, уменьшая 1000 Вы можете добиться, чтобы сигнал прозвучал два раза, три и т.д.
Если убрать sleep "1000" совсем, то вместо сигнала будет тарахтение в течении 1 секунды.
Полностью прокомментировать, что делает скрипт попробуйте сами.
На видео показана работа скрипта:
И залил табличку со всеми скриптами этой темы. Добавил ещё один скрипт и перезалил табличку в следующем сообщении.