1 (изменено: aaalberttt19, 2016-10-03 18:17:51)

Тема: Прожатие скилов с заданным для каждого интервалом времени

Доброго дня всем!
   Требуется задать в макросе одновременное прожатие 4-х скилов с зажатием буквенной клавиши. Предварительно запущенный макрос приводится в действие зажатием колеса мышки. Далее последовательность действий: прожатие клавиши 2 каждые 4 сек (3950 мс), зажатие клавиши С, прожатие клавиш 1, левой и правой кнопок мыши каждые 0,5 сек. При отпускании колеса мышки макрос прекращает активные действия, но остается запущенным. Важно при этом, чтобы в период прекращения активных действий была возможность срабатывания скила клавиши 2 при ручном нажатии.
   При следующем варианте скрипта скил, назначенный на клавишу 2, не срабатывает ни автоматически, ни вручную.
   

MButton::
  Loop
      {
         Send, {2} ; Запрыгиваем на ковер
         Sleep, 10
         Send, {vk43 down} ; Зажимаем клавишу C
         Send, {1} ; Прожимаем дыхание небес
         Sleep, 10
         Send, {RButton} ; Удары по противнику
         Sleep, 10
         Send, {LButton} ; Тоже удары
         Sleep, 10
         If GetKeyState("MButton", "P") = 0
            Break
      }
2::
  if (A_TimeSincePriorHotkey>3950 and A_ThisHotkey=a_priorhotkey)
  tooltip, Send {2}
  Return

   Заранее благодарен за помощь в редактировании скрипта!

2 (изменено: Indomito, 2016-10-04 20:00:05)

Re: Прожатие скилов с заданным для каждого интервалом времени

aaalberttt19 И так, начнем с конца.

2::
  if (A_TimeSincePriorHotkey>3950 and A_ThisHotkey=a_priorhotkey)
  tooltip, Send {2}
  Sleep 500
  tooltip
  Return

В такой версии от срабатывает на 3-5-7 нажатие.
Требуется переработать условия обнаружения, просто IF пропускает нажатие.
1. Все задержки сменить/заменить с 10ms на 25ms - как минимум, а лучше подбирать по игре.
2.  Есть Send, {vk43 down} ; Зажимаем клавишу C, а где отпускание клавиши? Или оно не нужно?

Я не стал глобально переписывать весь скрипт, а то будет непонятно.
Лучше тебе и по шагам, у каждого свой стиль написания.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

3 (изменено: Indomito, 2016-10-04 21:11:31)

Re: Прожатие скилов с заданным для каждого интервалом времени

aaalberttt19 Попробуй такой код

2::
  if (A_TimeSincePriorHotkey>3800)
      {
        tooltip, Send {2}
        Return
      }
    Else
      {
        tooltip
        Return
      }

Срабатывание 100% с учётом if (A_TimeSincePriorHotkey>3800), если быстро нажать то сработает очистка.
А проблема в том, что A_PriorHotkey переменная пуста.

Читаем справку.

A_PriorHotkey пишет:

Тоже самое, но относится к предыдущей горячей клавише. Изначально переменная пуста.

A_TimeSincePriorHotkey пишет:

Число миллисекунд, прошедших с тех пор, как была нажата A_PriorHotkey. Имеет значение -1, пока A_PriorHotkey пуста

И ещё...

aaalberttt19 пишет:

При следующем варианте скрипта скил, назначенный на клавишу 2, не срабатывает ни автоматически, ни вручную.

Ты сам переопределил клавишу 2

2::
  if (A_TimeSincePriorHotkey>3950 and A_ThisHotkey=a_priorhotkey)
  tooltip, Send {2}
  Return

Вот она и не срабатывает как положено, ибо tooltip, Send {2} это просто вывод на экран.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

4

Re: Прожатие скилов с заданным для каждого интервалом времени

Indomito к сожалению, ни один из предложенных вариантов не работает так как надо. Скил, назначенный на клавишу 2, не срабатывает ни автоматически, ни вручную. Кроме этого, обнаружилась новая трудность: при отпускании колеса мышки клавиша С продолжала быть зажатой, и, как следствие, приходилось вручную нажимать на С, чтобы персонаж мог двигаться при нажатии на левую клавишу мышки. Добавив в скрипт "отжатие", проблема разрешилась. Остается только вопрос со скилом клавиши 2. Надеюсь на Вашу помощь.

MButton::
  Loop
      {
         Send, {2} ; Запрыгиваем на ковер
         Sleep, 30
         Send, {vk43 down} ; Зажимаем клавишу C
         Send, {1} ; Прожимаем дыхание небес
         Sleep, 30
         Send, {RButton} ; Удары по противнику
         Sleep, 30
         Send, {LButton} ; Тоже удары
         Sleep, 30
         Send, {vk43 up} ; Отжимаем клавишу C
         If GetKeyState("MButton", "P") = 0
            Break
      }
2::
   if (A_TimeSincePriorHotkey>3950 and A_ThisHotkey=a_priorhotkey)
   tooltip, Send {2}

5 (изменено: Indomito, 2016-10-08 23:20:37)

Re: Прожатие скилов с заданным для каждого интервалом времени

aaalberttt19 По сути просто, т.е. я ответил.

Убираем код

2::
   if (A_TimeSincePriorHotkey>3950 and A_ThisHotkey=a_priorhotkey)
   tooltip, Send {2}

Модифицируем код

MButton::
  Loop
      {
         Send, {2} ; Запрыгиваем на ковер
         Sleep, 30
         Send, {vk43 down} ; Зажимаем клавишу C
         Send, {1} ; Прожимаем дыхание небес
         Sleep, 30
         Send, {RButton} ; Удары по противнику
         Sleep, 30
         Send, {LButton} ; Тоже удары
         Sleep, 30
 
      if (A_TimeSincePriorHotkey>3800 &&   A_ThisHotkey=A_PriorHotKey)
          tooltip, Send {2}
       Else
          tooltip

       Send, {vk43 up} ; Отжимаем клавишу C
         If GetKeyState("MButton", "P") = 0
            Break
      }
Return

Это грубое решение, но работать будет, но на 2-3 нажатие клавиши 2.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

6

Re: Прожатие скилов с заданным для каждого интервалом времени

aaalberttt19 В результате получаем 100% срабатывание.

;Скрипт не выгружается до явного определения - что бы было.
#Persistent
;Запрет повторного запуска - поставить то что нужно или не использовать
;#SingleInstance  Force  ;Ignore
cWinTitle:="Имя окна"
Return

SetTitleMatchMode, 2
#If WinActive(cWinTitle)
#UseHook, On
Thread, NoTimers
Critical

MButton::
  While(GetKeyState("MButton", "P"))
      {
         Sleep, 25 ; Первая задержка - ОБЯЗАТЕЛЬНО!!!
         Send, {2} ; Запрыгиваем на ковер
 ;Убрал за ненадобность - при реальном cWinTitle снять комментарии!
 /*        
         Sleep, 30
         Send, {vk43 down} ; Зажимаем клавишу C
         Send, {1} ; Прожимаем дыхание небес
         Sleep, 30
         Send, {RButton} ; Удары по противнику
         Sleep, 30
         Send, {LButton} ; Тоже удары
         Sleep, 30
         Send, {vk43 up} ; Отжимаем клавишу C 
*/
      }
Return

Critical , Off
Thread, NoTimers, false
#UseHook, Off
#IfWinActive
"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

7

Re: Прожатие скилов с заданным для каждого интервалом времени

Indomito вот досада, вариант от 07.10.2016 работает прекрасно, в том числе и срабатывание скила клавиши 2 после ее "отжимания". Единственная нестыковка: клавиша 2 прожимается каждые 30 мс, и, соответственно, умение не успевает откатиться. Вариант от 09.10.2016, к сожалению, вообще не реагирует на нажатие/зажатие колеса мышки. Пробовал запускать несколько раз: макрос запускается, но персонаж не реагирует.

8 (изменено: Indomito, 2016-10-09 02:01:03)

Re: Прожатие скилов с заданным для каждого интервалом времени

aaalberttt19 Ты прописал активное окно, т.е. окно игры? Вариант от 09.10.2016

aaalberttt19 пишет:

вариант от 07.10.2016 работает прекрасно, в том числе и срабатывание скила клавиши 2 после ее "отжимания". Единственная нестыковка: клавиша 2 прожимается каждые 30 мс, и, соответственно, умение не успевает откатиться.

Требуется "урегулирование" задержек. Я же писал надо подгонять для игры их.... т.е. предупреждал.
C'est La Vie - «Такова жизнь».

P.S. Скрипт для игры требует много, а не только нажатия клавиатуры. Как правило скрипт работает корректно в OS, а вот в игре - нет.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

9 (изменено: aaalberttt19, 2016-10-10 04:43:27)

Re: Прожатие скилов с заданным для каждого интервалом времени

Indomito касаемо варианта от 09.10.016: не могу найти информацию по названию окон, чтобы прописать его в скрипт. В "Общий обзор программы и краткое обучение" AutoHotkey следующая справка:
   Эмуляция нажатий клавиш и кликов мышью
"Клики мышью: для того, чтобы сообщить окну клик мышью, в первую очередь необходимо определить координаты X и Y, куда вы собираетесь делать клик. Это можно определить с помощью утилит AutoScriptWriter и Window Spy, которые поставляются вместе с AutoHotkey.
Вот как это делается с помощью Window Spy: запустите Window Spy. Активируйте интересующее Вас окно. Наведите курсор мыши на искомую точку и посмотрите в окне Window Spy её координаты. Используйте эти координаты для создания эмуляции клика мыши. Например:
F7::MouseClick, Left, 112, 223
Примечание: координаты клика всегда считаются от левого верхнего угла активного окна. Окно при этом может находиться где угодно.
Для перемещения мыши без клика используйте команду MouseMove. Для перетаскивания или выделения мышью используйте команду MouseClickDrag."
   Полагаю, это не совсем то, что требуется для того, чтобы прописать активное окно.
   В варианте от 07.10.016 менял задержку:

MButton::
  Loop
      {
         Send, {2} ; Запрыгиваем на ковер. Здесь менял на 3800
         Sleep, 30
         Send, {vk43 down} ; Зажимаем клавишу C
         Send, {1} ; Прожимаем дыхание небес
         Sleep, 30
         Send, {RButton} ; Удары по противнику
         Sleep, 30
         Send, {LButton} ; Тоже удары
         Sleep, 30
 
      if (A_TimeSincePriorHotkey>3800 &&   A_ThisHotkey=A_PriorHotKey)
          tooltip, Send {2}
       Else
          tooltip

       Send, {vk43 up} ; Отжимаем клавишу C
         If GetKeyState("MButton", "P") = 0
            Break
      }
Return

К сожалению, безрезультатно.
   Также пробовал разделить на 2 скрипта:

2::
  Loop
      {
         Send, {2} ; Запрыгиваем на ковер
         Sleep, 3950
         If GetKeyState("2", "P") = 0
            Break
      }
  Return
MButton::
  Loop
      {
         Send, {vk43 down} ; Зажимаем клавишу C
         Send, {1} ; Прожимаем дыхание небес
         Sleep, 30
         Send, {RButton} ; Удары по противнику
         Sleep, 30
         Send, {LButton} ; Тоже удары
         Sleep, 30
         Send, {vk43 up} ; Отжимаем клавишу C
         If GetKeyState("MButton", "P") = 0
            Break
      }
   Return

Что также не принесло успеха: 1-й скрипт не работает, так как клавиша 2 не срабатывает ни автоматически, ни вручную.

10

Re: Прожатие скилов с заданным для каждого интервалом времени

aaalberttt19
Отвечу, позже, просто занят по работе.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download